From: Rusty Russell <rusty@rustcorp.com.au>
To: Karsten Keil <kkeil@suse.de>
Cc: linux-kernel@vger.kernel.org, Michal Hocko <mhocko@suse.cz>,
richard kennedy <richard@rsk.demon.co.uk>,
Dan Williams <dan.j.williams@intel.com>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Russell King <rmk+kernel@arm.linux.org.uk>,
dwmw2@infradead.org, Scott Wood <scottwood@freescale.com>,
netdev@vger.kernel.org, Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [RFC] Suspicious bug in module refcounting
Date: Wed, 4 Feb 2009 14:18:08 +1030 [thread overview]
Message-ID: <200902041418.09630.rusty@rustcorp.com.au> (raw)
In-Reply-To: <20090203134721.GA11069@pingi.kke.suse.de>
On Wednesday 04 February 2009 00:17:21 Karsten Keil wrote:
> The refcount is a per CPU atomic variable, module_refcount() simple add
> in a fully unprotected loop (not disabled irqs, not protected against
> scheduling) all per cpu values.
Hi Karsten,
Yes, the BUG_ON() is overly aggressive. And I really hate __module_get,
and it looks like most of the callers are completely bogus. The watchdog
drivers use it to nail themselves in place in their open routines: this is
OK, if a bit weird.
We should only use __module_get() when you *can't handle* failure;
otherwise you should accept that the admin did rmmod --wait and don't use the
module any further.
dmaengine.c seems to be taking liberties like this. AFAICT it can error
out, so why not just try_module_get() always?
gameport.c, serio.c and input.c increment their own refcount, but to get
into those init functions someone must be holding a refcount already (ie. a
module depends on this module). Ditto cyber2000fb.c, and MTD.
mdio-bitbang.c should definitely use try_module_get.
loop.c bumping its own refcount, Al might know why, but definitely can be
try_module_get() if it's valid at all.
net/socket.c can also handle failure, so that's another try_module_get.
etc.
> I think we should replace all unprotected __module_get() calls with
> try_module_get(), or remove __module_get() completely.
Agreed. We will need a "nail_module()" call for those legitimate uses (which
should clear mod->exit, rather than manipulating the refcount at all).
Meanwhile, I'll remove the BUG_ON for 2.6.29.
Thanks,
Rusty.
module: remove over-zealous check in __module_get()
module_refcount() isn't reliable outside stop_machine(), as demonstrated
by Karsten Keil <kkeil@suse.de>, networking can trigger it under load
(an inc on one cpu and dec on another while module_refcount() is tallying
can give false results, for example).
Almost noone should be using __module_get, but that's another issue.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff --git a/include/linux/module.h b/include/linux/module.h
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -407,7 +407,6 @@ static inline void __module_get(struct m
static inline void __module_get(struct module *module)
{
if (module) {
- BUG_ON(module_refcount(module) == 0);
local_inc(__module_ref_addr(module, get_cpu()));
put_cpu();
}
next prev parent reply other threads:[~2009-02-04 3:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-03 13:47 [RFC] Suspicious bug in module refcounting Karsten Keil
2009-02-03 15:02 ` richard kennedy
2009-02-04 3:48 ` Rusty Russell [this message]
2009-02-04 10:11 ` Russell King
2009-02-04 10:55 ` Rusty Russell
2009-02-04 10:59 ` Russell King
2009-02-04 16:33 ` Dan Williams
2009-02-06 22:41 ` Karsten Keil
2009-02-09 15:18 ` Michal Hocko
2009-02-10 3:15 ` Rusty Russell
2009-02-10 3:42 ` Karsten Keil
2009-02-10 10:31 ` Michal Hocko
2009-02-10 13:36 ` Rusty Russell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200902041418.09630.rusty@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=dan.j.williams@intel.com \
--cc=dmitry.torokhov@gmail.com \
--cc=dwmw2@infradead.org \
--cc=kkeil@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mhocko@suse.cz \
--cc=netdev@vger.kernel.org \
--cc=richard@rsk.demon.co.uk \
--cc=rmk+kernel@arm.linux.org.uk \
--cc=scottwood@freescale.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.