tools: parse to enable new rdm policy parameters

This patch parses to enable user configurable parameters to specify
RDM resource and according policies which are defined previously,

Global RDM parameter:
    rdm = "strategy=host,policy=strict/relaxed"
Per-device RDM parameter:
    pci = [ 'sbdf, rdm_policy=strict/relaxed' ]

Default per-device RDM policy is same as default global RDM policy as being
'relaxed'. And the per-device policy would override the global policy like
others.

CC: Ian Jackson <ian.jackson@eu.citrix.com>
CC: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
CC: Ian Campbell <ian.campbell@citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Tiejun Chen authored and Ian Jackson committed 2015-07-23 13:45:26 +01:00
1 parent 6457dae996
commit a619657e2d
3 files changed
+108 -1

No files matched your search

+91 -1
View File
@@ -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_STRATEGY 10
#define STATE_RESERVE_POLICY 11
int xlu_pci_parse_bdf(XLU_Config *cfg, libxl_device_pci *pcidev, const char *str)
{
unsigned state = STATE_DOMAIN;
@@ -143,7 +146,18 @@ 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{
} else if (!strcmp(optkey, "rdm_policy")) {
if (!strcmp(tok, "strict")) {
pcidev->rdm_policy = LIBXL_RDM_RESERVE_POLICY_STRICT;
} else if (!strcmp(tok, "relaxed")) {
pcidev->rdm_policy = LIBXL_RDM_RESERVE_POLICY_RELAXED;
} else {
XLU__PCI_ERR(cfg, "%s is not an valid PCI RDM property"
" policy: 'strict' or 'relaxed'.",
tok);
goto parse_error;
}
} else {
XLU__PCI_ERR(cfg, "Unknown PCI BDF option: %s", optkey);
}
tok = ptr + 1;
@@ -167,6 +181,82 @@ 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_STRATEGY;
*ptr = '\0';
if (strcmp(tok, "strategy")) {
XLU__PCI_ERR(cfg, "Unknown RDM state option: %s", tok);
goto parse_error;
}
tok = ptr + 1;
}
break;
case STATE_RDM_STRATEGY:
if (*ptr == '\0' || *ptr == ',') {
state = STATE_RESERVE_POLICY;
*ptr = '\0';
if (!strcmp(tok, "host")) {
rdm->strategy = LIBXL_RDM_RESERVE_STRATEGY_HOST;
} else {
XLU__PCI_ERR(cfg, "Unknown RDM strategy option: %s", tok);
goto parse_error;
}
tok = ptr + 1;
}
break;
case STATE_RESERVE_POLICY:
if (*ptr == '=') {
state = STATE_OPTIONS_V;
*ptr = '\0';
if (strcmp(tok, "policy")) {
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->policy = LIBXL_RDM_RESERVE_POLICY_STRICT;
} else if (!strcmp(tok, "relaxed")) {
rdm->policy = LIBXL_RDM_RESERVE_POLICY_RELAXED;
} else {
XLU__PCI_ERR(cfg, "Unknown RDM property policy 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
+4
View File
@@ -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.
+13
View File
@@ -1982,6 +1982,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->u.hvm.rdm.strategy = rdm.strategy;
b_info->u.hvm.rdm.policy = rdm.policy;
}
}
if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) {
d_config->num_pcidevs = 0;
d_config->pcidevs = NULL;
@@ -1995,6 +2003,11 @@ skip_vfb:
pcidev->power_mgmt = pci_power_mgmt;
pcidev->permissive = pci_permissive;
pcidev->seize = pci_seize;
/*
* Like other pci option, the per-device policy always follows
* the global policy by default.
*/
pcidev->rdm_policy = b_info->u.hvm.rdm.policy;
e = xlu_pci_parse_bdf(config, pcidev, buf);
if (e) {
fprintf(stderr,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.