From: phil Date: Fri, 5 Sep 2003 21:25:35 +0000 (+0000) Subject: Committing eeb's merge of the qswnal changes into b_devel; plus one X-Git-Tag: v1_7_0_51~2^7~593 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=97a799f46ff454e13e09606c4fa94372ab06e243;p=fs%2Flustre-release.git Committing eeb's merge of the qswnal changes into b_devel; plus one aesthetic change from HEAD. --- diff --git a/lnet/include/linux/kp30.h b/lnet/include/linux/kp30.h index 85fe8e7..750d16c 100644 --- a/lnet/include/linux/kp30.h +++ b/lnet/include/linux/kp30.h @@ -887,6 +887,7 @@ extern ptl_handle_ni_t kscimacnal_ni; #define NAL_CMD_DEL_AUTOCONN 105 #define NAL_CMD_ADD_AUTOCONN 106 #define NAL_CMD_GET_AUTOCONN 107 +#define NAL_CMD_GET_TXDESC 108 enum { DEBUG_DAEMON_START = 1, diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h index ffe7e5b..8278111 100644 --- a/lnet/include/lnet/lnetctl.h +++ b/lnet/include/lnet/lnetctl.h @@ -41,6 +41,7 @@ int jt_ptl_print_connections (int argc, char **argv); int jt_ptl_connect(int argc, char **argv); int jt_ptl_disconnect(int argc, char **argv); int jt_ptl_push_connection(int argc, char **argv); +int jt_ptl_print_active_txs(int argc, char **argv); int jt_ptl_ping(int argc, char **argv); int jt_ptl_shownid(int argc, char **argv); int jt_ptl_mynid(int argc, char **argv); diff --git a/lnet/include/lnet/ptlctl.h b/lnet/include/lnet/ptlctl.h index ffe7e5b..8278111 100644 --- a/lnet/include/lnet/ptlctl.h +++ b/lnet/include/lnet/ptlctl.h @@ -41,6 +41,7 @@ int jt_ptl_print_connections (int argc, char **argv); int jt_ptl_connect(int argc, char **argv); int jt_ptl_disconnect(int argc, char **argv); int jt_ptl_push_connection(int argc, char **argv); +int jt_ptl_print_active_txs(int argc, char **argv); int jt_ptl_ping(int argc, char **argv); int jt_ptl_shownid(int argc, char **argv); int jt_ptl_mynid(int argc, char **argv); diff --git a/lnet/klnds/qswlnd/qswlnd.c b/lnet/klnds/qswlnd/qswlnd.c index 7cfc80e..d4ee960 100644 --- a/lnet/klnds/qswlnd/qswlnd.c +++ b/lnet/klnds/qswlnd/qswlnd.c @@ -112,11 +112,48 @@ kqswnal_init(int interface, ptl_pt_index_t ptl_size, ptl_ac_index_t ac_size, } int +kqswnal_get_tx_desc (struct portal_ioctl_data *data) +{ + unsigned long flags; + struct list_head *tmp; + kqswnal_tx_t *ktx; + int index = data->ioc_count; + int rc = -ENOENT; + + spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags); + + list_for_each (tmp, &kqswnal_data.kqn_activetxds) { + if (index-- != 0) + continue; + + ktx = list_entry (tmp, kqswnal_tx_t, ktx_list); + + data->ioc_pbuf1 = (char *)ktx; + data->ioc_count = NTOH__u32(ktx->ktx_wire_hdr->type); + data->ioc_size = NTOH__u32(PTL_HDR_LENGTH(ktx->ktx_wire_hdr)); + data->ioc_nid = NTOH__u64(ktx->ktx_wire_hdr->dest_nid); + data->ioc_nid2 = ktx->ktx_nid; + data->ioc_misc = ktx->ktx_launcher; + data->ioc_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) | + (!ktx->ktx_isnblk ? 0 : 2) | + (ktx->ktx_state << 2); + rc = 0; + break; + } + + spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); + return (rc); +} + +int kqswnal_cmd (struct portal_ioctl_data *data, void *private) { LASSERT (data != NULL); switch (data->ioc_nal_cmd) { + case NAL_CMD_GET_TXDESC: + return (kqswnal_get_tx_desc (data)); + case NAL_CMD_REGISTER_MYNID: CDEBUG (D_IOCTL, "setting NID offset to "LPX64" (was "LPX64")\n", data->ioc_nid - kqswnal_data.kqn_elanid, @@ -149,6 +186,7 @@ kqswnal_finalise (void) /* fall through */ case KQN_INIT_DATA: + LASSERT(list_empty(&kqswnal_data.kqn_activetxds)); break; case KQN_INIT_NOTHING: @@ -318,6 +356,7 @@ kqswnal_initialise (void) INIT_LIST_HEAD (&kqswnal_data.kqn_idletxds); INIT_LIST_HEAD (&kqswnal_data.kqn_nblk_idletxds); + INIT_LIST_HEAD (&kqswnal_data.kqn_activetxds); spin_lock_init (&kqswnal_data.kqn_idletxd_lock); init_waitqueue_head (&kqswnal_data.kqn_idletxd_waitq); INIT_LIST_HEAD (&kqswnal_data.kqn_idletxd_fwdq); @@ -460,12 +499,13 @@ kqswnal_initialise (void) ktx->ktx_basepage = basepage + premapped_pages; /* message mapping starts here */ ktx->ktx_npages = KQSW_NTXMSGPAGES - premapped_pages; /* for this many pages */ - if (i < KQSW_NTXMSGS) - ktx->ktx_idle = &kqswnal_data.kqn_idletxds; - else - ktx->ktx_idle = &kqswnal_data.kqn_nblk_idletxds; + INIT_LIST_HEAD (&ktx->ktx_delayed_list); - list_add_tail (&ktx->ktx_list, ktx->ktx_idle); + ktx->ktx_state = KTX_IDLE; + ktx->ktx_isnblk = (i >= KQSW_NTXMSGS); + list_add_tail (&ktx->ktx_list, + ktx->ktx_isnblk ? &kqswnal_data.kqn_nblk_idletxds : + &kqswnal_data.kqn_idletxds); } /**********************************************************************/ diff --git a/lnet/klnds/qswlnd/qswlnd.h b/lnet/klnds/qswlnd/qswlnd.h index 5cbbb9a..a27239c 100644 --- a/lnet/klnds/qswlnd/qswlnd.h +++ b/lnet/klnds/qswlnd/qswlnd.h @@ -77,20 +77,20 @@ #define KQSW_OPTIMIZE_GETS 1 -#define KQSW_CHECKSUM 0 +#define KQSW_CHECKSUM 0 #if KQSW_CHECKSUM typedef unsigned long kqsw_csum_t; -#define KQSW_CSUM_SIZE (2 * sizeof (kqsw_csum_t)) +#define KQSW_CSUM_SIZE (2 * sizeof (kqsw_csum_t)) #else -#define KQSW_CSUM_SIZE 0 +#define KQSW_CSUM_SIZE 0 #endif -#define KQSW_HDR_SIZE (sizeof (ptl_hdr_t) + KQSW_CSUM_SIZE) +#define KQSW_HDR_SIZE (sizeof (ptl_hdr_t) + KQSW_CSUM_SIZE) /* * Elan NAL */ -#define EP_SVC_LARGE_PORTALS_SMALL (0x10) /* Portals over elan port number (large payloads) */ -#define EP_SVC_LARGE_PORTALS_LARGE (0x11) /* Portals over elan port number (small payloads) */ +#define EP_SVC_LARGE_PORTALS_SMALL (0x10) /* Portals over elan port number (large payloads) */ +#define EP_SVC_LARGE_PORTALS_LARGE (0x11) /* Portals over elan port number (small payloads) */ /* NB small/large message sizes are GLOBAL constants */ /* @@ -98,39 +98,39 @@ typedef unsigned long kqsw_csum_t; * NB no mention of PAGE_SIZE for interoperability */ #define KQSW_MAXPAYLOAD PTL_MTU -#define KQSW_SMALLPAYLOAD ((4<<10) - KQSW_HDR_SIZE) /* small/large ep receiver breakpoint */ +#define KQSW_SMALLPAYLOAD ((4<<10) - KQSW_HDR_SIZE) /* small/large ep receiver breakpoint */ -#define KQSW_TX_MAXCONTIG (1<<10) /* largest payload that gets made contiguous on transmit */ +#define KQSW_TX_MAXCONTIG (1<<10) /* largest payload that gets made contiguous on transmit */ -#define KQSW_NTXMSGS 8 /* # normal transmit messages */ -#define KQSW_NNBLK_TXMSGS 256 /* # reserved transmit messages if can't block */ +#define KQSW_NTXMSGS 8 /* # normal transmit messages */ +#define KQSW_NNBLK_TXMSGS 256 /* # reserved transmit messages if can't block */ -#define KQSW_NRXMSGS_LARGE 64 /* # large receive buffers */ -#define KQSW_EP_ENVELOPES_LARGE 128 /* # large ep envelopes */ +#define KQSW_NRXMSGS_LARGE 64 /* # large receive buffers */ +#define KQSW_EP_ENVELOPES_LARGE 128 /* # large ep envelopes */ -#define KQSW_NRXMSGS_SMALL 256 /* # small receive buffers */ -#define KQSW_EP_ENVELOPES_SMALL 2048 /* # small ep envelopes */ +#define KQSW_NRXMSGS_SMALL 256 /* # small receive buffers */ +#define KQSW_EP_ENVELOPES_SMALL 2048 /* # small ep envelopes */ -#define KQSW_RESCHED 100 /* # busy loops that forces scheduler to yield */ +#define KQSW_RESCHED 100 /* # busy loops that forces scheduler to yield */ /* * derived constants */ -#define KQSW_TX_BUFFER_SIZE (KQSW_HDR_SIZE + KQSW_TX_MAXCONTIG) +#define KQSW_TX_BUFFER_SIZE (KQSW_HDR_SIZE + KQSW_TX_MAXCONTIG) /* The pre-allocated tx buffer (hdr + small payload) */ -#define KQSW_NTXMSGPAGES (btopr(KQSW_TX_BUFFER_SIZE) + 1 + btopr(KQSW_MAXPAYLOAD) + 1) +#define KQSW_NTXMSGPAGES (btopr(KQSW_TX_BUFFER_SIZE) + 1 + btopr(KQSW_MAXPAYLOAD) + 1) /* Reserve elan address space for pre-allocated and pre-mapped transmit * buffer and a full payload too. Extra pages allow for page alignment */ -#define KQSW_NRXMSGPAGES_SMALL (btopr(KQSW_HDR_SIZE + KQSW_SMALLPAYLOAD)) +#define KQSW_NRXMSGPAGES_SMALL (btopr(KQSW_HDR_SIZE + KQSW_SMALLPAYLOAD)) /* receive hdr/payload always contiguous and page aligned */ -#define KQSW_NRXMSGBYTES_SMALL (KQSW_NRXMSGPAGES_SMALL * PAGE_SIZE) +#define KQSW_NRXMSGBYTES_SMALL (KQSW_NRXMSGPAGES_SMALL * PAGE_SIZE) -#define KQSW_NRXMSGPAGES_LARGE (btopr(KQSW_HDR_SIZE + KQSW_MAXPAYLOAD)) +#define KQSW_NRXMSGPAGES_LARGE (btopr(KQSW_HDR_SIZE + KQSW_MAXPAYLOAD)) /* receive hdr/payload always contiguous and page aligned */ -#define KQSW_NRXMSGBYTES_LARGE (KQSW_NRXMSGPAGES_LARGE * PAGE_SIZE) +#define KQSW_NRXMSGBYTES_LARGE (KQSW_NRXMSGPAGES_LARGE * PAGE_SIZE) /* biggest complete packet we can receive (or transmit) */ /* Remote memory descriptor */ @@ -143,7 +143,7 @@ typedef struct typedef struct { struct list_head krx_list; /* enqueue -> thread */ - EP_RCVR *krx_eprx; /* port to post receives to */ + EP_RCVR *krx_eprx; /* port to post receives to */ EP_RXD *krx_rxd; /* receive descriptor (for repost) */ E3_Addr krx_elanaddr; /* Elan address of buffer (contiguous in elan vm) */ int krx_npages; /* # pages in receive buffer */ @@ -157,17 +157,23 @@ typedef struct typedef struct { - struct list_head ktx_list; /* enqueue idle/delayed */ - struct list_head *ktx_idle; /* where to put when idle */ - char ktx_state; /* What I'm doing */ + struct list_head ktx_list; /* enqueue idle/active */ + struct list_head ktx_delayed_list; /* enqueue delayedtxds */ + int ktx_isnblk:1; /* reserved descriptor? */ + int ktx_state:7; /* What I'm doing */ uint32_t ktx_basepage; /* page offset in reserved elan tx vaddrs for mapping pages */ int ktx_npages; /* pages reserved for mapping messages */ int ktx_nmappedpages; /* # pages mapped for current message */ int ktx_port; /* destination ep port */ ptl_nid_t ktx_nid; /* destination node */ void *ktx_args[2]; /* completion passthru */ - E3_Addr ktx_ebuffer; /* elan address of ktx_buffer */ + E3_Addr ktx_ebuffer; /* elan address of ktx_buffer */ char *ktx_buffer; /* pre-allocated contiguous buffer for hdr + small payloads */ + + /* debug/info fields */ + pid_t ktx_launcher; /* pid of launching process */ + ptl_hdr_t *ktx_wire_hdr; /* portals header (wire endian) */ + int ktx_nfrag; /* # message frags */ union { EP_IOVEC iov[EP_MAXFRAG]; /* msg frags (elan vaddrs) */ @@ -175,9 +181,9 @@ typedef struct } ktx_frags; } kqswnal_tx_t; -#define KTX_IDLE 0 /* MUST BE ZERO (so zeroed ktx is idle) */ -#define KTX_SENDING 1 /* local send */ -#define KTX_FORWARDING 2 /* routing a packet */ +#define KTX_IDLE 0 /* on kqn_(nblk_)idletxds */ +#define KTX_SENDING 1 /* local send */ +#define KTX_FORWARDING 2 /* routing a packet */ #define KTX_GETTING 3 /* local optimised get */ typedef struct @@ -190,7 +196,8 @@ typedef struct kqswnal_tx_t *kqn_txds; /* all the transmit descriptors */ struct list_head kqn_idletxds; /* transmit descriptors free to use */ - struct list_head kqn_nblk_idletxds; /* reserve of */ + struct list_head kqn_nblk_idletxds; /* reserved free transmit descriptors */ + struct list_head kqn_activetxds; /* transmit descriptors being used */ spinlock_t kqn_idletxd_lock; /* serialise idle txd access */ wait_queue_head_t kqn_idletxd_waitq; /* sender blocks here waiting for idle txd */ struct list_head kqn_idletxd_fwdq; /* forwarded packets block here waiting for idle txd */ @@ -204,12 +211,12 @@ typedef struct spinlock_t kqn_statelock; /* cb_cli/cb_sti */ nal_cb_t *kqn_cb; /* -> kqswnal_lib */ - EP_DEV *kqn_epdev; /* elan device */ - EP_XMTR *kqn_eptx; /* elan transmitter */ - EP_RCVR *kqn_eprx_small; /* elan receiver (small messages) */ - EP_RCVR *kqn_eprx_large; /* elan receiver (large messages) */ - ELAN3_DMA_HANDLE *kqn_eptxdmahandle; /* elan reserved tx vaddrs */ - ELAN3_DMA_HANDLE *kqn_eprxdmahandle; /* elan reserved rx vaddrs */ + EP_DEV *kqn_epdev; /* elan device */ + EP_XMTR *kqn_eptx; /* elan transmitter */ + EP_RCVR *kqn_eprx_small; /* elan receiver (small messages) */ + EP_RCVR *kqn_eprx_large; /* elan receiver (large messages) */ + ELAN3_DMA_HANDLE *kqn_eptxdmahandle; /* elan reserved tx vaddrs */ + ELAN3_DMA_HANDLE *kqn_eprxdmahandle; /* elan reserved rx vaddrs */ kpr_router_t kqn_router; /* connection to Kernel Portals Router module */ ptl_nid_t kqn_nid_offset; /* this cluster's NID offset */ @@ -218,10 +225,10 @@ typedef struct } kqswnal_data_t; /* kqn_init state */ -#define KQN_INIT_NOTHING 0 /* MUST BE ZERO so zeroed state is initialised OK */ -#define KQN_INIT_DATA 1 -#define KQN_INIT_PTL 2 -#define KQN_INIT_ALL 3 +#define KQN_INIT_NOTHING 0 /* MUST BE ZERO so zeroed state is initialised OK */ +#define KQN_INIT_DATA 1 +#define KQN_INIT_PTL 2 +#define KQN_INIT_ALL 3 extern nal_cb_t kqswnal_lib; extern nal_t kqswnal_api; diff --git a/lnet/klnds/qswlnd/qswlnd_cb.c b/lnet/klnds/qswlnd/qswlnd_cb.c index 66529bd..dfc479d 100644 --- a/lnet/klnds/qswlnd/qswlnd_cb.c +++ b/lnet/klnds/qswlnd/qswlnd_cb.c @@ -290,22 +290,24 @@ void kqswnal_put_idle_tx (kqswnal_tx_t *ktx) { kpr_fwd_desc_t *fwd = NULL; - struct list_head *idle = ktx->ktx_idle; unsigned long flags; - kqswnal_unmap_tx (ktx); /* release temporary mappings */ + kqswnal_unmap_tx (ktx); /* release temporary mappings */ ktx->ktx_state = KTX_IDLE; spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags); - list_add (&ktx->ktx_list, idle); + list_del (&ktx->ktx_list); /* take off active list */ - /* reserved for non-blocking tx */ - if (idle == &kqswnal_data.kqn_nblk_idletxds) { + if (ktx->ktx_isnblk) { + /* reserved for non-blocking tx */ + list_add (&ktx->ktx_list, &kqswnal_data.kqn_nblk_idletxds); spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); return; } + list_add (&ktx->ktx_list, &kqswnal_data.kqn_idletxds); + /* anything blocking for a tx descriptor? */ if (!list_empty(&kqswnal_data.kqn_idletxd_fwdq)) /* forwarded packet? */ { @@ -351,7 +353,6 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) if (!list_empty (&kqswnal_data.kqn_idletxds)) { ktx = list_entry (kqswnal_data.kqn_idletxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); break; } @@ -373,7 +374,6 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) ktx = list_entry (kqswnal_data.kqn_nblk_idletxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); break; } @@ -386,6 +386,12 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) !list_empty (&kqswnal_data.kqn_idletxds)); } + if (ktx != NULL) { + list_del (&ktx->ktx_list); + list_add (&ktx->ktx_list, &kqswnal_data.kqn_activetxds); + ktx->ktx_launcher = current->pid; + } + spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); /* Idle descs can't have any mapped (as opposed to pre-mapped) pages */ @@ -490,7 +496,7 @@ kqswnal_launch (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); - list_add_tail (&ktx->ktx_list, &kqswnal_data.kqn_delayedtxds); + list_add_tail (&ktx->ktx_delayed_list, &kqswnal_data.kqn_delayedtxds); if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) wake_up (&kqswnal_data.kqn_sched_waitq); @@ -737,8 +743,7 @@ kqswnal_sendmsg (nal_cb_t *nal, if (payload_nob > KQSW_MAXPAYLOAD) { CERROR ("request exceeds MTU size "LPSZ" (max %u).\n", payload_nob, KQSW_MAXPAYLOAD); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } targetnid = nid; @@ -747,13 +752,11 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc != 0) { CERROR("Can't route to "LPX64": router error %d\n", nid, rc); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } if (kqswnal_nid2elanid (targetnid) < 0) { CERROR("Bad gateway "LPX64" for "LPX64"\n", targetnid, nid); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } } @@ -765,7 +768,6 @@ kqswnal_sendmsg (nal_cb_t *nal, in_interrupt())); if (ktx == NULL) { kqswnal_cerror_hdr (hdr); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_NOSPACE); } @@ -784,12 +786,12 @@ kqswnal_sendmsg (nal_cb_t *nal, CERROR ("Can't DMA reply to "LPX64": %d\n", nid, rc); kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } #endif memcpy (ktx->ktx_buffer, hdr, sizeof (*hdr)); /* copy hdr from caller's stack */ + ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; #if KQSW_CHECKSUM csum = kqsw_csum (0, (char *)hdr, sizeof (*hdr)); @@ -848,8 +850,7 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc < 0) { kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } rmd->kqrmd_neiov = ktx->ktx_nfrag - 1; @@ -859,9 +860,8 @@ kqswnal_sendmsg (nal_cb_t *nal, ktx->ktx_nfrag = 1; ktx->ktx_frags.iov[0].Len += offsetof (kqswnal_remotemd_t, kqrmd_eiov[rmd->kqrmd_neiov]); + payload_nob = ktx->ktx_frags.iov[0].Len; ktx->ktx_state = KTX_GETTING; - payload_nob = rc; - } else #endif if (payload_nob > 0) { /* got some payload (something more to do) */ @@ -885,7 +885,6 @@ kqswnal_sendmsg (nal_cb_t *nal, payload_niov, payload_iov); if (rc != 0) { kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } } @@ -899,7 +898,6 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc != 0) { /* failed? */ CERROR ("Failed to send packet to "LPX64": %d\n", targetnid, rc); kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } @@ -990,6 +988,7 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) ktx->ktx_frags.iov[0].Base = ktx->ktx_ebuffer; /* already mapped */ ktx->ktx_frags.iov[0].Len = nob; ktx->ktx_nfrag = 1; + ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; } else { @@ -998,6 +997,8 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) rc = kqswnal_map_tx_iov (ktx, nob, niov, iov); if (rc != 0) goto failed; + + ktx->ktx_wire_hdr = (ptl_hdr_t *)iov[0].iov_base; } ktx->ktx_port = (nob <= (sizeof (ptl_hdr_t) + KQSW_SMALLPAYLOAD)) ? @@ -1477,7 +1478,7 @@ kqswnal_scheduler (void *arg) { ktx = list_entry(kqswnal_data.kqn_delayedtxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); + list_del_init (&ktx->ktx_delayed_list); spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock, flags); diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index 6a9030c..d8bffab 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -848,6 +848,46 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } +int +jt_ptl_print_active_txs (int argc, char **argv) +{ + struct portal_ioctl_data data; + int index; + int rc; + + if (!g_nal_is_compatible (argv[0], QSWNAL, 0)) + return -1; + + for (index = 0;;index++) { + PORTAL_IOC_INIT (data); + data.ioc_nal = g_nal; + data.ioc_nal_cmd = NAL_CMD_GET_TXDESC; + data.ioc_count = index; + + rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + if (rc != 0) + break; + + printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n", + data.ioc_pbuf1, + data.ioc_count == PTL_MSG_ACK ? "ACK" : + data.ioc_count == PTL_MSG_PUT ? "PUT" : + data.ioc_count == PTL_MSG_GET ? "GET" : + data.ioc_count == PTL_MSG_REPLY ? "REPLY" : "", + data.ioc_size, + data.ioc_nid, + data.ioc_nid2, + data.ioc_misc, + (data.ioc_flags & 1) ? "delayed" : "immediate", + (data.ioc_flags & 2) ? "nblk" : "normal", + data.ioc_flags >> 2); + } + + if (index == 0) + printf ("\n"); + return 0; +} + int jt_ptl_ping(int argc, char **argv) { int rc; diff --git a/lnet/utils/ptlctl.c b/lnet/utils/ptlctl.c index 50d9c87..c083e48 100644 --- a/lnet/utils/ptlctl.c +++ b/lnet/utils/ptlctl.c @@ -37,6 +37,7 @@ command_t list[] = { {"connect", jt_ptl_connect, 0, "connect to a remote nid (args: host port [xi])"}, {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid (args: [nid] [host]"}, {"push", jt_ptl_push_connection, 0, "flush connection to a remote nid (args: [nid]"}, + {"active_tx", jt_ptl_print_active_txs, 0, "print active transmits (no args)"}, {"ping", jt_ptl_ping, 0, "do a ping test (args: nid [count] [size] [timeout])"}, {"shownid", jt_ptl_shownid, 0, "print the local NID"}, {"mynid", jt_ptl_mynid, 0, "inform the socknal of the local NID (args: [hostname])"}, diff --git a/lustre/portals/include/linux/kp30.h b/lustre/portals/include/linux/kp30.h index 85fe8e7..750d16c 100644 --- a/lustre/portals/include/linux/kp30.h +++ b/lustre/portals/include/linux/kp30.h @@ -887,6 +887,7 @@ extern ptl_handle_ni_t kscimacnal_ni; #define NAL_CMD_DEL_AUTOCONN 105 #define NAL_CMD_ADD_AUTOCONN 106 #define NAL_CMD_GET_AUTOCONN 107 +#define NAL_CMD_GET_TXDESC 108 enum { DEBUG_DAEMON_START = 1, diff --git a/lustre/portals/include/portals/ptlctl.h b/lustre/portals/include/portals/ptlctl.h index ffe7e5b..8278111 100644 --- a/lustre/portals/include/portals/ptlctl.h +++ b/lustre/portals/include/portals/ptlctl.h @@ -41,6 +41,7 @@ int jt_ptl_print_connections (int argc, char **argv); int jt_ptl_connect(int argc, char **argv); int jt_ptl_disconnect(int argc, char **argv); int jt_ptl_push_connection(int argc, char **argv); +int jt_ptl_print_active_txs(int argc, char **argv); int jt_ptl_ping(int argc, char **argv); int jt_ptl_shownid(int argc, char **argv); int jt_ptl_mynid(int argc, char **argv); diff --git a/lustre/portals/knals/qswnal/qswnal.c b/lustre/portals/knals/qswnal/qswnal.c index 7cfc80e..d4ee960 100644 --- a/lustre/portals/knals/qswnal/qswnal.c +++ b/lustre/portals/knals/qswnal/qswnal.c @@ -112,11 +112,48 @@ kqswnal_init(int interface, ptl_pt_index_t ptl_size, ptl_ac_index_t ac_size, } int +kqswnal_get_tx_desc (struct portal_ioctl_data *data) +{ + unsigned long flags; + struct list_head *tmp; + kqswnal_tx_t *ktx; + int index = data->ioc_count; + int rc = -ENOENT; + + spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags); + + list_for_each (tmp, &kqswnal_data.kqn_activetxds) { + if (index-- != 0) + continue; + + ktx = list_entry (tmp, kqswnal_tx_t, ktx_list); + + data->ioc_pbuf1 = (char *)ktx; + data->ioc_count = NTOH__u32(ktx->ktx_wire_hdr->type); + data->ioc_size = NTOH__u32(PTL_HDR_LENGTH(ktx->ktx_wire_hdr)); + data->ioc_nid = NTOH__u64(ktx->ktx_wire_hdr->dest_nid); + data->ioc_nid2 = ktx->ktx_nid; + data->ioc_misc = ktx->ktx_launcher; + data->ioc_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) | + (!ktx->ktx_isnblk ? 0 : 2) | + (ktx->ktx_state << 2); + rc = 0; + break; + } + + spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); + return (rc); +} + +int kqswnal_cmd (struct portal_ioctl_data *data, void *private) { LASSERT (data != NULL); switch (data->ioc_nal_cmd) { + case NAL_CMD_GET_TXDESC: + return (kqswnal_get_tx_desc (data)); + case NAL_CMD_REGISTER_MYNID: CDEBUG (D_IOCTL, "setting NID offset to "LPX64" (was "LPX64")\n", data->ioc_nid - kqswnal_data.kqn_elanid, @@ -149,6 +186,7 @@ kqswnal_finalise (void) /* fall through */ case KQN_INIT_DATA: + LASSERT(list_empty(&kqswnal_data.kqn_activetxds)); break; case KQN_INIT_NOTHING: @@ -318,6 +356,7 @@ kqswnal_initialise (void) INIT_LIST_HEAD (&kqswnal_data.kqn_idletxds); INIT_LIST_HEAD (&kqswnal_data.kqn_nblk_idletxds); + INIT_LIST_HEAD (&kqswnal_data.kqn_activetxds); spin_lock_init (&kqswnal_data.kqn_idletxd_lock); init_waitqueue_head (&kqswnal_data.kqn_idletxd_waitq); INIT_LIST_HEAD (&kqswnal_data.kqn_idletxd_fwdq); @@ -460,12 +499,13 @@ kqswnal_initialise (void) ktx->ktx_basepage = basepage + premapped_pages; /* message mapping starts here */ ktx->ktx_npages = KQSW_NTXMSGPAGES - premapped_pages; /* for this many pages */ - if (i < KQSW_NTXMSGS) - ktx->ktx_idle = &kqswnal_data.kqn_idletxds; - else - ktx->ktx_idle = &kqswnal_data.kqn_nblk_idletxds; + INIT_LIST_HEAD (&ktx->ktx_delayed_list); - list_add_tail (&ktx->ktx_list, ktx->ktx_idle); + ktx->ktx_state = KTX_IDLE; + ktx->ktx_isnblk = (i >= KQSW_NTXMSGS); + list_add_tail (&ktx->ktx_list, + ktx->ktx_isnblk ? &kqswnal_data.kqn_nblk_idletxds : + &kqswnal_data.kqn_idletxds); } /**********************************************************************/ diff --git a/lustre/portals/knals/qswnal/qswnal.h b/lustre/portals/knals/qswnal/qswnal.h index 5cbbb9a..a27239c 100644 --- a/lustre/portals/knals/qswnal/qswnal.h +++ b/lustre/portals/knals/qswnal/qswnal.h @@ -77,20 +77,20 @@ #define KQSW_OPTIMIZE_GETS 1 -#define KQSW_CHECKSUM 0 +#define KQSW_CHECKSUM 0 #if KQSW_CHECKSUM typedef unsigned long kqsw_csum_t; -#define KQSW_CSUM_SIZE (2 * sizeof (kqsw_csum_t)) +#define KQSW_CSUM_SIZE (2 * sizeof (kqsw_csum_t)) #else -#define KQSW_CSUM_SIZE 0 +#define KQSW_CSUM_SIZE 0 #endif -#define KQSW_HDR_SIZE (sizeof (ptl_hdr_t) + KQSW_CSUM_SIZE) +#define KQSW_HDR_SIZE (sizeof (ptl_hdr_t) + KQSW_CSUM_SIZE) /* * Elan NAL */ -#define EP_SVC_LARGE_PORTALS_SMALL (0x10) /* Portals over elan port number (large payloads) */ -#define EP_SVC_LARGE_PORTALS_LARGE (0x11) /* Portals over elan port number (small payloads) */ +#define EP_SVC_LARGE_PORTALS_SMALL (0x10) /* Portals over elan port number (large payloads) */ +#define EP_SVC_LARGE_PORTALS_LARGE (0x11) /* Portals over elan port number (small payloads) */ /* NB small/large message sizes are GLOBAL constants */ /* @@ -98,39 +98,39 @@ typedef unsigned long kqsw_csum_t; * NB no mention of PAGE_SIZE for interoperability */ #define KQSW_MAXPAYLOAD PTL_MTU -#define KQSW_SMALLPAYLOAD ((4<<10) - KQSW_HDR_SIZE) /* small/large ep receiver breakpoint */ +#define KQSW_SMALLPAYLOAD ((4<<10) - KQSW_HDR_SIZE) /* small/large ep receiver breakpoint */ -#define KQSW_TX_MAXCONTIG (1<<10) /* largest payload that gets made contiguous on transmit */ +#define KQSW_TX_MAXCONTIG (1<<10) /* largest payload that gets made contiguous on transmit */ -#define KQSW_NTXMSGS 8 /* # normal transmit messages */ -#define KQSW_NNBLK_TXMSGS 256 /* # reserved transmit messages if can't block */ +#define KQSW_NTXMSGS 8 /* # normal transmit messages */ +#define KQSW_NNBLK_TXMSGS 256 /* # reserved transmit messages if can't block */ -#define KQSW_NRXMSGS_LARGE 64 /* # large receive buffers */ -#define KQSW_EP_ENVELOPES_LARGE 128 /* # large ep envelopes */ +#define KQSW_NRXMSGS_LARGE 64 /* # large receive buffers */ +#define KQSW_EP_ENVELOPES_LARGE 128 /* # large ep envelopes */ -#define KQSW_NRXMSGS_SMALL 256 /* # small receive buffers */ -#define KQSW_EP_ENVELOPES_SMALL 2048 /* # small ep envelopes */ +#define KQSW_NRXMSGS_SMALL 256 /* # small receive buffers */ +#define KQSW_EP_ENVELOPES_SMALL 2048 /* # small ep envelopes */ -#define KQSW_RESCHED 100 /* # busy loops that forces scheduler to yield */ +#define KQSW_RESCHED 100 /* # busy loops that forces scheduler to yield */ /* * derived constants */ -#define KQSW_TX_BUFFER_SIZE (KQSW_HDR_SIZE + KQSW_TX_MAXCONTIG) +#define KQSW_TX_BUFFER_SIZE (KQSW_HDR_SIZE + KQSW_TX_MAXCONTIG) /* The pre-allocated tx buffer (hdr + small payload) */ -#define KQSW_NTXMSGPAGES (btopr(KQSW_TX_BUFFER_SIZE) + 1 + btopr(KQSW_MAXPAYLOAD) + 1) +#define KQSW_NTXMSGPAGES (btopr(KQSW_TX_BUFFER_SIZE) + 1 + btopr(KQSW_MAXPAYLOAD) + 1) /* Reserve elan address space for pre-allocated and pre-mapped transmit * buffer and a full payload too. Extra pages allow for page alignment */ -#define KQSW_NRXMSGPAGES_SMALL (btopr(KQSW_HDR_SIZE + KQSW_SMALLPAYLOAD)) +#define KQSW_NRXMSGPAGES_SMALL (btopr(KQSW_HDR_SIZE + KQSW_SMALLPAYLOAD)) /* receive hdr/payload always contiguous and page aligned */ -#define KQSW_NRXMSGBYTES_SMALL (KQSW_NRXMSGPAGES_SMALL * PAGE_SIZE) +#define KQSW_NRXMSGBYTES_SMALL (KQSW_NRXMSGPAGES_SMALL * PAGE_SIZE) -#define KQSW_NRXMSGPAGES_LARGE (btopr(KQSW_HDR_SIZE + KQSW_MAXPAYLOAD)) +#define KQSW_NRXMSGPAGES_LARGE (btopr(KQSW_HDR_SIZE + KQSW_MAXPAYLOAD)) /* receive hdr/payload always contiguous and page aligned */ -#define KQSW_NRXMSGBYTES_LARGE (KQSW_NRXMSGPAGES_LARGE * PAGE_SIZE) +#define KQSW_NRXMSGBYTES_LARGE (KQSW_NRXMSGPAGES_LARGE * PAGE_SIZE) /* biggest complete packet we can receive (or transmit) */ /* Remote memory descriptor */ @@ -143,7 +143,7 @@ typedef struct typedef struct { struct list_head krx_list; /* enqueue -> thread */ - EP_RCVR *krx_eprx; /* port to post receives to */ + EP_RCVR *krx_eprx; /* port to post receives to */ EP_RXD *krx_rxd; /* receive descriptor (for repost) */ E3_Addr krx_elanaddr; /* Elan address of buffer (contiguous in elan vm) */ int krx_npages; /* # pages in receive buffer */ @@ -157,17 +157,23 @@ typedef struct typedef struct { - struct list_head ktx_list; /* enqueue idle/delayed */ - struct list_head *ktx_idle; /* where to put when idle */ - char ktx_state; /* What I'm doing */ + struct list_head ktx_list; /* enqueue idle/active */ + struct list_head ktx_delayed_list; /* enqueue delayedtxds */ + int ktx_isnblk:1; /* reserved descriptor? */ + int ktx_state:7; /* What I'm doing */ uint32_t ktx_basepage; /* page offset in reserved elan tx vaddrs for mapping pages */ int ktx_npages; /* pages reserved for mapping messages */ int ktx_nmappedpages; /* # pages mapped for current message */ int ktx_port; /* destination ep port */ ptl_nid_t ktx_nid; /* destination node */ void *ktx_args[2]; /* completion passthru */ - E3_Addr ktx_ebuffer; /* elan address of ktx_buffer */ + E3_Addr ktx_ebuffer; /* elan address of ktx_buffer */ char *ktx_buffer; /* pre-allocated contiguous buffer for hdr + small payloads */ + + /* debug/info fields */ + pid_t ktx_launcher; /* pid of launching process */ + ptl_hdr_t *ktx_wire_hdr; /* portals header (wire endian) */ + int ktx_nfrag; /* # message frags */ union { EP_IOVEC iov[EP_MAXFRAG]; /* msg frags (elan vaddrs) */ @@ -175,9 +181,9 @@ typedef struct } ktx_frags; } kqswnal_tx_t; -#define KTX_IDLE 0 /* MUST BE ZERO (so zeroed ktx is idle) */ -#define KTX_SENDING 1 /* local send */ -#define KTX_FORWARDING 2 /* routing a packet */ +#define KTX_IDLE 0 /* on kqn_(nblk_)idletxds */ +#define KTX_SENDING 1 /* local send */ +#define KTX_FORWARDING 2 /* routing a packet */ #define KTX_GETTING 3 /* local optimised get */ typedef struct @@ -190,7 +196,8 @@ typedef struct kqswnal_tx_t *kqn_txds; /* all the transmit descriptors */ struct list_head kqn_idletxds; /* transmit descriptors free to use */ - struct list_head kqn_nblk_idletxds; /* reserve of */ + struct list_head kqn_nblk_idletxds; /* reserved free transmit descriptors */ + struct list_head kqn_activetxds; /* transmit descriptors being used */ spinlock_t kqn_idletxd_lock; /* serialise idle txd access */ wait_queue_head_t kqn_idletxd_waitq; /* sender blocks here waiting for idle txd */ struct list_head kqn_idletxd_fwdq; /* forwarded packets block here waiting for idle txd */ @@ -204,12 +211,12 @@ typedef struct spinlock_t kqn_statelock; /* cb_cli/cb_sti */ nal_cb_t *kqn_cb; /* -> kqswnal_lib */ - EP_DEV *kqn_epdev; /* elan device */ - EP_XMTR *kqn_eptx; /* elan transmitter */ - EP_RCVR *kqn_eprx_small; /* elan receiver (small messages) */ - EP_RCVR *kqn_eprx_large; /* elan receiver (large messages) */ - ELAN3_DMA_HANDLE *kqn_eptxdmahandle; /* elan reserved tx vaddrs */ - ELAN3_DMA_HANDLE *kqn_eprxdmahandle; /* elan reserved rx vaddrs */ + EP_DEV *kqn_epdev; /* elan device */ + EP_XMTR *kqn_eptx; /* elan transmitter */ + EP_RCVR *kqn_eprx_small; /* elan receiver (small messages) */ + EP_RCVR *kqn_eprx_large; /* elan receiver (large messages) */ + ELAN3_DMA_HANDLE *kqn_eptxdmahandle; /* elan reserved tx vaddrs */ + ELAN3_DMA_HANDLE *kqn_eprxdmahandle; /* elan reserved rx vaddrs */ kpr_router_t kqn_router; /* connection to Kernel Portals Router module */ ptl_nid_t kqn_nid_offset; /* this cluster's NID offset */ @@ -218,10 +225,10 @@ typedef struct } kqswnal_data_t; /* kqn_init state */ -#define KQN_INIT_NOTHING 0 /* MUST BE ZERO so zeroed state is initialised OK */ -#define KQN_INIT_DATA 1 -#define KQN_INIT_PTL 2 -#define KQN_INIT_ALL 3 +#define KQN_INIT_NOTHING 0 /* MUST BE ZERO so zeroed state is initialised OK */ +#define KQN_INIT_DATA 1 +#define KQN_INIT_PTL 2 +#define KQN_INIT_ALL 3 extern nal_cb_t kqswnal_lib; extern nal_t kqswnal_api; diff --git a/lustre/portals/knals/qswnal/qswnal_cb.c b/lustre/portals/knals/qswnal/qswnal_cb.c index 66529bd..dfc479d 100644 --- a/lustre/portals/knals/qswnal/qswnal_cb.c +++ b/lustre/portals/knals/qswnal/qswnal_cb.c @@ -290,22 +290,24 @@ void kqswnal_put_idle_tx (kqswnal_tx_t *ktx) { kpr_fwd_desc_t *fwd = NULL; - struct list_head *idle = ktx->ktx_idle; unsigned long flags; - kqswnal_unmap_tx (ktx); /* release temporary mappings */ + kqswnal_unmap_tx (ktx); /* release temporary mappings */ ktx->ktx_state = KTX_IDLE; spin_lock_irqsave (&kqswnal_data.kqn_idletxd_lock, flags); - list_add (&ktx->ktx_list, idle); + list_del (&ktx->ktx_list); /* take off active list */ - /* reserved for non-blocking tx */ - if (idle == &kqswnal_data.kqn_nblk_idletxds) { + if (ktx->ktx_isnblk) { + /* reserved for non-blocking tx */ + list_add (&ktx->ktx_list, &kqswnal_data.kqn_nblk_idletxds); spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); return; } + list_add (&ktx->ktx_list, &kqswnal_data.kqn_idletxds); + /* anything blocking for a tx descriptor? */ if (!list_empty(&kqswnal_data.kqn_idletxd_fwdq)) /* forwarded packet? */ { @@ -351,7 +353,6 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) if (!list_empty (&kqswnal_data.kqn_idletxds)) { ktx = list_entry (kqswnal_data.kqn_idletxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); break; } @@ -373,7 +374,6 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) ktx = list_entry (kqswnal_data.kqn_nblk_idletxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); break; } @@ -386,6 +386,12 @@ kqswnal_get_idle_tx (kpr_fwd_desc_t *fwd, int may_block) !list_empty (&kqswnal_data.kqn_idletxds)); } + if (ktx != NULL) { + list_del (&ktx->ktx_list); + list_add (&ktx->ktx_list, &kqswnal_data.kqn_activetxds); + ktx->ktx_launcher = current->pid; + } + spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); /* Idle descs can't have any mapped (as opposed to pre-mapped) pages */ @@ -490,7 +496,7 @@ kqswnal_launch (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); - list_add_tail (&ktx->ktx_list, &kqswnal_data.kqn_delayedtxds); + list_add_tail (&ktx->ktx_delayed_list, &kqswnal_data.kqn_delayedtxds); if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) wake_up (&kqswnal_data.kqn_sched_waitq); @@ -737,8 +743,7 @@ kqswnal_sendmsg (nal_cb_t *nal, if (payload_nob > KQSW_MAXPAYLOAD) { CERROR ("request exceeds MTU size "LPSZ" (max %u).\n", payload_nob, KQSW_MAXPAYLOAD); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } targetnid = nid; @@ -747,13 +752,11 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc != 0) { CERROR("Can't route to "LPX64": router error %d\n", nid, rc); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } if (kqswnal_nid2elanid (targetnid) < 0) { CERROR("Bad gateway "LPX64" for "LPX64"\n", targetnid, nid); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } } @@ -765,7 +768,6 @@ kqswnal_sendmsg (nal_cb_t *nal, in_interrupt())); if (ktx == NULL) { kqswnal_cerror_hdr (hdr); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_NOSPACE); } @@ -784,12 +786,12 @@ kqswnal_sendmsg (nal_cb_t *nal, CERROR ("Can't DMA reply to "LPX64": %d\n", nid, rc); kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } #endif memcpy (ktx->ktx_buffer, hdr, sizeof (*hdr)); /* copy hdr from caller's stack */ + ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; #if KQSW_CHECKSUM csum = kqsw_csum (0, (char *)hdr, sizeof (*hdr)); @@ -848,8 +850,7 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc < 0) { kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); - return (-1); + return (PTL_FAIL); } rmd->kqrmd_neiov = ktx->ktx_nfrag - 1; @@ -859,9 +860,8 @@ kqswnal_sendmsg (nal_cb_t *nal, ktx->ktx_nfrag = 1; ktx->ktx_frags.iov[0].Len += offsetof (kqswnal_remotemd_t, kqrmd_eiov[rmd->kqrmd_neiov]); + payload_nob = ktx->ktx_frags.iov[0].Len; ktx->ktx_state = KTX_GETTING; - payload_nob = rc; - } else #endif if (payload_nob > 0) { /* got some payload (something more to do) */ @@ -885,7 +885,6 @@ kqswnal_sendmsg (nal_cb_t *nal, payload_niov, payload_iov); if (rc != 0) { kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } } @@ -899,7 +898,6 @@ kqswnal_sendmsg (nal_cb_t *nal, if (rc != 0) { /* failed? */ CERROR ("Failed to send packet to "LPX64": %d\n", targetnid, rc); kqswnal_put_idle_tx (ktx); - lib_finalize (&kqswnal_lib, private, libmsg); return (PTL_FAIL); } @@ -990,6 +988,7 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) ktx->ktx_frags.iov[0].Base = ktx->ktx_ebuffer; /* already mapped */ ktx->ktx_frags.iov[0].Len = nob; ktx->ktx_nfrag = 1; + ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; } else { @@ -998,6 +997,8 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) rc = kqswnal_map_tx_iov (ktx, nob, niov, iov); if (rc != 0) goto failed; + + ktx->ktx_wire_hdr = (ptl_hdr_t *)iov[0].iov_base; } ktx->ktx_port = (nob <= (sizeof (ptl_hdr_t) + KQSW_SMALLPAYLOAD)) ? @@ -1477,7 +1478,7 @@ kqswnal_scheduler (void *arg) { ktx = list_entry(kqswnal_data.kqn_delayedtxds.next, kqswnal_tx_t, ktx_list); - list_del (&ktx->ktx_list); + list_del_init (&ktx->ktx_delayed_list); spin_unlock_irqrestore(&kqswnal_data.kqn_sched_lock, flags); diff --git a/lustre/portals/utils/portals.c b/lustre/portals/utils/portals.c index 6a9030c..d8bffab 100644 --- a/lustre/portals/utils/portals.c +++ b/lustre/portals/utils/portals.c @@ -848,6 +848,46 @@ int jt_ptl_push_connection (int argc, char **argv) return 0; } +int +jt_ptl_print_active_txs (int argc, char **argv) +{ + struct portal_ioctl_data data; + int index; + int rc; + + if (!g_nal_is_compatible (argv[0], QSWNAL, 0)) + return -1; + + for (index = 0;;index++) { + PORTAL_IOC_INIT (data); + data.ioc_nal = g_nal; + data.ioc_nal_cmd = NAL_CMD_GET_TXDESC; + data.ioc_count = index; + + rc = l_ioctl (PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data); + if (rc != 0) + break; + + printf ("%p: %5s payload %6d bytes to "LPX64" via "LPX64" by pid %6d: %s, %s, state %d\n", + data.ioc_pbuf1, + data.ioc_count == PTL_MSG_ACK ? "ACK" : + data.ioc_count == PTL_MSG_PUT ? "PUT" : + data.ioc_count == PTL_MSG_GET ? "GET" : + data.ioc_count == PTL_MSG_REPLY ? "REPLY" : "", + data.ioc_size, + data.ioc_nid, + data.ioc_nid2, + data.ioc_misc, + (data.ioc_flags & 1) ? "delayed" : "immediate", + (data.ioc_flags & 2) ? "nblk" : "normal", + data.ioc_flags >> 2); + } + + if (index == 0) + printf ("\n"); + return 0; +} + int jt_ptl_ping(int argc, char **argv) { int rc; diff --git a/lustre/portals/utils/ptlctl.c b/lustre/portals/utils/ptlctl.c index 50d9c87..c083e48 100644 --- a/lustre/portals/utils/ptlctl.c +++ b/lustre/portals/utils/ptlctl.c @@ -37,6 +37,7 @@ command_t list[] = { {"connect", jt_ptl_connect, 0, "connect to a remote nid (args: host port [xi])"}, {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid (args: [nid] [host]"}, {"push", jt_ptl_push_connection, 0, "flush connection to a remote nid (args: [nid]"}, + {"active_tx", jt_ptl_print_active_txs, 0, "print active transmits (no args)"}, {"ping", jt_ptl_ping, 0, "do a ping test (args: nid [count] [size] [timeout])"}, {"shownid", jt_ptl_shownid, 0, "print the local NID"}, {"mynid", jt_ptl_mynid, 0, "inform the socknal of the local NID (args: [hostname])"},