> From: Tyler Retzlaff [mailto:roret...@linux.microsoft.com]
> Sent: Tuesday, 13 February 2024 07.46
> 
> Replace the use of RTE_MARKER<x> with C11 anonymous unions to improve
> code portability between toolchains.

How about combining the cacheline 0 marker and padding, like this:

 struct rte_mbuf {
-       RTE_MARKER cacheline0;
+       union {
+               char cacheline0[RTE_CACHE_LINE_MIN_SIZE];
 
+               struct {
-       void *buf_addr;           /**< Virtual address of segment buffer. */
+                       void *buf_addr; /**< Virtual address of segment buffer. 
*/
 #if RTE_IOVA_IN_MBUF


You could do the same with the cacheline1 marker:

        /* second cache line - fields only used in slow path or on TX */
-       RTE_MARKER cacheline1 __rte_cache_min_aligned;
+       union {
+               char cacheline1[RTE_CACHE_LINE_MIN_SIZE];
 
+               struct {
 #if RTE_IOVA_IN_MBUF
-       /**
-        * Next segment of scattered packet. Must be NULL in the last
-        * segment or in case of non-segmented packet.
-        */
-       struct rte_mbuf *next;
+                       /**
+                        * Next segment of scattered packet. Must be NULL in 
the last
+                        * segment or in case of non-segmented packet.
+                        */
+                       struct rte_mbuf *next;
 #else


It also avoids the weird union between cacheline0 and buf_addr at the beginning 
of the structure, and between cacheline1 and next/dynfield2 at the beginning of 
the second cache line.

And then you can omit the pad_cacheline0 array at the end of the first part of 
the structure.


BTW: char is a weaker type than uint8_t - i.e. it is easier to cast to another 
type.
It might be a personal preference, but I would use char instead of uint8_t for 
the padding array.

Reply via email to