*
* You should have received a copy of the GNU General Public License
* version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
* Use is subject to license terms.
*
* Author: Niu Yawei <niu@whamcloud.com>
#define DEBUG_SUBSYSTEM S_CLASS
-
#include <obd_class.h>
#include <lprocfs_status.h>
-#include <lustre/lustre_idl.h>
#ifdef CONFIG_PROC_FS
struct hlist_node js_hash; /* hash struct for this jobid */
struct list_head js_list; /* on ojs_list, with ojs_lock */
atomic_t js_refcount; /* num users of this struct */
- char js_jobid[LUSTRE_JOBID_SIZE]; /* job name */
- time_t js_timestamp; /* seconds of most recent stat*/
+ char js_jobid[LUSTRE_JOBID_SIZE]; /* job name + NUL*/
+ time64_t js_timestamp; /* seconds of most recent stat*/
struct lprocfs_stats *js_stats; /* per-job statistics */
struct obd_job_stats *js_jobstats; /* for accessing ojs_lock */
};
struct cfs_hash_bd *bd,
struct hlist_node *hnode, void *data)
{
- time_t oldest_time = *((time_t *)data);
+ time64_t oldest_time = *((time64_t *)data);
struct job_stat *job;
job = hlist_entry(hnode, struct job_stat, js_hash);
*/
static void lprocfs_job_cleanup(struct obd_job_stats *stats, int before)
{
- time_t now = cfs_time_current_sec();
- time_t oldest;
+ time64_t now = ktime_get_real_seconds();
+ time64_t oldest;
if (likely(before >= 0)) {
unsigned int cleanup_interval = stats->ojs_cleanup_interval;
write_lock(&stats->ojs_lock);
stats->ojs_cleaning = false;
- stats->ojs_last_cleanup = cfs_time_current_sec();
+ stats->ojs_last_cleanup = ktime_get_real_seconds();
write_unlock(&stats->ojs_lock);
}
jobs->ojs_cntr_init_fn(job->js_stats);
- memcpy(job->js_jobid, jobid, LUSTRE_JOBID_SIZE);
- job->js_timestamp = cfs_time_current_sec();
+ memcpy(job->js_jobid, jobid, sizeof(job->js_jobid));
+ job->js_timestamp = ktime_get_real_seconds();
job->js_jobstats = jobs;
INIT_HLIST_NODE(&job->js_hash);
INIT_LIST_HEAD(&job->js_list);
found:
LASSERT(stats == job->js_jobstats);
- job->js_timestamp = cfs_time_current_sec();
+ job->js_timestamp = ktime_get_real_seconds();
lprocfs_counter_add(job->js_stats, event, amount);
job_putref(job);
return 0;
}
- seq_printf(p, "- %-16s %s\n", "job_id:", job->js_jobid);
- seq_printf(p, " %-16s %ld\n", "snapshot_time:", job->js_timestamp);
+ /* Replace the non-printable character in jobid with '?', so
+ * that the output of jobid will be confined in single line. */
+ seq_printf(p, "- %-16s ", "job_id:");
+ for (i = 0; i < strlen(job->js_jobid); i++) {
+ if (isprint(job->js_jobid[i]) != 0)
+ seq_putc(p, job->js_jobid[i]);
+ else
+ seq_putc(p, '?');
+ }
+ seq_putc(p, '\n');
+
+ seq_printf(p, " %-16s %lld\n", "snapshot_time:", job->js_timestamp);
s = job->js_stats;
for (i = 0; i < s->ls_num; i++) {
cntr_header = &s->ls_cnt_header[i];
lprocfs_stats_collect(s, i, &ret);
- seq_printf(p, " %s:%.*s { samples: %11"LPF64"u",
+ seq_printf(p, " %s:%.*s { samples: %11llu",
cntr_header->lc_name,
width(cntr_header->lc_name, 15), spaces,
ret.lc_count);
seq_printf(p, ", unit: %5s", cntr_header->lc_units);
if (cntr_header->lc_config & LPROCFS_CNTR_AVGMINMAX) {
- seq_printf(p, ", min:%8"LPF64"u, max:%8"LPF64"u,"
- " sum:%16"LPF64"u",
+ seq_printf(p, ", min:%8llu, max:%8llu,"
+ " sum:%16llu",
ret.lc_count ? ret.lc_min : 0,
ret.lc_count ? ret.lc_max : 0,
ret.lc_count ? ret.lc_sum : 0);
}
if (cntr_header->lc_config & LPROCFS_CNTR_STDDEV) {
- seq_printf(p, ", sumsq: %18"LPF64"u",
+ seq_printf(p, ", sumsq: %18llu",
ret.lc_count ? ret.lc_sumsquare : 0);
}
}
static const struct seq_operations lprocfs_jobstats_seq_sops = {
- start: lprocfs_jobstats_seq_start,
- stop: lprocfs_jobstats_seq_stop,
- next: lprocfs_jobstats_seq_next,
- show: lprocfs_jobstats_seq_show,
+ .start = lprocfs_jobstats_seq_start,
+ .stop = lprocfs_jobstats_seq_stop,
+ .next = lprocfs_jobstats_seq_next,
+ .show = lprocfs_jobstats_seq_show,
};
static int lprocfs_jobstats_seq_open(struct inode *inode, struct file *file)
stats->ojs_cntr_num = cntr_num;
stats->ojs_cntr_init_fn = init_fn;
stats->ojs_cleanup_interval = 600; /* 10 mins by default */
- stats->ojs_last_cleanup = cfs_time_current_sec();
+ stats->ojs_last_cleanup = ktime_get_real_seconds();
entry = lprocfs_add_simple(obd->obd_proc_entry, "job_stats", stats,
&lprocfs_jobstats_seq_fops);
RETURN(0);
}
EXPORT_SYMBOL(lprocfs_job_stats_init);
+#endif /* CONFIG_PROC_FS*/
-int lprocfs_job_interval_seq_show(struct seq_file *m, void *data)
+ssize_t job_cleanup_interval_show(struct kobject *kobj, struct attribute *attr,
+ char *buf)
{
- struct obd_device *obd = m->private;
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
struct obd_job_stats *stats;
- if (obd == NULL)
- return -ENODEV;
-
stats = &obd->u.obt.obt_jobstats;
- return seq_printf(m, "%d\n", stats->ojs_cleanup_interval);
+ return scnprintf(buf, PAGE_SIZE, "%d\n", stats->ojs_cleanup_interval);
}
-EXPORT_SYMBOL(lprocfs_job_interval_seq_show);
+EXPORT_SYMBOL(job_cleanup_interval_show);
-ssize_t
-lprocfs_job_interval_seq_write(struct file *file, const char *buffer,
- size_t count, loff_t *off)
+ssize_t job_cleanup_interval_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
{
- struct obd_device *obd;
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
struct obd_job_stats *stats;
- int val, rc;
-
- obd = ((struct seq_file *)file->private_data)->private;
- if (obd == NULL)
- return -ENODEV;
+ unsigned int val;
+ int rc;
stats = &obd->u.obt.obt_jobstats;
- rc = lprocfs_write_helper(buffer, count, &val);
+ rc = kstrtouint(buffer, 0, &val);
if (rc)
return rc;
lprocfs_job_cleanup(stats, stats->ojs_cleanup_interval);
return count;
}
-EXPORT_SYMBOL(lprocfs_job_interval_seq_write);
-#endif /* CONFIG_PROC_FS*/
+EXPORT_SYMBOL(job_cleanup_interval_store);