Patch "module: Fix locking in symbol_put_addr()" has been added to the 3.10-stable tree
This is a note to let you know that I've just added the patch titled
module: Fix locking in symbol_put_addr()
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
module-fix-locking-in-symbol_put_addr.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
275d7d44d802ef271a42dc87ac091a495ba72fc5Mon Sep 17 00:00:00 2001
From: Peter Zijlstra <[email protected]>
Date: Thu, 20 Aug 2015 10:34:59 +0930
Subject: module: Fix locking in symbol_put_addr()
From: Peter Zijlstra <[email protected]>
commit 275d7d44d802ef271a42dc87ac091a495ba72fc5 upstream.
Poma (on the way to another bug) reported an assertion triggering:
[<ffffffff81150529>] module_assert_mutex_or_preempt+0x49/0x90 [<ffffffff81150822>] __module_address+0x32/0x150 [<ffffffff81150956>] __module_text_address+0x16/0x70 [<ffffffff81150f19>] symbol_put_addr+0x29/0x40 [<ffffffffa04b77ad>] dvb_frontend_detach+0x7d/0x90 [dvb_core]
Laura Abbott <[email protected]> produced a patch which lead us to inspect symbol_put_addr(). This function has a comment claiming it doesn't need to disable preemption around the module lookup because it holds a reference to the module it wants to find, which therefore cannot go away.
This is wrong (and a false optimization too, preempt_disable() is really rather cheap, and I doubt any of this is on uber critical paths, otherwise it would've retained a pointer to the actual module anyway and avoided the second lookup).
While its true that the module cannot go away while we hold a reference on it, the data structure we do the lookup in very much _CAN_ change while we do the lookup. Therefore fix the comment and add the required preempt_disable().
--- kernel/module.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
kernel/module.c +6 -2
@@ -942,11 +942,15 @@ void symbol_put_addr(void *addr)if (core_kernel_text (a))return ; -/* module_text_address is safe here: we're supposed to have reference -* to module from symbol_get, so it can't go away. */ +/* +* Even though we hold a reference on the module; we still need to +* disable preemption in order to safely traverse the data structure. +*/ +preempt_disable (); modaddr =__module_text_address (a);BUG_ON (!modaddr);module_put (modaddr); +preempt_enable (); }EXPORT_SYMBOL_GPL (symbol_put_addr);
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/module-fix-locking-in-symbol_put_addr.patch