From: Vedang Patel <vedang.patel@intel.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH net-next v5 9/9] igc: Add support for XDP_REDIRECT action
Date: Mon, 8 Feb 2021 18:41:41 -0800 [thread overview]
Message-ID: <20210209024141.23298-10-vedang.patel@intel.com> (raw)
In-Reply-To: <20210209024141.23298-1-vedang.patel@intel.com>
From: Andre Guedes <andre.guedes@intel.com>
This patch adds support for the XDP_REDIRECT action which enables XDP
programs to redirect packets arriving at I225 NIC. It also implements
the ndo_xdp_xmit ops, enabling the igc driver to transmit packets
forwarded to it by xdp programs running on other interfaces.
The patch tweaks the driver's page counting scheme (as described in
'8ce29c679a6e i40e: tweak page counting for XDP_REDIRECT' and
implemented by other Intel drivers) in order to properly support
XDP_REDIRECT action.
This patch has been tested with the sample apps "xdp_redirect_cpu" and
"xdp_redirect_map" located in samples/bpf/.
Signed-off-by: Andre Guedes <andre.guedes@intel.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Vedang Patel <vedang.patel@intel.com>
---
drivers/net/ethernet/intel/igc/igc_main.c | 59 +++++++++++++++++++++--
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index d34d35789e2e..8bb1f8a54368 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -26,6 +26,7 @@
#define IGC_XDP_PASS 0
#define IGC_XDP_CONSUMED BIT(0)
#define IGC_XDP_TX BIT(1)
+#define IGC_XDP_REDIRECT BIT(2)
static int debug = -1;
@@ -1708,8 +1709,8 @@ static bool igc_can_reuse_rx_page(struct igc_rx_buffer *rx_buffer)
* the pagecnt_bias and page count so that we fully restock the
* number of references the driver holds.
*/
- if (unlikely(!pagecnt_bias)) {
- page_ref_add(page, USHRT_MAX);
+ if (unlikely(pagecnt_bias == 1)) {
+ page_ref_add(page, USHRT_MAX - 1);
rx_buffer->pagecnt_bias = USHRT_MAX;
}
@@ -1850,7 +1851,8 @@ static bool igc_alloc_mapped_page(struct igc_ring *rx_ring,
bi->dma = dma;
bi->page = page;
bi->page_offset = igc_rx_offset(rx_ring);
- bi->pagecnt_bias = 1;
+ page_ref_add(page, USHRT_MAX - 1);
+ bi->pagecnt_bias = USHRT_MAX;
return true;
}
@@ -2046,6 +2048,12 @@ static struct sk_buff *igc_xdp_run_prog(struct igc_adapter *adapter,
else
res = IGC_XDP_TX;
break;
+ case XDP_REDIRECT:
+ if (xdp_do_redirect(adapter->netdev, xdp, prog) < 0)
+ res = IGC_XDP_CONSUMED;
+ else
+ res = IGC_XDP_REDIRECT;
+ break;
default:
bpf_warn_invalid_xdp_action(act);
fallthrough;
@@ -2087,6 +2095,9 @@ static void igc_finalize_xdp(struct igc_adapter *adapter, int status)
igc_flush_tx_descriptors(ring);
__netif_tx_unlock(nq);
}
+
+ if (status & IGC_XDP_REDIRECT)
+ xdp_do_flush();
}
static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
@@ -2155,6 +2166,7 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
rx_buffer->pagecnt_bias++;
break;
case IGC_XDP_TX:
+ case IGC_XDP_REDIRECT:
igc_rx_buffer_flip(rx_buffer, truesize);
xdp_status |= xdp_res;
break;
@@ -5119,6 +5131,46 @@ static int igc_bpf(struct net_device *dev, struct netdev_bpf *bpf)
}
}
+static int igc_xdp_xmit(struct net_device *dev, int num_frames,
+ struct xdp_frame **frames, u32 flags)
+{
+ struct igc_adapter *adapter = netdev_priv(dev);
+ int cpu = smp_processor_id();
+ struct netdev_queue *nq;
+ struct igc_ring *ring;
+ int i, drops;
+
+ if (unlikely(test_bit(__IGC_DOWN, &adapter->state)))
+ return -ENETDOWN;
+
+ if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
+ return -EINVAL;
+
+ ring = igc_xdp_get_tx_ring(adapter, cpu);
+ nq = txring_txq(ring);
+
+ __netif_tx_lock(nq, cpu);
+
+ drops = 0;
+ for (i = 0; i < num_frames; i++) {
+ int err;
+ struct xdp_frame *xdpf = frames[i];
+
+ err = igc_xdp_init_tx_descriptor(ring, xdpf);
+ if (err) {
+ xdp_return_frame_rx_napi(xdpf);
+ drops++;
+ }
+ }
+
+ if (flags & XDP_XMIT_FLUSH)
+ igc_flush_tx_descriptors(ring);
+
+ __netif_tx_unlock(nq);
+
+ return num_frames - drops;
+}
+
static const struct net_device_ops igc_netdev_ops = {
.ndo_open = igc_open,
.ndo_stop = igc_close,
@@ -5133,6 +5185,7 @@ static const struct net_device_ops igc_netdev_ops = {
.ndo_do_ioctl = igc_ioctl,
.ndo_setup_tc = igc_setup_tc,
.ndo_bpf = igc_bpf,
+ .ndo_xdp_xmit = igc_xdp_xmit,
};
/* PCIe configuration access */
--
2.17.1
next prev parent reply other threads:[~2021-02-09 2:41 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-09 2:41 [Intel-wired-lan] [PATCH net-next v5 0/9] igc: Add XDP support Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 1/9] igc: Fix igc_ptp_rx_pktstamp() Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 2/9] igc: Remove unused argument from igc_tx_cmd_type() Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 3/9] igc: Introduce igc_rx_buffer_flip() helper Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 4/9] igc: Introduce igc_get_rx_frame_truesize() helper Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 5/9] igc: Refactor Rx timestamp handling Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 6/9] igc: Add set/clear large buffer helpers Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 7/9] igc: Add initial XDP support Vedang Patel
2021-02-09 2:41 ` [Intel-wired-lan] [PATCH net-next v5 8/9] igc: Add support for XDP_TX action Vedang Patel
2021-02-09 2:41 ` Vedang Patel [this message]
2021-02-10 1:47 ` [Intel-wired-lan] [PATCH net-next v5 9/9] igc: Add support for XDP_REDIRECT action Nguyen, Anthony L
2021-02-10 17:50 ` Patel, Vedang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210209024141.23298-10-vedang.patel@intel.com \
--to=vedang.patel@intel.com \
--cc=intel-wired-lan@osuosl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox