Whamcloud - gitweb
* Applied the last patch in Bug 2306, which changes the portals router/NAL
[fs/lustre-release.git] / lustre / portals / knals / qswnal / qswnal.c
index 127bbce..3b3b5d4 100644 (file)
@@ -213,7 +213,6 @@ kqswnal_finalise (void)
                /* fall through */
 
        case KQN_INIT_DATA:
-               LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
                break;
 
        case KQN_INIT_NOTHING:
@@ -248,6 +247,9 @@ kqswnal_finalise (void)
 
        if (kqswnal_data.kqn_eptx != NULL)
                ep_free_xmtr (kqswnal_data.kqn_eptx);
+
+       /* freeing the xmtr completes all txs pdq */
+       LASSERT(list_empty(&kqswnal_data.kqn_activetxds));
 #else
        if (kqswnal_data.kqn_eprx_small != NULL)
                ep_remove_large_rcvr (kqswnal_data.kqn_eprx_small);
@@ -255,6 +257,13 @@ kqswnal_finalise (void)
        if (kqswnal_data.kqn_eprx_large != NULL)
                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)
                ep_free_large_xmtr (kqswnal_data.kqn_eptx);
 #endif
@@ -339,10 +348,10 @@ kqswnal_finalise (void)
                for (i = 0; i < KQSW_NRXMSGS_SMALL + KQSW_NRXMSGS_LARGE; i++) {
                        kqswnal_rx_t *krx = &kqswnal_data.kqn_rxds[i];
 
-                       /* If krx_pages[0] got allocated, it got mapped.
+                       /* If krx_kiov[0].kiov_page got allocated, it got mapped.  
                         * NB subsequent pages get merged */
 
-                       if (krx->krx_pages[0] != NULL)
+                       if (krx->krx_kiov[0].kiov_page != NULL)
                                ep_dvma_unload(kqswnal_data.kqn_ep,
                                               kqswnal_data.kqn_ep_rx_nmh,
                                               &krx->krx_elanbuffer);
@@ -407,8 +416,8 @@ kqswnal_finalise (void)
                        kqswnal_rx_t *krx = &kqswnal_data.kqn_rxds[i];
 
                        for (j = 0; j < krx->krx_npages; j++)
-                               if (krx->krx_pages[j] != NULL)
-                                       __free_page (krx->krx_pages[j]);
+                               if (krx->krx_kiov[j].kiov_page != NULL)
+                                       __free_page (krx->krx_kiov[j].kiov_page);
                }
 
                PORTAL_FREE(kqswnal_data.kqn_rxds,
@@ -700,18 +709,19 @@ kqswnal_initialise (void)
                LASSERT (krx->krx_npages > 0);
                for (j = 0; j < krx->krx_npages; j++)
                {
-                       krx->krx_pages[j] = alloc_page(GFP_KERNEL);
-                       if (krx->krx_pages[j] == NULL)
-                       {
+                       struct page *page = alloc_page(GFP_KERNEL);
+                       
+                       if (page == NULL) {
                                kqswnal_finalise ();
                                return (-ENOMEM);
                        }
 
-                       LASSERT(page_address(krx->krx_pages[j]) != NULL);
+                       krx->krx_kiov[j].kiov_page = page;
+                       LASSERT(page_address(page) != NULL);
 
 #if MULTIRAIL_EKC
                        ep_dvma_load(kqswnal_data.kqn_ep, NULL,
-                                    page_address(krx->krx_pages[j]),
+                                    page_address(page),
                                     PAGE_SIZE, kqswnal_data.kqn_ep_rx_nmh,
                                     elan_page_idx, &all_rails, &elanbuffer);
                        
@@ -727,7 +737,7 @@ kqswnal_initialise (void)
 #else
                        elan3_dvma_kaddr_load(kqswnal_data.kqn_ep->DmaState,
                                              kqswnal_data.kqn_eprxdmahandle,
-                                             page_address(krx->krx_pages[j]),
+                                             page_address(page),
                                              PAGE_SIZE, elan_page_idx,
                                              &elanbuffer);
                        if (j == 0)