On Fri, Nov 28, 2025 at 10:39:57AM +0800, Jason Wang wrote: > On Thu, Nov 27, 2025 at 2:40 PM Michael S. Tsirkin <[email protected]> wrote: > > > > The current interface where caller has to know in which 64 bit chunk > > each bit is, is inelegant and fragile. > > Let's simply use arrays of bits. > > By using unroll macros text size grows only slightly. > > > > Signed-off-by: Michael S. Tsirkin <[email protected]> > > --- > > drivers/vhost/net.c | 19 ++++++++++--------- > > drivers/vhost/scsi.c | 9 ++++++--- > > drivers/vhost/test.c | 6 +++++- > > drivers/vhost/vhost.h | 42 ++++++++++++++++++++++++++++++++++-------- > > drivers/vhost/vsock.c | 10 ++++++---- > > 5 files changed, 61 insertions(+), 25 deletions(-) > > > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > > index d057ea55f5ad..f8ed39337f56 100644 > > --- a/drivers/vhost/net.c > > +++ b/drivers/vhost/net.c > > @@ -69,15 +69,15 @@ MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero > > Copy TX;" > > > > #define VHOST_DMA_IS_DONE(len) ((__force u32)(len) >= (__force > > u32)VHOST_DMA_DONE_LEN) > > > > -static const u64 vhost_net_features[VIRTIO_FEATURES_U64S] = { > > - VHOST_FEATURES | > > - (1ULL << VHOST_NET_F_VIRTIO_NET_HDR) | > > - (1ULL << VIRTIO_NET_F_MRG_RXBUF) | > > - (1ULL << VIRTIO_F_ACCESS_PLATFORM) | > > - (1ULL << VIRTIO_F_RING_RESET) | > > - (1ULL << VIRTIO_F_IN_ORDER), > > - VIRTIO_BIT(VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) | > > - VIRTIO_BIT(VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO), > > +static const int vhost_net_bits[] = { > > + VHOST_FEATURES, > > + VHOST_NET_F_VIRTIO_NET_HDR, > > + VIRTIO_NET_F_MRG_RXBUF, > > + VIRTIO_F_ACCESS_PLATFORM, > > + VIRTIO_F_RING_RESET, > > + VIRTIO_F_IN_ORDER, > > + VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO, > > + VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO > > }; > > > > enum { > > @@ -1720,6 +1720,7 @@ static long vhost_net_set_owner(struct vhost_net *n) > > static long vhost_net_ioctl(struct file *f, unsigned int ioctl, > > unsigned long arg) > > { > > + const DEFINE_VHOST_FEATURES_ARRAY(vhost_net_features, > > vhost_net_bits); > > u64 all_features[VIRTIO_FEATURES_U64S]; > > struct vhost_net *n = f->private_data; > > void __user *argp = (void __user *)arg; > > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > > index 98e4f68f4e3c..f43c1fe9fad9 100644 > > --- a/drivers/vhost/scsi.c > > +++ b/drivers/vhost/scsi.c > > @@ -197,11 +197,14 @@ enum { > > }; > > > > /* Note: can't set VIRTIO_F_VERSION_1 yet, since that implies ANY_LAYOUT. > > */ > > -enum { > > - VHOST_SCSI_FEATURES = VHOST_FEATURES | (1ULL << > > VIRTIO_SCSI_F_HOTPLUG) | > > - (1ULL << > > VIRTIO_SCSI_F_T10_PI) > > +static const int vhost_scsi_bits[] = { > > + VHOST_FEATURES, > > + VIRTIO_SCSI_F_HOTPLUG, > > + VIRTIO_SCSI_F_T10_PI > > }; > > > > +#define VHOST_SCSI_FEATURES VHOST_FEATURES_U64(vhost_scsi_bits, 0) > > + > > #define VHOST_SCSI_MAX_TARGET 256 > > #define VHOST_SCSI_MAX_IO_VQ 1024 > > #define VHOST_SCSI_MAX_EVENT 128 > > diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c > > index 94cd09f36f59..f592b2f548e8 100644 > > --- a/drivers/vhost/test.c > > +++ b/drivers/vhost/test.c > > @@ -28,7 +28,11 @@ > > */ > > #define VHOST_TEST_PKT_WEIGHT 256 > > > > -#define VHOST_TEST_FEATURES VHOST_FEATURES > > +static const int vhost_test_bits[] = { > > + VHOST_FEATURES > > +}; > > + > > +#define VHOST_TEST_FEATURES VHOST_FEATURES_U64(vhost_test_features, 0) > > Did you mean vhost_test_bits actually? > > Thanks
indeed.
