]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ixgbe: add tracking of AF_XDP zero-copy state for each queue pair
authorJan Sokolowski <jan.sokolowski@intel.com>
Fri, 22 Mar 2019 21:16:37 +0000 (14:16 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 5 Jun 2019 20:04:29 +0000 (13:04 -0700)
Here, we add a bitmap to the ixgbe_adapter that tracks if a
certain queue pair has been "zero-copy enabled" via the ndo_bpf.
The bitmap is used in ixgbe_xsk_umem, and enables zero-copy if
and only if XDP is enabled, the corresponding qid in the bitmap
is set, and the umem is non-NULL;

Signed-off-by: Jan Sokolowski <jan.sokolowski@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c

index 08d85e336bd43f51c1d4624acd673c981d58f848..5f5db6eb261e0dd292b195073f754368296b2cb1 100644 (file)
@@ -635,6 +635,7 @@ struct ixgbe_adapter {
        /* XDP */
        int num_xdp_queues;
        struct ixgbe_ring *xdp_ring[MAX_XDP_QUEUES];
+       unsigned long *af_xdp_zc_qps; /* tracks AF_XDP ZC enabled rings */
 
        /* TX */
        struct ixgbe_ring *tx_ring[MAX_TX_QUEUES] ____cacheline_aligned_in_smp;
index 57fd9ee6de665255f22c7ff146ba398b7f4fd971..b613e72c8ee42e25d90ff6c340da4d99c16820f7 100644 (file)
@@ -6288,6 +6288,10 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,
        if (ixgbe_init_rss_key(adapter))
                return -ENOMEM;
 
+       adapter->af_xdp_zc_qps = bitmap_zalloc(MAX_XDP_QUEUES, GFP_KERNEL);
+       if (!adapter->af_xdp_zc_qps)
+               return -ENOMEM;
+
        /* Set MAC specific capability flags and exceptions */
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
@@ -11161,6 +11165,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        kfree(adapter->jump_tables[0]);
        kfree(adapter->mac_table);
        kfree(adapter->rss_key);
+       bitmap_free(adapter->af_xdp_zc_qps);
 err_ioremap:
        disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
        free_netdev(netdev);
@@ -11249,6 +11254,7 @@ static void ixgbe_remove(struct pci_dev *pdev)
 
        kfree(adapter->mac_table);
        kfree(adapter->rss_key);
+       bitmap_free(adapter->af_xdp_zc_qps);
        disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
        free_netdev(netdev);
 
index bfe95ce0bd7f37e6915ce630e64896b1d50753c3..b9f05fbdbf67f427dc003f706ec8fee26b87f6f4 100644 (file)
@@ -15,7 +15,8 @@ struct xdp_umem *ixgbe_xsk_umem(struct ixgbe_adapter *adapter,
        int qid = ring->ring_idx;
 
        if (!adapter->xsk_umems || !adapter->xsk_umems[qid] ||
-           qid >= adapter->num_xsk_umems || !xdp_on)
+           qid >= adapter->num_xsk_umems || !xdp_on ||
+           !test_bit(qid, adapter->af_xdp_zc_qps))
                return NULL;
 
        return adapter->xsk_umems[qid];
@@ -143,6 +144,7 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
        if (if_running)
                ixgbe_txrx_ring_disable(adapter, qid);
 
+       set_bit(qid, adapter->af_xdp_zc_qps);
        err = ixgbe_add_xsk_umem(adapter, umem, qid);
        if (err)
                return err;
@@ -173,6 +175,7 @@ static int ixgbe_xsk_umem_disable(struct ixgbe_adapter *adapter, u16 qid)
        if (if_running)
                ixgbe_txrx_ring_disable(adapter, qid);
 
+       clear_bit(qid, adapter->af_xdp_zc_qps);
        ixgbe_xsk_umem_dma_unmap(adapter, adapter->xsk_umems[qid]);
        ixgbe_remove_xsk_umem(adapter, qid);