From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: virtualization@lists.linux-foundation.org
Subject: [PATCH v2 24/24] virtio_config: rewrite using _Generic
Date: Mon, 3 Aug 2020 17:00:29 -0400 [thread overview]
Message-ID: <20200803205814.540410-25-mst@redhat.com> (raw)
In-Reply-To: <20200803205814.540410-1-mst@redhat.com>
Min compiler version has been raised, so that's ok now.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/linux/virtio_config.h | 163 ++++++++++++++++------------------
1 file changed, 77 insertions(+), 86 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 5c3b02245ecd..21c7098595ad 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -288,112 +288,103 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
return __cpu_to_virtio64(virtio_is_little_endian(vdev), val);
}
-/*
- * Only the checker differentiates between __virtioXX and __uXX types. But we
- * try to share as much code as we can with the regular GCC build.
- */
-#if !defined(CONFIG_CC_IS_GCC) && !defined(__CHECKER__)
+#define virtio_to_cpu(vdev, x) \
+ _Generic((x), \
+ __u8: (x), \
+ __virtio16: virtio16_to_cpu((vdev), (x)), \
+ __virtio32: virtio32_to_cpu((vdev), (x)), \
+ __virtio64: virtio64_to_cpu((vdev), (x)), \
+ /*
+ * Why define a default? checker can distinguish between
+ * e.g. __u16, __le16 and __virtio16, but GCC can't so
+ * attempts to define variants for both look like a duplicate
+ * variant to it.
+ */ \
+ default: _Generic((x), \
+ __u8: (x), \
+ __le16: virtio16_to_cpu((vdev), (__force __virtio16)(x)), \
+ __le32: virtio32_to_cpu((vdev), (__force __virtio32)(x)), \
+ __le64: virtio64_to_cpu((vdev), (__force __virtio64)(x)), \
+ default: _Generic((x), \
+ __u8: (x), \
+ __u16: virtio16_to_cpu((vdev), (__force __virtio16)(x)), \
+ __u32: virtio32_to_cpu((vdev), (__force __virtio32)(x)), \
+ __u64: virtio64_to_cpu((vdev), (__force __virtio64)(x)) \
+ ) \
+ ) \
+ )
-/* Not a checker - we can keep things simple */
-#define __virtio_native_typeof(x) typeof(x)
-
-#else
-
-/*
- * We build this out of a couple of helper macros in a vain attempt to
- * help you keep your lunch down while reading it.
- */
-#define __virtio_pick_value(x, type, then, otherwise) \
- __builtin_choose_expr(__same_type(x, type), then, otherwise)
-
-#define __virtio_pick_type(x, type, then, otherwise) \
- __virtio_pick_value(x, type, (then)0, otherwise)
-
-#define __virtio_pick_endian(x, x16, x32, x64, otherwise) \
- __virtio_pick_type(x, x16, __u16, \
- __virtio_pick_type(x, x32, __u32, \
- __virtio_pick_type(x, x64, __u64, \
- otherwise)))
-
-#define __virtio_native_typeof(x) typeof( \
- __virtio_pick_type(x, __u8, __u8, \
- __virtio_pick_endian(x, __virtio16, __virtio32, __virtio64, \
- __virtio_pick_endian(x, __le16, __le32, __le64, \
- /* No other type allowed */ \
- (void)0))))
-
-#endif
+#define cpu_to_virtio(vdev, x, m) \
+ _Generic((m), \
+ __u8: (x), \
+ __virtio16: cpu_to_virtio16((vdev), (x)), \
+ __virtio32: cpu_to_virtio32((vdev), (x)), \
+ __virtio64: cpu_to_virtio64((vdev), (x)), \
+ /*
+ * Why define a default? checker can distinguish between
+ * e.g. __u16, __le16 and __virtio16, but GCC can't so
+ * attempts to define variants for both look like a duplicate
+ * variant to it.
+ */ \
+ default: _Generic((m), \
+ __u8: (x), \
+ __le16: (__force __le16)cpu_to_virtio16((vdev), (x)), \
+ __le32: (__force __le32)cpu_to_virtio32((vdev), (x)), \
+ __le64: (__force __le64)cpu_to_virtio64((vdev), (x)), \
+ default: _Generic((m), \
+ __u8: (x), \
+ __u16: (__force __u16)cpu_to_virtio16((vdev), (x)), \
+ __u32: (__force __u32)cpu_to_virtio32((vdev), (x)), \
+ __u64: (__force __u64)cpu_to_virtio64((vdev), (x)) \
+ ) \
+ ) \
+ )
#define __virtio_native_type(structname, member) \
- __virtio_native_typeof(((structname*)0)->member)
-
-#define __virtio_typecheck(structname, member, val) \
- /* Must match the member's type, and be integer */ \
- typecheck(__virtio_native_type(structname, member), (val))
-
+ typeof(virtio_to_cpu(NULL, ((structname*)0)->member))
/* Config space accessors. */
#define virtio_cread(vdev, structname, member, ptr) \
do { \
- might_sleep(); \
- /* Must match the member's type, and be integer */ \
- if (!__virtio_typecheck(structname, member, *(ptr))) \
- (*ptr) = 1; \
+ typeof(((structname*)0)->member) virtio_cread_v; \
\
- switch (sizeof(*ptr)) { \
+ might_sleep(); \
+ /* Sanity check: must match the member's type */ \
+ /*typecheck(typeof(virtio_to_cpu((vdev), virtio_cread_v)), *(ptr)); */\
+ \
+ switch (sizeof(virtio_cread_v)) { \
case 1: \
- *(ptr) = virtio_cread8(vdev, \
- offsetof(structname, member)); \
- break; \
case 2: \
- *(ptr) = virtio_cread16(vdev, \
- offsetof(structname, member)); \
- break; \
case 4: \
- *(ptr) = virtio_cread32(vdev, \
- offsetof(structname, member)); \
- break; \
- case 8: \
- *(ptr) = virtio_cread64(vdev, \
- offsetof(structname, member)); \
+ vdev->config->get((vdev), \
+ offsetof(structname, member), \
+ &virtio_cread_v, \
+ sizeof(virtio_cread_v)); \
break; \
default: \
- BUG(); \
+ __virtio_cread_many((vdev), \
+ offsetof(structname, member), \
+ &virtio_cread_v, \
+ 1, \
+ sizeof(virtio_cread_v)); \
+ break; \
} \
+ *(ptr) = virtio_to_cpu(vdev, virtio_cread_v); \
} while(0)
/* Config space accessors. */
#define virtio_cwrite(vdev, structname, member, ptr) \
do { \
- might_sleep(); \
- /* Must match the member's type, and be integer */ \
- if (!__virtio_typecheck(structname, member, *(ptr))) \
- BUG_ON((*ptr) == 1); \
+ typeof(((structname*)0)->member) virtio_cwrite_v = \
+ cpu_to_virtio(vdev, *(ptr), ((structname*)0)->member); \
\
- switch (sizeof(*ptr)) { \
- case 1: \
- virtio_cwrite8(vdev, \
- offsetof(structname, member), \
- *(ptr)); \
- break; \
- case 2: \
- virtio_cwrite16(vdev, \
- offsetof(structname, member), \
- *(ptr)); \
- break; \
- case 4: \
- virtio_cwrite32(vdev, \
- offsetof(structname, member), \
- *(ptr)); \
- break; \
- case 8: \
- virtio_cwrite64(vdev, \
- offsetof(structname, member), \
- *(ptr)); \
- break; \
- default: \
- BUG(); \
- } \
+ might_sleep(); \
+ /* Sanity check: must match the member's type */ \
+ typecheck(typeof(virtio_to_cpu((vdev), virtio_cwrite_v)), *(ptr)); \
+ \
+ vdev->config->set((vdev), offsetof(structname, member), \
+ &virtio_cwrite_v, \
+ sizeof(virtio_cwrite_v)); \
} while(0)
/* Read @count fields, @bytes each. */
--
MST
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
prev parent reply other threads:[~2020-08-03 21:00 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-03 20:58 [PATCH v2 00/24] virtio: config space endian-ness cleanup Michael S. Tsirkin
2020-08-03 20:58 ` [PATCH v2 01/24] virtio_balloon: fix sparse warning Michael S. Tsirkin
2020-08-03 21:25 ` David Hildenbrand
2020-08-04 14:16 ` Cornelia Huck
2020-08-03 20:58 ` [PATCH v2 02/24] virtio_ring: sparse warning fixup Michael S. Tsirkin
2020-08-04 14:18 ` Cornelia Huck
2020-08-03 20:58 ` [PATCH v2 03/24] virtio: allow __virtioXX, __leXX in config space Michael S. Tsirkin
2020-08-04 14:23 ` Cornelia Huck
2020-08-04 14:28 ` Michael S. Tsirkin
2020-08-05 6:28 ` Jason Wang
2020-08-05 11:45 ` Michael S. Tsirkin
2020-08-06 3:37 ` Jason Wang
2020-08-06 5:58 ` Michael S. Tsirkin
2020-08-07 3:26 ` Jason Wang
2020-08-03 20:58 ` [PATCH v2 04/24] virtio_9p: correct tags for config space fields Michael S. Tsirkin
2020-08-04 14:25 ` Cornelia Huck
2020-08-03 20:58 ` [PATCH v2 05/24] virtio_balloon: " Michael S. Tsirkin
2020-08-03 21:26 ` David Hildenbrand
2020-08-04 14:26 ` Cornelia Huck
2020-08-03 20:58 ` [PATCH v2 06/24] virtio_blk: " Michael S. Tsirkin
2020-08-04 14:29 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 07/24] virtio_console: " Michael S. Tsirkin
2020-08-04 14:31 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 08/24] virtio_crypto: " Michael S. Tsirkin
2020-08-04 14:32 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 09/24] virtio_fs: " Michael S. Tsirkin
2020-08-04 13:36 ` Vivek Goyal
2020-08-04 14:33 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 10/24] virtio_gpu: " Michael S. Tsirkin
2020-08-04 14:34 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 11/24] virtio_input: " Michael S. Tsirkin
2020-08-04 6:01 ` Gerd Hoffmann
2020-08-04 14:35 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 12/24] virtio_iommu: " Michael S. Tsirkin
2020-08-04 8:00 ` Jean-Philippe Brucker
2020-08-04 14:36 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 13/24] virtio_mem: " Michael S. Tsirkin
2020-08-03 21:23 ` David Hildenbrand
2020-08-04 14:37 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 14/24] virtio_net: " Michael S. Tsirkin
2020-08-04 14:44 ` Cornelia Huck
2020-08-05 13:26 ` Michael S. Tsirkin
2020-08-03 20:59 ` [PATCH v2 15/24] virtio_pmem: " Michael S. Tsirkin
2020-08-04 14:46 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 16/24] virtio_scsi: " Michael S. Tsirkin
2020-08-04 14:48 ` Cornelia Huck
2020-08-03 20:59 ` [PATCH v2 17/24] virtio_config: disallow native type fields Michael S. Tsirkin
2020-08-04 14:50 ` Cornelia Huck
2020-08-05 13:29 ` Michael S. Tsirkin
2020-08-03 21:00 ` [PATCH v2 18/24] mlxbf-tmfifo: sparse tags for config access Michael S. Tsirkin
2020-08-04 14:56 ` Cornelia Huck
2020-08-05 13:29 ` Michael S. Tsirkin
2020-08-03 21:00 ` [PATCH v2 19/24] vdpa: make sure set_features in invoked for legacy Michael S. Tsirkin
2020-08-05 6:14 ` Jason Wang
2020-08-05 11:40 ` Michael S. Tsirkin
2020-08-06 3:23 ` Jason Wang
2020-08-06 5:53 ` Michael S. Tsirkin
2020-08-06 7:27 ` Jason Wang
2020-08-06 10:00 ` Michael S. Tsirkin
2020-08-07 3:00 ` Jason Wang
2020-08-03 21:00 ` [PATCH v2 20/24] vhost/vdpa: switch to new helpers Michael S. Tsirkin
2020-08-03 21:00 ` [PATCH v2 21/24] virtio_vdpa: legacy features handling Michael S. Tsirkin
2020-08-03 21:00 ` [PATCH v2 22/24] vdpa_sim: fix endian-ness of config space Michael S. Tsirkin
2020-08-05 6:21 ` Jason Wang
2020-08-05 11:44 ` Michael S. Tsirkin
2020-08-05 12:06 ` Michael S. Tsirkin
2020-08-06 3:23 ` Jason Wang
2020-08-03 21:00 ` [PATCH v2 23/24] virtio_config: cread/write cleanup Michael S. Tsirkin
2020-08-03 21:00 ` Michael S. Tsirkin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200803205814.540410-25-mst@redhat.com \
--to=mst@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).