1 /*****************************************************************************\
2 * Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
3 * Copyright (C) 2007 The Regents of the University of California.
4 * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
5 * Written by Brian Behlendorf <behlendorf1@llnl.gov>.
8 * This file is part of the SPL, Solaris Porting Layer.
9 * For details, see <http://zfsonlinux.org/>.
11 * The SPL is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
16 * The SPL is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 * You should have received a copy of the GNU General Public License along
22 * with the SPL. If not, see <http://www.gnu.org/licenses/>.
23 *****************************************************************************
24 * Solaris Porting Layer (SPL) Proc Implementation.
25 \*****************************************************************************/
27 #include <sys/systeminfo.h>
28 #include <sys/kstat.h>
29 #include <linux/kmod.h>
30 #include <linux/seq_file.h>
31 #include <linux/proc_compat.h>
32 #include <linux/version.h>
33 #include <spl-debug.h>
35 #ifdef SS_DEBUG_SUBSYS
36 #undef SS_DEBUG_SUBSYS
39 #define SS_DEBUG_SUBSYS SS_PROC
41 #if defined(CONSTIFY_PLUGIN) && LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
42 typedef struct ctl_table __no_const spl_ctl_table
;
44 typedef struct ctl_table spl_ctl_table
;
48 static unsigned long table_min
= 0;
49 static unsigned long table_max
= ~0;
53 static struct ctl_table_header
*spl_header
= NULL
;
54 #endif /* CONFIG_SYSCTL */
56 static struct proc_dir_entry
*proc_spl
= NULL
;
58 static struct proc_dir_entry
*proc_spl_kmem
= NULL
;
59 static struct proc_dir_entry
*proc_spl_kmem_slab
= NULL
;
60 #endif /* DEBUG_KMEM */
61 struct proc_dir_entry
*proc_spl_kstat
= NULL
;
64 #ifdef HAVE_CTL_UNNUMBERED
66 #define CTL_SPL CTL_UNNUMBERED
67 #define CTL_SPL_DEBUG CTL_UNNUMBERED
68 #define CTL_SPL_VM CTL_UNNUMBERED
69 #define CTL_SPL_MUTEX CTL_UNNUMBERED
70 #define CTL_SPL_KMEM CTL_UNNUMBERED
71 #define CTL_SPL_KSTAT CTL_UNNUMBERED
73 #define CTL_VERSION CTL_UNNUMBERED /* Version */
74 #define CTL_HOSTID CTL_UNNUMBERED /* Host id by /usr/bin/hostid */
75 #define CTL_HW_SERIAL CTL_UNNUMBERED /* HW serial number by hostid */
76 #define CTL_KALLSYMS CTL_UNNUMBERED /* kallsyms_lookup_name addr */
78 #define CTL_DEBUG_SUBSYS CTL_UNNUMBERED /* Debug subsystem */
79 #define CTL_DEBUG_MASK CTL_UNNUMBERED /* Debug mask */
80 #define CTL_DEBUG_PRINTK CTL_UNNUMBERED /* All messages to console */
81 #define CTL_DEBUG_MB CTL_UNNUMBERED /* Debug buffer size */
82 #define CTL_DEBUG_BINARY CTL_UNNUMBERED /* Binary data in buffer */
83 #define CTL_DEBUG_CATASTROPHE CTL_UNNUMBERED /* Set if BUG'd or panic'd */
84 #define CTL_DEBUG_PANIC_ON_BUG CTL_UNNUMBERED /* Should panic on BUG */
85 #define CTL_DEBUG_PATH CTL_UNNUMBERED /* Dump log location */
86 #define CTL_DEBUG_DUMP CTL_UNNUMBERED /* Dump debug buffer to file */
87 #define CTL_DEBUG_FORCE_BUG CTL_UNNUMBERED /* Hook to force a BUG */
88 #define CTL_DEBUG_STACK_SIZE CTL_UNNUMBERED /* Max observed stack size */
90 #define CTL_CONSOLE_RATELIMIT CTL_UNNUMBERED /* Ratelimit console messages */
91 #define CTL_CONSOLE_MAX_DELAY_CS CTL_UNNUMBERED /* Max delay skip messages */
92 #define CTL_CONSOLE_MIN_DELAY_CS CTL_UNNUMBERED /* Init delay skip messages */
93 #define CTL_CONSOLE_BACKOFF CTL_UNNUMBERED /* Delay increase factor */
95 #define CTL_VM_MINFREE CTL_UNNUMBERED /* Minimum free memory */
96 #define CTL_VM_DESFREE CTL_UNNUMBERED /* Desired free memory */
97 #define CTL_VM_LOTSFREE CTL_UNNUMBERED /* Lots of free memory */
98 #define CTL_VM_NEEDFREE CTL_UNNUMBERED /* Need free memory */
99 #define CTL_VM_SWAPFS_MINFREE CTL_UNNUMBERED /* Minimum swapfs memory */
100 #define CTL_VM_SWAPFS_RESERVE CTL_UNNUMBERED /* Reserved swapfs memory */
101 #define CTL_VM_AVAILRMEM CTL_UNNUMBERED /* Easily available memory */
102 #define CTL_VM_FREEMEM CTL_UNNUMBERED /* Free memory */
103 #define CTL_VM_PHYSMEM CTL_UNNUMBERED /* Total physical memory */
106 #define CTL_KMEM_KMEMUSED CTL_UNNUMBERED /* Alloc'd kmem bytes */
107 #define CTL_KMEM_KMEMMAX CTL_UNNUMBERED /* Max alloc'd by kmem bytes */
108 #define CTL_KMEM_VMEMUSED CTL_UNNUMBERED /* Alloc'd vmem bytes */
109 #define CTL_KMEM_VMEMMAX CTL_UNNUMBERED /* Max alloc'd by vmem bytes */
110 #define CTL_KMEM_SLAB_KMEMTOTAL CTL_UNNUMBERED /* Total kmem slab size */
111 #define CTL_KMEM_SLAB_KMEMALLOC CTL_UNNUMBERED /* Alloc'd kmem slab size */
112 #define CTL_KMEM_SLAB_KMEMMAX CTL_UNNUMBERED /* Max kmem slab size */
113 #define CTL_KMEM_SLAB_VMEMTOTAL CTL_UNNUMBERED /* Total vmem slab size */
114 #define CTL_KMEM_SLAB_VMEMALLOC CTL_UNNUMBERED /* Alloc'd vmem slab size */
115 #define CTL_KMEM_SLAB_VMEMMAX CTL_UNNUMBERED /* Max vmem slab size */
118 #else /* HAVE_CTL_UNNUMBERED */
122 CTL_SPL_DEBUG
= 0x88,
124 CTL_SPL_MUTEX
= 0x90,
126 CTL_SPL_KSTAT
= 0x92,
130 CTL_VERSION
= 1, /* Version */
131 CTL_HOSTID
, /* Host id reported by /usr/bin/hostid */
132 CTL_HW_SERIAL
, /* Hardware serial number from hostid */
133 CTL_KALLSYMS
, /* Address of kallsyms_lookup_name */
136 CTL_DEBUG_SUBSYS
, /* Debug subsystem */
137 CTL_DEBUG_MASK
, /* Debug mask */
138 CTL_DEBUG_PRINTK
, /* Force all messages to console */
139 CTL_DEBUG_MB
, /* Debug buffer size */
140 CTL_DEBUG_BINARY
, /* Include binary data in buffer */
141 CTL_DEBUG_CATASTROPHE
, /* Set if we have BUG'd or panic'd */
142 CTL_DEBUG_PANIC_ON_BUG
, /* Set if we should panic on BUG */
143 CTL_DEBUG_PATH
, /* Dump log location */
144 CTL_DEBUG_DUMP
, /* Dump debug buffer to file */
145 CTL_DEBUG_FORCE_BUG
, /* Hook to force a BUG */
146 CTL_DEBUG_STACK_SIZE
, /* Max observed stack size */
149 CTL_CONSOLE_RATELIMIT
, /* Ratelimit console messages */
150 CTL_CONSOLE_MAX_DELAY_CS
, /* Max delay which we skip messages */
151 CTL_CONSOLE_MIN_DELAY_CS
, /* Init delay which we skip messages */
152 CTL_CONSOLE_BACKOFF
, /* Delay increase factor */
154 CTL_VM_MINFREE
, /* Minimum free memory threshold */
155 CTL_VM_DESFREE
, /* Desired free memory threshold */
156 CTL_VM_LOTSFREE
, /* Lots of free memory threshold */
157 CTL_VM_NEEDFREE
, /* Need free memory deficit */
158 CTL_VM_SWAPFS_MINFREE
, /* Minimum swapfs memory */
159 CTL_VM_SWAPFS_RESERVE
, /* Reserved swapfs memory */
160 CTL_VM_AVAILRMEM
, /* Easily available memory */
161 CTL_VM_FREEMEM
, /* Free memory */
162 CTL_VM_PHYSMEM
, /* Total physical memory */
165 CTL_KMEM_KMEMUSED
, /* Alloc'd kmem bytes */
166 CTL_KMEM_KMEMMAX
, /* Max alloc'd by kmem bytes */
167 CTL_KMEM_VMEMUSED
, /* Alloc'd vmem bytes */
168 CTL_KMEM_VMEMMAX
, /* Max alloc'd by vmem bytes */
169 CTL_KMEM_SLAB_KMEMTOTAL
, /* Total kmem slab size */
170 CTL_KMEM_SLAB_KMEMALLOC
, /* Alloc'd kmem slab size */
171 CTL_KMEM_SLAB_KMEMMAX
, /* Max kmem slab size */
172 CTL_KMEM_SLAB_VMEMTOTAL
, /* Total vmem slab size */
173 CTL_KMEM_SLAB_VMEMALLOC
, /* Alloc'd vmem slab size */
174 CTL_KMEM_SLAB_VMEMMAX
, /* Max vmem slab size */
177 #endif /* HAVE_CTL_UNNUMBERED */
178 #endif /* HAVE_CTL_NAME */
181 proc_copyin_string(char *kbuffer
, int kbuffer_size
,
182 const char *ubuffer
, int ubuffer_size
)
186 if (ubuffer_size
> kbuffer_size
)
189 if (copy_from_user((void *)kbuffer
, (void *)ubuffer
, ubuffer_size
))
192 /* strip trailing whitespace */
193 size
= strnlen(kbuffer
, ubuffer_size
);
195 if (!isspace(kbuffer
[size
]))
202 /* no space to terminate */
203 if (size
== kbuffer_size
)
206 kbuffer
[size
+ 1] = 0;
211 proc_copyout_string(char *ubuffer
, int ubuffer_size
,
212 const char *kbuffer
, char *append
)
214 /* NB if 'append' != NULL, it's a single character to append to the
215 * copied out string - usually "\n", for /proc entries and
216 * (i.e. a terminating zero byte) for sysctl entries
218 int size
= MIN(strlen(kbuffer
), ubuffer_size
);
220 if (copy_to_user(ubuffer
, kbuffer
, size
))
223 if (append
!= NULL
&& size
< ubuffer_size
) {
224 if (copy_to_user(ubuffer
+ size
, append
, 1))
234 SPL_PROC_HANDLER(proc_dobitmasks
)
236 unsigned long *mask
= table
->data
;
237 int is_subsys
= (mask
== &spl_debug_subsys
) ? 1 : 0;
238 int is_printk
= (mask
== &spl_debug_printk
) ? 1 : 0;
243 str
= kmem_alloc(size
, KM_SLEEP
);
248 rc
= proc_copyin_string(str
, size
, buffer
, *lenp
);
252 rc
= spl_debug_str2mask(mask
, str
, is_subsys
);
253 /* Always print BUG/ASSERT to console, so keep this mask */
259 rc
= spl_debug_mask2str(str
, size
, *mask
, is_subsys
);
263 rc
= proc_copyout_string(buffer
, *lenp
,
271 kmem_free(str
, size
);
275 SPL_PROC_HANDLER(proc_debug_mb
)
282 rc
= proc_copyin_string(str
, sizeof(str
), buffer
, *lenp
);
286 rc
= spl_debug_set_mb(simple_strtoul(str
, NULL
, 0));
289 len
= snprintf(str
, sizeof(str
), "%d", spl_debug_get_mb());
293 rc
= proc_copyout_string(buffer
,*lenp
,str
+*ppos
,"\n");
304 SPL_PROC_HANDLER(proc_dump_kernel
)
309 spl_debug_dumplog(0);
318 SPL_PROC_HANDLER(proc_force_bug
)
323 PANIC("Crashing due to forced panic\n");
330 SPL_PROC_HANDLER(proc_console_max_delay_cs
)
332 int rc
, max_delay_cs
;
333 spl_ctl_table dummy
= *table
;
337 dummy
.data
= &max_delay_cs
;
338 dummy
.proc_handler
= &proc_dointvec
;
342 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
346 if (max_delay_cs
<= 0)
349 d
= (max_delay_cs
* HZ
) / 100;
350 if (d
== 0 || d
< spl_console_min_delay
)
353 spl_console_max_delay
= d
;
355 max_delay_cs
= (spl_console_max_delay
* 100) / HZ
;
356 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
362 SPL_PROC_HANDLER(proc_console_min_delay_cs
)
364 int rc
, min_delay_cs
;
365 spl_ctl_table dummy
= *table
;
369 dummy
.data
= &min_delay_cs
;
370 dummy
.proc_handler
= &proc_dointvec
;
374 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
378 if (min_delay_cs
<= 0)
381 d
= (min_delay_cs
* HZ
) / 100;
382 if (d
== 0 || d
> spl_console_max_delay
)
385 spl_console_min_delay
= d
;
387 min_delay_cs
= (spl_console_min_delay
* 100) / HZ
;
388 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
394 SPL_PROC_HANDLER(proc_console_backoff
)
397 spl_ctl_table dummy
= *table
;
400 dummy
.data
= &backoff
;
401 dummy
.proc_handler
= &proc_dointvec
;
405 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
412 spl_console_backoff
= backoff
;
414 backoff
= spl_console_backoff
;
415 rc
= spl_proc_dointvec(&dummy
,write
,filp
,buffer
,lenp
,ppos
);
420 #endif /* DEBUG_LOG */
423 SPL_PROC_HANDLER(proc_domemused
)
426 unsigned long min
= 0, max
= ~0, val
;
427 spl_ctl_table dummy
= *table
;
431 dummy
.proc_handler
= &proc_dointvec
;
438 # ifdef HAVE_ATOMIC64_T
439 val
= atomic64_read((atomic64_t
*)table
->data
);
441 val
= atomic_read((atomic_t
*)table
->data
);
442 # endif /* HAVE_ATOMIC64_T */
443 rc
= spl_proc_doulongvec_minmax(&dummy
, write
, filp
,
450 SPL_PROC_HANDLER(proc_doslab
)
453 unsigned long min
= 0, max
= ~0, val
= 0, mask
;
454 spl_ctl_table dummy
= *table
;
455 spl_kmem_cache_t
*skc
;
459 dummy
.proc_handler
= &proc_dointvec
;
466 down_read(&spl_kmem_cache_sem
);
467 mask
= (unsigned long)table
->data
;
469 list_for_each_entry(skc
, &spl_kmem_cache_list
, skc_list
) {
471 /* Only use slabs of the correct kmem/vmem type */
472 if (!(skc
->skc_flags
& mask
))
475 /* Sum the specified field for selected slabs */
476 switch (mask
& (KMC_TOTAL
| KMC_ALLOC
| KMC_MAX
)) {
478 val
+= skc
->skc_slab_size
* skc
->skc_slab_total
;
481 val
+= skc
->skc_obj_size
* skc
->skc_obj_alloc
;
484 val
+= skc
->skc_obj_size
* skc
->skc_obj_max
;
489 up_read(&spl_kmem_cache_sem
);
490 rc
= spl_proc_doulongvec_minmax(&dummy
, write
, filp
,
496 #endif /* DEBUG_KMEM */
498 SPL_PROC_HANDLER(proc_dohostid
)
505 /* We can't use spl_proc_doulongvec_minmax() in the write
506 * case here because hostid while a hex value has no
507 * leading 0x which confuses the helper function. */
508 rc
= proc_copyin_string(str
, sizeof(str
), buffer
, *lenp
);
512 spl_hostid
= simple_strtoul(str
, &end
, 16);
516 (void) snprintf(hw_serial
, HW_HOSTID_LEN
, "%lu", spl_hostid
);
517 hw_serial
[HW_HOSTID_LEN
- 1] = '\0';
520 len
= snprintf(str
, sizeof(str
), "%lx", spl_hostid
);
524 rc
= proc_copyout_string(buffer
,*lenp
,str
+*ppos
,"\n");
535 #ifndef HAVE_KALLSYMS_LOOKUP_NAME
536 SPL_PROC_HANDLER(proc_dokallsyms_lookup_name
)
543 /* This may only be set once at module load time */
544 if (spl_kallsyms_lookup_name_fn
!= SYMBOL_POISON
)
547 /* We can't use spl_proc_doulongvec_minmax() in the write
548 * case here because the address while a hex value has no
549 * leading 0x which confuses the helper function. */
550 rc
= proc_copyin_string(str
, sizeof(str
), buffer
, *lenp
);
554 spl_kallsyms_lookup_name_fn
=
555 (kallsyms_lookup_name_t
)simple_strtoul(str
, &end
, 16);
556 wake_up(&spl_kallsyms_lookup_name_waitq
);
563 len
= snprintf(str
, sizeof(str
), "%lx",
564 (unsigned long)spl_kallsyms_lookup_name_fn
);
568 rc
= proc_copyout_string(buffer
,*lenp
,str
+*ppos
,"\n");
578 #endif /* HAVE_KALLSYMS_LOOKUP_NAME */
580 SPL_PROC_HANDLER(proc_doavailrmem
)
589 len
= snprintf(str
, sizeof(str
), "%lu",
590 (unsigned long)availrmem
);
594 rc
= proc_copyout_string(buffer
,*lenp
,str
+*ppos
,"\n");
605 SPL_PROC_HANDLER(proc_dofreemem
)
614 len
= snprintf(str
, sizeof(str
), "%lu", (unsigned long)freemem
);
618 rc
= proc_copyout_string(buffer
,*lenp
,str
+*ppos
,"\n");
631 slab_seq_show_headers(struct seq_file
*f
)
634 "--------------------- cache ----------"
635 "--------------------------------------------- "
638 "--- emergency ---\n");
641 " flags size alloc slabsize objsize "
644 "dlock alloc max\n");
648 slab_seq_show(struct seq_file
*f
, void *p
)
650 spl_kmem_cache_t
*skc
= p
;
652 ASSERT(skc
->skc_magic
== SKC_MAGIC
);
654 spin_lock(&skc
->skc_lock
);
655 seq_printf(f
, "%-36s ", skc
->skc_name
);
656 seq_printf(f
, "0x%05lx %9lu %9lu %8u %8u "
657 "%5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu %5lu\n",
658 (long unsigned)skc
->skc_flags
,
659 (long unsigned)(skc
->skc_slab_size
* skc
->skc_slab_total
),
660 (long unsigned)(skc
->skc_obj_size
* skc
->skc_obj_alloc
),
661 (unsigned)skc
->skc_slab_size
,
662 (unsigned)skc
->skc_obj_size
,
663 (long unsigned)skc
->skc_slab_total
,
664 (long unsigned)skc
->skc_slab_alloc
,
665 (long unsigned)skc
->skc_slab_max
,
666 (long unsigned)skc
->skc_obj_total
,
667 (long unsigned)skc
->skc_obj_alloc
,
668 (long unsigned)skc
->skc_obj_max
,
669 (long unsigned)skc
->skc_obj_deadlock
,
670 (long unsigned)skc
->skc_obj_emergency
,
671 (long unsigned)skc
->skc_obj_emergency_max
);
673 spin_unlock(&skc
->skc_lock
);
679 slab_seq_start(struct seq_file
*f
, loff_t
*pos
)
685 down_read(&spl_kmem_cache_sem
);
687 slab_seq_show_headers(f
);
689 p
= spl_kmem_cache_list
.next
;
692 if (p
== &spl_kmem_cache_list
)
696 SRETURN(list_entry(p
, spl_kmem_cache_t
, skc_list
));
700 slab_seq_next(struct seq_file
*f
, void *p
, loff_t
*pos
)
702 spl_kmem_cache_t
*skc
= p
;
706 SRETURN((skc
->skc_list
.next
== &spl_kmem_cache_list
) ?
707 NULL
: list_entry(skc
->skc_list
.next
,spl_kmem_cache_t
,skc_list
));
711 slab_seq_stop(struct seq_file
*f
, void *v
)
713 up_read(&spl_kmem_cache_sem
);
716 static struct seq_operations slab_seq_ops
= {
717 .show
= slab_seq_show
,
718 .start
= slab_seq_start
,
719 .next
= slab_seq_next
,
720 .stop
= slab_seq_stop
,
724 proc_slab_open(struct inode
*inode
, struct file
*filp
)
726 return seq_open(filp
, &slab_seq_ops
);
729 static struct file_operations proc_slab_operations
= {
730 .open
= proc_slab_open
,
733 .release
= seq_release
,
735 #endif /* DEBUG_KMEM */
738 static struct ctl_table spl_debug_table
[] = {
740 CTL_NAME (CTL_DEBUG_SUBSYS
)
741 .procname
= "subsystem",
742 .data
= &spl_debug_subsys
,
743 .maxlen
= sizeof(unsigned long),
745 .proc_handler
= &proc_dobitmasks
748 CTL_NAME (CTL_DEBUG_MASK
)
750 .data
= &spl_debug_mask
,
751 .maxlen
= sizeof(unsigned long),
753 .proc_handler
= &proc_dobitmasks
756 CTL_NAME (CTL_DEBUG_PRINTK
)
757 .procname
= "printk",
758 .data
= &spl_debug_printk
,
759 .maxlen
= sizeof(unsigned long),
761 .proc_handler
= &proc_dobitmasks
764 CTL_NAME (CTL_DEBUG_MB
)
767 .proc_handler
= &proc_debug_mb
,
770 CTL_NAME (CTL_DEBUG_BINARY
)
771 .procname
= "binary",
772 .data
= &spl_debug_binary
,
773 .maxlen
= sizeof(int),
775 .proc_handler
= &proc_dointvec
,
778 CTL_NAME (CTL_DEBUG_CATASTROPHE
)
779 .procname
= "catastrophe",
780 .data
= &spl_debug_catastrophe
,
781 .maxlen
= sizeof(int),
783 .proc_handler
= &proc_dointvec
,
786 CTL_NAME (CTL_DEBUG_PANIC_ON_BUG
)
787 .procname
= "panic_on_bug",
788 .data
= &spl_debug_panic_on_bug
,
789 .maxlen
= sizeof(int),
791 .proc_handler
= &proc_dointvec
794 CTL_NAME (CTL_DEBUG_PATH
)
796 .data
= spl_debug_file_path
,
797 .maxlen
= sizeof(spl_debug_file_path
),
799 .proc_handler
= &proc_dostring
,
802 CTL_NAME (CTL_DEBUG_DUMP
)
805 .proc_handler
= &proc_dump_kernel
,
807 { CTL_NAME (CTL_DEBUG_FORCE_BUG
)
808 .procname
= "force_bug",
810 .proc_handler
= &proc_force_bug
,
813 CTL_NAME (CTL_CONSOLE_RATELIMIT
)
814 .procname
= "console_ratelimit",
815 .data
= &spl_console_ratelimit
,
816 .maxlen
= sizeof(int),
818 .proc_handler
= &proc_dointvec
,
821 CTL_NAME (CTL_CONSOLE_MAX_DELAY_CS
)
822 .procname
= "console_max_delay_centisecs",
823 .maxlen
= sizeof(int),
825 .proc_handler
= &proc_console_max_delay_cs
,
828 CTL_NAME (CTL_CONSOLE_MIN_DELAY_CS
)
829 .procname
= "console_min_delay_centisecs",
830 .maxlen
= sizeof(int),
832 .proc_handler
= &proc_console_min_delay_cs
,
835 CTL_NAME (CTL_CONSOLE_BACKOFF
)
836 .procname
= "console_backoff",
837 .maxlen
= sizeof(int),
839 .proc_handler
= &proc_console_backoff
,
842 CTL_NAME (CTL_DEBUG_STACK_SIZE
)
843 .procname
= "stack_max",
844 .data
= &spl_debug_stack
,
845 .maxlen
= sizeof(int),
847 .proc_handler
= &proc_dointvec
,
851 #endif /* DEBUG_LOG */
853 static struct ctl_table spl_vm_table
[] = {
855 CTL_NAME (CTL_VM_MINFREE
)
856 .procname
= "minfree",
858 .maxlen
= sizeof(int),
860 .proc_handler
= &proc_dointvec
,
863 CTL_NAME (CTL_VM_DESFREE
)
864 .procname
= "desfree",
866 .maxlen
= sizeof(int),
868 .proc_handler
= &proc_dointvec
,
871 CTL_NAME (CTL_VM_LOTSFREE
)
872 .procname
= "lotsfree",
874 .maxlen
= sizeof(int),
876 .proc_handler
= &proc_dointvec
,
879 CTL_NAME (CTL_VM_NEEDFREE
)
880 .procname
= "needfree",
882 .maxlen
= sizeof(int),
884 .proc_handler
= &proc_dointvec
,
887 CTL_NAME (CTL_VM_SWAPFS_MINFREE
)
888 .procname
= "swapfs_minfree",
889 .data
= &swapfs_minfree
,
890 .maxlen
= sizeof(int),
892 .proc_handler
= &proc_dointvec
,
895 CTL_NAME (CTL_VM_SWAPFS_RESERVE
)
896 .procname
= "swapfs_reserve",
897 .data
= &swapfs_reserve
,
898 .maxlen
= sizeof(int),
900 .proc_handler
= &proc_dointvec
,
903 CTL_NAME (CTL_VM_AVAILRMEM
)
904 .procname
= "availrmem",
906 .proc_handler
= &proc_doavailrmem
,
909 CTL_NAME (CTL_VM_FREEMEM
)
910 .procname
= "freemem",
912 .maxlen
= sizeof(int),
914 .proc_handler
= &proc_dofreemem
,
917 CTL_NAME (CTL_VM_PHYSMEM
)
918 .procname
= "physmem",
920 .maxlen
= sizeof(int),
922 .proc_handler
= &proc_dointvec
,
928 static struct ctl_table spl_kmem_table
[] = {
930 CTL_NAME (CTL_KMEM_KMEMUSED
)
931 .procname
= "kmem_used",
932 .data
= &kmem_alloc_used
,
933 # ifdef HAVE_ATOMIC64_T
934 .maxlen
= sizeof(atomic64_t
),
936 .maxlen
= sizeof(atomic_t
),
937 # endif /* HAVE_ATOMIC64_T */
939 .proc_handler
= &proc_domemused
,
942 CTL_NAME (CTL_KMEM_KMEMMAX
)
943 .procname
= "kmem_max",
944 .data
= &kmem_alloc_max
,
945 .maxlen
= sizeof(unsigned long),
946 .extra1
= &table_min
,
947 .extra2
= &table_max
,
949 .proc_handler
= &proc_doulongvec_minmax
,
952 CTL_NAME (CTL_KMEM_VMEMUSED
)
953 .procname
= "vmem_used",
954 .data
= &vmem_alloc_used
,
955 # ifdef HAVE_ATOMIC64_T
956 .maxlen
= sizeof(atomic64_t
),
958 .maxlen
= sizeof(atomic_t
),
959 # endif /* HAVE_ATOMIC64_T */
961 .proc_handler
= &proc_domemused
,
964 CTL_NAME (CTL_KMEM_VMEMMAX
)
965 .procname
= "vmem_max",
966 .data
= &vmem_alloc_max
,
967 .maxlen
= sizeof(unsigned long),
968 .extra1
= &table_min
,
969 .extra2
= &table_max
,
971 .proc_handler
= &proc_doulongvec_minmax
,
974 CTL_NAME (CTL_KMEM_SLAB_KMEMTOTAL
)
975 .procname
= "slab_kmem_total",
976 .data
= (void *)(KMC_KMEM
| KMC_TOTAL
),
977 .maxlen
= sizeof(unsigned long),
978 .extra1
= &table_min
,
979 .extra2
= &table_max
,
981 .proc_handler
= &proc_doslab
,
984 CTL_NAME (CTL_KMEM_SLAB_KMEMALLOC
)
985 .procname
= "slab_kmem_alloc",
986 .data
= (void *)(KMC_KMEM
| KMC_ALLOC
),
987 .maxlen
= sizeof(unsigned long),
988 .extra1
= &table_min
,
989 .extra2
= &table_max
,
991 .proc_handler
= &proc_doslab
,
994 CTL_NAME (CTL_KMEM_SLAB_KMEMMAX
)
995 .procname
= "slab_kmem_max",
996 .data
= (void *)(KMC_KMEM
| KMC_MAX
),
997 .maxlen
= sizeof(unsigned long),
998 .extra1
= &table_min
,
999 .extra2
= &table_max
,
1001 .proc_handler
= &proc_doslab
,
1004 CTL_NAME (CTL_KMEM_SLAB_VMEMTOTAL
)
1005 .procname
= "slab_vmem_total",
1006 .data
= (void *)(KMC_VMEM
| KMC_TOTAL
),
1007 .maxlen
= sizeof(unsigned long),
1008 .extra1
= &table_min
,
1009 .extra2
= &table_max
,
1011 .proc_handler
= &proc_doslab
,
1014 CTL_NAME (CTL_KMEM_SLAB_VMEMALLOC
)
1015 .procname
= "slab_vmem_alloc",
1016 .data
= (void *)(KMC_VMEM
| KMC_ALLOC
),
1017 .maxlen
= sizeof(unsigned long),
1018 .extra1
= &table_min
,
1019 .extra2
= &table_max
,
1021 .proc_handler
= &proc_doslab
,
1024 CTL_NAME (CTL_KMEM_SLAB_VMEMMAX
)
1025 .procname
= "slab_vmem_max",
1026 .data
= (void *)(KMC_VMEM
| KMC_MAX
),
1027 .maxlen
= sizeof(unsigned long),
1028 .extra1
= &table_min
,
1029 .extra2
= &table_max
,
1031 .proc_handler
= &proc_doslab
,
1035 #endif /* DEBUG_KMEM */
1037 static struct ctl_table spl_kstat_table
[] = {
1041 static struct ctl_table spl_table
[] = {
1042 /* NB No .strategy entries have been provided since
1043 * sysctl(8) prefers to go via /proc for portability.
1046 CTL_NAME (CTL_VERSION
)
1047 .procname
= "version",
1048 .data
= spl_version
,
1049 .maxlen
= sizeof(spl_version
),
1051 .proc_handler
= &proc_dostring
,
1054 CTL_NAME (CTL_HOSTID
)
1055 .procname
= "hostid",
1056 .data
= &spl_hostid
,
1057 .maxlen
= sizeof(unsigned long),
1059 .proc_handler
= &proc_dohostid
,
1062 CTL_NAME (CTL_HW_SERIAL
)
1063 .procname
= "hw_serial",
1065 .maxlen
= sizeof(hw_serial
),
1067 .proc_handler
= &proc_dostring
,
1069 #ifndef HAVE_KALLSYMS_LOOKUP_NAME
1071 CTL_NAME (CTL_KALLSYMS
)
1072 .procname
= "kallsyms_lookup_name",
1073 .data
= &spl_kallsyms_lookup_name_fn
,
1074 .maxlen
= sizeof(unsigned long),
1076 .proc_handler
= &proc_dokallsyms_lookup_name
,
1081 CTL_NAME (CTL_SPL_DEBUG
)
1082 .procname
= "debug",
1084 .child
= spl_debug_table
,
1088 CTL_NAME (CTL_SPL_VM
)
1091 .child
= spl_vm_table
,
1095 CTL_NAME (CTL_SPL_KMEM
)
1098 .child
= spl_kmem_table
,
1102 CTL_NAME (CTL_SPL_KSTAT
)
1103 .procname
= "kstat",
1105 .child
= spl_kstat_table
,
1110 static struct ctl_table spl_dir
[] = {
1120 static struct ctl_table spl_root
[] = {
1123 .procname
= "kernel",
1136 #ifdef CONFIG_SYSCTL
1137 spl_header
= spl_register_sysctl_table(spl_root
, 0);
1138 if (spl_header
== NULL
)
1140 #endif /* CONFIG_SYSCTL */
1142 proc_spl
= proc_mkdir("spl", NULL
);
1143 if (proc_spl
== NULL
)
1144 SGOTO(out
, rc
= -EUNATCH
);
1147 proc_spl_kmem
= proc_mkdir("kmem", proc_spl
);
1148 if (proc_spl_kmem
== NULL
)
1149 SGOTO(out
, rc
= -EUNATCH
);
1151 proc_spl_kmem_slab
= proc_create_data("slab", 0444,
1152 proc_spl_kmem
, &proc_slab_operations
, NULL
);
1153 if (proc_spl_kmem_slab
== NULL
)
1154 SGOTO(out
, rc
= -EUNATCH
);
1156 #endif /* DEBUG_KMEM */
1158 proc_spl_kstat
= proc_mkdir("kstat", proc_spl
);
1159 if (proc_spl_kstat
== NULL
)
1160 SGOTO(out
, rc
= -EUNATCH
);
1163 remove_proc_entry("kstat", proc_spl
);
1165 remove_proc_entry("slab", proc_spl_kmem
);
1166 remove_proc_entry("kmem", proc_spl
);
1168 remove_proc_entry("spl", NULL
);
1169 #ifdef CONFIG_SYSCTL
1170 spl_unregister_sysctl_table(spl_header
);
1171 #endif /* CONFIG_SYSCTL */
1182 remove_proc_entry("kstat", proc_spl
);
1184 remove_proc_entry("slab", proc_spl_kmem
);
1185 remove_proc_entry("kmem", proc_spl
);
1187 remove_proc_entry("spl", NULL
);
1189 #ifdef CONFIG_SYSCTL
1190 ASSERT(spl_header
!= NULL
);
1191 spl_unregister_sysctl_table(spl_header
);
1192 #endif /* CONFIG_SYSCTL */