Whamcloud - gitweb
LU-1346 libcfs: cleanup libcfs primitive (linux-prim.h)
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-proc.c
index a36cf1d..027802c 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  * Author: Phil Schwan <phil@clusterfs.com>
  */
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/stat.h>
 #include <linux/errno.h>
-#include <linux/smp_lock.h>
 #include <linux/unistd.h>
 #include <net/sock.h>
 #include <linux/uio.h>
 
-#include <asm/system.h>
 #include <asm/uaccess.h>
 
 #include <linux/fs.h>
@@ -76,7 +67,9 @@
 #include <asm/div64.h>
 #include "tracefile.h"
 
-static cfs_sysctl_table_header_t *lnet_table_header = NULL;
+#ifdef CONFIG_SYSCTL
+static struct ctl_table_header *lnet_table_header = NULL;
+#endif
 extern char lnet_upcall[1024];
 /**
  * The path of debug log dump upcall script.
@@ -95,6 +88,7 @@ enum {
         PSDEV_CONSOLE_BACKOFF,    /* delay increase factor */
         PSDEV_DEBUG_PATH,         /* crashdump log location */
         PSDEV_DEBUG_DUMP_PATH,    /* crashdump tracelog location */
+       PSDEV_CPT_TABLE,          /* information about cpu partitions */
         PSDEV_LNET_UPCALL,        /* User mode upcall script  */
         PSDEV_LNET_MEMUSED,       /* bytes currently PORTAL_ALLOCated */
         PSDEV_LNET_CATASTROPHE,   /* if we have LBUGged or panic'd */
@@ -105,6 +99,8 @@ enum {
         PSDEV_LNET_DEBUG_LOG_UPCALL, /* debug log upcall script */
         PSDEV_LNET_WATCHDOG_RATELIMIT,  /* ratelimit watchdog messages  */
         PSDEV_LNET_FORCE_LBUG,    /* hook to force an LBUG */
+        PSDEV_LNET_FAIL_LOC,      /* control test failures instrumentation */
+        PSDEV_LNET_FAIL_VAL,      /* userdata for fail loc */
 };
 #else
 #define CTL_LNET                        CTL_UNNUMBERED
@@ -117,6 +113,7 @@ enum {
 #define PSDEV_CONSOLE_BACKOFF           CTL_UNNUMBERED
 #define PSDEV_DEBUG_PATH                CTL_UNNUMBERED
 #define PSDEV_DEBUG_DUMP_PATH           CTL_UNNUMBERED
+#define PSDEV_CPT_TABLE                        CTL_UNNUMBERED
 #define PSDEV_LNET_UPCALL               CTL_UNNUMBERED
 #define PSDEV_LNET_MEMUSED              CTL_UNNUMBERED
 #define PSDEV_LNET_CATASTROPHE          CTL_UNNUMBERED
@@ -126,9 +123,11 @@ enum {
 #define PSDEV_LNET_DEBUG_MB             CTL_UNNUMBERED
 #define PSDEV_LNET_DEBUG_LOG_UPCALL     CTL_UNNUMBERED
 #define PSDEV_LNET_WATCHDOG_RATELIMIT   CTL_UNNUMBERED
+#define PSDEV_LNET_FORCE_LBUG           CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_LOC             CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_VAL             CTL_UNNUMBERED
 #endif
 
-
 int
 proc_call_handler(void *data, int write,
                   loff_t *ppos, void *buffer, size_t *lenp,
@@ -176,8 +175,10 @@ static int __proc_dobitmasks(void *data, int write,
                 }
         } else {
                 rc = cfs_trace_copyin_string(tmpstr, tmpstrlen, buffer, nob);
-                if (rc < 0)
-                        return rc;
+               if (rc < 0) {
+                       cfs_trace_free_string_buffer(tmpstr, tmpstrlen);
+                       return rc;
+               }
 
                 rc = libcfs_debug_str2mask(mask, tmpstr, is_subsys);
                 /* Always print LBUG/LASSERT to console, so keep this mask */
@@ -245,9 +246,9 @@ DECLARE_PROC_HANDLER(proc_debug_mb)
 
 int LL_PROC_PROTO(proc_console_max_delay_cs)
 {
-        int rc, max_delay_cs;
-        cfs_sysctl_table_t dummy = *table;
-        cfs_duration_t d;
+       int rc, max_delay_cs;
+       struct ctl_table dummy = *table;
+       cfs_duration_t d;
 
         dummy.data = &max_delay_cs;
         dummy.proc_handler = &proc_dointvec;
@@ -276,60 +277,60 @@ int LL_PROC_PROTO(proc_console_max_delay_cs)
 
 int LL_PROC_PROTO(proc_console_min_delay_cs)
 {
-        int rc, min_delay_cs;
-        cfs_sysctl_table_t dummy = *table;
-        cfs_duration_t d;
-
-        dummy.data = &min_delay_cs;
-        dummy.proc_handler = &proc_dointvec;
-
-        if (!write) { /* read */
-                min_delay_cs = cfs_duration_sec(libcfs_console_min_delay * 100);
-                rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
-                return rc;
-        }
-
-        /* write */
-        min_delay_cs = 0;
-        rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
-        if (rc < 0)
-                return rc;
-        if (min_delay_cs <= 0)
-                return -EINVAL;
-
-        d = cfs_time_seconds(min_delay_cs) / 100;
-        if (d == 0 || d > libcfs_console_max_delay)
-                return -EINVAL;
-        libcfs_console_min_delay = d;
-
-        return rc;
+       int rc, min_delay_cs;
+       struct ctl_table dummy = *table;
+       cfs_duration_t d;
+
+       dummy.data = &min_delay_cs;
+       dummy.proc_handler = &proc_dointvec;
+
+       if (!write) { /* read */
+               min_delay_cs = cfs_duration_sec(libcfs_console_min_delay * 100);
+               rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+               return rc;
+       }
+
+       /* write */
+       min_delay_cs = 0;
+       rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+       if (rc < 0)
+               return rc;
+       if (min_delay_cs <= 0)
+               return -EINVAL;
+
+       d = cfs_time_seconds(min_delay_cs) / 100;
+       if (d == 0 || d > libcfs_console_max_delay)
+               return -EINVAL;
+       libcfs_console_min_delay = d;
+
+       return rc;
 }
 
 int LL_PROC_PROTO(proc_console_backoff)
 {
-        int rc, backoff;
-        cfs_sysctl_table_t dummy = *table;
+       int rc, backoff;
+       struct ctl_table dummy = *table;
 
-        dummy.data = &backoff;
-        dummy.proc_handler = &proc_dointvec;
+       dummy.data = &backoff;
+       dummy.proc_handler = &proc_dointvec;
 
-        if (!write) { /* read */
-                backoff= libcfs_console_backoff;
-                rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
-                return rc;
-        }
+       if (!write) { /* read */
+               backoff= libcfs_console_backoff;
+               rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+               return rc;
+       }
 
-        /* write */
-        backoff = 0;
-        rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
-        if (rc < 0)
-                return rc;
-        if (backoff <= 0)
-                return -EINVAL;
+       /* write */
+       backoff = 0;
+       rc = ll_proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+       if (rc < 0)
+               return rc;
+       if (backoff <= 0)
+               return -EINVAL;
 
-        libcfs_console_backoff = backoff;
+       libcfs_console_backoff = backoff;
 
-        return rc;
+       return rc;
 }
 
 int LL_PROC_PROTO(libcfs_force_lbug)
@@ -339,13 +340,66 @@ int LL_PROC_PROTO(libcfs_force_lbug)
         return 0;
 }
 
-static cfs_sysctl_table_t lnet_table[] = {
+int LL_PROC_PROTO(proc_fail_loc)
+{
+        int rc;
+        long old_fail_loc = cfs_fail_loc;
+
+        rc = ll_proc_dolongvec(table, write, filp, buffer, lenp, ppos);
+        if (old_fail_loc != cfs_fail_loc)
+                cfs_waitq_signal(&cfs_race_waitq);
+        return rc;
+}
+
+static int __proc_cpt_table(void *data, int write,
+                           loff_t pos, void *buffer, int nob)
+{
+       char *buf = NULL;
+       int   len = 4096;
+       int   rc  = 0;
+
+       if (write)
+               return -EPERM;
+
+       LASSERT(cfs_cpt_table != NULL);
+
+       while (1) {
+               LIBCFS_ALLOC(buf, len);
+               if (buf == NULL)
+                       return -ENOMEM;
+
+               rc = cfs_cpt_table_print(cfs_cpt_table, buf, len);
+               if (rc >= 0)
+                       break;
+
+               LIBCFS_FREE(buf, len);
+               if (rc == -EFBIG) {
+                       len <<= 1;
+                       continue;
+               }
+               goto out;
+       }
+
+       if (pos >= rc) {
+               rc = 0;
+               goto out;
+       }
+
+       rc = cfs_trace_copyout_string(buffer, nob, buf + pos, NULL);
+ out:
+       if (buf != NULL)
+               LIBCFS_FREE(buf, len);
+       return rc;
+}
+DECLARE_PROC_HANDLER(proc_cpt_table)
+
+static struct ctl_table lnet_table[] = {
         /*
          * NB No .strategy entries have been provided since sysctl(8) prefers
          * to go via /proc for portability.
          */
         {
-                .ctl_name = PSDEV_DEBUG,
+                INIT_CTL_NAME(PSDEV_DEBUG)
                 .procname = "debug",
                 .data     = &libcfs_debug,
                 .maxlen   = sizeof(int),
@@ -353,7 +407,7 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_SUBSYSTEM_DEBUG,
+                INIT_CTL_NAME(PSDEV_SUBSYSTEM_DEBUG)
                 .procname = "subsystem_debug",
                 .data     = &libcfs_subsystem_debug,
                 .maxlen   = sizeof(int),
@@ -361,7 +415,7 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_PRINTK,
+                INIT_CTL_NAME(PSDEV_PRINTK)
                 .procname = "printk",
                 .data     = &libcfs_printk,
                 .maxlen   = sizeof(int),
@@ -369,7 +423,7 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_CONSOLE_RATELIMIT,
+                INIT_CTL_NAME(PSDEV_CONSOLE_RATELIMIT)
                 .procname = "console_ratelimit",
                 .data     = &libcfs_console_ratelimit,
                 .maxlen   = sizeof(int),
@@ -377,21 +431,21 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dointvec
         },
         {
-                .ctl_name = PSDEV_CONSOLE_MAX_DELAY_CS,
+                INIT_CTL_NAME(PSDEV_CONSOLE_MAX_DELAY_CS)
                 .procname = "console_max_delay_centisecs",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
                 .proc_handler = &proc_console_max_delay_cs
         },
         {
-                .ctl_name = PSDEV_CONSOLE_MIN_DELAY_CS,
+                INIT_CTL_NAME(PSDEV_CONSOLE_MIN_DELAY_CS)
                 .procname = "console_min_delay_centisecs",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
                 .proc_handler = &proc_console_min_delay_cs
         },
         {
-                .ctl_name = PSDEV_CONSOLE_BACKOFF,
+                INIT_CTL_NAME(PSDEV_CONSOLE_BACKOFF)
                 .procname = "console_backoff",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
@@ -399,7 +453,7 @@ static cfs_sysctl_table_t lnet_table[] = {
         },
 
         {
-                .ctl_name = PSDEV_DEBUG_PATH,
+                INIT_CTL_NAME(PSDEV_DEBUG_PATH)
                 .procname = "debug_path",
                 .data     = libcfs_debug_file_path_arr,
                 .maxlen   = sizeof(libcfs_debug_file_path_arr),
@@ -407,8 +461,16 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dostring,
         },
 
+       {
+               INIT_CTL_NAME(PSDEV_CPT_TABLE)
+               .procname = "cpu_partition_table",
+               .maxlen   = 128,
+               .mode     = 0444,
+               .proc_handler = &proc_cpt_table,
+       },
+
         {
-                .ctl_name = PSDEV_LNET_UPCALL,
+                INIT_CTL_NAME(PSDEV_LNET_UPCALL)
                 .procname = "upcall",
                 .data     = lnet_upcall,
                 .maxlen   = sizeof(lnet_upcall),
@@ -416,7 +478,7 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dostring,
         },
         {
-                .ctl_name = PSDEV_LNET_DEBUG_LOG_UPCALL,
+                INIT_CTL_NAME(PSDEV_LNET_DEBUG_LOG_UPCALL)
                 .procname = "debug_log_upcall",
                 .data     = lnet_debug_log_upcall,
                 .maxlen   = sizeof(lnet_debug_log_upcall),
@@ -424,54 +486,54 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dostring,
         },
         {
-                .ctl_name = PSDEV_LNET_MEMUSED,
-                .procname = "memused",
+                INIT_CTL_NAME(PSDEV_LNET_MEMUSED)
+                .procname = "lnet_memused",
                 .data     = (int *)&libcfs_kmemory.counter,
                 .maxlen   = sizeof(int),
                 .mode     = 0444,
                 .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_CATASTROPHE,
+                INIT_CTL_NAME(PSDEV_LNET_CATASTROPHE)
                 .procname = "catastrophe",
                 .data     = &libcfs_catastrophe,
                 .maxlen   = sizeof(int),
                 .mode     = 0444,
                 .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_PANIC_ON_LBUG,
+                INIT_CTL_NAME(PSDEV_LNET_PANIC_ON_LBUG)
                 .procname = "panic_on_lbug",
                 .data     = &libcfs_panic_on_lbug,
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
                 .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_DUMP_KERNEL,
+                INIT_CTL_NAME(PSDEV_LNET_DUMP_KERNEL)
                 .procname = "dump_kernel",
                 .maxlen   = 256,
                 .mode     = 0200,
                 .proc_handler = &proc_dump_kernel,
         },
         {
-                .ctl_name = PSDEV_LNET_DAEMON_FILE,
+                INIT_CTL_NAME(PSDEV_LNET_DAEMON_FILE)
                 .procname = "daemon_file",
                 .mode     = 0644,
                 .maxlen   = 256,
                 .proc_handler = &proc_daemon_file,
         },
         {
-                .ctl_name = PSDEV_LNET_DEBUG_MB,
+                INIT_CTL_NAME(PSDEV_LNET_DEBUG_MB)
                 .procname = "debug_mb",
                 .mode     = 0644,
                 .proc_handler = &proc_debug_mb,
         },
         {
-                .ctl_name = PSDEV_LNET_WATCHDOG_RATELIMIT,
+                INIT_CTL_NAME(PSDEV_LNET_WATCHDOG_RATELIMIT)
                 .procname = "watchdog_ratelimit",
                 .data     = &libcfs_watchdog_ratelimit,
                 .maxlen   = sizeof(int),
@@ -480,19 +542,38 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .extra1   = &min_watchdog_ratelimit,
                 .extra2   = &max_watchdog_ratelimit,
         },
-        {       .ctl_name = PSDEV_LNET_FORCE_LBUG,
+        {       INIT_CTL_NAME(PSDEV_LNET_FORCE_LBUG)
                 .procname = "force_lbug",
                 .data     = NULL,
                 .maxlen   = 0,
                 .mode     = 0200,
                 .proc_handler = &libcfs_force_lbug
         },
-        {0}
+        {
+                INIT_CTL_NAME(PSDEV_LNET_FAIL_LOC)
+                .procname = "fail_loc",
+                .data     = &cfs_fail_loc,
+                .maxlen   = sizeof(cfs_fail_loc),
+                .mode     = 0644,
+                .proc_handler = &proc_fail_loc
+        },
+        {
+                INIT_CTL_NAME(PSDEV_LNET_FAIL_VAL)
+                .procname = "fail_val",
+                .data     = &cfs_fail_val,
+                .maxlen   = sizeof(int),
+                .mode     = 0644,
+                .proc_handler = &proc_dointvec
+        },
+        {
+                INIT_CTL_NAME(0)
+        }
 };
 
-static cfs_sysctl_table_t top_table[] = {
+#ifdef CONFIG_SYSCTL
+static struct ctl_table top_table[] = {
         {
-                .ctl_name = CTL_LNET,
+                INIT_CTL_NAME(CTL_LNET)
                 .procname = "lnet",
                 .mode     = 0555,
                 .data     = NULL,
@@ -500,25 +581,26 @@ static cfs_sysctl_table_t top_table[] = {
                 .child    = lnet_table,
         },
         {
-                .ctl_name = 0
+                INIT_CTL_NAME(0)
         }
 };
+#endif
 
 int insert_proc(void)
 {
 #ifdef CONFIG_SYSCTL
-        if (lnet_table_header == NULL)
-                lnet_table_header = cfs_register_sysctl_table(top_table, 0);
+       if (lnet_table_header == NULL)
+               lnet_table_header = register_sysctl_table(top_table);
 #endif
-        return 0;
+       return 0;
 }
 
 void remove_proc(void)
 {
 #ifdef CONFIG_SYSCTL
-        if (lnet_table_header != NULL)
-                cfs_unregister_sysctl_table(lnet_table_header);
+       if (lnet_table_header != NULL)
+               unregister_sysctl_table(lnet_table_header);
 
-        lnet_table_header = NULL;
+       lnet_table_header = NULL;
 #endif
 }