[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v3][PATCH 10/16] tools: extend xc_assign_device() to support rdm reservation policy
> From: Chen, Tiejun > Sent: Thursday, June 11, 2015 9:15 AM > > This patch passes rdm reservation policy to xc_assign_device() so the policy > is checked when assigning devices to a VM. > > Signed-off-by: Tiejun Chen <tiejun.chen@xxxxxxxxx> > --- > tools/libxc/include/xenctrl.h | 3 ++- > tools/libxc/xc_domain.c | 6 +++++- > tools/libxl/libxl_pci.c | 3 ++- > tools/ocaml/libs/xc/xenctrl_stubs.c | 18 ++++++++++++++---- > tools/python/xen/lowlevel/xc/xc.c | 29 +++++++++++++++++++---------- > 5 files changed, 42 insertions(+), 17 deletions(-) > > diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h > index 6c01362..7fd60d5 100644 > --- a/tools/libxc/include/xenctrl.h > +++ b/tools/libxc/include/xenctrl.h > @@ -2078,7 +2078,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 4f96e1b..19127ec 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,8 @@ 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. */ > + domctl.u.assign_device.flag = XEN_DOMCTL_DEV_NO_RDM; still not clear about this NO_RDM flag. If a device-tree device doesn't own RDM, the hypervisor will know it. Why do we require toolstack to tell hypervisor not use it? > 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..317bf75 100644 > --- a/tools/ocaml/libs/xc/xenctrl_stubs.c > +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c > @@ -1172,12 +1172,19 @@ 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_NO_RDM, > + XEN_DOMCTL_DEV_RDM_RELAXED, > + XEN_DOMCTL_DEV_RDM_STRICT, > +}; > + > +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 +1192,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..172bdf0 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,16 @@ 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 > + { > + *flag = XEN_DOMCTL_DEV_RDM_STRICT; > + *str = NULL; > + } > > return 1; > } > @@ -620,14 +629,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 +662,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 +695,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@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |