Merge branches 'perf-fixes-for-linus' and 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: jump label: Add work around to i386 gcc asm goto bug x86, ftrace: Use safe noops, drop trap test jump_label: Fix unaligned traps on sparc. jump label: Make arch_jump_label_text_poke_early() optional jump label: Fix error with preempt disable holding mutex oprofile: Remove deprecated use of flush_scheduled_work() oprofile: Fix the hang while taking the cpu offline jump label: Fix deadlock b/w jump_label_mutex vs. text_mutex jump label: Fix module __init section race * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Check irq_remapped instead of remapping_enabled in destroy_irq()
This commit is contained in:
@@ -190,7 +190,7 @@ void sync_stop(void)
|
||||
profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb);
|
||||
task_handoff_unregister(&task_free_nb);
|
||||
mutex_unlock(&buffer_mutex);
|
||||
flush_scheduled_work();
|
||||
flush_cpu_work();
|
||||
|
||||
/* make sure we don't leak task structs */
|
||||
process_task_mortuary();
|
||||
|
@@ -111,14 +111,18 @@ void start_cpu_work(void)
|
||||
|
||||
void end_cpu_work(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
work_enabled = 0;
|
||||
}
|
||||
|
||||
void flush_cpu_work(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
struct oprofile_cpu_buffer *b = &per_cpu(op_cpu_buffer, i);
|
||||
|
||||
cancel_delayed_work(&b->work);
|
||||
/* these works are per-cpu, no need for flush_sync */
|
||||
flush_delayed_work(&b->work);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -25,6 +25,7 @@ void free_cpu_buffers(void);
|
||||
|
||||
void start_cpu_work(void);
|
||||
void end_cpu_work(void);
|
||||
void flush_cpu_work(void);
|
||||
|
||||
/* CPU buffer is composed of such entries (which are
|
||||
* also used for context switch notes)
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include "oprof.h"
|
||||
|
||||
static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
|
||||
static int ctr_running;
|
||||
|
||||
static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer)
|
||||
{
|
||||
@@ -33,6 +34,9 @@ static void __oprofile_hrtimer_start(void *unused)
|
||||
{
|
||||
struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer);
|
||||
|
||||
if (!ctr_running)
|
||||
return;
|
||||
|
||||
hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
hrtimer->function = oprofile_hrtimer_notify;
|
||||
|
||||
@@ -42,7 +46,10 @@ static void __oprofile_hrtimer_start(void *unused)
|
||||
|
||||
static int oprofile_hrtimer_start(void)
|
||||
{
|
||||
get_online_cpus();
|
||||
ctr_running = 1;
|
||||
on_each_cpu(__oprofile_hrtimer_start, NULL, 1);
|
||||
put_online_cpus();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -50,6 +57,9 @@ static void __oprofile_hrtimer_stop(int cpu)
|
||||
{
|
||||
struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu);
|
||||
|
||||
if (!ctr_running)
|
||||
return;
|
||||
|
||||
hrtimer_cancel(hrtimer);
|
||||
}
|
||||
|
||||
@@ -57,8 +67,11 @@ static void oprofile_hrtimer_stop(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
get_online_cpus();
|
||||
for_each_online_cpu(cpu)
|
||||
__oprofile_hrtimer_stop(cpu);
|
||||
ctr_running = 0;
|
||||
put_online_cpus();
|
||||
}
|
||||
|
||||
static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
|
||||
|
Reference in New Issue
Block a user