[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/4] xen/mapcache: add an ability to create d
From: |
Paul Durrant |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/4] xen/mapcache: add an ability to create dummy mappings |
Date: |
Tue, 4 Jul 2017 16:11:32 +0000 |
> -----Original Message-----
> From: Igor Druzhinin
> Sent: 04 July 2017 16:48
> To: address@hidden; address@hidden
> Cc: Igor Druzhinin <address@hidden>; address@hidden;
> Anthony Perard <address@hidden>; Paul Durrant
> <address@hidden>; address@hidden
> Subject: [PATCH v2 2/4] xen/mapcache: add an ability to create dummy
> mappings
>
> Dummys are simple anonymous mappings that are placed instead
> of regular foreign mappings in certain situations when we need
> to postpone the actual mapping but still have to give a
> memory region to QEMU to play with.
>
> This is planned to be used for restore on Xen.
>
> Signed-off-by: Igor Druzhinin <address@hidden>
Reviewed-by: Paul Durrant <address@hidden>
> ---
> hw/i386/xen/xen-mapcache.c | 40
> ++++++++++++++++++++++++++++++++--------
> 1 file changed, 32 insertions(+), 8 deletions(-)
>
> diff --git a/hw/i386/xen/xen-mapcache.c b/hw/i386/xen/xen-mapcache.c
> index e60156c..cd4e746 100644
> --- a/hw/i386/xen/xen-mapcache.c
> +++ b/hw/i386/xen/xen-mapcache.c
> @@ -53,6 +53,8 @@ typedef struct MapCacheEntry {
> uint8_t *vaddr_base;
> unsigned long *valid_mapping;
> uint8_t lock;
> +#define XEN_MAPCACHE_ENTRY_DUMMY (1 << 0)
> + uint8_t flags;
> hwaddr size;
> struct MapCacheEntry *next;
> } MapCacheEntry;
> @@ -150,7 +152,8 @@ void xen_map_cache_init(phys_offset_to_gaddr_t f,
> void *opaque)
>
> static void xen_remap_bucket(MapCacheEntry *entry,
> hwaddr size,
> - hwaddr address_index)
> + hwaddr address_index,
> + bool dummy)
> {
> uint8_t *vaddr_base;
> xen_pfn_t *pfns;
> @@ -177,11 +180,27 @@ static void xen_remap_bucket(MapCacheEntry
> *entry,
> pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-XC_PAGE_SHIFT))
> + i;
> }
>
> - vaddr_base = xenforeignmemory_map(xen_fmem, xen_domid,
> PROT_READ|PROT_WRITE,
> - nb_pfn, pfns, err);
> - if (vaddr_base == NULL) {
> - perror("xenforeignmemory_map");
> - exit(-1);
> + if (!dummy) {
> + vaddr_base = xenforeignmemory_map(xen_fmem, xen_domid,
> + PROT_READ|PROT_WRITE,
> + nb_pfn, pfns, err);
> + if (vaddr_base == NULL) {
> + perror("xenforeignmemory_map");
> + exit(-1);
> + }
> + entry->flags &= ~(XEN_MAPCACHE_ENTRY_DUMMY);
> + } else {
> + /*
> + * We create dummy mappings where we are unable to create a foreign
> + * mapping immediately due to certain circumstances (i.e. on resume
> now)
> + */
> + vaddr_base = mmap(NULL, size, PROT_READ|PROT_WRITE,
> + MAP_ANON|MAP_SHARED, -1, 0);
> + if (vaddr_base == NULL) {
> + perror("mmap");
> + exit(-1);
> + }
> + entry->flags |= XEN_MAPCACHE_ENTRY_DUMMY;
> }
>
> entry->vaddr_base = vaddr_base;
> @@ -211,6 +230,7 @@ static uint8_t *xen_map_cache_unlocked(hwaddr
> phys_addr, hwaddr size,
> hwaddr cache_size = size;
> hwaddr test_bit_size;
> bool translated = false;
> + bool dummy = false;
>
> tryagain:
> address_index = phys_addr >> MCACHE_BUCKET_SHIFT;
> @@ -262,14 +282,14 @@ tryagain:
> if (!entry) {
> entry = g_malloc0(sizeof (MapCacheEntry));
> pentry->next = entry;
> - xen_remap_bucket(entry, cache_size, address_index);
> + xen_remap_bucket(entry, cache_size, address_index, dummy);
> } else if (!entry->lock) {
> if (!entry->vaddr_base || entry->paddr_index != address_index ||
> entry->size != cache_size ||
> !test_bits(address_offset >> XC_PAGE_SHIFT,
> test_bit_size >> XC_PAGE_SHIFT,
> entry->valid_mapping)) {
> - xen_remap_bucket(entry, cache_size, address_index);
> + xen_remap_bucket(entry, cache_size, address_index, dummy);
> }
> }
>
> @@ -282,6 +302,10 @@ tryagain:
> translated = true;
> goto tryagain;
> }
> + if (!dummy && runstate_check(RUN_STATE_INMIGRATE)) {
> + dummy = true;
> + goto tryagain;
> + }
> trace_xen_map_cache_return(NULL);
> return NULL;
> }
> --
> 2.7.4
- [Qemu-devel] [PATCH v2 0/4] xen: don't save/restore the physmap on VM save/restore, Igor Druzhinin, 2017/07/04
- [Qemu-devel] [PATCH v2 1/4] xen: move physmap saving into a separate function, Igor Druzhinin, 2017/07/04
- [Qemu-devel] [PATCH v2 2/4] xen/mapcache: add an ability to create dummy mappings, Igor Druzhinin, 2017/07/04
- [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Igor Druzhinin, 2017/07/04
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Paul Durrant, 2017/07/04
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Igor Druzhinin, 2017/07/04
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Paul Durrant, 2017/07/04
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Igor Druzhinin, 2017/07/04
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Paul Durrant, 2017/07/05
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Stefano Stabellini, 2017/07/05
- Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Paul Durrant, 2017/07/06
Re: [Qemu-devel] [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry(), Stefano Stabellini, 2017/07/05