[RFC PATCH v2 0/3] xl: Allow PCI devices to be passthrough'd via Qemu command line

Thierry Escande posted 3 patches 3 days, 4 hours ago
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20260409162000.1102680-1-thierry.escande@vates.tech
There is a newer version of this series
docs/man/xl-pci-configuration.5.pod | 17 ++++++
docs/man/xl.cfg.5.pod.in            |  6 +++
tools/include/libxl.h               |  1 +
tools/libs/light/libxl_dm.c         | 80 +++++++++++++++++++++++++++++
tools/libs/light/libxl_internal.h   |  2 +
tools/libs/light/libxl_pci.c        | 41 +++++++++++----
tools/libs/light/libxl_types.idl    |  1 +
tools/libs/util/libxlu_pci.c        |  2 +
tools/xl/xl_parse.c                 |  5 ++
9 files changed, 145 insertions(+), 10 deletions(-)
[RFC PATCH v2 0/3] xl: Allow PCI devices to be passthrough'd via Qemu command line
Posted by Thierry Escande 3 days, 4 hours ago
This series adds support for a new 'hotplug' option for PCI devices to be
passthrough'd to guests.

The current mechanism for device passthrough uses QMP device_add command
to hot-plug PCI devices to the guest Qemu instance. This is an issue for
guests running on Q35 chipset (preliminary support posted at [1]) since the
Q35 PCI root bus does not support hotplug. Devices could be hotplugged to
a secondary PCI bus but Xen only support 1 PCI bus for now.

The 'hotplug' option allows to control how devices are attached to the
guest, either by using the legacy QMP mechanism (this is the default) or by
passing it directly to the Qemu command line using xen-pci-passthrough
device.

Example usage in cfg file:
 pci = [ "00:03.0,seize=1,hotplug=0" ]

Since Qemu -device option accepts parameters in json format, this
patchset adds a new internal function libxl__device_pci_get_qmp_json() that
generates the device json object used for both QMP hotplug and command line
passing.
Also, the function libxl_pci_assignable() is made available from libxl.h
for access in libxl_dm.c. I don't know if it's ok to make it public or if
it should stay private. Maybe it should be renamed as
libxl_device_pci_assignable() to match the other PCI device APIs.

This has been successfully tested on Xen 4.22-dev and Qemu 10.0 running
Debian VMs in both Bios and UEFI mode with a passthrough'd nvme disk.
Disabling the hotplug mechanism might be made mandatory for Q35 machines
later, once Q35 support is merged upstream.

[1] https://lore.kernel.org/xen-devel/20260313163455.790692-1-thierry.escande@vates.tech/

Changes in v2:
- Add support for YAJL json parser

Thierry Escande (3):
  xl: Add pci device hotplug option
  libxl: Allow PCI device passthrough using -device Qemu command line
  docs: provide description for pci hotplug option

 docs/man/xl-pci-configuration.5.pod | 17 ++++++
 docs/man/xl.cfg.5.pod.in            |  6 +++
 tools/include/libxl.h               |  1 +
 tools/libs/light/libxl_dm.c         | 80 +++++++++++++++++++++++++++++
 tools/libs/light/libxl_internal.h   |  2 +
 tools/libs/light/libxl_pci.c        | 41 +++++++++++----
 tools/libs/light/libxl_types.idl    |  1 +
 tools/libs/util/libxlu_pci.c        |  2 +
 tools/xl/xl_parse.c                 |  5 ++
 9 files changed, 145 insertions(+), 10 deletions(-)

-- 
2.53.0



--
Thierry Escande | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech
Re: [RFC PATCH v2 0/3] xl: Allow PCI devices to be passthrough'd via Qemu command line
Posted by Marek Marczykowski-Górecki 2 days, 20 hours ago
On Thu, Apr 09, 2026 at 04:20:57PM +0000, Thierry Escande wrote:
> This series adds support for a new 'hotplug' option for PCI devices to be
> passthrough'd to guests.
> 
> The current mechanism for device passthrough uses QMP device_add command
> to hot-plug PCI devices to the guest Qemu instance. This is an issue for
> guests running on Q35 chipset (preliminary support posted at [1]) since the
> Q35 PCI root bus does not support hotplug. Devices could be hotplugged to
> a secondary PCI bus but Xen only support 1 PCI bus for now.
> 
> The 'hotplug' option allows to control how devices are attached to the
> guest, either by using the legacy QMP mechanism (this is the default) or by
> passing it directly to the Qemu command line using xen-pci-passthrough
> device.
> 
> Example usage in cfg file:
>  pci = [ "00:03.0,seize=1,hotplug=0" ]
> 
> Since Qemu -device option accepts parameters in json format, this
> patchset adds a new internal function libxl__device_pci_get_qmp_json() that
> generates the device json object used for both QMP hotplug and command line
> passing.
> Also, the function libxl_pci_assignable() is made available from libxl.h
> for access in libxl_dm.c. I don't know if it's ok to make it public or if
> it should stay private. Maybe it should be renamed as
> libxl_device_pci_assignable() to match the other PCI device APIs.
> 
> This has been successfully tested on Xen 4.22-dev and Qemu 10.0 running
> Debian VMs in both Bios and UEFI mode with a passthrough'd nvme disk.
> Disabling the hotplug mechanism might be made mandatory for Q35 machines
> later, once Q35 support is merged upstream.
> 
> [1] https://lore.kernel.org/xen-devel/20260313163455.790692-1-thierry.escande@vates.tech/

I don't see relevant device option added to the QEMU cmdline:
https://gitlab.com/xen-project/people/marmarek/xen/-/jobs/13860278916

-- 
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
Re: [RFC PATCH v2 0/3] xl: Allow PCI devices to be passthrough'd via Qemu command line
Posted by Thierry Escande 2 days, 12 hours ago

On 4/10/26 02:55, Marek Marczykowski-Górecki wrote:
> On Thu, Apr 09, 2026 at 04:20:57PM +0000, Thierry Escande wrote:
>> This series adds support for a new 'hotplug' option for PCI devices to be
>> passthrough'd to guests.
>>
>> The current mechanism for device passthrough uses QMP device_add command
>> to hot-plug PCI devices to the guest Qemu instance. This is an issue for
>> guests running on Q35 chipset (preliminary support posted at [1]) since the
>> Q35 PCI root bus does not support hotplug. Devices could be hotplugged to
>> a secondary PCI bus but Xen only support 1 PCI bus for now.
>>
>> The 'hotplug' option allows to control how devices are attached to the
>> guest, either by using the legacy QMP mechanism (this is the default) or by
>> passing it directly to the Qemu command line using xen-pci-passthrough
>> device.
>>
>> Example usage in cfg file:
>>  pci = [ "00:03.0,seize=1,hotplug=0" ]
>>
>> Since Qemu -device option accepts parameters in json format, this
>> patchset adds a new internal function libxl__device_pci_get_qmp_json() that
>> generates the device json object used for both QMP hotplug and command line
>> passing.
>> Also, the function libxl_pci_assignable() is made available from libxl.h
>> for access in libxl_dm.c. I don't know if it's ok to make it public or if
>> it should stay private. Maybe it should be renamed as
>> libxl_device_pci_assignable() to match the other PCI device APIs.
>>
>> This has been successfully tested on Xen 4.22-dev and Qemu 10.0 running
>> Debian VMs in both Bios and UEFI mode with a passthrough'd nvme disk.
>> Disabling the hotplug mechanism might be made mandatory for Q35 machines
>> later, once Q35 support is merged upstream.
>>
>> [1] https://lore.kernel.org/xen-devel/20260313163455.790692-1-thierry.escande@vates.tech/
> 
> I don't see relevant device option added to the QEMU cmdline:
> https://gitlab.com/xen-project/people/marmarek/xen/-/jobs/13860278916
> 
My bad. The code that adds the -device option is not in the correct code
block. (bad copy/paste at some point I guess...). v3 on its way.

Regards,
Thierry


--
Thierry Escande | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech