{"id":1375814,"url":"http://patchwork.ozlabs.org/api/patches/1375814/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/94ff09e2b8bf01eade7ae73d3cb0984423d3abe9.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":"<94ff09e2b8bf01eade7ae73d3cb0984423d3abe9.1601648734.git.lorenzo@kernel.org>","list_archive_url":null,"date":"2020-10-02T14:42:11","name":"[v4,bpf-next,13/13] bpf: cpumap: introduce xdp multi-buff support","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":false,"hash":"75b2bb282ab0290da4a8ffb89f0a5903f4535e56","submitter":{"id":76007,"url":"http://patchwork.ozlabs.org/api/people/76007/?format=json","name":"Lorenzo Bianconi","email":"lorenzo@kernel.org"},"delegate":{"id":77147,"url":"http://patchwork.ozlabs.org/api/users/77147/?format=json","username":"bpf","first_name":"BPF","last_name":"Maintainers","email":"bpf@iogearbox.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/94ff09e2b8bf01eade7ae73d3cb0984423d3abe9.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/patches/1375814/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/1375814/checks/","tags":{},"related":[],"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=pEQUqqJu;\n\tdkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [23.128.96.18])\n\tby ozlabs.org (Postfix) with ESMTP id 4C2t5j3ClDz9s1t\n\tfor <patchwork-incoming-netdev@ozlabs.org>;\n Sat,  3 Oct 2020 00:43:21 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n        id S2388248AbgJBOnU (ORCPT\n        <rfc822;patchwork-incoming-netdev@ozlabs.org>);\n        Fri, 2 Oct 2020 10:43:20 -0400","from mail.kernel.org ([198.145.29.99]:32926 \"EHLO mail.kernel.org\"\n        rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n        id S2388016AbgJBOnT (ORCPT <rfc822;netdev@vger.kernel.org>);\n        Fri, 2 Oct 2020 10:43:19 -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 C65532074B;\n        Fri,  2 Oct 2020 14:43:16 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n        s=default; t=1601649799;\n        bh=X2lmksPI9nQGFdNp2KO6XfRfikz0sJW9YQmr7+W2m0s=;\n        h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n        b=pEQUqqJuqx7p7XIZ6+r+zOGFkrQuivzVp4kcEpDVq9NW+j/RKCkpJyH8rWvW8GVg1\n         az4qE3/3OHytiT0gCY/RF6RhTPujZBKLkNGnR/hF5q9HqT9uEfJNzUu6KC8mZCpeXu\n         7FQ9G1gvJU8t48BtOU9nw38RG5dx5nnTU6akzp10=","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 13/13] bpf: cpumap: introduce xdp multi-buff\n support","Date":"Fri,  2 Oct 2020 16:42:11 +0200","Message-Id":"\n <94ff09e2b8bf01eade7ae73d3cb0984423d3abe9.1601648734.git.lorenzo@kernel.org>","X-Mailer":"git-send-email 2.26.2","In-Reply-To":"<cover.1601648734.git.lorenzo@kernel.org>","References":"<cover.1601648734.git.lorenzo@kernel.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"Introduce __xdp_build_skb_from_frame and xdp_build_skb_from_frame\nutility routines to build the skb from xdp_frame.\nAdd xdp multi-buff support to cpumap\n\nSigned-off-by: Lorenzo Bianconi <lorenzo@kernel.org>\n---\n include/net/xdp.h   |  5 ++++\n kernel/bpf/cpumap.c | 45 +------------------------------\n net/core/xdp.c      | 64 +++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 70 insertions(+), 44 deletions(-)","diff":"diff --git a/include/net/xdp.h b/include/net/xdp.h\nindex 4d47076546ff..8d9224ef75ee 100644\n--- a/include/net/xdp.h\n+++ b/include/net/xdp.h\n@@ -134,6 +134,11 @@ void xdp_warn(const char *msg, const char *func, const int line);\n #define XDP_WARN(msg) xdp_warn(msg, __func__, __LINE__)\n \n struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp);\n+struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,\n+\t\t\t\t\t   struct sk_buff *skb,\n+\t\t\t\t\t   struct net_device *dev);\n+struct sk_buff *xdp_build_skb_from_frame(struct xdp_frame *xdpf,\n+\t\t\t\t\t struct net_device *dev);\n \n static inline\n void xdp_convert_frame_to_buff(struct xdp_frame *frame, struct xdp_buff *xdp)\ndiff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c\nindex c61a23b564aa..fa07b4226836 100644\n--- a/kernel/bpf/cpumap.c\n+++ b/kernel/bpf/cpumap.c\n@@ -155,49 +155,6 @@ static void cpu_map_kthread_stop(struct work_struct *work)\n \tkthread_stop(rcpu->kthread);\n }\n \n-static struct sk_buff *cpu_map_build_skb(struct xdp_frame *xdpf,\n-\t\t\t\t\t struct sk_buff *skb)\n-{\n-\tunsigned int hard_start_headroom;\n-\tunsigned int frame_size;\n-\tvoid *pkt_data_start;\n-\n-\t/* Part of headroom was reserved to xdpf */\n-\thard_start_headroom = sizeof(struct xdp_frame) +  xdpf->headroom;\n-\n-\t/* Memory size backing xdp_frame data already have reserved\n-\t * room for build_skb to place skb_shared_info in tailroom.\n-\t */\n-\tframe_size = xdpf->frame_sz;\n-\n-\tpkt_data_start = xdpf->data - hard_start_headroom;\n-\tskb = build_skb_around(skb, pkt_data_start, frame_size);\n-\tif (unlikely(!skb))\n-\t\treturn NULL;\n-\n-\tskb_reserve(skb, hard_start_headroom);\n-\t__skb_put(skb, xdpf->len);\n-\tif (xdpf->metasize)\n-\t\tskb_metadata_set(skb, xdpf->metasize);\n-\n-\t/* Essential SKB info: protocol and skb->dev */\n-\tskb->protocol = eth_type_trans(skb, xdpf->dev_rx);\n-\n-\t/* Optional SKB info, currently missing:\n-\t * - HW checksum info\t\t(skb->ip_summed)\n-\t * - HW RX hash\t\t\t(skb_set_hash)\n-\t * - RX ring dev queue index\t(skb_record_rx_queue)\n-\t */\n-\n-\t/* Until page_pool get SKB return path, release DMA here */\n-\txdp_release_frame(xdpf);\n-\n-\t/* Allow SKB to reuse area used by xdp_frame */\n-\txdp_scrub_frame(xdpf);\n-\n-\treturn skb;\n-}\n-\n static void __cpu_map_ring_cleanup(struct ptr_ring *ring)\n {\n \t/* The tear-down procedure should have made sure that queue is\n@@ -364,7 +321,7 @@ static int cpu_map_kthread_run(void *data)\n \t\t\tstruct sk_buff *skb = skbs[i];\n \t\t\tint ret;\n \n-\t\t\tskb = cpu_map_build_skb(xdpf, skb);\n+\t\t\tskb = __xdp_build_skb_from_frame(xdpf, skb, xdpf->dev_rx);\n \t\t\tif (!skb) {\n \t\t\t\txdp_return_frame(xdpf);\n \t\t\t\tcontinue;\ndiff --git a/net/core/xdp.c b/net/core/xdp.c\nindex 6d4fd4dddb00..a6bdefed92e6 100644\n--- a/net/core/xdp.c\n+++ b/net/core/xdp.c\n@@ -507,3 +507,67 @@ void xdp_warn(const char *msg, const char *func, const int line)\n \tWARN(1, \"XDP_WARN: %s(line:%d): %s\\n\", func, line, msg);\n };\n EXPORT_SYMBOL_GPL(xdp_warn);\n+\n+struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,\n+\t\t\t\t\t   struct sk_buff *skb,\n+\t\t\t\t\t   struct net_device *dev)\n+{\n+\tstruct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf);\n+\tunsigned int headroom = sizeof(*xdpf) +  xdpf->headroom;\n+\tint i, num_frags = xdpf->mb ? sinfo->nr_frags : 0;\n+\tvoid *hard_start = xdpf->data - headroom;\n+\n+\tskb = build_skb_around(skb, hard_start, xdpf->frame_sz);\n+\tif (unlikely(!skb))\n+\t\treturn NULL;\n+\n+\tskb_reserve(skb, headroom);\n+\t__skb_put(skb, xdpf->len);\n+\tif (xdpf->metasize)\n+\t\tskb_metadata_set(skb, xdpf->metasize);\n+\n+\tif (likely(!num_frags))\n+\t\tgoto out;\n+\n+\tfor (i = 0; i < num_frags; i++) {\n+\t\tskb_frag_t *frag = &sinfo->frags[i];\n+\n+\t\tskb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,\n+\t\t\t\tskb_frag_page(frag), skb_frag_off(frag),\n+\t\t\t\tskb_frag_size(frag), xdpf->frame_sz);\n+\t}\n+\n+out:\n+\t/* Essential SKB info: protocol and skb->dev */\n+\tskb->protocol = eth_type_trans(skb, dev);\n+\n+\t/* Optional SKB info, currently missing:\n+\t * - HW checksum info\t\t(skb->ip_summed)\n+\t * - HW RX hash\t\t\t(skb_set_hash)\n+\t * - RX ring dev queue index\t(skb_record_rx_queue)\n+\t */\n+\n+\t/* Until page_pool get SKB return path, release DMA here */\n+\txdp_release_frame(xdpf);\n+\n+\t/* Allow SKB to reuse area used by xdp_frame */\n+\txdp_scrub_frame(xdpf);\n+\n+\treturn skb;\n+}\n+EXPORT_SYMBOL_GPL(__xdp_build_skb_from_frame);\n+\n+struct sk_buff *xdp_build_skb_from_frame(struct xdp_frame *xdpf,\n+\t\t\t\t\t struct net_device *dev)\n+{\n+\tstruct sk_buff *skb;\n+\n+\tskb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC);\n+\tif (unlikely(!skb))\n+\t\treturn NULL;\n+\n+\tmemset(skb, 0, offsetof(struct sk_buff, tail));\n+\n+\treturn __xdp_build_skb_from_frame(xdpf, skb, dev);\n+}\n+EXPORT_SYMBOL_GPL(xdp_build_skb_from_frame);\n","prefixes":["v4","bpf-next","13/13"]}