From: Jesper Dangaard Brouer <brouer@redhat.com> To: sameehj@amazon.com Cc: intel-wired-lan@lists.osuosl.org, "Jeff Kirsher" <jeffrey.t.kirsher@intel.com>, "Alexander Duyck" <alexander.duyck@gmail.com>, "Jesper Dangaard Brouer" <brouer@redhat.com>, netdev@vger.kernel.org, bpf@vger.kernel.org, zorik@amazon.com, akiyano@amazon.com, gtzalik@amazon.com, "Toke Høiland-Jørgensen" <toke@redhat.com>, "Daniel Borkmann" <borkmann@iogearbox.net>, "Alexei Starovoitov" <alexei.starovoitov@gmail.com>, "John Fastabend" <john.fastabend@gmail.com>, "Alexander Duyck" <alexander.duyck@gmail.com>, "Jeff Kirsher" <jeffrey.t.kirsher@intel.com>, "David Ahern" <dsahern@gmail.com>, "Willem de Bruijn" <willemdebruijn.kernel@gmail.com>, "Ilias Apalodimas" <ilias.apalodimas@linaro.org>, "Lorenzo Bianconi" <lorenzo@kernel.org>, "Saeed Mahameed" <saeedm@mellanox.com> Subject: [PATCH RFC v2 26/33] i40e: add XDP frame size to driver Date: Wed, 08 Apr 2020 13:52:46 +0200 [thread overview] Message-ID: <158634676645.707275.7536684877295305696.stgit@firesoul> (raw) In-Reply-To: <158634658714.707275.7903484085370879864.stgit@firesoul> This driver uses different memory models depending on PAGE_SIZE at compile time. For PAGE_SIZE 4K it uses page splitting, meaning for normal MTU frame size is 2048 bytes (and headroom 192 bytes). For larger MTUs the driver still use page splitting, by allocating order-1 pages (8192 bytes) for RX frames. For PAGE_SIZE larger than 4K, driver instead advance its rx_buffer->page_offset with the frame size "truesize". For XDP frame size calculations, this mean that in PAGE_SIZE larger than 4K mode the frame_sz change on a per packet basis. For the page split 4K PAGE_SIZE mode, xdp.frame_sz is more constant and can be updated once outside the main NAPI loop. The default setting in the driver uses build_skb(), which provides the necessary headroom and tailroom for XDP-redirect in RX-frame (in both modes). There is one complication, which is legacy-rx mode (configurable via ethtool priv-flags). There are zero headroom in this mode, which is a requirement for XDP-redirect to work. The conversion to xdp_frame (convert_to_xdp_frame) will detect this insufficient space, and xdp_do_redirect() call will fail. This is deemed acceptable, as it allows other XDP actions to still work in legacy-mode. In legacy-mode + larger PAGE_SIZE due to lacking tailroom, we also accept that xdp_adjust_tail shrink doesn't work. Cc: intel-wired-lan@lists.osuosl.org Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Cc: Alexander Duyck <alexander.duyck@gmail.com> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> --- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 31 +++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index b8496037ef7f..1fb6b1004dcb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -1507,6 +1507,23 @@ static inline unsigned int i40e_rx_offset(struct i40e_ring *rx_ring) return ring_uses_build_skb(rx_ring) ? I40E_SKB_PAD : 0; } +static inline unsigned int i40e_rx_frame_truesize(struct i40e_ring *rx_ring, + unsigned int size) +{ + unsigned int truesize; + +#if (PAGE_SIZE < 8192) + truesize = i40e_rx_pg_size(rx_ring) / 2; /* Must be power-of-2 */ +#else + truesize = i40e_rx_offset(rx_ring) ? + SKB_DATA_ALIGN(size + i40e_rx_offset(rx_ring)) + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) : + SKB_DATA_ALIGN(size); +#endif + return truesize; +} + + /** * i40e_alloc_mapped_page - recycle or make a new page * @rx_ring: ring to use @@ -2246,13 +2263,11 @@ static void i40e_rx_buffer_flip(struct i40e_ring *rx_ring, struct i40e_rx_buffer *rx_buffer, unsigned int size) { -#if (PAGE_SIZE < 8192) - unsigned int truesize = i40e_rx_pg_size(rx_ring) / 2; + unsigned int truesize = i40e_rx_frame_truesize(rx_ring, size); +#if (PAGE_SIZE < 8192) rx_buffer->page_offset ^= truesize; #else - unsigned int truesize = SKB_DATA_ALIGN(i40e_rx_offset(rx_ring) + size); - rx_buffer->page_offset += truesize; #endif } @@ -2335,6 +2350,9 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) bool failure = false; struct xdp_buff xdp; +#if (PAGE_SIZE < 8192) + xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, 0); +#endif xdp.rxq = &rx_ring->xdp_rxq; while (likely(total_rx_packets < (unsigned int)budget)) { @@ -2389,7 +2407,10 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) xdp.data_hard_start = xdp.data - i40e_rx_offset(rx_ring); xdp.data_end = xdp.data + size; - +#if (PAGE_SIZE > 4096) + /* At larger PAGE_SIZE, frame_sz depend on len size */ + xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, size); +#endif skb = i40e_run_xdp(rx_ring, &xdp); }
WARNING: multiple messages have this Message-ID (diff)
From: Jesper Dangaard Brouer <brouer@redhat.com> To: intel-wired-lan@osuosl.org Subject: [Intel-wired-lan] [PATCH RFC v2 26/33] i40e: add XDP frame size to driver Date: Wed, 08 Apr 2020 13:52:46 +0200 [thread overview] Message-ID: <158634676645.707275.7536684877295305696.stgit@firesoul> (raw) In-Reply-To: <158634658714.707275.7903484085370879864.stgit@firesoul> This driver uses different memory models depending on PAGE_SIZE at compile time. For PAGE_SIZE 4K it uses page splitting, meaning for normal MTU frame size is 2048 bytes (and headroom 192 bytes). For larger MTUs the driver still use page splitting, by allocating order-1 pages (8192 bytes) for RX frames. For PAGE_SIZE larger than 4K, driver instead advance its rx_buffer->page_offset with the frame size "truesize". For XDP frame size calculations, this mean that in PAGE_SIZE larger than 4K mode the frame_sz change on a per packet basis. For the page split 4K PAGE_SIZE mode, xdp.frame_sz is more constant and can be updated once outside the main NAPI loop. The default setting in the driver uses build_skb(), which provides the necessary headroom and tailroom for XDP-redirect in RX-frame (in both modes). There is one complication, which is legacy-rx mode (configurable via ethtool priv-flags). There are zero headroom in this mode, which is a requirement for XDP-redirect to work. The conversion to xdp_frame (convert_to_xdp_frame) will detect this insufficient space, and xdp_do_redirect() call will fail. This is deemed acceptable, as it allows other XDP actions to still work in legacy-mode. In legacy-mode + larger PAGE_SIZE due to lacking tailroom, we also accept that xdp_adjust_tail shrink doesn't work. Cc: intel-wired-lan at lists.osuosl.org Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Cc: Alexander Duyck <alexander.duyck@gmail.com> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> --- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 31 +++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index b8496037ef7f..1fb6b1004dcb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -1507,6 +1507,23 @@ static inline unsigned int i40e_rx_offset(struct i40e_ring *rx_ring) return ring_uses_build_skb(rx_ring) ? I40E_SKB_PAD : 0; } +static inline unsigned int i40e_rx_frame_truesize(struct i40e_ring *rx_ring, + unsigned int size) +{ + unsigned int truesize; + +#if (PAGE_SIZE < 8192) + truesize = i40e_rx_pg_size(rx_ring) / 2; /* Must be power-of-2 */ +#else + truesize = i40e_rx_offset(rx_ring) ? + SKB_DATA_ALIGN(size + i40e_rx_offset(rx_ring)) + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) : + SKB_DATA_ALIGN(size); +#endif + return truesize; +} + + /** * i40e_alloc_mapped_page - recycle or make a new page * @rx_ring: ring to use @@ -2246,13 +2263,11 @@ static void i40e_rx_buffer_flip(struct i40e_ring *rx_ring, struct i40e_rx_buffer *rx_buffer, unsigned int size) { -#if (PAGE_SIZE < 8192) - unsigned int truesize = i40e_rx_pg_size(rx_ring) / 2; + unsigned int truesize = i40e_rx_frame_truesize(rx_ring, size); +#if (PAGE_SIZE < 8192) rx_buffer->page_offset ^= truesize; #else - unsigned int truesize = SKB_DATA_ALIGN(i40e_rx_offset(rx_ring) + size); - rx_buffer->page_offset += truesize; #endif } @@ -2335,6 +2350,9 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) bool failure = false; struct xdp_buff xdp; +#if (PAGE_SIZE < 8192) + xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, 0); +#endif xdp.rxq = &rx_ring->xdp_rxq; while (likely(total_rx_packets < (unsigned int)budget)) { @@ -2389,7 +2407,10 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) xdp.data_hard_start = xdp.data - i40e_rx_offset(rx_ring); xdp.data_end = xdp.data + size; - +#if (PAGE_SIZE > 4096) + /* At larger PAGE_SIZE, frame_sz depend on len size */ + xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, size); +#endif skb = i40e_run_xdp(rx_ring, &xdp); }
next prev parent reply other threads:[~2020-04-08 11:53 UTC|newest] Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-08 11:50 [Intel-wired-lan] [PATCH RFC v2 00/33] XDP extend with knowledge of frame size Jesper Dangaard Brouer 2020-04-08 11:50 ` [PATCH RFC v2 01/33] xdp: add frame size to xdp_buff Jesper Dangaard Brouer 2020-04-08 17:53 ` Jakub Kicinski 2020-04-09 0:48 ` Saeed Mahameed 2020-04-09 1:13 ` Jakub Kicinski 2020-04-09 23:07 ` Saeed Mahameed 2020-04-09 23:27 ` Jakub Kicinski 2020-04-14 14:16 ` Jesper Dangaard Brouer 2020-04-09 0:50 ` Saeed Mahameed 2020-04-16 13:02 ` Jesper Dangaard Brouer 2020-04-17 23:09 ` Saeed Mahameed 2020-04-08 11:50 ` [PATCH RFC v2 02/33] bnxt: add XDP frame size to driver Jesper Dangaard Brouer 2020-04-08 11:50 ` [PATCH RFC v2 03/33] sfc: add XDP frame size Jesper Dangaard Brouer 2020-04-08 11:50 ` [PATCH RFC v2 04/33] mvneta: add XDP frame size to driver Jesper Dangaard Brouer 2020-04-08 11:50 ` [PATCH RFC v2 05/33] net: netsec: Add support for XDP frame size Jesper Dangaard Brouer 2020-04-08 13:09 ` Lorenzo Bianconi 2020-04-14 8:07 ` Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 06/33] net: XDP-generic determining " Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 07/33] xdp: xdp_frame add member frame_sz and handle in convert_to_xdp_frame Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 08/33] xdp: cpumap redirect use frame_sz and increase skb_tailroom Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 09/33] veth: adjust hard_start offset on redirect XDP frames Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 10/33] veth: xdp using frame_sz in veth driver Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 11/33] dpaa2-eth: add XDP frame size Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 12/33] hv_netvsc: add XDP frame size to driver Jesper Dangaard Brouer 2020-04-08 14:56 ` Haiyang Zhang 2020-04-08 11:51 ` [PATCH RFC v2 13/33] qlogic/qede: " Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 14/33] net: ethernet: ti: add XDP frame size to driver cpsw Jesper Dangaard Brouer 2020-04-08 11:51 ` [PATCH RFC v2 15/33] ena: add XDP frame size to amazon NIC driver Jesper Dangaard Brouer 2020-04-22 8:39 ` Jubran, Samih 2020-04-08 11:51 ` [PATCH RFC v2 16/33] mlx4: add XDP frame size and adjust max XDP MTU Jesper Dangaard Brouer 2020-04-08 12:57 ` Tariq Toukan 2020-04-14 8:19 ` Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 17/33] mlx5: rx queue setup time determine frame_sz for XDP Jesper Dangaard Brouer 2020-04-08 12:52 ` Tariq Toukan 2020-04-16 12:04 ` Jesper Dangaard Brouer 2020-04-09 9:28 ` Maxim Mikityanskiy 2020-04-08 11:52 ` [PATCH RFC v2 18/33] net: thunderx: add XDP frame size Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 19/33] nfp: add XDP frame size to netronome driver Jesper Dangaard Brouer 2020-04-08 17:53 ` Jakub Kicinski 2020-04-14 14:02 ` Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 20/33] tun: add XDP frame size Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 21/33] vhost_net: also populate " Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 22/33] virtio_net: add XDP frame size in two code paths Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 23/33] ixgbe: fix XDP redirect on archs with PAGE_SIZE above 4K Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 24/33] ixgbe: add XDP frame size to driver Jesper Dangaard Brouer 2020-04-08 11:52 ` [Intel-wired-lan] " Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 25/33] ixgbevf: add XDP frame size to VF driver Jesper Dangaard Brouer 2020-04-08 11:52 ` [Intel-wired-lan] " Jesper Dangaard Brouer 2020-04-08 11:52 ` Jesper Dangaard Brouer [this message] 2020-04-08 11:52 ` [Intel-wired-lan] [PATCH RFC v2 26/33] i40e: add XDP frame size to driver Jesper Dangaard Brouer 2020-04-08 21:48 ` David Miller 2020-04-08 21:48 ` [Intel-wired-lan] " David Miller 2020-04-14 10:16 ` Jesper Dangaard Brouer 2020-04-14 10:16 ` [Intel-wired-lan] " Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 27/33] ice: " Jesper Dangaard Brouer 2020-04-08 11:52 ` [Intel-wired-lan] " Jesper Dangaard Brouer 2020-04-10 0:59 ` kbuild test robot 2020-04-14 10:39 ` Jesper Dangaard Brouer 2020-04-08 11:52 ` [PATCH RFC v2 28/33] xdp: for Intel AF_XDP drivers add XDP frame_sz Jesper Dangaard Brouer 2020-04-08 11:52 ` [Intel-wired-lan] " Jesper Dangaard Brouer 2020-04-08 17:31 ` Björn Töpel 2020-04-08 17:31 ` [Intel-wired-lan] " =?unknown-8bit?q?Bj=C3=B6rn_T=C3=B6pel?= 2020-04-09 9:33 ` Maxim Mikityanskiy 2020-04-09 9:33 ` [Intel-wired-lan] " Maxim Mikityanskiy 2020-04-08 11:53 ` [PATCH RFC v2 29/33] xdp: allow bpf_xdp_adjust_tail() to grow packet size Jesper Dangaard Brouer 2020-04-09 3:31 ` Saeed Mahameed 2020-04-14 12:46 ` Jesper Dangaard Brouer 2020-04-18 3:33 ` Saeed Mahameed 2020-04-14 9:56 ` Jesper Dangaard Brouer 2020-04-14 10:11 ` Toke Høiland-Jørgensen 2020-04-08 11:53 ` [PATCH RFC v2 30/33] xdp: clear grow memory in bpf_xdp_adjust_tail() Jesper Dangaard Brouer 2020-04-08 21:49 ` David Miller 2020-04-14 9:43 ` Jesper Dangaard Brouer 2020-04-08 11:53 ` [PATCH RFC v2 31/33] bpf: add xdp.frame_sz in bpf_prog_test_run_xdp() Jesper Dangaard Brouer 2020-04-08 11:53 ` [PATCH RFC v2 32/33] selftests/bpf: adjust BPF selftest for xdp_adjust_tail Jesper Dangaard Brouer 2020-04-08 11:53 ` [PATCH RFC v2 33/33] selftests/bpf: xdp_adjust_tail add grow tail tests Jesper Dangaard Brouer 2020-04-08 16:55 ` [PATCH RFC v2 00/33] XDP extend with knowledge of frame size Alexei Starovoitov 2020-04-08 16:55 ` [Intel-wired-lan] " Alexei Starovoitov
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=158634676645.707275.7536684877295305696.stgit@firesoul \ --to=brouer@redhat.com \ --cc=akiyano@amazon.com \ --cc=alexander.duyck@gmail.com \ --cc=alexei.starovoitov@gmail.com \ --cc=borkmann@iogearbox.net \ --cc=bpf@vger.kernel.org \ --cc=dsahern@gmail.com \ --cc=gtzalik@amazon.com \ --cc=ilias.apalodimas@linaro.org \ --cc=intel-wired-lan@lists.osuosl.org \ --cc=jeffrey.t.kirsher@intel.com \ --cc=john.fastabend@gmail.com \ --cc=lorenzo@kernel.org \ --cc=netdev@vger.kernel.org \ --cc=saeedm@mellanox.com \ --cc=sameehj@amazon.com \ --cc=toke@redhat.com \ --cc=willemdebruijn.kernel@gmail.com \ --cc=zorik@amazon.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.