Message ID | 20240911065832.1591273-4-Jiqian.Chen@amd.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Support device passthrough when dom0 is PVH on Xen | expand |
On 11.09.2024 08:58, Jiqian Chen wrote: > On PVH dom0, when passthrough a device to domU, QEMU and xl tools > want to use gsi number to do pirq mapping, see QEMU code > xen_pt_realize->xc_physdev_map_pirq, and xl code > pci_add_dm_done->xc_physdev_map_pirq, but in current codes, the gsi > number is got from file /sys/bus/pci/devices/<sbdf>/irq, that is > wrong, because irq is not equal with gsi, they are in different > spaces, so pirq mapping fails. > > And in current codes, there is no method to get gsi for userspace. > For above purpose, add new function to get gsi, and the > corresponding ioctl is implemented on linux kernel side. > > Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com> > Signed-off-by: Huang Rui <ray.huang@amd.com> > Signed-off-by: Chen Jiqian <Jiqian.Chen@amd.com> > Reviewed-by: Anthony PERARD <anthony.perard@vates.tech> > --- > RFC: it needs to wait for the corresponding third patch on linux kernel side to be merged. > https://lore.kernel.org/xen-devel/20240607075109.126277-4-Jiqian.Chen@amd.com/ I'm afraid I don't understand this remark: The change here (and similarly patch 4) ought to be independent of when the kernel change goes in. After all the libraries need to work on older Linux as well. Please clarify. Jan
On 11.09.2024 12:49, Jan Beulich wrote: > On 11.09.2024 08:58, Jiqian Chen wrote: >> On PVH dom0, when passthrough a device to domU, QEMU and xl tools >> want to use gsi number to do pirq mapping, see QEMU code >> xen_pt_realize->xc_physdev_map_pirq, and xl code >> pci_add_dm_done->xc_physdev_map_pirq, but in current codes, the gsi >> number is got from file /sys/bus/pci/devices/<sbdf>/irq, that is >> wrong, because irq is not equal with gsi, they are in different >> spaces, so pirq mapping fails. >> >> And in current codes, there is no method to get gsi for userspace. >> For above purpose, add new function to get gsi, and the >> corresponding ioctl is implemented on linux kernel side. >> >> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com> >> Signed-off-by: Huang Rui <ray.huang@amd.com> >> Signed-off-by: Chen Jiqian <Jiqian.Chen@amd.com> >> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech> >> --- >> RFC: it needs to wait for the corresponding third patch on linux kernel side to be merged. >> https://lore.kernel.org/xen-devel/20240607075109.126277-4-Jiqian.Chen@amd.com/ > > I'm afraid I don't understand this remark: The change here (and similarly > patch 4) ought to be independent of when the kernel change goes in. After > all the libraries need to work on older Linux as well. Please clarify. Hmm, maybe for this patch the dependency is for the new IOCTL as an interface to be accepted. That's fine a dependency of course. Yet then why the same remark in patch 4? Jan
On 2024/9/11 18:51, Jan Beulich wrote: > On 11.09.2024 12:49, Jan Beulich wrote: >> On 11.09.2024 08:58, Jiqian Chen wrote: >>> On PVH dom0, when passthrough a device to domU, QEMU and xl tools >>> want to use gsi number to do pirq mapping, see QEMU code >>> xen_pt_realize->xc_physdev_map_pirq, and xl code >>> pci_add_dm_done->xc_physdev_map_pirq, but in current codes, the gsi >>> number is got from file /sys/bus/pci/devices/<sbdf>/irq, that is >>> wrong, because irq is not equal with gsi, they are in different >>> spaces, so pirq mapping fails. >>> >>> And in current codes, there is no method to get gsi for userspace. >>> For above purpose, add new function to get gsi, and the >>> corresponding ioctl is implemented on linux kernel side. >>> >>> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com> >>> Signed-off-by: Huang Rui <ray.huang@amd.com> >>> Signed-off-by: Chen Jiqian <Jiqian.Chen@amd.com> >>> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech> >>> --- >>> RFC: it needs to wait for the corresponding third patch on linux kernel side to be merged. >>> https://lore.kernel.org/xen-devel/20240607075109.126277-4-Jiqian.Chen@amd.com/ >> >> I'm afraid I don't understand this remark: The change here (and similarly >> patch 4) ought to be independent of when the kernel change goes in. After >> all the libraries need to work on older Linux as well. Please clarify. > > Hmm, maybe for this patch the dependency is for the new IOCTL as an > interface to be accepted. That's fine a dependency of course. Yet then > why the same remark in patch 4? Yes, patch#3 depends on the new IOCTL on the kernel side. Patch#4 uses the new function of patch#3 and new hypercall of patch#2, it depends on patch#2/3, so patch#4 also depends on the patches on the kernel side. And the kernel patches are too old, I will send a new version this week. > > Jan
diff --git a/tools/include/xen-sys/Linux/privcmd.h b/tools/include/xen-sys/Linux/privcmd.h index bc60e8fd55eb..607dfa2287bc 100644 --- a/tools/include/xen-sys/Linux/privcmd.h +++ b/tools/include/xen-sys/Linux/privcmd.h @@ -95,6 +95,11 @@ typedef struct privcmd_mmap_resource { __u64 addr; } privcmd_mmap_resource_t; +typedef struct privcmd_pcidev_get_gsi { + __u32 sbdf; + __u32 gsi; +} privcmd_pcidev_get_gsi_t; + /* * @cmd: IOCTL_PRIVCMD_HYPERCALL * @arg: &privcmd_hypercall_t @@ -114,6 +119,8 @@ typedef struct privcmd_mmap_resource { _IOC(_IOC_NONE, 'P', 6, sizeof(domid_t)) #define IOCTL_PRIVCMD_MMAP_RESOURCE \ _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_UNIMPLEMENTED \ _IOC(_IOC_NONE, 'P', 0xFF, 0) diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h index 2c4608c09ab0..924f9a35f790 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -1642,6 +1642,8 @@ int xc_physdev_unmap_pirq(xc_interface *xch, uint32_t domid, int pirq); +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf); + /* * LOGGING AND ERROR REPORTING */ diff --git a/tools/libs/ctrl/xc_freebsd.c b/tools/libs/ctrl/xc_freebsd.c index 9dd48a3a08bb..9019fc663361 100644 --- a/tools/libs/ctrl/xc_freebsd.c +++ b/tools/libs/ctrl/xc_freebsd.c @@ -60,6 +60,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return ptr; } +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) +{ + errno = ENOSYS; + return -1; +} + /* * Local variables: * mode: C diff --git a/tools/libs/ctrl/xc_linux.c b/tools/libs/ctrl/xc_linux.c index c67c71c08be3..92591e49a1c8 100644 --- a/tools/libs/ctrl/xc_linux.c +++ b/tools/libs/ctrl/xc_linux.c @@ -66,6 +66,26 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return ptr; } +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) +{ + int ret; + privcmd_pcidev_get_gsi_t dev_gsi = { + .sbdf = sbdf, + .gsi = 0, + }; + + ret = ioctl(xencall_fd(xch->xcall), + IOCTL_PRIVCMD_PCIDEV_GET_GSI, &dev_gsi); + + if (ret < 0) { + PERROR("Failed to get gsi from dev"); + } else { + ret = dev_gsi.gsi; + } + + return ret; +} + /* * Local variables: * mode: C diff --git a/tools/libs/ctrl/xc_minios.c b/tools/libs/ctrl/xc_minios.c index 3dea7a78a576..462af827b33c 100644 --- a/tools/libs/ctrl/xc_minios.c +++ b/tools/libs/ctrl/xc_minios.c @@ -47,6 +47,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return memalign(alignment, size); } +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) +{ + errno = ENOSYS; + return -1; +} + /* * Local variables: * mode: C diff --git a/tools/libs/ctrl/xc_netbsd.c b/tools/libs/ctrl/xc_netbsd.c index 31979937621e..1318d4d90608 100644 --- a/tools/libs/ctrl/xc_netbsd.c +++ b/tools/libs/ctrl/xc_netbsd.c @@ -63,6 +63,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return valloc(size); } +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) +{ + errno = ENOSYS; + return -1; +} + /* * Local variables: * mode: C diff --git a/tools/libs/ctrl/xc_solaris.c b/tools/libs/ctrl/xc_solaris.c index 5128f3f0f490..049e28d55ccd 100644 --- a/tools/libs/ctrl/xc_solaris.c +++ b/tools/libs/ctrl/xc_solaris.c @@ -32,6 +32,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size) return memalign(alignment, size); } +int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf) +{ + errno = ENOSYS; + return -1; +} + /* * Local variables: * mode: C