From patchwork Mon Apr 20 20:00:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220925 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 33841C3815B for ; Mon, 20 Apr 2020 20:01:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1097921744 for ; Mon, 20 Apr 2020 20:01:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412864; bh=a65bRsd48CG8Lbp1BubHx7XYJUmVV6BsKJ8Z6GL8x8Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=1VvinwX7En+f8GeJUKNatb2Z9aXIl1aZQMY6veS9DlNllIOO+MtHfHzKzP4rCWPmi ViHZ+K6MC/964rN8Kx3jsooTDS/oUfuFoHlBgEOwNNiCwGobwcx7Po23QdJfCo/Le2 gmYA8x3dVoU8Od0RqeqSj42GL/wlIhVZZTSdYKhQ= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726924AbgDTUBD (ORCPT ); Mon, 20 Apr 2020 16:01:03 -0400 Received: from mail.kernel.org ([198.145.29.99]:57532 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725988AbgDTUBA (ORCPT ); Mon, 20 Apr 2020 16:01:00 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4389920BED; Mon, 20 Apr 2020 20:00:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412860; bh=a65bRsd48CG8Lbp1BubHx7XYJUmVV6BsKJ8Z6GL8x8Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PPOv2nlQWoZjaSMBuHvX77qStw3eDbXoV6qmGyUTvr7Sv8R1O68kOo0UjH+tX2k/e npa+ohqY7GVstW3UzNKqUR/O02v3f+A+1OFQvPn0Nk/d6TdFIqqEevjd1LD4tbAIJA Abr7hL9bxX/NY7D46A5Avcal0cbL/NiO5Bmyxe00= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 02/16] net: Move handling of IFLA_XDP attribute out of do_setlink Date: Mon, 20 Apr 2020 14:00:41 -0600 Message-Id: <20200420200055.49033-3-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Later patch re-uses XDP attributes. Move processing of IFLA_XDP to a helper. Code move only; no functional change intended. Signed-off-by: David Ahern --- net/core/rtnetlink.c | 94 +++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 709ebbf8ab5b..97e47c292333 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2480,6 +2480,53 @@ static int do_set_master(struct net_device *dev, int ifindex, #define DO_SETLINK_MODIFIED 0x01 /* notify flag means notify + modified. */ #define DO_SETLINK_NOTIFY 0x03 + +static int do_setlink_xdp(struct net_device *dev, struct nlattr *tb, + int *status, struct netlink_ext_ack *extack) +{ + struct nlattr *xdp[IFLA_XDP_MAX + 1]; + u32 xdp_flags = 0; + int err; + + err = nla_parse_nested_deprecated(xdp, IFLA_XDP_MAX, tb, + ifla_xdp_policy, NULL); + if (err < 0) + return err; + + if (xdp[IFLA_XDP_ATTACHED] || xdp[IFLA_XDP_PROG_ID]) + goto out_einval; + + if (xdp[IFLA_XDP_FLAGS]) { + xdp_flags = nla_get_u32(xdp[IFLA_XDP_FLAGS]); + if (xdp_flags & ~XDP_FLAGS_MASK) + goto out_einval; + if (hweight32(xdp_flags & XDP_FLAGS_MODES) > 1) + goto out_einval; + } + + if (xdp[IFLA_XDP_FD]) { + int expected_fd = -1; + + if (xdp_flags & XDP_FLAGS_REPLACE) { + if (!xdp[IFLA_XDP_EXPECTED_FD]) + goto out_einval; + expected_fd = nla_get_s32(xdp[IFLA_XDP_EXPECTED_FD]); + } + + err = dev_change_xdp_fd(dev, extack, + nla_get_s32(xdp[IFLA_XDP_FD]), + expected_fd, xdp_flags); + if (err) + return err; + + *status |= DO_SETLINK_NOTIFY; + } + + return 0; +out_einval: + return -EINVAL; +} + static int do_setlink(const struct sk_buff *skb, struct net_device *dev, struct ifinfomsg *ifm, struct netlink_ext_ack *extack, @@ -2774,52 +2821,9 @@ static int do_setlink(const struct sk_buff *skb, } if (tb[IFLA_XDP]) { - struct nlattr *xdp[IFLA_XDP_MAX + 1]; - u32 xdp_flags = 0; - - err = nla_parse_nested_deprecated(xdp, IFLA_XDP_MAX, - tb[IFLA_XDP], - ifla_xdp_policy, NULL); - if (err < 0) - goto errout; - - if (xdp[IFLA_XDP_ATTACHED] || xdp[IFLA_XDP_PROG_ID]) { - err = -EINVAL; + err = do_setlink_xdp(dev, tb[IFLA_XDP], &status, extack); + if (err) goto errout; - } - - if (xdp[IFLA_XDP_FLAGS]) { - xdp_flags = nla_get_u32(xdp[IFLA_XDP_FLAGS]); - if (xdp_flags & ~XDP_FLAGS_MASK) { - err = -EINVAL; - goto errout; - } - if (hweight32(xdp_flags & XDP_FLAGS_MODES) > 1) { - err = -EINVAL; - goto errout; - } - } - - if (xdp[IFLA_XDP_FD]) { - int expected_fd = -1; - - if (xdp_flags & XDP_FLAGS_REPLACE) { - if (!xdp[IFLA_XDP_EXPECTED_FD]) { - err = -EINVAL; - goto errout; - } - expected_fd = - nla_get_s32(xdp[IFLA_XDP_EXPECTED_FD]); - } - - err = dev_change_xdp_fd(dev, extack, - nla_get_s32(xdp[IFLA_XDP_FD]), - expected_fd, - xdp_flags); - if (err) - goto errout; - status |= DO_SETLINK_NOTIFY; - } } errout: From patchwork Mon Apr 20 20:00:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220918 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E489DC3A5A0 for ; Mon, 20 Apr 2020 20:01:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BFB6E20736 for ; Mon, 20 Apr 2020 20:01:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412895; bh=8jOexzfauhTNhI3h1uxIxs1jWrA+po1fJTU8lcf5qlY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=eQABukkTwmCoMJ+BMgKHi4o0o8ZZZWpekDQv05+hcirA7Ets7VqQGkoEc3KT1u6hW qTVSnBldJOqukaXBPhAeN9a0tfXW9htpULHjAp+3VrBY+Qid260dB0D3o7fKJ1x/Dl bP4AUeQ91ZyVRDG61iK62vEhav1MzsmxxTWVvOkk= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728327AbgDTUBe (ORCPT ); Mon, 20 Apr 2020 16:01:34 -0400 Received: from mail.kernel.org ([198.145.29.99]:57566 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726364AbgDTUBC (ORCPT ); Mon, 20 Apr 2020 16:01:02 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5B1A22145D; Mon, 20 Apr 2020 20:01:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412861; bh=8jOexzfauhTNhI3h1uxIxs1jWrA+po1fJTU8lcf5qlY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lTNgX7BDZqQHk3Vt4cQ4bgnrNvJCH+/i7DaoltWIngi0qKTYCbVgTyg+oBc/jY7s2 Nq3vDTzFka3xHBb2NMprwaNs/H0teU5Ep8BF3XopWD/4AcS1Pgr5B9m6pmmTaGYJxD yeTppK3X1RDP8+HT/7aAi4TDIne1ufDDF/axPoxA= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 03/16] net: Add XDP setup and query commands for Tx programs Date: Mon, 20 Apr 2020 14:00:42 -0600 Message-Id: <20200420200055.49033-4-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add new netdev commands, XDP_SETUP_PROG_EGRESS and XDP_QUERY_PROG_EGRESS, to query and setup egress programs. Update dev_change_xdp_fd and dev_xdp_install to take an egress argument. If egress bool is set, then use XDP_SETUP_PROG_EGRESS in dev_xdp_install and XDP_QUERY_PROG_EGRESS in dev_change_xdp_fd. Update dev_xdp_uninstall to query for XDP_QUERY_PROG_EGRESS and if a program is installed call dev_xdp_install with the egress argument set to true. This enables existing infrastructure to be used for XDP programs in the egress path. Signed-off-by: David Ahern Co-developed-by: Prashant Bhole Signed-off-by: Prashant Bhole --- include/linux/netdevice.h | 4 +++- net/core/dev.c | 34 +++++++++++++++++++++++----------- net/core/rtnetlink.c | 2 +- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 130a668049ab..d0bb9e09660a 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -871,8 +871,10 @@ enum bpf_netdev_command { */ XDP_SETUP_PROG, XDP_SETUP_PROG_HW, + XDP_SETUP_PROG_EGRESS, XDP_QUERY_PROG, XDP_QUERY_PROG_HW, + XDP_QUERY_PROG_EGRESS, /* BPF program for offload callbacks, invoked at program load time. */ BPF_OFFLOAD_MAP_ALLOC, BPF_OFFLOAD_MAP_FREE, @@ -3777,7 +3779,7 @@ struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, typedef int (*bpf_op_t)(struct net_device *dev, struct netdev_bpf *bpf); int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, - int fd, int expected_fd, u32 flags); + int fd, int expected_fd, u32 flags, bool egress); u32 __dev_xdp_query(struct net_device *dev, bpf_op_t xdp_op, enum bpf_netdev_command cmd); int xdp_umem_query(struct net_device *dev, u16 queue_id); diff --git a/net/core/dev.c b/net/core/dev.c index 522288177bbd..97180458e7cb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -8590,7 +8590,7 @@ u32 __dev_xdp_query(struct net_device *dev, bpf_op_t bpf_op, static int dev_xdp_install(struct net_device *dev, bpf_op_t bpf_op, struct netlink_ext_ack *extack, u32 flags, - struct bpf_prog *prog) + struct bpf_prog *prog, bool egress) { bool non_hw = !(flags & XDP_FLAGS_HW_MODE); struct bpf_prog *prev_prog = NULL; @@ -8598,8 +8598,10 @@ static int dev_xdp_install(struct net_device *dev, bpf_op_t bpf_op, int err; if (non_hw) { - prev_prog = bpf_prog_by_id(__dev_xdp_query(dev, bpf_op, - XDP_QUERY_PROG)); + enum bpf_netdev_command cmd; + + cmd = egress ? XDP_QUERY_PROG_EGRESS : XDP_QUERY_PROG; + prev_prog = bpf_prog_by_id(__dev_xdp_query(dev, bpf_op, cmd)); if (IS_ERR(prev_prog)) prev_prog = NULL; } @@ -8608,7 +8610,7 @@ static int dev_xdp_install(struct net_device *dev, bpf_op_t bpf_op, if (flags & XDP_FLAGS_HW_MODE) xdp.command = XDP_SETUP_PROG_HW; else - xdp.command = XDP_SETUP_PROG; + xdp.command = egress ? XDP_SETUP_PROG_EGRESS : XDP_SETUP_PROG; xdp.extack = extack; xdp.flags = flags; xdp.prog = prog; @@ -8629,7 +8631,12 @@ static void dev_xdp_uninstall(struct net_device *dev) bpf_op_t ndo_bpf; /* Remove generic XDP */ - WARN_ON(dev_xdp_install(dev, generic_xdp_install, NULL, 0, NULL)); + WARN_ON(dev_xdp_install(dev, generic_xdp_install, NULL, 0, NULL, + false)); + + /* Remove XDP egress */ + WARN_ON(dev_xdp_install(dev, generic_xdp_install, NULL, 0, NULL, + true)); /* Remove from the driver */ ndo_bpf = dev->netdev_ops->ndo_bpf; @@ -8641,14 +8648,14 @@ static void dev_xdp_uninstall(struct net_device *dev) WARN_ON(ndo_bpf(dev, &xdp)); if (xdp.prog_id) WARN_ON(dev_xdp_install(dev, ndo_bpf, NULL, xdp.prog_flags, - NULL)); + NULL, false)); /* Remove HW offload */ memset(&xdp, 0, sizeof(xdp)); xdp.command = XDP_QUERY_PROG_HW; if (!ndo_bpf(dev, &xdp) && xdp.prog_id) WARN_ON(dev_xdp_install(dev, ndo_bpf, NULL, xdp.prog_flags, - NULL)); + NULL, false)); } /** @@ -8662,7 +8669,7 @@ static void dev_xdp_uninstall(struct net_device *dev) * Set or clear a bpf program for a device */ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, - int fd, int expected_fd, u32 flags) + int fd, int expected_fd, u32 flags, bool egress) { const struct net_device_ops *ops = dev->netdev_ops; enum bpf_netdev_command query; @@ -8675,7 +8682,11 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, ASSERT_RTNL(); offload = flags & XDP_FLAGS_HW_MODE; - query = offload ? XDP_QUERY_PROG_HW : XDP_QUERY_PROG; + if (egress) + query = XDP_QUERY_PROG_EGRESS; + else + query = offload ? XDP_QUERY_PROG_HW : XDP_QUERY_PROG; + bpf_op = bpf_chk = ops->ndo_bpf; if (!bpf_op && (flags & (XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE))) { @@ -8705,7 +8716,8 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, } } if (fd >= 0) { - if (!offload && __dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG)) { + if (!offload && !egress && + __dev_xdp_query(dev, bpf_chk, XDP_QUERY_PROG)) { NL_SET_ERR_MSG(extack, "native and generic XDP can't be active at the same time"); return -EEXIST; } @@ -8737,7 +8749,7 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, prog = NULL; } - err = dev_xdp_install(dev, bpf_op, extack, flags, prog); + err = dev_xdp_install(dev, bpf_op, extack, flags, prog, egress); if (err < 0 && prog) bpf_prog_put(prog); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 97e47c292333..dc44af16226a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2515,7 +2515,7 @@ static int do_setlink_xdp(struct net_device *dev, struct nlattr *tb, err = dev_change_xdp_fd(dev, extack, nla_get_s32(xdp[IFLA_XDP_FD]), - expected_fd, xdp_flags); + expected_fd, xdp_flags, false); if (err) return err; From patchwork Mon Apr 20 20:00:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220919 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 534BEC54FCF for ; Mon, 20 Apr 2020 20:01:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2D0A020736 for ; Mon, 20 Apr 2020 20:01:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412890; bh=cOm5WrlVHrB7nwX4oTQ5YkOZenrlbAk4Z1oR3h9vOEA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=C9aUMgRxAkVl4gQvD1R4iH1x+LUWnP7NoWUCI2Ghqwsl1iPkJrLyQgXh15BMxFkeW POapacoE9sQo2n3TjZHPoTJzOQ9UZpiUDB/8dQjv5NFbUTXWN8sr0Mq5g3vxCvZ6b/ QxnFOcPWPwBoJIr2jjVp8b4o78LO7F/NULHXotr4= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728326AbgDTUB3 (ORCPT ); Mon, 20 Apr 2020 16:01:29 -0400 Received: from mail.kernel.org ([198.145.29.99]:57682 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727027AbgDTUBG (ORCPT ); Mon, 20 Apr 2020 16:01:06 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B532E21D94; Mon, 20 Apr 2020 20:01:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412865; bh=cOm5WrlVHrB7nwX4oTQ5YkOZenrlbAk4Z1oR3h9vOEA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NQh4BHJUoBYoHBX0LABA9RF0sYaUsAt0CmUBlqAcyOY6aLed4LQqf9p+7jsIcsq1p 72iazFB5JW0aUPUU6L+bwPmCAZotg+4XKWgb7+UAzuGlv3wOxbwlUEPNPTQ3NN/iAZ 7MNc/pGRWS6E6AWCG5uOXmrDGXqRKVTNIusSkg4k= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 07/16] net: Rename do_xdp_generic to do_xdp_generic_rx Date: Mon, 20 Apr 2020 14:00:46 -0600 Message-Id: <20200420200055.49033-8-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Rename do_xdp_generic to do_xdp_generic_rx to emphasize its use in the Rx path. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole Signed-off-by: David Ahern --- drivers/net/tun.c | 4 ++-- include/linux/netdevice.h | 2 +- net/core/dev.c | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 44889eba1dbc..efe655d27661 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1898,7 +1898,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, rcu_read_lock(); xdp_prog = rcu_dereference(tun->xdp_prog); if (xdp_prog) { - ret = do_xdp_generic(xdp_prog, skb); + ret = do_xdp_generic_rx(xdp_prog, skb); if (ret != XDP_PASS) { rcu_read_unlock(); local_bh_enable(); @@ -2463,7 +2463,7 @@ static int tun_xdp_one(struct tun_struct *tun, skb_record_rx_queue(skb, tfile->queue_index); if (skb_xdp) { - err = do_xdp_generic(xdp_prog, skb); + err = do_xdp_generic_rx(xdp_prog, skb); if (err != XDP_PASS) goto out; } diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 3133247681fd..2649f2b36858 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3711,7 +3711,7 @@ static inline void dev_consume_skb_any(struct sk_buff *skb) } void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog); -int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb); +int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb); int netif_rx(struct sk_buff *skb); int netif_rx_ni(struct sk_buff *skb); int netif_receive_skb(struct sk_buff *skb); diff --git a/net/core/dev.c b/net/core/dev.c index e8a62bdb395b..18b93d34633c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4642,7 +4642,7 @@ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) static DEFINE_STATIC_KEY_FALSE(generic_xdp_needed_key); -int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb) +int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb) { if (xdp_prog) { struct xdp_buff xdp; @@ -4670,7 +4670,7 @@ int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb) kfree_skb(skb); return XDP_DROP; } -EXPORT_SYMBOL_GPL(do_xdp_generic); +EXPORT_SYMBOL_GPL(do_xdp_generic_rx); static int netif_rx_internal(struct sk_buff *skb) { @@ -5020,7 +5020,8 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc, int ret2; preempt_disable(); - ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); + ret2 = do_xdp_generic_rx(rcu_dereference(skb->dev->xdp_prog), + skb); preempt_enable(); if (ret2 != XDP_PASS) From patchwork Mon Apr 20 20:00:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220924 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 816E4C3A5A0 for ; Mon, 20 Apr 2020 20:01:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6065120782 for ; Mon, 20 Apr 2020 20:01:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412870; bh=1/UTyE1lruTl4Y9vrIIIZvLm7mKp/RCC1vjotwMdZ8Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=cOcmPbmQ8HlIQcmHDL/GWTx+aymR7cyo0tQVLVQMnbi5RMWsnqEed7RcQcARuUmJD eMMa4fm0iozXzqOwm0Si6iLA5W3JYPDxSn+aISeR0QTZPH5x+VLWJSzskpryaODloX ggQcWXkEmdGrZp8aw5rOTxRNpbZOjO5Us7SRWh8M= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728271AbgDTUBJ (ORCPT ); Mon, 20 Apr 2020 16:01:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:57714 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728255AbgDTUBH (ORCPT ); Mon, 20 Apr 2020 16:01:07 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B62CA22202; Mon, 20 Apr 2020 20:01:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412866; bh=1/UTyE1lruTl4Y9vrIIIZvLm7mKp/RCC1vjotwMdZ8Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t+GBaleAoftc2xS+9lSb4lxkeJMJmBytHDjYi8QJf6LANPj+EaHubfADGwVeDY4hV lxxHASNkBAKXsfniL4k/6s2zcnQl+6wAXzvDB+vNRjlr21K5WArvKhBwwnMsVpBUkZ P09NhJ4f6Duw7pwmTnzQJKHOxRZwls/ifdZ0qaOA= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 08/16] net: rename netif_receive_generic_xdp to do_generic_xdp_core Date: Mon, 20 Apr 2020 14:00:47 -0600 Message-Id: <20200420200055.49033-9-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern In skb generic path, we need a way to run XDP program on skb but to have customized handling of XDP actions. netif_receive_generic_xdp will be more helpful in such cases than do_xdp_generic. This patch prepares netif_receive_generic_xdp() to be used as general purpose function for running xdp programs on skbs by renaming it to do_xdp_generic_core, moving skb_is_redirected and rxq settings as well as XDP return code checks to the callers. This allows this core function to be used from both Rx and Tx paths with rxq and txq set based on context. Signed-off-by: Jason Wang Signed-off-by: Prashant Bhole Signed-off-by: David Ahern --- net/core/dev.c | 52 ++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index 18b93d34633c..046455c54b03 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4501,25 +4501,17 @@ static struct netdev_rx_queue *netif_get_rxqueue(struct sk_buff *skb) return rxqueue; } -static u32 netif_receive_generic_xdp(struct sk_buff *skb, - struct xdp_buff *xdp, - struct bpf_prog *xdp_prog) +static u32 do_xdp_generic_core(struct sk_buff *skb, struct xdp_buff *xdp, + struct bpf_prog *xdp_prog) { - struct netdev_rx_queue *rxqueue; void *orig_data, *orig_data_end; - u32 metalen, act = XDP_DROP; __be16 orig_eth_type; struct ethhdr *eth; + u32 metalen, act; bool orig_bcast; int hlen, off; u32 mac_len; - /* Reinjected packets coming from act_mirred or similar should - * not get XDP generic processing. - */ - if (skb_is_redirected(skb)) - return XDP_PASS; - /* XDP packets must be linear and must have sufficient headroom * of XDP_PACKET_HEADROOM bytes. This is the guarantee that also * native XDP provides, thus we need to do it here as well. @@ -4535,9 +4527,9 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, if (pskb_expand_head(skb, hroom > 0 ? ALIGN(hroom, NET_SKB_PAD) : 0, troom > 0 ? troom + 128 : 0, GFP_ATOMIC)) - goto do_drop; + return XDP_DROP; if (skb_linearize(skb)) - goto do_drop; + return XDP_DROP; } /* The XDP program wants to see the packet starting at the MAC @@ -4555,9 +4547,6 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, orig_bcast = is_multicast_ether_addr_64bits(eth->h_dest); orig_eth_type = eth->h_proto; - rxqueue = netif_get_rxqueue(skb); - xdp->rxq = &rxqueue->xdp_rxq; - act = bpf_prog_run_xdp(xdp_prog, xdp); /* check if bpf_xdp_adjust_head was used */ @@ -4600,16 +4589,6 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, if (metalen) skb_metadata_set(skb, metalen); break; - default: - bpf_warn_invalid_xdp_action(act); - /* fall through */ - case XDP_ABORTED: - trace_xdp_exception(skb->dev, xdp_prog, act); - /* fall through */ - case XDP_DROP: - do_drop: - kfree_skb(skb); - break; } return act; @@ -4644,12 +4623,22 @@ static DEFINE_STATIC_KEY_FALSE(generic_xdp_needed_key); int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb) { + /* Reinjected packets coming from act_mirred or similar should + * not get XDP generic processing. + */ + if (skb_is_redirected(skb)) + return XDP_PASS; + if (xdp_prog) { + struct netdev_rx_queue *rxqueue; struct xdp_buff xdp; u32 act; int err; - act = netif_receive_generic_xdp(skb, &xdp, xdp_prog); + rxqueue = netif_get_rxqueue(skb); + xdp.rxq = &rxqueue->xdp_rxq; + + act = do_xdp_generic_core(skb, &xdp, xdp_prog); if (act != XDP_PASS) { switch (act) { case XDP_REDIRECT: @@ -4661,6 +4650,15 @@ int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb) case XDP_TX: generic_xdp_tx(skb, xdp_prog); break; + default: + bpf_warn_invalid_xdp_action(act); + /* fall through */ + case XDP_ABORTED: + trace_xdp_exception(skb->dev, xdp_prog, act); + /* fall through */ + case XDP_DROP: + kfree_skb(skb); + break; } return XDP_DROP; } From patchwork Mon Apr 20 20:00:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220923 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8A18BC3815B for ; Mon, 20 Apr 2020 20:01:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 62E9C22240 for ; Mon, 20 Apr 2020 20:01:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412874; bh=GkiNvjY7wJSvOouNeJtYcLeLpSNpgaVbB19K1+8NTsM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=y6WNs739ycG1VQe6LN08Po/sHqy02+Fd7iBgHupq4wO6pXQ9uAw2DqTsICgxxrrky i5G3TQ0OpRyJReyM/55dFCZ/P10A3BkQ3PjYi3SOvWRs9HmwgcgfYXixFDD49FqdZR 02zVmHirdy2yTnE//tGGcJVUfNajaPEkOTkA4MHE= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728286AbgDTUBN (ORCPT ); Mon, 20 Apr 2020 16:01:13 -0400 Received: from mail.kernel.org ([198.145.29.99]:57790 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728269AbgDTUBJ (ORCPT ); Mon, 20 Apr 2020 16:01:09 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id CD6372223D; Mon, 20 Apr 2020 20:01:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412868; bh=GkiNvjY7wJSvOouNeJtYcLeLpSNpgaVbB19K1+8NTsM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RkLQ8smvyiFl6BxqxqGqo57njbv1MaolDc/0Oknw1gnDvradlmc5YPmO7X3Am7gbg cdojh92UXIi8Wpxoh/mqBRx1zReSCpIvJcvxjeqNUL8+V+cnUFCBXlvgk88ZWKjcKw 95TR/4y214GpmhqJA9icj5AFLycLxZhJMx/qUggY= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 10/16] net: Support xdp in the Tx path for packets as an skb Date: Mon, 20 Apr 2020 14:00:49 -0600 Message-Id: <20200420200055.49033-11-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add support to run Tx path program on packets about to hit the ndo_start_xmit function for a device. Only XDP_DROP and XDP_PASS are supported now. Conceptually, XDP_REDIRECT for this path can work the same as it does for the Rx path, but that support is left for a follow on series. Signed-off-by: David Ahern --- include/linux/netdevice.h | 11 +++++++++ net/core/dev.c | 52 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 0c89996a6bec..39e1b42c042f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3714,6 +3714,7 @@ static inline void dev_consume_skb_any(struct sk_buff *skb) void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog); int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb); +u32 do_xdp_egress_skb(struct net_device *dev, struct sk_buff *skb); int netif_rx(struct sk_buff *skb); int netif_rx_ni(struct sk_buff *skb); int netif_receive_skb(struct sk_buff *skb); @@ -4534,6 +4535,16 @@ static inline netdev_tx_t __netdev_start_xmit(const struct net_device_ops *ops, struct sk_buff *skb, struct net_device *dev, bool more) { + if (static_branch_unlikely(&xdp_egress_needed_key)) { + u32 act; + + rcu_read_lock(); + act = do_xdp_egress_skb(dev, skb); + rcu_read_unlock(); + if (act == XDP_DROP) + return NET_XMIT_DROP; + } + __this_cpu_write(softnet_data.xmit.more, more); return ops->ndo_start_xmit(skb, dev); } diff --git a/net/core/dev.c b/net/core/dev.c index 6718048c3448..d47e88beeeca 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4620,7 +4620,6 @@ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) } static DEFINE_STATIC_KEY_FALSE(generic_xdp_needed_key); -DEFINE_STATIC_KEY_FALSE(xdp_egress_needed_key); int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb) { @@ -4671,6 +4670,57 @@ int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb) } EXPORT_SYMBOL_GPL(do_xdp_generic_rx); +DEFINE_STATIC_KEY_FALSE(xdp_egress_needed_key); +EXPORT_SYMBOL_GPL(xdp_egress_needed_key); + +static u32 handle_xdp_egress_act(u32 act, struct net_device *dev, + struct bpf_prog *xdp_prog) +{ + switch (act) { + case XDP_DROP: + /* fall through */ + case XDP_PASS: + break; + case XDP_TX: + /* fall through */ + case XDP_REDIRECT: + /* fall through */ + default: + bpf_warn_invalid_xdp_action(act); + /* fall through */ + case XDP_ABORTED: + trace_xdp_exception(dev, xdp_prog, act); + act = XDP_DROP; + break; + } + + return act; +} + +u32 do_xdp_egress_skb(struct net_device *dev, struct sk_buff *skb) +{ + struct bpf_prog *xdp_prog; + u32 act = XDP_PASS; + + xdp_prog = rcu_dereference(dev->xdp_egress_prog); + if (xdp_prog) { + struct xdp_txq_info txq = { .dev = dev }; + struct xdp_buff xdp; + + xdp.txq = &txq; + act = do_xdp_generic_core(skb, &xdp, xdp_prog); + act = handle_xdp_egress_act(act, dev, xdp_prog); + if (act == XDP_DROP) { + atomic_long_inc(&dev->tx_dropped); + skb_tx_error(skb); + kfree_skb(skb); + } + } + + return act; +} +EXPORT_SYMBOL_GPL(do_xdp_egress_skb); + static int netif_rx_internal(struct sk_buff *skb) { int ret; From patchwork Mon Apr 20 20:00:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220920 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB49BC3815B for ; Mon, 20 Apr 2020 20:01:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8896520736 for ; Mon, 20 Apr 2020 20:01:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412884; bh=dj70/2KWxUM7l6AKl+JjGEdeOwct2bj3JHWqyfwoSk4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=yxOrJ0x8101/hpgnDgE4mHrRPz79MYjJyRZrpGccDimJwIfAycpiUXkmJcSH4YXK5 Q082XjXIePoRFTtvjMPeqa6Q7AXGaSdcinUGosZuzT+EuhzQoFDVBPxMCUxiLCL1Au m9bSA8BTC5vcqR/mBB5jAdPZdQCeEw/rVgINgcw8= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728322AbgDTUBX (ORCPT ); Mon, 20 Apr 2020 16:01:23 -0400 Received: from mail.kernel.org ([198.145.29.99]:57818 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728255AbgDTUBK (ORCPT ); Mon, 20 Apr 2020 16:01:10 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D625A22209; Mon, 20 Apr 2020 20:01:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412869; bh=dj70/2KWxUM7l6AKl+JjGEdeOwct2bj3JHWqyfwoSk4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b4DRmh7UKWO+4HF0hCEDzNB0HHekucIObsAOdmc6DEcxYS9ySE7FF9uQouTE+Vhnr UUXmO1UJIKQC24FxtZUMes7cCNZsOQutVfE7waWMTN52yyXwp9BjiqnLqGBipZLnYs V2/XEuXh3YIiHGDv9BZC4hntw/QEqot/WzjBJMzw= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 11/16] net: Support xdp in the Tx path for xdp_frames Date: Mon, 20 Apr 2020 14:00:50 -0600 Message-Id: <20200420200055.49033-12-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add support to run Tx path program on xdp_frames by adding a hook to bq_xmit_all before xdp_frames are passed to ndo_xdp_xmit for the device. If an xdp_frame is dropped by the program, it is removed from the xdp_frames array with subsequent entries moved up. Signed-off-by: David Ahern --- include/linux/netdevice.h | 3 ++ kernel/bpf/devmap.c | 19 +++++++++---- net/core/dev.c | 59 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 39e1b42c042f..d18d68ddf604 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3715,6 +3715,9 @@ static inline void dev_consume_skb_any(struct sk_buff *skb) void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog); int do_xdp_generic_rx(struct bpf_prog *xdp_prog, struct sk_buff *skb); u32 do_xdp_egress_skb(struct net_device *dev, struct sk_buff *skb); +unsigned int do_xdp_egress_frame(struct net_device *dev, + struct xdp_frame **frames, + unsigned int count); int netif_rx(struct sk_buff *skb); int netif_rx_ni(struct sk_buff *skb); int netif_receive_skb(struct sk_buff *skb); diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index 58bdca5d978a..c038c8c3ccdb 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -322,24 +322,33 @@ static int bq_xmit_all(struct xdp_dev_bulk_queue *bq, u32 flags) { struct net_device *dev = bq->dev; int sent = 0, drops = 0, err = 0; + unsigned int count = bq->count; int i; - if (unlikely(!bq->count)) + if (unlikely(!count)) return 0; - for (i = 0; i < bq->count; i++) { + for (i = 0; i < count; i++) { struct xdp_frame *xdpf = bq->q[i]; prefetch(xdpf); } - sent = dev->netdev_ops->ndo_xdp_xmit(dev, bq->count, bq->q, flags); + if (static_branch_unlikely(&xdp_egress_needed_key)) { + count = do_xdp_egress_frame(dev, bq->q, count); + drops += bq->count - count; + /* all frames consumed by the xdp program? */ + if (!count) + goto out; + } + + sent = dev->netdev_ops->ndo_xdp_xmit(dev, count, bq->q, flags); if (sent < 0) { err = sent; sent = 0; goto error; } - drops = bq->count - sent; + drops += count - sent; out: bq->count = 0; @@ -351,7 +360,7 @@ static int bq_xmit_all(struct xdp_dev_bulk_queue *bq, u32 flags) /* If ndo_xdp_xmit fails with an errno, no frames have been * xmit'ed and it's our responsibility to them free all. */ - for (i = 0; i < bq->count; i++) { + for (i = 0; i < count; i++) { struct xdp_frame *xdpf = bq->q[i]; xdp_return_frame_rx_napi(xdpf); diff --git a/net/core/dev.c b/net/core/dev.c index d47e88beeeca..60fb1884e4ef 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4721,6 +4721,65 @@ u32 do_xdp_egress_skb(struct net_device *dev, struct sk_buff *skb) } EXPORT_SYMBOL_GPL(do_xdp_egress_skb); +static u32 __xdp_egress_frame(struct net_device *dev, + struct bpf_prog *xdp_prog, + struct xdp_frame *xdp_frame, + struct xdp_txq_info *txq) +{ + struct xdp_buff xdp; + u32 act; + + xdp.data_hard_start = xdp_frame->data - xdp_frame->headroom + - sizeof(*xdp_frame); + xdp.data = xdp_frame->data; + xdp.data_end = xdp.data + xdp_frame->len; + xdp.data_meta = xdp.data - xdp_frame->metasize; + xdp.txq = txq; + + act = bpf_prog_run_xdp(xdp_prog, &xdp); + act = handle_xdp_egress_act(act, dev, xdp_prog); + + /* if not dropping frame, readjust pointers in case + * program made changes to the buffer + */ + if (act != XDP_DROP) { + if (unlikely(!update_xdp_frame(&xdp, xdp_frame))) + return XDP_DROP; + } + + return act; +} + +unsigned int do_xdp_egress_frame(struct net_device *dev, + struct xdp_frame **frames, + unsigned int count) +{ + struct bpf_prog *xdp_prog; + + xdp_prog = rcu_dereference(dev->xdp_egress_prog); + if (xdp_prog) { + struct xdp_txq_info txq = { .dev = dev }; + unsigned int i, j; + u32 act; + + for (i = 0, j = 0; i < count; i++) { + struct xdp_frame *frame = frames[i]; + + act = __xdp_egress_frame(dev, xdp_prog, frame, &txq); + if (act == XDP_DROP) { + xdp_return_frame_rx_napi(frame); + continue; + } + + frames[j] = frame; + j++; + } + count = j; + } + + return count; +} + static int netif_rx_internal(struct sk_buff *skb) { int ret; From patchwork Mon Apr 20 20:00:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220922 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42C33C54FCF for ; Mon, 20 Apr 2020 20:01:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1F53820B1F for ; Mon, 20 Apr 2020 20:01:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412877; bh=pKf5fmUuifbzSkFFm34UgjUO5Llvgpx5QEtqM3eucO4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=YO7rgWysOpcmHKDwiAF1FGCdcTlwfrCzM9TyRq4uUBzHH0o3rAcK5E/FlZvik0laV HTq/80AHpzbNWp0eZ/rRENnhOoJX+XNtI+TbHZWDZUTECWVm86oedaC2j6nnS62zyT pfJMgvqTdO+NNNRAWr4yRP0ChZRLIM/55dB6khYk= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728299AbgDTUBQ (ORCPT ); Mon, 20 Apr 2020 16:01:16 -0400 Received: from mail.kernel.org ([198.145.29.99]:57916 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728281AbgDTUBM (ORCPT ); Mon, 20 Apr 2020 16:01:12 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DFAD220BED; Mon, 20 Apr 2020 20:01:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412871; bh=pKf5fmUuifbzSkFFm34UgjUO5Llvgpx5QEtqM3eucO4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=evAxDHOJyI1+uAEFz1tF7fbssRZtSce56iCmxKYVdy2iWY+6D/tYmiNa69TMUu8W0 jFmLsm4jrYHIU2KQX52HwJL9+w0l6DsNAbDY+l/tauAw3B/WvNaxd6MHoJ+mI87aZf HSihMfEaZwTXLZDUA6sT0WtbmroiEl5ipoegsVZY= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 13/16] bpftool: Add support for XDP egress Date: Mon, 20 Apr 2020 14:00:52 -0600 Message-Id: <20200420200055.49033-14-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add NET_ATTACH_TYPE_XDP_EGRESS and update attach_type_strings to allow a user to specify 'xdp_egress' as the attach or detach point. libbpf handles egress config via bpf_set_link_xdp_fd_opts, so update do_attach_detach_xdp to use it. Specifically, the new API requires old_fd to be set based on any currently loaded program, so use bpf_get_link_xdp_id and bpf_get_link_xdp_egress_id to get an fd to any existing program. Update 'net show' command to dump egress programs. Signed-off-by: David Ahern --- tools/bpf/bpftool/main.h | 2 +- tools/bpf/bpftool/net.c | 48 +++++++++++++++++++++++++++--- tools/bpf/bpftool/netlink_dumper.c | 12 ++++++-- tools/bpf/bpftool/prog.c | 2 +- 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index 86f14ce26fd7..cbc0cc2257eb 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -230,7 +230,7 @@ void btf_dump_linfo_json(const struct btf *btf, struct nlattr; struct ifinfomsg; struct tcmsg; -int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb); +int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb, bool egress); int do_filter_dump(struct tcmsg *ifinfo, struct nlattr **tb, const char *kind, const char *devname, int ifindex); diff --git a/tools/bpf/bpftool/net.c b/tools/bpf/bpftool/net.c index c5e3895b7c8b..d09272a53734 100644 --- a/tools/bpf/bpftool/net.c +++ b/tools/bpf/bpftool/net.c @@ -32,6 +32,7 @@ struct bpf_netdev_t { int used_len; int array_len; int filter_idx; + bool egress; }; struct tc_kind_handle { @@ -61,6 +62,7 @@ enum net_attach_type { NET_ATTACH_TYPE_XDP_GENERIC, NET_ATTACH_TYPE_XDP_DRIVER, NET_ATTACH_TYPE_XDP_OFFLOAD, + NET_ATTACH_TYPE_XDP_EGRESS, }; static const char * const attach_type_strings[] = { @@ -68,6 +70,7 @@ static const char * const attach_type_strings[] = { [NET_ATTACH_TYPE_XDP_GENERIC] = "xdpgeneric", [NET_ATTACH_TYPE_XDP_DRIVER] = "xdpdrv", [NET_ATTACH_TYPE_XDP_OFFLOAD] = "xdpoffload", + [NET_ATTACH_TYPE_XDP_EGRESS] = "xdp_egress", }; const size_t net_attach_type_size = ARRAY_SIZE(attach_type_strings); @@ -111,7 +114,7 @@ static int dump_link_nlmsg(void *cookie, void *msg, struct nlattr **tb) : ""); netinfo->used_len++; - return do_xdp_dump(ifinfo, tb); + return do_xdp_dump(ifinfo, tb, netinfo->egress); } static int dump_class_qdisc_nlmsg(void *cookie, void *msg, struct nlattr **tb) @@ -276,10 +279,20 @@ static int net_parse_dev(int *argc, char ***argv) static int do_attach_detach_xdp(int progfd, enum net_attach_type attach_type, int ifindex, bool overwrite) { - __u32 flags = 0; + struct bpf_xdp_set_link_opts opts; + __u32 flags = 0, id = 0; + int rc; + + memset(&opts, 0, sizeof(opts)); + opts.sz = sizeof(opts); + opts.old_fd = -1; if (!overwrite) flags = XDP_FLAGS_UPDATE_IF_NOEXIST; + + if (attach_type == NET_ATTACH_TYPE_XDP_EGRESS) + opts.egress = 1; + if (attach_type == NET_ATTACH_TYPE_XDP_GENERIC) flags |= XDP_FLAGS_SKB_MODE; if (attach_type == NET_ATTACH_TYPE_XDP_DRIVER) @@ -287,7 +300,25 @@ static int do_attach_detach_xdp(int progfd, enum net_attach_type attach_type, if (attach_type == NET_ATTACH_TYPE_XDP_OFFLOAD) flags |= XDP_FLAGS_HW_MODE; - return bpf_set_link_xdp_fd(ifindex, progfd, flags); + if (opts.egress) + rc = bpf_get_link_xdp_egress_id(ifindex, &id, flags); + else + rc = bpf_get_link_xdp_id(ifindex, &id, flags); + + if (rc) { + p_err("Failed to get existing prog id for device"); + return rc; + } + + if (id) + opts.old_fd = bpf_prog_get_fd_by_id(id); + + rc = bpf_set_link_xdp_fd_opts(ifindex, progfd, flags, &opts); + + if (opts.old_fd != -1) + close(opts.old_fd); + + return rc; } static int do_attach(int argc, char **argv) @@ -411,6 +442,7 @@ static int do_show(int argc, char **argv) dev_array.used_len = 0; dev_array.array_len = 0; dev_array.filter_idx = filter_idx; + dev_array.egress = 0; if (json_output) jsonw_start_array(json_wtr); @@ -419,6 +451,14 @@ static int do_show(int argc, char **argv) ret = libbpf_nl_get_link(sock, nl_pid, dump_link_nlmsg, &dev_array); NET_END_ARRAY("\n"); + if (!ret) { + dev_array.egress = true; + NET_START_ARRAY("xdp_egress", "%s:\n"); + ret = libbpf_nl_get_link(sock, nl_pid, dump_link_nlmsg, + &dev_array); + NET_END_ARRAY("\n"); + } + if (!ret) { NET_START_ARRAY("tc", "%s:\n"); for (i = 0; i < dev_array.used_len; i++) { @@ -464,7 +504,7 @@ static int do_help(int argc, char **argv) " %s %s help\n" "\n" " " HELP_SPEC_PROGRAM "\n" - " ATTACH_TYPE := { xdp | xdpgeneric | xdpdrv | xdpoffload }\n" + " ATTACH_TYPE := { xdp | xdpgeneric | xdpdrv | xdpoffload | xdp_egress}\n" "\n" "Note: Only xdp and tc attachments are supported now.\n" " For progs attached to cgroups, use \"bpftool cgroup\"\n" diff --git a/tools/bpf/bpftool/netlink_dumper.c b/tools/bpf/bpftool/netlink_dumper.c index 5f65140b003b..e4a2b6f8e50b 100644 --- a/tools/bpf/bpftool/netlink_dumper.c +++ b/tools/bpf/bpftool/netlink_dumper.c @@ -55,6 +55,7 @@ static int do_xdp_dump_one(struct nlattr *attr, unsigned int ifindex, xdp_dump_prog_id(tb, IFLA_XDP_SKB_PROG_ID, "generic", true); xdp_dump_prog_id(tb, IFLA_XDP_DRV_PROG_ID, "driver", true); xdp_dump_prog_id(tb, IFLA_XDP_HW_PROG_ID, "offload", true); + xdp_dump_prog_id(tb, IFLA_XDP_EGRESS_CORE_PROG_ID, "core", true); if (json_output) jsonw_end_array(json_wtr); } else if (mode == XDP_ATTACHED_DRV) { @@ -63,18 +64,23 @@ static int do_xdp_dump_one(struct nlattr *attr, unsigned int ifindex, xdp_dump_prog_id(tb, IFLA_XDP_PROG_ID, "generic", false); } else if (mode == XDP_ATTACHED_HW) { xdp_dump_prog_id(tb, IFLA_XDP_PROG_ID, "offload", false); + } else if (mode == XDP_ATTACHED_EGRESS_CORE) { + xdp_dump_prog_id(tb, IFLA_XDP_EGRESS_CORE_PROG_ID, "core", + false); } NET_END_OBJECT_FINAL; return 0; } -int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb) +int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb, bool egress) { - if (!tb[IFLA_XDP]) + __u16 atype = egress ? IFLA_XDP_EGRESS : IFLA_XDP; + + if (!tb[atype]) return 0; - return do_xdp_dump_one(tb[IFLA_XDP], ifinfo->ifi_index, + return do_xdp_dump_one(tb[atype], ifinfo->ifi_index, libbpf_nla_getattr_str(tb[IFLA_IFNAME])); } diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index f6a5974a7b0a..64695ccdcf9d 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -2014,7 +2014,7 @@ static int do_help(int argc, char **argv) " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n" " cgroup/sendmsg4 | cgroup/sendmsg6 | cgroup/recvmsg4 |\n" " cgroup/recvmsg6 | cgroup/getsockopt | cgroup/setsockopt |\n" - " struct_ops | fentry | fexit | freplace }\n" + " struct_ops | fentry | fexit | freplace | xdp_egress }\n" " ATTACH_TYPE := { msg_verdict | stream_verdict | stream_parser |\n" " flow_dissector }\n" " METRIC := { cycles | instructions | l1d_loads | llc_misses }\n" From patchwork Mon Apr 20 20:00:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 220921 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 70134C54FCF for ; Mon, 20 Apr 2020 20:01:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 424AE20782 for ; Mon, 20 Apr 2020 20:01:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412881; bh=fW1BC6x7tMfCNt++/v7F2D1iENTMOQg79pviDBE/3s8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=FRCq5C1LBnwtXTad02UpEAtTuue3JU2ow35JPxV14k8ArMsrhitmNM+EWLuS/WbW+ JTzUzeBlWMEem/1AccFksBRnSkKJP17Yoxp1g3fp0ykFWLZT78fSfKpRRCCHRJbRCm vtYNYC6zNhrOEIECEkb/kAC3FALCsVpgJ0i5gN8A= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728311AbgDTUBU (ORCPT ); Mon, 20 Apr 2020 16:01:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:58020 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728296AbgDTUBP (ORCPT ); Mon, 20 Apr 2020 16:01:15 -0400 Received: from C02YQ0RWLVCF.internal.digitalocean.com (c-73-181-34-237.hsd1.co.comcast.net [73.181.34.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1EF262145D; Mon, 20 Apr 2020 20:01:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587412875; bh=fW1BC6x7tMfCNt++/v7F2D1iENTMOQg79pviDBE/3s8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=waFjZvI0IxVKDZfd2CueAw6ZjzMYdgR8WQ+wphVZmLaKUCB9TDUr3+NJjuRTXYBBE 1IpwtHAYvXe7RkFH/w22lpyE495k1GFy6nGxv+WRQORiLm8H81a+7h7X/OdZUrIPmi 3e/ar0EQwDy8qcEl8UEtrERrLUF0ZsIF6a+JMb8Q= From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, kuba@kernel.org, prashantbhole.linux@gmail.com, jasowang@redhat.com, brouer@redhat.com, toke@redhat.com, toshiaki.makita1@gmail.com, daniel@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, dsahern@gmail.com, David Ahern Subject: [PATCH bpf-next 16/16] samples/bpf: add XDP egress support to xdp1 Date: Mon, 20 Apr 2020 14:00:55 -0600 Message-Id: <20200420200055.49033-17-dsahern@kernel.org> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200420200055.49033-1-dsahern@kernel.org> References: <20200420200055.49033-1-dsahern@kernel.org> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern xdp1 and xdp2 now accept -E flag to set XDP program in the egress path. Signed-off-by: Prashant Bhole Signed-off-by: David Ahern --- samples/bpf/xdp1_user.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c index c447ad9e3a1d..9f79bd537763 100644 --- a/samples/bpf/xdp1_user.c +++ b/samples/bpf/xdp1_user.c @@ -20,22 +20,37 @@ static int ifindex; static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; +static struct bpf_xdp_set_link_opts opts; static __u32 prog_id; static void int_exit(int sig) { __u32 curr_prog_id = 0; + int rc; - if (bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags)) { - printf("bpf_get_link_xdp_id failed\n"); + if (opts.egress) + rc = bpf_get_link_xdp_egress_id(ifindex, &curr_prog_id, xdp_flags); + else + rc = bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags); + + if (rc) { + printf("Failed to get existing prog id for device"); exit(1); } + + if (curr_prog_id) + opts.old_fd = bpf_prog_get_fd_by_id(curr_prog_id); + if (prog_id == curr_prog_id) - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); + bpf_set_link_xdp_fd_opts(ifindex, -1, xdp_flags, &opts); else if (!curr_prog_id) printf("couldn't find a prog id on a given interface\n"); else printf("program on interface changed, not removing\n"); + + if (opts.old_fd >= 0) + close(opts.old_fd); + exit(0); } @@ -73,7 +88,8 @@ static void usage(const char *prog) "OPTS:\n" " -S use skb-mode\n" " -N enforce native mode\n" - " -F force loading prog\n", + " -F force loading prog\n" + " -E egress path program\n", prog); } @@ -83,15 +99,20 @@ int main(int argc, char **argv) struct bpf_prog_load_attr prog_load_attr = { .prog_type = BPF_PROG_TYPE_XDP, }; + struct bpf_xdp_set_link_opts opts; struct bpf_prog_info info = {}; __u32 info_len = sizeof(info); - const char *optstr = "FSN"; + const char *optstr = "FSNE"; int prog_fd, map_fd, opt; struct bpf_object *obj; struct bpf_map *map; char filename[256]; int err; + memset(&opts, 0, sizeof(opts)); + opts.sz = sizeof(opts); + opts.old_fd = -1; + while ((opt = getopt(argc, argv, optstr)) != -1) { switch (opt) { case 'S': @@ -103,13 +124,17 @@ int main(int argc, char **argv) case 'F': xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST; break; + case 'E': + opts.egress = true; + prog_load_attr.expected_attach_type = BPF_XDP_EGRESS; + break; default: usage(basename(argv[0])); return 1; } } - if (!(xdp_flags & XDP_FLAGS_SKB_MODE)) + if (!(xdp_flags & XDP_FLAGS_SKB_MODE) && !opts.egress) xdp_flags |= XDP_FLAGS_DRV_MODE; if (optind == argc) { @@ -149,7 +174,7 @@ int main(int argc, char **argv) signal(SIGINT, int_exit); signal(SIGTERM, int_exit); - if (bpf_set_link_xdp_fd(ifindex, prog_fd, xdp_flags) < 0) { + if (bpf_set_link_xdp_fd_opts(ifindex, prog_fd, xdp_flags, &opts) < 0) { printf("link set xdp fd failed\n"); return 1; }