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_wr_max_rpcs_in_flight(struct file *file, const char *buffer, unsigned long count, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; struct ptlrpc_request_pool *pool = cli->cl_import->imp_rq_pool; int val, rc; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; if (val < 1 || val > OSC_MAX_RIF_MAX) return -ERANGE; LPROCFS_CLIMP_CHECK(dev); if (pool && val > cli->cl_max_rpcs_in_flight) pool->prp_populate(pool, val-cli->cl_max_rpcs_in_flight); client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_max_rpcs_in_flight = val; client_obd_list_unlock(&cli->cl_loi_list_lock); LPROCFS_CLIMP_EXIT(dev); return count; }
static int mdc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v) { struct obd_device *dev = m->private; struct client_obd *cli = &dev->u.cli; int rc; client_obd_list_lock(&cli->cl_loi_list_lock); rc = seq_printf(m, "%u\n", cli->cl_max_rpcs_in_flight); client_obd_list_unlock(&cli->cl_loi_list_lock); return rc; }
static int mdc_rd_max_rpcs_in_flight(char *page, char **start, off_t off, int count, int *eof, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; int rc; client_obd_list_lock(&cli->cl_loi_list_lock); rc = snprintf(page, count, "%u\n", cli->cl_max_rpcs_in_flight); client_obd_list_unlock(&cli->cl_loi_list_lock); return rc; }
static int osc_rd_cur_grant_bytes(char *page, char **start, off_t off, int count, int *eof, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; int rc; client_obd_list_lock(&cli->cl_loi_list_lock); rc = snprintf(page, count, "%lu\n", cli->cl_avail_grant); client_obd_list_unlock(&cli->cl_loi_list_lock); return rc; }
static ssize_t max_rpcs_in_flight_show(struct kobject *kobj, struct attribute *attr, char *buf) { int len; struct obd_device *dev = container_of(kobj, struct obd_device, obd_kobj); struct client_obd *cli = &dev->u.cli; client_obd_list_lock(&cli->cl_loi_list_lock); len = sprintf(buf, "%u\n", cli->cl_max_rpcs_in_flight); client_obd_list_unlock(&cli->cl_loi_list_lock); return len; }
static int osc_rd_max_dirty_mb(char *page, char **start, off_t off, int count, int *eof, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; long val; int mult; client_obd_list_lock(&cli->cl_loi_list_lock); val = cli->cl_dirty_max; client_obd_list_unlock(&cli->cl_loi_list_lock); mult = 1 << 20; return lprocfs_read_frac_helper(page, count, val, mult); }
static int mdc_wr_max_rpcs_in_flight(struct file *file, const char *buffer, unsigned long count, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; int val, rc; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; if (val < 1 || val > MDC_MAX_RIF_MAX) return -ERANGE; client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_max_rpcs_in_flight = val; client_obd_list_unlock(&cli->cl_loi_list_lock); return count; }
static ssize_t mdc_max_rpcs_in_flight_seq_write(struct file *file, const char *buffer, size_t count, loff_t *off) { struct obd_device *dev = ((struct seq_file *)file->private_data)->private; struct client_obd *cli = &dev->u.cli; int val, rc; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; if (val < 1 || val > MDC_MAX_RIF_MAX) return -ERANGE; client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_max_rpcs_in_flight = val; client_obd_list_unlock(&cli->cl_loi_list_lock); return count; }
static ssize_t max_rpcs_in_flight_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t count) { struct obd_device *dev = container_of(kobj, struct obd_device, obd_kobj); struct client_obd *cli = &dev->u.cli; int rc; unsigned long val; rc = kstrtoul(buffer, 10, &val); if (rc) return rc; if (val < 1 || val > MDC_MAX_RIF_MAX) return -ERANGE; client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_max_rpcs_in_flight = val; client_obd_list_unlock(&cli->cl_loi_list_lock); return count; }
static int osc_wr_max_pages_per_rpc(struct file *file, const char *buffer, unsigned long count, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; struct obd_connect_data *ocd = &cli->cl_import->imp_connect_data; int val, rc; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; LPROCFS_CLIMP_CHECK(dev); if (val < 1 || val > ocd->ocd_brw_size >> CFS_PAGE_SHIFT) { LPROCFS_CLIMP_EXIT(dev); return -ERANGE; } client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_max_pages_per_rpc = val; client_obd_list_unlock(&cli->cl_loi_list_lock); LPROCFS_CLIMP_EXIT(dev); return count; }
static int osc_wr_max_dirty_mb(struct file *file, const char *buffer, unsigned long count, void *data) { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; int pages_number, mult, rc; mult = 1 << (20 - CFS_PAGE_SHIFT); rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); if (rc) return rc; if (pages_number < 0 || pages_number > OSC_MAX_DIRTY_MB_MAX << (20 - CFS_PAGE_SHIFT) || pages_number > cfs_num_physpages / 4) /* 1/4 of RAM */ return -ERANGE; client_obd_list_lock(&cli->cl_loi_list_lock); cli->cl_dirty_max = (obd_count)(pages_number << CFS_PAGE_SHIFT); osc_wake_cache_waiters(cli); client_obd_list_unlock(&cli->cl_loi_list_lock); return count; }
static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v) { struct timeval now; struct obd_device *dev = seq->private; struct client_obd *cli = &dev->u.cli; unsigned long read_tot = 0, write_tot = 0, read_cum, write_cum; int i; cfs_gettimeofday(&now); client_obd_list_lock(&cli->cl_loi_list_lock); seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", now.tv_sec, now.tv_usec); seq_printf(seq, "read RPCs in flight: %d\n", cli->cl_r_in_flight); seq_printf(seq, "write RPCs in flight: %d\n", cli->cl_w_in_flight); seq_printf(seq, "pending write pages: %d\n", cli->cl_pending_w_pages); seq_printf(seq, "pending read pages: %d\n", cli->cl_pending_r_pages); seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); seq_printf(seq, "pages per rpc rpcs %% cum %% |"); seq_printf(seq, " rpcs %% cum %%\n"); read_tot = lprocfs_oh_sum(&cli->cl_read_page_hist); write_tot = lprocfs_oh_sum(&cli->cl_write_page_hist); read_cum = 0; write_cum = 0; for (i = 0; i < OBD_HIST_MAX; i++) { unsigned long r = cli->cl_read_page_hist.oh_buckets[i]; unsigned long w = cli->cl_write_page_hist.oh_buckets[i]; read_cum += r; write_cum += w; seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", 1 << i, r, pct(r, read_tot), pct(read_cum, read_tot), w, pct(w, write_tot), pct(write_cum, write_tot)); if (read_cum == read_tot && write_cum == write_tot) break; } seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); seq_printf(seq, "rpcs in flight rpcs %% cum %% |"); seq_printf(seq, " rpcs %% cum %%\n"); read_tot = lprocfs_oh_sum(&cli->cl_read_rpc_hist); write_tot = lprocfs_oh_sum(&cli->cl_write_rpc_hist); read_cum = 0; write_cum = 0; for (i = 0; i < OBD_HIST_MAX; i++) { unsigned long r = cli->cl_read_rpc_hist.oh_buckets[i]; unsigned long w = cli->cl_write_rpc_hist.oh_buckets[i]; read_cum += r; write_cum += w; seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", i, r, pct(r, read_tot), pct(read_cum, read_tot), w, pct(w, write_tot), pct(write_cum, write_tot)); if (read_cum == read_tot && write_cum == write_tot) break; } seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); seq_printf(seq, "offset rpcs %% cum %% |"); seq_printf(seq, " rpcs %% cum %%\n"); read_tot = lprocfs_oh_sum(&cli->cl_read_offset_hist); write_tot = lprocfs_oh_sum(&cli->cl_write_offset_hist); read_cum = 0; write_cum = 0; for (i = 0; i < OBD_HIST_MAX; i++) { unsigned long r = cli->cl_read_offset_hist.oh_buckets[i]; unsigned long w = cli->cl_write_offset_hist.oh_buckets[i]; read_cum += r; write_cum += w; seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", (i == 0) ? 0 : 1 << (i - 1), r, pct(r, read_tot), pct(read_cum, read_tot), w, pct(w, write_tot), pct(write_cum, write_tot)); if (read_cum == read_tot && write_cum == write_tot) break; } client_obd_list_unlock(&cli->cl_loi_list_lock); return 0; }