linux-uconsole/drivers/oprofile
Robert Richter f4db115e77 oprofile: fix crash when accessing freed task structs
commit 750d857c68 upstream.

This patch fixes a crash during shutdown reported below. The crash is
caused by accessing already freed task structs. The fix changes the
order for registering and unregistering notifier callbacks.

All notifiers must be initialized before buffers start working. To
stop buffer synchronization we cancel all workqueues, unregister the
notifier callback and then flush all buffers. After all of this we
finally can free all tasks listed.

This should avoid accessing freed tasks.

On 22.07.10 01:14:40, Benjamin Herrenschmidt wrote:

> So the initial observation is a spinlock bad magic followed by a crash
> in the spinlock debug code:
>
> [ 1541.586531] BUG: spinlock bad magic on CPU#5, events/5/136
> [ 1541.597564] Unable to handle kernel paging request for data at address 0x6b6b6b6b6b6b6d03
>
> Backtrace looks like:
>
>       spin_bug+0x74/0xd4
>       ._raw_spin_lock+0x48/0x184
>       ._spin_lock+0x10/0x24
>       .get_task_mm+0x28/0x8c
>       .sync_buffer+0x1b4/0x598
>       .wq_sync_buffer+0xa0/0xdc
>       .worker_thread+0x1d8/0x2a8
>       .kthread+0xa8/0xb4
>       .kernel_thread+0x54/0x70
>
> So we are accessing a freed task struct in the work queue when
> processing the samples.

Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Robert Richter <robert.richter@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2010-09-20 13:17:50 -07:00
..
buffer_sync.c oprofile: fix crash when accessing freed task structs 2010-09-20 13:17:50 -07:00
buffer_sync.h cpumask: modifiy oprofile initialization 2009-01-22 14:37:06 +01:00
cpu_buffer.c oprofile: fix crash when accessing freed task structs 2010-09-20 13:17:50 -07:00
cpu_buffer.h oprofile: fix uninitialized use of struct op_entry 2009-01-17 17:26:39 +01:00
event_buffer.c oprofile: warn on freeing event buffer too early 2009-10-09 21:32:05 +02:00
event_buffer.h Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile 2008-10-23 10:05:40 -07:00
oprof.c oprofile: Adding switch counter to oprofile statistic variables 2009-07-20 16:43:21 +02:00
oprof.h oprofile: Rename variable timeout_jiffies and move to oprofile_files.c 2009-07-20 16:43:19 +02:00
oprofile_files.c oprofile: Remove oprofile_multiplexing_init() 2009-07-20 16:43:19 +02:00
oprofile_stats.c oprofile: Adding switch counter to oprofile statistic variables 2009-07-20 16:43:21 +02:00
oprofile_stats.h oprofile: Adding switch counter to oprofile statistic variables 2009-07-20 16:43:21 +02:00
oprofilefs.c const: mark remaining super_operations const 2009-09-22 07:17:24 -07:00
timer_int.c oprofile: fixing whitespaces in drivers/oprofile/* 2008-10-16 15:01:40 +02:00