qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 01/11] pc: kvm: check if KVM has free memory slo


From: Marcel Apfelbaum
Subject: Re: [Qemu-devel] [PATCH 01/11] pc: kvm: check if KVM has free memory slots to avoid abort()
Date: Tue, 04 Nov 2014 16:51:46 +0200

On Fri, 2014-10-31 at 16:38 +0000, Igor Mammedov wrote:
> When more memory devices han available KVM memory slots
/s/han/than

> are used, QEMU crashes with:

Better to say (from Laura Novich <address@hidden>):

When more memory devices are used than available
KVM memory slots, QEMU crashes with:

Thanks,
Marcel


> kvm_alloc_slot: no free slot available
> Aborted (core dumped)
> 
> Fix this by checking that KVM has a free slot before
> attempting to map memory in guest address space.
> 
> Signed-off-by: Igor Mammedov <address@hidden>
> ---
>  hw/i386/pc.c         |  5 +++++
>  include/sysemu/kvm.h |  1 +
>  kvm-all.c            | 18 +++++++++++++++++-
>  kvm-stub.c           |  5 +++++
>  4 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 61aba9f..f6dfd9b 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1607,6 +1607,11 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
>          goto out;
>      }
>  
> +    if (kvm_enabled() && !kvm_has_free_slot(machine)) {
> +        error_setg(&local_err, "hypervisor has no free memory slots left");
> +        goto out;
> +    }
> +
>      memory_region_add_subregion(&pcms->hotplug_memory,
>                                  addr - pcms->hotplug_memory_base, mr);
>      vmstate_register_ram(mr, dev);
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index b0cd657..22e42ef 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -163,6 +163,7 @@ extern KVMState *kvm_state;
>  
>  /* external API */
>  
> +bool kvm_has_free_slot(MachineState *ms);
>  int kvm_has_sync_mmu(void);
>  int kvm_has_vcpu_events(void);
>  int kvm_has_robust_singlestep(void);
> diff --git a/kvm-all.c b/kvm-all.c
> index 44a5e72..c24e74b 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -132,7 +132,7 @@ static const KVMCapabilityInfo kvm_required_capabilites[] 
> = {
>      KVM_CAP_LAST_INFO
>  };
>  
> -static KVMSlot *kvm_alloc_slot(KVMState *s)
> +static KVMSlot *kvm_get_free_slot(KVMState *s)
>  {
>      int i;
>  
> @@ -142,6 +142,22 @@ static KVMSlot *kvm_alloc_slot(KVMState *s)
>          }
>      }
>  
> +    return NULL;
> +}
> +
> +bool kvm_has_free_slot(MachineState *ms)
> +{
> +    return kvm_get_free_slot(KVM_STATE(ms->accelerator));
> +}
> +
> +static KVMSlot *kvm_alloc_slot(KVMState *s)
> +{
> +    KVMSlot *slot = kvm_get_free_slot(s);
> +
> +    if (slot) {
> +        return slot;
> +    }
> +
>      fprintf(stderr, "%s: no free slot available\n", __func__);
>      abort();
>  }
> diff --git a/kvm-stub.c b/kvm-stub.c
> index 43fc0dd..7ba90c5 100644
> --- a/kvm-stub.c
> +++ b/kvm-stub.c
> @@ -147,4 +147,9 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, 
> EventNotifier *n, int virq)
>  {
>      return -ENOSYS;
>  }
> +
> +bool kvm_has_free_slot(MachineState *ms)
> +{
> +    return false;
> +}
>  #endif






reply via email to

[Prev in Thread] Current Thread [Next in Thread]