All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@au1.ibm.com>
To: vatsa@in.ibm.com
Cc: linux-kernel@vger.kernel.org, akpm@osdl.org
Subject: Re: Module Observations
Date: Sat, 3 Jan 2004 16:02:28 +1100	[thread overview]
Message-ID: <20040103160228.4692b373.rusty@rustcorp.com.au> (raw)
In-Reply-To: <20040102185509.A18154@in.ibm.com>

On Fri, 2 Jan 2004 18:55:09 +0530
Srivatsa Vaddagiri <vatsa@in.ibm.com> wrote:

> Hi,
> 	I was going thr' module code and made some observations:
> 
> 1. sys_init_module drops the module_mutex semaphore
>    before calling mod->init() function and later
>    reacquires it. After reacquiring, it marks
>    the module state as MODULE_STATE_LIVE.
> 
>    In the window when mod->init() function is running,
>    isn't it possible that sys_delete_module (running
>    on some other CPU and trying to remove the _same_ module)
>    acquires the module_mutex sem and marks the module
>    state as MODULE_STATE_GOING?
> 
>    Shouldn't sys_init_module check for
>    that possibility when it reacquires the semaphore after
>    calling mod->init function?

Good catch.  The module removal should refuse to remove it without --force.

I opened this hole when I dropped the sem around mod->init() (because
some modules load other modules in their init routine).

Andrew, please apply patch below.

> 2. try_module_get() and module_put()
> 
> 	try_module_get increments the local cpu's ref count for the module 
>    and module_put decrements it.
> 
>    Is it required that the caller call both these functions from the same CPU?
>    Otherwise, the total refcount for the module will be non-zero!

No, it's OK.  We only care about the *total* being zero.

Thanks,
Rusty.
-- 
   there are those who do and those who hang on and you don't see too
   many doers quoting their contemporaries.  -- Larry McVoy

Name: Prevent Removal of Module During Init
Author: Rusty Russell
Status: Trivial

D: Vatsa spotted this: you can remove a module while it's being
D: initialized, and that will be bad.  Hole was opened when I dropped
D: the sem around the init routine (which can probe for other
D: modules).

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .22325-linux-2.6.1-rc1/kernel/module.c .22325-linux-2.6.1-rc1.updated/kernel/module.c
--- .22325-linux-2.6.1-rc1/kernel/module.c	2003-11-24 15:42:33.000000000 +1100
+++ .22325-linux-2.6.1-rc1.updated/kernel/module.c	2004-01-03 15:59:54.000000000 +1100
@@ -687,8 +687,8 @@ sys_delete_module(const char __user *nam
 		goto out;
 	}
 
-	/* Already dying? */
-	if (mod->state == MODULE_STATE_GOING) {
+	/* Doing init or already dying? */
+	if (mod->state != MODULE_STATE_LIVE) {
 		/* FIXME: if (force), slam module count and wake up
                    waiter --RR */
 		DEBUGP("%s already dying\n", mod->name);

  reply	other threads:[~2004-01-04  9:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-02 13:25 Module Observations Srivatsa Vaddagiri
2004-01-03  5:02 ` Rusty Russell [this message]
2004-03-29 15:42 ` 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=20040103160228.4692b373.rusty@rustcorp.com.au \
    --to=rusty@au1.ibm.com \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=vatsa@in.ibm.com \
    /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.