Whamcloud - gitweb
b=14956
authormaxim <maxim>
Fri, 7 Mar 2008 16:01:07 +0000 (16:01 +0000)
committermaxim <maxim>
Fri, 7 Mar 2008 16:01:07 +0000 (16:01 +0000)
i=isaac
i=liang
Sleep on gmni_rx_mutex in interruptible way. Otherwise 'uptime' reports high load while rx thread is sleeping on mutex.

lnet/klnds/gmlnd/gmlnd_comm.c

index 0ef2436..5f48cf0 100644 (file)
@@ -433,9 +433,11 @@ gmnal_rx_thread(void *arg)
 
         cfs_daemonize("gmnal_rxd");
 
 
         cfs_daemonize("gmnal_rxd");
 
-        down(&gmni->gmni_rx_mutex);
-
         while (!gmni->gmni_shutdown) {
         while (!gmni->gmni_shutdown) {
+                rc = down_interruptible(&gmni->gmni_rx_mutex);
+                LASSERT (rc == 0 || rc == -EINTR);
+                if (rc != 0)
+                        continue;
 
                 spin_lock(&gmni->gmni_gm_lock);
                 rxevent = gm_blocking_receive_no_spin(gmni->gmni_port);
 
                 spin_lock(&gmni->gmni_gm_lock);
                 rxevent = gm_blocking_receive_no_spin(gmni->gmni_port);
@@ -444,6 +446,7 @@ gmnal_rx_thread(void *arg)
                 switch (GM_RECV_EVENT_TYPE(rxevent)) {
                 default:
                         gm_unknown(gmni->gmni_port, rxevent);
                 switch (GM_RECV_EVENT_TYPE(rxevent)) {
                 default:
                         gm_unknown(gmni->gmni_port, rxevent);
+                        up(&gmni->gmni_rx_mutex);
                         continue;
 
                 case GM_FAST_RECV_EVENT:
                         continue;
 
                 case GM_FAST_RECV_EVENT:
@@ -503,12 +506,8 @@ gmnal_rx_thread(void *arg)
 
                 if (rc < 0)                     /* parse failure */
                         gmnal_post_rx(gmni, rx);
 
                 if (rc < 0)                     /* parse failure */
                         gmnal_post_rx(gmni, rx);
-
-                down(&gmni->gmni_rx_mutex);
         }
 
         }
 
-        up(&gmni->gmni_rx_mutex);
-
         CDEBUG(D_NET, "exiting\n");
         atomic_dec(&gmni->gmni_nthreads);
         return 0;
         CDEBUG(D_NET, "exiting\n");
         atomic_dec(&gmni->gmni_nthreads);
         return 0;