[v5,15/39] vhost: use C11 alignas

Message ID 1708715054-22386-16-git-send-email-roretzla@linux.microsoft.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Series use C11 alignas |


Context Check Description
ci/checkpatch success coding style OK

Commit Message

Tyler Retzlaff Feb. 23, 2024, 7:03 p.m. UTC
  The current location used for __rte_aligned(a) for alignment of types
and variables is not compatible with MSVC. There is only a single
location accepted by both toolchains.

For variables standard C11 offers alignas(a) supported by conformant
compilers i.e. both MSVC and GCC.

For types the standard offers no alignment facility that compatibly
interoperates with C and C++ but may be achieved by relocating the
placement of __rte_aligned(a) to the aforementioned location accepted
by all currently supported toolchains.

To allow alignment for both compilers do the following:

* Move __rte_aligned from the end of {struct,union} definitions to
  be between {struct,union} and tag.

  The placement between {struct,union} and the tag allows the desired
  alignment to be imparted on the type regardless of the toolchain being
  used for all of GCC, LLVM, MSVC compilers building both C and C++.

* Replace use of __rte_aligned(a) on variables/fields with alignas(a).

Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
 lib/vhost/vhost.h        | 8 ++++----
 lib/vhost/vhost_crypto.c | 4 ++--
 2 files changed, 6 insertions(+), 6 deletions(-)


diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h
index f163ff7..af48393 100644
--- a/lib/vhost/vhost.h
+++ b/lib/vhost/vhost.h
@@ -272,7 +272,7 @@  struct vhost_async {
  * Structure contains variables relevant to RX/TX virtqueues.
-struct vhost_virtqueue {
+struct __rte_cache_aligned vhost_virtqueue {
 	union {
 		struct vring_desc	*desc;
 		struct vring_packed_desc   *desc_packed;
@@ -351,7 +351,7 @@  struct vhost_virtqueue {
 	struct virtqueue_stats	stats;
 	RTE_ATOMIC(bool) irq_pending;
-} __rte_cache_aligned;
 /* Virtio device status as per Virtio specification */
@@ -479,7 +479,7 @@  struct inflight_mem_info {
  * Device structure contains all configuration information relating
  * to the device.
-struct virtio_net {
+struct __rte_cache_aligned virtio_net {
 	/* Frontend (QEMU) memory and memory region information */
 	struct rte_vhost_memory	*mem;
 	uint64_t		features;
@@ -538,7 +538,7 @@  struct virtio_net {
 	struct rte_vhost_user_extern_ops extern_ops;
 	struct vhost_backend_ops *backend_ops;
-} __rte_cache_aligned;
 static inline void
 vq_assert_lock__(struct virtio_net *dev, struct vhost_virtqueue *vq, const char *func)
diff --git a/lib/vhost/vhost_crypto.c b/lib/vhost/vhost_crypto.c
index 3704fbb..eb4a158 100644
--- a/lib/vhost/vhost_crypto.c
+++ b/lib/vhost/vhost_crypto.c
@@ -190,7 +190,7 @@  static int get_iv_len(enum rte_crypto_cipher_algorithm algo)
  * one DPDK crypto device that deals with all crypto workloads. It is declared
  * here and defined in vhost_crypto.c
-struct vhost_crypto {
+struct __rte_cache_aligned vhost_crypto {
 	/** Used to lookup DPDK Cryptodev Session based on VIRTIO crypto
 	 *  session ID.
@@ -213,7 +213,7 @@  struct vhost_crypto {
 	struct virtio_net *dev;
 	uint8_t option;
-} __rte_cache_aligned;
 struct vhost_crypto_writeback_data {
 	uint8_t *src;