Skip to content

Commit ea34a00

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Daniel Borkmann says: ==================== pull-request: bpf 2019-02-23 The following pull-request contains BPF updates for your *net* tree. The main changes are: 1) Fix a bug in BPF's LPM deletion logic to match correct prefix length, from Alban. 2) Fix AF_XDP teardown by not destroying umem prematurely as it is still needed till all outstanding skbs are freed, from Björn. 3) Fix unkillable BPF_PROG_TEST_RUN under preempt kernel by checking signal_pending() outside need_resched() condition which is never triggered there, from Stanislav. 4) Fix two nfp JIT bugs, one in code emission for K-based xor, and another one to explicitly clear upper bits in alu32, from Jiong. 5) Add bpf list address to maintainers file, from Daniel. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 40e8f0b + b4b8bb6 commit ea34a00

File tree

6 files changed

+69
-34
lines changed

6 files changed

+69
-34
lines changed

MAINTAINERS

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2852,7 +2852,7 @@ R: Martin KaFai Lau <kafai@fb.com>
28522852
R: Song Liu <songliubraving@fb.com>
28532853
R: Yonghong Song <yhs@fb.com>
28542854
L: netdev@vger.kernel.org
2855-
L: linux-kernel@vger.kernel.org
2855+
L: bpf@vger.kernel.org
28562856
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
28572857
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
28582858
Q: https://patchwork.ozlabs.org/project/netdev/list/?delegate=77147
@@ -2882,6 +2882,7 @@ N: bpf
28822882
BPF JIT for ARM
28832883
M: Shubham Bansal <illusionist.neo@gmail.com>
28842884
L: netdev@vger.kernel.org
2885+
L: bpf@vger.kernel.org
28852886
S: Maintained
28862887
F: arch/arm/net/
28872888

@@ -2890,52 +2891,60 @@ M: Daniel Borkmann <daniel@iogearbox.net>
28902891
M: Alexei Starovoitov <ast@kernel.org>
28912892
M: Zi Shen Lim <zlim.lnx@gmail.com>
28922893
L: netdev@vger.kernel.org
2894+
L: bpf@vger.kernel.org
28932895
S: Supported
28942896
F: arch/arm64/net/
28952897

28962898
BPF JIT for MIPS (32-BIT AND 64-BIT)
28972899
M: Paul Burton <paul.burton@mips.com>
28982900
L: netdev@vger.kernel.org
2901+
L: bpf@vger.kernel.org
28992902
S: Maintained
29002903
F: arch/mips/net/
29012904

29022905
BPF JIT for NFP NICs
29032906
M: Jakub Kicinski <jakub.kicinski@netronome.com>
29042907
L: netdev@vger.kernel.org
2908+
L: bpf@vger.kernel.org
29052909
S: Supported
29062910
F: drivers/net/ethernet/netronome/nfp/bpf/
29072911

29082912
BPF JIT for POWERPC (32-BIT AND 64-BIT)
29092913
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
29102914
M: Sandipan Das <sandipan@linux.ibm.com>
29112915
L: netdev@vger.kernel.org
2916+
L: bpf@vger.kernel.org
29122917
S: Maintained
29132918
F: arch/powerpc/net/
29142919

29152920
BPF JIT for S390
29162921
M: Martin Schwidefsky <schwidefsky@de.ibm.com>
29172922
M: Heiko Carstens <heiko.carstens@de.ibm.com>
29182923
L: netdev@vger.kernel.org
2924+
L: bpf@vger.kernel.org
29192925
S: Maintained
29202926
F: arch/s390/net/
29212927
X: arch/s390/net/pnet.c
29222928

29232929
BPF JIT for SPARC (32-BIT AND 64-BIT)
29242930
M: David S. Miller <davem@davemloft.net>
29252931
L: netdev@vger.kernel.org
2932+
L: bpf@vger.kernel.org
29262933
S: Maintained
29272934
F: arch/sparc/net/
29282935

29292936
BPF JIT for X86 32-BIT
29302937
M: Wang YanQing <udknight@gmail.com>
29312938
L: netdev@vger.kernel.org
2939+
L: bpf@vger.kernel.org
29322940
S: Maintained
29332941
F: arch/x86/net/bpf_jit_comp32.c
29342942

29352943
BPF JIT for X86 64-BIT
29362944
M: Alexei Starovoitov <ast@kernel.org>
29372945
M: Daniel Borkmann <daniel@iogearbox.net>
29382946
L: netdev@vger.kernel.org
2947+
L: bpf@vger.kernel.org
29392948
S: Supported
29402949
F: arch/x86/net/
29412950
X: arch/x86/net/bpf_jit_comp32.c
@@ -8486,6 +8495,7 @@ L7 BPF FRAMEWORK
84868495
M: John Fastabend <john.fastabend@gmail.com>
84878496
M: Daniel Borkmann <daniel@iogearbox.net>
84888497
L: netdev@vger.kernel.org
8498+
L: bpf@vger.kernel.org
84898499
S: Maintained
84908500
F: include/linux/skmsg.h
84918501
F: net/core/skmsg.c
@@ -16713,6 +16723,7 @@ M: Jesper Dangaard Brouer <hawk@kernel.org>
1671316723
M: John Fastabend <john.fastabend@gmail.com>
1671416724
L: netdev@vger.kernel.org
1671516725
L: xdp-newbies@vger.kernel.org
16726+
L: bpf@vger.kernel.org
1671616727
S: Supported
1671716728
F: net/core/xdp.c
1671816729
F: include/net/xdp.h
@@ -16726,6 +16737,7 @@ XDP SOCKETS (AF_XDP)
1672616737
M: Björn Töpel <bjorn.topel@intel.com>
1672716738
M: Magnus Karlsson <magnus.karlsson@intel.com>
1672816739
L: netdev@vger.kernel.org
16740+
L: bpf@vger.kernel.org
1672916741
S: Maintained
1673016742
F: kernel/bpf/xskmap.c
1673116743
F: net/xdp/

drivers/net/ethernet/netronome/nfp/bpf/jit.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,15 +1291,10 @@ wrp_alu64_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
12911291

12921292
static int
12931293
wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
1294-
enum alu_op alu_op, bool skip)
1294+
enum alu_op alu_op)
12951295
{
12961296
const struct bpf_insn *insn = &meta->insn;
12971297

1298-
if (skip) {
1299-
meta->skip = true;
1300-
return 0;
1301-
}
1302-
13031298
wrp_alu_imm(nfp_prog, insn->dst_reg * 2, alu_op, insn->imm);
13041299
wrp_immed(nfp_prog, reg_both(insn->dst_reg * 2 + 1), 0);
13051300

@@ -2309,7 +2304,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23092304

23102305
static int xor_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23112306
{
2312-
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR, !~meta->insn.imm);
2307+
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR);
23132308
}
23142309

23152310
static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
@@ -2319,7 +2314,7 @@ static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23192314

23202315
static int and_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23212316
{
2322-
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND, !~meta->insn.imm);
2317+
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND);
23232318
}
23242319

23252320
static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
@@ -2329,7 +2324,7 @@ static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23292324

23302325
static int or_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23312326
{
2332-
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR, !meta->insn.imm);
2327+
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR);
23332328
}
23342329

23352330
static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
@@ -2339,7 +2334,7 @@ static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23392334

23402335
static int add_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23412336
{
2342-
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD, !meta->insn.imm);
2337+
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD);
23432338
}
23442339

23452340
static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
@@ -2349,7 +2344,7 @@ static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23492344

23502345
static int sub_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
23512346
{
2352-
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB, !meta->insn.imm);
2347+
return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB);
23532348
}
23542349

23552350
static int mul_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)

kernel/bpf/lpm_trie.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ static int trie_delete_elem(struct bpf_map *map, void *_key)
471471
}
472472

473473
if (!node || node->prefixlen != key->prefixlen ||
474+
node->prefixlen != matchlen ||
474475
(node->flags & LPM_TREE_NODE_FLAG_IM)) {
475476
ret = -ENOENT;
476477
goto out;

net/bpf/test_run.c

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,13 @@
1313
#include <net/sock.h>
1414
#include <net/tcp.h>
1515

16-
static __always_inline u32 bpf_test_run_one(struct bpf_prog *prog, void *ctx,
17-
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE])
18-
{
19-
u32 ret;
20-
21-
preempt_disable();
22-
rcu_read_lock();
23-
bpf_cgroup_storage_set(storage);
24-
ret = BPF_PROG_RUN(prog, ctx);
25-
rcu_read_unlock();
26-
preempt_enable();
27-
28-
return ret;
29-
}
30-
31-
static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *ret,
32-
u32 *time)
16+
static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat,
17+
u32 *retval, u32 *time)
3318
{
3419
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE] = { 0 };
3520
enum bpf_cgroup_storage_type stype;
3621
u64 time_start, time_spent = 0;
22+
int ret = 0;
3723
u32 i;
3824

3925
for_each_cgroup_storage_type(stype) {
@@ -48,25 +34,42 @@ static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat, u32 *ret,
4834

4935
if (!repeat)
5036
repeat = 1;
37+
38+
rcu_read_lock();
39+
preempt_disable();
5140
time_start = ktime_get_ns();
5241
for (i = 0; i < repeat; i++) {
53-
*ret = bpf_test_run_one(prog, ctx, storage);
42+
bpf_cgroup_storage_set(storage);
43+
*retval = BPF_PROG_RUN(prog, ctx);
44+
45+
if (signal_pending(current)) {
46+
ret = -EINTR;
47+
break;
48+
}
49+
5450
if (need_resched()) {
55-
if (signal_pending(current))
56-
break;
5751
time_spent += ktime_get_ns() - time_start;
52+
preempt_enable();
53+
rcu_read_unlock();
54+
5855
cond_resched();
56+
57+
rcu_read_lock();
58+
preempt_disable();
5959
time_start = ktime_get_ns();
6060
}
6161
}
6262
time_spent += ktime_get_ns() - time_start;
63+
preempt_enable();
64+
rcu_read_unlock();
65+
6366
do_div(time_spent, repeat);
6467
*time = time_spent > U32_MAX ? U32_MAX : (u32)time_spent;
6568

6669
for_each_cgroup_storage_type(stype)
6770
bpf_cgroup_storage_free(storage[stype]);
6871

69-
return 0;
72+
return ret;
7073
}
7174

7275
static int bpf_test_finish(const union bpf_attr *kattr,

net/xdp/xsk.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,6 @@ static int xsk_release(struct socket *sock)
366366

367367
xskq_destroy(xs->rx);
368368
xskq_destroy(xs->tx);
369-
xdp_put_umem(xs->umem);
370369

371370
sock_orphan(sk);
372371
sock->sk = NULL;
@@ -718,6 +717,18 @@ static const struct proto_ops xsk_proto_ops = {
718717
.sendpage = sock_no_sendpage,
719718
};
720719

720+
static void xsk_destruct(struct sock *sk)
721+
{
722+
struct xdp_sock *xs = xdp_sk(sk);
723+
724+
if (!sock_flag(sk, SOCK_DEAD))
725+
return;
726+
727+
xdp_put_umem(xs->umem);
728+
729+
sk_refcnt_debug_dec(sk);
730+
}
731+
721732
static int xsk_create(struct net *net, struct socket *sock, int protocol,
722733
int kern)
723734
{
@@ -744,6 +755,9 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol,
744755

745756
sk->sk_family = PF_XDP;
746757

758+
sk->sk_destruct = xsk_destruct;
759+
sk_refcnt_debug_inc(sk);
760+
747761
sock_set_flag(sk, SOCK_RCU_FREE);
748762

749763
xs = xdp_sk(sk);

tools/testing/selftests/bpf/test_lpm_map.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,16 @@ static void test_lpm_delete(void)
474474
assert(bpf_map_lookup_elem(map_fd, key, &value) == -1 &&
475475
errno == ENOENT);
476476

477+
key->prefixlen = 30; // unused prefix so far
478+
inet_pton(AF_INET, "192.255.0.0", key->data);
479+
assert(bpf_map_delete_elem(map_fd, key) == -1 &&
480+
errno == ENOENT);
481+
482+
key->prefixlen = 16; // same prefix as the root node
483+
inet_pton(AF_INET, "192.255.0.0", key->data);
484+
assert(bpf_map_delete_elem(map_fd, key) == -1 &&
485+
errno == ENOENT);
486+
477487
/* assert initial lookup */
478488
key->prefixlen = 32;
479489
inet_pton(AF_INET, "192.168.0.1", key->data);

0 commit comments

Comments
 (0)