* [PATCH 0/2] vfio: Implement device features for vfio-user
@ 2026-03-17 19:53 John Levon
2026-03-17 19:53 ` [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE John Levon
2026-03-17 19:53 ` [PATCH 2/2] vfio: quieten dma-buf warning John Levon
0 siblings, 2 replies; 10+ messages in thread
From: John Levon @ 2026-03-17 19:53 UTC (permalink / raw)
To: qemu-devel
Cc: Alex Williamson, Thanos Makatos, Cédric Le Goater,
John Levon
John Levon (2):
vfio-user: support VFIO_USER_DEVICE_FEATURE
vfio: quieten dma-buf warning
hw/vfio-user/protocol.h | 12 ++++++++++++
hw/vfio-user/device.c | 39 +++++++++++++++++++++++++++++++++++++++
hw/vfio/region.c | 2 --
3 files changed, 51 insertions(+), 2 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE
2026-03-17 19:53 [PATCH 0/2] vfio: Implement device features for vfio-user John Levon
@ 2026-03-17 19:53 ` John Levon
2026-04-08 7:42 ` Cédric Le Goater
2026-03-17 19:53 ` [PATCH 2/2] vfio: quieten dma-buf warning John Levon
1 sibling, 1 reply; 10+ messages in thread
From: John Levon @ 2026-03-17 19:53 UTC (permalink / raw)
To: qemu-devel
Cc: Alex Williamson, Thanos Makatos, Cédric Le Goater,
John Levon
Plumb through vfio_device_get_feature to the vfio-user server. Note that
we translate EINVAL into ENOTTY, as the existing generic vfio code is
expecting the latter to mean "unsupported".
Signed-off-by: John Levon <john.levon@nutanix.com>
---
hw/vfio-user/protocol.h | 12 ++++++++++++
hw/vfio-user/device.c | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/hw/vfio-user/protocol.h b/hw/vfio-user/protocol.h
index 3249a4a6b6..2a0c31e7c5 100644
--- a/hw/vfio-user/protocol.h
+++ b/hw/vfio-user/protocol.h
@@ -40,6 +40,7 @@ enum vfio_user_command {
VFIO_USER_DEVICE_RESET = 13,
VFIO_USER_DIRTY_PAGES = 14,
VFIO_USER_REGION_WRITE_MULTI = 15,
+ VFIO_USER_DEVICE_FEATURE = 16,
VFIO_USER_MAX,
};
@@ -239,4 +240,15 @@ typedef struct {
VFIOUserWROne wrs[VFIO_USER_MULTI_MAX];
} VFIOUserWRMulti;
+/*
+ * VFIO_USER_DEVICE_FEATURE
+ * imported from struct vfio_device_feature
+ */
+typedef struct {
+ VFIOUserHdr hdr;
+ uint32_t argsz;
+ uint32_t flags;
+ char data[];
+} VFIOUserDeviceFeature;
+
#endif /* VFIO_USER_PROTOCOL_H */
diff --git a/hw/vfio-user/device.c b/hw/vfio-user/device.c
index 64ef35b320..6910d183d7 100644
--- a/hw/vfio-user/device.c
+++ b/hw/vfio-user/device.c
@@ -74,6 +74,44 @@ void vfio_user_device_reset(VFIOUserProxy *proxy)
}
}
+static int
+vfio_user_device_io_device_feature(VFIODevice *vbasedev,
+ struct vfio_device_feature *feature)
+{
+ g_autofree VFIOUserDeviceFeature *msgp = NULL;
+ int size = sizeof(VFIOUserHdr) + feature->argsz;
+ VFIOUserProxy *proxy = vbasedev->proxy;
+ Error *local_err = NULL;
+
+ msgp = g_malloc0(size);
+
+ vfio_user_request_msg(&msgp->hdr, VFIO_USER_DEVICE_FEATURE, size, 0);
+
+ memcpy(&msgp->argsz, &feature->argsz, feature->argsz);
+
+ if (!vfio_user_send_wait(proxy, &msgp->hdr, NULL, size, &local_err)) {
+ error_prepend(&local_err, "%s: ", __func__);
+ error_report_err(local_err);
+ return -EFAULT;
+ }
+
+ if (msgp->hdr.flags & VFIO_USER_ERROR) {
+ /*
+ * Client expects ENOTTY for "not supported", but the protocol may
+ * return EINVAL.
+ */
+ if (msgp->hdr.error_reply == EINVAL) {
+ return -ENOTTY;
+ }
+
+ return -msgp->hdr.error_reply;
+ }
+
+ memcpy(feature, &msgp->argsz, feature->argsz);
+
+ return 0;
+}
+
static int vfio_user_get_region_info(VFIOUserProxy *proxy,
struct vfio_region_info *info,
VFIOUserFDs *fds)
@@ -432,6 +470,7 @@ static int vfio_user_device_io_region_write(VFIODevice *vbasedev, uint8_t index,
* Socket-based io_ops
*/
VFIODeviceIOOps vfio_user_device_io_ops_sock = {
+ .device_feature = vfio_user_device_io_device_feature,
.get_region_info = vfio_user_device_io_get_region_info,
.get_irq_info = vfio_user_device_io_get_irq_info,
.set_irqs = vfio_user_device_io_set_irqs,
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] vfio: quieten dma-buf warning
2026-03-17 19:53 [PATCH 0/2] vfio: Implement device features for vfio-user John Levon
2026-03-17 19:53 ` [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE John Levon
@ 2026-03-17 19:53 ` John Levon
2026-04-08 7:52 ` Cédric Le Goater
1 sibling, 1 reply; 10+ messages in thread
From: John Levon @ 2026-03-17 19:53 UTC (permalink / raw)
To: qemu-devel
Cc: Alex Williamson, Thanos Makatos, Cédric Le Goater,
John Levon
Don't report this error every time, as it is specific to the kernel vfio
implementation; we shouldn't warn about things that always happen, such
as when this is backed by vfio-user.
Signed-off-by: John Levon <john.levon@nutanix.com>
---
hw/vfio/region.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/hw/vfio/region.c b/hw/vfio/region.c
index 47fdc2df34..1d442f3f48 100644
--- a/hw/vfio/region.c
+++ b/hw/vfio/region.c
@@ -316,8 +316,6 @@ static bool vfio_region_create_dma_buf(VFIORegion *region, Error **errp)
ret = vfio_device_get_feature(vbasedev, feature);
if (ret < 0) {
if (ret == -ENOTTY) {
- warn_report_once("VFIO dma-buf not supported in kernel: "
- "PCI BAR IOMMU mappings may fail");
return true;
}
/* P2P DMA or exposing device memory use cases are not supported. */
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE
2026-03-17 19:53 ` [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE John Levon
@ 2026-04-08 7:42 ` Cédric Le Goater
2026-04-08 9:00 ` John Levon
0 siblings, 1 reply; 10+ messages in thread
From: Cédric Le Goater @ 2026-04-08 7:42 UTC (permalink / raw)
To: John Levon, qemu-devel; +Cc: Alex Williamson, Thanos Makatos
On 3/17/26 20:53, John Levon wrote:
> Plumb through vfio_device_get_feature to the vfio-user server. Note that
> we translate EINVAL into ENOTTY, as the existing generic vfio code is
> expecting the latter to mean "unsupported".
>
> Signed-off-by: John Levon <john.levon@nutanix.com>
> ---
> hw/vfio-user/protocol.h | 12 ++++++++++++
> hw/vfio-user/device.c | 39 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 51 insertions(+)
>
> diff --git a/hw/vfio-user/protocol.h b/hw/vfio-user/protocol.h
> index 3249a4a6b6..2a0c31e7c5 100644
> --- a/hw/vfio-user/protocol.h
> +++ b/hw/vfio-user/protocol.h
> @@ -40,6 +40,7 @@ enum vfio_user_command {
> VFIO_USER_DEVICE_RESET = 13,
> VFIO_USER_DIRTY_PAGES = 14,
> VFIO_USER_REGION_WRITE_MULTI = 15,
> + VFIO_USER_DEVICE_FEATURE = 16,
> VFIO_USER_MAX,
> };
>
> @@ -239,4 +240,15 @@ typedef struct {
> VFIOUserWROne wrs[VFIO_USER_MULTI_MAX];
> } VFIOUserWRMulti;
>
> +/*
> + * VFIO_USER_DEVICE_FEATURE
> + * imported from struct vfio_device_feature
> + */
> +typedef struct {
> + VFIOUserHdr hdr;
> + uint32_t argsz;
> + uint32_t flags;
> + char data[];
> +} VFIOUserDeviceFeature;
> +
> #endif /* VFIO_USER_PROTOCOL_H */
> diff --git a/hw/vfio-user/device.c b/hw/vfio-user/device.c
> index 64ef35b320..6910d183d7 100644
> --- a/hw/vfio-user/device.c
> +++ b/hw/vfio-user/device.c
> @@ -74,6 +74,44 @@ void vfio_user_device_reset(VFIOUserProxy *proxy)
> }
> }
>
> +static int
> +vfio_user_device_io_device_feature(VFIODevice *vbasedev,
> + struct vfio_device_feature *feature)
> +{
> + g_autofree VFIOUserDeviceFeature *msgp = NULL;
> + int size = sizeof(VFIOUserHdr) + feature->argsz;
> + VFIOUserProxy *proxy = vbasedev->proxy;
> + Error *local_err = NULL;
> +
> + msgp = g_malloc0(size);
> +
> + vfio_user_request_msg(&msgp->hdr, VFIO_USER_DEVICE_FEATURE, size, 0);
> +
> + memcpy(&msgp->argsz, &feature->argsz, feature->argsz);
> +
> + if (!vfio_user_send_wait(proxy, &msgp->hdr, NULL, size, &local_err)) {
> + error_prepend(&local_err, "%s: ", __func__);
> + error_report_err(local_err);
> + return -EFAULT;
> + }
> +
> + if (msgp->hdr.flags & VFIO_USER_ERROR) {
> + /*
> + * Client expects ENOTTY for "not supported", but the protocol may
> + * return EINVAL.
> + */
Is this errno tanslation due to the call in vfio_region_create_dma_buf() ?
EINVAL could indicate other issues. Is is safe to mask it ?
> + if (msgp->hdr.error_reply == EINVAL) {
> + return -ENOTTY;
> + }
> +
> + return -msgp->hdr.error_reply;
> + }
We could add a trace event here ?
Thanks,
C.
> + memcpy(feature, &msgp->argsz, feature->argsz);
> +
> + return 0;
> +}
> +
> static int vfio_user_get_region_info(VFIOUserProxy *proxy,
> struct vfio_region_info *info,
> VFIOUserFDs *fds)
> @@ -432,6 +470,7 @@ static int vfio_user_device_io_region_write(VFIODevice *vbasedev, uint8_t index,
> * Socket-based io_ops
> */
> VFIODeviceIOOps vfio_user_device_io_ops_sock = {
> + .device_feature = vfio_user_device_io_device_feature,
> .get_region_info = vfio_user_device_io_get_region_info,
> .get_irq_info = vfio_user_device_io_get_irq_info,
> .set_irqs = vfio_user_device_io_set_irqs,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] vfio: quieten dma-buf warning
2026-03-17 19:53 ` [PATCH 2/2] vfio: quieten dma-buf warning John Levon
@ 2026-04-08 7:52 ` Cédric Le Goater
2026-04-08 8:57 ` John Levon
0 siblings, 1 reply; 10+ messages in thread
From: Cédric Le Goater @ 2026-04-08 7:52 UTC (permalink / raw)
To: John Levon, qemu-devel; +Cc: Alex Williamson, Thanos Makatos
On 3/17/26 20:53, John Levon wrote:
> Don't report this error every time,
warn_report_once() is not every time.
> as it is specific to the kernel vfio
> implementation; we shouldn't warn about things that always happen, such
> as when this is backed by vfio-user.
What bothers you is the "... kernel: " message ?
We could use (!vbasedev->proxy) to change the "kernel" string to
an another one related to the device implementation. What do you
think ?
Thanks,
C.
> Signed-off-by: John Levon <john.levon@nutanix.com>
> ---
> hw/vfio/region.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/hw/vfio/region.c b/hw/vfio/region.c
> index 47fdc2df34..1d442f3f48 100644
> --- a/hw/vfio/region.c
> +++ b/hw/vfio/region.c
> @@ -316,8 +316,6 @@ static bool vfio_region_create_dma_buf(VFIORegion *region, Error **errp)
> ret = vfio_device_get_feature(vbasedev, feature);
> if (ret < 0) {
> if (ret == -ENOTTY) {
> - warn_report_once("VFIO dma-buf not supported in kernel: "
> - "PCI BAR IOMMU mappings may fail");
> return true;
> }
> /* P2P DMA or exposing device memory use cases are not supported. */
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] vfio: quieten dma-buf warning
2026-04-08 7:52 ` Cédric Le Goater
@ 2026-04-08 8:57 ` John Levon
2026-04-09 9:53 ` Cédric Le Goater
0 siblings, 1 reply; 10+ messages in thread
From: John Levon @ 2026-04-08 8:57 UTC (permalink / raw)
To: Cédric Le Goater; +Cc: qemu-devel, Alex Williamson, Thanos Makatos
On Wed, Apr 08, 2026 at 09:52:53AM +0200, Cédric Le Goater wrote:
> On 3/17/26 20:53, John Levon wrote:
> > Don't report this error every time,
>
> warn_report_once() is not every time.
It's every time the VM boots for an obscure feature that is totally irrelevant
to non-kernel-vfio backends.
> > as it is specific to the kernel vfio
> > implementation; we shouldn't warn about things that always happen, such
> > as when this is backed by vfio-user.
>
> What bothers you is the "... kernel: " message ?
The existence of an incorrect and meaningless warning is my complaint.
> We could use (!vbasedev->proxy) to change the "kernel" string to
> an another one related to the device implementation. What do you
> think ?
If I'm "allowed" to check for this to suppress the message entirely, then works
for me.
regards
john
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE
2026-04-08 7:42 ` Cédric Le Goater
@ 2026-04-08 9:00 ` John Levon
0 siblings, 0 replies; 10+ messages in thread
From: John Levon @ 2026-04-08 9:00 UTC (permalink / raw)
To: Cédric Le Goater; +Cc: qemu-devel, Alex Williamson, Thanos Makatos
On Wed, Apr 08, 2026 at 09:42:30AM +0200, Cédric Le Goater wrote:
> > + if (msgp->hdr.flags & VFIO_USER_ERROR) {
> > + /*
> > + * Client expects ENOTTY for "not supported", but the protocol may
> > + * return EINVAL.
> > + */
>
> Is this errno tanslation due to the call in vfio_region_create_dma_buf() ?
Yes.
> EINVAL could indicate other issues. Is is safe to mask it ?
Yes - this should only occur otherwise in the case of incorrect protocol
messages (i.e. qemu bugs).
regards
john
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] vfio: quieten dma-buf warning
2026-04-08 8:57 ` John Levon
@ 2026-04-09 9:53 ` Cédric Le Goater
2026-04-09 10:05 ` John Levon
2026-04-09 10:12 ` John Levon
0 siblings, 2 replies; 10+ messages in thread
From: Cédric Le Goater @ 2026-04-09 9:53 UTC (permalink / raw)
To: John Levon; +Cc: qemu-devel, Alex Williamson, Thanos Makatos
On 4/8/26 10:57, John Levon wrote:
> On Wed, Apr 08, 2026 at 09:52:53AM +0200, Cédric Le Goater wrote:
>
>> On 3/17/26 20:53, John Levon wrote:
>>> Don't report this error every time,
>>
>> warn_report_once() is not every time.
>
> It's every time the VM boots for an obscure feature that is totally irrelevant
> to non-kernel-vfio backends.
I agree. It's irrelevant for vfio-user.
>>> as it is specific to the kernel vfio
>>> implementation; we shouldn't warn about things that always happen, such
>>> as when this is backed by vfio-user.
>>
>> What bothers you is the "... kernel: " message ?
>
> The existence of an incorrect and meaningless warning is my complaint.
I sense your irritation from across the Channel :)
>> We could use (!vbasedev->proxy) to change the "kernel" string to
>> an another one related to the device implementation. What do you
>> think ?
>
> If I'm "allowed" to check for this to suppress the message entirely, then works
> for me.
VFIO_DEVICE_FEATURE_DMA_BUF should be available in Linux v6.19 and
QEMU 11.0. It is an important feature for large GPUs, PCI P2P DMAs
and most entreprise distros should have a KVM/VFIO and QEMU in sync
for it. The lack of dmabuf support is not fatal but it deserves some
"warning". I'd rather keep it that way.
The vfio-user implementation doesn't care. I agree. Sorry it was not
my focus. Anyhow, this raises an interesting question on the lack of
support of a feature for a specific backend.
I see 2 possible approaches,
1. quick one:
Return -ENOTSUP and test the value in vfio_region_create_dma_buf().
It's cleaner than masking EINVAL IMO.
2. cleaner one:
Add a capability field to VFIODeviceIOOps to advertise supported
features:
#define VFIO_IO_CAP_DMA_BUF (1 << 0)
#define VFIO_IO_CAP_MIGRATION (1 << 1)
struct VFIODeviceIOOps {
uint64_t capabilities; /* Bitmask of VFIO_IO_CAP_* */
..
and test vbasedev->io_ops->capabilities where needed.
How's that ? I can implement option 2.
Thanks,
C.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] vfio: quieten dma-buf warning
2026-04-09 9:53 ` Cédric Le Goater
@ 2026-04-09 10:05 ` John Levon
2026-04-09 10:12 ` John Levon
1 sibling, 0 replies; 10+ messages in thread
From: John Levon @ 2026-04-09 10:05 UTC (permalink / raw)
To: Cédric Le Goater; +Cc: qemu-devel, Alex Williamson, Thanos Makatos
On Thu, Apr 09, 2026 at 11:53:58AM +0200, Cédric Le Goater wrote:
> > The existence of an incorrect and meaningless warning is my complaint.
>
> I sense your irritation from across the Channel :)
:)
> 1. quick one:
>
> Return -ENOTSUP and test the value in vfio_region_create_dma_buf().
> It's cleaner than masking EINVAL IMO.
Let me do this one now, and we can look at the capability one later perhaps? You
mention migration but I want to get that working, so might be a bit silly just
for one error message.
regards
john
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] vfio: quieten dma-buf warning
2026-04-09 9:53 ` Cédric Le Goater
2026-04-09 10:05 ` John Levon
@ 2026-04-09 10:12 ` John Levon
1 sibling, 0 replies; 10+ messages in thread
From: John Levon @ 2026-04-09 10:12 UTC (permalink / raw)
To: Cédric Le Goater; +Cc: qemu-devel, Alex Williamson, Thanos Makatos
On Thu, Apr 09, 2026 at 11:53:58AM +0200, Cédric Le Goater wrote:
> 1. quick one:
>
> Return -ENOTSUP and test the value in vfio_region_create_dma_buf().
> It's cleaner than masking EINVAL IMO.
Scratch that, vfio can return this error too:
220 if (!vdev->pci_ops || !vdev->pci_ops->get_dmabuf_phys)
221 return -EOPNOTSUPP;
> 2. cleaner one:
>
> Add a capability field to VFIODeviceIOOps to advertise supported
> features:
> #define VFIO_IO_CAP_DMA_BUF (1 << 0)
> #define VFIO_IO_CAP_MIGRATION (1 << 1)
> struct VFIODeviceIOOps {
> uint64_t capabilities; /* Bitmask of VFIO_IO_CAP_* */
> ..
> and test vbasedev->io_ops->capabilities where needed.
>
> How's that ? I can implement option 2.
I'd appreciate it, thanks, please let me know.
regards
john
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-04-09 10:13 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 19:53 [PATCH 0/2] vfio: Implement device features for vfio-user John Levon
2026-03-17 19:53 ` [PATCH 1/2] vfio-user: support VFIO_USER_DEVICE_FEATURE John Levon
2026-04-08 7:42 ` Cédric Le Goater
2026-04-08 9:00 ` John Levon
2026-03-17 19:53 ` [PATCH 2/2] vfio: quieten dma-buf warning John Levon
2026-04-08 7:52 ` Cédric Le Goater
2026-04-08 8:57 ` John Levon
2026-04-09 9:53 ` Cédric Le Goater
2026-04-09 10:05 ` John Levon
2026-04-09 10:12 ` John Levon
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.