From a574930f21b2e6f57fa69f3b87e004ac85977581 Mon Sep 17 00:00:00 2001 From: eeb Date: Wed, 8 Jun 2005 19:04:22 +0000 Subject: [PATCH] * noticed difference between userspace and kernel x86_64 __u64 etc typdefs and adjusted LPU64 etc in appropriately * libcfs_pause() -> inline cfs_pause() in and made more use of it * cleaned up NAL loading/instantiated console messages * fixed reconnect_interval in connection NALs, where I'd left out * HZ * made ???_npeers atomic again; using ???_global lock round the decrement in ???_destroy_peer() could deadlock. * fixed uninitialised list in vib:kibnal_peer_connect_failed() * changed to "nicer" format for /proc/sys/portals/routes * more x86_64 testing --- lnet/include/libcfs/libcfs.h | 2 -- lnet/include/libcfs/linux/kp30.h | 2 +- lnet/include/libcfs/linux/linux-prim.h | 8 +++++++ lnet/klnds/iiblnd/iiblnd.c | 6 ----- lnet/klnds/iiblnd/iiblnd_cb.c | 3 ++- lnet/klnds/openiblnd/openiblnd.c | 35 ++++++++++------------------- lnet/klnds/openiblnd/openiblnd.h | 2 +- lnet/klnds/openiblnd/openiblnd_cb.c | 3 ++- lnet/klnds/qswlnd/qswlnd.c | 17 +++------------ lnet/klnds/ralnd/ralnd.c | 36 ++++++++++-------------------- lnet/klnds/ralnd/ralnd.h | 2 +- lnet/klnds/socklnd/socklnd.c | 18 +++++---------- lnet/klnds/socklnd/socklnd_cb.c | 8 +++---- lnet/klnds/socklnd/socklnd_lib-linux.c | 4 ++-- lnet/klnds/viblnd/viblnd.c | 40 +++++++++------------------------- lnet/klnds/viblnd/viblnd.h | 2 +- lnet/klnds/viblnd/viblnd_cb.c | 13 ++++++----- lnet/libcfs/linux/linux-tcpip.c | 9 -------- lnet/lnet/api-ni.c | 22 +++++++++++++++---- lnet/lnet/module.c | 2 -- lnet/lnet/router_proc.c | 7 +++--- 21 files changed, 91 insertions(+), 150 deletions(-) diff --git a/lnet/include/libcfs/libcfs.h b/lnet/include/libcfs/libcfs.h index 88c9aca..b7e187b 100644 --- a/lnet/include/libcfs/libcfs.h +++ b/lnet/include/libcfs/libcfs.h @@ -291,8 +291,6 @@ int libcfs_sock_write(struct socket *sock, void *buffer, int nob, int timeout); int libcfs_sock_read(struct socket *sock, void *buffer, int nob, int timeout); void libcfs_sock_release(struct socket *sock); -void libcfs_pause(cfs_duration_t ticks); - /* libcfs watchdogs */ struct lc_watchdog; diff --git a/lnet/include/libcfs/linux/kp30.h b/lnet/include/libcfs/linux/kp30.h index e0b3e60..b92b83b 100644 --- a/lnet/include/libcfs/linux/kp30.h +++ b/lnet/include/libcfs/linux/kp30.h @@ -310,7 +310,7 @@ extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, # define LP_POISON ((void *)(long)0x5a5a5a5a) #endif -#if defined(__x86_64__) +#if (defined(__x86_64__) && defined(__KERNEL__)) # define LPU64 "%Lu" # define LPD64 "%Ld" # define LPX64 "%#Lx" diff --git a/lnet/include/libcfs/linux/linux-prim.h b/lnet/include/libcfs/linux/linux-prim.h index 69bda36..0d080d9 100644 --- a/lnet/include/libcfs/linux/linux-prim.h +++ b/lnet/include/libcfs/linux/linux-prim.h @@ -164,6 +164,14 @@ static inline cfs_time_t cfs_timer_deadline(cfs_timer_t *t) return t->expires; } + +/* deschedule for a bit... */ +static inline void cfs_pause(cfs_duration_t ticks) +{ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(ticks); +} + #else /* !__KERNEL__ */ #include "../user-prim.h" diff --git a/lnet/klnds/iiblnd/iiblnd.c b/lnet/klnds/iiblnd/iiblnd.c index 221cb08..41d78ba 100644 --- a/lnet/klnds/iiblnd/iiblnd.c +++ b/lnet/klnds/iiblnd/iiblnd.c @@ -1271,8 +1271,6 @@ kibnal_shutdown (ptl_ni_t *ni) CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read (&portal_kmemory)); - printk(KERN_INFO "Lustre: Infinicon IB NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; PORTAL_MODULE_UNUSE; @@ -1300,7 +1298,6 @@ static __u64 max_phys_mem(IB_CA_ATTRIBUTES *ca_attr) ptl_err_t kibnal_startup (ptl_ni_t *ni) { - int pkmem = atomic_read(&portal_kmemory); IB_PORT_ATTRIBUTES *pattr; FSTATUS frc; int rc; @@ -1610,9 +1607,6 @@ kibnal_startup (ptl_ni_t *ni) kibnal_data.kib_init = IBNAL_INIT_ALL; /*****************************************************/ - printk(KERN_INFO "Lustre: Infinicon IB NAL loaded " - "(initial mem %d)\n", pkmem); - return (PTL_OK); failed: diff --git a/lnet/klnds/iiblnd/iiblnd_cb.c b/lnet/klnds/iiblnd/iiblnd_cb.c index 4c4d395..c97ba3c 100644 --- a/lnet/klnds/iiblnd/iiblnd_cb.c +++ b/lnet/klnds/iiblnd/iiblnd_cb.c @@ -1827,7 +1827,8 @@ kibnal_peer_connect_failed (kib_peer_t *peer, int active, int rc) MIN(peer->ibp_reconnect_interval, *kibnal_tunables.kib_max_reconnect_interval); - peer->ibp_reconnect_time += peer->ibp_reconnect_interval; + peer->ibp_reconnect_time = jiffies + + peer->ibp_reconnect_interval * HZ; /* Take peer's blocked blocked transmits; I'll complete * them with error */ diff --git a/lnet/klnds/openiblnd/openiblnd.c b/lnet/klnds/openiblnd/openiblnd.c index de5aa0c..e24fa69 100644 --- a/lnet/klnds/openiblnd/openiblnd.c +++ b/lnet/klnds/openiblnd/openiblnd.c @@ -445,7 +445,7 @@ kibnal_ip_listener(void *arg) PORTAL_ALLOC(as, sizeof(*as)); if (as == NULL) { CERROR("Out of Memory: pausing...\n"); - libcfs_pause(HZ); + cfs_pause(cfs_time_seconds(1)); continue; } as->ibas_sock = NULL; @@ -456,7 +456,7 @@ kibnal_ip_listener(void *arg) if (rc != 0) { if (rc != -EAGAIN) { CERROR("Accept failed: %d, pausing...\n", rc); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); } continue; } @@ -621,14 +621,15 @@ kibnal_create_peer (kib_peer_t **peerp, ptl_nid_t nid) write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - if (kibnal_data.kib_npeers >= + if (atomic_read(&kibnal_data.kib_npeers) >= *kibnal_tunables.kib_concurrent_peers) { rc = -EOVERFLOW; /* !! but at least it distinguishes */ } else if (kibnal_data.kib_listener_shutdown) { rc = -ESHUTDOWN; /* shutdown has started */ } else { rc = 0; - kibnal_data.kib_npeers++; + /* npeers only grows with kib_global_lock held */ + atomic_inc(&kibnal_data.kib_npeers); } write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); @@ -666,9 +667,7 @@ kibnal_destroy_peer (kib_peer_t *peer) * they are destroyed, so we can be assured that _all_ state to do * with this peer has been cleaned up when its refcount drops to * zero. */ - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - kibnal_data.kib_npeers--; - write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); + atomic_dec(&kibnal_data.kib_npeers); } void @@ -1446,7 +1445,7 @@ kibnal_shutdown (ptl_ni_t *ni) i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* 2**n */ "waiting for conn reqs to clean up\n"); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); spin_lock_irqsave(&kibnal_data.kib_connd_lock, flags); } @@ -1454,19 +1453,13 @@ kibnal_shutdown (ptl_ni_t *ni) /* Wait for all peer state to clean up */ i = 2; - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - while (kibnal_data.kib_npeers != 0) { - write_unlock_irqrestore(&kibnal_data.kib_global_lock, - flags); + while (atomic_read(&kibnal_data.kib_npeers) != 0) { i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "waiting for %d peers to close down\n", - kibnal_data.kib_npeers); - libcfs_pause(cfs_time_seconds(1)); - - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); + atomic_read(&kibnal_data.kib_npeers)); + cfs_pause(cfs_time_seconds(1)); } - write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); /* fall through */ case IBNAL_INIT_CQ: @@ -1494,7 +1487,7 @@ kibnal_shutdown (ptl_ni_t *ni) case IBNAL_INIT_DATA: /* Module refcount only gets to zero when all peers * have been closed so all lists must be empty */ - LASSERT (kibnal_data.kib_npeers == 0); + LASSERT (atomic_read(&kibnal_data.kib_npeers) == 0); LASSERT (kibnal_data.kib_peers != NULL); for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) { LASSERT (list_empty (&kibnal_data.kib_peers[i])); @@ -1537,8 +1530,6 @@ kibnal_shutdown (ptl_ni_t *ni) CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read (&portal_kmemory)); - printk(KERN_INFO "Lustre: OpenIB NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; PORTAL_MODULE_UNUSE; @@ -1548,7 +1539,6 @@ ptl_err_t kibnal_startup (ptl_ni_t *ni) { struct timeval tv; - int pkmem = atomic_read(&portal_kmemory); int rc; int i; @@ -1768,9 +1758,6 @@ kibnal_startup (ptl_ni_t *ni) kibnal_data.kib_init = IBNAL_INIT_ALL; /*****************************************************/ - printk(KERN_INFO "Lustre: OpenIB NAL loaded " - "(initial mem %d)\n", pkmem); - return PTL_OK; failed: diff --git a/lnet/klnds/openiblnd/openiblnd.h b/lnet/klnds/openiblnd/openiblnd.h index 7f23702..ca3b25e 100644 --- a/lnet/klnds/openiblnd/openiblnd.h +++ b/lnet/klnds/openiblnd/openiblnd.h @@ -169,7 +169,7 @@ typedef struct struct list_head *kib_peers; /* hash table of all my known peers */ int kib_peer_hash_size; /* size of kib_peers */ - int kib_npeers; /* # peers extant */ + atomic_t kib_npeers; /* # peers extant */ atomic_t kib_nconns; /* # connections extant */ struct list_head kib_reaper_conns; /* connections to reap */ diff --git a/lnet/klnds/openiblnd/openiblnd_cb.c b/lnet/klnds/openiblnd/openiblnd_cb.c index c514599..af4ab5b 100644 --- a/lnet/klnds/openiblnd/openiblnd_cb.c +++ b/lnet/klnds/openiblnd/openiblnd_cb.c @@ -1556,7 +1556,8 @@ kibnal_peer_connect_failed (kib_peer_t *peer, int rc) MIN(peer->ibp_reconnect_interval, *kibnal_tunables.kib_max_reconnect_interval); - peer->ibp_reconnect_time = jiffies + peer->ibp_reconnect_interval; + peer->ibp_reconnect_time = jiffies + + peer->ibp_reconnect_interval * HZ; /* Take peer's blocked blocked transmits; I'll complete * them with error */ diff --git a/lnet/klnds/qswlnd/qswlnd.c b/lnet/klnds/qswlnd/qswlnd.c index 4cec274..eb1762b 100644 --- a/lnet/klnds/qswlnd/qswlnd.c +++ b/lnet/klnds/qswlnd/qswlnd.c @@ -133,8 +133,7 @@ kqswnal_shutdown(ptl_ni_t *ni) while (atomic_read (&kqswnal_data.kqn_pending_txs) != 0) { CDEBUG(D_NET, "waiting for %d pending sends\n", atomic_read (&kqswnal_data.kqn_pending_txs)); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); + cfs_pause(cfs_time_seconds(1)); } /**********************************************************************/ @@ -170,8 +169,7 @@ kqswnal_shutdown(ptl_ni_t *ni) /* 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); + cfs_pause(cfs_time_seconds(1)); } if (kqswnal_data.kqn_eptx != NULL) @@ -185,8 +183,7 @@ kqswnal_shutdown(ptl_ni_t *ni) while (atomic_read (&kqswnal_data.kqn_nthreads) != 0) { CDEBUG(D_NET, "waiting for %d threads to terminate\n", atomic_read (&kqswnal_data.kqn_nthreads)); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); + cfs_pause(cfs_time_seconds(1)); } /**********************************************************************/ @@ -301,8 +298,6 @@ kqswnal_shutdown(ptl_ni_t *ni) CDEBUG (D_MALLOC, "done kmem %d\n", atomic_read(&portal_kmemory)); - printk (KERN_INFO "Lustre: Routing QSW NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); PORTAL_MODULE_UNUSE; } @@ -319,7 +314,6 @@ kqswnal_startup (ptl_ni_t *ni) kqswnal_rx_t *krx; kqswnal_tx_t *ktx; int elan_page_idx; - int pkmem = atomic_read(&portal_kmemory); LASSERT (ni->ni_nal == &kqswnal_nal); @@ -672,11 +666,6 @@ kqswnal_startup (ptl_ni_t *ni) } kqswnal_data.kqn_init = KQN_INIT_ALL; - - printk(KERN_INFO "Lustre: Routing QSW NAL loaded on node %d of %d " - "(initial mem %d)\n", - kqswnal_data.kqn_elanid, kqswnal_data.kqn_nnodes, pkmem); - return (PTL_OK); } diff --git a/lnet/klnds/ralnd/ralnd.c b/lnet/klnds/ralnd/ralnd.c index fc642ba..1e0672f 100644 --- a/lnet/klnds/ralnd/ralnd.c +++ b/lnet/klnds/ralnd/ralnd.c @@ -831,7 +831,7 @@ kranal_listener (void *arg) PORTAL_ALLOC(ras, sizeof(*ras)); if (ras == NULL) { CERROR("ENOMEM: listener pausing\n"); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); continue; } } @@ -841,7 +841,7 @@ kranal_listener (void *arg) if (rc != 0) { if (rc != -EAGAIN) { CWARN("Accept error: %d, listener pausing\n", rc); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); } continue; } @@ -950,7 +950,7 @@ kranal_create_peer (kra_peer_t **peerp, ptl_nid_t nid) return -ESHUTDOWN; } - kranal_data.kra_npeers++; + atomic_inc(&kranal_data.kra_npeers); write_unlock_irqrestore(&kranal_data.kra_global_lock, flags); @@ -979,9 +979,7 @@ kranal_destroy_peer (kra_peer_t *peer) * they are destroyed, so we can be assured that _all_ state to do * with this peer has been cleaned up when its refcount drops to * zero. */ - write_lock_irqsave(&kranal_data.kra_global_lock, flags); - kranal_data.kra_npeers--; - write_unlock_irqrestore(&kranal_data.kra_global_lock, flags); + atomic_dec(&kranal_data.kra_npeers); } kra_peer_t * @@ -1486,7 +1484,7 @@ kranal_shutdown (ptl_ni_t *ni) i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* 2**n */ "waiting for conn reqs to clean up\n"); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); spin_lock_irqsave(&kranal_data.kra_connd_lock, flags); } @@ -1494,20 +1492,13 @@ kranal_shutdown (ptl_ni_t *ni) /* Wait for all peers to be freed */ i = 2; - write_lock_irqsave(&kranal_data.kra_global_lock, flags); - while (kranal_data.kra_npeers != 0) { - write_unlock_irqrestore(&kranal_data.kra_global_lock, - flags); + while (atomic_read(&kranal_data.kra_npeers) != 0) { i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* 2**n */ "waiting for %d peers to close down\n", - kranal_data.kra_npeers); - libcfs_pause(cfs_time_seconds(1)); - - write_lock_irqsave(&kranal_data.kra_global_lock, - flags); + atomic_read(&kranal_data.kra_npeers)); + cfs_pause(cfs_time_seconds(1)); } - write_unlock_irqrestore(&kranal_data.kra_global_lock, flags); /* fall through */ case RANAL_INIT_DATA: @@ -1519,7 +1510,7 @@ kranal_shutdown (ptl_ni_t *ni) * while there are still active connds, but these will be temporary * since peer creation always fails after the listener has started to * shut down. */ - LASSERT (kranal_data.kra_npeers == 0); + LASSERT (atomic_read(&kranal_data.kra_npeers) == 0); /* Flag threads to terminate */ kranal_data.kra_shutdown = 1; @@ -1548,10 +1539,10 @@ kranal_shutdown (ptl_ni_t *ni) CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "Waiting for %d threads to terminate\n", atomic_read(&kranal_data.kra_nthreads)); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); } - LASSERT (kranal_data.kra_npeers == 0); + LASSERT (atomic_read(&kranal_data.kra_npeers) == 0); if (kranal_data.kra_peers != NULL) { for (i = 0; i < kranal_data.kra_peer_hash_size; i++) LASSERT (list_empty(&kranal_data.kra_peers[i])); @@ -1579,8 +1570,6 @@ kranal_shutdown (ptl_ni_t *ni) CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read(&portal_kmemory)); - printk(KERN_INFO "Lustre: RapidArray NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); kranal_data.kra_init = RANAL_INIT_NOTHING; PORTAL_MODULE_UNUSE; @@ -1733,9 +1722,6 @@ kranal_startup (ptl_ni_t *ni) /*****************************************************/ CDEBUG(D_MALLOC, "initial kmem %d\n", pkmem); - printk(KERN_INFO "Lustre: RapidArray NAL loaded " - "(initial mem %d)\n", pkmem); - return PTL_OK; failed: diff --git a/lnet/klnds/ralnd/ralnd.h b/lnet/klnds/ralnd/ralnd.h index 06ce4c8..28a9d45 100644 --- a/lnet/klnds/ralnd/ralnd.h +++ b/lnet/klnds/ralnd/ralnd.h @@ -147,7 +147,7 @@ typedef struct struct list_head *kra_peers; /* hash table of all my known peers */ int kra_peer_hash_size; /* size of kra_peers */ - int kra_npeers; /* # peers extant */ + atomic_t kra_npeers; /* # peers extant */ struct list_head *kra_conns; /* conns hashed by cqid */ int kra_conn_hash_size; /* size of kra_conns */ diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index f0cfc8c..f28e32d 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -943,7 +943,7 @@ ksocknal_listener (void *arg) PORTAL_ALLOC(cr, sizeof(*cr)); if (cr == NULL) { CWARN("ENOMEM: listener pausing\n"); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); continue; } } @@ -955,7 +955,7 @@ ksocknal_listener (void *arg) if (rc != -EAGAIN) { CWARN("Accept error %d: listener pausing\n", rc); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); } continue; } @@ -2027,7 +2027,7 @@ ksocknal_base_shutdown (void) i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "waiting for connreqs to clean up\n"); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); spin_lock_irqsave(&ksocknal_data.ksnd_connd_lock, flags); } @@ -2077,7 +2077,7 @@ ksocknal_base_shutdown (void) "waiting for %d threads to terminate\n", ksocknal_data.ksnd_nthreads); read_unlock(&ksocknal_data.ksnd_global_lock); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); read_lock(&ksocknal_data.ksnd_global_lock); } read_unlock(&ksocknal_data.ksnd_global_lock); @@ -2091,8 +2091,6 @@ ksocknal_base_shutdown (void) CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read (&portal_kmemory)); - printk(KERN_INFO "Lustre: Routing socket NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); PORTAL_MODULE_UNUSE; } @@ -2115,7 +2113,6 @@ ksocknal_new_incarnation (void) ptl_err_t ksocknal_base_startup (void) { - int pkmem = atomic_read(&portal_kmemory); int rc; int i; int j; @@ -2251,9 +2248,6 @@ ksocknal_base_startup (void) /* flag everything initialised */ ksocknal_data.ksnd_init = SOCKNAL_INIT_ALL; - printk(KERN_INFO - "Lustre: Routing socket NAL loaded (initial mem %d)\n", pkmem); - return PTL_OK; failed: @@ -2288,7 +2282,7 @@ ksocknal_shutdown (ptl_ni_t *ni) CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "waiting for %d peers to disconnect\n", net->ksnn_npeers); - libcfs_pause(cfs_time_seconds(1)); + cfs_pause(cfs_time_seconds(1)); spin_lock_irqsave(&net->ksnn_lock, flags); } @@ -2420,7 +2414,6 @@ ksocknal_startup (ptl_ni_t *ni) ni->ni_nid = PTL_MKNID(PTL_NIDNET(ni->ni_nid), net->ksnn_interfaces[0].ksni_ipaddr); - CDEBUG(D_WARNING, "Set NID to %s\n", libcfs_nid2str(ni->ni_nid)); ksocknal_data.ksnd_nnets++; @@ -2458,6 +2451,7 @@ ksocknal_module_init (void) return rc; ptl_register_nal(&ksocknal_nal); + return 0; } diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index f0f1dc7..21f7007 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -114,8 +114,7 @@ ksocknal_transmit (ksock_conn_t *conn, ksock_tx_t *tx) int bufnob; if (ksocknal_data.ksnd_stall_tx != 0) { - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (cfs_time_seconds(ksocknal_data.ksnd_stall_tx)); + cfs_pause(cfs_time_seconds(ksocknal_data.ksnd_stall_tx)); } LASSERT (tx->tx_resid != 0); @@ -292,8 +291,7 @@ ksocknal_receive (ksock_conn_t *conn) ENTRY; if (ksocknal_data.ksnd_stall_rx != 0) { - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout(cfs_time_seconds (ksocknal_data.ksnd_stall_rx)); + cfs_pause(cfs_time_seconds (ksocknal_data.ksnd_stall_rx)); } rc = ksocknal_connsock_addref(conn); @@ -715,7 +713,7 @@ ksocknal_launch_packet (ptl_ni_t *ni, ksock_tx_t *tx, ptl_nid_t nid) g_lock = &ksocknal_data.ksnd_global_lock; - for (retry = 0;; retry) { + for (retry = 0;; retry = 1) { #if !SOCKNAL_ROUND_ROBIN read_lock (g_lock); peer = ksocknal_find_peer_locked(ni, nid); diff --git a/lnet/klnds/socklnd/socklnd_lib-linux.c b/lnet/klnds/socklnd/socklnd_lib-linux.c index 515cd9ed..a592d51 100644 --- a/lnet/klnds/socklnd/socklnd_lib-linux.c +++ b/lnet/klnds/socklnd/socklnd_lib-linux.c @@ -139,8 +139,8 @@ ksocknal_lib_bind_irq (unsigned int irq) snprintf (cmdline, sizeof (cmdline), "echo %d > /proc/irq/%u/smp_affinity", 1 << cpu, irq); - printk (KERN_INFO "Lustre: Binding irq %u to CPU %d with cmd: %s\n", - irq, cpu, cmdline); + LCONSOLE_INFO("Binding irq %u to CPU %d with cmd: %s\n", + irq, cpu, cmdline); /* FIXME: Find a better method of setting IRQ affinity... */ diff --git a/lnet/klnds/viblnd/viblnd.c b/lnet/klnds/viblnd/viblnd.c index 04eb208..db08f79 100644 --- a/lnet/klnds/viblnd/viblnd.c +++ b/lnet/klnds/viblnd/viblnd.c @@ -443,7 +443,7 @@ kibnal_stop_listener(ptl_ni_t *ni) if (cmrc != cm_stat_success) CERROR ("Error %d stopping listener\n", cmrc); - libcfs_pause(cfs_time_seconds(1)/10); /* ensure no more callbacks */ + cfs_pause(cfs_time_seconds(1)/10); /* ensure no more callbacks */ cmrc = cm_destroy_cep(kibnal_data.kib_listen_handle); if (cmrc != vv_return_ok) @@ -480,14 +480,15 @@ kibnal_create_peer (kib_peer_t **peerp, ptl_nid_t nid) write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - if (kibnal_data.kib_npeers >= + if (atomic_read(&kibnal_data.kib_npeers) >= *kibnal_tunables.kib_concurrent_peers) { rc = -EOVERFLOW; /* !! but at least it distinguishes */ } else if (kibnal_data.kib_listen_handle == NULL) { rc = -ESHUTDOWN; /* shutdown has started */ } else { rc = 0; - kibnal_data.kib_npeers++; + /* npeers only grows with the global lock held */ + atomic_inc(&kibnal_data.kib_npeers); } write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); @@ -507,8 +508,6 @@ kibnal_create_peer (kib_peer_t **peerp, ptl_nid_t nid) void kibnal_destroy_peer (kib_peer_t *peer) { - unsigned long flags; - LASSERT (atomic_read (&peer->ibp_refcount) == 0); LASSERT (peer->ibp_persistence == 0); LASSERT (!kibnal_peer_active(peer)); @@ -518,15 +517,11 @@ kibnal_destroy_peer (kib_peer_t *peer) PORTAL_FREE (peer, sizeof (*peer)); - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - /* NB a peer's connections keep a reference on their peer until * they are destroyed, so we can be assured that _all_ state to do * with this peer has been cleaned up when its refcount drops to * zero. */ - kibnal_data.kib_npeers--; - - write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); + atomic_dec(&kibnal_data.kib_npeers); } kib_peer_t * @@ -1455,7 +1450,6 @@ kibnal_setup_tx_descs (void) void kibnal_shutdown (ptl_ni_t *ni) { - unsigned long flags; int i; vv_return_t vvrc; @@ -1476,20 +1470,13 @@ kibnal_shutdown (ptl_ni_t *ni) /* Wait for all peer state to clean up */ i = 2; - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); - while (kibnal_data.kib_npeers != 0) { - write_unlock_irqrestore(&kibnal_data.kib_global_lock, - flags); + while (atomic_read(&kibnal_data.kib_npeers) != 0) { i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* 2**n? */ "waiting for %d peers to disconnect\n", - kibnal_data.kib_npeers); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (HZ); - - write_lock_irqsave(&kibnal_data.kib_global_lock, flags); + atomic_read(&kibnal_data.kib_npeers)); + cfs_pause(cfs_time_seconds(1)); } - write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); /* fall through */ case IBNAL_INIT_CQ: @@ -1526,7 +1513,7 @@ kibnal_shutdown (ptl_ni_t *ni) /* fall through */ case IBNAL_INIT_DATA: - LASSERT (kibnal_data.kib_npeers == 0); + LASSERT (atomic_read(&kibnal_data.kib_npeers) == 0); LASSERT (kibnal_data.kib_peers != NULL); for (i = 0; i < kibnal_data.kib_peer_hash_size; i++) { LASSERT (list_empty (&kibnal_data.kib_peers[i])); @@ -1550,8 +1537,7 @@ kibnal_shutdown (ptl_ni_t *ni) CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "Waiting for %d threads to terminate\n", atomic_read (&kibnal_data.kib_nthreads)); - set_current_state (TASK_INTERRUPTIBLE); - schedule_timeout (HZ); + cfs_pause(cfs_time_seconds(1)); } /* fall through */ @@ -1568,8 +1554,6 @@ kibnal_shutdown (ptl_ni_t *ni) CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", atomic_read (&portal_kmemory)); - printk(KERN_INFO "Lustre: Voltaire IB NAL unloaded (final mem %d)\n", - atomic_read(&portal_kmemory)); kibnal_data.kib_init = IBNAL_INIT_NOTHING; PORTAL_MODULE_UNUSE; @@ -1587,7 +1571,6 @@ kibnal_startup (ptl_ni_t *ni) int nob; int devno; struct timeval tv; - int pkmem = atomic_read(&portal_kmemory); int rc; int i; vv_request_event_record_t req_er; @@ -1884,9 +1867,6 @@ kibnal_startup (ptl_ni_t *ni) kibnal_data.kib_init = IBNAL_INIT_ALL; /*****************************************************/ - printk(KERN_INFO "Lustre: Voltaire IB NAL loaded " - "(initial mem %d)\n", pkmem); - return (PTL_OK); failed: diff --git a/lnet/klnds/viblnd/viblnd.h b/lnet/klnds/viblnd/viblnd.h index b67a103..ce524eb 100644 --- a/lnet/klnds/viblnd/viblnd.h +++ b/lnet/klnds/viblnd/viblnd.h @@ -221,7 +221,7 @@ typedef struct struct list_head *kib_peers; /* hash table of all my known peers */ int kib_peer_hash_size; /* size of kib_peers */ - int kib_npeers; /* # peers extant */ + atomic_t kib_npeers; /* # peers extant */ atomic_t kib_nconns; /* # connections extant */ void *kib_connd; /* the connd task (serialisation assertions) */ diff --git a/lnet/klnds/viblnd/viblnd_cb.c b/lnet/klnds/viblnd/viblnd_cb.c index 7138d04..b9b30b3 100644 --- a/lnet/klnds/viblnd/viblnd_cb.c +++ b/lnet/klnds/viblnd/viblnd_cb.c @@ -1323,7 +1323,7 @@ kibnal_launch_tx (kib_tx_t *tx, ptl_nid_t nid) kibnal_tx_done (tx); return; } - + peer->ibp_connecting = 1; peer->ibp_arp_count = 1 + *kibnal_tunables.kib_arp_retries; kibnal_schedule_peer_arp(peer); @@ -1923,7 +1923,7 @@ kibnal_conn_disconnected(kib_conn_t *conn) void kibnal_peer_connect_failed (kib_peer_t *peer, int active) { - struct list_head zombies; + LIST_HEAD (zombies); kib_tx_t *tx; unsigned long flags; @@ -1956,8 +1956,9 @@ kibnal_peer_connect_failed (kib_peer_t *peer, int active) MIN(peer->ibp_reconnect_interval, *kibnal_tunables.kib_max_reconnect_interval); - peer->ibp_reconnect_time = jiffies + peer->ibp_reconnect_interval; - + peer->ibp_reconnect_time = jiffies + + peer->ibp_reconnect_interval * HZ; + /* Take peer's blocked transmits to complete with error */ list_add(&zombies, &peer->ibp_tx_queue); list_del_init(&peer->ibp_tx_queue); @@ -2030,7 +2031,7 @@ kibnal_connreq_done(kib_conn_t *conn, int active, int status) case IBNAL_CONN_ACTIVE_CONNECT: LASSERT (active); cm_cancel(conn->ibc_cep); - libcfs_pause(cfs_time_seconds(1)/10); + cfs_pause(cfs_time_seconds(1)/10); /* cm_connect() failed immediately or * callback returned failure */ break; @@ -3003,7 +3004,7 @@ kibnal_disconnect_conn (kib_conn_t *conn) write_unlock_irqrestore(&kibnal_data.kib_global_lock, flags); cm_cancel(conn->ibc_cep); - libcfs_pause(cfs_time_seconds(1)/10); + cfs_pause(cfs_time_seconds(1)/10); if (!conn->ibc_disconnect) /* CM callback will never happen now */ kibnal_conn_decref(conn); diff --git a/lnet/libcfs/linux/linux-tcpip.c b/lnet/libcfs/linux/linux-tcpip.c index 7ba18cf..0c43570 100644 --- a/lnet/libcfs/linux/linux-tcpip.c +++ b/lnet/libcfs/linux/linux-tcpip.c @@ -675,12 +675,3 @@ libcfs_sock_release (struct socket *sock) } EXPORT_SYMBOL(libcfs_sock_release); - -void -libcfs_pause (cfs_duration_t ticks) -{ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(ticks); -} - -EXPORT_SYMBOL(libcfs_pause); diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index eeb7ab8..3d55896 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -150,6 +150,9 @@ ptl_register_nal (ptl_nal_t *nal) list_add (&nal->nal_list, &ptl_apini.apini_nals); atomic_set(&nal->nal_refcount, 0); + if (nal->nal_type != LONAL) + LCONSOLE(0, "%s NAL registered\n", + libcfs_nal2str(nal->nal_type)); PTL_MUTEX_UP(&ptl_apini.apini_nal_mutex); } @@ -164,6 +167,9 @@ ptl_unregister_nal (ptl_nal_t *nal) LASSERT (atomic_read(&nal->nal_refcount) == 0); list_del (&nal->nal_list); + if (nal->nal_type != LONAL) + LCONSOLE(0, "%s NAL unregistered\n", + libcfs_nal2str(nal->nal_type)); PTL_MUTEX_UP(&ptl_apini.apini_nal_mutex); } @@ -642,6 +648,13 @@ ptl_shutdown_nalnis (void) atomic_dec(&ni->ni_nal->nal_refcount); (ni->ni_nal->nal_shutdown)(ni); + /* can't deref nal anymore now; it might have unregistered + * itself... */ + + if (PTL_NETNAL(PTL_NIDNET(ni->ni_nid)) != LONAL) + LCONSOLE(0, "Removed NI %s\n", + libcfs_nid2str(ni->ni_nid)); + PORTAL_FREE(ni, sizeof(*ni)); PTL_LOCK(flags); @@ -694,9 +707,6 @@ ptl_startup_nalnis (void) goto failed; } - CDEBUG(D_WARNING,"Requesting module %s\n", - libcfs_nal2modname(nal_type)); - request_module(libcfs_nal2modname(nal_type)); PTL_MUTEX_DOWN(&ptl_apini.apini_nal_mutex); @@ -711,12 +721,16 @@ ptl_startup_nalnis (void) PTL_MUTEX_UP(&ptl_apini.apini_nal_mutex); if (rc != PTL_OK) { - CERROR("Error %d staring up NI %s\n", + CERROR("Error %d starting up NI %s\n", rc, libcfs_nal2str(nal->nal_type)); atomic_dec(&nal->nal_refcount); goto failed; } + if (nal->nal_type != LONAL) + LCONSOLE(0, "Added NI %s\n", + libcfs_nid2str(ni->ni_nid)); + list_del(&ni->ni_list); PTL_LOCK(flags); diff --git a/lnet/lnet/module.c b/lnet/lnet/module.c index 329ae9c..6b895f3 100644 --- a/lnet/lnet/module.c +++ b/lnet/lnet/module.c @@ -83,8 +83,6 @@ static int init_kportals_module(void) RETURN(rc); } - CDEBUG(D_WARNING, "Startup: config_on_load=%d\n", config_on_load); - if (config_on_load) { ptl_handle_ni_t nih; diff --git a/lnet/lnet/router_proc.c b/lnet/lnet/router_proc.c index 7c6b07e..1ca5f79 100644 --- a/lnet/lnet/router_proc.c +++ b/lnet/lnet/router_proc.c @@ -216,9 +216,10 @@ kpr_seq_routes_show (struct seq_file *s, void *iter) read_unlock_irqrestore(&kpr_state.kpr_rwlock, flags); - seq_printf(s, "net %12s: gateway %s %s\n", - libcfs_net2str(net), libcfs_nid2str(nid), - alive ? "up" : "down"); + seq_printf(s, "%-8s %4s %s\n", + libcfs_net2str(net), + alive ? "up" : "down", + libcfs_nid2str(nid)); return 0; } -- 1.8.3.1