diff options
Diffstat (limited to 'kernel/livepatch/patch.c')
| -rw-r--r-- | kernel/livepatch/patch.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c index f8269036bf0b..52c4e907c14b 100644 --- a/kernel/livepatch/patch.c +++ b/kernel/livepatch/patch.c | |||
| @@ -59,7 +59,11 @@ static void notrace klp_ftrace_handler(unsigned long ip, | |||
| 59 | 59 | ||
| 60 | ops = container_of(fops, struct klp_ops, fops); | 60 | ops = container_of(fops, struct klp_ops, fops); |
| 61 | 61 | ||
| 62 | rcu_read_lock(); | 62 | /* |
| 63 | * A variant of synchronize_sched() is used to allow patching functions | ||
| 64 | * where RCU is not watching, see klp_synchronize_transition(). | ||
| 65 | */ | ||
| 66 | preempt_disable_notrace(); | ||
| 63 | 67 | ||
| 64 | func = list_first_or_null_rcu(&ops->func_stack, struct klp_func, | 68 | func = list_first_or_null_rcu(&ops->func_stack, struct klp_func, |
| 65 | stack_node); | 69 | stack_node); |
| @@ -115,7 +119,7 @@ static void notrace klp_ftrace_handler(unsigned long ip, | |||
| 115 | 119 | ||
| 116 | klp_arch_set_pc(regs, (unsigned long)func->new_func); | 120 | klp_arch_set_pc(regs, (unsigned long)func->new_func); |
| 117 | unlock: | 121 | unlock: |
| 118 | rcu_read_unlock(); | 122 | preempt_enable_notrace(); |
| 119 | } | 123 | } |
| 120 | 124 | ||
| 121 | /* | 125 | /* |
