Thomas Huth <th...@redhat.com> writes: > On 18.01.2016 05:24, David Gibson wrote: >> The spapr_alloc_htab() and spapr_reset_htab() functions currently handle >> all errors with error_setg(&error_abort, ...). >> >> But really, the callers are really better placed to decide on the error >> handling. So, instead make the functions use the error propagation >> infrastructure. >> >> In the callers we change to &error_fatal instead of &error_abort, since >> this can be triggered by a bad configuration or kernel error rather than >> indicating a programming error in qemu. >> >> While we're at it improve the messages themselves a bit, and clean up the >> indentation a little. >> >> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> >> --- >> hw/ppc/spapr.c | 24 ++++++++++++++++-------- >> 1 file changed, 16 insertions(+), 8 deletions(-) >> >> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c >> index b7fd09a..d28e349 100644 >> --- a/hw/ppc/spapr.c >> +++ b/hw/ppc/spapr.c >> @@ -1016,7 +1016,7 @@ static void emulate_spapr_hypercall(PowerPCCPU *cpu) >> #define CLEAN_HPTE(_hpte) ((*(uint64_t *)(_hpte)) &= >> tswap64(~HPTE64_V_HPTE_DIRTY)) >> #define DIRTY_HPTE(_hpte) ((*(uint64_t *)(_hpte)) |= >> tswap64(HPTE64_V_HPTE_DIRTY)) >> >> -static void spapr_alloc_htab(sPAPRMachineState *spapr) >> +static void spapr_alloc_htab(sPAPRMachineState *spapr, Error **errp) >> { >> long shift; >> int index; >> @@ -1031,7 +1031,8 @@ static void spapr_alloc_htab(sPAPRMachineState *spapr) >> * For HV KVM, host kernel will return -ENOMEM when requested >> * HTAB size can't be allocated. >> */ >> - error_setg(&error_abort, "Failed to allocate HTAB of requested >> size, try with smaller maxmem"); >> + error_setg_errno(errp, -shift, >> + "Error allocating KVM hash page table, try smaller >> maxmem"); >> } else if (shift > 0) { >> /* >> * Kernel handles htab, we don't need to allocate one >> @@ -1040,7 +1041,10 @@ static void spapr_alloc_htab(sPAPRMachineState *spapr) >> * but we don't allow booting of such guests. >> */ >> if (shift != spapr->htab_shift) { >> - error_setg(&error_abort, "Failed to allocate HTAB of requested >> size, try with smaller maxmem"); >> + error_setg(errp, >> + "Small allocation for KVM hash page table (%ld < %" >> + PRIu32 "), try smaller maxmem", >> + shift, spapr->htab_shift); > > Maybe you should add an "return" statement here - theoretically you do > not want to continue with "kvmppc_kern_htab = true" in case of errors. > (practically this does not happen because errp = error_fatal, but in > case the caller gets changed, this might introduce subtle errors otherwise)
Good point. With abort() / exit(), we don't have to worry about recovery. In particular, we don't have to revert half-done changes. Conversions away from abort() / exit() need to consider error recovery. We have to make sure the function leaves things in a sane state on error. This normally means taking an early return, and often means reverting some state changes. [...]