Revision 4495d6a7 kvm-all.c
b/kvm-all.c | ||
---|---|---|
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(). |
Also available in: Unified diff