spapr/xive: Rework error handling of kvmppc_xive_[gs]et_queue_config()

Since kvm_device_access() returns a negative errno on failure, convert
kvmppc_xive_get_queue_config() and kvmppc_xive_set_queue_config() to
use it for error checking. This allows to 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: <159707847357.1489912.2032291280645236480.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:33 +02:00 committed by David Gibson
parent 5fa36b7ffb
commit f9a548edf2
2 changed files with 18 additions and 21 deletions

View file

@ -374,15 +374,15 @@ void kvmppc_xive_source_set_irq(void *opaque, int srcno, int val)
/* /*
* sPAPR XIVE interrupt controller (KVM) * sPAPR XIVE interrupt controller (KVM)
*/ */
void kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk, int kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk,
uint32_t end_idx, XiveEND *end, uint32_t end_idx, XiveEND *end,
Error **errp) Error **errp)
{ {
struct kvm_ppc_xive_eq kvm_eq = { 0 }; struct kvm_ppc_xive_eq kvm_eq = { 0 };
uint64_t kvm_eq_idx; uint64_t kvm_eq_idx;
uint8_t priority; uint8_t priority;
uint32_t server; uint32_t server;
Error *local_err = NULL; int ret;
assert(xive_end_is_valid(end)); assert(xive_end_is_valid(end));
@ -394,11 +394,10 @@ void kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk,
kvm_eq_idx |= server << KVM_XIVE_EQ_SERVER_SHIFT & kvm_eq_idx |= server << KVM_XIVE_EQ_SERVER_SHIFT &
KVM_XIVE_EQ_SERVER_MASK; KVM_XIVE_EQ_SERVER_MASK;
kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_EQ_CONFIG, kvm_eq_idx, ret = kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_EQ_CONFIG, kvm_eq_idx,
&kvm_eq, false, &local_err); &kvm_eq, false, errp);
if (local_err) { if (ret < 0) {
error_propagate(errp, local_err); return ret;
return;
} }
/* /*
@ -408,17 +407,18 @@ void kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk,
*/ */
end->w1 = xive_set_field32(END_W1_GENERATION, 0ul, kvm_eq.qtoggle) | end->w1 = xive_set_field32(END_W1_GENERATION, 0ul, kvm_eq.qtoggle) |
xive_set_field32(END_W1_PAGE_OFF, 0ul, kvm_eq.qindex); xive_set_field32(END_W1_PAGE_OFF, 0ul, kvm_eq.qindex);
return 0;
} }
void kvmppc_xive_set_queue_config(SpaprXive *xive, uint8_t end_blk, int kvmppc_xive_set_queue_config(SpaprXive *xive, uint8_t end_blk,
uint32_t end_idx, XiveEND *end, uint32_t end_idx, XiveEND *end,
Error **errp) Error **errp)
{ {
struct kvm_ppc_xive_eq kvm_eq = { 0 }; struct kvm_ppc_xive_eq kvm_eq = { 0 };
uint64_t kvm_eq_idx; uint64_t kvm_eq_idx;
uint8_t priority; uint8_t priority;
uint32_t server; uint32_t server;
Error *local_err = NULL;
/* /*
* Build the KVM state from the local END structure. * Build the KVM state from the local END structure.
@ -456,12 +456,9 @@ void kvmppc_xive_set_queue_config(SpaprXive *xive, uint8_t end_blk,
kvm_eq_idx |= server << KVM_XIVE_EQ_SERVER_SHIFT & kvm_eq_idx |= server << KVM_XIVE_EQ_SERVER_SHIFT &
KVM_XIVE_EQ_SERVER_MASK; KVM_XIVE_EQ_SERVER_MASK;
kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_EQ_CONFIG, kvm_eq_idx, return
&kvm_eq, true, &local_err); kvm_device_access(xive->fd, KVM_DEV_XIVE_GRP_EQ_CONFIG, kvm_eq_idx,
if (local_err) { &kvm_eq, true, errp);
error_propagate(errp, local_err);
return;
}
} }
void kvmppc_xive_reset(SpaprXive *xive, Error **errp) void kvmppc_xive_reset(SpaprXive *xive, Error **errp)

View file

@ -85,10 +85,10 @@ void kvmppc_xive_set_source_config(SpaprXive *xive, uint32_t lisn, XiveEAS *eas,
void kvmppc_xive_sync_source(SpaprXive *xive, uint32_t lisn, Error **errp); void kvmppc_xive_sync_source(SpaprXive *xive, uint32_t lisn, Error **errp);
uint64_t kvmppc_xive_esb_rw(XiveSource *xsrc, int srcno, uint32_t offset, uint64_t kvmppc_xive_esb_rw(XiveSource *xsrc, int srcno, uint32_t offset,
uint64_t data, bool write); uint64_t data, bool write);
void kvmppc_xive_set_queue_config(SpaprXive *xive, uint8_t end_blk, int kvmppc_xive_set_queue_config(SpaprXive *xive, uint8_t end_blk,
uint32_t end_idx, XiveEND *end, uint32_t end_idx, XiveEND *end,
Error **errp); Error **errp);
void kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk, int kvmppc_xive_get_queue_config(SpaprXive *xive, uint8_t end_blk,
uint32_t end_idx, XiveEND *end, uint32_t end_idx, XiveEND *end,
Error **errp); Error **errp);
void kvmppc_xive_synchronize_state(SpaprXive *xive, Error **errp); void kvmppc_xive_synchronize_state(SpaprXive *xive, Error **errp);