58 |
58 |
int vmfd;
|
59 |
59 |
int coalesced_mmio;
|
60 |
60 |
int broken_set_mem_region;
|
|
61 |
int migration_log;
|
61 |
62 |
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
62 |
63 |
struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
|
63 |
64 |
#endif
|
... | ... | |
135 |
136 |
mem.memory_size = slot->memory_size;
|
136 |
137 |
mem.userspace_addr = (unsigned long)qemu_get_ram_ptr(slot->phys_offset);
|
137 |
138 |
mem.flags = slot->flags;
|
138 |
|
|
|
139 |
if (s->migration_log) {
|
|
140 |
mem.flags |= KVM_MEM_LOG_DIRTY_PAGES;
|
|
141 |
}
|
139 |
142 |
return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
|
140 |
143 |
}
|
141 |
144 |
|
... | ... | |
196 |
199 |
* dirty pages logging control
|
197 |
200 |
*/
|
198 |
201 |
static int kvm_dirty_pages_log_change(target_phys_addr_t phys_addr,
|
199 |
|
ram_addr_t size, unsigned flags,
|
200 |
|
unsigned mask)
|
|
202 |
ram_addr_t size, int flags, int mask)
|
201 |
203 |
{
|
202 |
204 |
KVMState *s = kvm_state;
|
203 |
205 |
KVMSlot *mem = kvm_lookup_matching_slot(s, phys_addr, phys_addr + size);
|
|
206 |
int old_flags;
|
|
207 |
|
204 |
208 |
if (mem == NULL) {
|
205 |
209 |
fprintf(stderr, "BUG: %s: invalid parameters " TARGET_FMT_plx "-"
|
206 |
210 |
TARGET_FMT_plx "\n", __func__, phys_addr,
|
... | ... | |
208 |
212 |
return -EINVAL;
|
209 |
213 |
}
|
210 |
214 |
|
211 |
|
flags = (mem->flags & ~mask) | flags;
|
212 |
|
/* Nothing changed, no need to issue ioctl */
|
213 |
|
if (flags == mem->flags)
|
214 |
|
return 0;
|
|
215 |
old_flags = mem->flags;
|
215 |
216 |
|
|
217 |
flags = (mem->flags & ~mask) | flags;
|
216 |
218 |
mem->flags = flags;
|
217 |
219 |
|
|
220 |
/* If nothing changed effectively, no need to issue ioctl */
|
|
221 |
if (s->migration_log) {
|
|
222 |
flags |= KVM_MEM_LOG_DIRTY_PAGES;
|
|
223 |
}
|
|
224 |
if (flags == old_flags) {
|
|
225 |
return 0;
|
|
226 |
}
|
|
227 |
|
218 |
228 |
return kvm_set_user_memory_region(s, mem);
|
219 |
229 |
}
|
220 |
230 |
|
... | ... | |
232 |
242 |
KVM_MEM_LOG_DIRTY_PAGES);
|
233 |
243 |
}
|
234 |
244 |
|
|
245 |
int kvm_set_migration_log(int enable)
|
|
246 |
{
|
|
247 |
KVMState *s = kvm_state;
|
|
248 |
KVMSlot *mem;
|
|
249 |
int i, err;
|
|
250 |
|
|
251 |
s->migration_log = enable;
|
|
252 |
|
|
253 |
for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
|
|
254 |
mem = &s->slots[i];
|
|
255 |
|
|
256 |
if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) {
|
|
257 |
continue;
|
|
258 |
}
|
|
259 |
err = kvm_set_user_memory_region(s, mem);
|
|
260 |
if (err) {
|
|
261 |
return err;
|
|
262 |
}
|
|
263 |
}
|
|
264 |
return 0;
|
|
265 |
}
|
|
266 |
|
235 |
267 |
/**
|
236 |
268 |
* kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
|
237 |
269 |
* This function updates qemu's dirty bitmap using cpu_physical_memory_set_dirty().
|