From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tiejun Chen Subject: [RFC][PATCH 08/13] tools: extend xc_assign_device() to support rdm reservation policy Date: Fri, 10 Apr 2015 17:21:59 +0800 Message-ID: <1428657724-3498-9-git-send-email-tiejun.chen@intel.com> References: <1428657724-3498-1-git-send-email-tiejun.chen@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1428657724-3498-1-git-send-email-tiejun.chen@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: JBeulich@suse.com, tim@xen.org, konrad.wilk@oracle.com, andrew.cooper3@citrix.com, kevin.tian@intel.com, yang.z.zhang@intel.com, ian.campbell@citrix.com, wei.liu2@citrix.com, Ian.Jackson@eu.citrix.com, stefano.stabellini@citrix.com Cc: xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org 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 --- 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 | 17 +++++++++++++---- tools/python/xen/lowlevel/xc/xc.c | 29 +++++++++++++++++++---------- 7 files changed, 67 insertions(+), 22 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 299b95f..ff33769 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2044,7 +2044,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 85b18ea..a33311a 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -1654,13 +1654,15 @@ 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; domctl.cmd = XEN_DOMCTL_assign_device; domctl.domain = domid; domctl.u.assign_device.machine_sbdf = machine_sbdf; + domctl.u.assign_device.sbdf_flag = flag; return do_domctl(xch, &domctl); } diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index f3ae132..dd96b4a 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -895,6 +895,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; @@ -988,7 +989,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_TRY) { + flag = XEN_DOMCTL_PCIDEV_RDM_TRY; + } else if (pcidev->rdm_reserve == LIBXL_RDM_RESERVE_FLAG_FORCE) { + flag = XEN_DOMCTL_PCIDEV_RDM_FORCE; + } 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 9a58464..24ace59 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3153,7 +3153,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; @@ -3163,6 +3164,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); @@ -3175,9 +3177,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 */ @@ -3189,7 +3191,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, "force")) { + flag = LIBXL_RDM_RESERVE_FLAG_FORCE; + } else if (!strcmp(rdm_policy, "try")) { + flag = LIBXL_RDM_RESERVE_FLAG_TRY; + } else { + fprintf(stderr, "%s is an invalid rdm policy: 'force'|'try'\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 22ab63b..332de33 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -86,7 +86,7 @@ struct cmd_spec cmd_table[] = { { "pci-attach", &main_pciattach, 0, 1, "Insert a new pass-through pci device", - " [Virtual Slot]", + " [Virtual Slot] ", }, { "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..c9a5437 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -1172,12 +1172,18 @@ 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_PCIDEV_RDM_TRY, + XEN_DOMCTL_PCIDEV_RDM_FORCE, +}; + +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 +1191,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 2aa0dc7..41e55f9 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_PCIDEV_RDM_FORCE; + *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