Whamcloud - gitweb
LU-6201 llite: remove duplicate fiemap defines
[fs/lustre-release.git] / lnet / lnet / peer.c
index 5b4b09e..1f2f1fa 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -39,6 +39,7 @@
 #define DEBUG_SUBSYSTEM S_LNET
 
 #include <lnet/lib-lnet.h>
+#include <lnet/lib-dlc.h>
 
 int
 lnet_peer_tables_create(void)
@@ -137,7 +138,8 @@ lnet_peer_table_deathrow_wait_locked(struct lnet_peer_table *ptable,
                               "Waiting for %d zombies on peer table\n",
                               ptable->pt_zombies);
                }
-               cfs_pause(cfs_time_seconds(1) >> 1);
+               set_current_state(TASK_UNINTERRUPTIBLE);
+               schedule_timeout(cfs_time_seconds(1) >> 1);
                lnet_net_lock(cpt_locked);
        }
 }
@@ -387,3 +389,65 @@ lnet_debug_peer(lnet_nid_t nid)
 
        lnet_net_unlock(cpt);
 }
+
+int lnet_get_peer_info(__u32 peer_index, __u64 *nid,
+                      char aliveness[LNET_MAX_STR_LEN],
+                      __u32 *cpt_iter, __u32 *refcount,
+                      __u32 *ni_peer_tx_credits, __u32 *peer_tx_credits,
+                      __u32 *peer_rtr_credits, __u32 *peer_min_rtr_credits,
+                      __u32 *peer_tx_qnob)
+{
+       struct lnet_peer_table  *peer_table;
+       lnet_peer_t             *lp;
+       int                     j;
+       int                     lncpt;
+       bool                    found = false;
+
+       /* get the number of CPTs */
+       lncpt = cfs_percpt_number(the_lnet.ln_peer_tables);
+
+       /* if the cpt number to be examined is >= the number of cpts in
+        * the system then indicate that there are no more cpts to examin
+        */
+       if (*cpt_iter > lncpt)
+               return -ENOENT;
+
+       /* get the current table */
+       peer_table = the_lnet.ln_peer_tables[*cpt_iter];
+       /* if the ptable is NULL then there are no more cpts to examine */
+       if (peer_table == NULL)
+               return -ENOENT;
+
+       lnet_net_lock(*cpt_iter);
+
+       for (j = 0; j < LNET_PEER_HASH_SIZE && !found; j++) {
+               struct list_head *peers = &peer_table->pt_hash[j];
+
+               list_for_each_entry(lp, peers, lp_hashlist) {
+                       if (peer_index-- > 0)
+                               continue;
+
+                       snprintf(aliveness, LNET_MAX_STR_LEN, "NA");
+                       if (lnet_isrouter(lp) ||
+                               lnet_peer_aliveness_enabled(lp))
+                               snprintf(aliveness, LNET_MAX_STR_LEN,
+                                        lp->lp_alive ? "up" : "down");
+
+                       *nid = lp->lp_nid;
+                       *refcount = lp->lp_refcount;
+                       *ni_peer_tx_credits = lp->lp_ni->ni_peertxcredits;
+                       *peer_tx_credits = lp->lp_txcredits;
+                       *peer_rtr_credits = lp->lp_rtrcredits;
+                       *peer_min_rtr_credits = lp->lp_mintxcredits;
+                       *peer_tx_qnob = lp->lp_txqnob;
+
+                       found = true;
+               }
+
+       }
+       lnet_net_unlock(*cpt_iter);
+
+       *cpt_iter = lncpt;
+
+       return found ? 0 : -ENOENT;
+}