From: Frediano Ziglio <freddy77@gmail.com>
To: xen-devel@lists.xenproject.org
Cc: "Frediano Ziglio" <frediano.ziglio@citrix.com>,
"Jan Beulich" <jbeulich@suse.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Teddy Astie" <teddy.astie@vates.tech>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Juergen Gross" <jgross@suse.com>
Subject: [PATCH v10 5/10] libs/guest: add xg_foreignmemory_copy_{from,to}
Date: Mon, 10 Aug 2026 11:30:08 +0100 [thread overview]
Message-ID: <20260810103018.54564-6-frediano.ziglio@citrix.com> (raw)
In-Reply-To: <20260810103018.54564-1-frediano.ziglio@citrix.com>
This change prepare code to use a new "foreign copy" hypercall.
The new hypercall will copy memory from/to a foreign domain.
The new hypercall can be emulated with a sequence of:
- map foreign memory;
- copy memory;
- unmap foreign memory.
The reason to introduce the emulation first is that you can refactor on the
emulation without having to introduce the new hypercall. Introducing the
hypercall first would make testing more complicated as bugs on the hypercall
have to be taken into account and considered. Also it is easier that way to
enable or disable new code. For instance you want to test for performance
regression (in this case the code emulated should not perform worse).
Signed-off-by: Frediano Ziglio <frediano.ziglio@citrix.com>
---
Changes since v5:
- Do not overwrite errno if xenforeignmemory_map fails.
Changes since v6:
- improve commit message, explain order and changes.
---
tools/libs/guest/xg_sr_common.c | 57 +++++++++++++++++++++++++++++++++
tools/libs/guest/xg_sr_common.h | 8 +++++
2 files changed, 65 insertions(+)
diff --git a/tools/libs/guest/xg_sr_common.c b/tools/libs/guest/xg_sr_common.c
index 9b2782b5cf..90da21c35f 100644
--- a/tools/libs/guest/xg_sr_common.c
+++ b/tools/libs/guest/xg_sr_common.c
@@ -156,6 +156,63 @@ static void __attribute__((unused)) build_assertions(void)
BUILD_BUG_ON(sizeof(struct xc_sr_rec_hvm_params) != 8);
}
+enum {
+ foreigncopy_from,
+ foreigncopy_to
+};
+
+static int xg_foreignmemory_copy(xc_interface *xch, domid_t domid,
+ int dir, size_t nr_pages, void *buffer,
+ const xen_pfn_t foreign_pfns[nr_pages])
+{
+ if ( nr_pages == 0 )
+ return 0;
+
+ if ( !buffer || !foreign_pfns )
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ int err[nr_pages];
+ const int prot = (dir == foreigncopy_from) ? PROT_READ : PROT_READ|PROT_WRITE;
+
+ void *p = xenforeignmemory_map(xch->fmem, domid, prot, nr_pages, foreign_pfns, err);
+ if ( !p )
+ return -1;
+
+ for ( size_t n = 0; n < nr_pages; ++n )
+ if ( err[n] )
+ {
+ xenforeignmemory_unmap(xch->fmem, p, nr_pages);
+ errno = -err[n];
+ return -1;
+ }
+
+ if ( dir == foreigncopy_from )
+ memcpy(buffer, p, nr_pages * XC_PAGE_SIZE);
+ else
+ memcpy(p, buffer, nr_pages * XC_PAGE_SIZE);
+
+ return xenforeignmemory_unmap(xch->fmem, p, nr_pages);
+}
+
+int xg_foreignmemory_copy_from(xc_interface *xch, domid_t dom,
+ size_t nr_pages, void *dest,
+ const xen_pfn_t source[nr_pages])
+{
+ return xg_foreignmemory_copy(xch, dom, foreigncopy_from,
+ nr_pages, dest, source);
+}
+
+int xg_foreignmemory_copy_to(xc_interface *xch, domid_t dom,
+ size_t nr_pages, const xen_pfn_t dest[nr_pages],
+ const void *source)
+{
+ return xg_foreignmemory_copy(xch, dom, foreigncopy_to,
+ nr_pages, (void *) source, dest);
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/libs/guest/xg_sr_common.h b/tools/libs/guest/xg_sr_common.h
index 020b1a5272..50f235ba87 100644
--- a/tools/libs/guest/xg_sr_common.h
+++ b/tools/libs/guest/xg_sr_common.h
@@ -556,6 +556,14 @@ static inline bool page_type_has_stream_data(uint32_t type)
}
}
+int xg_foreignmemory_copy_from(xc_interface *xch, domid_t dom,
+ size_t nr_pages, void *dest,
+ const xen_pfn_t source[nr_pages]);
+
+int xg_foreignmemory_copy_to(xc_interface *xch, domid_t dom,
+ size_t nr_pages, const xen_pfn_t dest[nr_pages],
+ const void *source);
+
#endif
/*
* Local variables:
--
2.43.0
next prev parent reply other threads:[~2026-08-10 10:30 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-10 10:30 [PATCH v10 0/10] xenguest optimisations Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 1/10] libs/call: cache up to 4 pages in hypercall bounce buffers Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 2/10] libs/guest: move batch_pfns into a separate structure Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 3/10] libs/guest: allocate various migration arrays just once Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 4/10] libs/guest: use Valgrind or sanitizers to detect various buffer overflows Frediano Ziglio
2026-08-10 10:30 ` Frediano Ziglio [this message]
2026-08-10 10:30 ` [PATCH v10 6/10] libs/guest: use foreign copy API during migration Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 7/10] xen: implement new foreign copy hypercall Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 8/10] privcmd: Add definition for new Linux privcmd to access new Xen hypercall Frediano Ziglio
2026-08-10 10:30 ` [PATCH v10 9/10] libs/guest: use new hypercall if available Frediano Ziglio
2026-08-10 10:30 ` [PATCH Linux v6 10/10] xen/privcmd: Add new ABI to allow copying foreign memory Frediano Ziglio
2026-08-11 11:37 ` [PATCH v10 0/10] xenguest optimisations Anthony PERARD
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=20260810103018.54564-6-frediano.ziglio@citrix.com \
--to=freddy77@gmail.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=frediano.ziglio@citrix.com \
--cc=jbeulich@suse.com \
--cc=jgross@suse.com \
--cc=roger.pau@citrix.com \
--cc=teddy.astie@vates.tech \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.