xen: don't use xenstore to save/restore physmap anymore
If we have a system with xenforeignmemory_map2() implemented we don't need to save/restore physmap on suspend/restore anymore. In case we resume a VM without physmap - try to recreate the physmap during memory region restore phase and remap map cache entries accordingly. The old code is left for compatibility reasons. Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
parent
5ba3d75645
commit
331b5189d7
@ -288,6 +288,7 @@ static XenPhysmap *get_physmapping(XenIOState *state,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef XEN_COMPAT_PHYSMAP
|
||||||
static hwaddr xen_phys_offset_to_gaddr(hwaddr start_addr,
|
static hwaddr xen_phys_offset_to_gaddr(hwaddr start_addr,
|
||||||
ram_addr_t size, void *opaque)
|
ram_addr_t size, void *opaque)
|
||||||
{
|
{
|
||||||
@ -333,6 +334,12 @@ static int xen_save_physmap(XenIOState *state, XenPhysmap *physmap)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static int xen_save_physmap(XenIOState *state, XenPhysmap *physmap)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int xen_add_to_physmap(XenIOState *state,
|
static int xen_add_to_physmap(XenIOState *state,
|
||||||
hwaddr start_addr,
|
hwaddr start_addr,
|
||||||
@ -367,6 +374,26 @@ go_physmap:
|
|||||||
DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n",
|
DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n",
|
||||||
start_addr, start_addr + size);
|
start_addr, start_addr + size);
|
||||||
|
|
||||||
|
mr_name = memory_region_name(mr);
|
||||||
|
|
||||||
|
physmap = g_malloc(sizeof(XenPhysmap));
|
||||||
|
|
||||||
|
physmap->start_addr = start_addr;
|
||||||
|
physmap->size = size;
|
||||||
|
physmap->name = mr_name;
|
||||||
|
physmap->phys_offset = phys_offset;
|
||||||
|
|
||||||
|
QLIST_INSERT_HEAD(&state->physmap, physmap, list);
|
||||||
|
|
||||||
|
if (runstate_check(RUN_STATE_INMIGRATE)) {
|
||||||
|
/* Now when we have a physmap entry we can replace a dummy mapping with
|
||||||
|
* a real one of guest foreign memory. */
|
||||||
|
uint8_t *p = xen_replace_cache_entry(phys_offset, start_addr, size);
|
||||||
|
assert(p && p == memory_region_get_ram_ptr(mr));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
pfn = phys_offset >> TARGET_PAGE_BITS;
|
pfn = phys_offset >> TARGET_PAGE_BITS;
|
||||||
start_gpfn = start_addr >> TARGET_PAGE_BITS;
|
start_gpfn = start_addr >> TARGET_PAGE_BITS;
|
||||||
for (i = 0; i < size >> TARGET_PAGE_BITS; i++) {
|
for (i = 0; i < size >> TARGET_PAGE_BITS; i++) {
|
||||||
@ -381,17 +408,6 @@ go_physmap:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mr_name = memory_region_name(mr);
|
|
||||||
|
|
||||||
physmap = g_malloc(sizeof (XenPhysmap));
|
|
||||||
|
|
||||||
physmap->start_addr = start_addr;
|
|
||||||
physmap->size = size;
|
|
||||||
physmap->name = mr_name;
|
|
||||||
physmap->phys_offset = phys_offset;
|
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&state->physmap, physmap, list);
|
|
||||||
|
|
||||||
xc_domain_pin_memory_cacheattr(xen_xc, xen_domid,
|
xc_domain_pin_memory_cacheattr(xen_xc, xen_domid,
|
||||||
start_addr >> TARGET_PAGE_BITS,
|
start_addr >> TARGET_PAGE_BITS,
|
||||||
(start_addr + size - 1) >> TARGET_PAGE_BITS,
|
(start_addr + size - 1) >> TARGET_PAGE_BITS,
|
||||||
@ -1157,6 +1173,7 @@ static void xen_exit_notifier(Notifier *n, void *data)
|
|||||||
xs_daemon_close(state->xenstore);
|
xs_daemon_close(state->xenstore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef XEN_COMPAT_PHYSMAP
|
||||||
static void xen_read_physmap(XenIOState *state)
|
static void xen_read_physmap(XenIOState *state)
|
||||||
{
|
{
|
||||||
XenPhysmap *physmap = NULL;
|
XenPhysmap *physmap = NULL;
|
||||||
@ -1204,6 +1221,11 @@ static void xen_read_physmap(XenIOState *state)
|
|||||||
}
|
}
|
||||||
free(entries);
|
free(entries);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static void xen_read_physmap(XenIOState *state)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void xen_wakeup_notifier(Notifier *notifier, void *data)
|
static void xen_wakeup_notifier(Notifier *notifier, void *data)
|
||||||
{
|
{
|
||||||
@ -1330,7 +1352,11 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
|
|||||||
state->bufioreq_local_port = rc;
|
state->bufioreq_local_port = rc;
|
||||||
|
|
||||||
/* Init RAM management */
|
/* Init RAM management */
|
||||||
|
#ifdef XEN_COMPAT_PHYSMAP
|
||||||
xen_map_cache_init(xen_phys_offset_to_gaddr, state);
|
xen_map_cache_init(xen_phys_offset_to_gaddr, state);
|
||||||
|
#else
|
||||||
|
xen_map_cache_init(NULL, state);
|
||||||
|
#endif
|
||||||
xen_ram_init(pcms, ram_size, ram_memory);
|
xen_ram_init(pcms, ram_size, ram_memory);
|
||||||
|
|
||||||
qemu_add_vm_change_state_handler(xen_hvm_change_state_handler, state);
|
qemu_add_vm_change_state_handler(xen_hvm_change_state_handler, state);
|
||||||
|
@ -239,7 +239,7 @@ static uint8_t *xen_map_cache_unlocked(hwaddr phys_addr, hwaddr size,
|
|||||||
hwaddr address_offset;
|
hwaddr address_offset;
|
||||||
hwaddr cache_size = size;
|
hwaddr cache_size = size;
|
||||||
hwaddr test_bit_size;
|
hwaddr test_bit_size;
|
||||||
bool translated = false;
|
bool translated G_GNUC_UNUSED = false;
|
||||||
bool dummy = false;
|
bool dummy = false;
|
||||||
|
|
||||||
tryagain:
|
tryagain:
|
||||||
@ -307,11 +307,13 @@ tryagain:
|
|||||||
test_bit_size >> XC_PAGE_SHIFT,
|
test_bit_size >> XC_PAGE_SHIFT,
|
||||||
entry->valid_mapping)) {
|
entry->valid_mapping)) {
|
||||||
mapcache->last_entry = NULL;
|
mapcache->last_entry = NULL;
|
||||||
|
#ifdef XEN_COMPAT_PHYSMAP
|
||||||
if (!translated && mapcache->phys_offset_to_gaddr) {
|
if (!translated && mapcache->phys_offset_to_gaddr) {
|
||||||
phys_addr = mapcache->phys_offset_to_gaddr(phys_addr, size, mapcache->opaque);
|
phys_addr = mapcache->phys_offset_to_gaddr(phys_addr, size, mapcache->opaque);
|
||||||
translated = true;
|
translated = true;
|
||||||
goto tryagain;
|
goto tryagain;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (!dummy && runstate_check(RUN_STATE_INMIGRATE)) {
|
if (!dummy && runstate_check(RUN_STATE_INMIGRATE)) {
|
||||||
dummy = true;
|
dummy = true;
|
||||||
goto tryagain;
|
goto tryagain;
|
||||||
|
@ -80,6 +80,7 @@ extern xenforeignmemory_handle *xen_fmem;
|
|||||||
|
|
||||||
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41000
|
#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41000
|
||||||
|
|
||||||
|
#define XEN_COMPAT_PHYSMAP
|
||||||
static inline void *xenforeignmemory_map2(xenforeignmemory_handle *h,
|
static inline void *xenforeignmemory_map2(xenforeignmemory_handle *h,
|
||||||
uint32_t dom, void *addr,
|
uint32_t dom, void *addr,
|
||||||
int prot, int flags, size_t pages,
|
int prot, int flags, size_t pages,
|
||||||
|
Loading…
Reference in New Issue
Block a user