diff --git a/lnet/klnds/gmlnd/gmlnd_comm.c b/lnet/klnds/gmlnd/gmlnd_comm.c
index 0ef243669041d8ef773a2a29ea20ef40c011b0f5..5f48cf0057089e24a737e04e18eb9968d927f6cd 100644
--- a/lnet/klnds/gmlnd/gmlnd_comm.c
+++ b/lnet/klnds/gmlnd/gmlnd_comm.c
@@ -433,9 +433,11 @@ gmnal_rx_thread(void *arg)
 
         cfs_daemonize("gmnal_rxd");
 
-        down(&gmni->gmni_rx_mutex);
-
         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);
@@ -444,6 +446,7 @@ gmnal_rx_thread(void *arg)
                 switch (GM_RECV_EVENT_TYPE(rxevent)) {
                 default:
                         gm_unknown(gmni->gmni_port, rxevent);
+                        up(&gmni->gmni_rx_mutex);
                         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);
-
-                down(&gmni->gmni_rx_mutex);
         }
 
-        up(&gmni->gmni_rx_mutex);
-
         CDEBUG(D_NET, "exiting\n");
         atomic_dec(&gmni->gmni_nthreads);
         return 0;