[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC][v2][PATCH 08/14] tools: extend xc_assign_device() to support rdm reservation policy
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 | 4 +++- tools/libxl/libxl_pci.c | 11 ++++++++++- tools/libxl/xl_cmdimpl.c | 23 +++++++++++++++++++---- tools/libxl/xl_cmdtable.c | 2 +- tools/ocaml/libs/xc/xenctrl_stubs.c | 18 ++++++++++++++---- tools/python/xen/lowlevel/xc/xc.c | 29 +++++++++++++++++++---------- xen/drivers/passthrough/pci.c | 3 ++- 8 files changed, 70 insertions(+), 23 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 5f84a62..2a447b9 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 c17a5a8..9761e5a 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1704,7 +1704,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; @@ -1712,6 +1713,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); } diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 07e84f2..ac70edc 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; if (type == LIBXL_DOMAIN_TYPE_INVALID) return ERROR_FAIL; @@ -987,7 +988,15 @@ 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)); + if (pcidev->rdm_reserve == LIBXL_RDM_RESERVE_FLAG_RELAXED) { + flag = XEN_DOMCTL_DEV_RDM_RELAXED; + } else if (pcidev->rdm_reserve == LIBXL_RDM_RESERVE_FLAG_STRICT) { + flag = XEN_DOMCTL_DEV_RDM_STRICT; + } else { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unkwon rdm check flag."); + return ERROR_FAIL; + } + 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/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 2dfa106..0816186 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3341,7 +3341,8 @@ int main_pcidetach(int argc, char **argv) pcidetach(domid, bdf, force); return 0; } -static void pciattach(uint32_t domid, const char *bdf, const char *vs) +static void pciattach(uint32_t domid, const char *bdf, const char *vs, + uint32_t flag) { libxl_device_pci pcidev; XLU_Config *config; @@ -3351,6 +3352,7 @@ static void pciattach(uint32_t domid, const char *bdf, const char *vs) config = xlu_cfg_init(stderr, "command line"); if (!config) { perror("xlu_cfg_inig"); exit(-1); } + pcidev.rdm_reserve = flag; if (xlu_pci_parse_bdf(config, &pcidev, bdf)) { fprintf(stderr, "pci-attach: malformed BDF specification \"%s\"\n", bdf); exit(2); @@ -3363,9 +3365,9 @@ static void pciattach(uint32_t domid, const char *bdf, const char *vs) int main_pciattach(int argc, char **argv) { - uint32_t domid; + uint32_t domid, flag; int opt; - const char *bdf = NULL, *vs = NULL; + const char *bdf = NULL, *vs = NULL, *rdm_policy = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-attach", 2) { /* No options */ @@ -3377,7 +3379,20 @@ int main_pciattach(int argc, char **argv) if (optind + 1 < argc) vs = argv[optind + 2]; - pciattach(domid, bdf, vs); + if (optind + 2 < argc) { + rdm_policy = argv[optind + 3]; + } + if (!strcmp(rdm_policy, "strict")) { + flag = LIBXL_RDM_RESERVE_FLAG_STRICT; + } else if (!strcmp(rdm_policy, "relaxed")) { + flag = LIBXL_RDM_RESERVE_FLAG_RELAXED; + } else { + fprintf(stderr, "%s is an invalid rdm policy: 'strict'|'relaxed'\n", + rdm_policy); + exit(2); + } + + pciattach(domid, bdf, vs, flag); return 0; } diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 7f4759b..06cc452 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -88,7 +88,7 @@ struct cmd_spec cmd_table[] = { { "pci-attach", &main_pciattach, 0, 1, "Insert a new pass-through pci device", - "<Domain> <BDF> [Virtual Slot]", + "<Domain> <BDF> [Virtual Slot] <policy to reserve rdm['force'|'try']>", }, { "pci-detach", &main_pcidetach, 0, 1, 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 fbd93db..86b8925 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; diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index c06f038..f3088a3 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -1499,7 +1499,7 @@ int iommu_do_pci_domctl( { u16 seg; u8 bus, devfn; - u32 flag = XEN_DOMCTL_DEV_RDM_RELAXED; + u32 flag; int ret = 0; uint32_t machine_sbdf; @@ -1581,6 +1581,7 @@ int iommu_do_pci_domctl( seg = machine_sbdf >> 16; bus = PCI_BUS(machine_sbdf); devfn = PCI_DEVFN2(machine_sbdf); + flag = domctl->u.assign_device.flag; ret = device_assigned(seg, bus, devfn) ?: assign_device(d, seg, bus, devfn, flag); -- 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 |