This patch passes rdm reservation policy to xc_assign_device() so the policy is checked when assigning devices to a VM.
Note this also bring some fallout to python usage of xc_assign_device(). CC: Ian Jackson <ian.jack...@eu.citrix.com> CC: Stefano Stabellini <stefano.stabell...@eu.citrix.com> CC: Ian Campbell <ian.campb...@citrix.com> CC: Wei Liu <wei.l...@citrix.com> CC: David Scott <dave.sc...@eu.citrix.com> Acked-by: Wei Liu <wei.l...@citrix.com> Signed-off-by: Tiejun Chen <tiejun.c...@intel.com> --- v6 ~ v10: * Nothing is changed. v5: * Fix the flag field as "0" to DT device v4: * In the patch head description, I add to explain why we need to sync the xc.c file tools/libxc/include/xenctrl.h | 3 ++- tools/libxc/xc_domain.c | 9 ++++++++- tools/libxl/libxl_pci.c | 3 ++- tools/ocaml/libs/xc/xenctrl_stubs.c | 16 ++++++++++++---- tools/python/xen/lowlevel/xc/xc.c | 30 ++++++++++++++++++++---------- 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 9160623..89cbc5a 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2079,7 +2079,8 @@ int xc_hvm_destroy_ioreq_server(xc_interface *xch, /* HVM guest pass-through */ int xc_assign_device(xc_interface *xch, uint32_t domid, - uint32_t machine_sbdf); + uint32_t machine_sbdf, + uint32_t flag); int xc_get_device_group(xc_interface *xch, uint32_t domid, diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 0951291..ef41228 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1697,7 +1697,8 @@ int xc_domain_setdebugging(xc_interface *xch, int xc_assign_device( xc_interface *xch, uint32_t domid, - uint32_t machine_sbdf) + uint32_t machine_sbdf, + uint32_t flag) { DECLARE_DOMCTL; @@ -1705,6 +1706,7 @@ int xc_assign_device( domctl.domain = domid; domctl.u.assign_device.dev = XEN_DOMCTL_DEV_PCI; domctl.u.assign_device.u.pci.machine_sbdf = machine_sbdf; + domctl.u.assign_device.flag = flag; return do_domctl(xch, &domctl); } @@ -1792,6 +1794,11 @@ int xc_assign_dt_device( domctl.u.assign_device.dev = XEN_DOMCTL_DEV_DT; domctl.u.assign_device.u.dt.size = size; + /* + * DT doesn't own any RDM so actually DT has nothing to do + * for any flag and here just fix that as 0. + */ + domctl.u.assign_device.flag = 0; set_xen_guest_handle(domctl.u.assign_device.u.dt.path, path); rc = do_domctl(xch, &domctl); diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index e0743f8..632c15e 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -894,6 +894,7 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i FILE *f; unsigned long long start, end, flags, size; int irq, i, rc, hvm = 0; + uint32_t flag = XEN_DOMCTL_DEV_RDM_RELAXED; if (type == LIBXL_DOMAIN_TYPE_INVALID) return ERROR_FAIL; @@ -987,7 +988,7 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i out: if (!libxl_is_stubdom(ctx, domid, NULL)) { - rc = xc_assign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev)); + rc = xc_assign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev), flag); if (rc < 0 && (hvm || errno != ENOSYS)) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_assign_device failed"); return ERROR_FAIL; diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index 64f1137..b7de615 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -1172,12 +1172,17 @@ CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value d CAMLreturn(Val_bool(ret == 0)); } -CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc) +static int domain_assign_device_rdm_flag_table[] = { + XEN_DOMCTL_DEV_RDM_RELAXED, +}; + +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc, + value rflag) { - CAMLparam3(xch, domid, desc); + CAMLparam4(xch, domid, desc, rflag); int ret; int domain, bus, dev, func; - uint32_t sbdf; + uint32_t sbdf, flag; domain = Int_val(Field(desc, 0)); bus = Int_val(Field(desc, 1)); @@ -1185,7 +1190,10 @@ CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc) func = Int_val(Field(desc, 3)); sbdf = encode_sbdf(domain, bus, dev, func); - ret = xc_assign_device(_H(xch), _D(domid), sbdf); + ret = Int_val(Field(rflag, 0)); + flag = domain_assign_device_rdm_flag_table[ret]; + + ret = xc_assign_device(_H(xch), _D(domid), sbdf, flag); if (ret < 0) failwith_xc(_H(xch)); diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index c77e15b..a4928c6 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -592,7 +592,8 @@ static int token_value(char *token) return strtol(token, NULL, 16); } -static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func) +static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func, + int *flag) { char *token; @@ -607,8 +608,17 @@ static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func) *dev = token_value(token); token = strchr(token, ',') + 1; *func = token_value(token); - token = strchr(token, ','); - *str = token ? token + 1 : NULL; + token = strchr(token, ',') + 1; + if ( token ) { + *flag = token_value(token); + *str = token + 1; + } + else + { + /* O means we take "strict" as our default policy. */ + *flag = 0; + *str = NULL; + } return 1; } @@ -620,14 +630,14 @@ static PyObject *pyxc_test_assign_device(XcObject *self, uint32_t dom; char *pci_str; int32_t sbdf = 0; - int seg, bus, dev, func; + int seg, bus, dev, func, flag; static char *kwd_list[] = { "domid", "pci", NULL }; if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list, &dom, &pci_str) ) return NULL; - while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) ) + while ( next_bdf(&pci_str, &seg, &bus, &dev, &func, &flag) ) { sbdf = seg << 16; sbdf |= (bus & 0xff) << 8; @@ -653,21 +663,21 @@ static PyObject *pyxc_assign_device(XcObject *self, uint32_t dom; char *pci_str; int32_t sbdf = 0; - int seg, bus, dev, func; + int seg, bus, dev, func, flag; static char *kwd_list[] = { "domid", "pci", NULL }; if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list, &dom, &pci_str) ) return NULL; - while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) ) + while ( next_bdf(&pci_str, &seg, &bus, &dev, &func, &flag) ) { sbdf = seg << 16; sbdf |= (bus & 0xff) << 8; sbdf |= (dev & 0x1f) << 3; sbdf |= (func & 0x7); - if ( xc_assign_device(self->xc_handle, dom, sbdf) != 0 ) + if ( xc_assign_device(self->xc_handle, dom, sbdf, flag) != 0 ) { if (errno == ENOSYS) sbdf = -1; @@ -686,14 +696,14 @@ static PyObject *pyxc_deassign_device(XcObject *self, uint32_t dom; char *pci_str; int32_t sbdf = 0; - int seg, bus, dev, func; + int seg, bus, dev, func, flag; static char *kwd_list[] = { "domid", "pci", NULL }; if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list, &dom, &pci_str) ) return NULL; - while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) ) + while ( next_bdf(&pci_str, &seg, &bus, &dev, &func, &flag) ) { sbdf = seg << 16; sbdf |= (bus & 0xff) << 8; -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel