This patch parses to enable user configurable parameters to specify RDM resource and according policies,
Global RDM parameter: rdm = "type=none/host,reserve=strict/relaxed" Per-device RDM parameter: pci = [ 'sbdf, rdm_reserve=strict/relaxed' ] Default per-device RDM policy is 'strict', while default global RDM policy is 'relaxed'. When both policies are specified on a given region, 'strict' is always preferred. 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> Signed-off-by: Tiejun Chen <tiejun.c...@intel.com> --- v4: * Separated from current patch #11 to parse/enable our rdm policy parameters since its make a lot sense and these stuffs are specific to xl/libxlu. tools/libxl/libxlu_pci.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxlutil.h | 4 +++ tools/libxl/xl_cmdimpl.c | 10 ++++++ 3 files changed, 106 insertions(+) diff --git a/tools/libxl/libxlu_pci.c b/tools/libxl/libxlu_pci.c index 26fb143..9255878 100644 --- a/tools/libxl/libxlu_pci.c +++ b/tools/libxl/libxlu_pci.c @@ -42,6 +42,9 @@ static int pcidev_struct_fill(libxl_device_pci *pcidev, unsigned int domain, #define STATE_OPTIONS_K 6 #define STATE_OPTIONS_V 7 #define STATE_TERMINAL 8 +#define STATE_TYPE 9 +#define STATE_RDM_TYPE 10 +#define STATE_RESERVE_FLAG 11 int xlu_pci_parse_bdf(XLU_Config *cfg, libxl_device_pci *pcidev, const char *str) { unsigned state = STATE_DOMAIN; @@ -143,6 +146,17 @@ int xlu_pci_parse_bdf(XLU_Config *cfg, libxl_device_pci *pcidev, const char *str pcidev->permissive = atoi(tok); }else if ( !strcmp(optkey, "seize") ) { pcidev->seize = atoi(tok); + }else if ( !strcmp(optkey, "rdm_reserve") ) { + if ( !strcmp(tok, "strict") ) { + pcidev->rdm_reserve = LIBXL_RDM_RESERVE_FLAG_STRICT; + } else if ( !strcmp(tok, "relaxed") ) { + pcidev->rdm_reserve = LIBXL_RDM_RESERVE_FLAG_RELAXED; + } else { + XLU__PCI_ERR(cfg, "%s is not an valid PCI RDM property" + " flag: 'strict' or 'relaxed'.", + tok); + goto parse_error; + } }else{ XLU__PCI_ERR(cfg, "Unknown PCI BDF option: %s", optkey); } @@ -167,6 +181,84 @@ parse_error: return ERROR_INVAL; } +int xlu_rdm_parse(XLU_Config *cfg, libxl_rdm_reserve *rdm, const char *str) +{ + unsigned state = STATE_TYPE; + char *buf2, *tok, *ptr, *end; + + if (NULL == (buf2 = ptr = strdup(str))) + return ERROR_NOMEM; + + for (tok = ptr, end = ptr + strlen(ptr) + 1; ptr < end; ptr++) { + switch(state) { + case STATE_TYPE: + if (*ptr == '=') { + state = STATE_RDM_TYPE; + *ptr = '\0'; + if (strcmp(tok, "type")) { + XLU__PCI_ERR(cfg, "Unknown RDM state option: %s", tok); + goto parse_error; + } + tok = ptr + 1; + } + break; + case STATE_RDM_TYPE: + if (*ptr == '\0' || *ptr == ',') { + state = STATE_RESERVE_FLAG; + *ptr = '\0'; + if (!strcmp(tok, "host")) { + rdm->type = LIBXL_RDM_RESERVE_TYPE_HOST; + } else if (!strcmp(tok, "none")) { + rdm->type = LIBXL_RDM_RESERVE_TYPE_NONE; + } else { + XLU__PCI_ERR(cfg, "Unknown RDM type option: %s", tok); + goto parse_error; + } + tok = ptr + 1; + } + break; + case STATE_RESERVE_FLAG: + if (*ptr == '=') { + state = STATE_OPTIONS_V; + *ptr = '\0'; + if (strcmp(tok, "reserve")) { + XLU__PCI_ERR(cfg, "Unknown RDM property value: %s", tok); + goto parse_error; + } + tok = ptr + 1; + } + break; + case STATE_OPTIONS_V: + if (*ptr == ',' || *ptr == '\0') { + state = STATE_TERMINAL; + *ptr = '\0'; + if (!strcmp(tok, "strict")) { + rdm->reserve = LIBXL_RDM_RESERVE_FLAG_STRICT; + } else if (!strcmp(tok, "relaxed")) { + rdm->reserve = LIBXL_RDM_RESERVE_FLAG_RELAXED; + } else { + XLU__PCI_ERR(cfg, "Unknown RDM property flag value: %s", + tok); + goto parse_error; + } + tok = ptr + 1; + } + default: + break; + } + } + + free(buf2); + + if (tok != ptr || state != STATE_TERMINAL) + goto parse_error; + + return 0; + +parse_error: + return ERROR_INVAL; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxlutil.h b/tools/libxl/libxlutil.h index 989605a..e81b644 100644 --- a/tools/libxl/libxlutil.h +++ b/tools/libxl/libxlutil.h @@ -106,6 +106,10 @@ int xlu_disk_parse(XLU_Config *cfg, int nspecs, const char *const *specs, */ int xlu_pci_parse_bdf(XLU_Config *cfg, libxl_device_pci *pcidev, const char *str); +/* + * RDM parsing + */ +int xlu_rdm_parse(XLU_Config *cfg, libxl_rdm_reserve *rdm, const char *str); /* * Vif rate parsing. diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index c7a12b1..85d74fd 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1923,6 +1923,14 @@ skip_vfb: xlu_cfg_get_defbool(config, "e820_host", &b_info->u.pv.e820_host, 0); } + if (!xlu_cfg_get_string(config, "rdm", &buf, 0)) { + libxl_rdm_reserve rdm; + if (!xlu_rdm_parse(config, &rdm, buf)) { + b_info->rdm.type = rdm.type; + b_info->rdm.reserve = rdm.reserve; + } + } + if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) { d_config->num_pcidevs = 0; d_config->pcidevs = NULL; @@ -1937,6 +1945,8 @@ skip_vfb: pcidev->power_mgmt = pci_power_mgmt; pcidev->permissive = pci_permissive; pcidev->seize = pci_seize; + /* We'd like to force reserve rdm specific to a device by default.*/ + pcidev->rdm_reserve = LIBXL_RDM_RESERVE_FLAG_STRICT; if (!xlu_pci_parse_bdf(config, pcidev, buf)) d_config->num_pcidevs++; } -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel