aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf
diff options
context:
space:
mode:
authorDaniel Borkmann <daniel@iogearbox.net>2015-03-01 06:31:47 -0500
committerDavid S. Miller <davem@davemloft.net>2015-03-01 14:05:19 -0500
commit24701ecea76b0b93bd9667486934ec310825f558 (patch)
tree7f658077fea363e89643d95fc808236d748b8431 /kernel/bpf
parent96be4325f443dbbfeb37d2a157675ac0736531a1 (diff)
ebpf: move read-only fields to bpf_prog and shrink bpf_prog_aux
is_gpl_compatible and prog_type should be moved directly into bpf_prog as they stay immutable during bpf_prog's lifetime, are core attributes and they can be locked as read-only later on via bpf_prog_select_runtime(). With a bit of rearranging, this also allows us to shrink bpf_prog_aux to exactly 1 cacheline. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@plumgrid.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel/bpf')
-rw-r--r--kernel/bpf/syscall.c7
-rw-r--r--kernel/bpf/verifier.c4
2 files changed, 5 insertions, 6 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 536edc2be307..0d69449acbd0 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -354,10 +354,11 @@ static int find_prog_type(enum bpf_prog_type type, struct bpf_prog *prog)
354 list_for_each_entry(tl, &bpf_prog_types, list_node) { 354 list_for_each_entry(tl, &bpf_prog_types, list_node) {
355 if (tl->type == type) { 355 if (tl->type == type) {
356 prog->aux->ops = tl->ops; 356 prog->aux->ops = tl->ops;
357 prog->aux->prog_type = type; 357 prog->type = type;
358 return 0; 358 return 0;
359 } 359 }
360 } 360 }
361
361 return -EINVAL; 362 return -EINVAL;
362} 363}
363 364
@@ -508,7 +509,7 @@ static int bpf_prog_load(union bpf_attr *attr)
508 prog->jited = false; 509 prog->jited = false;
509 510
510 atomic_set(&prog->aux->refcnt, 1); 511 atomic_set(&prog->aux->refcnt, 1);
511 prog->aux->is_gpl_compatible = is_gpl; 512 prog->gpl_compatible = is_gpl;
512 513
513 /* find program type: socket_filter vs tracing_filter */ 514 /* find program type: socket_filter vs tracing_filter */
514 err = find_prog_type(type, prog); 515 err = find_prog_type(type, prog);
@@ -517,7 +518,6 @@ static int bpf_prog_load(union bpf_attr *attr)
517 518
518 /* run eBPF verifier */ 519 /* run eBPF verifier */
519 err = bpf_check(prog, attr); 520 err = bpf_check(prog, attr);
520
521 if (err < 0) 521 if (err < 0)
522 goto free_used_maps; 522 goto free_used_maps;
523 523
@@ -528,7 +528,6 @@ static int bpf_prog_load(union bpf_attr *attr)
528 bpf_prog_select_runtime(prog); 528 bpf_prog_select_runtime(prog);
529 529
530 err = anon_inode_getfd("bpf-prog", &bpf_prog_fops, prog, O_RDWR | O_CLOEXEC); 530 err = anon_inode_getfd("bpf-prog", &bpf_prog_fops, prog, O_RDWR | O_CLOEXEC);
531
532 if (err < 0) 531 if (err < 0)
533 /* failed to allocate fd */ 532 /* failed to allocate fd */
534 goto free_used_maps; 533 goto free_used_maps;
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 594d341f04db..bdf4192a889b 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -852,7 +852,7 @@ static int check_call(struct verifier_env *env, int func_id)
852 } 852 }
853 853
854 /* eBPF programs must be GPL compatible to use GPL-ed functions */ 854 /* eBPF programs must be GPL compatible to use GPL-ed functions */
855 if (!env->prog->aux->is_gpl_compatible && fn->gpl_only) { 855 if (!env->prog->gpl_compatible && fn->gpl_only) {
856 verbose("cannot call GPL only function from proprietary program\n"); 856 verbose("cannot call GPL only function from proprietary program\n");
857 return -EINVAL; 857 return -EINVAL;
858 } 858 }
@@ -1205,7 +1205,7 @@ static int check_ld_abs(struct verifier_env *env, struct bpf_insn *insn)
1205 struct reg_state *reg; 1205 struct reg_state *reg;
1206 int i, err; 1206 int i, err;
1207 1207
1208 if (!may_access_skb(env->prog->aux->prog_type)) { 1208 if (!may_access_skb(env->prog->type)) {
1209 verbose("BPF_LD_ABS|IND instructions not allowed for this program type\n"); 1209 verbose("BPF_LD_ABS|IND instructions not allowed for this program type\n");
1210 return -EINVAL; 1210 return -EINVAL;
1211 } 1211 }