On 23/09/2019 17:44, Greg Kurz wrote: > Add a new attribute to both legacy and native XIVE KVM devices so that > userspace can require less interrupt servers than the current default > (KVM_MAX_VCPUS, 2048). This will allow to allocate less VPs in OPAL, > and likely increase the number of VMs that can run with an in-kernel > XIVE implementation. > > Since the legacy XIVE KVM device is exposed to userspace through the > XICS KVM API, a new attribute group is added to it for this purpose. > While here, fix the syntax of the existing KVM_DEV_XICS_GRP_SOURCES > in the XICS documentation. > > Signed-off-by: Greg Kurz <groug@xxxxxxxx> Reviewed-by: Cédric Le Goater <clg@xxxxxxxx> C. > --- > Documentation/virt/kvm/devices/xics.txt | 14 ++++++++++++-- > Documentation/virt/kvm/devices/xive.txt | 8 ++++++++ > arch/powerpc/include/uapi/asm/kvm.h | 3 +++ > arch/powerpc/kvm/book3s_xive.c | 10 ++++++++++ > arch/powerpc/kvm/book3s_xive_native.c | 3 +++ > 5 files changed, 36 insertions(+), 2 deletions(-) > > diff --git a/Documentation/virt/kvm/devices/xics.txt b/Documentation/virt/kvm/devices/xics.txt > index 42864935ac5d..1cf9621f8341 100644 > --- a/Documentation/virt/kvm/devices/xics.txt > +++ b/Documentation/virt/kvm/devices/xics.txt > @@ -3,9 +3,19 @@ XICS interrupt controller > Device type supported: KVM_DEV_TYPE_XICS > > Groups: > - KVM_DEV_XICS_SOURCES > + 1. KVM_DEV_XICS_GRP_SOURCES > Attributes: One per interrupt source, indexed by the source number. > > + 2. KVM_DEV_XICS_GRP_CTRL > + Attributes: > + 2.1 KVM_DEV_XICS_NR_SERVERS (write only) > + The kvm_device_attr.addr points to a __u32 value which is the number of > + interrupt server numbers (ie, highest possible vcpu id plus one). > + Errors: > + -EINVAL: Value greater than KVM_MAX_VCPUS. > + -EFAULT: Invalid user pointer for attr->addr. > + -EBUSY: A vcpu is already connected to the device. > + > This device emulates the XICS (eXternal Interrupt Controller > Specification) defined in PAPR. The XICS has a set of interrupt > sources, each identified by a 20-bit source number, and a set of > @@ -38,7 +48,7 @@ least-significant end of the word: > > Each source has 64 bits of state that can be read and written using > the KVM_GET_DEVICE_ATTR and KVM_SET_DEVICE_ATTR ioctls, specifying the > -KVM_DEV_XICS_SOURCES attribute group, with the attribute number being > +KVM_DEV_XICS_GRP_SOURCES attribute group, with the attribute number being > the interrupt source number. The 64 bit state word has the following > bitfields, starting from the least-significant end of the word: > > diff --git a/Documentation/virt/kvm/devices/xive.txt b/Documentation/virt/kvm/devices/xive.txt > index 9a24a4525253..fd418b907d0e 100644 > --- a/Documentation/virt/kvm/devices/xive.txt > +++ b/Documentation/virt/kvm/devices/xive.txt > @@ -78,6 +78,14 @@ the legacy interrupt mode, referred as XICS (POWER7/8). > migrating the VM. > Errors: none > > + 1.3 KVM_DEV_XIVE_NR_SERVERS (write only) > + The kvm_device_attr.addr points to a __u32 value which is the number of > + interrupt server numbers (ie, highest possible vcpu id plus one). > + Errors: > + -EINVAL: Value greater than KVM_KVM_VCPUS. > + -EFAULT: Invalid user pointer for attr->addr. > + -EBUSY: A vCPU is already connected to the device. > + > 2. KVM_DEV_XIVE_GRP_SOURCE (write only) > Initializes a new source in the XIVE device and mask it. > Attributes: > diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h > index b0f72dea8b11..264e266a85bf 100644 > --- a/arch/powerpc/include/uapi/asm/kvm.h > +++ b/arch/powerpc/include/uapi/asm/kvm.h > @@ -667,6 +667,8 @@ struct kvm_ppc_cpu_char { > > /* PPC64 eXternal Interrupt Controller Specification */ > #define KVM_DEV_XICS_GRP_SOURCES 1 /* 64-bit source attributes */ > +#define KVM_DEV_XICS_GRP_CTRL 2 > +#define KVM_DEV_XICS_NR_SERVERS 1 > > /* Layout of 64-bit source attribute values */ > #define KVM_XICS_DESTINATION_SHIFT 0 > @@ -683,6 +685,7 @@ struct kvm_ppc_cpu_char { > #define KVM_DEV_XIVE_GRP_CTRL 1 > #define KVM_DEV_XIVE_RESET 1 > #define KVM_DEV_XIVE_EQ_SYNC 2 > +#define KVM_DEV_XIVE_NR_SERVERS 3 > #define KVM_DEV_XIVE_GRP_SOURCE 2 /* 64-bit source identifier */ > #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG 3 /* 64-bit source identifier */ > #define KVM_DEV_XIVE_GRP_EQ_CONFIG 4 /* 64-bit EQ identifier */ > diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c > index 4a333dcfddd8..c1901583e6c0 100644 > --- a/arch/powerpc/kvm/book3s_xive.c > +++ b/arch/powerpc/kvm/book3s_xive.c > @@ -1905,6 +1905,11 @@ static int xive_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr) > switch (attr->group) { > case KVM_DEV_XICS_GRP_SOURCES: > return xive_set_source(xive, attr->attr, attr->addr); > + case KVM_DEV_XICS_GRP_CTRL: > + switch (attr->attr) { > + case KVM_DEV_XICS_NR_SERVERS: > + return kvmppc_xive_set_nr_servers(xive, attr->addr); > + } > } > return -ENXIO; > } > @@ -1930,6 +1935,11 @@ static int xive_has_attr(struct kvm_device *dev, struct kvm_device_attr *attr) > attr->attr < KVMPPC_XICS_NR_IRQS) > return 0; > break; > + case KVM_DEV_XICS_GRP_CTRL: > + switch (attr->attr) { > + case KVM_DEV_XICS_NR_SERVERS: > + return 0; > + } > } > return -ENXIO; > } > diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c > index 5e18364d52a9..8e954c5d5efb 100644 > --- a/arch/powerpc/kvm/book3s_xive_native.c > +++ b/arch/powerpc/kvm/book3s_xive_native.c > @@ -921,6 +921,8 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev, > return kvmppc_xive_reset(xive); > case KVM_DEV_XIVE_EQ_SYNC: > return kvmppc_xive_native_eq_sync(xive); > + case KVM_DEV_XIVE_NR_SERVERS: > + return kvmppc_xive_set_nr_servers(xive, attr->addr); > } > break; > case KVM_DEV_XIVE_GRP_SOURCE: > @@ -960,6 +962,7 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev, > switch (attr->attr) { > case KVM_DEV_XIVE_RESET: > case KVM_DEV_XIVE_EQ_SYNC: > + case KVM_DEV_XIVE_NR_SERVERS: > return 0; > } > break; >