spapr/xive: Rework error handling of kvmppc_xive_cpu_connect()

Use error_setg_errno() instead of error_setg(strerror()). While here,
use -ret instead of errno since kvm_vcpu_enable_cap() returns a negative
errno on failure.

Use ERRP_GUARD() to ensure that errp can be passed to error_append_hint(),
and get rid of the local_err boilerplate.

Propagate the return value so that callers may use it as well to check
failures.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <159707844549.1489912.4862921680328017645.stgit@bahia.lan>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Greg Kurz 2020-08-10 18:54:05 +02:00 committed by David Gibson
parent 4a6891b838
commit 3885ca6688
2 changed files with 11 additions and 12 deletions

View file

@ -144,8 +144,9 @@ void kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx, Error **errp)
} }
} }
void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp) int kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp)
{ {
ERRP_GUARD();
SpaprXive *xive = SPAPR_XIVE(tctx->xptr); SpaprXive *xive = SPAPR_XIVE(tctx->xptr);
unsigned long vcpu_id; unsigned long vcpu_id;
int ret; int ret;
@ -154,7 +155,7 @@ void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp)
/* Check if CPU was hot unplugged and replugged. */ /* Check if CPU was hot unplugged and replugged. */
if (kvm_cpu_is_enabled(tctx->cs)) { if (kvm_cpu_is_enabled(tctx->cs)) {
return; return 0;
} }
vcpu_id = kvm_arch_vcpu_id(tctx->cs); vcpu_id = kvm_arch_vcpu_id(tctx->cs);
@ -162,20 +163,18 @@ void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp)
ret = kvm_vcpu_enable_cap(tctx->cs, KVM_CAP_PPC_IRQ_XIVE, 0, xive->fd, ret = kvm_vcpu_enable_cap(tctx->cs, KVM_CAP_PPC_IRQ_XIVE, 0, xive->fd,
vcpu_id, 0); vcpu_id, 0);
if (ret < 0) { if (ret < 0) {
Error *local_err = NULL; error_setg_errno(errp, -ret,
"XIVE: unable to connect CPU%ld to KVM device",
error_setg(&local_err, vcpu_id);
"XIVE: unable to connect CPU%ld to KVM device: %s", if (ret == -ENOSPC) {
vcpu_id, strerror(errno)); error_append_hint(errp, "Try -smp maxcpus=N with N < %u\n",
if (errno == ENOSPC) {
error_append_hint(&local_err, "Try -smp maxcpus=N with N < %u\n",
MACHINE(qdev_get_machine())->smp.max_cpus); MACHINE(qdev_get_machine())->smp.max_cpus);
} }
error_propagate(errp, local_err); return ret;
return;
} }
kvm_cpu_enable(tctx->cs); kvm_cpu_enable(tctx->cs);
return 0;
} }
/* /*

View file

@ -487,7 +487,7 @@ void xive_tctx_ipb_update(XiveTCTX *tctx, uint8_t ring, uint8_t ipb);
int kvmppc_xive_source_reset_one(XiveSource *xsrc, int srcno, Error **errp); int kvmppc_xive_source_reset_one(XiveSource *xsrc, int srcno, Error **errp);
void kvmppc_xive_source_set_irq(void *opaque, int srcno, int val); void kvmppc_xive_source_set_irq(void *opaque, int srcno, int val);
void kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp); int kvmppc_xive_cpu_connect(XiveTCTX *tctx, Error **errp);
void kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx, Error **errp); void kvmppc_xive_cpu_synchronize_state(XiveTCTX *tctx, Error **errp);
void kvmppc_xive_cpu_get_state(XiveTCTX *tctx, Error **errp); void kvmppc_xive_cpu_get_state(XiveTCTX *tctx, Error **errp);
void kvmppc_xive_cpu_set_state(XiveTCTX *tctx, Error **errp); void kvmppc_xive_cpu_set_state(XiveTCTX *tctx, Error **errp);