Skip to content
Snippets Groups Projects
Commit b060b306 authored by Eric Barton's avatar Eric Barton
Browse files

* Applied fix for 1888

parent 403645b2
No related branches found
No related tags found
No related merge requests found
...@@ -213,7 +213,6 @@ kqswnal_finalise (void) ...@@ -213,7 +213,6 @@ kqswnal_finalise (void)
/* fall through */ /* fall through */
case KQN_INIT_DATA: case KQN_INIT_DATA:
LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
break; break;
case KQN_INIT_NOTHING: case KQN_INIT_NOTHING:
...@@ -248,6 +247,9 @@ kqswnal_finalise (void) ...@@ -248,6 +247,9 @@ kqswnal_finalise (void)
if (kqswnal_data.kqn_eptx != NULL) if (kqswnal_data.kqn_eptx != NULL)
ep_free_xmtr (kqswnal_data.kqn_eptx); ep_free_xmtr (kqswnal_data.kqn_eptx);
/* freeing the xmtr completes all txs pdq */
LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
#else #else
if (kqswnal_data.kqn_eprx_small != NULL) if (kqswnal_data.kqn_eprx_small != NULL)
ep_remove_large_rcvr (kqswnal_data.kqn_eprx_small); ep_remove_large_rcvr (kqswnal_data.kqn_eprx_small);
...@@ -255,6 +257,13 @@ kqswnal_finalise (void) ...@@ -255,6 +257,13 @@ kqswnal_finalise (void)
if (kqswnal_data.kqn_eprx_large != NULL) if (kqswnal_data.kqn_eprx_large != NULL)
ep_remove_large_rcvr (kqswnal_data.kqn_eprx_large); ep_remove_large_rcvr (kqswnal_data.kqn_eprx_large);
/* wait for transmits to complete */
while (!list_empty(&kqswnal_data.kqn_activetxds)) {
CWARN("waiting for active transmits to complete\n");
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ);
}
if (kqswnal_data.kqn_eptx != NULL) if (kqswnal_data.kqn_eptx != NULL)
ep_free_large_xmtr (kqswnal_data.kqn_eptx); ep_free_large_xmtr (kqswnal_data.kqn_eptx);
#endif #endif
......
...@@ -213,7 +213,6 @@ kqswnal_finalise (void) ...@@ -213,7 +213,6 @@ kqswnal_finalise (void)
/* fall through */ /* fall through */
case KQN_INIT_DATA: case KQN_INIT_DATA:
LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
break; break;
case KQN_INIT_NOTHING: case KQN_INIT_NOTHING:
...@@ -248,6 +247,9 @@ kqswnal_finalise (void) ...@@ -248,6 +247,9 @@ kqswnal_finalise (void)
if (kqswnal_data.kqn_eptx != NULL) if (kqswnal_data.kqn_eptx != NULL)
ep_free_xmtr (kqswnal_data.kqn_eptx); ep_free_xmtr (kqswnal_data.kqn_eptx);
/* freeing the xmtr completes all txs pdq */
LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
#else #else
if (kqswnal_data.kqn_eprx_small != NULL) if (kqswnal_data.kqn_eprx_small != NULL)
ep_remove_large_rcvr (kqswnal_data.kqn_eprx_small); ep_remove_large_rcvr (kqswnal_data.kqn_eprx_small);
...@@ -255,6 +257,13 @@ kqswnal_finalise (void) ...@@ -255,6 +257,13 @@ kqswnal_finalise (void)
if (kqswnal_data.kqn_eprx_large != NULL) if (kqswnal_data.kqn_eprx_large != NULL)
ep_remove_large_rcvr (kqswnal_data.kqn_eprx_large); ep_remove_large_rcvr (kqswnal_data.kqn_eprx_large);
/* wait for transmits to complete */
while (!list_empty(&kqswnal_data.kqn_activetxds)) {
CWARN("waiting for active transmits to complete\n");
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ);
}
if (kqswnal_data.kqn_eptx != NULL) if (kqswnal_data.kqn_eptx != NULL)
ep_free_large_xmtr (kqswnal_data.kqn_eptx); ep_free_large_xmtr (kqswnal_data.kqn_eptx);
#endif #endif
......
...@@ -365,8 +365,39 @@ int ptlrpc_uuid_to_peer (struct obd_uuid *uuid, struct ptlrpc_peer *peer) ...@@ -365,8 +365,39 @@ int ptlrpc_uuid_to_peer (struct obd_uuid *uuid, struct ptlrpc_peer *peer)
void ptlrpc_ni_fini(struct ptlrpc_ni *pni) void ptlrpc_ni_fini(struct ptlrpc_ni *pni)
{ {
PtlEQFree(pni->pni_eq_h); wait_queue_head_t waitq;
kportal_put_ni (pni->pni_number); struct l_wait_info lwi;
int rc;
int retries;
/* Wait for the event queue to become idle since there may still be
* messages in flight with pending events (i.e. the fire-and-forget
* messages == client requests and "non-difficult" server
* replies */
for (retries = 0;; retries++) {
rc = PtlEQFree(pni->pni_eq_h);
switch (rc) {
default:
LBUG();
case PTL_OK:
kportal_put_ni (pni->pni_number);
return;
case PTL_EQ_INUSE:
if (retries != 0)
CWARN("Event queue for %s still busy\n",
pni->pni_name);
/* Wait for a bit */
init_waitqueue_head(&waitq);
lwi = LWI_TIMEOUT(2*HZ, NULL, NULL);
l_wait_event(waitq, 0, &lwi);
break;
}
}
/* notreached */
} }
int ptlrpc_ni_init(int number, char *name, struct ptlrpc_ni *pni) int ptlrpc_ni_init(int number, char *name, struct ptlrpc_ni *pni)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment