From d98fb75b8edeffba9aac2866aab71294d10478b0 Mon Sep 17 00:00:00 2001 From: pjkirner Date: Thu, 22 Sep 2005 19:07:37 +0000 Subject: [PATCH] * Fix KIOV mapping when used with CRAY PORTALS * Replaced KIOV mapping for LUSTRE PORTALS that was previously there. --- lnet/klnds/ptllnd/ptllnd.c | 2 +- lnet/klnds/ptllnd/ptllnd.h | 25 +++++---- lnet/klnds/ptllnd/ptllnd_cb.c | 121 +++++++++++++++++----------------------- lnet/klnds/ptllnd/ptllnd_peer.c | 4 +- lnet/klnds/ptllnd/ptllnd_tx.c | 6 -- 5 files changed, 69 insertions(+), 89 deletions(-) diff --git a/lnet/klnds/ptllnd/ptllnd.c b/lnet/klnds/ptllnd/ptllnd.c index 04a2aa1..ebb9feb 100755 --- a/lnet/klnds/ptllnd/ptllnd.c +++ b/lnet/klnds/ptllnd/ptllnd.c @@ -308,7 +308,7 @@ kptllnd_startup (lnet_ni_t *ni) ptl_rc = PtlNIInit( #ifdef _USING_LUSTRE_PORTALS_ PTL_IFACE_DEFAULT, -#else +#else /* _USING_CRAY_PORTALS_ */ CRAY_KERN_NAL, #endif PTLLND_PID, NULL, NULL, diff --git a/lnet/klnds/ptllnd/ptllnd.h b/lnet/klnds/ptllnd/ptllnd.h index 2ab40ff..3a89302 100755 --- a/lnet/klnds/ptllnd/ptllnd.h +++ b/lnet/klnds/ptllnd/ptllnd.h @@ -89,7 +89,7 @@ #ifdef _USING_LUSTRE_PORTALS_ #define FMT_NID LPX64 -#else +#else /* _USING_CRAY_PORTALS_ */ #define FMT_NID "%x" #define ptl_err_t ptl_ni_fail_t #define PtlHandleIsEqual(a,b) (a == b) @@ -258,9 +258,7 @@ typedef struct kptl_tx /* transmit message */ lnet_kiov_t *tx_payload_kiov; unsigned int tx_payload_offset; int tx_payload_nob; - - int tx_mapped_kiov; /* KIOV's have been mapped */ - + } kptl_tx_t; @@ -622,6 +620,15 @@ kptllnd_msg_unpack( /* * MISC SUPPORT FUNCTIONS */ + + +typedef union { + struct iovec iov[PTL_MD_MAX_IOV]; +#ifdef _USING_LUSTRE_PORTALS_ + ptl_kiov_t kiov[PTL_MD_MAX_IOV]; +#endif +}tempiov_t; + void kptllnd_setup_md( @@ -634,11 +641,7 @@ kptllnd_setup_md( lnet_kiov_t *payload_kiov, unsigned int payload_offset, int payload_nob, - struct iovec *tempiovec); - -void -kptllnd_cleanup_kiov( - kptl_tx_t *tx); + tempiov_t *tempiov); int kptllnd_process_scheduled_tx(kptl_data_t *kptllnd_data); int kptllnd_process_scheduled_rx(kptl_data_t *kptllnd_data); @@ -648,7 +651,7 @@ static inline lnet_nid_t ptl2lnetnid(kptl_data_t *kptllnd_data,ptl_nid_t portals { #ifdef _USING_LUSTRE_PORTALS_ return PTL_MKNID(PTL_NIDNET(kptllnd_data->kptl_ni->ni_nid), PTL_NIDADDR(portals_nid) ); -#else +#else /* _USING_CRAY_PORTALS_ */ return PTL_MKNID(PTL_NIDNET(kptllnd_data->kptl_ni->ni_nid), portals_nid); #endif } @@ -657,7 +660,7 @@ static inline ptl_nid_t lnet2ptlnid(kptl_data_t *kptllnd_data,lnet_nid_t lnet_ni { #ifdef _USING_LUSTRE_PORTALS_ return PTL_MKNID(PTL_NIDNET(kptllnd_data->kptl_portals_id.nid), PTL_NIDADDR(lnet_nid) ); -#else +#else /* _USING_CRAY_PORTALS_ */ return PTL_NIDADDR(lnet_nid); #endif } diff --git a/lnet/klnds/ptllnd/ptllnd_cb.c b/lnet/klnds/ptllnd/ptllnd_cb.c index 7313758..34b3e8f 100644 --- a/lnet/klnds/ptllnd/ptllnd_cb.c +++ b/lnet/klnds/ptllnd/ptllnd_cb.c @@ -36,7 +36,7 @@ kptllnd_setup_md( lnet_kiov_t *payload_kiov, unsigned int payload_offset, int payload_nob, - struct iovec *tempiovec) + tempiov_t *tempiov) { unsigned int niov = 0; @@ -89,25 +89,27 @@ kptllnd_setup_md( while(payload_nob){ LASSERT( payload_offset < payload_iov->iov_len); LASSERT (payload_niov > 0); - LASSERT (niov < PTL_MD_MAX_IOV); + LASSERT (niov < sizeof(tempiov->iov)/sizeof(tempiov->iov[0])); - tempiovec[niov].iov_base = payload_iov->iov_base + payload_offset; - tempiovec[niov].iov_len = min((int)(payload_iov->iov_len - payload_offset), + tempiov->iov[niov].iov_base = payload_iov->iov_base + payload_offset; + tempiov->iov[niov].iov_len = min((int)(payload_iov->iov_len - payload_offset), (int)payload_nob); - PJK_UT_MSG("iov_base[%d]=%p\n",niov,tempiovec[niov].iov_base); - PJK_UT_MSG("iov_len[%d] =%d\n",niov,tempiovec[niov].iov_len); + PJK_UT_MSG("iov_base[%d]=%p\n",niov,tempiov->iov[niov].iov_base); + PJK_UT_MSG("iov_len[%d] =%d\n",niov,tempiov->iov[niov].iov_len); payload_offset = 0; - payload_nob -= tempiovec[niov].iov_len; + payload_nob -= tempiov->iov[niov].iov_len; payload_iov++; payload_niov--; niov++; } + + md->start = tempiov->iov; + md->options |= PTL_MD_IOVEC; }else{ - - PJK_UT_MSG_DATA("Mapping KIOVs tx=%p\n",tx); - + +#ifdef _USING_LUSTRE_PORTALS_ while (payload_offset >= payload_kiov->kiov_len) { payload_offset -= payload_kiov->kiov_len; @@ -117,68 +119,34 @@ kptllnd_setup_md( } while(payload_nob){ - u8 *ptr; - LASSERT( payload_offset < payload_kiov->kiov_len); LASSERT (payload_niov > 0); - LASSERT (niov < PTL_MD_MAX_IOV ); - - - ptr = cfs_kmap(payload_kiov->kiov_page); - LASSERT( ptr != 0); - ptr += payload_kiov->kiov_offset; + LASSERT (niov < sizeof(tempiov->kiov)/sizeof(tempiov->kiov[0])); - tempiovec[niov].iov_base = ptr + payload_offset; - tempiovec[niov].iov_len = min((int)(payload_kiov->kiov_len - payload_offset), + tempiov->kiov[niov].kiov_page = payload_kiov->kiov_page; + tempiov->kiov[niov].kiov_offset = payload_kiov->kiov_offset + payload_offset; + tempiov->kiov[niov].kiov_len = min((int)(payload_kiov->kiov_len - payload_offset), (int)payload_nob); - PJK_UT_MSG("iov_base[%d]=%p\n",niov,tempiovec[niov].iov_base); - PJK_UT_MSG("iov_len[%d] =%d\n",niov,tempiovec[niov].iov_len); - - payload_offset = 0; - payload_nob -= tempiovec[niov].iov_len; + payload_nob -= tempiov->kiov[niov].kiov_len; payload_kiov++; payload_niov--; niov++; } - - /* - * We've mapped the KIOVs - */ - tx->tx_mapped_kiov = 1; - } - - md->start = tempiovec; - md->options |= PTL_MD_IOVEC; - - /* - * When using PTL_MD_IOVEC or PTL_MD_KIOV this is not - * length, rather it is # iovs - */ - md->length = niov; -} - -void -kptllnd_cleanup_kiov( - kptl_tx_t *tx) -{ - unsigned int payload_niov = tx->tx_payload_niov; - lnet_kiov_t *payload_kiov = tx->tx_payload_kiov; - unsigned int payload_offset = tx->tx_payload_offset; - int payload_nob = tx->tx_payload_nob; - - /* - * Do nothing if the KIOVs weren't mapped - */ - if(tx->tx_mapped_kiov == 0) - return; - - PJK_UT_MSG("Un Mapping KIOVs tx=%p\n",tx); - - if (payload_kiov != NULL){ - - LASSERT(tx->tx_payload_iov == NULL); + + md->start = tempiov->kiov; + md->options |= PTL_MD_KIOV; + +#else /* _USING_CRAY_PORTALS_ */ + +/* + * If we're using CRAY PORTALS + * it is not supposed to support PTL_MD_KIOV + */ +#ifdef PTL_MD_KIOV +#error "Conflicting compilation directives" +#endif while (payload_offset >= payload_kiov->kiov_len) { payload_offset -= payload_kiov->kiov_len; @@ -188,22 +156,37 @@ kptllnd_cleanup_kiov( } while(payload_nob){ - int temp_iov_len; LASSERT( payload_offset < payload_kiov->kiov_len); LASSERT (payload_niov > 0); + LASSERT (niov < sizeof(tempiov->iov)/sizeof(tempiov->iov[0])); - - cfs_kunmap(payload_kiov->kiov_page); - temp_iov_len = min((int)(payload_kiov->kiov_len - payload_offset), + tempiov->iov[niov].iov_base = (void *)( + page_to_phys(payload_kiov->kiov_page) + payload_offset); + tempiov->iov[niov].iov_len = min((int)(payload_kiov->kiov_len - payload_offset), (int)payload_nob); + PJK_UT_MSG("iov_base[%d]=%p\n",niov,tempiov->iov[niov].iov_base); + PJK_UT_MSG("iov_len[%d] =%d\n",niov,tempiov->iov[niov].iov_len); + payload_offset = 0; - payload_nob -= temp_iov_len; + payload_nob -= tempiov->iov[niov].iov_len; payload_kiov++; payload_niov--; + niov++; } + + md->start = tempiov->iov; + md->options |= PTL_MD_IOVEC | PTL_MD_PHYS; +#endif + } + + /* + * When using PTL_MD_IOVEC or PTL_MD_KIOV this is not + * length, rather it is # iovs + */ + md->length = niov; } int @@ -223,7 +206,7 @@ kptllnd_start_bulk_rdma( ptl_err_t ptl_rc; ptl_err_t ptl_rc2; int rc; - struct iovec tempiovec[PTL_MD_MAX_IOV]; + tempiov_t tempiov; kptl_msg_t *rxmsg = rx->rx_msg; kptl_peer_t *peer = rx->rx_peer; @@ -258,7 +241,7 @@ kptllnd_start_bulk_rdma( */ kptllnd_setup_md(kptllnd_data,&md,op,tx, payload_niov,payload_iov,payload_kiov, - payload_offset,payload_nob,tempiovec); + payload_offset,payload_nob,&tempiov); spin_lock(&peer->peer_lock); diff --git a/lnet/klnds/ptllnd/ptllnd_peer.c b/lnet/klnds/ptllnd/ptllnd_peer.c index 738aad4..79d8b1b 100644 --- a/lnet/klnds/ptllnd/ptllnd_peer.c +++ b/lnet/klnds/ptllnd/ptllnd_peer.c @@ -662,7 +662,7 @@ kptllnd_peer_check_sends ( if(tx->tx_msg->ptlm_type == PTLLND_MSG_TYPE_GET || tx->tx_msg->ptlm_type == PLTLND_MSG_TYPE_PUT){ - struct iovec tempiovec[PTL_MD_MAX_IOV]; + tempiov_t tempiov; #ifdef TESTING_WITH_LOOPBACK /* @@ -705,7 +705,7 @@ kptllnd_peer_check_sends ( tx->tx_payload_kiov, tx->tx_payload_offset, tx->tx_payload_nob, - tempiovec); + &tempiov); /* * Add a ref for this MD, because unlink diff --git a/lnet/klnds/ptllnd/ptllnd_tx.c b/lnet/klnds/ptllnd/ptllnd_tx.c index 497d845..cf8f785 100644 --- a/lnet/klnds/ptllnd/ptllnd_tx.c +++ b/lnet/klnds/ptllnd/ptllnd_tx.c @@ -164,7 +164,6 @@ kptllnd_get_idle_tx( tx->tx_payload_kiov = 0; tx->tx_payload_offset = 0; tx->tx_payload_nob = 0; - tx->tx_mapped_kiov = 0; STAT_UPDATE(kps_tx_allocated); }else{ @@ -191,11 +190,6 @@ kptllnd_tx_done (kptl_tx_t *tx) LASSERT(atomic_read(&tx->tx_refcount) == 0); LASSERT(list_empty(&tx->tx_schedlist)); /*not any the scheduler list*/ - /* - * Cleanup any mapped KIOVs - */ - kptllnd_cleanup_kiov(tx); - if(tx->tx_ptlmsg != 0){ PJK_UT_MSG("tx=%p finalize\n",tx); lnet_finalize (kptllnd_data->kptl_ni, tx->tx_ptlmsg, tx->tx_status); -- 1.8.3.1