{"id":1375801,"url":"http://patchwork.ozlabs.org/api/covers/1375801/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/cover/cover.1601648734.git.lorenzo@kernel.org/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<cover.1601648734.git.lorenzo@kernel.org>","list_archive_url":null,"date":"2020-10-02T14:41:58","name":"[v4,bpf-next,00/13] mvneta: introduce XDP multi-buffer support","submitter":{"id":76007,"url":"http://patchwork.ozlabs.org/api/people/76007/?format=json","name":"Lorenzo Bianconi","email":"lorenzo@kernel.org"},"mbox":"http://patchwork.ozlabs.org/project/netdev/cover/cover.1601648734.git.lorenzo@kernel.org/mbox/","series":[{"id":205635,"url":"http://patchwork.ozlabs.org/api/series/205635/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=205635","date":"2020-10-02T14:41:58","name":"mvneta: introduce XDP multi-buffer support","version":4,"mbox":"http://patchwork.ozlabs.org/series/205635/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/covers/1375801/comments/","headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming-netdev@ozlabs.org","Delivered-To":"patchwork-incoming-netdev@ozlabs.org","Authentication-Results":["ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=23.128.96.18; helo=vger.kernel.org;\n envelope-from=netdev-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=kernel.org","ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=default header.b=pLMteHAb;\n\tdkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [23.128.96.18])\n\tby ozlabs.org (Postfix) with ESMTP id 4C2t4d3NGxz9sSs\n\tfor <patchwork-incoming-netdev@ozlabs.org>;\n Sat,  3 Oct 2020 00:42:25 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n        id S2388157AbgJBOmY (ORCPT\n        <rfc822;patchwork-incoming-netdev@ozlabs.org>);\n        Fri, 2 Oct 2020 10:42:24 -0400","from mail.kernel.org ([198.145.29.99]:60676 \"EHLO mail.kernel.org\"\n        rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n        id S1726017AbgJBOmY (ORCPT <rfc822;netdev@vger.kernel.org>);\n        Fri, 2 Oct 2020 10:42:24 -0400","from lore-desk.redhat.com (unknown [176.207.245.61])\n        (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n        (No client certificate requested)\n        by mail.kernel.org (Postfix) with ESMTPSA id 45E01206FA;\n        Fri,  2 Oct 2020 14:42:21 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n        s=default; t=1601649743;\n        bh=6aooMorPufXd+5j7fELEzmOtThmUf51bnUTcnnVnnBM=;\n        h=From:To:Cc:Subject:Date:From;\n        b=pLMteHAbEu4zFoyT8YQ2k4giDh8kQfsBaAwS7Y6mlTAEH5wiid/BE5+zLD0P/UkPt\n         cj4aXxYEEHngdemJUV+9qY3rDJFOlJMIGmmMoyUvu2EEnRXtX2xtZvzKt0sQHrrLTH\n         3mRLf4y1AiIju8hevheKxxVeEE1ScfYfvg7igqn0=","From":"Lorenzo Bianconi <lorenzo@kernel.org>","To":"bpf@vger.kernel.org, netdev@vger.kernel.org","Cc":"davem@davemloft.net, kuba@kernel.org, ast@kernel.org,\n        daniel@iogearbox.net, shayagr@amazon.com, sameehj@amazon.com,\n        john.fastabend@gmail.com, dsahern@kernel.org, brouer@redhat.com,\n        lorenzo.bianconi@redhat.com, echaudro@redhat.com","Subject":"[PATCH v4 bpf-next 00/13] mvneta: introduce XDP multi-buffer support","Date":"Fri,  2 Oct 2020 16:41:58 +0200","Message-Id":"<cover.1601648734.git.lorenzo@kernel.org>","X-Mailer":"git-send-email 2.26.2","MIME-Version":"1.0","Content-Type":"text/plain; charset=y","Content-Transfer-Encoding":"8bit","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"This series introduce XDP multi-buffer support. The mvneta driver is\nthe first to support these new \"non-linear\" xdp_{buff,frame}. Reviewers\nplease focus on how these new types of xdp_{buff,frame} packets\ntraverse the different layers and the layout design. It is on purpose\nthat BPF-helpers are kept simple, as we don't want to expose the\ninternal layout to allow later changes.\n\nFor now, to keep the design simple and to maintain performance, the XDP\nBPF-prog (still) only have access to the first-buffer. It is left for\nlater (another patchset) to add payload access across multiple buffers.\nThis patchset should still allow for these future extensions. The goal\nis to lift the XDP MTU restriction that comes with XDP, but maintain\nsame performance as before.\n\nThe main idea for the new multi-buffer layout is to reuse the same\nlayout used for non-linear SKB. This rely on the \"skb_shared_info\"\nstruct at the end of the first buffer to link together subsequent\nbuffers. Keeping the layout compatible with SKBs is also done to ease\nand speedup creating an SKB from an xdp_{buff,frame}. Converting\nxdp_frame to SKB and deliver it to the network stack is shown in cpumap\ncode (patch 13/13).\n\nA multi-buffer bit (mb) has been introduced in xdp_{buff,frame} structure\nto notify the bpf/network layer if this is a xdp multi-buffer frame (mb = 1)\nor not (mb = 0).\nThe mb bit will be set by a xdp multi-buffer capable driver only for\nnon-linear frames maintaining the capability to receive linear frames\nwithout any extra cost since the skb_shared_info structure at the end\nof the first buffer will be initialized only if mb is set.\n\nIn order to provide to userspace some metdata about the non-linear\nxdp_{buff,frame}, we introduced 2 bpf helpers:\n- bpf_xdp_get_frags_count:\n  get the number of fragments for a given xdp multi-buffer.\n- bpf_xdp_get_frags_total_size:\n  get the total size of fragments for a given xdp multi-buffer.\n\nTypical use cases for this series are:\n- Jumbo-frames\n- Packet header split (please see Google’s use-case @ NetDevConf 0x14, [0])\n- TSO\n\nMore info about the main idea behind this approach can be found here [1][2].\n\nWe carried out some throughput tests in a standard linear frame scenario in order\nto verify we did not introduced any performance regression adding xdp multi-buff\nsupport to mvneta:\n\noffered load is ~ 1000Kpps, packet size is 64B, mvneta descriptor size is one PAGE\n\ncommit: 879456bedbe5 (\"net: mvneta: avoid possible cache misses in mvneta_rx_swbm\")\n- xdp-pass:      ~162Kpps\n- xdp-drop:      ~701Kpps\n- xdp-tx:        ~185Kpps\n- xdp-redirect:  ~202Kpps\n\nmvneta xdp multi-buff:\n- xdp-pass:      ~163Kpps\n- xdp-drop:      ~739Kpps\n- xdp-tx:        ~182Kpps\n- xdp-redirect:  ~202Kpps\n\nChanges since v3:\n- rebase ontop of bpf-next\n- add patch 10/13 to copy back paged data from a xdp multi-buff frame to\n  userspace buffer for xdp multi-buff selftests\n\nChanges since v2:\n- add throughput measurements\n- drop bpf_xdp_adjust_mb_header bpf helper\n- introduce selftest for xdp multibuffer\n- addressed comments on bpf_xdp_get_frags_count\n- introduce xdp multi-buff support to cpumaps\n\nChanges since v1:\n- Fix use-after-free in xdp_return_{buff/frame}\n- Introduce bpf helpers\n- Introduce xdp_mb sample program\n- access skb_shared_info->nr_frags only on the last fragment\n\nChanges since RFC:\n- squash multi-buffer bit initialization in a single patch\n- add mvneta non-linear XDP buff support for tx side\n\n[0] https://netdevconf.info/0x14/session.html?talk-the-path-to-tcp-4k-mtu-and-rx-zerocopy\n[1] https://github.com/xdp-project/xdp-project/blob/master/areas/core/xdp-multi-buffer01-design.org\n[2] https://netdevconf.info/0x14/session.html?tutorial-add-XDP-support-to-a-NIC-driver (XDPmulti-buffers section)\n\nLorenzo Bianconi (11):\n  xdp: introduce mb in xdp_buff/xdp_frame\n  xdp: initialize xdp_buff mb bit to 0 in all XDP drivers\n  net: mvneta: update mb bit before passing the xdp buffer to eBPF layer\n  xdp: add multi-buff support to xdp_return_{buff/frame}\n  net: mvneta: add multi buffer support to XDP_TX\n  bpf: move user_size out of bpf_test_init\n  bpf: introduce multibuff support to bpf_prog_test_run_xdp()\n  bpf: test_run: add skb_shared_info pointer in bpf_test_finish\n    signature\n  bpf: add xdp multi-buffer selftest\n  net: mvneta: enable jumbo frames for XDP\n  bpf: cpumap: introduce xdp multi-buff support\n\nSameeh Jubran (2):\n  bpf: introduce bpf_xdp_get_frags_{count, total_size} helpers\n  samples/bpf: add bpf program that uses xdp mb helpers\n\n drivers/net/ethernet/amazon/ena/ena_netdev.c  |   1 +\n drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |   1 +\n .../net/ethernet/cavium/thunder/nicvf_main.c  |   1 +\n .../net/ethernet/freescale/dpaa2/dpaa2-eth.c  |   1 +\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   |   1 +\n drivers/net/ethernet/intel/ice/ice_txrx.c     |   1 +\n drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |   1 +\n .../net/ethernet/intel/ixgbevf/ixgbevf_main.c |   1 +\n drivers/net/ethernet/marvell/mvneta.c         | 131 +++++++------\n .../net/ethernet/marvell/mvpp2/mvpp2_main.c   |   1 +\n drivers/net/ethernet/mellanox/mlx4/en_rx.c    |   1 +\n .../net/ethernet/mellanox/mlx5/core/en_rx.c   |   1 +\n .../ethernet/netronome/nfp/nfp_net_common.c   |   1 +\n drivers/net/ethernet/qlogic/qede/qede_fp.c    |   1 +\n drivers/net/ethernet/sfc/rx.c                 |   1 +\n drivers/net/ethernet/socionext/netsec.c       |   1 +\n drivers/net/ethernet/ti/cpsw.c                |   1 +\n drivers/net/ethernet/ti/cpsw_new.c            |   1 +\n drivers/net/hyperv/netvsc_bpf.c               |   1 +\n drivers/net/tun.c                             |   2 +\n drivers/net/veth.c                            |   1 +\n drivers/net/virtio_net.c                      |   2 +\n drivers/net/xen-netfront.c                    |   1 +\n include/net/xdp.h                             |  31 ++-\n include/uapi/linux/bpf.h                      |  14 ++\n kernel/bpf/cpumap.c                           |  45 +----\n net/bpf/test_run.c                            | 118 ++++++++++--\n net/core/dev.c                                |   1 +\n net/core/filter.c                             |  42 ++++\n net/core/xdp.c                                | 104 ++++++++++\n samples/bpf/Makefile                          |   3 +\n samples/bpf/xdp_mb_kern.c                     |  68 +++++++\n samples/bpf/xdp_mb_user.c                     | 182 ++++++++++++++++++\n tools/include/uapi/linux/bpf.h                |  14 ++\n .../testing/selftests/bpf/prog_tests/xdp_mb.c |  79 ++++++++\n .../selftests/bpf/progs/test_xdp_multi_buff.c |  24 +++\n 36 files changed, 757 insertions(+), 123 deletions(-)\n create mode 100644 samples/bpf/xdp_mb_kern.c\n create mode 100644 samples/bpf/xdp_mb_user.c\n create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_mb.c\n create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_multi_buff.c"}