From nobody Mon Dec 1 22:41:52 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E9F431690D for ; Thu, 27 Nov 2025 06:40:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764225646; cv=none; b=SZRijjJy9iavP25EJ+AtyiWO9Ke1riuqW2aJsJkU0++vdgMEdnBXnbGHCrvikTzJkKIHbDCdIko7UUDCAxa8MzmMpK4KzbUSsrJnC2k+9pjEDaS3IY18mTZea6bF+CCXlS1h3FmDxOWiFvOzloV4TFaK6aAuvs0ZMxIQq3I2Vz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764225646; c=relaxed/simple; bh=6sJDh7TR0maQBdks2dSRada8nx8D+7jUwjltz8Ik4ms=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=uU2J3knCFCV8o+FOmv1YJZ7pLDEcInNnoLnZTGwrEzz1NVv1EeyCGRyFd7ygJrRJX0zderjwAnafurlPVeFozjcWuxbB0Y3WRNe08P0GCQ6p1Tss0INHbHy9yXzoIhO7La4Df6BSEhV/JLDNhFHjPCzVmPy8pjsXFKoPu54FN34= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=YsGhDTqP; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=a4bgkbIr; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="YsGhDTqP"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="a4bgkbIr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1764225643; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=M+AVszRknLoY/jDDQOQpI/1Oya1cYB7+TjwgCKh4fLI=; b=YsGhDTqPAIjIOenEvtxU8k0YMqZbDJ+ntInVFfCJyUateTH5GWZGYn7zBdCApgr6xy18WN 0WFIdZvS+Kvys6KSrop2NfndPfBnwk7jXK5dvCGZ1/xX+oPqR5B0S6O1eyWJ4CV7o0ScIz C0re6/ZLI1JoSSMekxDWrYxYInVJE/0= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-171-a6i8pJXyPo27WmI3l4nblw-1; Thu, 27 Nov 2025 01:40:40 -0500 X-MC-Unique: a6i8pJXyPo27WmI3l4nblw-1 X-Mimecast-MFC-AGG-ID: a6i8pJXyPo27WmI3l4nblw_1764225640 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-477cf2230c8so3885235e9.0 for ; Wed, 26 Nov 2025 22:40:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1764225639; x=1764830439; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=M+AVszRknLoY/jDDQOQpI/1Oya1cYB7+TjwgCKh4fLI=; b=a4bgkbIroaiQLUuX2xEWFOpDIRPbGgpdEJ8ODCSn2M9cWbTHE+D0W8iZyzEZ925Y7D WCDFWEUAt7yfRuF74o/X2qZmVD+6yi6DX6NRQ0/Yt3d3nOvY2745ZQMEGGZ9iY1vYeMf wxDNJxKujzB5wcwRPPkNsusdAITZ50nDrrhgZPPLs2whEHzlHR9I7+V8LBh6O8NG47HK aEbuh3y7u/mQHZlC8nWmDtuJmeeh23QDYFKSE9AcwdktY90D6U4wnOa4T+WsQvFhFSDw YoUhhpYY3VMawGdVxVJXWdxGjF0pglQG1kxMO9WMVCjKfTdHr7IQ4X9LM6+RELlQtHev vkZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764225639; x=1764830439; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=M+AVszRknLoY/jDDQOQpI/1Oya1cYB7+TjwgCKh4fLI=; b=huHeq93rH4RIaXyy/wGY9HN1Ck+uh0nQlo/4PeeAN2B8RZssH8odFEZc8tuGrLxyTy SMMtZHZZ+BZvSkQp7IWKFekPI9woESajhesQvmKN5/5B7N4Xo4XVH8d/ne56nUKflKoo KDzJ3g3SyLpykrv2GFb4Rr0ibw3FFJFizeOMa42s6cv4oVaajEldUpH/+vUh9dU6018J OsV6BdWuCmhbN519OUV10MZalUqRk46aru3TA5TN93dbaQqVzviJbruwNOkNhUMcTGRc FK/11Ozb7OkpsXrXo3MP6e1bRJ66YVAOTWZIyUHfiWvlHAyxC6jnjGTEOtSZV+K8Sus/ 3YIg== X-Gm-Message-State: AOJu0YxwvNY+sNs69etVOVh/4OMqvREFFE6vPUicPEm1j0zpVIAQNR11 wmEvEgtu4dm/is+d8w+f5EHIGrNsOTiZXcxyj15M3x6eXLcRENsLR5LUvcz6ayCRh4nmt4UoM28 dVlrkdpcpsa0J8DqxKjKvAc8ee5pJJWuSrLNfBPvBPfkET8amkvGbHebk/vyh9zVODhpeL959Gz qdWHVIIlPKO8So6F1ZGwzDTP1mnkuAkGZOnN/6aeu1aBE= X-Gm-Gg: ASbGncuEucF09VBdZKOddudbn3DdnZME9nncKrAxk9Xh/a1ZeKC4XTaCwHw9077rjbD IDgWrIN3J68//aq+FtZJ6pXJiOQaMMBh8pYq5uqDGEMjc2z7oc+6lNfmPNDLqPH9ymDVvV7uRpv o+J9WP3CngOaRcfjLk9gCH+DIildj2Q7ji8EjwhoYaSqxBfs1fLEivAd/1uhHw7GAKZCdi9phwl xUTddyjTX5620gxpnJJhcpt2XSy9lZxjmJ25vaDX0BbTyaTVu7UsveQs+hA18G0NQgW+fXUut8v kFmShJBfsazuTxSebY0jPppfMo+GakmSOICyLBkUDhdiEOfxtDaixLnPitd9jTcpcyxmjdCWPD8 HxAIxVC0SQASjRy2aRObdCuVOjG2H1w== X-Received: by 2002:a05:600c:4f48:b0:471:115e:87bd with SMTP id 5b1f17b1804b1-47904b2494cmr86357085e9.26.1764225639483; Wed, 26 Nov 2025 22:40:39 -0800 (PST) X-Google-Smtp-Source: AGHT+IGIc2HWl1bEZAW98bVde7+vw9sLlCeonr8va9/QQZdNQY3M7yfM4XWOaGQlBJyuh5tTNCFGXw== X-Received: by 2002:a05:600c:4f48:b0:471:115e:87bd with SMTP id 5b1f17b1804b1-47904b2494cmr86356645e9.26.1764225638741; Wed, 26 Nov 2025 22:40:38 -0800 (PST) Received: from redhat.com (IGLD-80-230-39-63.inter.net.il. [80.230.39.63]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4790b0c44dcsm78644225e9.11.2025.11.26.22.40.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 22:40:38 -0800 (PST) Date: Thu, 27 Nov 2025 01:40:35 -0500 From: "Michael S. Tsirkin" To: linux-kernel@vger.kernel.org Cc: Andrew Lunn , Paolo Abeni , Jason Wang , Eugenio =?utf-8?B?UMOpcmV6?= , Xuan Zhuo , Jonathan Corbet , kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-doc@vger.kernel.org, Mike Christie , Paolo Bonzini , Stefan Hajnoczi , Stefano Garzarella Subject: [PATCH v6 3/3] vhost: switch to arrays of feature bits Message-ID: <637e182e139980e5930d50b928ba5ac072d628a9.1764225384.git.mst@redhat.com> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Mailer: git-send-email 2.27.0.106.g8ac3dc51b1 X-Mutt-Fcc: =sent Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- 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 Cop= y TX;" =20 #define VHOST_DMA_IS_DONE(len) ((__force u32)(len) >=3D (__force u32)VHOST= _DMA_DONE_LEN) =20 -static const u64 vhost_net_features[VIRTIO_FEATURES_U64S] =3D { - 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[] =3D { + 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 }; =20 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 =3D f->private_data; void __user *argp =3D (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 { }; =20 /* Note: can't set VIRTIO_F_VERSION_1 yet, since that implies ANY_LAYOUT. = */ -enum { - VHOST_SCSI_FEATURES =3D VHOST_FEATURES | (1ULL << VIRTIO_SCSI_F_HOTPLUG) | - (1ULL << VIRTIO_SCSI_F_T10_PI) +static const int vhost_scsi_bits[] =3D { + VHOST_FEATURES, + VIRTIO_SCSI_F_HOTPLUG, + VIRTIO_SCSI_F_T10_PI }; =20 +#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 =20 -#define VHOST_TEST_FEATURES VHOST_FEATURES +static const int vhost_test_bits[] =3D { + VHOST_FEATURES +}; + +#define VHOST_TEST_FEATURES VHOST_FEATURES_U64(vhost_test_features, 0) =20 enum { VHOST_TEST_VQ =3D 0, diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index 621a6d9a8791..c7b92730668e 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h @@ -14,6 +14,7 @@ #include #include #include +#include =20 struct vhost_work; struct vhost_task; @@ -279,14 +280,39 @@ void vhost_iotlb_map_free(struct vhost_iotlb *iotlb, eventfd_signal((vq)->error_ctx);\ } while (0) =20 -enum { - VHOST_FEATURES =3D (1ULL << VIRTIO_F_NOTIFY_ON_EMPTY) | - (1ULL << VIRTIO_RING_F_INDIRECT_DESC) | - (1ULL << VIRTIO_RING_F_EVENT_IDX) | - (1ULL << VHOST_F_LOG_ALL) | - (1ULL << VIRTIO_F_ANY_LAYOUT) | - (1ULL << VIRTIO_F_VERSION_1) -}; +#define VHOST_FEATURES \ + VIRTIO_F_NOTIFY_ON_EMPTY, \ + VIRTIO_RING_F_INDIRECT_DESC, \ + VIRTIO_RING_F_EVENT_IDX, \ + VHOST_F_LOG_ALL, \ + VIRTIO_F_ANY_LAYOUT, \ + VIRTIO_F_VERSION_1 + +static inline u64 vhost_features_u64(const int *features, int size, int id= x) +{ + u64 res =3D 0; + + unrolled_count(VIRTIO_FEATURES_BITS) + for (int i =3D 0; i < size; ++i) { + int bit =3D features[i]; + + if (virtio_features_chk_bit(bit) && VIRTIO_U64(bit) =3D=3D idx) + res |=3D VIRTIO_BIT(bit); + } + return res; +} + +#define VHOST_FEATURES_U64(features, idx) \ + vhost_features_u64(features, ARRAY_SIZE(features), idx) + +#define DEFINE_VHOST_FEATURES_ARRAY_ENTRY(idx, features) \ + [idx] =3D VHOST_FEATURES_U64(features, idx), + +#define DEFINE_VHOST_FEATURES_ARRAY(array, features) \ + u64 array[VIRTIO_FEATURES_U64S] =3D { \ + UNROLL(VIRTIO_FEATURES_U64S, \ + DEFINE_VHOST_FEATURES_ARRAY_ENTRY, features) \ + } =20 /** * vhost_vq_set_backend - Set backend. diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c index ae01457ea2cd..0298ddc34824 100644 --- a/drivers/vhost/vsock.c +++ b/drivers/vhost/vsock.c @@ -29,12 +29,14 @@ */ #define VHOST_VSOCK_PKT_WEIGHT 256 =20 -enum { - VHOST_VSOCK_FEATURES =3D VHOST_FEATURES | - (1ULL << VIRTIO_F_ACCESS_PLATFORM) | - (1ULL << VIRTIO_VSOCK_F_SEQPACKET) +static const int vhost_vsock_bits[] =3D { + VHOST_FEATURES, + VIRTIO_F_ACCESS_PLATFORM, + VIRTIO_VSOCK_F_SEQPACKET }; =20 +#define VHOST_VSOCK_FEATURES VHOST_FEATURES_U64(vhost_vsock_bits, 0) + enum { VHOST_VSOCK_BACKEND_FEATURES =3D (1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2) }; --=20 MST