struct mlx5e_xdpsq {
        /* data path */
 
-       /* dirtied @rx completion */
+       /* dirtied @completion */
        u16                        cc;
-       u16                        pc;
+       bool                       redirect_flush;
 
-       struct mlx5e_cq            cq;
+       /* dirtied @xmit */
+       u16                        pc ____cacheline_aligned_in_smp;
+       bool                       doorbell;
 
-       /* write@xmit, read@completion */
-       struct {
-               struct mlx5e_xdp_info     *xdpi;
-               bool                       doorbell;
-               bool                       redirect_flush;
-       } db;
+       struct mlx5e_cq            cq;
 
        /* read only */
        struct mlx5_wq_cyc         wq;
        struct mlx5e_xdpsq_stats  *stats;
+       struct {
+               struct mlx5e_xdp_info     *xdpi;
+       } db;
        void __iomem              *uar_map;
        u32                        sqn;
        struct device             *pdev;
 
                if (unlikely(err))
                        goto xdp_abort;
                __set_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags);
-               rq->xdpsq.db.redirect_flush = true;
+               rq->xdpsq.redirect_flush = true;
                mlx5e_page_dma_unmap(rq, di);
                rq->stats->xdp_redirect++;
                return true;
        }
 
        if (unlikely(!mlx5e_wqc_has_room_for(wq, sq->cc, sq->pc, 1))) {
-               if (sq->db.doorbell) {
+               if (sq->doorbell) {
                        /* SQ is full, ring doorbell */
                        mlx5e_xmit_xdp_doorbell(sq);
-                       sq->db.doorbell = false;
+                       sq->doorbell = false;
                }
                stats->full++;
                return false;
        sq->db.xdpi[pi] = *xdpi;
        sq->pc++;
 
-       sq->db.doorbell = true;
+       sq->doorbell = true;
 
        stats->xmit++;
        return true;
 
                rq->handle_rx_cqe(rq, cqe);
        } while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
 
-       if (xdpsq->db.doorbell) {
+       if (xdpsq->doorbell) {
                mlx5e_xmit_xdp_doorbell(xdpsq);
-               xdpsq->db.doorbell = false;
+               xdpsq->doorbell = false;
        }
 
-       if (xdpsq->db.redirect_flush) {
+       if (xdpsq->redirect_flush) {
                xdp_do_flush_map();
-               xdpsq->db.redirect_flush = false;
+               xdpsq->redirect_flush = false;
        }
 
        mlx5_cqwq_update_db_record(&cq->wq);
 
        u64 xmit;
        u64 full;
        u64 err;
-       u64 cqes;
+       /* dirtied @completion */
+       u64 cqes ____cacheline_aligned_in_smp;
 };
 
 struct mlx5e_ch_stats {