Whamcloud - gitweb
* 5630 fix takes ibnal global lock at raised IRQ priority
authoreeb <eeb>
Mon, 31 Jan 2005 14:34:05 +0000 (14:34 +0000)
committereeb <eeb>
Mon, 31 Jan 2005 14:34:05 +0000 (14:34 +0000)
lnet/klnds/iiblnd/iiblnd.c
lnet/klnds/iiblnd/iiblnd_cb.c
lnet/klnds/openiblnd/openiblnd.c
lnet/klnds/openiblnd/openiblnd_cb.c
lnet/klnds/viblnd/viblnd.c
lnet/klnds/viblnd/viblnd_cb.c

index 5dc5192..1ecd32d 100644 (file)
@@ -416,12 +416,13 @@ kib_peer_t *
 kibnal_get_peer (ptl_nid_t nid)
 {
         kib_peer_t     *peer;
+        unsigned long   flags;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
         peer = kibnal_find_peer_locked (nid);
         if (peer != NULL)                       /* +1 ref for caller? */
                 kib_peer_addref(peer);
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 
         return (peer);
 }
@@ -443,9 +444,10 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, int *persistencep)
 {
         kib_peer_t        *peer;
         struct list_head  *ptmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
 
@@ -462,12 +464,13 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, int *persistencep)
                         *nidp = peer->ibp_nid;
                         *persistencep = peer->ibp_persistence;
 
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
                         return (0);
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (-ENOENT);
 }
 
@@ -584,9 +587,10 @@ kibnal_get_conn_by_idx (int index)
         struct list_head  *ptmp;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
                 list_for_each (ptmp, &kibnal_data.kib_peers[i]) {
@@ -605,13 +609,14 @@ kibnal_get_conn_by_idx (int index)
                                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                                        atomic_read (&conn->ibc_refcount));
                                 atomic_inc (&conn->ibc_refcount);
-                                read_unlock (&kibnal_data.kib_global_lock);
+                                read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                                       flags);
                                 return (conn);
                         }
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (NULL);
 }
 
index 16ed937..c3142a1 100644 (file)
@@ -1182,11 +1182,11 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
         LASSERT (tx->tx_conn == NULL);          /* only set when assigned a conn */
         LASSERT (tx->tx_nsp > 0);               /* work items have been set up */
 
-        read_lock (g_lock);
+        read_lock_irqsave(g_lock, flags);
         
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 tx->tx_status = -EHOSTUNREACH;
                 kibnal_tx_done (tx);
                 return;
@@ -1198,15 +1198,15 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                        atomic_read (&conn->ibc_refcount));
                 atomic_inc (&conn->ibc_refcount); /* 1 ref for the tx */
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 
                 kibnal_queue_tx (tx, conn);
                 return;
         }
         
         /* Making one or more connections; I'll need a write lock... */
-        read_unlock (g_lock);
-        write_lock_irqsave (g_lock, flags);
+        read_unlock(g_lock);
+        write_lock(g_lock);
 
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
@@ -2756,12 +2756,13 @@ kibnal_check_conns (int idx)
         kib_peer_t        *peer;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
 
  again:
         /* NB. We expect to have a look at all the peers and not find any
          * rdmas to time out, so we just use a shared lock while we
          * take a look... */
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         list_for_each (ptmp, peers) {
                 peer = list_entry (ptmp, kib_peer_t, ibp_list);
@@ -2784,7 +2785,8 @@ kibnal_check_conns (int idx)
                                atomic_read (&conn->ibc_refcount));
 
                         atomic_inc (&conn->ibc_refcount);
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
 
                         CERROR("Timed out RDMA with "LPX64"\n",
                                peer->ibp_nid);
@@ -2797,7 +2799,7 @@ kibnal_check_conns (int idx)
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 }
 
 static void
index adc5ba8..9e6ca58 100644 (file)
@@ -1075,12 +1075,13 @@ kib_peer_t *
 kibnal_get_peer (ptl_nid_t nid)
 {
         kib_peer_t     *peer;
+        unsigned long   flags;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
         peer = kibnal_find_peer_locked (nid);
         if (peer != NULL)                       /* +1 ref for caller? */
                 atomic_inc (&peer->ibp_refcount);
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 
         return (peer);
 }
@@ -1103,9 +1104,10 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, __u32 *ipp, int *portp,
 {
         kib_peer_t        *peer;
         struct list_head  *ptmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
 
@@ -1124,12 +1126,13 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, __u32 *ipp, int *portp,
                         *portp = peer->ibp_port;
                         *persistencep = peer->ibp_persistence;
                         
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
                         return (0);
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (-ENOENT);
 }
 
@@ -1248,9 +1251,10 @@ kibnal_get_conn_by_idx (int index)
         struct list_head  *ptmp;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
                 list_for_each (ptmp, &kibnal_data.kib_peers[i]) {
@@ -1269,13 +1273,14 @@ kibnal_get_conn_by_idx (int index)
                                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                                        atomic_read (&conn->ibc_refcount));
                                 atomic_inc (&conn->ibc_refcount);
-                                read_unlock (&kibnal_data.kib_global_lock);
+                                read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                                       flags);
                                 return (conn);
                         }
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (NULL);
 }
 
index 62b64a4..9c7116e 100644 (file)
@@ -929,11 +929,11 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
         LASSERT (tx->tx_conn == NULL);          /* only set when assigned a conn */
         LASSERT (tx->tx_nsp > 0);               /* work items have been set up */
 
-        read_lock (g_lock);
+        read_lock_irqsave(g_lock, flags);
         
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 tx->tx_status = -EHOSTUNREACH;
                 kibnal_tx_done (tx);
                 return;
@@ -945,15 +945,15 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                        atomic_read (&conn->ibc_refcount));
                 atomic_inc (&conn->ibc_refcount); /* 1 ref for the tx */
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 
                 kibnal_queue_tx (tx, conn);
                 return;
         }
         
         /* Making one or more connections; I'll need a write lock... */
-        read_unlock (g_lock);
-        write_lock_irqsave (g_lock, flags);
+        read_unlock(g_lock);
+        write_lock(g_lock);
 
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
@@ -2217,12 +2217,13 @@ kibnal_check_conns (int idx)
         kib_peer_t        *peer;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
 
  again:
         /* NB. We expect to have a look at all the peers and not find any
          * rdmas to time out, so we just use a shared lock while we
          * take a look... */
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         list_for_each (ptmp, peers) {
                 peer = list_entry (ptmp, kib_peer_t, ibp_list);
@@ -2246,7 +2247,8 @@ kibnal_check_conns (int idx)
                                atomic_read (&conn->ibc_refcount));
 
                         atomic_inc (&conn->ibc_refcount);
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
 
                         CERROR("Timed out RDMA with "LPX64"\n",
                                peer->ibp_nid);
@@ -2259,7 +2261,7 @@ kibnal_check_conns (int idx)
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 }
 
 void
index 1e1d2f4..0c0a0e7 100644 (file)
@@ -394,12 +394,13 @@ kib_peer_t *
 kibnal_get_peer (ptl_nid_t nid)
 {
         kib_peer_t     *peer;
+        unsigned long   flags;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
         peer = kibnal_find_peer_locked (nid);
         if (peer != NULL)                       /* +1 ref for caller? */
                 kib_peer_addref(peer);
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 
         return (peer);
 }
@@ -421,9 +422,10 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, int *persistencep)
 {
         kib_peer_t        *peer;
         struct list_head  *ptmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
 
@@ -440,12 +442,13 @@ kibnal_get_peer_info (int index, ptl_nid_t *nidp, int *persistencep)
                         *nidp = peer->ibp_nid;
                         *persistencep = peer->ibp_persistence;
 
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
                         return (0);
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (-ENOENT);
 }
 
@@ -562,9 +565,10 @@ kibnal_get_conn_by_idx (int index)
         struct list_head  *ptmp;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
         int                i;
 
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) {
                 list_for_each (ptmp, &kibnal_data.kib_peers[i]) {
@@ -583,13 +587,14 @@ kibnal_get_conn_by_idx (int index)
                                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                                        atomic_read (&conn->ibc_refcount));
                                 atomic_inc (&conn->ibc_refcount);
-                                read_unlock (&kibnal_data.kib_global_lock);
+                                read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                                       flags);
                                 return (conn);
                         }
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
         return (NULL);
 }
 
index 78bcda4..e21d62f 100644 (file)
@@ -1184,11 +1184,11 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
         LASSERT (tx->tx_conn == NULL);          /* only set when assigned a conn */
         LASSERT (tx->tx_nsp > 0);               /* work items have been set up */
 
-        read_lock (g_lock);
+        read_lock_irqsave(g_lock, flags);
         
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 tx->tx_status = -EHOSTUNREACH;
                 kibnal_tx_done (tx);
                 return;
@@ -1200,15 +1200,15 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid)
                        conn, conn->ibc_state, conn->ibc_peer->ibp_nid,
                        atomic_read (&conn->ibc_refcount));
                 atomic_inc (&conn->ibc_refcount); /* 1 ref for the tx */
-                read_unlock (g_lock);
+                read_unlock_irqrestore(g_lock, flags);
                 
                 kibnal_queue_tx (tx, conn);
                 return;
         }
         
         /* Making one or more connections; I'll need a write lock... */
-        read_unlock (g_lock);
-        write_lock_irqsave (g_lock, flags);
+        read_unlock(g_lock);
+        write_lock(g_lock);
 
         peer = kibnal_find_peer_locked (nid);
         if (peer == NULL) {
@@ -2890,12 +2890,13 @@ kibnal_check_conns (int idx)
         kib_peer_t        *peer;
         kib_conn_t        *conn;
         struct list_head  *ctmp;
+        unsigned long      flags;
 
  again:
         /* NB. We expect to have a look at all the peers and not find any
          * rdmas to time out, so we just use a shared lock while we
          * take a look... */
-        read_lock (&kibnal_data.kib_global_lock);
+        read_lock_irqsave(&kibnal_data.kib_global_lock, flags);
 
         list_for_each (ptmp, peers) {
                 peer = list_entry (ptmp, kib_peer_t, ibp_list);
@@ -2918,7 +2919,8 @@ kibnal_check_conns (int idx)
                                atomic_read (&conn->ibc_refcount));
 
                         atomic_inc (&conn->ibc_refcount);
-                        read_unlock (&kibnal_data.kib_global_lock);
+                        read_unlock_irqrestore(&kibnal_data.kib_global_lock,
+                                               flags);
 
                         CERROR("Timed out RDMA with "LPX64"\n",
                                peer->ibp_nid);
@@ -2931,7 +2933,7 @@ kibnal_check_conns (int idx)
                 }
         }
 
-        read_unlock (&kibnal_data.kib_global_lock);
+        read_unlock_irqrestore(&kibnal_data.kib_global_lock, flags);
 }
 
 static void