On 03/10/2019 14:01, Greg Kurz wrote: > The XIVE KVM devices now has an attribute to configure the number of > interrupt servers. This allows to greatly optimize the usage of the VP > space in the XIVE HW, and thus to start a lot more VMs. > > Only set this attribute if available in order to support older POWER9 > KVM. > > The XIVE KVM device now reports the exhaustion of VPs upon the > connection of the first VCPU. Check that in order to have a chance > to provide an hint to the user. > > Signed-off-by: Greg Kurz <gr...@kaod.org>
Reviewed-by: Cédric Le Goater <c...@kaod.org> > --- > hw/intc/spapr_xive_kvm.c | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/hw/intc/spapr_xive_kvm.c b/hw/intc/spapr_xive_kvm.c > index 51b334b676a1..2a3a9ef22b6f 100644 > --- a/hw/intc/spapr_xive_kvm.c > +++ b/hw/intc/spapr_xive_kvm.c > @@ -152,7 +152,8 @@ void kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx, > Error **errp) > > void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp) > { > - SpaprXive *xive = SPAPR_MACHINE(qdev_get_machine())->xive; > + MachineState *ms = MACHINE(qdev_get_machine()); > + SpaprXive *xive = SPAPR_MACHINE(ms)->xive; > unsigned long vcpu_id; > int ret; > > @@ -171,8 +172,15 @@ void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error > **errp) > ret = kvm_vcpu_enable_cap(tctx->cs, KVM_CAP_PPC_IRQ_XIVE, 0, xive->fd, > vcpu_id, 0); > if (ret < 0) { > - error_setg(errp, "XIVE: unable to connect CPU%ld to KVM device: %s", > + Error *err = NULL; > + > + error_setg(&err, "XIVE: unable to connect CPU%ld to KVM device: %s", > vcpu_id, strerror(errno)); > + if (errno == ENOSPC) { > + error_append_hint(&local_err, "Try -smp maxcpus=N with N < %u\n", > + ms->smp.max_cpus); > + } > + error_propagate(errp, err); > return; > } > > @@ -768,6 +776,16 @@ void kvmppc_xive_connect(SpaprXive *xive, Error **errp) > return; > } > > + /* Tell KVM about the # of VCPUs we may have */ > + if (kvm_device_check_attr(xive->fd, KVM_DEV_XIVE_GRP_CTRL, > + KVM_DEV_XIVE_NR_SERVERS)) { > + if (kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_CTRL, > + KVM_DEV_XIVE_NR_SERVERS, &xive->nr_servers, > true, > + &local_err)) { > + goto fail; > + } > + } > + > /* > * 1. Source ESB pages - KVM mapping > */ >