diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/spl/sys/Makefile.am | 1 | ||||
-rw-r--r-- | include/spl/sys/kstat.h | 20 | ||||
-rw-r--r-- | include/spl/sys/procfs_list.h | 71 | ||||
-rw-r--r-- | include/sys/spa.h | 23 | ||||
-rw-r--r-- | include/sys/zfs_context.h | 32 | ||||
-rw-r--r-- | include/sys/zfs_debug.h | 7 |
6 files changed, 133 insertions, 21 deletions
diff --git a/include/spl/sys/Makefile.am b/include/spl/sys/Makefile.am index d58ed0e20..e596ff373 100644 --- a/include/spl/sys/Makefile.am +++ b/include/spl/sys/Makefile.am @@ -28,6 +28,7 @@ KERNEL_H = \ $(top_srcdir)/include/spl/sys/param.h \ $(top_srcdir)/include/spl/sys/processor.h \ $(top_srcdir)/include/spl/sys/proc.h \ + $(top_srcdir)/include/spl/sys/procfs_list.h \ $(top_srcdir)/include/spl/sys/random.h \ $(top_srcdir)/include/spl/sys/rwlock.h \ $(top_srcdir)/include/spl/sys/shrinker.h \ diff --git a/include/spl/sys/kstat.h b/include/spl/sys/kstat.h index f197ce455..53274d8f5 100644 --- a/include/spl/sys/kstat.h +++ b/include/spl/sys/kstat.h @@ -98,30 +98,34 @@ typedef struct kstat_raw_ops { void *(*addr)(kstat_t *ksp, loff_t index); } kstat_raw_ops_t; +typedef struct kstat_proc_entry { + char kpe_name[KSTAT_STRLEN+1]; /* kstat name */ + char kpe_module[KSTAT_STRLEN+1]; /* provider module name */ + kstat_module_t *kpe_owner; /* kstat module linkage */ + struct list_head kpe_list; /* kstat linkage */ + struct proc_dir_entry *kpe_proc; /* procfs entry */ +} kstat_proc_entry_t; + struct kstat_s { int ks_magic; /* magic value */ kid_t ks_kid; /* unique kstat ID */ hrtime_t ks_crtime; /* creation time */ hrtime_t ks_snaptime; /* last access time */ - char ks_module[KSTAT_STRLEN+1]; /* provider module name */ int ks_instance; /* provider module instance */ - char ks_name[KSTAT_STRLEN+1]; /* kstat name */ char ks_class[KSTAT_STRLEN+1]; /* kstat class */ uchar_t ks_type; /* kstat data type */ uchar_t ks_flags; /* kstat flags */ void *ks_data; /* kstat type-specific data */ uint_t ks_ndata; /* # of data records */ size_t ks_data_size; /* size of kstat data section */ - struct proc_dir_entry *ks_proc; /* proc linkage */ kstat_update_t *ks_update; /* dynamic updates */ void *ks_private; /* private data */ kmutex_t ks_private_lock; /* kstat private data lock */ kmutex_t *ks_lock; /* kstat data lock */ - struct list_head ks_list; /* kstat linkage */ - kstat_module_t *ks_owner; /* kstat module linkage */ kstat_raw_ops_t ks_raw_ops; /* ops table for raw type */ char *ks_raw_buf; /* buf used for raw ops */ size_t ks_raw_bufsize; /* size of raw ops buffer */ + kstat_proc_entry_t ks_proc; /* data for procfs entry */ }; typedef struct kstat_named_s { @@ -189,6 +193,12 @@ extern kstat_t *__kstat_create(const char *ks_module, int ks_instance, const char *ks_name, const char *ks_class, uchar_t ks_type, uint_t ks_ndata, uchar_t ks_flags); +extern void kstat_proc_entry_init(kstat_proc_entry_t *kpep, + const char *module, const char *name); +extern void kstat_proc_entry_delete(kstat_proc_entry_t *kpep); +extern void kstat_proc_entry_install(kstat_proc_entry_t *kpep, + const struct file_operations *file_ops, void *data); + extern void __kstat_install(kstat_t *ksp); extern void __kstat_delete(kstat_t *ksp); extern void kstat_waitq_enter(kstat_io_t *); diff --git a/include/spl/sys/procfs_list.h b/include/spl/sys/procfs_list.h new file mode 100644 index 000000000..cbcb4bcff --- /dev/null +++ b/include/spl/sys/procfs_list.h @@ -0,0 +1,71 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2018 by Delphix. All rights reserved. + */ + +#ifndef _SPL_PROCFS_LIST_H +#define _SPL_PROCFS_LIST_H + +#include <sys/kstat.h> +#include <sys/mutex.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> + +typedef struct procfs_list procfs_list_t; +struct procfs_list { + /* Accessed only by user of a procfs_list */ + void *pl_private; + + /* + * Accessed both by user of a procfs_list and by procfs_list + * implementation + */ + kmutex_t pl_lock; + list_t pl_list; + + /* Accessed only by procfs_list implementation */ + uint64_t pl_next_id; + int (*pl_show)(struct seq_file *f, void *p); + int (*pl_show_header)(struct seq_file *f); + int (*pl_clear)(procfs_list_t *procfs_list); + size_t pl_node_offset; + kstat_proc_entry_t pl_kstat_entry; +}; + +typedef struct procfs_list_node { + list_node_t pln_link; + uint64_t pln_id; +} procfs_list_node_t; + +void procfs_list_install(const char *module, + const char *name, + procfs_list_t *procfs_list, + int (*show)(struct seq_file *f, void *p), + int (*show_header)(struct seq_file *f), + int (*clear)(procfs_list_t *procfs_list), + size_t procfs_list_node_off); +void procfs_list_uninstall(procfs_list_t *procfs_list); +void procfs_list_destroy(procfs_list_t *procfs_list); + +void procfs_list_add(procfs_list_t *procfs_list, void *p); + +#endif /* _SPL_PROCFS_LIST_H */ diff --git a/include/sys/spa.h b/include/sys/spa.h index b86c65557..443d835a1 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -863,22 +863,27 @@ extern boolean_t spa_refcount_zero(spa_t *spa); #define SCL_STATE_ALL (SCL_STATE | SCL_L2ARC | SCL_ZIO) /* Historical pool statistics */ -typedef struct spa_stats_history { +typedef struct spa_history_kstat { kmutex_t lock; uint64_t count; uint64_t size; kstat_t *kstat; void *private; list_t list; -} spa_stats_history_t; +} spa_history_kstat_t; + +typedef struct spa_history_list { + uint64_t size; + procfs_list_t procfs_list; +} spa_history_list_t; typedef struct spa_stats { - spa_stats_history_t read_history; - spa_stats_history_t txg_history; - spa_stats_history_t tx_assign_histogram; - spa_stats_history_t io_history; - spa_stats_history_t mmp_history; - spa_stats_history_t state; /* pool state */ + spa_history_list_t read_history; + spa_history_list_t txg_history; + spa_history_kstat_t tx_assign_histogram; + spa_history_kstat_t io_history; + spa_history_list_t mmp_history; + spa_history_kstat_t state; /* pool state */ } spa_stats_t; typedef enum txg_state { @@ -911,7 +916,7 @@ extern void spa_tx_assign_add_nsecs(spa_t *spa, uint64_t nsecs); extern int spa_mmp_history_set_skip(spa_t *spa, uint64_t mmp_kstat_id); extern int spa_mmp_history_set(spa_t *spa, uint64_t mmp_kstat_id, int io_error, hrtime_t duration); -extern void *spa_mmp_history_add(spa_t *spa, uint64_t txg, uint64_t timestamp, +extern void spa_mmp_history_add(spa_t *spa, uint64_t txg, uint64_t timestamp, uint64_t mmp_delay, vdev_t *vd, int label, uint64_t mmp_kstat_id, int error); diff --git a/include/sys/zfs_context.h b/include/sys/zfs_context.h index 6f502897e..11c048c23 100644 --- a/include/sys/zfs_context.h +++ b/include/sys/zfs_context.h @@ -62,6 +62,7 @@ #include <sys/ctype.h> #include <sys/disp.h> #include <sys/trace.h> +#include <sys/procfs_list.h> #include <linux/dcache_compat.h> #include <linux/utsname_compat.h> @@ -352,6 +353,37 @@ extern void kstat_set_raw_ops(kstat_t *ksp, void *(*addr)(kstat_t *ksp, loff_t index)); /* + * procfs list manipulation + */ + +struct seq_file { }; +void seq_printf(struct seq_file *m, const char *fmt, ...); + +typedef struct procfs_list { + void *pl_private; + kmutex_t pl_lock; + list_t pl_list; + uint64_t pl_next_id; + size_t pl_node_offset; +} procfs_list_t; + +typedef struct procfs_list_node { + list_node_t pln_link; + uint64_t pln_id; +} procfs_list_node_t; + +void procfs_list_install(const char *module, + const char *name, + procfs_list_t *procfs_list, + int (*show)(struct seq_file *f, void *p), + int (*show_header)(struct seq_file *f), + int (*clear)(procfs_list_t *procfs_list), + size_t procfs_list_node_off); +void procfs_list_uninstall(procfs_list_t *procfs_list); +void procfs_list_destroy(procfs_list_t *procfs_list); +void procfs_list_add(procfs_list_t *procfs_list, void *p); + +/* * Kernel memory */ #define KM_SLEEP UMEM_NOFAIL diff --git a/include/sys/zfs_debug.h b/include/sys/zfs_debug.h index aa9bfe21f..f3a936ae7 100644 --- a/include/sys/zfs_debug.h +++ b/include/sys/zfs_debug.h @@ -76,13 +76,6 @@ extern void __dprintf(const char *file, const char *func, extern void zfs_panic_recover(const char *fmt, ...); -typedef struct zfs_dbgmsg { - list_node_t zdm_node; - time_t zdm_timestamp; - int zdm_size; - char zdm_msg[1]; /* variable length allocation */ -} zfs_dbgmsg_t; - extern void zfs_dbgmsg_init(void); extern void zfs_dbgmsg_fini(void); |