spapr: Handle failure of KVM_PPC_ALLOCATE_HTAB ioctl
KVM_PPC_ALLOCATE_HTAB ioctl can return -ENOMEM for KVM guests and QEMU never handled this correctly. But this didn't cause any problems till now as KVM_PPC_ALLOCATE_HTAB ioctl returned with smaller than requested HTAB when enough contiguous memory wasn't available in the host. After the proposed kernel change: https://patchwork.ozlabs.org/patch/530501/, KVM_PPC_ALLOCATE_HTAB ioctl will not fallback to lower sized HTAB allocation and will fail if requested HTAB size can't be met. Check for such failures in QEMU and abort appropriately. This will prevent guest kernel from hanging/freezing during early boot by doing graceful exit when host is unable to allocate requested HTAB. Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
a3166f8f6e
commit
b41d320fef
@ -1021,9 +1021,19 @@ static void spapr_alloc_htab(sPAPRMachineState *spapr)
|
|||||||
* RAM */
|
* RAM */
|
||||||
|
|
||||||
shift = kvmppc_reset_htab(spapr->htab_shift);
|
shift = kvmppc_reset_htab(spapr->htab_shift);
|
||||||
|
if (shift < 0) {
|
||||||
if (shift > 0) {
|
/*
|
||||||
/* Kernel handles htab, we don't need to allocate one */
|
* 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");
|
||||||
|
} else if (shift > 0) {
|
||||||
|
/*
|
||||||
|
* Kernel handles htab, we don't need to allocate one
|
||||||
|
*
|
||||||
|
* Older kernels can fall back to lower HTAB shift values,
|
||||||
|
* but we don't allow booting of such guests.
|
||||||
|
*/
|
||||||
if (shift != spapr->htab_shift) {
|
if (shift != spapr->htab_shift) {
|
||||||
error_setg(&error_abort, "Failed to allocate HTAB of requested size, try with smaller maxmem");
|
error_setg(&error_abort, "Failed to allocate HTAB of requested size, try with smaller maxmem");
|
||||||
}
|
}
|
||||||
@ -1055,7 +1065,9 @@ static void spapr_reset_htab(sPAPRMachineState *spapr)
|
|||||||
int index;
|
int index;
|
||||||
|
|
||||||
shift = kvmppc_reset_htab(spapr->htab_shift);
|
shift = kvmppc_reset_htab(spapr->htab_shift);
|
||||||
if (shift > 0) {
|
if (shift < 0) {
|
||||||
|
error_setg(&error_abort, "Failed to reset HTAB");
|
||||||
|
} else if (shift > 0) {
|
||||||
if (shift != spapr->htab_shift) {
|
if (shift != spapr->htab_shift) {
|
||||||
error_setg(&error_abort, "Requested HTAB allocation failed during reset");
|
error_setg(&error_abort, "Requested HTAB allocation failed during reset");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user