On 5 Sep 2019, at 14:40, Ilya Maximets wrote:

Hi Eelco,

<SNIP>
, 2 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index bc20d6843..a23150387 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -362,6 +362,7 @@ struct netdev_dpdk {
         bool attached;
         /* If true, rte_eth_dev_start() was successfully called */
         bool started;
+        bool reset_needed;

This will produce a hole in the structure as members will no longer
fit into a single cacheline. And cacheline markers will be misaligned.

See details for similar issue here:
https://mail.openvswitch.org/pipermail/ovs-dev/2019-September/362349.html

Possible solution is to turn existing flags into bit fields or stop
avoiding the problem and drop most of padding in the structure.


         struct eth_addr hwaddr;
         int mtu;
         int socket_id;

I did a pahole check, as my counting is always off, and it look ok, even with the change:

struct netdev_dpdk {
        union {
                OVS_CACHE_LINE_MARKER cacheline0;        /*     0     1 */
                struct {
                        dpdk_port_t port_id;             /*     0     2 */
                        _Bool      attached;             /*     2     1 */
                        _Bool      started;              /*     3     1 */
                        _Bool      reset_needed;         /*     4     1 */

                        /* XXX 1 byte hole, try to pack */

                        struct eth_addr hwaddr;          /*     6     6 */
                        int        mtu;                  /*    12     4 */
                        int        socket_id;            /*    16     4 */
                        int        buf_size;             /*    20     4 */
                        int        max_packet_len;       /*    24     4 */
                        enum dpdk_dev_type type;         /*    28     4 */
                        enum netdev_flags flags;         /*    32     4 */
                        int        link_reset_cnt;       /*    36     4 */
                        union {
                                char * devargs;          /*    40     8 */
                                char * vhost_id;         /*    40     8 */
                        };                               /*    40     8 */
                        struct dpdk_tx_queue * tx_q;     /*    48     8 */
                        struct rte_eth_link link;        /*    56     8 */

                        /* XXX last struct has 2 bytes of padding */
                };                                       /*     0    64 */
                uint8_t            pad49[64];            /*     0    64 */
        };


<SNIP>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to