Skip to content

Commit 4afe60a

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Daniel Borkmann says: ==================== pull-request: bpf-next 2018-11-26 The following pull-request contains BPF updates for your *net-next* tree. The main changes are: 1) Extend BTF to support function call types and improve the BPF symbol handling with this info for kallsyms and bpftool program dump to make debugging easier, from Martin and Yonghong. 2) Optimize LPM lookups by making longest_prefix_match() handle multiple bytes at a time, from Eric. 3) Adds support for loading and attaching flow dissector BPF progs from bpftool, from Stanislav. 4) Extend the sk_lookup() helper to be supported from XDP, from Nitin. 5) Enable verifier to support narrow context loads with offset > 0 to adapt to LLVM code generation (currently only offset of 0 was supported). Add test cases as well, from Andrey. 6) Simplify passing device functions for offloaded BPF progs by adding callbacks to bpf_prog_offload_ops instead of ndo_bpf. Also convert nfp and netdevsim to make use of them, from Quentin. 7) Add support for sock_ops based BPF programs to send events to the perf ring-buffer through perf_event_output helper, from Sowmini and Daniel. 8) Add read / write support for skb->tstamp from tc BPF and cg BPF programs to allow for supporting rate-limiting in EDT qdiscs like fq from BPF side, from Vlad. 9) Extend libbpf API to support map in map types and add test cases for it as well to BPF kselftests, from Nikita. 10) Account the maximum packet offset accessed by a BPF program in the verifier and use it for optimizing nfp JIT, from Jiong. 11) Fix error handling regarding kprobe_events in BPF sample loader, from Daniel T. 12) Add support for queue and stack map type in bpftool, from David. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 4bffc66 + ffac28f commit 4afe60a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+4208
-596
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ static int nfp_bpf_init(struct nfp_app *app)
465465
app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf);
466466
}
467467

468-
bpf->bpf_dev = bpf_offload_dev_create();
468+
bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops);
469469
err = PTR_ERR_OR_ZERO(bpf->bpf_dev);
470470
if (err)
471471
goto err_free_neutral_maps;

drivers/net/ethernet/netronome/nfp/bpf/main.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,11 @@ void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt);
509509
int nfp_bpf_jit(struct nfp_prog *prog);
510510
bool nfp_bpf_supported_opcode(u8 code);
511511

512-
extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops;
512+
int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx,
513+
int prev_insn_idx);
514+
int nfp_bpf_finalize(struct bpf_verifier_env *env);
515+
516+
extern const struct bpf_prog_offload_ops nfp_bpf_dev_ops;
513517

514518
struct netdev_bpf;
515519
struct nfp_app;

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

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ nfp_map_ptr_record(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog,
3333
struct nfp_bpf_neutral_map *record;
3434
int err;
3535

36-
/* Map record paths are entered via ndo, update side is protected. */
37-
ASSERT_RTNL();
38-
3936
/* Reuse path - other offloaded program is already tracking this map. */
4037
record = rhashtable_lookup_fast(&bpf->maps_neutral, &map->id,
4138
nfp_bpf_maps_neutral_params);
@@ -84,8 +81,6 @@ nfp_map_ptrs_forget(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog)
8481
bool freed = false;
8582
int i;
8683

87-
ASSERT_RTNL();
88-
8984
for (i = 0; i < nfp_prog->map_records_cnt; i++) {
9085
if (--nfp_prog->map_records[i]->count) {
9186
nfp_prog->map_records[i] = NULL;
@@ -187,11 +182,10 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog)
187182
kfree(nfp_prog);
188183
}
189184

190-
static int
191-
nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,
192-
struct netdev_bpf *bpf)
185+
static int nfp_bpf_verifier_prep(struct bpf_prog *prog)
193186
{
194-
struct bpf_prog *prog = bpf->verifier.prog;
187+
struct nfp_net *nn = netdev_priv(prog->aux->offload->netdev);
188+
struct nfp_app *app = nn->app;
195189
struct nfp_prog *nfp_prog;
196190
int ret;
197191

@@ -209,7 +203,6 @@ nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,
209203
goto err_free;
210204

211205
nfp_prog->verifier_meta = nfp_prog_first_meta(nfp_prog);
212-
bpf->verifier.ops = &nfp_bpf_analyzer_ops;
213206

214207
return 0;
215208

@@ -219,8 +212,9 @@ nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn,
219212
return ret;
220213
}
221214

222-
static int nfp_bpf_translate(struct nfp_net *nn, struct bpf_prog *prog)
215+
static int nfp_bpf_translate(struct bpf_prog *prog)
223216
{
217+
struct nfp_net *nn = netdev_priv(prog->aux->offload->netdev);
224218
struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;
225219
unsigned int max_instr;
226220
int err;
@@ -242,15 +236,13 @@ static int nfp_bpf_translate(struct nfp_net *nn, struct bpf_prog *prog)
242236
return nfp_map_ptrs_record(nfp_prog->bpf, nfp_prog, prog);
243237
}
244238

245-
static int nfp_bpf_destroy(struct nfp_net *nn, struct bpf_prog *prog)
239+
static void nfp_bpf_destroy(struct bpf_prog *prog)
246240
{
247241
struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;
248242

249243
kvfree(nfp_prog->prog);
250244
nfp_map_ptrs_forget(nfp_prog->bpf, nfp_prog);
251245
nfp_prog_free(nfp_prog);
252-
253-
return 0;
254246
}
255247

256248
/* Atomic engine requires values to be in big endian, we need to byte swap
@@ -422,12 +414,6 @@ nfp_bpf_map_free(struct nfp_app_bpf *bpf, struct bpf_offloaded_map *offmap)
422414
int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf)
423415
{
424416
switch (bpf->command) {
425-
case BPF_OFFLOAD_VERIFIER_PREP:
426-
return nfp_bpf_verifier_prep(app, nn, bpf);
427-
case BPF_OFFLOAD_TRANSLATE:
428-
return nfp_bpf_translate(nn, bpf->offload.prog);
429-
case BPF_OFFLOAD_DESTROY:
430-
return nfp_bpf_destroy(nn, bpf->offload.prog);
431417
case BPF_OFFLOAD_MAP_ALLOC:
432418
return nfp_bpf_map_alloc(app->priv, bpf->offmap);
433419
case BPF_OFFLOAD_MAP_FREE:
@@ -489,14 +475,15 @@ nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog,
489475
struct netlink_ext_ack *extack)
490476
{
491477
struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;
492-
unsigned int max_mtu, max_stack, max_prog_len;
478+
unsigned int fw_mtu, pkt_off, max_stack, max_prog_len;
493479
dma_addr_t dma_addr;
494480
void *img;
495481
int err;
496482

497-
max_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32;
498-
if (max_mtu < nn->dp.netdev->mtu) {
499-
NL_SET_ERR_MSG_MOD(extack, "BPF offload not supported with MTU larger than HW packet split boundary");
483+
fw_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32;
484+
pkt_off = min(prog->aux->max_pkt_offset, nn->dp.netdev->mtu);
485+
if (fw_mtu < pkt_off) {
486+
NL_SET_ERR_MSG_MOD(extack, "BPF offload not supported with potential packet access beyond HW packet split boundary");
500487
return -EOPNOTSUPP;
501488
}
502489

@@ -600,3 +587,11 @@ int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog,
600587

601588
return 0;
602589
}
590+
591+
const struct bpf_prog_offload_ops nfp_bpf_dev_ops = {
592+
.insn_hook = nfp_verify_insn,
593+
.finalize = nfp_bpf_finalize,
594+
.prepare = nfp_bpf_verifier_prep,
595+
.translate = nfp_bpf_translate,
596+
.destroy = nfp_bpf_destroy,
597+
};

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -623,8 +623,8 @@ nfp_bpf_check_alu(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
623623
return 0;
624624
}
625625

626-
static int
627-
nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx)
626+
int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx,
627+
int prev_insn_idx)
628628
{
629629
struct nfp_prog *nfp_prog = env->prog->aux->offload->dev_priv;
630630
struct nfp_insn_meta *meta = nfp_prog->verifier_meta;
@@ -745,7 +745,7 @@ nfp_bpf_get_stack_usage(struct nfp_prog *nfp_prog, unsigned int cnt)
745745
goto continue_subprog;
746746
}
747747

748-
static int nfp_bpf_finalize(struct bpf_verifier_env *env)
748+
int nfp_bpf_finalize(struct bpf_verifier_env *env)
749749
{
750750
struct bpf_subprog_info *info;
751751
struct nfp_prog *nfp_prog;
@@ -788,8 +788,3 @@ static int nfp_bpf_finalize(struct bpf_verifier_env *env)
788788

789789
return 0;
790790
}
791-
792-
const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops = {
793-
.insn_hook = nfp_verify_insn,
794-
.finalize = nfp_bpf_finalize,
795-
};

drivers/net/netdevsim/bpf.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,6 @@ static int nsim_bpf_finalize(struct bpf_verifier_env *env)
9191
return 0;
9292
}
9393

94-
static const struct bpf_prog_offload_ops nsim_bpf_analyzer_ops = {
95-
.insn_hook = nsim_bpf_verify_insn,
96-
.finalize = nsim_bpf_finalize,
97-
};
98-
9994
static bool nsim_xdp_offload_active(struct netdevsim *ns)
10095
{
10196
return ns->xdp_hw.prog;
@@ -263,6 +258,24 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog)
263258
return 0;
264259
}
265260

261+
static int nsim_bpf_verifier_prep(struct bpf_prog *prog)
262+
{
263+
struct netdevsim *ns = netdev_priv(prog->aux->offload->netdev);
264+
265+
if (!ns->bpf_bind_accept)
266+
return -EOPNOTSUPP;
267+
268+
return nsim_bpf_create_prog(ns, prog);
269+
}
270+
271+
static int nsim_bpf_translate(struct bpf_prog *prog)
272+
{
273+
struct nsim_bpf_bound_prog *state = prog->aux->offload->dev_priv;
274+
275+
state->state = "xlated";
276+
return 0;
277+
}
278+
266279
static void nsim_bpf_destroy_prog(struct bpf_prog *prog)
267280
{
268281
struct nsim_bpf_bound_prog *state;
@@ -275,6 +288,14 @@ static void nsim_bpf_destroy_prog(struct bpf_prog *prog)
275288
kfree(state);
276289
}
277290

291+
static const struct bpf_prog_offload_ops nsim_bpf_dev_ops = {
292+
.insn_hook = nsim_bpf_verify_insn,
293+
.finalize = nsim_bpf_finalize,
294+
.prepare = nsim_bpf_verifier_prep,
295+
.translate = nsim_bpf_translate,
296+
.destroy = nsim_bpf_destroy_prog,
297+
};
298+
278299
static int nsim_setup_prog_checks(struct netdevsim *ns, struct netdev_bpf *bpf)
279300
{
280301
if (bpf->prog && bpf->prog->aux->offload) {
@@ -533,30 +554,11 @@ static void nsim_bpf_map_free(struct bpf_offloaded_map *offmap)
533554
int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf)
534555
{
535556
struct netdevsim *ns = netdev_priv(dev);
536-
struct nsim_bpf_bound_prog *state;
537557
int err;
538558

539559
ASSERT_RTNL();
540560

541561
switch (bpf->command) {
542-
case BPF_OFFLOAD_VERIFIER_PREP:
543-
if (!ns->bpf_bind_accept)
544-
return -EOPNOTSUPP;
545-
546-
err = nsim_bpf_create_prog(ns, bpf->verifier.prog);
547-
if (err)
548-
return err;
549-
550-
bpf->verifier.ops = &nsim_bpf_analyzer_ops;
551-
return 0;
552-
case BPF_OFFLOAD_TRANSLATE:
553-
state = bpf->offload.prog->aux->offload->dev_priv;
554-
555-
state->state = "xlated";
556-
return 0;
557-
case BPF_OFFLOAD_DESTROY:
558-
nsim_bpf_destroy_prog(bpf->offload.prog);
559-
return 0;
560562
case XDP_QUERY_PROG:
561563
return xdp_attachment_query(&ns->xdp, bpf);
562564
case XDP_QUERY_PROG_HW:
@@ -599,7 +601,7 @@ int nsim_bpf_init(struct netdevsim *ns)
599601
if (IS_ERR_OR_NULL(ns->sdev->ddir_bpf_bound_progs))
600602
return -ENOMEM;
601603

602-
ns->sdev->bpf_dev = bpf_offload_dev_create();
604+
ns->sdev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops);
603605
err = PTR_ERR_OR_ZERO(ns->sdev->bpf_dev);
604606
if (err)
605607
return err;

include/linux/bpf.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,15 +268,18 @@ struct bpf_prog_offload_ops {
268268
int (*insn_hook)(struct bpf_verifier_env *env,
269269
int insn_idx, int prev_insn_idx);
270270
int (*finalize)(struct bpf_verifier_env *env);
271+
int (*prepare)(struct bpf_prog *prog);
272+
int (*translate)(struct bpf_prog *prog);
273+
void (*destroy)(struct bpf_prog *prog);
271274
};
272275

273276
struct bpf_prog_offload {
274277
struct bpf_prog *prog;
275278
struct net_device *netdev;
279+
struct bpf_offload_dev *offdev;
276280
void *dev_priv;
277281
struct list_head offloads;
278282
bool dev_state;
279-
const struct bpf_prog_offload_ops *dev_ops;
280283
void *jited_image;
281284
u32 jited_len;
282285
};
@@ -293,6 +296,7 @@ struct bpf_prog_aux {
293296
atomic_t refcnt;
294297
u32 used_map_cnt;
295298
u32 max_ctx_offset;
299+
u32 max_pkt_offset;
296300
u32 stack_depth;
297301
u32 id;
298302
u32 func_cnt;
@@ -312,6 +316,8 @@ struct bpf_prog_aux {
312316
void *security;
313317
#endif
314318
struct bpf_prog_offload *offload;
319+
struct btf *btf;
320+
u32 type_id; /* type id for this prog/func */
315321
union {
316322
struct work_struct work;
317323
struct rcu_head rcu;
@@ -523,7 +529,8 @@ static inline void bpf_long_memcpy(void *dst, const void *src, u32 size)
523529
}
524530

525531
/* verify correctness of eBPF program */
526-
int bpf_check(struct bpf_prog **fp, union bpf_attr *attr);
532+
int bpf_check(struct bpf_prog **fp, union bpf_attr *attr,
533+
union bpf_attr __user *uattr);
527534
void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth);
528535

529536
/* Map specifics */
@@ -691,7 +698,8 @@ int bpf_map_offload_get_next_key(struct bpf_map *map,
691698

692699
bool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map);
693700

694-
struct bpf_offload_dev *bpf_offload_dev_create(void);
701+
struct bpf_offload_dev *
702+
bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops);
695703
void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev);
696704
int bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev,
697705
struct net_device *netdev);

include/linux/bpf_verifier.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ static inline bool bpf_verifier_log_needed(const struct bpf_verifier_log *log)
204204
struct bpf_subprog_info {
205205
u32 start; /* insn idx of function entry point */
206206
u16 stack_depth; /* max. stack depth used by this function */
207+
u32 type_id; /* btf type_id for this subprog */
207208
};
208209

209210
/* single container for all structs
@@ -245,7 +246,7 @@ static inline struct bpf_reg_state *cur_regs(struct bpf_verifier_env *env)
245246
return cur_func(env)->regs;
246247
}
247248

248-
int bpf_prog_offload_verifier_prep(struct bpf_verifier_env *env);
249+
int bpf_prog_offload_verifier_prep(struct bpf_prog *prog);
249250
int bpf_prog_offload_verify_insn(struct bpf_verifier_env *env,
250251
int insn_idx, int prev_insn_idx);
251252
int bpf_prog_offload_finalize(struct bpf_verifier_env *env);

include/linux/btf.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,20 @@ void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj,
4747
int btf_get_fd_by_id(u32 id);
4848
u32 btf_id(const struct btf *btf);
4949

50+
#ifdef CONFIG_BPF_SYSCALL
51+
const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id);
52+
const char *btf_name_by_offset(const struct btf *btf, u32 offset);
53+
#else
54+
static inline const struct btf_type *btf_type_by_id(const struct btf *btf,
55+
u32 type_id)
56+
{
57+
return NULL;
58+
}
59+
static inline const char *btf_name_by_offset(const struct btf *btf,
60+
u32 offset)
61+
{
62+
return NULL;
63+
}
64+
#endif
65+
5066
#endif

include/linux/filter.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -668,24 +668,10 @@ static inline u32 bpf_ctx_off_adjust_machine(u32 size)
668668
return size;
669669
}
670670

671-
static inline bool bpf_ctx_narrow_align_ok(u32 off, u32 size_access,
672-
u32 size_default)
673-
{
674-
size_default = bpf_ctx_off_adjust_machine(size_default);
675-
size_access = bpf_ctx_off_adjust_machine(size_access);
676-
677-
#ifdef __LITTLE_ENDIAN
678-
return (off & (size_default - 1)) == 0;
679-
#else
680-
return (off & (size_default - 1)) + size_access == size_default;
681-
#endif
682-
}
683-
684671
static inline bool
685672
bpf_ctx_narrow_access_ok(u32 off, u32 size, u32 size_default)
686673
{
687-
return bpf_ctx_narrow_align_ok(off, size, size_default) &&
688-
size <= size_default && (size & (size - 1)) == 0;
674+
return size <= size_default && (size & (size - 1)) == 0;
689675
}
690676

691677
#define bpf_classic_proglen(fprog) (fprog->len * sizeof(fprog->filter[0]))

0 commit comments

Comments
 (0)