All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v12 bpf-next 00/18] mvneta: introduce XDP multi-buffer support
@ 2021-08-20 15:40 Lorenzo Bianconi
  2021-08-20 15:40 ` [PATCH v12 bpf-next 01/18] net: skbuff: add size metadata to skb_shared_info for xdp Lorenzo Bianconi
                   ` (18 more replies)
  0 siblings, 19 replies; 39+ messages in thread
From: Lorenzo Bianconi @ 2021-08-20 15:40 UTC (permalink / raw)
  To: bpf, netdev
  Cc: lorenzo.bianconi, davem, kuba, ast, daniel, shayagr,
	john.fastabend, dsahern, brouer, echaudro, jasowang,
	alexander.duyck, saeed, maciej.fijalkowski, magnus.karlsson,
	tirthendu.sarkar, toke

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=y, Size: 7669 bytes --]

This series introduce XDP multi-buffer support. The mvneta driver is
the first to support these new "non-linear" xdp_{buff,frame}. Reviewers
please focus on how these new types of xdp_{buff,frame} packets
traverse the different layers and the layout design. It is on purpose
that BPF-helpers are kept simple, as we don't want to expose the
internal layout to allow later changes.

The main idea for the new multi-buffer layout is to reuse the same
structure used for non-linear SKB. This rely on the "skb_shared_info"
struct at the end of the first buffer to link together subsequent
buffers. Keeping the layout compatible with SKBs is also done to ease
and speedup creating a SKB from an xdp_{buff,frame}.
Converting xdp_frame to SKB and deliver it to the network stack is shown
in patch 05/18 (e.g. cpumaps).

A multi-buffer bit (mb) has been introduced in the flags field of xdp_{buff,frame}
structure to notify the bpf/network layer if this is a xdp multi-buffer frame
(mb = 1) or not (mb = 0).
The mb bit will be set by a xdp multi-buffer capable driver only for
non-linear frames maintaining the capability to receive linear frames
without any extra cost since the skb_shared_info structure at the end
of the first buffer will be initialized only if mb is set.
Moreover the flags field in xdp_{buff,frame} will be reused even for
xdp rx csum offloading in future series.

Typical use cases for this series are:
- Jumbo-frames
- Packet header split (please see Google’s use-case @ NetDevConf 0x14, [0])
- TSO/GRO

The two following ebpf helpers (and related selftests) has been introduced:
- bpf_xdp_adjust_data:
  Move xdp_md->data and xdp_md->data_end pointers in subsequent fragments
  according to the offset provided by the ebpf program. This helper can be
  used to read/write values in frame payload.
- bpf_xdp_get_buff_len:
  Return the total frame size (linear + paged parts)

bpf_xdp_adjust_tail and bpf_xdp_copy helpers have been modified to take into
account xdp multi-buff frames.

More info about the main idea behind this approach can be found here [1][2].

Changes since v11:
- add missing static to bpf_xdp_get_buff_len_proto structure
- fix bpf_xdp_adjust_data helper when offset is smaller than linear area length.

Changes since v10:
- move xdp->data to the requested payload offset instead of to the beginning of
  the fragment in bpf_xdp_adjust_data()

Changes since v9:
- introduce bpf_xdp_adjust_data helper and related selftest
- add xdp_frags_size and xdp_frags_tsize fields in skb_shared_info
- introduce xdp_update_skb_shared_info utility routine in ordere to not reset
  frags array in skb_shared_info converting from a xdp_buff/xdp_frame to a skb 
- simplify bpf_xdp_copy routine

Changes since v8:
- add proper dma unmapping if XDP_TX fails on mvneta for a xdp multi-buff
- switch back to skb_shared_info implementation from previous xdp_shared_info
  one
- avoid using a bietfield in xdp_buff/xdp_frame since it introduces performance
  regressions. Tested now on 10G NIC (ixgbe) to verify there are no performance
  penalties for regular codebase
- add bpf_xdp_get_buff_len helper and remove frame_length field in xdp ctx
- add data_len field in skb_shared_info struct
- introduce XDP_FLAGS_FRAGS_PF_MEMALLOC flag

Changes since v7:
- rebase on top of bpf-next
- fix sparse warnings
- improve comments for frame_length in include/net/xdp.h

Changes since v6:
- the main difference respect to previous versions is the new approach proposed
  by Eelco to pass full length of the packet to eBPF layer in XDP context
- reintroduce multi-buff support to eBPF kself-tests
- reintroduce multi-buff support to bpf_xdp_adjust_tail helper
- introduce multi-buffer support to bpf_xdp_copy helper
- rebase on top of bpf-next

Changes since v5:
- rebase on top of bpf-next
- initialize mb bit in xdp_init_buff() and drop per-driver initialization
- drop xdp->mb initialization in xdp_convert_zc_to_xdp_frame()
- postpone introduction of frame_length field in XDP ctx to another series
- minor changes

Changes since v4:
- rebase ontop of bpf-next
- introduce xdp_shared_info to build xdp multi-buff instead of using the
  skb_shared_info struct
- introduce frame_length in xdp ctx
- drop previous bpf helpers
- fix bpf_xdp_adjust_tail for xdp multi-buff
- introduce xdp multi-buff self-tests for bpf_xdp_adjust_tail
- fix xdp_return_frame_bulk for xdp multi-buff

Changes since v3:
- rebase ontop of bpf-next
- add patch 10/13 to copy back paged data from a xdp multi-buff frame to
  userspace buffer for xdp multi-buff selftests

Changes since v2:
- add throughput measurements
- drop bpf_xdp_adjust_mb_header bpf helper
- introduce selftest for xdp multibuffer
- addressed comments on bpf_xdp_get_frags_count
- introduce xdp multi-buff support to cpumaps

Changes since v1:
- Fix use-after-free in xdp_return_{buff/frame}
- Introduce bpf helpers
- Introduce xdp_mb sample program
- access skb_shared_info->nr_frags only on the last fragment

Changes since RFC:
- squash multi-buffer bit initialization in a single patch
- add mvneta non-linear XDP buff support for tx side

[0] https://netdevconf.info/0x14/session.html?talk-the-path-to-tcp-4k-mtu-and-rx-zerocopy
[1] https://github.com/xdp-project/xdp-project/blob/master/areas/core/xdp-multi-buffer01-design.org
[2] https://netdevconf.info/0x14/session.html?tutorial-add-XDP-support-to-a-NIC-driver (XDPmulti-buffers section)

Eelco Chaudron (3):
  bpf: add multi-buff support to the bpf_xdp_adjust_tail() API
  bpf: add multi-buffer support to xdp copy helpers
  bpf: update xdp_adjust_tail selftest to include multi-buffer

Lorenzo Bianconi (15):
  net: skbuff: add size metadata to skb_shared_info for xdp
  xdp: introduce flags field in xdp_buff/xdp_frame
  net: mvneta: update mb bit before passing the xdp buffer to eBPF layer
  net: mvneta: simplify mvneta_swbm_add_rx_fragment management
  net: xdp: add xdp_update_skb_shared_info utility routine
  net: marvell: rely on xdp_update_skb_shared_info utility routine
  xdp: add multi-buff support to xdp_return_{buff/frame}
  net: mvneta: add multi buffer support to XDP_TX
  net: mvneta: enable jumbo frames for XDP
  bpf: introduce bpf_xdp_get_buff_len helper
  bpf: move user_size out of bpf_test_init
  bpf: introduce multibuff support to bpf_prog_test_run_xdp()
  bpf: test_run: add xdp_shared_info pointer in bpf_test_finish
    signature
  net: xdp: introduce bpf_xdp_adjust_data helper
  bpf: add bpf_xdp_adjust_data selftest

 drivers/net/ethernet/marvell/mvneta.c         | 204 ++++++++++-------
 include/linux/skbuff.h                        |   6 +-
 include/net/xdp.h                             |  95 +++++++-
 include/uapi/linux/bpf.h                      |  39 ++++
 kernel/trace/bpf_trace.c                      |   3 +
 net/bpf/test_run.c                            | 117 ++++++++--
 net/core/filter.c                             | 213 +++++++++++++++++-
 net/core/xdp.c                                |  76 ++++++-
 tools/include/uapi/linux/bpf.h                |  39 ++++
 .../bpf/prog_tests/xdp_adjust_data.c          |  55 +++++
 .../bpf/prog_tests/xdp_adjust_tail.c          | 118 ++++++++++
 .../selftests/bpf/prog_tests/xdp_bpf2bpf.c    | 151 +++++++++----
 .../bpf/progs/test_xdp_adjust_tail_grow.c     |  10 +-
 .../bpf/progs/test_xdp_adjust_tail_shrink.c   |  32 ++-
 .../selftests/bpf/progs/test_xdp_bpf2bpf.c    |   2 +-
 .../bpf/progs/test_xdp_update_frags.c         |  41 ++++
 16 files changed, 1036 insertions(+), 165 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_adjust_data.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_update_frags.c

-- 
2.31.1


^ permalink raw reply	[flat|nested] 39+ messages in thread
* Re: [PATCH v12 bpf-next 05/18] net: xdp: add xdp_update_skb_shared_info utility routine
@ 2021-08-29 13:27 kernel test robot
  0 siblings, 0 replies; 39+ messages in thread
From: kernel test robot @ 2021-08-29 13:27 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 6384 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <3d98cda6f49ef9ff34d2aec3d00924592b4739e3.1629473233.git.lorenzo@kernel.org>
References: <3d98cda6f49ef9ff34d2aec3d00924592b4739e3.1629473233.git.lorenzo@kernel.org>
TO: Lorenzo Bianconi <lorenzo@kernel.org>
TO: bpf(a)vger.kernel.org
TO: netdev(a)vger.kernel.org
CC: lorenzo.bianconi(a)redhat.com
CC: davem(a)davemloft.net
CC: kuba(a)kernel.org
CC: ast(a)kernel.org
CC: daniel(a)iogearbox.net
CC: shayagr(a)amazon.com
CC: john.fastabend(a)gmail.com
CC: dsahern(a)kernel.org

Hi Lorenzo,

I love your patch! Perhaps something to improve:

[auto build test WARNING on bpf-next/master]

url:    https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/mvneta-introduce-XDP-multi-buffer-support/20210820-234736
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
:::::: branch date: 9 days ago
:::::: commit date: 9 days ago
config: i386-randconfig-m021-20210829 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
net/core/xdp.c:568 __xdp_build_skb_from_frame() error: uninitialized symbol 'nr_frags'.
net/core/xdp.c:569 __xdp_build_skb_from_frame() error: uninitialized symbol 'frag_size'.
net/core/xdp.c:569 __xdp_build_skb_from_frame() error: uninitialized symbol 'frag_tsize'.

vim +/nr_frags +568 net/core/xdp.c

65e6dcf73398dd Lorenzo Bianconi 2021-01-29  529  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  530  struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  531  					   struct sk_buff *skb,
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  532  					   struct net_device *dev)
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  533  {
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  534  	unsigned int frag_size, frag_tsize;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  535  	unsigned int headroom, frame_size;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  536  	void *hard_start;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  537  	u8 nr_frags;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  538  
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  539  	/* xdp multi-buff frame */
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  540  	if (unlikely(xdp_frame_is_mb(xdpf))) {
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  541  		struct skb_shared_info *sinfo;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  542  
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  543  		sinfo = xdp_get_shared_info_from_frame(xdpf);
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  544  		frag_tsize = sinfo->xdp_frags_tsize;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  545  		frag_size = sinfo->xdp_frags_size;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  546  		nr_frags = sinfo->nr_frags;
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  547  	}
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  548  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  549  	/* Part of headroom was reserved to xdpf */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  550  	headroom = sizeof(*xdpf) + xdpf->headroom;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  551  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  552  	/* Memory size backing xdp_frame data already have reserved
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  553  	 * room for build_skb to place skb_shared_info in tailroom.
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  554  	 */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  555  	frame_size = xdpf->frame_sz;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  556  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  557  	hard_start = xdpf->data - headroom;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  558  	skb = build_skb_around(skb, hard_start, frame_size);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  559  	if (unlikely(!skb))
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  560  		return NULL;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  561  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  562  	skb_reserve(skb, headroom);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  563  	__skb_put(skb, xdpf->len);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  564  	if (xdpf->metasize)
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  565  		skb_metadata_set(skb, xdpf->metasize);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  566  
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  567  	if (unlikely(xdp_frame_is_mb(xdpf)))
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20 @568  		xdp_update_skb_shared_info(skb, nr_frags,
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20 @569  					   frag_size, frag_tsize,
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  570  					   xdp_frame_is_frag_pfmemalloc(xdpf));
2f8c6ede2e6e56 Lorenzo Bianconi 2021-08-20  571  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  572  	/* Essential SKB info: protocol and skb->dev */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  573  	skb->protocol = eth_type_trans(skb, dev);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  574  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  575  	/* Optional SKB info, currently missing:
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  576  	 * - HW checksum info		(skb->ip_summed)
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  577  	 * - HW RX hash			(skb_set_hash)
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  578  	 * - RX ring dev queue index	(skb_record_rx_queue)
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  579  	 */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  580  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  581  	/* Until page_pool get SKB return path, release DMA here */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  582  	xdp_release_frame(xdpf);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  583  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  584  	/* Allow SKB to reuse area used by xdp_frame */
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  585  	xdp_scrub_frame(xdpf);
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  586  
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  587  	return skb;
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  588  }
97a0e1ea7b41c2 Lorenzo Bianconi 2021-01-12  589  EXPORT_SYMBOL_GPL(__xdp_build_skb_from_frame);
89f479f0eccfc8 Lorenzo Bianconi 2021-01-12  590  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36789 bytes --]

^ permalink raw reply	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2021-09-07  8:35 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-20 15:40 [PATCH v12 bpf-next 00/18] mvneta: introduce XDP multi-buffer support Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 01/18] net: skbuff: add size metadata to skb_shared_info for xdp Lorenzo Bianconi
2021-08-31 23:13   ` John Fastabend
2021-09-03 17:13     ` Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 02/18] xdp: introduce flags field in xdp_buff/xdp_frame Lorenzo Bianconi
2021-08-31 23:15   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 03/18] net: mvneta: update mb bit before passing the xdp buffer to eBPF layer Lorenzo Bianconi
2021-08-31 23:23   ` John Fastabend
2021-09-03 17:23     ` Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 04/18] net: mvneta: simplify mvneta_swbm_add_rx_fragment management Lorenzo Bianconi
2021-08-31 23:34   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 05/18] net: xdp: add xdp_update_skb_shared_info utility routine Lorenzo Bianconi
2021-08-31 23:38   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 06/18] net: marvell: rely on " Lorenzo Bianconi
2021-08-31 23:41   ` John Fastabend
2021-09-03 17:27     ` Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 07/18] xdp: add multi-buff support to xdp_return_{buff/frame} Lorenzo Bianconi
2021-08-31 23:43   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 08/18] net: mvneta: add multi buffer support to XDP_TX Lorenzo Bianconi
2021-08-31 23:44   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 09/18] net: mvneta: enable jumbo frames for XDP Lorenzo Bianconi
2021-08-31 23:45   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 10/18] bpf: add multi-buff support to the bpf_xdp_adjust_tail() API Lorenzo Bianconi
2021-09-01  0:10   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 11/18] bpf: introduce bpf_xdp_get_buff_len helper Lorenzo Bianconi
2021-09-01  0:12   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 12/18] bpf: add multi-buffer support to xdp copy helpers Lorenzo Bianconi
2021-09-01  0:19   ` John Fastabend
2021-08-20 15:40 ` [PATCH v12 bpf-next 13/18] bpf: move user_size out of bpf_test_init Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 14/18] bpf: introduce multibuff support to bpf_prog_test_run_xdp() Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 15/18] bpf: test_run: add xdp_shared_info pointer in bpf_test_finish signature Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 16/18] bpf: update xdp_adjust_tail selftest to include multi-buffer Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 17/18] net: xdp: introduce bpf_xdp_adjust_data helper Lorenzo Bianconi
2021-09-01  0:36   ` John Fastabend
2021-09-03 17:57     ` Lorenzo Bianconi
2021-08-20 15:40 ` [PATCH v12 bpf-next 18/18] bpf: add bpf_xdp_adjust_data selftest Lorenzo Bianconi
2021-09-01  0:45 ` [PATCH v12 bpf-next 00/18] mvneta: introduce XDP multi-buffer support John Fastabend
2021-09-07  8:35   ` Lorenzo Bianconi
2021-08-29 13:27 [PATCH v12 bpf-next 05/18] net: xdp: add xdp_update_skb_shared_info utility routine kernel test robot

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.