diff options
| author | Thomas Gleixner <tglx@tglx.tec.linutronix.de> | 2005-07-13 10:45:00 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-07-13 10:45:00 +0200 | 
| commit | 1b3035b7fcc72b6b36f2a3634dad832eb2453ce8 (patch) | |
| tree | 728174d72943cc9b981a5843553551df62eddc41 /drivers/usb/core/hub.c | |
| parent | a98a5d04f400ad112e59cadd739dbabf89417e60 (diff) | |
| parent | c32511e2718618f0b53479eb36e07439aa363a74 (diff) | |
Merge with rsync://fileserver/linux
Diffstat (limited to 'drivers/usb/core/hub.c')
| -rw-r--r-- | drivers/usb/core/hub.c | 40 | 
1 files changed, 11 insertions, 29 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 32ff32181852..c3e46d24a37e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -26,6 +26,7 @@  #include <linux/ioctl.h>  #include <linux/usb.h>  #include <linux/usbdevice_fs.h> +#include <linux/kthread.h>  #include <asm/semaphore.h>  #include <asm/uaccess.h> @@ -47,8 +48,7 @@ static LIST_HEAD(hub_event_list);	/* List of hubs needing servicing */  /* Wakes up khubd */  static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); -static pid_t khubd_pid = 0;			/* PID of khubd */ -static DECLARE_COMPLETION(khubd_exited); +static struct task_struct *khubd_task;  /* cycle leds on hubs that aren't blinking for attention */  static int blinkenlights = 0; @@ -2807,23 +2807,16 @@ loop:  static int hub_thread(void *__unused)  { -	/* -	 * This thread doesn't need any user-level access, -	 * so get rid of all our resources -	 */ - -	daemonize("khubd"); -	allow_signal(SIGKILL); - -	/* Send me a signal to get me die (for debugging) */  	do {  		hub_events(); -		wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));  +		wait_event_interruptible(khubd_wait, +				!list_empty(&hub_event_list) || +				kthread_should_stop());  		try_to_freeze(); -	} while (!signal_pending(current)); +	} while (!kthread_should_stop() || !list_empty(&hub_event_list)); -	pr_debug ("%s: khubd exiting\n", usbcore_name); -	complete_and_exit(&khubd_exited, 0); +	pr_debug("%s: khubd exiting\n", usbcore_name); +	return 0;  }  static struct usb_device_id hub_id_table [] = { @@ -2849,20 +2842,15 @@ static struct usb_driver hub_driver = {  int usb_hub_init(void)  { -	pid_t pid; -  	if (usb_register(&hub_driver) < 0) {  		printk(KERN_ERR "%s: can't register hub driver\n",  			usbcore_name);  		return -1;  	} -	pid = kernel_thread(hub_thread, NULL, CLONE_KERNEL); -	if (pid >= 0) { -		khubd_pid = pid; - +	khubd_task = kthread_run(hub_thread, NULL, "khubd"); +	if (!IS_ERR(khubd_task))  		return 0; -	}  	/* Fall through if kernel_thread failed */  	usb_deregister(&hub_driver); @@ -2873,12 +2861,7 @@ int usb_hub_init(void)  void usb_hub_cleanup(void)  { -	int ret; - -	/* Kill the thread */ -	ret = kill_proc(khubd_pid, SIGKILL, 1); - -	wait_for_completion(&khubd_exited); +	kthread_stop(khubd_task);  	/*  	 * Hub resources are freed for us by usb_deregister. It calls @@ -2890,7 +2873,6 @@ void usb_hub_cleanup(void)  	usb_deregister(&hub_driver);  } /* usb_hub_cleanup() */ -  static int config_descriptors_changed(struct usb_device *udev)  {  	unsigned			index;  | 
