lkml.org 
[lkml]   [1999]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    Subjectwaitpid advice ? (killing off a kernel thread)
    (not on list, please CC me)

    I am working on the USB drivers trying to get the hub and the host
    controller (uhci/ohci/ohci-hcd) drivers to unload correctly. The problem
    is that the drivers have threads running that are not dying before I start
    deallocating resources.

    currently I am trying the following code (from hub.c):
    =========begin code snip============
    void cleanup_module(void)
    {
    if (khubd_pid >= 0)
    {
    int pid;
    kill_proc(khubd_pid, SIGTERM, 1);
    pid=waitpid(khubd_pid, NULL, __WCHILD);
    if (pid!=khubd_pid)
    printk("waitpid filed,"
    "khubd_pid=%i,retpid=%i\n",khubd_pid,pid);
    }
    usb_deregister(&hub_driver);
    }
    =========end code snip============

    Sometimes it works. Othertimes I get the waitpid filed (ok, so I typed
    'failed' wrong...) message, promptly followed by a kernel oops.

    The thread is created as follows...

    =========begin code snip============
    pid = kernel_thread(usb_hub_thread, NULL, CLONE_FS | CLONE_FILES |
    CLONE_FILES | CLONE_SIGHAND);
    if (pid >= 0) {
    khubd_pid = pid;
    return 0;
    }

    /* Fall through if kernel_thread failed */

    --with the actual start of usb_hub_thread looking like

    static int usb_hub_thread(void *__hub){
    lock_kernel();
    /*
    static int usb_hub_thread(void *__hub){
    lock_kernel();
    /*
    * This thread doesn't need any user-level access,
    * so get rid of all our resources
    */
    printk("usb_hub_thread at %p\n", &usb_hub_thread);
    exit_mm(current);
    exit_files(current);
    exit_fs(current);
    =========end code snip============

    Anyways, my question is.. obviously my method of killing and then waiting
    for the process to die is not working right. What can I do instead? Wait
    queues do not seem to satisfy my needs, and I'm hesitant to look at
    putting a 50 ms sleep in or something of the like.

    can I just do a
    while (wait_pid(pid,NULL,__WCLONE)==-1){wait_ms(10)};

    and hope that eventually it exits?

    -David Waite



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

    \
     
     \ /
      Last update: 2005-03-22 13:52    [W:2.983 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site