diff options
author | Hou Tao <houtao1@huawei.com> | 2022-08-31 12:26:27 +0800 |
---|---|---|
committer | Martin KaFai Lau <martin.lau@kernel.org> | 2022-08-31 14:10:01 -0700 |
commit | 2775da21628738ce073a3a6a806adcbaada0f091 (patch) | |
tree | 2dbf96ffc2cb00de595bf01684775434c4f31a05 /README | |
parent | selftest/bpf: Ensure no module loading in bpf_setsockopt(TCP_CONGESTION) (diff) | |
download | linux-dev-2775da21628738ce073a3a6a806adcbaada0f091.tar.xz linux-dev-2775da21628738ce073a3a6a806adcbaada0f091.zip |
bpf: Disable preemption when increasing per-cpu map_locked
Per-cpu htab->map_locked is used to prohibit the concurrent accesses
from both NMI and non-NMI contexts. But since commit 74d862b682f5
("sched: Make migrate_disable/enable() independent of RT"),
migrate_disable() is also preemptible under CONFIG_PREEMPT case, so now
map_locked also disallows concurrent updates from normal contexts
(e.g. userspace processes) unexpectedly as shown below:
process A process B
htab_map_update_elem()
htab_lock_bucket()
migrate_disable()
/* return 1 */
__this_cpu_inc_return()
/* preempted by B */
htab_map_update_elem()
/* the same bucket as A */
htab_lock_bucket()
migrate_disable()
/* return 2, so lock fails */
__this_cpu_inc_return()
return -EBUSY
A fix that seems feasible is using in_nmi() in htab_lock_bucket() and
only checking the value of map_locked for nmi context. But it will
re-introduce dead-lock on bucket lock if htab_lock_bucket() is re-entered
through non-tracing program (e.g. fentry program).
One cannot use preempt_disable() to fix this issue as htab_use_raw_lock
being false causes the bucket lock to be a spin lock which can sleep and
does not work with preempt_disable().
Therefore, use migrate_disable() when using the spinlock instead of
preempt_disable() and defer fixing concurrent updates to when the kernel
has its own BPF memory allocator.
Fixes: 74d862b682f5 ("sched: Make migrate_disable/enable() independent of RT")
Reviewed-by: Hao Luo <haoluo@google.com>
Signed-off-by: Hou Tao <houtao1@huawei.com>
Link: https://lore.kernel.org/r/20220831042629.130006-2-houtao@huaweicloud.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Diffstat (limited to 'README')
0 files changed, 0 insertions, 0 deletions