netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble
@ 2017-11-20  4:55 Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 01/10] bpf: offload: add comment warning developers about double destroy Jakub Kicinski
                   ` (9 more replies)
  0 siblings, 10 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

Hi!

This series addresses some late comments and moves checking if program
has been loaded for the correct device to the drivers.  There are also
some problems with net namespaces which I didn't take into consideration.
On the kernel side we will now simply ignore namespace moves.  Since the
user space API is not reporting any namespace identification we have to
remove the ifindex until a correct way of reporting is agreed upon.


Jakub Kicinski (10):
  bpf: offload: add comment warning developers about double destroy
  bpf: offload: limit offload to cls_bpf and xdp programs only
  bpf: offload: rename the ifindex field
  bpf: offload: move offload device validation out to the drivers
  net: xdp: don't allow device-bound programs in driver mode
  bpf: turn bpf_prog_get_type() into a wrapper
  bpf: offload: ignore namespace moves
  bpftool: revert printing program device bound info
  bpf: revert report offload info to user space
  bpf: make bpf_prog_offload_verifier_prep() static inline

 drivers/net/ethernet/netronome/nfp/bpf/offload.c | 10 ++++--
 include/linux/bpf.h                              | 18 +++++------
 include/linux/bpf_verifier.h                     |  2 +-
 include/uapi/linux/bpf.h                         |  8 +----
 kernel/bpf/offload.c                             | 27 +++++++---------
 kernel/bpf/syscall.c                             | 40 ++++++++----------------
 net/core/dev.c                                   | 14 ++++++---
 net/sched/cls_bpf.c                              |  8 ++---
 tools/bpf/bpftool/prog.c                         | 31 ------------------
 tools/include/uapi/linux/bpf.h                   |  8 +----
 10 files changed, 56 insertions(+), 110 deletions(-)

-- 
2.14.1

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

* [PATCH net 01/10] bpf: offload: add comment warning developers about double destroy
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 02/10] bpf: offload: limit offload to cls_bpf and xdp programs only Jakub Kicinski
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

Offload state may get destroyed either because the device for which
it was constructed is going away, or because the refcount of bpf
program itself has reached 0.  In both of those cases we will call
__bpf_prog_offload_destroy() to unlink the offload from the device.
We may in fact call it twice, which works just fine, but we should
make clear this is intended and caution others trying to extend the
function.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 kernel/bpf/offload.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index 2816feb38be1..fd696d3dd429 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -85,6 +85,10 @@ static void __bpf_prog_offload_destroy(struct bpf_prog *prog)
 	struct bpf_dev_offload *offload = prog->aux->offload;
 	struct netdev_bpf data = {};
 
+	/* Caution - if netdev is destroyed before the program, this function
+	 * will be called twice.
+	 */
+
 	data.offload.prog = prog;
 
 	if (offload->verifier_running)
-- 
2.14.1

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

* [PATCH net 02/10] bpf: offload: limit offload to cls_bpf and xdp programs only
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 01/10] bpf: offload: add comment warning developers about double destroy Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 03/10] bpf: offload: rename the ifindex field Jakub Kicinski
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

We are currently only allowing attachment of device-bound
cls_bpf and XDP programs.  Make this restriction explicit in
the BPF offload code.  This way we can potentially reuse the
ifindex field in the future.

Since XDP and cls_bpf programs can only be loaded by admin,
we can drop the explicit capability check from offload code.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 kernel/bpf/offload.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index fd696d3dd429..ac187f9ee182 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -14,8 +14,9 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr)
 	struct net *net = current->nsproxy->net_ns;
 	struct bpf_dev_offload *offload;
 
-	if (!capable(CAP_SYS_ADMIN))
-		return -EPERM;
+	if (attr->prog_type != BPF_PROG_TYPE_SCHED_CLS &&
+	    attr->prog_type != BPF_PROG_TYPE_XDP)
+		return -EINVAL;
 
 	if (attr->prog_flags)
 		return -EINVAL;
-- 
2.14.1

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

* [PATCH net 03/10] bpf: offload: rename the ifindex field
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 01/10] bpf: offload: add comment warning developers about double destroy Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 02/10] bpf: offload: limit offload to cls_bpf and xdp programs only Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers Jakub Kicinski
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

bpf_target_prog seems long and clunky, rename it to prog_ifindex.
We don't want to call this field just ifindex, because maps
may need a similar field in the future and bpf_attr members for
programs and maps are unnamed.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 include/uapi/linux/bpf.h       | 2 +-
 kernel/bpf/offload.c           | 2 +-
 kernel/bpf/syscall.c           | 4 ++--
 tools/include/uapi/linux/bpf.h | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index e880ae6434ee..3f626df42516 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -262,7 +262,7 @@ union bpf_attr {
 		__u32		kern_version;	/* checked when prog_type=kprobe */
 		__u32		prog_flags;
 		char		prog_name[BPF_OBJ_NAME_LEN];
-		__u32		prog_target_ifindex;	/* ifindex of netdev to prep for */
+		__u32		prog_ifindex;	/* ifindex of netdev to prep for */
 	};
 
 	struct { /* anonymous struct used by BPF_OBJ_* commands */
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index ac187f9ee182..a778e5df7e26 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -29,7 +29,7 @@ int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr)
 	init_waitqueue_head(&offload->verifier_done);
 
 	rtnl_lock();
-	offload->netdev = __dev_get_by_index(net, attr->prog_target_ifindex);
+	offload->netdev = __dev_get_by_index(net, attr->prog_ifindex);
 	if (!offload->netdev) {
 		rtnl_unlock();
 		kfree(offload);
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 09badc37e864..8e9d065bb7cd 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1118,7 +1118,7 @@ struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
 EXPORT_SYMBOL_GPL(bpf_prog_get_type_dev);
 
 /* last field in 'union bpf_attr' used by this command */
-#define	BPF_PROG_LOAD_LAST_FIELD prog_target_ifindex
+#define	BPF_PROG_LOAD_LAST_FIELD prog_ifindex
 
 static int bpf_prog_load(union bpf_attr *attr)
 {
@@ -1181,7 +1181,7 @@ static int bpf_prog_load(union bpf_attr *attr)
 	atomic_set(&prog->aux->refcnt, 1);
 	prog->gpl_compatible = is_gpl ? 1 : 0;
 
-	if (attr->prog_target_ifindex) {
+	if (attr->prog_ifindex) {
 		err = bpf_prog_offload_init(prog, attr);
 		if (err)
 			goto free_prog;
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index e880ae6434ee..3f626df42516 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -262,7 +262,7 @@ union bpf_attr {
 		__u32		kern_version;	/* checked when prog_type=kprobe */
 		__u32		prog_flags;
 		char		prog_name[BPF_OBJ_NAME_LEN];
-		__u32		prog_target_ifindex;	/* ifindex of netdev to prep for */
+		__u32		prog_ifindex;	/* ifindex of netdev to prep for */
 	};
 
 	struct { /* anonymous struct used by BPF_OBJ_* commands */
-- 
2.14.1

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

* [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (2 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 03/10] bpf: offload: rename the ifindex field Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  7:11   ` Jiri Pirko
  2017-11-20  4:55 ` [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode Jakub Kicinski
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

With TC shared block changes we can't depend on correct netdev
pointer being available in cls_bpf.  Move the device validation
to the driver.  Core will only make sure that offloaded programs
are always attached in the driver (or in HW by the driver).  We
trust that drivers which implement offload callbacks will perform
necessary checks.

Moving the checks to the driver is generally a useful thing,
in practice the check should be against a switchdev instance,
not a netdev, given that most ASICs will probably allow using
the same program on many ports.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 drivers/net/ethernet/netronome/nfp/bpf/offload.c | 10 ++++++++--
 include/linux/bpf.h                              |  4 ++--
 kernel/bpf/syscall.c                             | 23 ++++++++++++-----------
 net/core/dev.c                                   |  7 ++-----
 net/sched/cls_bpf.c                              |  8 +++-----
 5 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
index b6cee71f49d3..bc879aeb62d4 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
@@ -214,8 +214,14 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,
 {
 	int err;
 
-	if (prog && !prog->aux->offload)
-		return -EINVAL;
+	if (prog) {
+		struct bpf_dev_offload *offload = prog->aux->offload;
+
+		if (!offload)
+			return -EINVAL;
+		if (offload->netdev != nn->dp.netdev)
+			return -EINVAL;
+	}
 
 	if (prog && old_prog) {
 		u8 cap;
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index c397934f91dd..f82be640731e 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -336,7 +336,7 @@ extern const struct bpf_verifier_ops xdp_analyzer_ops;
 struct bpf_prog *bpf_prog_get(u32 ufd);
 struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type);
 struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
-				       struct net_device *netdev);
+				       bool attach_drv);
 struct bpf_prog * __must_check bpf_prog_add(struct bpf_prog *prog, int i);
 void bpf_prog_sub(struct bpf_prog *prog, int i);
 struct bpf_prog * __must_check bpf_prog_inc(struct bpf_prog *prog);
@@ -433,7 +433,7 @@ static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
 
 static inline struct bpf_prog *bpf_prog_get_type_dev(u32 ufd,
 						     enum bpf_prog_type type,
-						     struct net_device *netdev)
+						     bool attach_drv)
 {
 	return ERR_PTR(-EOPNOTSUPP);
 }
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 8e9d065bb7cd..38da55905ab0 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1057,22 +1057,23 @@ struct bpf_prog *bpf_prog_inc_not_zero(struct bpf_prog *prog)
 }
 EXPORT_SYMBOL_GPL(bpf_prog_inc_not_zero);
 
-static bool bpf_prog_can_attach(struct bpf_prog *prog,
-				enum bpf_prog_type *attach_type,
-				struct net_device *netdev)
+static bool bpf_prog_get_ok(struct bpf_prog *prog,
+			    enum bpf_prog_type *attach_type, bool attach_drv)
 {
-	struct bpf_dev_offload *offload = prog->aux->offload;
+	/* not an attachment, just a refcount inc, always allow */
+	if (!attach_type)
+		return true;
 
 	if (prog->type != *attach_type)
 		return false;
-	if (offload && offload->netdev != netdev)
+	if (bpf_prog_is_dev_bound(prog->aux) && !attach_drv)
 		return false;
 
 	return true;
 }
 
 static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,
-				       struct net_device *netdev)
+				       bool attach_drv)
 {
 	struct fd f = fdget(ufd);
 	struct bpf_prog *prog;
@@ -1080,7 +1081,7 @@ static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,
 	prog = ____bpf_prog_get(f);
 	if (IS_ERR(prog))
 		return prog;
-	if (attach_type && !bpf_prog_can_attach(prog, attach_type, netdev)) {
+	if (!bpf_prog_get_ok(prog, attach_type, attach_drv)) {
 		prog = ERR_PTR(-EINVAL);
 		goto out;
 	}
@@ -1093,12 +1094,12 @@ static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,
 
 struct bpf_prog *bpf_prog_get(u32 ufd)
 {
-	return __bpf_prog_get(ufd, NULL, NULL);
+	return __bpf_prog_get(ufd, NULL, false);
 }
 
 struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type)
 {
-	struct bpf_prog *prog = __bpf_prog_get(ufd, &type, NULL);
+	struct bpf_prog *prog = __bpf_prog_get(ufd, &type, false);
 
 	if (!IS_ERR(prog))
 		trace_bpf_prog_get_type(prog);
@@ -1107,9 +1108,9 @@ struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type)
 EXPORT_SYMBOL_GPL(bpf_prog_get_type);
 
 struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
-				       struct net_device *netdev)
+				       bool attach_drv)
 {
-	struct bpf_prog *prog = __bpf_prog_get(ufd, &type, netdev);
+	struct bpf_prog *prog = __bpf_prog_get(ufd, &type, attach_drv);
 
 	if (!IS_ERR(prog))
 		trace_bpf_prog_get_type(prog);
diff --git a/net/core/dev.c b/net/core/dev.c
index 8ee29f4f5fa9..09525a27319c 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7139,11 +7139,8 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
 		    __dev_xdp_attached(dev, bpf_op, NULL))
 			return -EBUSY;
 
-		if (bpf_op == ops->ndo_bpf)
-			prog = bpf_prog_get_type_dev(fd, BPF_PROG_TYPE_XDP,
-						     dev);
-		else
-			prog = bpf_prog_get_type(fd, BPF_PROG_TYPE_XDP);
+		prog = bpf_prog_get_type_dev(fd, BPF_PROG_TYPE_XDP,
+					     bpf_op == ops->ndo_bpf);
 		if (IS_ERR(prog))
 			return PTR_ERR(prog);
 	}
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
index fb680dafac5a..a9f3e317055c 100644
--- a/net/sched/cls_bpf.c
+++ b/net/sched/cls_bpf.c
@@ -382,15 +382,13 @@ static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog,
 {
 	struct bpf_prog *fp;
 	char *name = NULL;
+	bool skip_sw;
 	u32 bpf_fd;
 
 	bpf_fd = nla_get_u32(tb[TCA_BPF_FD]);
+	skip_sw = gen_flags & TCA_CLS_FLAGS_SKIP_SW;
 
-	if (gen_flags & TCA_CLS_FLAGS_SKIP_SW)
-		fp = bpf_prog_get_type_dev(bpf_fd, BPF_PROG_TYPE_SCHED_CLS,
-					   qdisc_dev(tp->q));
-	else
-		fp = bpf_prog_get_type(bpf_fd, BPF_PROG_TYPE_SCHED_CLS);
+	fp = bpf_prog_get_type_dev(bpf_fd, BPF_PROG_TYPE_SCHED_CLS, skip_sw);
 	if (IS_ERR(fp))
 		return PTR_ERR(fp);
 
-- 
2.14.1

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

* [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (3 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20 14:36   ` David Ahern
  2017-11-20  4:55 ` [PATCH net 06/10] bpf: turn bpf_prog_get_type() into a wrapper Jakub Kicinski
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

Currently device-bound programs are not able to run on the host
to save resources (host JIT is not invoked).  Don't allow XDP
programs to be attached without the HW_MODE flag.  In theory
if program is already translated for device offload the driver
should choose to offload it instead of loading it in the driver.
However, offloading translated program may still fail resulting
in device-bound program being run on the host.

Prevent this by refusing to attach device bound programs if
XDP_FLAGS_HW_MODE is not set.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 net/core/dev.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/net/core/dev.c b/net/core/dev.c
index 09525a27319c..21de2d37a0ba 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7143,6 +7143,13 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
 					     bpf_op == ops->ndo_bpf);
 		if (IS_ERR(prog))
 			return PTR_ERR(prog);
+
+		if (!(flags & XDP_FLAGS_HW_MODE) &&
+		    bpf_prog_is_dev_bound(prog->aux)) {
+			NL_SET_ERR_MSG_MOD(extack, "using device-bound program without HW_MODE flag not supported");
+			bpf_prog_put(prog);
+			return -EINVAL;
+		}
 	}
 
 	err = dev_xdp_install(dev, bpf_op, extack, flags, prog);
-- 
2.14.1

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

* [PATCH net 06/10] bpf: turn bpf_prog_get_type() into a wrapper
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (4 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 07/10] bpf: offload: ignore namespace moves Jakub Kicinski
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

bpf_prog_get_type() is identical to bpf_prog_get_type_dev(),
with false passed as attach_drv.  Instead of keeping it as
an exported symbol turn it into static inline wrapper.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
---
 include/linux/bpf.h  | 13 ++++++-------
 kernel/bpf/syscall.c | 10 ----------
 2 files changed, 6 insertions(+), 17 deletions(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index f82be640731e..37bbab8c0f56 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -334,7 +334,6 @@ extern const struct bpf_verifier_ops tc_cls_act_analyzer_ops;
 extern const struct bpf_verifier_ops xdp_analyzer_ops;
 
 struct bpf_prog *bpf_prog_get(u32 ufd);
-struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type);
 struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
 				       bool attach_drv);
 struct bpf_prog * __must_check bpf_prog_add(struct bpf_prog *prog, int i);
@@ -425,12 +424,6 @@ static inline struct bpf_prog *bpf_prog_get(u32 ufd)
 	return ERR_PTR(-EOPNOTSUPP);
 }
 
-static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
-						 enum bpf_prog_type type)
-{
-	return ERR_PTR(-EOPNOTSUPP);
-}
-
 static inline struct bpf_prog *bpf_prog_get_type_dev(u32 ufd,
 						     enum bpf_prog_type type,
 						     bool attach_drv)
@@ -514,6 +507,12 @@ static inline int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu,
 }
 #endif /* CONFIG_BPF_SYSCALL */
 
+static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
+						 enum bpf_prog_type type)
+{
+	return bpf_prog_get_type_dev(ufd, type, false);
+}
+
 int bpf_prog_offload_compile(struct bpf_prog *prog);
 void bpf_prog_offload_destroy(struct bpf_prog *prog);
 u32 bpf_prog_offload_ifindex(struct bpf_prog *prog);
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 38da55905ab0..41509cf825d8 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1097,16 +1097,6 @@ struct bpf_prog *bpf_prog_get(u32 ufd)
 	return __bpf_prog_get(ufd, NULL, false);
 }
 
-struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type)
-{
-	struct bpf_prog *prog = __bpf_prog_get(ufd, &type, false);
-
-	if (!IS_ERR(prog))
-		trace_bpf_prog_get_type(prog);
-	return prog;
-}
-EXPORT_SYMBOL_GPL(bpf_prog_get_type);
-
 struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
 				       bool attach_drv)
 {
-- 
2.14.1

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

* [PATCH net 07/10] bpf: offload: ignore namespace moves
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (5 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 06/10] bpf: turn bpf_prog_get_type() into a wrapper Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 08/10] bpftool: revert printing program device bound info Jakub Kicinski
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

We are currently destroying the device offload state when device
moves to another net namespace.  This doesn't break with current
NFP code, because offload state is not used on program removal,
but it's not correct behaviour.

Ignore the device unregister notifications on namespace move.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 kernel/bpf/offload.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index a778e5df7e26..d4267c674fec 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -174,6 +174,10 @@ static int bpf_offload_notification(struct notifier_block *notifier,
 
 	switch (event) {
 	case NETDEV_UNREGISTER:
+		/* ignore namespace changes */
+		if (netdev->reg_state != NETREG_UNREGISTERING)
+			break;
+
 		list_for_each_entry_safe(offload, tmp, &bpf_prog_offload_devs,
 					 offloads) {
 			if (offload->netdev == netdev)
-- 
2.14.1

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

* [PATCH net 08/10] bpftool: revert printing program device bound info
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (6 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 07/10] bpf: offload: ignore namespace moves Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 09/10] bpf: revert report offload info to user space Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 10/10] bpf: make bpf_prog_offload_verifier_prep() static inline Jakub Kicinski
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

This reverts commit 928631e05495 ("bpftool: print program device bound
info").  We will remove this API and redo it right in -next.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 tools/bpf/bpftool/prog.c       | 31 -------------------------------
 tools/include/uapi/linux/bpf.h |  6 ------
 2 files changed, 37 deletions(-)

diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index f45c44ef9bec..ad619b96c276 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -41,7 +41,6 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <net/if.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -230,21 +229,6 @@ static void print_prog_json(struct bpf_prog_info *info, int fd)
 		     info->tag[0], info->tag[1], info->tag[2], info->tag[3],
 		     info->tag[4], info->tag[5], info->tag[6], info->tag[7]);
 
-	if (info->status & BPF_PROG_STATUS_DEV_BOUND) {
-		jsonw_name(json_wtr, "dev");
-		if (info->ifindex) {
-			char name[IF_NAMESIZE];
-
-			if (!if_indextoname(info->ifindex, name))
-				jsonw_printf(json_wtr, "\"ifindex:%d\"",
-					     info->ifindex);
-			else
-				jsonw_printf(json_wtr, "\"%s\"", name);
-		} else {
-			jsonw_printf(json_wtr, "\"unknown\"");
-		}
-	}
-
 	if (info->load_time) {
 		char buf[32];
 
@@ -302,21 +286,6 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
-	printf(" ");
-
-	if (info->status & BPF_PROG_STATUS_DEV_BOUND) {
-		printf("dev ");
-		if (info->ifindex) {
-			char name[IF_NAMESIZE];
-
-			if (!if_indextoname(info->ifindex, name))
-				printf("ifindex:%d ", info->ifindex);
-			else
-				printf("%s ", name);
-		} else {
-			printf("unknown ");
-		}
-	}
 	printf("\n");
 
 	if (info->load_time) {
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 3f626df42516..4c223ab30293 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -897,10 +897,6 @@ enum sk_action {
 
 #define BPF_TAG_SIZE	8
 
-enum bpf_prog_status {
-	BPF_PROG_STATUS_DEV_BOUND	= (1 << 0),
-};
-
 struct bpf_prog_info {
 	__u32 type;
 	__u32 id;
@@ -914,8 +910,6 @@ struct bpf_prog_info {
 	__u32 nr_map_ids;
 	__aligned_u64 map_ids;
 	char name[BPF_OBJ_NAME_LEN];
-	__u32 ifindex;
-	__u32 status;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {
-- 
2.14.1

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

* [PATCH net 09/10] bpf: revert report offload info to user space
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (7 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 08/10] bpftool: revert printing program device bound info Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  2017-11-20  4:55 ` [PATCH net 10/10] bpf: make bpf_prog_offload_verifier_prep() static inline Jakub Kicinski
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

This reverts commit bd601b6ada11 ("bpf: report offload info to user
space").  The ifindex by itself is not sufficient, we should provide
information on which network namespace this ifindex belongs to.
After considering some options we concluded that it's best to just
remove this API for now, and rework it in -next.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 include/linux/bpf.h      |  1 -
 include/uapi/linux/bpf.h |  6 ------
 kernel/bpf/offload.c     | 12 ------------
 kernel/bpf/syscall.c     |  5 -----
 4 files changed, 24 deletions(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 37bbab8c0f56..76c577281d78 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -515,7 +515,6 @@ static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
 
 int bpf_prog_offload_compile(struct bpf_prog *prog);
 void bpf_prog_offload_destroy(struct bpf_prog *prog);
-u32 bpf_prog_offload_ifindex(struct bpf_prog *prog);
 
 #if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL)
 int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr);
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 3f626df42516..4c223ab30293 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -897,10 +897,6 @@ enum sk_action {
 
 #define BPF_TAG_SIZE	8
 
-enum bpf_prog_status {
-	BPF_PROG_STATUS_DEV_BOUND	= (1 << 0),
-};
-
 struct bpf_prog_info {
 	__u32 type;
 	__u32 id;
@@ -914,8 +910,6 @@ struct bpf_prog_info {
 	__u32 nr_map_ids;
 	__aligned_u64 map_ids;
 	char name[BPF_OBJ_NAME_LEN];
-	__u32 ifindex;
-	__u32 status;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index d4267c674fec..68ec884440b7 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -149,18 +149,6 @@ int bpf_prog_offload_compile(struct bpf_prog *prog)
 	return bpf_prog_offload_translate(prog);
 }
 
-u32 bpf_prog_offload_ifindex(struct bpf_prog *prog)
-{
-	struct bpf_dev_offload *offload = prog->aux->offload;
-	u32 ifindex;
-
-	rtnl_lock();
-	ifindex = offload->netdev ? offload->netdev->ifindex : 0;
-	rtnl_unlock();
-
-	return ifindex;
-}
-
 const struct bpf_prog_ops bpf_offload_prog_ops = {
 };
 
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 41509cf825d8..2c4cfeaa8d5e 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1616,11 +1616,6 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
 			return -EFAULT;
 	}
 
-	if (bpf_prog_is_dev_bound(prog->aux)) {
-		info.status |= BPF_PROG_STATUS_DEV_BOUND;
-		info.ifindex = bpf_prog_offload_ifindex(prog);
-	}
-
 done:
 	if (copy_to_user(uinfo, &info, info_len) ||
 	    put_user(info_len, &uattr->info.info_len))
-- 
2.14.1

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

* [PATCH net 10/10] bpf: make bpf_prog_offload_verifier_prep() static inline
  2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
                   ` (8 preceding siblings ...)
  2017-11-20  4:55 ` [PATCH net 09/10] bpf: revert report offload info to user space Jakub Kicinski
@ 2017-11-20  4:55 ` Jakub Kicinski
  9 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20  4:55 UTC (permalink / raw)
  To: netdev; +Cc: alexei.starovoitov, daniel, Jakub Kicinski

Header implementation of bpf_prog_offload_verifier_prep() which
is used if CONFIG_NET=n should be a static inline.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 include/linux/bpf_verifier.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index 07b96aaca256..b61482d354a2 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -171,7 +171,7 @@ static inline struct bpf_reg_state *cur_regs(struct bpf_verifier_env *env)
 #if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL)
 int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env);
 #else
-int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env)
+static inline int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env)
 {
 	return -EOPNOTSUPP;
 }
-- 
2.14.1

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

* Re: [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers
  2017-11-20  4:55 ` [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers Jakub Kicinski
@ 2017-11-20  7:11   ` Jiri Pirko
  0 siblings, 0 replies; 15+ messages in thread
From: Jiri Pirko @ 2017-11-20  7:11 UTC (permalink / raw)
  To: Jakub Kicinski; +Cc: netdev, alexei.starovoitov, daniel

Mon, Nov 20, 2017 at 05:55:16AM CET, jakub.kicinski@netronome.com wrote:
>With TC shared block changes we can't depend on correct netdev
>pointer being available in cls_bpf.  Move the device validation
>to the driver.  Core will only make sure that offloaded programs
>are always attached in the driver (or in HW by the driver).  We
>trust that drivers which implement offload callbacks will perform
>necessary checks.
>
>Moving the checks to the driver is generally a useful thing,
>in practice the check should be against a switchdev instance,
>not a netdev, given that most ASICs will probably allow using
>the same program on many ports.
>
>Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
>Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
>Acked-by: Alexei Starovoitov <ast@kernel.org>
>Acked-by: Daniel Borkmann <daniel@iogearbox.net>

Acked-by: Jiri Pirko <jiri@mellanox.com>

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

* Re: [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode
  2017-11-20  4:55 ` [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode Jakub Kicinski
@ 2017-11-20 14:36   ` David Ahern
  2017-11-20 22:02     ` Jakub Kicinski
  0 siblings, 1 reply; 15+ messages in thread
From: David Ahern @ 2017-11-20 14:36 UTC (permalink / raw)
  To: Jakub Kicinski, netdev; +Cc: alexei.starovoitov, daniel

On 11/19/17 9:55 PM, Jakub Kicinski wrote:
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 09525a27319c..21de2d37a0ba 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -7143,6 +7143,13 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
>  					     bpf_op == ops->ndo_bpf);
>  		if (IS_ERR(prog))
>  			return PTR_ERR(prog);
> +
> +		if (!(flags & XDP_FLAGS_HW_MODE) &&
> +		    bpf_prog_is_dev_bound(prog->aux)) {
> +			NL_SET_ERR_MSG_MOD(extack, "using device-bound program without HW_MODE flag not supported");

I don't see dev_change_xdp_fd called by device drivers, so that should
just be NL_SET_ERR_MSG. Also, "is not supported" sounds better to me
than just "not supported".

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

* Re: [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode
  2017-11-20 14:36   ` David Ahern
@ 2017-11-20 22:02     ` Jakub Kicinski
  2017-11-20 22:21       ` Daniel Borkmann
  0 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2017-11-20 22:02 UTC (permalink / raw)
  To: David Ahern; +Cc: netdev, alexei.starovoitov, daniel

On Mon, 20 Nov 2017 07:36:39 -0700, David Ahern wrote:
> On 11/19/17 9:55 PM, Jakub Kicinski wrote:
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index 09525a27319c..21de2d37a0ba 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -7143,6 +7143,13 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
> >  					     bpf_op == ops->ndo_bpf);
> >  		if (IS_ERR(prog))
> >  			return PTR_ERR(prog);
> > +
> > +		if (!(flags & XDP_FLAGS_HW_MODE) &&
> > +		    bpf_prog_is_dev_bound(prog->aux)) {
> > +			NL_SET_ERR_MSG_MOD(extack, "using device-bound program without HW_MODE flag not supported");  
> 
> I don't see dev_change_xdp_fd called by device drivers, so that should
> just be NL_SET_ERR_MSG. Also, "is not supported" sounds better to me
> than just "not supported".

Thanks, I'll give others a couple more hours and respin!

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

* Re: [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode
  2017-11-20 22:02     ` Jakub Kicinski
@ 2017-11-20 22:21       ` Daniel Borkmann
  0 siblings, 0 replies; 15+ messages in thread
From: Daniel Borkmann @ 2017-11-20 22:21 UTC (permalink / raw)
  To: Jakub Kicinski, David Ahern; +Cc: netdev, alexei.starovoitov

Hi Jakub,

On 11/20/2017 11:02 PM, Jakub Kicinski wrote:
> On Mon, 20 Nov 2017 07:36:39 -0700, David Ahern wrote:
>> On 11/19/17 9:55 PM, Jakub Kicinski wrote:
>>> diff --git a/net/core/dev.c b/net/core/dev.c
>>> index 09525a27319c..21de2d37a0ba 100644
>>> --- a/net/core/dev.c
>>> +++ b/net/core/dev.c
>>> @@ -7143,6 +7143,13 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
>>>  					     bpf_op == ops->ndo_bpf);
>>>  		if (IS_ERR(prog))
>>>  			return PTR_ERR(prog);
>>> +
>>> +		if (!(flags & XDP_FLAGS_HW_MODE) &&
>>> +		    bpf_prog_is_dev_bound(prog->aux)) {
>>> +			NL_SET_ERR_MSG_MOD(extack, "using device-bound program without HW_MODE flag not supported");  
>>
>> I don't see dev_change_xdp_fd called by device drivers, so that should
>> just be NL_SET_ERR_MSG. Also, "is not supported" sounds better to me
>> than just "not supported".
> 
> Thanks, I'll give others a couple more hours and respin!

The rest of the series looks good to me, please respin with the minor
changes requested.

Thanks,
Daniel

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

end of thread, other threads:[~2017-11-20 22:21 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-20  4:55 [PATCH net 00/10] bpf: offload: check netdev pointer in the drivers and namespace trouble Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 01/10] bpf: offload: add comment warning developers about double destroy Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 02/10] bpf: offload: limit offload to cls_bpf and xdp programs only Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 03/10] bpf: offload: rename the ifindex field Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 04/10] bpf: offload: move offload device validation out to the drivers Jakub Kicinski
2017-11-20  7:11   ` Jiri Pirko
2017-11-20  4:55 ` [PATCH net 05/10] net: xdp: don't allow device-bound programs in driver mode Jakub Kicinski
2017-11-20 14:36   ` David Ahern
2017-11-20 22:02     ` Jakub Kicinski
2017-11-20 22:21       ` Daniel Borkmann
2017-11-20  4:55 ` [PATCH net 06/10] bpf: turn bpf_prog_get_type() into a wrapper Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 07/10] bpf: offload: ignore namespace moves Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 08/10] bpftool: revert printing program device bound info Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 09/10] bpf: revert report offload info to user space Jakub Kicinski
2017-11-20  4:55 ` [PATCH net 10/10] bpf: make bpf_prog_offload_verifier_prep() static inline Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).