I have an NVMe device that I use to passthrough to a virtual machine on Linux. It has some internal issue, a workaround that worked for me so far was described here:
<hostdev mode="subsystem" type="pci" managed="yes">
<source>
<address domain="0x0000" bus="0x6f" slot="0x00" function="0x0"/>
</source>
<boot order="1"/>
<alias name="ua-sm2262"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0"/>
</hostdev>
<qemu:commandline>
<qemu:arg value="-set"/>
<qemu:arg value="device.ua-sm2262.x-msix-relocation=bar2"/>
</qemu:commandline>
Since some release of qemu it seems to no longer work and give an error message like this:
Error starting domain: internal error: process exited while connecting to monitor: qemu-system-x86_64: -set device.ua-sm2262.x-msix-relocation=bar2: there is no device "ua-sm2262" defined
Turns out the syntax has changed, and the solution is posted here. Now I have it working with this:
<qemu:override>
<qemu:device alias="ua-sm2262">
<qemu:frontend>
<qemu:property name="x-msix-relocation" type="string" value="bar2"/>
</qemu:frontend>
</qemu:device>
</qemu:override>