|
@@ -181,6 +181,24 @@ int kvm_get_max_memslots(void)
|
|
|
return s->nr_slots;
|
|
|
}
|
|
|
|
|
|
+unsigned int kvm_get_free_memslots(void)
|
|
|
+{
|
|
|
+ unsigned int used_slots = 0;
|
|
|
+ KVMState *s = kvm_state;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ kvm_slots_lock();
|
|
|
+ for (i = 0; i < s->nr_as; i++) {
|
|
|
+ if (!s->as[i].ml) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ used_slots = MAX(used_slots, s->as[i].ml->nr_used_slots);
|
|
|
+ }
|
|
|
+ kvm_slots_unlock();
|
|
|
+
|
|
|
+ return s->nr_slots - used_slots;
|
|
|
+}
|
|
|
+
|
|
|
/* Called with KVMMemoryListener.slots_lock held */
|
|
|
static KVMSlot *kvm_get_free_slot(KVMMemoryListener *kml)
|
|
|
{
|
|
@@ -196,19 +214,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)
|
|
|
{
|
|
@@ -1387,6 +1392,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
|
|
}
|
|
|
start_addr += slot_size;
|
|
|
size -= slot_size;
|
|
|
+ kml->nr_used_slots--;
|
|
|
} while (size);
|
|
|
return;
|
|
|
}
|
|
@@ -1412,6 +1418,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
|
|
ram_start_offset += slot_size;
|
|
|
ram += slot_size;
|
|
|
size -= slot_size;
|
|
|
+ kml->nr_used_slots++;
|
|
|
} while (size);
|
|
|
}
|
|
|
|