From: David Ahern <dsahern@kernel.org>
To: netdev@vger.kernel.org
Cc: prashantbhole.linux@gmail.com, jasowang@redhat.com,
davem@davemloft.net, jakub.kicinski@netronome.com,
jbrouer@redhat.com, toke@redhat.com, mst@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 <dahern@digitalocean.com>
Subject: [PATCH bpf-next 01/12] net: Add new XDP setup and query commands
Date: Wed, 22 Jan 2020 18:41:59 -0700 [thread overview]
Message-ID: <20200123014210.38412-2-dsahern@kernel.org> (raw)
In-Reply-To: <20200123014210.38412-1-dsahern@kernel.org>
From: David Ahern <dahern@digitalocean.com>
Add new netdev commands, XDP_SETUP_PROG_EGRESS and
XDP_QUERY_PROG_EGRESS.
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 <dahern@digitalocean.com>
Co-developed-by: Prashant Bhole <prashantbhole.linux@gmail.com>
Signed-off-by: Prashant Bhole <prashantbhole.linux@gmail.com>
---
include/linux/netdevice.h | 4 +++-
net/core/dev.c | 30 +++++++++++++++++++++---------
net/core/rtnetlink.c | 2 +-
3 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 5ec3537fbdb1..e9cc326086f4 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -865,8 +865,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,
@@ -3729,7 +3731,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, u32 flags);
+ int 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 e7802a41ae7f..04cbcc930bc2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -8538,7 +8538,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;
@@ -8556,7 +8556,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;
@@ -8577,7 +8577,8 @@ 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 from the driver */
ndo_bpf = dev->netdev_ops->ndo_bpf;
@@ -8589,14 +8590,20 @@ 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));
+ /* Remove egress program */
+ memset(&xdp, 0, sizeof(xdp));
+ xdp.command = XDP_QUERY_PROG_EGRESS;
+ if (!ndo_bpf(dev, &xdp) && xdp.prog_id)
+ WARN_ON(dev_xdp_install(dev, ndo_bpf, NULL, xdp.prog_flags,
+ NULL, true));
}
/**
@@ -8609,7 +8616,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, u32 flags)
+ int fd, u32 flags, bool egress)
{
const struct net_device_ops *ops = dev->netdev_ops;
enum bpf_netdev_command query;
@@ -8621,7 +8628,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))) {
@@ -8636,7 +8647,8 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
if (fd >= 0) {
u32 prog_id;
- 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;
}
@@ -8668,7 +8680,7 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
return 0;
}
- 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 20bc406f3871..ed0c069ef187 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2801,7 +2801,7 @@ static int do_setlink(const struct sk_buff *skb,
if (xdp[IFLA_XDP_FD]) {
err = dev_change_xdp_fd(dev, extack,
nla_get_s32(xdp[IFLA_XDP_FD]),
- xdp_flags);
+ xdp_flags, false);
if (err)
goto errout;
status |= DO_SETLINK_NOTIFY;
--
2.21.1 (Apple Git-122.3)
next prev parent reply other threads:[~2020-01-23 1:42 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-23 1:41 [PATCH bpf-next 00/12] Add support for XDP in egress path David Ahern
2020-01-23 1:41 ` David Ahern [this message]
2020-01-23 1:42 ` [PATCH bpf-next 02/12] net: Add BPF_XDP_EGRESS as a bpf_attach_type David Ahern
2020-01-23 11:34 ` Toke Høiland-Jørgensen
2020-01-23 21:32 ` David Ahern
2020-01-24 9:49 ` Toke Høiland-Jørgensen
2020-01-24 7:33 ` Martin Lau
2020-01-23 1:42 ` [PATCH bpf-next 03/12] net: Add IFLA_XDP_EGRESS for XDP programs in the egress path David Ahern
2020-01-23 11:35 ` Toke Høiland-Jørgensen
2020-01-23 21:33 ` David Ahern
2020-01-24 15:21 ` Jakub Kicinski
2020-01-24 15:36 ` Toke Høiland-Jørgensen
2020-01-26 1:43 ` David Ahern
2020-01-26 4:54 ` Alexei Starovoitov
2020-02-02 17:59 ` David Ahern
2020-01-26 12:49 ` Jesper Dangaard Brouer
2020-01-26 16:38 ` David Ahern
2020-01-26 22:17 ` Jakub Kicinski
2020-01-28 14:13 ` Jesper Dangaard Brouer
2020-01-30 14:45 ` Jakub Kicinski
2020-02-01 16:03 ` Toke Høiland-Jørgensen
2020-02-02 17:48 ` David Ahern
2020-01-26 22:11 ` Jakub Kicinski
2020-01-27 4:03 ` David Ahern
2020-01-27 14:16 ` Jakub Kicinski
2020-01-28 3:43 ` David Ahern
2020-01-28 13:57 ` Jakub Kicinski
2020-02-01 16:24 ` Toke Høiland-Jørgensen
2020-02-01 17:08 ` Jakub Kicinski
2020-02-01 20:05 ` Toke Høiland-Jørgensen
2020-02-02 4:15 ` Jakub Kicinski
2020-02-03 19:56 ` Toke Høiland-Jørgensen
2020-02-03 20:13 ` Toke Høiland-Jørgensen
2020-02-03 22:15 ` Jesper Dangaard Brouer
2020-02-04 11:00 ` Toke Høiland-Jørgensen
2020-02-04 17:09 ` Jakub Kicinski
2020-02-05 15:30 ` Toke Høiland-Jørgensen
2020-02-02 17:45 ` David Ahern
2020-02-02 19:12 ` Jakub Kicinski
2020-02-02 17:43 ` David Ahern
2020-02-02 19:31 ` Jakub Kicinski
2020-02-02 21:51 ` David Ahern
2020-02-01 15:59 ` Toke Høiland-Jørgensen
2020-02-02 17:54 ` David Ahern
2020-02-03 20:09 ` Toke Høiland-Jørgensen
2020-01-23 1:42 ` [PATCH bpf-next 04/12] net: core: rename netif_receive_generic_xdp() to do_generic_xdp_core() David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 05/12] tuntap: check tun_msg_ctl type at necessary places David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 06/12] tun: move shared functions to if_tun.h David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 07/12] vhost_net: user tap recvmsg api to access ptr ring David Ahern
2020-01-23 8:26 ` Michael S. Tsirkin
2020-01-23 1:42 ` [PATCH bpf-next 08/12] tuntap: remove usage of ptr ring in vhost_net David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 09/12] tun: set egress XDP program David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 10/12] tun: run XDP program in tx path David Ahern
2020-01-23 8:23 ` Michael S. Tsirkin
2020-01-24 13:36 ` Prashant Bhole
2020-01-24 13:44 ` Prashant Bhole
2020-01-23 1:42 ` [PATCH bpf-next 11/12] libbpf: Add egress XDP support David Ahern
2020-01-23 1:42 ` [PATCH bpf-next 12/12] samples/bpf: xdp1, add " David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200123014210.38412-2-dsahern@kernel.org \
--to=dsahern@kernel.org \
--cc=andriin@fb.com \
--cc=ast@kernel.org \
--cc=dahern@digitalocean.com \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--cc=jakub.kicinski@netronome.com \
--cc=jasowang@redhat.com \
--cc=jbrouer@redhat.com \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=prashantbhole.linux@gmail.com \
--cc=songliubraving@fb.com \
--cc=toke@redhat.com \
--cc=toshiaki.makita1@gmail.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.