[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] xen: add privcmd ioctl to get p2pdma_distance
To implement dGPU prime feature, virtgpu driver need to get p2pdma_distance of two GPU from host side. This adds a new privcmd ioctl to get the real p2pdma_distance of two pci devices in the host with pci notations sent from guest side. Signed-off-by: Julia Zhang <julia.zhang@xxxxxxx> --- tools/include/xen-sys/Linux/privcmd.h | 12 ++++++++++++ tools/include/xenctrl.h | 17 +++++++++++++++++ tools/libs/ctrl/xc_freebsd.c | 11 +++++++++++ tools/libs/ctrl/xc_linux.c | 24 ++++++++++++++++++++++++ tools/libs/ctrl/xc_minios.c | 11 +++++++++++ tools/libs/ctrl/xc_netbsd.c | 11 +++++++++++ tools/libs/ctrl/xc_physdev.c | 12 ++++++++++++ tools/libs/ctrl/xc_solaris.c | 11 +++++++++++ 8 files changed, 109 insertions(+) diff --git a/tools/include/xen-sys/Linux/privcmd.h b/tools/include/xen-sys/Linux/privcmd.h index 5071ebcc8b..fbdc9aa927 100644 --- a/tools/include/xen-sys/Linux/privcmd.h +++ b/tools/include/xen-sys/Linux/privcmd.h @@ -110,6 +110,16 @@ typedef struct privcmd_map_hva_to_gpfns { int add_mapping; } privcmd_map_hva_to_gpfns_t; +typedef struct privcmd_p2pdma_distance { + __u32 provider_bus; + __u32 provider_slot; + __u32 provider_func; + __u32 client_bus; + __u32 client_slot; + __u32 client_func; + __u32 distance; +} privcmd_p2pdma_distance_t; + /* * @cmd: IOCTL_PRIVCMD_HYPERCALL * @arg: &privcmd_hypercall_t @@ -131,6 +141,8 @@ typedef struct privcmd_map_hva_to_gpfns { _IOC(_IOC_NONE, 'P', 7, sizeof(privcmd_mmap_resource_t)) #define IOCTL_PRIVCMD_PCIDEV_GET_GSI \ _IOC(_IOC_NONE, 'P', 10, sizeof(privcmd_pcidev_get_gsi_t)) +#define IOCTL_PRIVCMD_P2PDMA_DISTANCE \ + _IOC(_IOC_NONE, 'P', 11, sizeof(privcmd_p2pdma_distance_t)) #define IOCTL_PRIVCMD_MAP_HVA_TO_GPFNS \ _IOC(_IOC_NONE, 'P', 13, sizeof(privcmd_map_hva_to_gpfns_t)) #define IOCTL_PRIVCMD_UNIMPLEMENTED \ diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h index 29617585c5..42d15a22b8 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -1654,6 +1654,23 @@ int xc_physdev_unmap_pirq(xc_interface *xch, int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf); +int xc_physdev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func); + +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func); + + /* * LOGGING AND ERROR REPORTING */ diff --git a/tools/libs/ctrl/xc_freebsd.c b/tools/libs/ctrl/xc_freebsd.c index 9019fc6633..4e0df06b7c 100644 --- a/tools/libs/ctrl/xc_freebsd.c +++ b/tools/libs/ctrl/xc_freebsd.c @@ -60,6 +60,17 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return ptr; } +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + return -1; +} + int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { errno = ENOSYS; diff --git a/tools/libs/ctrl/xc_linux.c b/tools/libs/ctrl/xc_linux.c index 92591e49a1..9aeff2328f 100644 --- a/tools/libs/ctrl/xc_linux.c +++ b/tools/libs/ctrl/xc_linux.c @@ -66,6 +66,30 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return ptr; } +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + privcmd_p2pdma_distance_t p2pdma_distance = { + .provider_bus = bus, + .provider_slot = slot, + .provider_func = func, + .client_bus = c_bus, + .client_slot = c_slot, + .client_func = c_func, + .distance = -1, + }; + if (!ioctl(xencall_fd(xch->xcall), IOCTL_PRIVCMD_P2PDMA_DISTANCE, &p2pdma_distance)) { + return p2pdma_distance.distance; + } + + return -1; +} + int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { int ret; diff --git a/tools/libs/ctrl/xc_minios.c b/tools/libs/ctrl/xc_minios.c index 462af827b3..4698cca5ea 100644 --- a/tools/libs/ctrl/xc_minios.c +++ b/tools/libs/ctrl/xc_minios.c @@ -47,6 +47,17 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return memalign(alignment, size); } +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + return -1; +} + int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { errno = ENOSYS; diff --git a/tools/libs/ctrl/xc_netbsd.c b/tools/libs/ctrl/xc_netbsd.c index 1318d4d906..7e0ee8417e 100644 --- a/tools/libs/ctrl/xc_netbsd.c +++ b/tools/libs/ctrl/xc_netbsd.c @@ -63,6 +63,17 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return valloc(size); } +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + return -1; +} + int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { errno = ENOSYS; diff --git a/tools/libs/ctrl/xc_physdev.c b/tools/libs/ctrl/xc_physdev.c index 25e686d7b3..4ee8f39e09 100644 --- a/tools/libs/ctrl/xc_physdev.c +++ b/tools/libs/ctrl/xc_physdev.c @@ -138,3 +138,15 @@ int xc_physdev_unmap_pirq(xc_interface *xch, return rc; } +int xc_physdev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + return xc_pcidev_p2pdma_distance(xch, bus, slot, func, + c_bus, c_slot, c_func); +} + diff --git a/tools/libs/ctrl/xc_solaris.c b/tools/libs/ctrl/xc_solaris.c index 049e28d55c..a054b40b31 100644 --- a/tools/libs/ctrl/xc_solaris.c +++ b/tools/libs/ctrl/xc_solaris.c @@ -32,6 +32,17 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return memalign(alignment, size); } +int xc_pcidev_p2pdma_distance(xc_interface *xch, + uint32_t bus, + uint32_t slot, + uint32_t func, + uint32_t c_bus, + uint32_t c_slot, + uint32_t c_func) +{ + return -1; +} + int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) { errno = ENOSYS; -- 2.34.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |