|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC,FUTURE 2/3] tools: libxc: add virtual_sbdf parameter to xc_assign_device
Now, when "assign_device" domctl supports virtual_sbdf option, make it
available to libxc users. This is an optional parameter, if it is not
provided, xc_assign_device() will ask hypervisor to allocate a free
vSBDF.
Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>
--
This clearly breaks libxc API. So I wanted to discuss a proper way of
doing this. Should I introduce a new xc_assign_device() function with
an extra parameter?
---
tools/include/xenctrl.h | 1 +
tools/libs/ctrl/xc_domain.c | 14 ++++++++++++--
tools/libs/light/libxl_pci.c | 4 ++--
tools/ocaml/libs/xc/xenctrl_stubs.c | 2 +-
tools/python/xen/lowlevel/xc/xc.c | 2 +-
5 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index 2ef8b4e054..ccc0745c35 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -1689,6 +1689,7 @@ int xc_get_hvm_param(xc_interface *handle, uint32_t dom,
int param, unsigned lon
int xc_assign_device(xc_interface *xch,
uint32_t domid,
uint32_t machine_sbdf,
+ uint32_t *virtual_sbdf,
uint32_t flag);
int xc_get_device_group(xc_interface *xch,
diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
index 2405e39517..ca60b13a89 100644
--- a/tools/libs/ctrl/xc_domain.c
+++ b/tools/libs/ctrl/xc_domain.c
@@ -1497,18 +1497,28 @@ int xc_assign_device(
xc_interface *xch,
uint32_t domid,
uint32_t machine_sbdf,
+ uint32_t *virtual_sbdf,
uint32_t flags)
{
+ int rc;
struct xen_domctl domctl = {};
domctl.cmd = XEN_DOMCTL_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.u.pci.virtual_sbdf = XEN_DOMCTL_DEV_SDBF_ANY;
+ if (!virtual_sbdf)
+ domctl.u.assign_device.u.pci.virtual_sbdf = XEN_DOMCTL_DEV_SDBF_ANY;
+ else
+ domctl.u.assign_device.u.pci.virtual_sbdf = *virtual_sbdf;
domctl.u.assign_device.flags = flags;
- return do_domctl(xch, &domctl);
+ rc = do_domctl(xch, &domctl);
+
+ if (!rc && virtual_sbdf)
+ *virtual_sbdf = domctl.u.assign_device.u.pci.virtual_sbdf;
+
+ return rc;
}
int xc_get_device_group(
diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c
index 96cb4da079..723e577ef5 100644
--- a/tools/libs/light/libxl_pci.c
+++ b/tools/libs/light/libxl_pci.c
@@ -842,7 +842,7 @@ name:
* so always pass XEN_DOMCTL_DEV_RDM_RELAXED to avoid assignment being
* unnecessarily denied.
*/
- rc = xc_assign_device(ctx->xch, DOMID_IO, pci_encode_bdf(pci),
+ rc = xc_assign_device(ctx->xch, DOMID_IO, pci_encode_bdf(pci), NULL,
XEN_DOMCTL_DEV_RDM_RELAXED);
if ( rc < 0 ) {
LOG(ERROR, "failed to quarantine "PCI_BDF, dom, bus, dev, func);
@@ -1524,7 +1524,7 @@ out_no_irq:
rc = ERROR_FAIL;
goto out;
}
- r = xc_assign_device(ctx->xch, domid, pci_encode_bdf(pci), flag);
+ r = xc_assign_device(ctx->xch, domid, pci_encode_bdf(pci), NULL, flag);
if (r < 0 && (hvm || errno != ENOSYS)) {
LOGED(ERROR, domainid, "xc_assign_device failed");
rc = ERROR_FAIL;
diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c
b/tools/ocaml/libs/xc/xenctrl_stubs.c
index 3703f48c74..55d257abbb 100644
--- a/tools/ocaml/libs/xc/xenctrl_stubs.c
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
@@ -1323,7 +1323,7 @@ CAMLprim value stub_xc_domain_assign_device(value
xch_val, value domid, value de
func = Int_val(Field(desc, 3));
sbdf = encode_sbdf(domain, bus, dev, func);
- ret = xc_assign_device(xch, Int_val(domid), sbdf,
+ ret = xc_assign_device(xch, Int_val(domid), sbdf, NULL,
XEN_DOMCTL_DEV_RDM_RELAXED);
if (ret < 0)
diff --git a/tools/python/xen/lowlevel/xc/xc.c
b/tools/python/xen/lowlevel/xc/xc.c
index d3ea350e07..1e210c78b7 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -587,7 +587,7 @@ static PyObject *pyxc_assign_device(XcObject *self,
sbdf |= (dev & 0x1f) << 3;
sbdf |= (func & 0x7);
- if ( xc_assign_device(self->xc_handle, dom, sbdf, 0) != 0 )
+ if ( xc_assign_device(self->xc_handle, dom, sbdf, NULL, 0) != 0 )
{
if (errno == ENOSYS)
sbdf = -1;
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |