linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PROPOSED PATCH] ATM refcount + firestream
@ 2000-10-27  7:50 Patrick van de Lageweg
  2000-10-27 11:49 ` Andrew Morton
  0 siblings, 1 reply; 14+ messages in thread
From: Patrick van de Lageweg @ 2000-10-27  7:50 UTC (permalink / raw)
  To: Linux Kernel Mailing List; +Cc: Rogier Wolff

[-- Attachment #1: Type: TEXT/PLAIN, Size: 309 bytes --]

Hi all,

Here is the second try for the atm refcount problem. I've made made
several enhancement over the previos patch. Can you take a look at it if
I've missed anything? (This time it also includes the driver for the
firestream card. That's why the patch is so large. It's gziped and
uuencoded).

	Patrick


[-- Attachment #2: Type: TEXT/PLAIN, Size: 40281 bytes --]

begin 644 patch.gz
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
I!F.9WL]N/,Y*%(@$SD)N*E9P@11&&YH>+!%2Z,>3)_\7J"DA3_:3`0``
`
end

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27  7:50 [PROPOSED PATCH] ATM refcount + firestream Patrick van de Lageweg
@ 2000-10-27 11:49 ` Andrew Morton
  2000-10-27 13:49   ` Brian Gerst
                     ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Andrew Morton @ 2000-10-27 11:49 UTC (permalink / raw)
  To: Patrick van de Lageweg
  Cc: Linux Kernel Mailing List, Rogier Wolff, Philipp Rumpf

Patrick van de Lageweg wrote:
> 
> Hi all,
> 
> Here is the second try for the atm refcount problem. I've made made
> several enhancement over the previos patch. Can you take a look at it if
> I've missed anything? (This time it also includes the driver for the
> firestream card. That's why the patch is so large. It's gziped and
> uuencoded).

Patrick, I looked at the modules stuff and you do not
appear to be actually _using_ it anywhere:

bix:/home/morton> grep owner patch
+  owner:       THIS_MODULE,
+       owner:          THIS_MODULE
+       owner:          THIS_MODULE,
+       owner:        THIS_MODULE,
+  owner:       THIS_MODULE,
+       owner:          THIS_MODULE,
+   owner:      THIS_MODULE,
+       struct module *owner;
+       struct module *owner;
bix:/home/morton>


It looks like you'll need something like the following:
(warning: uncompiled ATM-ignoramus code)

Index: net/atm/common.c
===================================================================
RCS file: /opt/cvs/lk/net/atm/common.c,v
retrieving revision 1.3.2.1
diff -u -u -r1.3.2.1 common.c
--- net/atm/common.c	2000/07/08 06:26:43	1.3.2.1
+++ net/atm/common.c	2000/10/27 11:17:45
@@ -144,6 +144,8 @@
 			    "rx_inuse == %d after closing\n",
 			    atomic_read(&vcc->rx_inuse));
+		if (vcc->dev->ops->owner)
+			__MOD_DEC_USE_COUNT(vcc->dev->ops->owner);
 		bind_vcc(vcc,NULL);
 	}
 	if (free_sk) free_atm_vcc_sk(sk);
 }
@@ -199,13 +201,22 @@
 {
 	int error;
 
+	if (try_inc_mod_count(dev->ops->owner) == 0) {
+		return -ENODEV;
+	}
+
+	error = 0;
+
 	if ((vpi != ATM_VPI_UNSPEC && vpi != ATM_VPI_ANY &&
 	    vpi >> dev->ci_range.vpi_bits) || (vci != ATM_VCI_UNSPEC &&
-	    vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits))
-		return -EINVAL;
-	if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE))
-		return -EPERM;
-	error = 0;
+	    vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits)) {
+		error = -EINVAL;
+		goto out;
+	}
+	if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE)) {
+		error = -EPERM;
+		goto out;
+	}
 	bind_vcc(vcc,dev);
 	switch (vcc->qos.aal) {
 		case ATM_AAL0:
@@ -231,19 +242,26 @@
 	if (!error) error = adjust_tp(&vcc->qos.rxtp,vcc->qos.aal);
 	if (error) {
 		bind_vcc(vcc,NULL);
-		return error;
+		goto out;
 	}
 	DPRINTK("VCC %d.%d, AAL %d\n",vpi,vci,vcc->qos.aal);
 	DPRINTK("  TX: %d, PCR %d..%d, SDU %d\n",vcc->qos.txtp.traffic_class,
 	    vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu);
 	DPRINTK("  RX: %d, PCR %d..%d, SDU %d\n",vcc->qos.rxtp.traffic_class,
 	    vcc->qos.rxtp.min_pcr,vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu);
+
 	if (dev->ops->open) {
 		error = dev->ops->open(vcc,vpi,vci);
 		if (error) {
 			bind_vcc(vcc,NULL);
-			return error;
+			goto out;
 		}
+	}
+
+out:
+	if (error) {
+		if (dev->ops->owner)
+			__MOD_DEC_USE_COUNT(dev->ops->owner);
 	}
 	return 0;
 }


Something similar will be need to be wrapped around the usage of
`struct atm_tcp_ops()' as well.  Let me know if you'd like me to
prototype a patch for that.

The other thing you need to watch out for is atmdev_ops.ioctl().
Can this be called when the device is not open?

In other words, can atmdev_ops.ioctl() be called prior to
atmdev_ops.open()?  In more other words, can ioctl() be
called after close()?

If so then the above patch is not sufficient - it only increments
the module use count on the open() path.

If this is the case then you're fairly severely screwed.  This is
because the atm_dev handling has the same design flaw as the
netdevice handling: the logical place to inc/dec the module
refcount is within atm_dev_[de]register().  But this doesn't
work because you can never _get_ to the deregister point
through sys_delete_module() to drop the refcount.

Like netdevices, ATM needs to be able to separate the act
of loading the module from the act of registering the driver.

netdevices manage to get away with it because of ANK's funky
dev_hold()/dev_put() refcounting.  It looks like ATM devices
aren't that lucky.

One workaround would be to refuse to allow the device to be
accessed at all if it isn't open.  This may be unacceptable.


Look, this modules stuff is really bad.  Phillip Rumpf proposed
a radical alternative a while back which I felt was not given
sufficient consideration.  The idea was to make sys_delete_module()
grab all the other CPUs and leave them spinning on a flag while
the unload was proceeding.  This was very similar to
arch/i386/kernel/apm.c:apm_power_off().

As far as I can recall, the only restriction was that you are
not allowed to call module functions when the module refcount
is zero if those functions can call schedule().

prumpf, please dig out that patch.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27 11:49 ` Andrew Morton
@ 2000-10-27 13:49   ` Brian Gerst
  2000-10-27 14:34   ` Patrick van de Lageweg
  2000-10-28 13:15   ` Philipp Rumpf
  2 siblings, 0 replies; 14+ messages in thread
From: Brian Gerst @ 2000-10-27 13:49 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Linux Kernel Mailing List

Andrew Morton wrote:
> 
> Patrick van de Lageweg wrote:
> >
> > Hi all,
> >
> > Here is the second try for the atm refcount problem. I've made made
> > several enhancement over the previos patch. Can you take a look at it if
> > I've missed anything? (This time it also includes the driver for the
> > firestream card. That's why the patch is so large. It's gziped and
> > uuencoded).

[snip]

> The other thing you need to watch out for is atmdev_ops.ioctl().
> Can this be called when the device is not open?
>
> In other words, can atmdev_ops.ioctl() be called prior to
> atmdev_ops.open()?  In more other words, can ioctl() be
> called after close()?
> 
> If so then the above patch is not sufficient - it only increments
> the module use count on the open() path.
> 
> If this is the case then you're fairly severely screwed.  This is
> because the atm_dev handling has the same design flaw as the
> netdevice handling: the logical place to inc/dec the module
> refcount is within atm_dev_[de]register().  But this doesn't
> work because you can never _get_ to the deregister point
> through sys_delete_module() to drop the refcount.

The fact of the matter is that we seriously abuse ioctl() to provide an
interface to configuring network devices.  You are supposed to have a
valid file descriptor to do an ioctl, but in the network config cases,
that fd doesn't have anything to do with the network device (look at the
special cases in net/*/af_*.c).  Thus our strategy of managing the
module refcount on open/close gets sidestepped.

Currently, the network devices have two states: registered, and open. 
Only in the open case is the module referenced.  What should be done is
add a third state in the middle, configured, which also holds a
reference.  Then the userspace configuration tools can explicitly
unconfigure the device in order to release the reference and unload the
module.

In the mean time, we could wrap refcount inc/dec around the calls to
dev->set_config() and dev->do_ioctl() in dev_ifsioc().  This fixes the
potential oops but still perpetuates the abuse of ioctl though.  I would
rather see a new syscall or a misc character device added to provide the
configuration interface.

--
					Brian Gerst
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27 11:49 ` Andrew Morton
  2000-10-27 13:49   ` Brian Gerst
@ 2000-10-27 14:34   ` Patrick van de Lageweg
  2000-10-27 14:49     ` Brian Gerst
  2000-10-28 13:15   ` Philipp Rumpf
  2 siblings, 1 reply; 14+ messages in thread
From: Patrick van de Lageweg @ 2000-10-27 14:34 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Linux Kernel Mailing List, Rogier Wolff, Philipp Rumpf

On Fri, 27 Oct 2000, Andrew Morton wrote:

> Patrick van de Lageweg wrote:
> > 
> > Hi all,
> > 
> > Here is the second try for the atm refcount problem. I've made made
> > several enhancement over the previos patch. Can you take a look at it if
> > I've missed anything? (This time it also includes the driver for the
> > firestream card. That's why the patch is so large. It's gziped and
> > uuencoded).
> 
> Patrick, I looked at the modules stuff and you do not
> appear to be actually _using_ it anywhere:
> 
> bix:/home/morton> grep owner patch
> +  owner:       THIS_MODULE,
> +       owner:          THIS_MODULE
> +       owner:          THIS_MODULE,
> +       owner:        THIS_MODULE,
> +  owner:       THIS_MODULE,
> +       owner:          THIS_MODULE,
> +   owner:      THIS_MODULE,
> +       struct module *owner;
> +       struct module *owner;
> bix:/home/morton>

We use it throught the fops_get/fops_put macros to in/decrease the mod
counter. See the definitions for those macros (include/linux/fs.h)

	Patrick 
> 
> 
> It looks like you'll need something like the following:
> (warning: uncompiled ATM-ignoramus code)
> 
> Index: net/atm/common.c
> ===================================================================
> RCS file: /opt/cvs/lk/net/atm/common.c,v
> retrieving revision 1.3.2.1
> diff -u -u -r1.3.2.1 common.c
> --- net/atm/common.c	2000/07/08 06:26:43	1.3.2.1
> +++ net/atm/common.c	2000/10/27 11:17:45
> @@ -144,6 +144,8 @@
>  			    "rx_inuse == %d after closing\n",
>  			    atomic_read(&vcc->rx_inuse));
> +		if (vcc->dev->ops->owner)
> +			__MOD_DEC_USE_COUNT(vcc->dev->ops->owner);
>  		bind_vcc(vcc,NULL);
>  	}
>  	if (free_sk) free_atm_vcc_sk(sk);
>  }
> @@ -199,13 +201,22 @@
>  {
>  	int error;
>  
> +	if (try_inc_mod_count(dev->ops->owner) == 0) {
> +		return -ENODEV;
> +	}
> +
> +	error = 0;
> +
>  	if ((vpi != ATM_VPI_UNSPEC && vpi != ATM_VPI_ANY &&
>  	    vpi >> dev->ci_range.vpi_bits) || (vci != ATM_VCI_UNSPEC &&
> -	    vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits))
> -		return -EINVAL;
> -	if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE))
> -		return -EPERM;
> -	error = 0;
> +	    vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits)) {
> +		error = -EINVAL;
> +		goto out;
> +	}
> +	if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE)) {
> +		error = -EPERM;
> +		goto out;
> +	}
>  	bind_vcc(vcc,dev);
>  	switch (vcc->qos.aal) {
>  		case ATM_AAL0:
> @@ -231,19 +242,26 @@
>  	if (!error) error = adjust_tp(&vcc->qos.rxtp,vcc->qos.aal);
>  	if (error) {
>  		bind_vcc(vcc,NULL);
> -		return error;
> +		goto out;
>  	}
>  	DPRINTK("VCC %d.%d, AAL %d\n",vpi,vci,vcc->qos.aal);
>  	DPRINTK("  TX: %d, PCR %d..%d, SDU %d\n",vcc->qos.txtp.traffic_class,
>  	    vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu);
>  	DPRINTK("  RX: %d, PCR %d..%d, SDU %d\n",vcc->qos.rxtp.traffic_class,
>  	    vcc->qos.rxtp.min_pcr,vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu);
> +
>  	if (dev->ops->open) {
>  		error = dev->ops->open(vcc,vpi,vci);
>  		if (error) {
>  			bind_vcc(vcc,NULL);
> -			return error;
> +			goto out;
>  		}
> +	}
> +
> +out:
> +	if (error) {
> +		if (dev->ops->owner)
> +			__MOD_DEC_USE_COUNT(dev->ops->owner);
>  	}
>  	return 0;
>  }
> 
> 
> Something similar will be need to be wrapped around the usage of
> `struct atm_tcp_ops()' as well.  Let me know if you'd like me to
> prototype a patch for that.
> 
> The other thing you need to watch out for is atmdev_ops.ioctl().
> Can this be called when the device is not open?
> 
> In other words, can atmdev_ops.ioctl() be called prior to
> atmdev_ops.open()?  In more other words, can ioctl() be
> called after close()?
> 
> If so then the above patch is not sufficient - it only increments
> the module use count on the open() path.
> 
> If this is the case then you're fairly severely screwed.  This is
> because the atm_dev handling has the same design flaw as the
> netdevice handling: the logical place to inc/dec the module
> refcount is within atm_dev_[de]register().  But this doesn't
> work because you can never _get_ to the deregister point
> through sys_delete_module() to drop the refcount.
> 
> Like netdevices, ATM needs to be able to separate the act
> of loading the module from the act of registering the driver.
> 
> netdevices manage to get away with it because of ANK's funky
> dev_hold()/dev_put() refcounting.  It looks like ATM devices
> aren't that lucky.
> 
> One workaround would be to refuse to allow the device to be
> accessed at all if it isn't open.  This may be unacceptable.
> 
> 
> Look, this modules stuff is really bad.  Phillip Rumpf proposed
> a radical alternative a while back which I felt was not given
> sufficient consideration.  The idea was to make sys_delete_module()
> grab all the other CPUs and leave them spinning on a flag while
> the unload was proceeding.  This was very similar to
> arch/i386/kernel/apm.c:apm_power_off().
> 
> As far as I can recall, the only restriction was that you are
> not allowed to call module functions when the module refcount
> is zero if those functions can call schedule().
> 
> prumpf, please dig out that patch.
> 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27 14:34   ` Patrick van de Lageweg
@ 2000-10-27 14:49     ` Brian Gerst
  2000-10-27 14:56       ` Rogier Wolff
  0 siblings, 1 reply; 14+ messages in thread
From: Brian Gerst @ 2000-10-27 14:49 UTC (permalink / raw)
  To: Patrick van de Lageweg
  Cc: Andrew Morton, Linux Kernel Mailing List, Rogier Wolff, Philipp Rumpf

Patrick van de Lageweg wrote:
> 
> On Fri, 27 Oct 2000, Andrew Morton wrote:
> 
> > Patrick van de Lageweg wrote:
> > >
> > > Hi all,
> > >
> > > Here is the second try for the atm refcount problem. I've made made
> > > several enhancement over the previos patch. Can you take a look at it if
> > > I've missed anything? (This time it also includes the driver for the
> > > firestream card. That's why the patch is so large. It's gziped and
> > > uuencoded).
> >
> > Patrick, I looked at the modules stuff and you do not
> > appear to be actually _using_ it anywhere:
> >
> > bix:/home/morton> grep owner patch
> > +  owner:       THIS_MODULE,
> > +       owner:          THIS_MODULE
> > +       owner:          THIS_MODULE,
> > +       owner:        THIS_MODULE,
> > +  owner:       THIS_MODULE,
> > +       owner:          THIS_MODULE,
> > +   owner:      THIS_MODULE,
> > +       struct module *owner;
> > +       struct module *owner;
> > bix:/home/morton>
> 
> We use it throught the fops_get/fops_put macros to in/decrease the mod
> counter. See the definitions for those macros (include/linux/fs.h)
> 
>         Patrick

This will break horribly if fops_put/get are changed to inlines instead
of macros.  They are only supposed to be used on struct file_operations.

--

				Brian Gerst
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27 14:49     ` Brian Gerst
@ 2000-10-27 14:56       ` Rogier Wolff
  0 siblings, 0 replies; 14+ messages in thread
From: Rogier Wolff @ 2000-10-27 14:56 UTC (permalink / raw)
  To: Brian Gerst
  Cc: Patrick van de Lageweg, Andrew Morton, Linux Kernel Mailing List,
	Rogier Wolff, Philipp Rumpf

Brian Gerst wrote:
> > > +       struct module *owner;
> > > +       struct module *owner;
> > > bix:/home/morton>
> > 
> > We use it throught the fops_get/fops_put macros to in/decrease the mod
> > counter. See the definitions for those macros (include/linux/fs.h)
> > 
> >         Patrick
> 
> This will break horribly if fops_put/get are changed to inlines instead
> of macros.  They are only supposed to be used on struct file_operations.

Oh?

Anyway, we'll get nice warnings about wrong type of argument when that
happens.

I was the one who found the fops_get/put code useful as a guideline
and also in fact as the code to call.

So the question is: What is the defined interface for fops_get/put: Is
it "it's a macro that... " or is it "it's a function (possibly a macro
for efficiency) that.... "?

				Roger. 

P.S. Apologies for Patrick's bad quoting habits: He had to catch a
train and forgot to delete the rest of the quoted mail.


-- 
** R.E.Wolff@BitWizard.nl ** http://www.BitWizard.nl/ ** +31-15-2137555 **
*-- BitWizard writes Linux device drivers for any device you may have! --*
*       Common sense is the collection of                                *
******  prejudices acquired by age eighteen.   -- Albert Einstein ********
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-27 11:49 ` Andrew Morton
  2000-10-27 13:49   ` Brian Gerst
  2000-10-27 14:34   ` Patrick van de Lageweg
@ 2000-10-28 13:15   ` Philipp Rumpf
  2000-10-28 13:37     ` Brian Gerst
  2 siblings, 1 reply; 14+ messages in thread
From: Philipp Rumpf @ 2000-10-28 13:15 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Patrick van de Lageweg, Linux Kernel Mailing List, Rogier Wolff,
	Linus Torvalds

[-- Attachment #1: Type: text/plain, Size: 1554 bytes --]

On Fri, Oct 27, 2000 at 10:49:53PM +1100, Andrew Morton wrote:
> Look, this modules stuff is really bad.  Phillip Rumpf proposed
> a radical alternative a while back which I felt was not given

While it might be a "radical alternative", it doesn't require any changes
to the subsystems that have been fixed so far.  At this time, applying the
patch would basically fix the rest of the subsystems as well (if the
drivers use MOD_{INC,DEC}_USE_COUNT, that is).

> sufficient consideration.  The idea was to make sys_delete_module()
> grab all the other CPUs and leave them spinning on a flag while
> the unload was proceeding.  This was very similar to
> arch/i386/kernel/apm.c:apm_power_off().

The idea here is other CPUs don't have to deal with the kernel going
through a number of inconsistent states while a module is unloaded.  At
any point in time, for any module, exactly one of the following is true:

1. you're in the module_exit function
2. the module is (being) loaded
3. the module isn't loaded.

> As far as I can recall, the only restriction was that you are
> not allowed to call module functions when the module refcount
> is zero if those functions can call schedule().

There are other restrictions which shouldn't really matter:

 - you can't schedule() and hope you end up on a particular CPU (you can
use smp_call_function though)

 - you can't copy_(from|to)_user in the module exit function (which would
be copies from/to rmmod anyway)

> prumpf, please dig out that patch.

attached (rediff against test10-pre6, it seems to work).

[-- Attachment #2: freeze-diff-09 --]
[-- Type: text/plain, Size: 8428 bytes --]

diff -urN linux/arch/i386/mm/extable.c linux-prumpf/arch/i386/mm/extable.c
--- linux/arch/i386/mm/extable.c	Wed Nov 10 08:31:37 1999
+++ linux-prumpf/arch/i386/mm/extable.c	Sat Oct 28 06:14:43 2000
@@ -30,26 +30,30 @@
         return 0;
 }
 
+extern struct rw_semaphore module_mutex;
+
 unsigned long
 search_exception_table(unsigned long addr)
 {
-	unsigned long ret;
+	unsigned long ret = 0;
 
 #ifndef CONFIG_MODULES
 	/* There is only the kernel to search.  */
 	ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
-	if (ret) return ret;
 #else
 	/* The kernel is the last "module" -- no need to treat it special.  */
 	struct module *mp;
+
+	down_read(&module_mutex);
 	for (mp = module_list; mp != NULL; mp = mp->next) {
 		if (mp->ex_table_start == NULL)
 			continue;
 		ret = search_one_table(mp->ex_table_start,
 				       mp->ex_table_end - 1, addr);
-		if (ret) return ret;
+		if (ret) break;
 	}
+	up_read(&module_mutex);
 #endif
 
-	return 0;
+	return ret;
 }
diff -urN linux/include/linux/smp.h linux-prumpf/include/linux/smp.h
--- linux/include/linux/smp.h	Tue Sep 26 14:31:51 2000
+++ linux-prumpf/include/linux/smp.h	Sat Oct 28 06:14:43 2000
@@ -71,6 +71,9 @@
 #define MSG_RESCHEDULE		0x0003	/* Reschedule request from master CPU*/
 #define MSG_CALL_FUNCTION       0x0004  /* Call function on all other CPUs */
 
+extern int freeze_other_cpus(void);
+extern void melt_other_cpus(void);
+
 #else
 
 /*
@@ -86,6 +89,8 @@
 #define cpu_number_map(cpu)			0
 #define smp_call_function(func,info,retry,wait)	({ 0; })
 #define cpu_online_map				1
+#define freeze_other_cpus()			0
+#define melt_other_cpus()			do { } while(0)
 
 #endif
 #endif
diff -urN linux/kernel/module.c linux-prumpf/kernel/module.c
--- linux/kernel/module.c	Sat Oct 28 05:03:26 2000
+++ linux-prumpf/kernel/module.c	Sat Oct 28 06:14:43 2000
@@ -37,6 +37,11 @@
 	ex_table_end:		__stop___ex_table
 };
 
+/* module_mutex protects module_list - if you can down_read() it, modules
+ * won't be added/removed, but their usecount, flags aso still might change.
+ */
+
+DECLARE_RWSEM(module_mutex);
 struct module *module_list = &kernel_module;
 
 static long get_mod_name(const char *user_name, char **buf);
@@ -105,7 +110,6 @@
 
 	if (!capable(CAP_SYS_MODULE))
 		return -EPERM;
-	lock_kernel();
 	if ((namelen = get_mod_name(name_user, &name)) < 0) {
 		error = namelen;
 		goto err0;
@@ -114,32 +118,40 @@
 		error = -EINVAL;
 		goto err1;
 	}
+	lock_kernel();
+	down_write(&module_mutex);
 	if (find_module(name) != NULL) {
 		error = -EEXIST;
-		goto err1;
+		goto err2;
 	}
 	if ((mod = (struct module *)module_map(size)) == NULL) {
 		error = -ENOMEM;
-		goto err1;
+		goto err2;
 	}
 
 	memset(mod, 0, sizeof(*mod));
 	mod->size_of_struct = sizeof(*mod);
-	mod->next = module_list;
 	mod->name = (char *)(mod + 1);
 	mod->size = size;
 	memcpy((char*)(mod+1), name, namelen+1);
 
 	put_mod_name(name);
 
+	mod->next = module_list;
 	module_list = mod;	/* link it in */
 
 	error = (long) mod;
+
+	up_write(&module_mutex);
+	unlock_kernel();
+
 	goto err0;
+err2:
+	up_write(&module_mutex);
+	unlock_kernel();
 err1:
 	put_mod_name(name);
 err0:
-	unlock_kernel();
 	return error;
 }
 
@@ -159,6 +171,7 @@
 	if (!capable(CAP_SYS_MODULE))
 		return -EPERM;
 	lock_kernel();
+	down_read(&module_mutex);
 	if ((namelen = get_mod_name(name_user, &name)) < 0) {
 		error = namelen;
 		goto err0;
@@ -338,6 +351,7 @@
 err1:
 	put_mod_name(name);
 err0:
+	up_read(&module_mutex);
 	unlock_kernel();
 	return error;
 }
@@ -345,16 +359,10 @@
 static spinlock_t unload_lock = SPIN_LOCK_UNLOCKED;
 int try_inc_mod_count(struct module *mod)
 {
-	int res = 1;
-	if (mod) {
-		spin_lock(&unload_lock);
-		if (mod->flags & MOD_DELETED)
-			res = 0;
-		else
-			__MOD_INC_USE_COUNT(mod);
-		spin_unlock(&unload_lock);
-	}
-	return res;
+	if (mod)
+		__MOD_INC_USE_COUNT(mod);
+	
+	return 1;
 }
 
 asmlinkage long
@@ -368,10 +376,12 @@
 	if (!capable(CAP_SYS_MODULE))
 		return -EPERM;
 
+	if ((error = get_mod_name(name_user, &name)) < 0)
+		return error;
+
 	lock_kernel();
+	down_write(&module_mutex);
 	if (name_user) {
-		if ((error = get_mod_name(name_user, &name)) < 0)
-			goto out;
 		if (error == 0) {
 			error = -EINVAL;
 			put_mod_name(name);
@@ -391,7 +401,11 @@
  		if (!__MOD_IN_USE(mod)) {
 			mod->flags |= MOD_DELETED;
 			spin_unlock(&unload_lock);
-			free_module(mod, 0);
+			error = freeze_other_cpus();
+			if(error == 0) {
+				free_module(mod, 0);
+				melt_other_cpus();
+			}
 			error = 0;
 		} else {
 			spin_unlock(&unload_lock);
@@ -418,7 +432,10 @@
 			} else {
 				mod->flags |= MOD_DELETED;
 				spin_unlock(&unload_lock);
-				free_module(mod, 1);
+				if(freeze_other_cpus() == 0) {
+					free_module(mod, 1);
+					melt_other_cpus();
+				}
 				something_changed = 1;
 			}
 		} else {
@@ -431,6 +448,7 @@
 		mod->flags &= ~MOD_JUST_FREED;
 	error = 0;
 out:
+	up_write(&module_mutex);
 	unlock_kernel();
 	return error;
 }
@@ -653,6 +671,7 @@
 	int err;
 
 	lock_kernel();
+	down_read(&module_mutex);
 	if (name_user == NULL)
 		mod = &kernel_module;
 	else {
@@ -698,6 +717,7 @@
 		break;
 	}
 out:
+	up_read(&module_mutex);
 	unlock_kernel();
 	return err;
 }
@@ -718,6 +738,7 @@
 	struct kernel_sym ksym;
 
 	lock_kernel();
+	down_read(&module_mutex);
 	for (mod = module_list, i = 0; mod; mod = mod->next) {
 		/* include the count for the module name! */
 		i += mod->nsyms + 1;
@@ -760,6 +781,7 @@
 		}
 	}
 out:
+	up_read(&module_mutex);
 	unlock_kernel();
 	return i;
 }
@@ -840,6 +862,8 @@
 	char tmpstr[64];
 	struct module_ref *ref;
 
+	down_read(&module_mutex);
+
 	for (mod = module_list; mod != &kernel_module; mod = mod->next) {
 		long len;
 		const char *q;
@@ -906,8 +930,9 @@
 #undef safe_copy_str
 #undef safe_copy_cstr
 	}
-
 fini:
+	up_read(&module_mutex);
+
 	return PAGE_SIZE - left;
 }
 
@@ -924,6 +949,7 @@
 	off_t pos   = 0;
 	off_t begin = 0;
 
+	down_read(&module_mutex);
 	for (mod = module_list; mod; mod = mod->next) {
 		unsigned i;
 		struct module_symbol *sym;
@@ -958,6 +984,7 @@
 	len -= (offset - begin);
 	if (len > length)
 		len = length;
+	up_read(&module_mutex);
 	return len;
 }
 
@@ -1002,7 +1029,9 @@
 void put_module_symbol(unsigned long addr)
 {
 	struct module *mp;
-
+	
+	/* XXX: safe to sleep here ? */
+	down_read(&module_mutex);
 	for (mp = module_list; mp; mp = mp->next) {
 		if (MOD_CAN_QUERY(mp) &&
 		    addr >= (unsigned long)mp &&
@@ -1011,6 +1040,7 @@
 			return;
 		}
 	}
+	up_read(&module_mutex);
 }
 
 #else		/* CONFIG_MODULES */
diff -urN linux/lib/Makefile linux-prumpf/lib/Makefile
--- linux/lib/Makefile	Wed Jul 12 21:33:38 2000
+++ linux-prumpf/lib/Makefile	Sat Oct 28 06:14:43 2000
@@ -14,4 +14,8 @@
   L_OBJS += dec_and_lock.o
 endif
 
+ifeq ($(CONFIG_SMP),y)
+  L_OBJS += freeze.o
+endif
+
 include $(TOPDIR)/Rules.make
diff -urN linux/lib/freeze.c linux-prumpf/lib/freeze.c
--- linux/lib/freeze.c	Wed Dec 31 16:00:00 1969
+++ linux-prumpf/lib/freeze.c	Sat Oct 28 06:14:43 2000
@@ -0,0 +1,64 @@
+/* Currently, those functions are only used for module unloading.  I put them
+ * here as they might be useful for other people and would introduce
+ * unnecessary noise in module.c */
+#include <asm/atomic.h>
+#include <asm/errno.h>
+#include <asm/processor.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/smp.h>
+#include <linux/delay.h>
+
+static atomic_t freeze_count = ATOMIC_INIT(0);
+static volatile int ice_block;
+static spinlock_t freeze_lock = SPIN_LOCK_UNLOCKED;
+
+static int
+antarctica(void *unused)
+{
+	atomic_inc(&freeze_count);
+	while (ice_block)
+		;
+	atomic_dec(&freeze_count);
+	return 0;
+}
+
+int freeze_other_cpus(void)
+{
+	int cpu, retval;
+	/* wait up to one tick */
+	long timeout = 1000000 / HZ;
+
+	/* If you reenter this code, you're seriously fucked */
+	if (!spin_trylock(&freeze_lock))
+		return -EAGAIN;
+
+	ice_block = 1;
+	wmb();
+	for (cpu = 0; cpu < smp_num_cpus - 1; cpu++) {
+		retval = kernel_thread(antarctica, (void *)0, 0);
+		if (retval < 0)
+			goto out_melt;
+	}
+
+	while(atomic_read(&freeze_count) != smp_num_cpus - 1) {
+		if (--timeout == 0) {
+			retval = -ETIMEDOUT;
+			goto out_melt;
+		}
+		udelay(1);
+	}
+
+	return 0;
+out_melt:
+	ice_block = 0;
+	spin_unlock(&freeze_lock);
+	return retval;
+}
+
+void melt_other_cpus(void)
+{
+	ice_block = 0;
+	while(atomic_read(&freeze_count) != 0); /* this is paranoia */
+	spin_unlock(&freeze_lock);
+}

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 13:15   ` Philipp Rumpf
@ 2000-10-28 13:37     ` Brian Gerst
  2000-10-28 13:53       ` Philipp Rumpf
  0 siblings, 1 reply; 14+ messages in thread
From: Brian Gerst @ 2000-10-28 13:37 UTC (permalink / raw)
  To: Philipp Rumpf
  Cc: Andrew Morton, Patrick van de Lageweg, Linux Kernel Mailing List,
	Rogier Wolff, Linus Torvalds

Philipp Rumpf wrote:
> 
> On Fri, Oct 27, 2000 at 10:49:53PM +1100, Andrew Morton wrote:
> > Look, this modules stuff is really bad.  Phillip Rumpf proposed
> > a radical alternative a while back which I felt was not given
> 
> While it might be a "radical alternative", it doesn't require any changes
> to the subsystems that have been fixed so far.  At this time, applying the
> patch would basically fix the rest of the subsystems as well (if the
> drivers use MOD_{INC,DEC}_USE_COUNT, that is).
> 
> > sufficient consideration.  The idea was to make sys_delete_module()
> > grab all the other CPUs and leave them spinning on a flag while
> > the unload was proceeding.  This was very similar to
> > arch/i386/kernel/apm.c:apm_power_off().
> 
> The idea here is other CPUs don't have to deal with the kernel going
> through a number of inconsistent states while a module is unloaded.  At
> any point in time, for any module, exactly one of the following is true:
> 
> 1. you're in the module_exit function
> 2. the module is (being) loaded
> 3. the module isn't loaded.
> 
> > As far as I can recall, the only restriction was that you are
> > not allowed to call module functions when the module refcount
> > is zero if those functions can call schedule().
> 
> There are other restrictions which shouldn't really matter:
> 
>  - you can't schedule() and hope you end up on a particular CPU (you can
> use smp_call_function though)
> 
>  - you can't copy_(from|to)_user in the module exit function (which would
> be copies from/to rmmod anyway)

Unfortunately, you need to be able to use copy_*_user() from the network
ioctls, and this is the center of the current issue.

-- 

						Brian Gerst
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 13:37     ` Brian Gerst
@ 2000-10-28 13:53       ` Philipp Rumpf
  2000-10-28 13:55         ` Brian Gerst
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Rumpf @ 2000-10-28 13:53 UTC (permalink / raw)
  To: Brian Gerst
  Cc: Andrew Morton, Patrick van de Lageweg, Linux Kernel Mailing List,
	Rogier Wolff, Linus Torvalds

On Sat, Oct 28, 2000 at 09:37:28AM -0400, Brian Gerst wrote:
> Philipp Rumpf wrote:
> >  - you can't copy_(from|to)_user in the module exit function (which would
> > be copies from/to rmmod anyway)
> 
> Unfortunately, you need to be able to use copy_*_user() from the network
> ioctls, and this is the center of the current issue.

You misunderstood.  The network ioctls aren't module_exit functions, so
copy_*_user in them is fine.

	Philipp Rumpf
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 13:53       ` Philipp Rumpf
@ 2000-10-28 13:55         ` Brian Gerst
  2000-10-28 15:05           ` Philipp Rumpf
  0 siblings, 1 reply; 14+ messages in thread
From: Brian Gerst @ 2000-10-28 13:55 UTC (permalink / raw)
  To: Philipp Rumpf
  Cc: Andrew Morton, Patrick van de Lageweg, Linux Kernel Mailing List,
	Rogier Wolff, Linus Torvalds

Philipp Rumpf wrote:
> 
> On Sat, Oct 28, 2000 at 09:37:28AM -0400, Brian Gerst wrote:
> > Philipp Rumpf wrote:
> > >  - you can't copy_(from|to)_user in the module exit function (which would
> > > be copies from/to rmmod anyway)
> >
> > Unfortunately, you need to be able to use copy_*_user() from the network
> > ioctls, and this is the center of the current issue.
> 
> You misunderstood.  The network ioctls aren't module_exit functions, so
> copy_*_user in them is fine.

Yes, but they can be called (and sleep) with module refcount == 0.  This
is because the file descripter used to perform the ioctl isn't directly
associated with the network device, thereby not incrementing the
refcount on open.

-- 

						Brian Gerst
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 13:55         ` Brian Gerst
@ 2000-10-28 15:05           ` Philipp Rumpf
  2000-10-28 15:50             ` Brian Gerst
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Rumpf @ 2000-10-28 15:05 UTC (permalink / raw)
  To: Brian Gerst
  Cc: Andrew Morton, Patrick van de Lageweg, Linux Kernel Mailing List,
	Rogier Wolff, Linus Torvalds

On Sat, Oct 28, 2000 at 09:55:21AM -0400, Brian Gerst wrote:
> Yes, but they can be called (and sleep) with module refcount == 0.  This
> is because the file descripter used to perform the ioctl isn't directly
> associated with the network device, thereby not incrementing the
> refcount on open.

According to my proposal, it is perfectly safe to call a function in a module
while the module's use count is 0.  This function would typically look like this:

foo()
{
	MOD_INC_USE_COUNT;

	copy_*_user() (or anything else that sleeps);
	
	MOD_DEC_USE_COUNT;

	return bar;
}

The only difference to the "old" module scheme is that the above currently isn't
safe on SMP systems.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 15:05           ` Philipp Rumpf
@ 2000-10-28 15:50             ` Brian Gerst
  2000-10-28 16:10               ` Andrew Morton
  2000-10-30 15:18               ` Philipp Rumpf
  0 siblings, 2 replies; 14+ messages in thread
From: Brian Gerst @ 2000-10-28 15:50 UTC (permalink / raw)
  To: Philipp Rumpf; +Cc: Linux kernel mailing list

Philipp Rumpf wrote:
> 
> On Sat, Oct 28, 2000 at 09:55:21AM -0400, Brian Gerst wrote:
> > Yes, but they can be called (and sleep) with module refcount == 0.  This
> > is because the file descripter used to perform the ioctl isn't directly
> > associated with the network device, thereby not incrementing the
> > refcount on open.
> 
> According to my proposal, it is perfectly safe to call a function in a module
> while the module's use count is 0.  This function would typically look like this:
> 
> foo()
> {
>         MOD_INC_USE_COUNT;
> 
>         copy_*_user() (or anything else that sleeps);
> 
>         MOD_DEC_USE_COUNT;
> 
>         return bar;
> }
> 
> The only difference to the "old" module scheme is that the above currently isn't
> safe on SMP systems.

This will only work while the kernel is not preemptable.  Once the
kernel thread can be rescheduled, all bets are off.

With or without your patch, the network ioctls are unsafe, since they
don't currently do refcounting at all.  Adding it in the layer above the
driver is the easier and cleaner solution.

-- 

						Brian Gerst
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 15:50             ` Brian Gerst
@ 2000-10-28 16:10               ` Andrew Morton
  2000-10-30 15:18               ` Philipp Rumpf
  1 sibling, 0 replies; 14+ messages in thread
From: Andrew Morton @ 2000-10-28 16:10 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Philipp Rumpf, Linux kernel mailing list

Brian Gerst wrote:
> 
> With or without your patch, the network ioctls are unsafe, since they
> don't currently do refcounting at all.  Adding it in the layer above the
> driver is the easier and cleaner solution.

As long as the drivers use unregister_netdevice() then that's
fairly easy to fix within the netdevice layer.  Just do a 
dev_hold()/dev_put() within dev_ifsioc().
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PROPOSED PATCH] ATM refcount + firestream
  2000-10-28 15:50             ` Brian Gerst
  2000-10-28 16:10               ` Andrew Morton
@ 2000-10-30 15:18               ` Philipp Rumpf
  1 sibling, 0 replies; 14+ messages in thread
From: Philipp Rumpf @ 2000-10-30 15:18 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Linux kernel mailing list

On Sat, Oct 28, 2000 at 11:50:22AM -0400, Brian Gerst wrote:
> Philipp Rumpf wrote:
> > 
> > On Sat, Oct 28, 2000 at 09:55:21AM -0400, Brian Gerst wrote:
> > > Yes, but they can be called (and sleep) with module refcount == 0.  This
> > > is because the file descripter used to perform the ioctl isn't directly
> > > associated with the network device, thereby not incrementing the
> > > refcount on open.
> > 
> > According to my proposal, it is perfectly safe to call a function in a module
> > while the module's use count is 0.  This function would typically look like this:
> > 
> > foo()
> > {
> >         MOD_INC_USE_COUNT;
> > 
> >         copy_*_user() (or anything else that sleeps);
> > 
> >         MOD_DEC_USE_COUNT;
> > 
> >         return bar;
> > }
> > 
> > The only difference to the "old" module scheme is that the above currently isn't
> > safe on SMP systems.
> 
> This will only work while the kernel is not preemptable.  Once the
> kernel thread can be rescheduled, all bets are off.

The implementation will need adjusting for preemptable kernel threads.  The
concept still works fine.	

> With or without your patch, the network ioctls are unsafe, since they
> don't currently do refcounting at all.

I was under the impression most network ioctls didn't sleep.

> Adding it in the layer above thTe
> driver is the easier and cleaner solution.

I disagree.  I dislike special-casing inter-module calls (and that's not even
taking into account that the current implementation of an inter-module call is
quite ugly).
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2000-10-30 15:18 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-10-27  7:50 [PROPOSED PATCH] ATM refcount + firestream Patrick van de Lageweg
2000-10-27 11:49 ` Andrew Morton
2000-10-27 13:49   ` Brian Gerst
2000-10-27 14:34   ` Patrick van de Lageweg
2000-10-27 14:49     ` Brian Gerst
2000-10-27 14:56       ` Rogier Wolff
2000-10-28 13:15   ` Philipp Rumpf
2000-10-28 13:37     ` Brian Gerst
2000-10-28 13:53       ` Philipp Rumpf
2000-10-28 13:55         ` Brian Gerst
2000-10-28 15:05           ` Philipp Rumpf
2000-10-28 15:50             ` Brian Gerst
2000-10-28 16:10               ` Andrew Morton
2000-10-30 15:18               ` Philipp Rumpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).