Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Thomas Gleixner: "Two small fixes for kprobes and perf: - Prevent a deadlock in kprobe_optimizer() causes by reverse lock ordering - Fix a comment typo" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: kprobes: Fix potential deadlock in kprobe_optimizer() perf/x86: Fix typo in comment
This commit is contained in:
commit
05bbb9360a
|
@ -1236,7 +1236,7 @@ void x86_pmu_enable_event(struct perf_event *event)
|
|||
* Add a single event to the PMU.
|
||||
*
|
||||
* The event is added to the group of enabled events
|
||||
* but only if it can be scehduled with existing events.
|
||||
* but only if it can be scheduled with existing events.
|
||||
*/
|
||||
static int x86_pmu_add(struct perf_event *event, int flags)
|
||||
{
|
||||
|
|
|
@ -470,6 +470,7 @@ static DECLARE_DELAYED_WORK(optimizing_work, kprobe_optimizer);
|
|||
*/
|
||||
static void do_optimize_kprobes(void)
|
||||
{
|
||||
lockdep_assert_held(&text_mutex);
|
||||
/*
|
||||
* The optimization/unoptimization refers online_cpus via
|
||||
* stop_machine() and cpu-hotplug modifies online_cpus.
|
||||
|
@ -487,9 +488,7 @@ static void do_optimize_kprobes(void)
|
|||
list_empty(&optimizing_list))
|
||||
return;
|
||||
|
||||
mutex_lock(&text_mutex);
|
||||
arch_optimize_kprobes(&optimizing_list);
|
||||
mutex_unlock(&text_mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -500,6 +499,7 @@ static void do_unoptimize_kprobes(void)
|
|||
{
|
||||
struct optimized_kprobe *op, *tmp;
|
||||
|
||||
lockdep_assert_held(&text_mutex);
|
||||
/* See comment in do_optimize_kprobes() */
|
||||
lockdep_assert_cpus_held();
|
||||
|
||||
|
@ -507,7 +507,6 @@ static void do_unoptimize_kprobes(void)
|
|||
if (list_empty(&unoptimizing_list))
|
||||
return;
|
||||
|
||||
mutex_lock(&text_mutex);
|
||||
arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list);
|
||||
/* Loop free_list for disarming */
|
||||
list_for_each_entry_safe(op, tmp, &freeing_list, list) {
|
||||
|
@ -524,7 +523,6 @@ static void do_unoptimize_kprobes(void)
|
|||
} else
|
||||
list_del_init(&op->list);
|
||||
}
|
||||
mutex_unlock(&text_mutex);
|
||||
}
|
||||
|
||||
/* Reclaim all kprobes on the free_list */
|
||||
|
@ -556,6 +554,7 @@ static void kprobe_optimizer(struct work_struct *work)
|
|||
{
|
||||
mutex_lock(&kprobe_mutex);
|
||||
cpus_read_lock();
|
||||
mutex_lock(&text_mutex);
|
||||
/* Lock modules while optimizing kprobes */
|
||||
mutex_lock(&module_mutex);
|
||||
|
||||
|
@ -583,6 +582,7 @@ static void kprobe_optimizer(struct work_struct *work)
|
|||
do_free_cleaned_kprobes();
|
||||
|
||||
mutex_unlock(&module_mutex);
|
||||
mutex_unlock(&text_mutex);
|
||||
cpus_read_unlock();
|
||||
mutex_unlock(&kprobe_mutex);
|
||||
|
||||
|
|
Loading…
Reference in a new issue