Re: [PATCH 4/4] usb: libusual: locking cleanup

Andrew Morton <[email protected]>
Newsgroups gmane.linux.usb.devel,gmane.linux.kernel
Message-ID <[email protected]>
On Fri, 21 Dec 2007 00:00:04 -0800 Daniel Walker <[email protected]> wrote:

> I converted the usu_init_notify semaphore to normal mutex usage, and it 
> should still prevent the request_module before the init routine is
> complete. Before it acted more like a complete, now the mutex protects
> two distinct section from running at the same time..
> 
> Signed-off-by: Daniel Walker <[email protected]>
> 
> ---
>  drivers/usb/storage/libusual.c |   14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> Index: linux-2.6.23/drivers/usb/storage/libusual.c
> ===================================================================
> --- linux-2.6.23.orig/drivers/usb/storage/libusual.c
> +++ linux-2.6.23/drivers/usb/storage/libusual.c
> @@ -9,6 +9,7 @@
>  #include <linux/usb_usual.h>
>  #include <linux/vmalloc.h>
>  #include <linux/kthread.h>
> +#include <linux/mutex.h>
>  
>  /*
>   */
> @@ -30,7 +31,7 @@ static atomic_t usu_bias = ATOMIC_INIT(U
>  #define BIAS_NAME_SIZE  (sizeof("usb-storage"))
>  static const char *bias_names[3] = { "none", "usb-storage", "ub" };
>  
> -static struct semaphore usu_init_notify;
> +static DEFINE_MUTEX(usu_probe_mutex);
>  static DECLARE_COMPLETION(usu_end_notify);
>  static atomic_t total_threads = ATOMIC_INIT(0);
>  
> @@ -178,10 +179,7 @@ static int usu_probe_thread(void *arg)
>  	int rc;
>  	unsigned long flags;
>  
> -	/* A completion does not work here because it's counted. */
> -	down(&usu_init_notify);
> -	up(&usu_init_notify);
> -
> +	mutex_lock(&usu_probe_mutex);
>  	rc = request_module(bias_names[type]);
>  	spin_lock_irqsave(&usu_lock, flags);
>  	if (rc == 0 && (st->fls & USU_MOD_FL_PRESENT) == 0) {
> @@ -194,6 +192,7 @@ static int usu_probe_thread(void *arg)
>  	}
>  	st->fls &= ~USU_MOD_FL_THREAD;
>  	spin_unlock_irqrestore(&usu_lock, flags);
> +	mutex_unlock(&usu_probe_mutex);
>  
>  	complete_and_exit(&usu_end_notify, 0);
>  }
> @@ -204,10 +203,9 @@ static int __init usb_usual_init(void)
>  {
>  	int rc;
>  
> -	sema_init(&usu_init_notify, 0);
> -
> +	mutex_lock(&usu_probe_mutex);
>  	rc = usb_register(&usu_driver);
> -	up(&usu_init_notify);
> +	mutex_unlock(&usu_probe_mutex);
>  	return rc;
>  }

That's some pretty hairy-looking code you're playing with there.  Has this
been runtime tested?


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.