mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
arm/kvm: Enable support for KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE
Now that we have Eager Page Split support added for ARM in the kernel, enable it in Qemu. This adds, -eager-split-size to -accel sub-options to set the eager page split chunk size. -enable KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE. The chunk size specifies how many pages to break at a time, using a single allocation. Bigger the chunk size, more pages need to be allocated ahead of time. Reviewed-by: Gavin Shan <gshan@redhat.com> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Message-id: 20230905091246.1931-1-shameerali.kolothum.thodi@huawei.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
d03396a8bb
commit
c8f2eb5d41
4 changed files with 78 additions and 0 deletions
|
@ -30,6 +30,7 @@
|
|||
#include "exec/address-spaces.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/irq.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "qemu/log.h"
|
||||
|
||||
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
|
||||
|
@ -287,6 +288,26 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||
}
|
||||
}
|
||||
|
||||
if (s->kvm_eager_split_size) {
|
||||
uint32_t sizes;
|
||||
|
||||
sizes = kvm_vm_check_extension(s, KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES);
|
||||
if (!sizes) {
|
||||
s->kvm_eager_split_size = 0;
|
||||
warn_report("Eager Page Split support not available");
|
||||
} else if (!(s->kvm_eager_split_size & sizes)) {
|
||||
error_report("Eager Page Split requested chunk size not valid");
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
ret = kvm_vm_enable_cap(s, KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE, 0,
|
||||
s->kvm_eager_split_size);
|
||||
if (ret < 0) {
|
||||
error_report("Enabling of Eager Page Split failed: %s",
|
||||
strerror(-ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
kvm_arm_init_debug(s);
|
||||
|
||||
return ret;
|
||||
|
@ -1069,6 +1090,46 @@ bool kvm_arch_cpu_check_are_resettable(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void kvm_arch_get_eager_split_size(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
KVMState *s = KVM_STATE(obj);
|
||||
uint64_t value = s->kvm_eager_split_size;
|
||||
|
||||
visit_type_size(v, name, &value, errp);
|
||||
}
|
||||
|
||||
static void kvm_arch_set_eager_split_size(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
KVMState *s = KVM_STATE(obj);
|
||||
uint64_t value;
|
||||
|
||||
if (s->fd != -1) {
|
||||
error_setg(errp, "Unable to set early-split-size after KVM has been initialized");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visit_type_size(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (value && !is_power_of_2(value)) {
|
||||
error_setg(errp, "early-split-size must be a power of two");
|
||||
return;
|
||||
}
|
||||
|
||||
s->kvm_eager_split_size = value;
|
||||
}
|
||||
|
||||
void kvm_arch_accel_class_init(ObjectClass *oc)
|
||||
{
|
||||
object_class_property_add(oc, "eager-split-size", "size",
|
||||
kvm_arch_get_eager_split_size,
|
||||
kvm_arch_set_eager_split_size, NULL, NULL);
|
||||
|
||||
object_class_property_set_description(oc, "eager-split-size",
|
||||
"Eager Page Split chunk size for hugepages. (default: 0, disabled)");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue