[Devel] Re: [PATCH] usbatm: Update to use the kthread api.
Cedric Le Goater
clg at fr.ibm.com
Wed Dec 13 08:24:17 PST 2006
Eric W. Biederman wrote:
> During driver initialization if the driver has an expensive
> initialization routine usbatm starts a separate kernel thread for it.
>
> In the driver cleanup routine the code waits to ensure the
> initialization routine has finished.
>
> Switching to the kthread api allowed some of the thread management
> code to be removed.
>
> In addition the kill_proc(SIGTERM, ...) in usbatm_usb_disconnect was
> removed because it was absolutely pointless. The kernel thread did
> not handle SIGTERM or any pending signals, so despite marking the
> signal as pending it would never have been handled.
are you sure that the heavy_init() routines don't handle pending
signals. they do firmware loading, etc. ?
> Signed-off-by: Eric W. Biederman <ebiederm at xmission.com>
> ---
> drivers/usb/atm/usbatm.c | 24 ++++++------------------
> drivers/usb/atm/usbatm.h | 2 --
> 2 files changed, 6 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/usb/atm/usbatm.c b/drivers/usb/atm/usbatm.c
> index ec63b0e..e6cd5e4 100644
> --- a/drivers/usb/atm/usbatm.c
> +++ b/drivers/usb/atm/usbatm.c
> @@ -81,6 +81,7 @@
> #include <linux/stat.h>
> #include <linux/timer.h>
> #include <linux/wait.h>
> +#include <linux/kthread.h>
>
> #ifdef VERBOSE_DEBUG
> static int usbatm_print_packet(const unsigned char *data, int len);
> @@ -999,35 +1000,26 @@ static int usbatm_do_heavy_init(void *arg)
> struct usbatm_data *instance = arg;
> int ret;
>
> - daemonize(instance->driver->driver_name);
> - allow_signal(SIGTERM);
> - instance->thread_pid = current->pid;
> -
> - complete(&instance->thread_started);
> -
> ret = instance->driver->heavy_init(instance, instance->usb_intf);
>
> if (!ret)
> ret = usbatm_atm_init(instance);
>
> - mutex_lock(&instance->serialize);
> - instance->thread_pid = -1;
> - mutex_unlock(&instance->serialize);
>
> complete_and_exit(&instance->thread_exited, ret);
> }
>
> static int usbatm_heavy_init(struct usbatm_data *instance)
> {
> - int ret = kernel_thread(usbatm_do_heavy_init, instance, CLONE_KERNEL);
> -
> - if (ret < 0) {
> + struct task_struct *thread;
> + thread = kthread_run(usbatm_do_heavy_init, instance,
> + instance->driver->driver_name);
> + if (IS_ERR(thread)) {
> + int ret = PTR_ERR(thread);
> usb_err(instance, "%s: failed to create kernel_thread (%d)!\n", __func__, ret);
> return ret;
> }
>
> - wait_for_completion(&instance->thread_started);
> -
> return 0;
> }
>
> @@ -1109,8 +1101,6 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
> kref_init(&instance->refcount); /* dropped in usbatm_usb_disconnect */
> mutex_init(&instance->serialize);
>
> - instance->thread_pid = -1;
> - init_completion(&instance->thread_started);
> init_completion(&instance->thread_exited);
>
> INIT_LIST_HEAD(&instance->vcc_list);
> @@ -1272,8 +1262,6 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
>
> mutex_lock(&instance->serialize);
> instance->disconnected = 1;
> - if (instance->thread_pid >= 0)
> - kill_proc(instance->thread_pid, SIGTERM, 1);
> mutex_unlock(&instance->serialize);
>
> wait_for_completion(&instance->thread_exited);
> diff --git a/drivers/usb/atm/usbatm.h b/drivers/usb/atm/usbatm.h
> index ff8551e..ab42355 100644
> --- a/drivers/usb/atm/usbatm.h
> +++ b/drivers/usb/atm/usbatm.h
> @@ -176,8 +176,6 @@ struct usbatm_data {
> int disconnected;
>
> /* heavy init */
> - int thread_pid;
> - struct completion thread_started;
> struct completion thread_exited;
>
> /* ATM device */
_______________________________________________
Containers mailing list
Containers at lists.osdl.org
https://lists.osdl.org/mailman/listinfo/containers
More information about the Devel
mailing list