Whamcloud - gitweb
LU-7214 lnet: Allow min stats to be reset in peers and nis 70/20470/8
authorDoug Oucharek <doug.s.oucharek@intel.com>
Thu, 26 May 2016 18:26:17 +0000 (11:26 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 1 May 2017 17:47:34 +0000 (17:47 +0000)
Allow writes to the peers and nis LNet procfs files to
reset the mininum stat columns.

Signed-off-by: Doug Oucharek <doug.s.oucharek@intel.com>
Change-Id: Ic7aa647a154a424b35be1598266887d27efb4ab3
Reviewed-on: https://review.whamcloud.com/20470
Tested-by: Jenkins
Reviewed-by: Olaf Weber <olaf@sgi.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Amir Shehata <amir.shehata@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lnet/lnet/router_proc.c

index 953130f..f9d8d36 100644 (file)
@@ -405,7 +405,7 @@ proc_lnet_peers(struct ctl_table *table, int write, void __user *buffer,
 {
        const int               tmpsiz  = 256;
        struct lnet_peer_table  *ptable;
-       char                    *tmpstr;
+       char                    *tmpstr = NULL;
        char                    *s;
        int                     cpt  = LNET_PROC_CPT_GET(*ppos);
        int                     ver  = LNET_PROC_VER_GET(*ppos);
@@ -414,12 +414,33 @@ proc_lnet_peers(struct ctl_table *table, int write, void __user *buffer,
        int                     rc = 0;
        int                     len;
 
-       CLASSERT(LNET_PROC_HASH_BITS >= LNET_PEER_HASH_BITS);
-       LASSERT(!write);
+       if (write) {
+               int i;
+               struct lnet_peer_ni *peer;
+
+               cfs_percpt_for_each(ptable, i, the_lnet.ln_peer_tables) {
+                       lnet_net_lock(i);
+                       for (hash = 0; hash < LNET_PEER_HASH_SIZE; hash++) {
+                               list_for_each_entry(peer,
+                                                   &ptable->pt_hash[hash],
+                                                   lpni_hashlist) {
+                                       peer->lpni_mintxcredits =
+                                               peer->lpni_txcredits;
+                                       peer->lpni_minrtrcredits =
+                                               peer->lpni_rtrcredits;
+                               }
+                       }
+                       lnet_net_unlock(i);
+               }
+               *ppos += *lenp;
+               return 0;
+       }
 
        if (*lenp == 0)
                return 0;
 
+       CLASSERT(LNET_PROC_HASH_BITS >= LNET_PEER_HASH_BITS);
+
        if (cpt >= LNET_CPT_NUMBER) {
                *lenp = 0;
                return 0;
@@ -443,6 +464,7 @@ proc_lnet_peers(struct ctl_table *table, int write, void __user *buffer,
                struct lnet_peer_ni     *peer;
                struct list_head        *p;
                int                     skip;
+
  again:
                p = NULL;
                peer = NULL;
@@ -640,16 +662,50 @@ proc_lnet_nis(struct ctl_table *table, int write, void __user *buffer,
              size_t *lenp, loff_t *ppos)
 {
        int     tmpsiz = 128 * LNET_CPT_NUMBER;
-       int        rc = 0;
-       char      *tmpstr;
-       char      *s;
-       int        len;
-
-       LASSERT(!write);
+       int     rc = 0;
+       char    *tmpstr;
+       char    *s;
+       int     len;
 
        if (*lenp == 0)
                return 0;
 
+       if (write) {
+               /* Just reset the min stat. */
+               struct lnet_ni  *ni;
+               struct lnet_net *net;
+
+               lnet_net_lock(0);
+
+               list_for_each_entry(net, &the_lnet.ln_nets, net_list) {
+                       list_for_each_entry(ni, &net->net_ni_list, ni_netlist) {
+                               struct lnet_tx_queue *tq;
+                               int i;
+                               int j;
+
+                               cfs_percpt_for_each(tq, i, ni->ni_tx_queues) {
+                                       for (j = 0; ni->ni_cpts != NULL &&
+                                            j < ni->ni_ncpts; j++) {
+                                               if (i == ni->ni_cpts[j])
+                                                       break;
+                                       }
+
+                                       if (j == ni->ni_ncpts)
+                                               continue;
+
+                                       if (i != 0)
+                                               lnet_net_lock(i);
+                                       tq->tq_credits_min = tq->tq_credits;
+                                       if (i != 0)
+                                               lnet_net_unlock(i);
+                               }
+                       }
+               }
+               lnet_net_unlock(0);
+               *ppos += *lenp;
+               return 0;
+       }
+
        LIBCFS_ALLOC(tmpstr, tmpsiz);
        if (tmpstr == NULL)
                return -ENOMEM;
@@ -875,7 +931,7 @@ static struct ctl_table lnet_table[] = {
        {
                INIT_CTL_NAME
                .procname       = "peers",
-               .mode           = 0444,
+               .mode           = 0644,
                .proc_handler   = &proc_lnet_peers,
        },
        {
@@ -887,7 +943,7 @@ static struct ctl_table lnet_table[] = {
        {
                INIT_CTL_NAME
                .procname       = "nis",
-               .mode           = 0444,
+               .mode           = 0644,
                .proc_handler   = &proc_lnet_nis,
        },
        {