[etherlab-dev] uninterruptible sleep in ecrt_release_master()

Hobin Yoon hobinyoon at gmail.com
Tue Aug 26 14:44:05 CEST 2008


Hello, Florian Pose,

While I was loading and unloading mini module, I found that
/sbin/rmmod hangs(goes to uninterruptible sleep) at a ratio of 1 in
100.
I found the master thread still runs its while loop even after rmmod
thread issued SIGTERM.
There seems to be a race condition between kill_proc() and signal_pending().
So I modified the waiting thread to issue the signal again after
waiting some time until the master thread completes.
I tested insmod/rmmod 50,000 times and it was okay.

My system specs are:
 Disto: MontaVista Linux Version 5.0.0, Professional Edition (0702774)
 Kernel version: 2.6.18+
 CPU: Intel Core2 Quad Q6600

Here is the patch I did.

--- master.c    (original copy)
+++ master.c    (working copy)
@@ -332,6 +332,7 @@
         )
 {
     unsigned long sleep_jiffies;
+    sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy

     if (!master->thread_id) {
         EC_WARN("ec_master_thread_stop: Already finished!\n");
@@ -341,14 +342,17 @@
     if (master->debug_level)
         EC_DBG("Stopping master thread.\n");

-    kill_proc(master->thread_id, SIGTERM, 1);
-    wait_for_completion(&master->thread_exit);
+       do
+       {
+               kill_proc(master->thread_id, SIGTERM, 1);
+               wait_for_completion_timeout(&master->thread_exit,
sleep_jiffies);
+       } while (master->thread_id);
+
     EC_INFO("Master thread exited.\n");

     if (master->fsm_datagram.state != EC_DATAGRAM_SENT) return;

     // wait for FSM datagram
-    sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy
     schedule_timeout(sleep_jiffies);
 }

Best regards,
Hobin Yoon



More information about the Etherlab-dev mailing list