mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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. Note this also bring some fallout to python usage of xc_assign_device(). 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> CC: David Scott <dave.scott@eu.citrix.com> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
504ed20533
commit
9b34056cb4
5 files changed
+44
-17
No files matched your search
@@ -2067,7 +2067,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,
|
||||
|
||||
@@ -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,11 @@ 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 so actually DT has nothing to do
|
||||
* for any flag and here just fix that as 0.
|
||||
*/
|
||||
domctl.u.assign_device.flag = 0;
|
||||
set_xen_guest_handle(domctl.u.assign_device.u.dt.path, path);
|
||||
|
||||
rc = do_domctl(xch, &domctl);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1172,12 +1172,17 @@ 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_RDM_RELAXED,
|
||||
};
|
||||
|
||||
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 +1190,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));
|
||||
|
||||
@@ -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,17 @@ 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
|
||||
{
|
||||
/* O means we take "strict" as our default policy. */
|
||||
*flag = 0;
|
||||
*str = NULL;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -620,14 +630,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 +663,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 +696,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;
|
||||
|
||||