]> git.baikalelectronics.ru Git - kernel.git/commit
oprofile: fix crash when accessing freed task structs
authorRobert Richter <robert.richter@amd.com>
Fri, 13 Aug 2010 14:29:04 +0000 (16:29 +0200)
committerRobert Richter <robert.richter@amd.com>
Wed, 25 Aug 2010 07:09:09 +0000 (09:09 +0200)
commit3a6fe4596e4040da4342a398da96b470fa57a0c5
treebcf6e23fc5dd861104bc4b8309a8ce47aded2d6e
parentd1a5ef25f4f4034bef7991998f8f95568eb6224a
oprofile: fix crash when accessing freed task structs

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>
Cc: stable@kernel.org
Signed-off-by: Robert Richter <robert.richter@amd.com>
drivers/oprofile/buffer_sync.c
drivers/oprofile/cpu_buffer.c