X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Flprocfs_status.h;h=acf1bc0887ec6b8881999889f1ea34312baa27e6;hp=b1418403d35b6160cadf19d2acf0b0d300c9981a;hb=6bbae72c6900dbd2b853d716bc4d456dc7fd586e;hpb=4594c6656d3224eb4f8eff100a2320df53c05a8f diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index b141840..acf1bc0 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -23,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2016, Intel Corporation. + * Copyright (c) 2011, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -46,7 +46,7 @@ #include #include -#include +#include struct lprocfs_vars { const char *name; @@ -58,6 +58,27 @@ struct lprocfs_vars { mode_t proc_mode; }; +static inline u32 pct(s64 a, s64 b) +{ + return b ? a * 100 / b : 0; +} + +/** + * Append a space separated list of current set flags to str. + */ +#define flag2str(port, flag) \ + do { \ + if ((port)->port##_##flag) { \ + seq_printf(m, "%s" #flag, first ? "" : ", "); \ + first = false; \ + } \ + } while (0) + +void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, __u64 flags2, + const char *sep); +void obd_connect_data_seqprint(struct seq_file *m, + struct obd_connect_data *ocd); + /* if we find more consumers this could be generalized */ #define OBD_HIST_MAX 32 struct obd_histogram { @@ -337,28 +358,29 @@ enum { #define PTLRPC_FIRST_CNTR PTLRPC_REQWAIT_CNTR enum lprocfs_extra_opc { - LDLM_GLIMPSE_ENQUEUE = 0, - LDLM_PLAIN_ENQUEUE, - LDLM_EXTENT_ENQUEUE, - LDLM_FLOCK_ENQUEUE, - LDLM_IBITS_ENQUEUE, - MDS_REINT_SETATTR, - MDS_REINT_CREATE, - MDS_REINT_LINK, - MDS_REINT_UNLINK, - MDS_REINT_RENAME, - MDS_REINT_OPEN, - MDS_REINT_SETXATTR, - BRW_READ_BYTES, - BRW_WRITE_BYTES, - EXTRA_LAST_OPC + LDLM_GLIMPSE_ENQUEUE = 0, + LDLM_PLAIN_ENQUEUE, + LDLM_EXTENT_ENQUEUE, + LDLM_FLOCK_ENQUEUE, + LDLM_IBITS_ENQUEUE, + MDS_REINT_SETATTR, + MDS_REINT_CREATE, + MDS_REINT_LINK, + MDS_REINT_UNLINK, + MDS_REINT_RENAME, + MDS_REINT_OPEN, + MDS_REINT_SETXATTR, + MDS_REINT_RESYNC, + BRW_READ_BYTES, + BRW_WRITE_BYTES, + EXTRA_LAST_OPC }; #define EXTRA_FIRST_OPC LDLM_GLIMPSE_ENQUEUE /* class_obd.c */ extern struct proc_dir_entry *proc_lustre_root; extern struct dentry *debugfs_lustre_root; -extern struct kobject *lustre_kobj; +extern struct kset *lustre_kset; struct obd_device; struct obd_histogram; @@ -375,7 +397,7 @@ struct obd_job_stats { struct list_head ojs_list; /* list of job_stat structs */ rwlock_t ojs_lock; /* protect ojs_list/js_list */ unsigned int ojs_cleanup_interval;/* seconds before expiry */ - time_t ojs_last_cleanup; /* previous cleanup time */ + time64_t ojs_last_cleanup; /* previous cleanup time */ cntr_init_callback ojs_cntr_init_fn;/* lprocfs_stats initializer */ unsigned short ojs_cntr_num; /* number of stats in struct */ bool ojs_cleaning; /* currently expiring stats */ @@ -451,13 +473,9 @@ extern struct lprocfs_stats * lprocfs_alloc_stats(unsigned int num, enum lprocfs_stats_flags flags); extern void lprocfs_clear_stats(struct lprocfs_stats *stats); extern void lprocfs_free_stats(struct lprocfs_stats **stats); -extern void lprocfs_init_ops_stats(int num_private_stats, - struct lprocfs_stats *stats); -extern void lprocfs_init_mps_stats(int num_private_stats, - struct lprocfs_stats *stats); extern void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats); extern int lprocfs_alloc_obd_stats(struct obd_device *obddev, - unsigned int num_private_stats); + unsigned int num_stats); extern int lprocfs_alloc_md_stats(struct obd_device *obddev, unsigned int num_private_stats); extern void lprocfs_counter_init(struct lprocfs_stats *stats, int index, @@ -472,10 +490,14 @@ extern int lprocfs_add_clear_entry(struct obd_device * obd, #ifdef HAVE_SERVER_SUPPORT extern int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *peer_nid); extern int lprocfs_exp_cleanup(struct obd_export *exp); +struct dentry *ldebugfs_add_symlink(const char *name, const char *target, + const char *format, ...); #else static inline int lprocfs_exp_cleanup(struct obd_export *exp) { return 0; } #endif +struct dentry *ldebugfs_add_simple(struct dentry *root, char *name, void *data, + const struct file_operations *fops); extern struct proc_dir_entry * lprocfs_add_simple(struct proc_dir_entry *root, char *name, void *data, const struct file_operations *fops); @@ -535,16 +557,14 @@ static inline int LPROCFS_ENTRY_CHECK(struct inode *inode) { return 0; } #endif -extern int lprocfs_obd_setup(struct obd_device *dev, bool uuid_only); +extern int lprocfs_obd_setup(struct obd_device *obd, bool uuid_only); extern int lprocfs_obd_cleanup(struct obd_device *obd); #ifdef HAVE_SERVER_SUPPORT extern const struct file_operations lprocfs_evict_client_fops; #endif -extern int ldebugfs_seq_create(struct dentry *parent, const char *name, - umode_t mode, - const struct file_operations *seq_fops, - void *data); +int ldebugfs_seq_create(struct dentry *parent, const char *name, umode_t mode, + const struct file_operations *seq_fops, void *data); extern int lprocfs_seq_create(struct proc_dir_entry *parent, const char *name, mode_t mode, const struct file_operations *seq_fops, @@ -555,21 +575,9 @@ extern int lprocfs_obd_seq_create(struct obd_device *dev, const char *name, void *data); /* Generic callbacks */ -extern int lprocfs_u64_seq_show(struct seq_file *m, void *data); -extern int lprocfs_atomic_seq_show(struct seq_file *m, void *data); -extern ssize_t lprocfs_atomic_seq_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *off); -extern int lprocfs_uint_seq_show(struct seq_file *m, void *data); -extern ssize_t lprocfs_uint_seq_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *off); -extern int lprocfs_wr_uint(struct file *file, const char __user *buffer, - unsigned long count, void *data); extern int lprocfs_uuid_seq_show(struct seq_file *m, void *data); -extern int lprocfs_name_seq_show(struct seq_file *m, void *data); extern int lprocfs_server_uuid_seq_show(struct seq_file *m, void *data); -extern int lprocfs_conn_uuid_seq_show(struct seq_file *m, void *data); +ssize_t conn_uuid_show(struct kobject *kobj, struct attribute *attr, char *buf); extern int lprocfs_import_seq_show(struct seq_file *m, void *data); extern int lprocfs_state_seq_show(struct seq_file *m, void *data); extern int lprocfs_connect_flags_seq_show(struct seq_file *m, void *data); @@ -588,9 +596,11 @@ extern ssize_t lprocfs_evict_client_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off); #endif -extern ssize_t -lprocfs_ping_seq_write(struct file *file, const char __user *buffer, - size_t count, loff_t *off); +ssize_t ping_store(struct kobject *kobj, struct attribute *attr, + const char *buffer, size_t count); +ssize_t ping_show(struct kobject *kobj, struct attribute *attr, + char *buffer); + extern ssize_t lprocfs_import_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off); @@ -602,11 +612,11 @@ lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer, extern int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult); extern int lprocfs_read_frac_helper(char *buffer, unsigned long count, long val, int mult); -extern int lprocfs_str_to_s64(const char __user *buffer, unsigned long count, - __s64 *val); extern int lprocfs_str_with_units_to_s64(const char __user *buffer, unsigned long count, __s64 *val, char defunit); + +char *lprocfs_strnstr(const char *s1, const char *s2, size_t len); char *lprocfs_find_named_value(const char *buffer, const char *name, size_t *count); void lprocfs_oh_tally(struct obd_histogram *oh, unsigned int value); @@ -653,10 +663,75 @@ extern int lprocfs_seq_release(struct inode *, struct file *); #define LPROCFS_CLIMP_EXIT(obd) \ up_read(&(obd)->u.cli.cl_sem); +/* write the name##_seq_show function, call LDEBUGFS_SEQ_FOPS_RO for read-only + * debugfs entries; otherwise, you will define name##_seq_write function also + * for a read-write debugfs entry, and then call LDEBUGFS_SEQ_FOPS instead. + * Finally, call ldebugfs_seq_create(obd, filename, 0444, &name#_fops, data); + */ +#define __LDEBUGFS_SEQ_FOPS(name, custom_seq_write) \ +static int name##_single_open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, name##_seq_show, inode->i_private); \ +} \ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_single_open, \ + .read = seq_read, \ + .write = custom_seq_write, \ + .llseek = seq_lseek, \ + .release = single_release, \ +} + +#define LDEBUGFS_SEQ_FOPS_RO(name) __LDEBUGFS_SEQ_FOPS(name, NULL) +#define LDEBUGFS_SEQ_FOPS(name) __LDEBUGFS_SEQ_FOPS(name, \ + name##_seq_write) + +#define LDEBUGFS_SEQ_FOPS_RO_TYPE(name, type) \ + static int name##_##type##_seq_show(struct seq_file *m, void *v)\ + { \ + return lprocfs_##type##_seq_show(m, m->private); \ + } \ + LDEBUGFS_SEQ_FOPS_RO(name##_##type) + +#define LDEBUGFS_SEQ_FOPS_RW_TYPE(name, type) \ + static int name##_##type##_seq_show(struct seq_file *m, void *v)\ + { \ + return lprocfs_##type##_seq_show(m, m->private); \ + } \ + static ssize_t name##_##type##_seq_write(struct file *file, \ + const char __user *buffer, size_t count, \ + loff_t *off) \ + { \ + struct seq_file *seq = file->private_data; \ + return ldebugfs_##type##_seq_write(file, buffer, count, \ + seq->private); \ + } \ + LDEBUGFS_SEQ_FOPS(name##_##type); + +#define LDEBUGFS_FOPS_WR_ONLY(name, type) \ + static ssize_t name##_##type##_write(struct file *file, \ + const char __user *buffer, size_t count, \ + loff_t *off) \ + { \ + return ldebugfs_##type##_seq_write(file, buffer, count, \ + off); \ + } \ + static int name##_##type##_open(struct inode *inode, \ + struct file *file) \ + { \ + return single_open(file, NULL, inode->i_private); \ + } \ + static const struct file_operations name##_##type##_fops = { \ + .open = name##_##type##_open, \ + .write = name##_##type##_write, \ + .release = single_release, \ + }; + /* write the name##_seq_show function, call LPROC_SEQ_FOPS_RO for read-only - proc entries; otherwise, you will define name##_seq_write function also for - a read-write proc entry, and then call LPROC_SEQ_SEQ instead. Finally, - call lprocfs_obd_seq_create(obd, filename, 0444, &name#_fops, data); */ + * proc entries; otherwise, you will define name##_seq_write function also for + * a read-write proc entry, and then call LPROC_SEQ_FOPS instead. Finally, + * call ldebugfs_obd_seq_create(obd, filename, 0444, &name#_fops, data); + */ #define __LPROC_SEQ_FOPS(name, custom_seq_write) \ static int name##_single_open(struct inode *inode, struct file *file) \ { \ @@ -667,7 +742,8 @@ static int name##_single_open(struct inode *inode, struct file *file) \ return rc; \ \ return single_open(file, name##_seq_show, \ - inode->i_private ? : PDE_DATA(inode)); \ + inode->i_private ? inode->i_private : \ + PDE_DATA(inode)); \ } \ static const struct file_operations name##_fops = { \ .owner = THIS_MODULE, \ @@ -699,11 +775,11 @@ static const struct file_operations name##_fops = { \ { \ struct seq_file *seq = file->private_data; \ return lprocfs_##type##_seq_write(file, buffer, \ - count, seq->private); \ + count, seq->private); \ } \ LPROC_SEQ_FOPS(name##_##type); -#define LPROC_SEQ_FOPS_WO_TYPE(name, type) \ +#define LPROC_SEQ_FOPS_WR_ONLY(name, type) \ static ssize_t name##_##type##_write(struct file *file, \ const char __user *buffer, size_t count, \ loff_t *off) \ @@ -713,7 +789,8 @@ static const struct file_operations name##_fops = { \ static int name##_##type##_open(struct inode *inode, struct file *file)\ { \ return single_open(file, NULL, \ - inode->i_private ? : PDE_DATA(inode));\ + inode->i_private ? inode->i_private : \ + PDE_DATA(inode)); \ } \ static const struct file_operations name##_##type##_fops = { \ .open = name##_##type##_open, \ @@ -732,6 +809,7 @@ struct lustre_attr { #define LUSTRE_ATTR(name, mode, show, store) \ static struct lustre_attr lustre_attr_##name = __ATTR(name, mode, show, store) +#define LUSTRE_WO_ATTR(name) LUSTRE_ATTR(name, 0200, NULL, name##_store) #define LUSTRE_RO_ATTR(name) LUSTRE_ATTR(name, 0444, name##_show, NULL) #define LUSTRE_RW_ATTR(name) LUSTRE_ATTR(name, 0644, name##_show, name##_store) @@ -773,6 +851,14 @@ int lprocfs_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *data); ssize_t lprocfs_obd_max_pages_per_rpc_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off); +int lprocfs_obd_short_io_bytes_seq_show(struct seq_file *m, void *data); +ssize_t lprocfs_obd_short_io_bytes_seq_write(struct file *file, + const char __user *buffer, + size_t count, loff_t *off); +ssize_t short_io_bytes_show(struct kobject *kobj, struct attribute *attr, + char *buf); +ssize_t short_io_bytes_store(struct kobject *kobj, struct attribute *attr, + const char *buffer, size_t count); struct root_squash_info; int lprocfs_wr_root_squash(const char __user *buffer, unsigned long count, @@ -817,16 +903,10 @@ static inline int lprocfs_register_stats(struct proc_dir_entry *root, const char *name, struct lprocfs_stats *stats) { return 0; } -static inline void lprocfs_init_ops_stats(int num_private_stats, - struct lprocfs_stats *stats) -{ return; } -static inline void lprocfs_init_mps_stats(int num_private_stats, - struct lprocfs_stats *stats) -{ return; } static inline void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats) { return; } static inline int lprocfs_alloc_obd_stats(struct obd_device *obddev, - unsigned int num_private_stats) + unsigned int num_stats) { return 0; } static inline int lprocfs_alloc_md_stats(struct obd_device *obddev, unsigned int num_private_stats) @@ -881,12 +961,8 @@ static inline int lprocfs_obd_cleanup(struct obd_device *dev) { return 0; } static inline int lprocfs_uuid_seq_show(struct seq_file *m, void *data) { return 0; } -static inline int lprocfs_name_seq_show(struct seq_file *m, void *data) -{ return 0; } static inline int lprocfs_server_seq_show(struct seq_file *m, void *data) { return 0; } -static inline int lprocfs_conn_uuid_seq_show(struct seq_file *m, void *data) -{ return 0; } static inline int lprocfs_import_seq_show(struct seq_file *m, void *data) { return 0; } static inline int lprocfs_state_seq_show(struct seq_file *m, void *data) @@ -973,7 +1049,7 @@ u64 lprocfs_stats_collector(struct lprocfs_stats *stats, int idx, #define LPROC_SEQ_FOPS(name) #define LPROC_SEQ_FOPS_RO_TYPE(name, type) #define LPROC_SEQ_FOPS_RW_TYPE(name, type) -#define LPROC_SEQ_FOPS_WO_TYPE(name, type) +#define LPROC_SEQ_FOPS_WR_ONLY(name, type) /* lprocfs_jobstats.c */ static inline