diff options
Diffstat (limited to 'kernel/bpf')
| -rw-r--r-- | kernel/bpf/core.c | 1 | ||||
| -rw-r--r-- | kernel/bpf/offload.c | 6 | ||||
| -rw-r--r-- | kernel/bpf/syscall.c | 2 | ||||
| -rw-r--r-- | kernel/bpf/verifier.c | 14 |
4 files changed, 14 insertions, 9 deletions
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 1127552c8033..d0d7d9462368 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c | |||
| @@ -1719,6 +1719,7 @@ bpf_event_output(struct bpf_map *map, u64 flags, void *meta, u64 meta_size, | |||
| 1719 | { | 1719 | { |
| 1720 | return -ENOTSUPP; | 1720 | return -ENOTSUPP; |
| 1721 | } | 1721 | } |
| 1722 | EXPORT_SYMBOL_GPL(bpf_event_output); | ||
| 1722 | 1723 | ||
| 1723 | /* Always built-in helper functions. */ | 1724 | /* Always built-in helper functions. */ |
| 1724 | const struct bpf_func_proto bpf_tail_call_proto = { | 1725 | const struct bpf_func_proto bpf_tail_call_proto = { |
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c index c9401075b58c..ac747d5cf7c6 100644 --- a/kernel/bpf/offload.c +++ b/kernel/bpf/offload.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2017 Netronome Systems, Inc. | 2 | * Copyright (C) 2017-2018 Netronome Systems, Inc. |
| 3 | * | 3 | * |
| 4 | * This software is licensed under the GNU General License Version 2, | 4 | * This software is licensed under the GNU General License Version 2, |
| 5 | * June 1991 as shown in the file COPYING in the top-level directory of this | 5 | * June 1991 as shown in the file COPYING in the top-level directory of this |
| @@ -474,8 +474,10 @@ bool bpf_offload_dev_match(struct bpf_prog *prog, struct bpf_map *map) | |||
| 474 | struct bpf_prog_offload *offload; | 474 | struct bpf_prog_offload *offload; |
| 475 | bool ret; | 475 | bool ret; |
| 476 | 476 | ||
| 477 | if (!bpf_prog_is_dev_bound(prog->aux) || !bpf_map_is_dev_bound(map)) | 477 | if (!bpf_prog_is_dev_bound(prog->aux)) |
| 478 | return false; | 478 | return false; |
| 479 | if (!bpf_map_is_dev_bound(map)) | ||
| 480 | return bpf_map_offload_neutral(map); | ||
| 479 | 481 | ||
| 480 | down_read(&bpf_devs_lock); | 482 | down_read(&bpf_devs_lock); |
| 481 | offload = prog->aux->offload; | 483 | offload = prog->aux->offload; |
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 263e13ede029..9b87198deea2 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
| @@ -282,6 +282,7 @@ void bpf_map_put(struct bpf_map *map) | |||
| 282 | { | 282 | { |
| 283 | __bpf_map_put(map, true); | 283 | __bpf_map_put(map, true); |
| 284 | } | 284 | } |
| 285 | EXPORT_SYMBOL_GPL(bpf_map_put); | ||
| 285 | 286 | ||
| 286 | void bpf_map_put_with_uref(struct bpf_map *map) | 287 | void bpf_map_put_with_uref(struct bpf_map *map) |
| 287 | { | 288 | { |
| @@ -543,6 +544,7 @@ struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref) | |||
| 543 | atomic_inc(&map->usercnt); | 544 | atomic_inc(&map->usercnt); |
| 544 | return map; | 545 | return map; |
| 545 | } | 546 | } |
| 547 | EXPORT_SYMBOL_GPL(bpf_map_inc); | ||
| 546 | 548 | ||
| 547 | struct bpf_map *bpf_map_get_with_uref(u32 ufd) | 549 | struct bpf_map *bpf_map_get_with_uref(u32 ufd) |
| 548 | { | 550 | { |
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 37e0affa515e..d5e1a6c4165d 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
| @@ -5055,7 +5055,7 @@ static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) | |||
| 5055 | /* hold the map. If the program is rejected by verifier, | 5055 | /* hold the map. If the program is rejected by verifier, |
| 5056 | * the map will be released by release_maps() or it | 5056 | * the map will be released by release_maps() or it |
| 5057 | * will be used by the valid program until it's unloaded | 5057 | * will be used by the valid program until it's unloaded |
| 5058 | * and all maps are released in free_bpf_prog_info() | 5058 | * and all maps are released in free_used_maps() |
| 5059 | */ | 5059 | */ |
| 5060 | map = bpf_map_inc(map, false); | 5060 | map = bpf_map_inc(map, false); |
| 5061 | if (IS_ERR(map)) { | 5061 | if (IS_ERR(map)) { |
| @@ -5741,16 +5741,16 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr) | |||
| 5741 | if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) | 5741 | if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) |
| 5742 | env->strict_alignment = true; | 5742 | env->strict_alignment = true; |
| 5743 | 5743 | ||
| 5744 | ret = replace_map_fd_with_map_ptr(env); | ||
| 5745 | if (ret < 0) | ||
| 5746 | goto skip_full_check; | ||
| 5747 | |||
| 5744 | if (bpf_prog_is_dev_bound(env->prog->aux)) { | 5748 | if (bpf_prog_is_dev_bound(env->prog->aux)) { |
| 5745 | ret = bpf_prog_offload_verifier_prep(env); | 5749 | ret = bpf_prog_offload_verifier_prep(env); |
| 5746 | if (ret) | 5750 | if (ret) |
| 5747 | goto err_unlock; | 5751 | goto skip_full_check; |
| 5748 | } | 5752 | } |
| 5749 | 5753 | ||
| 5750 | ret = replace_map_fd_with_map_ptr(env); | ||
| 5751 | if (ret < 0) | ||
| 5752 | goto skip_full_check; | ||
| 5753 | |||
| 5754 | env->explored_states = kcalloc(env->prog->len, | 5754 | env->explored_states = kcalloc(env->prog->len, |
| 5755 | sizeof(struct bpf_verifier_state_list *), | 5755 | sizeof(struct bpf_verifier_state_list *), |
| 5756 | GFP_USER); | 5756 | GFP_USER); |
| @@ -5821,7 +5821,7 @@ skip_full_check: | |||
| 5821 | err_release_maps: | 5821 | err_release_maps: |
| 5822 | if (!env->prog->aux->used_maps) | 5822 | if (!env->prog->aux->used_maps) |
| 5823 | /* if we didn't copy map pointers into bpf_prog_info, release | 5823 | /* if we didn't copy map pointers into bpf_prog_info, release |
| 5824 | * them now. Otherwise free_bpf_prog_info() will release them. | 5824 | * them now. Otherwise free_used_maps() will release them. |
| 5825 | */ | 5825 | */ |
| 5826 | release_maps(env); | 5826 | release_maps(env); |
| 5827 | *prog = env->prog; | 5827 | *prog = env->prog; |
