From: eeb Date: Mon, 31 Jan 2005 14:34:05 +0000 (+0000) Subject: * 5630 fix takes ibnal global lock at raised IRQ priority X-Git-Tag: v1_7_100~1647 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=9d2f11b43d2bc52b74eea4a01c78d1f80462986e * 5630 fix takes ibnal global lock at raised IRQ priority --- diff --git a/lnet/klnds/iiblnd/iiblnd.c b/lnet/klnds/iiblnd/iiblnd.c index 5dc5192..1ecd32d 100644 --- a/lnet/klnds/iiblnd/iiblnd.c +++ b/lnet/klnds/iiblnd/iiblnd.c @@ -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); } diff --git a/lnet/klnds/iiblnd/iiblnd_cb.c b/lnet/klnds/iiblnd/iiblnd_cb.c index 16ed937..c3142a1 100644 --- a/lnet/klnds/iiblnd/iiblnd_cb.c +++ b/lnet/klnds/iiblnd/iiblnd_cb.c @@ -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 diff --git a/lnet/klnds/openiblnd/openiblnd.c b/lnet/klnds/openiblnd/openiblnd.c index adc5ba8..9e6ca58 100644 --- a/lnet/klnds/openiblnd/openiblnd.c +++ b/lnet/klnds/openiblnd/openiblnd.c @@ -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); } diff --git a/lnet/klnds/openiblnd/openiblnd_cb.c b/lnet/klnds/openiblnd/openiblnd_cb.c index 62b64a4..9c7116e 100644 --- a/lnet/klnds/openiblnd/openiblnd_cb.c +++ b/lnet/klnds/openiblnd/openiblnd_cb.c @@ -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 diff --git a/lnet/klnds/viblnd/viblnd.c b/lnet/klnds/viblnd/viblnd.c index 1e1d2f4..0c0a0e7 100644 --- a/lnet/klnds/viblnd/viblnd.c +++ b/lnet/klnds/viblnd/viblnd.c @@ -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); } diff --git a/lnet/klnds/viblnd/viblnd_cb.c b/lnet/klnds/viblnd/viblnd_cb.c index 78bcda4..e21d62f 100644 --- a/lnet/klnds/viblnd/viblnd_cb.c +++ b/lnet/klnds/viblnd/viblnd_cb.c @@ -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