Re: [PATCH net-next 10/10] bnxt_en: Add support for XDP_TX action.
From: Jakub Kicinski <hidden>
Date: 2017-01-31 05:27:49
On Mon, 30 Jan 2017 20:49:35 -0500, Michael Chan wrote:
+static int bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_napi *bnapi,
+ struct page *page, dma_addr_t mapping, u32 offset,
+ u32 len)
+{
+ struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
+ struct bnxt_sw_tx_bd *tx_buf;
+ struct tx_bd_ext *txbd1;
+ struct tx_bd *txbd;
+ u32 flags;
+ u16 prod;
+
+ if (bnxt_tx_avail(bp, txr) < 2)
+ return -ENOSPC;
+
+ prod = txr->tx_prod;
+ txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+
+ tx_buf = &txr->tx_buf_ring[prod];
+ tx_buf->page = page;
+ dma_unmap_addr_set(tx_buf, mapping, mapping);
+ flags = (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD |
+ (2 << TX_BD_FLAGS_BD_CNT_SHIFT) | TX_BD_FLAGS_PACKET_END |
+ bnxt_lhint_arr[len >> 9];
+ txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
+ txbd->tx_bd_opaque = prod;
+ txbd->tx_bd_haddr = cpu_to_le64(mapping + offset);
+
+ prod = NEXT_TX(prod);
+ txbd1 = (struct tx_bd_ext *)
+ &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+
+ txbd1->tx_bd_hsize_lflags = cpu_to_le32(0);
+ txbd1->tx_bd_mss = cpu_to_le32(0);
+ txbd1->tx_bd_cfa_action = cpu_to_le32(0);
+ txbd1->tx_bd_cfa_meta = cpu_to_le32(0);
+
+ prod = NEXT_TX(prod);
+ txr->tx_prod = prod;
+ return 0;
+}Are you not lacking DMA syncs in general? You map the buffers bidirectionally, but I failed to find any dma_syncs. I would expect one before you run xdp and one before you TX because packet could have been modified. What am I missing?