From: Paul Durrant <Paul.Durrant@citrix.com>
To: Igor Druzhinin <igor.druzhinin@citrix.com>,
"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Anthony Perard <anthony.perard@citrix.com>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"sstabellini@kernel.org" <sstabellini@kernel.org>
Subject: Re: [PATCH v2 2/4] xen/mapcache: add an ability to create dummy mappings
Date: Tue, 4 Jul 2017 16:11:32 +0000 [thread overview]
Message-ID: <f5b0fc3b3b4a42deb7a9359b6c3845d0@AMSPEX02CL01.citrite.net> (raw)
In-Reply-To: <1499183267-28623-3-git-send-email-igor.druzhinin@citrix.com>
> -----Original Message-----
> From: Igor Druzhinin
> Sent: 04 July 2017 16:48
> To: xen-devel@lists.xenproject.org; qemu-devel@nongnu.org
> Cc: Igor Druzhinin <igor.druzhinin@citrix.com>; sstabellini@kernel.org;
> Anthony Perard <anthony.perard@citrix.com>; Paul Durrant
> <Paul.Durrant@citrix.com>; pbonzini@redhat.com
> 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 <igor.druzhinin@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
> ---
> 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
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-07-04 16:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-04 15:47 [PATCH v2 0/4] xen: don't save/restore the physmap on VM save/restore Igor Druzhinin
2017-07-04 15:47 ` [PATCH v2 1/4] xen: move physmap saving into a separate function Igor Druzhinin
2017-07-04 16:05 ` Paul Durrant
2017-07-05 22:16 ` Stefano Stabellini
2017-07-04 15:47 ` [PATCH v2 2/4] xen/mapcache: add an ability to create dummy mappings Igor Druzhinin
2017-07-04 16:11 ` Paul Durrant [this message]
2017-07-05 22:38 ` Stefano Stabellini
2017-07-04 15:47 ` [PATCH v2 3/4] xen/mapcache: introduce xen_replace_cache_entry() Igor Druzhinin
2017-07-04 16:27 ` Paul Durrant
2017-07-04 16:34 ` Igor Druzhinin
2017-07-04 16:42 ` Paul Durrant
2017-07-04 16:46 ` Igor Druzhinin
2017-07-05 8:52 ` Paul Durrant
2017-07-05 22:39 ` Stefano Stabellini
2017-07-06 9:50 ` Paul Durrant
2017-07-05 22:38 ` Stefano Stabellini
2017-07-04 15:47 ` [PATCH v2 4/4] xen: don't use xenstore to save/restore physmap anymore Igor Druzhinin
2017-07-05 22:38 ` Stefano Stabellini
2017-07-06 13:57 ` [Qemu-devel] [PATCH v2 0/4] xen: don't save/restore the physmap on VM save/restore no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f5b0fc3b3b4a42deb7a9359b6c3845d0@AMSPEX02CL01.citrite.net \
--to=paul.durrant@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=igor.druzhinin@citrix.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).