Skip to contentSkip to conversation

libxc: add xc_domain_add_to_physmap_batch to wrap XENMEM_add_to_physmap_batch

PATCH Superseded Zhongze Liu 2 participants 3 messages Jun 20, 2017 – Jun 22, 2017

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 libxc: add xc_domain_add_to_physmap_batch to wrap XENMEM_add_to_physmap_batch

This is a preparation for the proposal "allow setting up shared memory areas between VMs from xl config file". See:
V2: https://lists.xen.org/archives/html/xen-devel/2017-06/msg02256.html
V1: https://lists.xen.org/archives/html/xen-devel/2017-05/msg01288.html

The plan is to use XENMEM_add_to_physmap_batch in xl to map foregin pages from one DomU to another so that the page could be shared. But currently there is no wrapper for XENMEM_add_to_physmap_batch in libxc, so we just add a wrapper for it.

---
Changed Since v1:
* explain why such a sudden wrapper
* change the parameters' types

Cc Ian Jackson <[email protected]>,
Cc Wei Liu <[email protected]>,
Cc Stefano Stabellini <[email protected]>
Cc Julien Grall <[email protected]>
Cc Jan Beulich <[email protected]
---
 tools/libxc/include/xenctrl.h |  9 +++++++++
 tools/libxc/xc_domain.c       | 44 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
tools/libxc/include/xenctrl.h +9 -0
index 1629f412dd..9501818558 100644
@@ -1372,6 +1372,15 @@ int xc_domain_add_to_physmap(xc_interface *xch,
                              unsigned long idx,
                              xen_pfn_t gpfn);
 
+int xc_domain_add_to_physmap_batch(xc_interface *xch,
+                                   domid_t domid,
+                                   domid_t foreign_domid,
+                                   unsigned int space,
+                                   unsigned int size,
+                                   xen_ulong_t *idxs,
+                                   xen_pfn_t *gfpns,
+                                   int *errs);
+
 int xc_domain_populate_physmap(xc_interface *xch,
                                uint32_t domid,
                                unsigned long nr_extents,
tools/libxc/xc_domain.c +44 -0

50 lines not on this page · raw message

Signature · 7 lines
2.13.1


_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel
#1 lore raw
Quoted 21 lines · Zhongze Liu

This is a preparation for the proposal "allow setting up shared memory areas between VMs from xl config file". See:
V2: https://lists.xen.org/archives/html/xen-devel/2017-06/msg02256.html
V1: https://lists.xen.org/archives/html/xen-devel/2017-05/msg01288.html

The plan is to use XENMEM_add_to_physmap_batch in xl to map foregin pages from one DomU to another so that the page could be shared. But currently there is no wrapper for XENMEM_add_to_physmap_batch in libxc, so we just add a wrapper for it.

---

tools/libxc/xc_domain.c +9 -0
+int xc_domain_add_to_physmap_batch(xc_interface *xch,
+                                   domid_t domid,
+                                   domid_t foreign_domid,
+                                   unsigned int space,
+                                   unsigned int size,
+                                   xen_ulong_t *idxs,
+                                   xen_pfn_t *gpfns,
+                                   int *errs)
+{

tools/libxc/xc_domain.c int xc_domain_add_to_physmap(xc_interface *xch, · line 1053

Quoted 10 lines
tools/libxc/xc_domain.c +10 -0
+    int rc;
+    DECLARE_HYPERCALL_BOUNCE(idxs, size * sizeof(*idxs), XC_HYPERCALL_BUFFER_BOUNCE_IN);
+    DECLARE_HYPERCALL_BOUNCE(gpfns, size * sizeof(*gpfns), XC_HYPERCALL_BUFFER_BOUNCE_IN);
+    DECLARE_HYPERCALL_BOUNCE(errs, size * sizeof(*errs), XC_HYPERCALL_BUFFER_BOUNCE_OUT);
+
+    struct xen_add_to_physmap_batch xatp_batch = {
+        .domid = domid,
+        .space = space,
+        .size = size,
+        .u = {.foreign_domid = foreign_domid}

Coding style issue.

Just a note, the struct is different for pre-4.7 and post-4.7 Xen. You don't need to implement a version of this function for pre-4.7 Xen.

tools/libxc/xc_domain.c int xc_domain_add_to_physmap(xc_interface *xch, · line 1061

Quoted 8 lines
tools/libxc/xc_domain.c +8 -0
+    };
+
+    if ( xc_hypercall_bounce_pre(xch, idxs)  ||
+         xc_hypercall_bounce_pre(xch, gpfns) ||
+         xc_hypercall_bounce_pre(xch, errs)  )
+    {
+        PERROR("Could not bounce memory for XENMEM_add_to_physmap_batch");
+        goto out;

rc will be uninitialised in this exit path.

Quoted 23 lines
tools/libxc/xc_domain.c +17 -0
+    }
+
+    set_xen_guest_handle(xatp_batch.idxs, idxs);
+    set_xen_guest_handle(xatp_batch.gpfns, gpfns);
+    set_xen_guest_handle(xatp_batch.errs, errs);
+
+    rc = do_memory_op(xch, XENMEM_add_to_physmap_batch,
+                      &xatp_batch, sizeof(xatp_batch));
+
+out:
+    xc_hypercall_bounce_post(xch, idxs);
+    xc_hypercall_bounce_post(xch, gpfns);
+    xc_hypercall_bounce_post(xch, errs);
+
+    return rc;
+}
+
 int xc_domain_claim_pages(xc_interface *xch,
                                uint32_t domid,
                                unsigned long nr_pages)
Signature · 1 line
2.13.1

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel

#2 lore raw

Hi Wei,

2017-06-21 23:44 GMT+08:00 Wei Liu <[email protected]>:

Quoted 26 lines · Zhongze Liu
Quoted 25 lines

This is a preparation for the proposal "allow setting up shared memory areas between VMs from xl config file". See:
V2: https://lists.xen.org/archives/html/xen-devel/2017-06/msg02256.html
V1: https://lists.xen.org/archives/html/xen-devel/2017-05/msg01288.html

The plan is to use XENMEM_add_to_physmap_batch in xl to map foregin pages from one DomU to another so that the page could be shared. But currently there is no wrapper for XENMEM_add_to_physmap_batch in libxc, so we just add a wrapper for it.

---

tools/libxc/xc_domain.c +13 -0
+int xc_domain_add_to_physmap_batch(xc_interface *xch,
+                                   domid_t domid,
+                                   domid_t foreign_domid,
+                                   unsigned int space,
+                                   unsigned int size,
+                                   xen_ulong_t *idxs,
+                                   xen_pfn_t *gpfns,
+             .                      int *errs)
+{
+    int rc;
+    DECLARE_HYPERCALL_BOUNCE(idxs, size * sizeof(*idxs), XC_HYPERCALL_BUFFER_BOUNCE_IN);
+    DECLARE_HYPERCALL_BOUNCE(gpfns, size * sizeof(*gpfns), XC_HYPERCALL_BUFFER_BOUNCE_IN);
+    DECLARE_HYPERCALL_BOUNCE(errs, size * sizeof(*errs), XC_HYPERCALL_BUFFER_BOUNCE_OUT);
Quoted 8 lines

tools/libxc/xc_domain.c int xc_domain_add_to_physmap(xc_interface *xch, · line 1053

Quoted 6 lines
tools/libxc/xc_domain.c +6 -0
+
+    struct xen_add_to_physmap_batch xatp_batch = {
+        .domid = domid,
+        .space = space,
+        .size = size,
+        .u = {.foreign_domid = foreign_domid}

Coding style issue.

Do you mean that I should add a space between '{' and '.' near ".u = {.foreign" in this line?

Quoted 30 lines

Just a note, the struct is different for pre-4.7 and post-4.7 Xen. You don't need to implement a version of this function for pre-4.7 Xen.

tools/libxc/xc_domain.c int xc_domain_add_to_physmap(xc_interface *xch, · line 1061

Quoted 8 lines
tools/libxc/xc_domain.c +8 -0
+    };
+
+    if ( xc_hypercall_bounce_pre(xch, idxs)  ||
+         xc_hypercall_bounce_pre(xch, gpfns) ||
+         xc_hypercall_bounce_pre(xch, errs)  )
+    {
+        PERROR("Could not bounce memory for XENMEM_add_to_physmap_batch");
+        goto out;

rc will be uninitialised in this exit path.

Quoted 15 lines
tools/libxc/xc_domain.c +15 -0
+    }
+
+    set_xen_guest_handle(xatp_batch.idxs, idxs);
+    set_xen_guest_handle(xatp_batch.gpfns, gpfns);
+    set_xen_guest_handle(xatp_batch.errs, errs);
+
+    rc = do_memory_op(xch, XENMEM_add_to_physmap_batch,
+                      &xatp_batch, sizeof(xatp_batch));
+
+out:
+    xc_hypercall_bounce_post(xch, idxs);
+    xc_hypercall_bounce_post(xch, gpfns);
+    xc_hypercall_bounce_post(xch, errs);
+
+    return rc;
Quoted 8 lines
Quoted 8 lines
tools/libxc/xc_domain.c +2 -1
+}
+
 int xc_domain_claim_pages(xc_interface *xch,
                                uint32_t domid,
                                unsigned long nr_pages)
--

2.13.1

Cheers,

Zhongze Liu

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel