X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosc%2Flproc_osc.c;h=962cbd96bb20d8de130b185cb229b27e8f65abdc;hp=7aa7b2cf885d0cee8fed7135d1e26708a57aab59;hb=988491cded8a0d953a1b25d05fdc706fa9f9e48c;hpb=9b3a6b6f5bd13e79c6a5509f6032211549df004f diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c index 7aa7b2c..962cbd9 100644 --- a/lustre/osc/lproc_osc.c +++ b/lustre/osc/lproc_osc.c @@ -224,6 +224,70 @@ static int osc_rd_cur_grant_bytes(char *page, char **start, off_t off, return rc; } +static int osc_wr_cur_grant_bytes(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct obd_device *obd = data; + struct client_obd *cli = &obd->u.cli; + int rc; + __u64 val; + + if (obd == NULL) + return 0; + + rc = lprocfs_write_u64_helper(buffer, count, &val); + if (rc) + return rc; + + /* this is only for shrinking grant */ + client_obd_list_lock(&cli->cl_loi_list_lock); + if (val >= cli->cl_avail_grant) { + client_obd_list_unlock(&cli->cl_loi_list_lock); + return 0; + } + client_obd_list_unlock(&cli->cl_loi_list_lock); + + LPROCFS_CLIMP_CHECK(obd); + if (cli->cl_import->imp_state == LUSTRE_IMP_FULL) + rc = osc_shrink_grant_to_target(cli, val); + LPROCFS_CLIMP_EXIT(obd); + if (rc) + return rc; + return count; +} + +static int osc_rd_grant_shrink_interval(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct obd_device *obd = data; + + if (obd == NULL) + return 0; + return snprintf(page, count, "%d\n", + obd->u.cli.cl_grant_shrink_interval); +} + +static int osc_wr_grant_shrink_interval(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct obd_device *obd = data; + int val, rc; + + if (obd == NULL) + return 0; + + rc = lprocfs_write_helper(buffer, count, &val); + if (rc) + return rc; + + if (val <= 0) + return -ERANGE; + + obd->u.cli.cl_grant_shrink_interval = val; + + return count; +} + static int osc_rd_create_count(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -479,6 +543,44 @@ static int osc_wr_resend_count(struct file *file, const char *buffer, return count; } +static int osc_rd_contention_seconds(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct obd_device *obd = data; + struct osc_device *od = obd2osc_dev(obd); + + return snprintf(page, count, "%u\n", od->od_contention_time); +} + +static int osc_wr_contention_seconds(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct obd_device *obd = data; + struct osc_device *od = obd2osc_dev(obd); + + return lprocfs_write_helper(buffer, count, &od->od_contention_time) ?: + count; +} + +static int osc_rd_lockless_truncate(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct obd_device *obd = data; + struct osc_device *od = obd2osc_dev(obd); + + return snprintf(page, count, "%u\n", od->od_lockless_truncate); +} + +static int osc_wr_lockless_truncate(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct obd_device *obd = data; + struct osc_device *od = obd2osc_dev(obd); + + return lprocfs_write_helper(buffer, count, &od->od_lockless_truncate) ?: + count; +} + static struct lprocfs_vars lprocfs_osc_obd_vars[] = { { "uuid", lprocfs_rd_uuid, 0, 0 }, { "ping", 0, lprocfs_wr_ping, 0, 0, 0222 }, @@ -500,7 +602,10 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = { osc_wr_max_rpcs_in_flight, 0 }, { "max_dirty_mb", osc_rd_max_dirty_mb, osc_wr_max_dirty_mb, 0 }, { "cur_dirty_bytes", osc_rd_cur_dirty_bytes, 0, 0 }, - { "cur_grant_bytes", osc_rd_cur_grant_bytes, 0, 0 }, + { "cur_grant_bytes", osc_rd_cur_grant_bytes, + osc_wr_cur_grant_bytes, 0 }, + { "grant_shrink_interval", osc_rd_grant_shrink_interval, + osc_wr_grant_shrink_interval, 0 }, { "create_count", osc_rd_create_count, osc_wr_create_count, 0 }, { "max_create_count", osc_rd_max_create_count, osc_wr_max_create_count, 0}, @@ -510,6 +615,12 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = { { "checksum_type", osc_rd_checksum_type, osc_wd_checksum_type, 0 }, { "resend_count", osc_rd_resend_count, osc_wr_resend_count, 0}, { "timeouts", lprocfs_rd_timeouts, 0, 0 }, + { "contention_seconds", osc_rd_contention_seconds, + osc_wr_contention_seconds, 0 }, + { "lockless_truncate", osc_rd_lockless_truncate, + osc_wr_lockless_truncate, 0 }, + { "import", lprocfs_rd_import, 0, 0 }, + { "state", lprocfs_rd_state, 0, 0 }, { 0 } }; @@ -636,10 +747,48 @@ static ssize_t osc_rpc_stats_seq_write(struct file *file, const char *buf, LPROC_SEQ_FOPS(osc_rpc_stats); +static int osc_stats_seq_show(struct seq_file *seq, void *v) +{ + struct timeval now; + struct obd_device *dev = seq->private; + struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; + + do_gettimeofday(&now); + + seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", + now.tv_sec, now.tv_usec); + seq_printf(seq, "lockless_write_bytes\t\t"LPU64"\n", + stats->os_lockless_writes); + seq_printf(seq, "lockless_read_bytes\t\t"LPU64"\n", + stats->os_lockless_reads); + seq_printf(seq, "lockless_truncate\t\t"LPU64"\n", + stats->os_lockless_truncates); + return 0; +} + +static ssize_t osc_stats_seq_write(struct file *file, const char *buf, + size_t len, loff_t *off) +{ + struct seq_file *seq = file->private_data; + struct obd_device *dev = seq->private; + struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; + + memset(stats, 0, sizeof(*stats)); + return len; +} + +LPROC_SEQ_FOPS(osc_stats); + int lproc_osc_attach_seqstat(struct obd_device *dev) { - return lprocfs_obd_seq_create(dev, "rpc_stats", 0444, - &osc_rpc_stats_fops, dev); + int rc; + + rc = lprocfs_seq_create(dev->obd_proc_entry, "osc_stats", 0444, + &osc_stats_fops, dev); + if (rc == 0) + rc = lprocfs_obd_seq_create(dev, "rpc_stats", 0444, + &osc_rpc_stats_fops, dev); + return rc; } void lprocfs_osc_init_vars(struct lprocfs_static_vars *lvars)