From: David Miller <davem@davemloft.net>
Date: Mon, 24 Feb 2020 15:01:46 +0100
Subject: bpf: Use migrate_disable/enable in array macros and cgroup/lirc code.
Patch-mainline: v5.7-rc1
Git-commit: 2a916f2f546ca1c1e3323e2a4269307f6d9890eb
References: bsc#1162702,bsc#1177028
Replace the preemption disable/enable with migrate_disable/enable() to
reflect the actual requirement and to allow PREEMPT_RT to substitute it
with an actual migration disable mechanism which does not disable
preemption.
Including the code paths that go via __bpf_prog_run_save_cb().
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200224145643.998293311@linutronix.de
Acked-by: Daniel Wagner <dwagner@suse.de>
Acked-by: Gary Lin <glin@suse.com>
---
include/linux/bpf.h | 8 ++++----
include/linux/filter.h | 5 +++--
2 files changed, 7 insertions(+), 6 deletions(-)
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -886,7 +886,7 @@ int bpf_prog_array_copy(struct bpf_prog_
struct bpf_prog *_prog; \
struct bpf_prog_array *_array; \
u32 _ret = 1; \
- preempt_disable(); \
+ migrate_disable(); \
rcu_read_lock(); \
_array = rcu_dereference(array); \
if (unlikely(check_non_null && !_array))\
@@ -899,7 +899,7 @@ int bpf_prog_array_copy(struct bpf_prog_
} \
_out: \
rcu_read_unlock(); \
- preempt_enable(); \
+ migrate_enable(); \
_ret; \
})
@@ -933,7 +933,7 @@ _out: \
u32 ret; \
u32 _ret = 1; \
u32 _cn = 0; \
- preempt_disable(); \
+ migrate_disable(); \
rcu_read_lock(); \
_array = rcu_dereference(array); \
_item = &_array->items[0]; \
@@ -945,7 +945,7 @@ _out: \
_item++; \
} \
rcu_read_unlock(); \
- preempt_enable(); \
+ migrate_enable(); \
if (_ret) \
_ret = (_cn ? NET_XMIT_CN : NET_XMIT_SUCCESS); \
else \
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -677,6 +677,7 @@ static inline u8 *bpf_skb_cb(struct sk_b
return qdisc_skb_cb(skb)->data;
}
+/* Must be invoked with migration disabled */
static inline u32 __bpf_prog_run_save_cb(const struct bpf_prog *prog,
struct sk_buff *skb)
{
@@ -702,9 +703,9 @@ static inline u32 bpf_prog_run_save_cb(c
{
u32 res;
- preempt_disable();
+ migrate_disable();
res = __bpf_prog_run_save_cb(prog, skb);
- preempt_enable();
+ migrate_enable();
return res;
}