Re: [PATCH v3 01/17] virtio_pci: struct virtio_pci_common_cfg add queue_notify_data
From: Jason Wang <hidden>
Date: 2022-02-08 03:36:41
Also in:
bpf, virtualization
On Tue, Feb 8, 2022 at 11:29 AM Xuan Zhuo [off-list ref] wrote:
On Tue, 8 Feb 2022 11:24:13 +0800, Jason Wang [off-list ref] wrote:quoted
On Tue, Feb 8, 2022 at 11:20 AM Xuan Zhuo [off-list ref] wrote:quoted
On Tue, 8 Feb 2022 11:03:17 +0800, Jason Wang [off-list ref] wrote:quoted
On Tue, Feb 8, 2022 at 10:17 AM Xuan Zhuo [off-list ref] wrote:quoted
On Mon, 7 Feb 2022 16:06:15 +0800, Jason Wang [off-list ref] wrote:quoted
On Mon, Feb 7, 2022 at 2:07 PM Xuan Zhuo [off-list ref] wrote:quoted
On Mon, 7 Feb 2022 11:41:06 +0800, Jason Wang [off-list ref] wrote:quoted
在 2022/1/26 下午3:35, Xuan Zhuo 写道:quoted
Add queue_notify_data in struct virtio_pci_common_cfg, which comes from here https://github.com/oasis-tcs/virtio-spec/issues/89 Since I want to add queue_reset after it, I submitted this patch first. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- include/uapi/linux/virtio_pci.h | 1 + 1 file changed, 1 insertion(+)diff --git a/include/uapi/linux/virtio_pci.h b/include/uapi/linux/virtio_pci.h index 3a86f36d7e3d..492c89f56c6a 100644 --- a/include/uapi/linux/virtio_pci.h +++ b/include/uapi/linux/virtio_pci.h@@ -164,6 +164,7 @@ struct virtio_pci_common_cfg { __le32 queue_avail_hi; /* read-write */ __le32 queue_used_lo; /* read-write */ __le32 queue_used_hi; /* read-write */ + __le16 queue_notify_data; /* read-write */ };So I had the same concern as previous version. This breaks uABI where program may try to use sizeof(struct virtio_pci_common_cfg). We probably need a container structure here.I see, I plan to add a struct like this, do you think it's appropriate? struct virtio_pci_common_cfg_v1 { struct virtio_pci_common_cfg cfg; __le16 queue_notify_data; /* read-write */ }Something like this but we probably need a better name.how about this? /* Ext Fields in VIRTIO_PCI_CAP_COMMON_CFG: */ struct virtio_pci_common_cfg_ext { struct virtio_pci_common_cfg cfg; __le16 queue_notify_data; /* read-write */ __le16 reserved0; __le16 reserved1; __le16 reserved2; __le16 reserved3; __le16 reserved4; __le16 reserved5; __le16 reserved6; __le16 reserved7; __le16 reserved8; __le16 reserved9; __le16 reserved10; __le16 reserved11; __le16 reserved12; __le16 reserved13; __le16 reserved14; };I still think the container without padding is better. Otherwise userspace needs to use offset_of() trick instead of sizeof().In this case, as virtio_pci_common_cfg_ext adds new members in the future, we will add more container structures. In that case, I think virtio_pci_common_cfg_v1 is a good name instead.Something like "virtio_pci_common_cfg_notify" might be a little bit better.Although there is only one notify_data in this patch, I plan to look like this after my patch set: struct virtio_pci_common_cfg_v1 { struct virtio_pci_common_cfg cfg; __le16 queue_notify_data; /* read-write */ __le16 queue_reset; /* read-write */ } If we use virtio_pci_common_cfg_notify, then we will get two structures after this patch set: struct virtio_pci_common_cfg_notify { struct virtio_pci_common_cfg cfg; __le16 queue_notify_data; /* read-write */ } struct virtio_pci_common_cfg_reset { struct virtio_pci_common_cfg_notify cfg; __le16 queue_reset; /* read-write */ }
Right, this is sub-optimal, and we need padding in cfg_notify
probably. But I couldn't think of a better idea currently, maybe we
can listen from others opinion
But we use something like this for vnet_header extension
struct virtio_net_hdr_v1{
};
struct virtio_net_hdr_v1_hash{
struct virtio_net_hdr_v1;
__le32 XXX;
...
__le16 padding;
};
And it's not hard to imagine there would be another container for
struct virtio_net_hdr_v1_hash in the future if we want to extend vnet
header.
Thanks
Thanks.quoted
Thanksquoted
Thanks.quoted
Thanksquoted
Thanksquoted
Thanksquoted
Thanks.quoted
THanksquoted
/* Fields in VIRTIO_PCI_CAP_PCI_CFG: */