@@ -103,6 +103,7 @@ struct KVMState
AccelState parent_obj;
int nr_slots;
+ int nr_free_slots;
int fd;
int vmfd;
int coalesced_mmio;
@@ -245,6 +246,13 @@ int kvm_get_max_memslots(void)
return s->nr_slots;
}
+unsigned int kvm_get_free_memslots(void)
+{
+ KVMState *s = kvm_state;
+
+ return s->nr_free_slots;
+}
+
/* Called with KVMMemoryListener.slots_lock held */
static KVMSlot *kvm_get_free_slot(KVMMemoryListener *kml)
{
@@ -260,19 +268,6 @@ static KVMSlot *kvm_get_free_slot(KVMMemoryListener *kml)
return NULL;
}
-bool kvm_has_free_slot(MachineState *ms)
-{
- KVMState *s = KVM_STATE(ms->accelerator);
- bool result;
- KVMMemoryListener *kml = &s->memory_listener;
-
- kvm_slots_lock();
- result = !!kvm_get_free_slot(kml);
- kvm_slots_unlock();
-
- return result;
-}
-
/* Called with KVMMemoryListener.slots_lock held */
static KVMSlot *kvm_alloc_slot(KVMMemoryListener *kml)
{
@@ -1410,6 +1405,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
}
start_addr += slot_size;
size -= slot_size;
+ kvm_state->nr_free_slots++;
} while (size);
goto out;
}
@@ -1435,6 +1431,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
ram_start_offset += slot_size;
ram += slot_size;
size -= slot_size;
+ kvm_state->nr_free_slots--;
} while (size);
out:
@@ -2364,6 +2361,7 @@ static int kvm_init(MachineState *ms)
if (!s->nr_slots) {
s->nr_slots = 32;
}
+ s->nr_free_slots = s->nr_slots;
s->nr_as = kvm_check_extension(s, KVM_CAP_MULTI_ADDRESS_SPACE);
if (s->nr_as <= 1) {
@@ -133,9 +133,9 @@ int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
return -ENOSYS;
}
-bool kvm_has_free_slot(MachineState *ms)
+unsigned int kvm_get_free_memslots(void)
{
- return false;
+ return 0;
}
void kvm_init_cpu_signals(CPUState *cpu)
@@ -73,7 +73,7 @@ static void memory_device_check_addable(MachineState *ms, uint64_t size,
uint64_t used_region_size = 0;
/* we will need a new memory slot for kvm and vhost */
- if (kvm_enabled() && !kvm_has_free_slot(ms)) {
+ if (kvm_enabled() && !kvm_get_free_memslots()) {
error_setg(errp, "hypervisor has no free memory slots left");
return;
}
@@ -211,7 +211,7 @@ typedef struct Notifier Notifier;
/* external API */
-bool kvm_has_free_slot(MachineState *ms);
+unsigned int kvm_get_free_memslots(void);
bool kvm_has_sync_mmu(void);
int kvm_has_vcpu_events(void);
int kvm_has_robust_singlestep(void);
Let's return the number of free slots instead of only checking if there is a free slot. Required to support memory devices that consume multiple memslots. Signed-off-by: David Hildenbrand <david@redhat.com> --- accel/kvm/kvm-all.c | 24 +++++++++++------------- accel/stubs/kvm-stub.c | 4 ++-- hw/mem/memory-device.c | 2 +- include/sysemu/kvm.h | 2 +- 4 files changed, 15 insertions(+), 17 deletions(-)