8139too thread termination
PATCH 1/1 8139too thread termination
this patch stops the 8139too kernel thread from dying on any signal. now, it will only terminate when the driver is closed.
the patch is agains 2.4.13.
thanks.
rob.
net/8139too.c renamed from net/8139too.orig.c +12 -1
@@ -80,6 +80,8 @@ Kalle Olavi Niemitalo - Wake-on-LAN ioctls + Robert Kuebel - Save kernel thread from dying on any signal. + Submitting bug reports:"rtl8139-diag -mmmaaavvveefN" output
@@ -616,6 +618,7 @@struct completion thr_exited;u32 rx_config;struct rtl_extra_stats xstats; +int time_to_die; };MODULE_AUTHOR ("Jeff Garzik <[email protected]>" );
@@ -1669,7 +1672,13 @@ timeout =interruptible_sleep_on_timeout (&tp->thr_wait, timeout); }while (!signal_pending (current) && (timeout >0 )); -if (signal_pending (current)) +if (signal_pending (current)) { +spin_lock_irq (¤t->sigmask_lock); +flush_signals (current); +spin_unlock_irq (¤t->sigmask_lock); + } + +if (tp->time_to_die)break ;rtnl_lock ();
@@ -2200,6 +2209,8 @@netif_stop_queue (dev);if (tp->thr_pid >=0 ) { + tp->time_to_die =1 ; +wmb (); ret =kill_proc (tp->thr_pid,SIGTERM ,1 );if (ret) {printk (KERN_ERR "%s: unable to signal thread\n" , dev->name);
ok, i am wondering if i have made a mistake. this patch will make the kernel thread die when tp->time_to_die is true. tp is kmalloc()'ed inside of alloc_etherdev. i didn't initialize time_to_die to 0, but this patch has been working perfectly for me. am i just lucky or are kmalloc()'ed regions zero'ed out? i know there is stuff like get_zeroed_page(), but i don't think that applies here. i guess it doesn't hurt to set the flag to zero myself.
can someone clue me in?
thanks.
rob.
Quoted 51 lines · Robert Kuebel
this patch stops the 8139too kernel thread from dying on any signal. now, it will only terminate when the driver is closed.
the patch is agains 2.4.13.
thanks.
rob.net/8139too.c renamed from net/8139too.orig.c +12
-1@@ -80,6 +80,8 @@ Kalle Olavi Niemitalo - Wake-on-LAN ioctls + Robert Kuebel - Save kernel thread from dying on any signal. + Submitting bug reports:"rtl8139-diag -mmmaaavvveefN" output@@ -616,6 +618,7 @@struct completion thr_exited;u32 rx_config;struct rtl_extra_stats xstats; +int time_to_die; };MODULE_AUTHOR ("Jeff Garzik <[email protected]>" );@@ -1669,7 +1672,13 @@ timeout =interruptible_sleep_on_timeout (&tp->thr_wait, timeout); }while (!signal_pending (current) && (timeout >0 )); -if (signal_pending (current)) +if (signal_pending (current)) { +spin_lock_irq (¤t->sigmask_lock); +flush_signals (current); +spin_unlock_irq (¤t->sigmask_lock); + } + +if (tp->time_to_die)break ;rtnl_lock ();@@ -2200,6 +2209,8 @@netif_stop_queue (dev);if (tp->thr_pid >=0 ) { + tp->time_to_die =1 ; +wmb (); ret =kill_proc (tp->thr_pid,SIGTERM ,1 );if (ret) {printk (KERN_ERR "%s: unable to signal thread\n" , dev->name);
Quoted 6 lines · Robert Kuebel
ok, i am wondering if i have made a mistake. this patch will make the kernel thread die when
tp->time_to_dieis true. tp is kmalloc()'ed inside ofalloc_etherdev. i didn't initializetime_to_dieto 0, but this patch has been working perfectly for me. am i just lucky or are kmalloc()'ed regions zero'ed out?
And here I thought you did it on purpose :)
alloc_etherdev zeroes memory it allocates, so in net drivers all private structures can be considered initialized to zero when you get them.
Jeff
Signature · 3 lines
Jeff Garzik | Only so many songs can be sung Building 1024 | with two lips, two lungs, and one tongue. MandrakeSoft | - nomeansno
Quoted 9 lines · Robert Kuebel
ok, i am wondering if i have made a mistake. this patch will make the kernel thread die when
tp->time_to_dieis true. tp is kmalloc()'ed inside ofalloc_etherdev. i didn't initializetime_to_dieto 0, but this patch has been working perfectly for me. am i just lucky or are kmalloc()'ed regions zero'ed out? i know there is stuff likeget_zeroed_page(), but i don't think that applies here. i guess it doesn't hurt to set the flag to zero myself.
alloc_etherdev->alloc_netdev->memset(dev, 0, alloc_size);
It was zeroed for you.
i was so wrapped up in digging through kmalloc(), that i missed the memset() in alloc_netdev(). duh!
Quoted 20 lines · Jeff Garzik
Quoted 6 lines · Robert Kuebel
ok, i am wondering if i have made a mistake. this patch will make the kernel thread die when
tp->time_to_dieis true. tp is kmalloc()'ed inside ofalloc_etherdev. i didn't initializetime_to_dieto 0, but this patch has been working perfectly for me. am i just lucky or are kmalloc()'ed regions zero'ed out?And here I thought you did it on purpose :)
alloc_etherdevzeroes memory it allocates, so in net drivers all private structures can be considered initialized to zero when you get them.Jeff
Signature · 3 lines
Jeff Garzik | Only so many songs can be sung Building 1024 | with two lips, two lungs, and one tongue. MandrakeSoft | - nomeansno