Whamcloud - gitweb
LU-9859 libcfs: delete libcfs/linux/libcfs.h
[fs/lustre-release.git] / lnet / lnet / router_proc.c
index 953130f..24d57f5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  *
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  *
  *   This file is part of Lustre, https://wiki.hpdd.intel.com/
  *
  */
 
 #define DEBUG_SUBSYSTEM S_LNET
+
+#include <linux/uaccess.h>
+
+#include <libcfs/linux/linux-misc.h>
 #include <libcfs/libcfs.h>
 #include <lnet/lib-lnet.h>
 
 /* This is really lnet_proc.c. You might need to update sanity test 215
  * if any file format is changed. */
 
-static struct ctl_table_header *lnet_table_header = NULL;
-
 #define LNET_LOFFT_BITS                (sizeof(loff_t) * 8)
 /*
  * NB: max allowed LNET_CPT_BITS is 8 on 64-bit system and 2 on 32-bit system
@@ -405,7 +407,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 +416,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 +466,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 +664,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 +933,7 @@ static struct ctl_table lnet_table[] = {
        {
                INIT_CTL_NAME
                .procname       = "peers",
-               .mode           = 0444,
+               .mode           = 0644,
                .proc_handler   = &proc_lnet_peers,
        },
        {
@@ -887,7 +945,7 @@ static struct ctl_table lnet_table[] = {
        {
                INIT_CTL_NAME
                .procname       = "nis",
-               .mode           = 0444,
+               .mode           = 0644,
                .proc_handler   = &proc_lnet_nis,
        },
        {
@@ -899,34 +957,7 @@ static struct ctl_table lnet_table[] = {
        { 0 }
 };
 
-static struct ctl_table top_table[] = {
-       {
-               INIT_CTL_NAME
-               .procname       = "lnet",
-               .mode           = 0555,
-               .data           = NULL,
-               .maxlen         = 0,
-               .child          = lnet_table,
-       },
-       { 0 }
-};
-
-void
-lnet_proc_init(void)
-{
-#ifdef CONFIG_SYSCTL
-       if (lnet_table_header == NULL)
-               lnet_table_header = register_sysctl_table(top_table);
-#endif
-}
-
-void
-lnet_proc_fini(void)
+void lnet_router_debugfs_init(void)
 {
-#ifdef CONFIG_SYSCTL
-       if (lnet_table_header != NULL)
-               unregister_sysctl_table(lnet_table_header);
-
-       lnet_table_header = NULL;
-#endif
+       lnet_insert_debugfs(lnet_table, NULL);
 }