📄 lproc_llite.c
字号:
rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; if (val) sbi->ll_flags |= (LL_SBI_LLITE_CHECKSUM|LL_SBI_DATA_CHECKSUM); else sbi->ll_flags &= ~(LL_SBI_LLITE_CHECKSUM|LL_SBI_DATA_CHECKSUM); rc = obd_set_info_async(sbi->ll_osc_exp, strlen("checksum"), "checksum", sizeof(val), &val, NULL); if (rc) CWARN("Failed to set OSC checksum flags: %d\n", rc); return count;}static int ll_rd_max_rw_chunk(char *page, char **start, off_t off, int count, int *eof, void *data){ struct super_block *sb = data; return snprintf(page, count, "%lu\n", ll_s2sbi(sb)->ll_max_rw_chunk);}static int ll_wr_max_rw_chunk(struct file *file, const char *buffer, unsigned long count, void *data){ struct super_block *sb = data; int rc, val; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; ll_s2sbi(sb)->ll_max_rw_chunk = val; return count;}static int ll_rd_track_id(char *page, int count, void *data, enum stats_track_type type){ struct super_block *sb = data; if (ll_s2sbi(sb)->ll_stats_track_type == type) { return snprintf(page, count, "%d\n", ll_s2sbi(sb)->ll_stats_track_id); } else if (ll_s2sbi(sb)->ll_stats_track_type == STATS_TRACK_ALL) { return snprintf(page, count, "0 (all)\n"); } else { return snprintf(page, count, "untracked\n"); }}static int ll_wr_track_id(const char *buffer, unsigned long count, void *data, enum stats_track_type type){ struct super_block *sb = data; int rc, pid; rc = lprocfs_write_helper(buffer, count, &pid); if (rc) return rc; ll_s2sbi(sb)->ll_stats_track_id = pid; if (pid == 0) ll_s2sbi(sb)->ll_stats_track_type = STATS_TRACK_ALL; else ll_s2sbi(sb)->ll_stats_track_type = type; lprocfs_clear_stats(ll_s2sbi(sb)->ll_stats); return count;}static int ll_rd_track_pid(char *page, char **start, off_t off, int count, int *eof, void *data){ return (ll_rd_track_id(page, count, data, STATS_TRACK_PID));}static int ll_wr_track_pid(struct file *file, const char *buffer, unsigned long count, void *data){ return (ll_wr_track_id(buffer, count, data, STATS_TRACK_PID));}static int ll_rd_track_ppid(char *page, char **start, off_t off, int count, int *eof, void *data){ return (ll_rd_track_id(page, count, data, STATS_TRACK_PPID));}static int ll_wr_track_ppid(struct file *file, const char *buffer, unsigned long count, void *data){ return (ll_wr_track_id(buffer, count, data, STATS_TRACK_PPID));}static int ll_rd_track_gid(char *page, char **start, off_t off, int count, int *eof, void *data){ return (ll_rd_track_id(page, count, data, STATS_TRACK_GID));}static int ll_wr_track_gid(struct file *file, const char *buffer, unsigned long count, void *data){ return (ll_wr_track_id(buffer, count, data, STATS_TRACK_GID));}static int ll_rd_contention_time(char *page, char **start, off_t off, int count, int *eof, void *data){ struct super_block *sb = data; *eof = 1; return snprintf(page, count, "%u\n", ll_s2sbi(sb)->ll_contention_time);}static int ll_wr_contention_time(struct file *file, const char *buffer, unsigned long count, void *data){ struct super_block *sb = data; struct ll_sb_info *sbi = ll_s2sbi(sb); return lprocfs_write_helper(buffer, count,&sbi->ll_contention_time) ?: count;}static int ll_rd_statahead_max(char *page, char **start, off_t off, int count, int *eof, void *data){ struct super_block *sb = data; struct ll_sb_info *sbi = ll_s2sbi(sb); return snprintf(page, count, "%u\n", sbi->ll_sa_max);}static int ll_wr_statahead_max(struct file *file, const char *buffer, unsigned long count, void *data){ struct super_block *sb = data; struct ll_sb_info *sbi = ll_s2sbi(sb); int val, rc; rc = lprocfs_write_helper(buffer, count, &val); if (rc) return rc; if (val >= 0 && val <= LL_SA_RPC_MAX) sbi->ll_sa_max = val; else CERROR("Bad statahead_max value %d. Valid values are in the " "range [0, %d]\n", val, LL_SA_RPC_MAX); return count;}static int ll_rd_statahead_stats(char *page, char **start, off_t off, int count, int *eof, void *data){ struct super_block *sb = data; struct ll_sb_info *sbi = ll_s2sbi(sb); return snprintf(page, count, "statahead wrong: %u\n" "statahead total: %u\n" "ls blocked: %llu\n" "ls cached: %llu\n" "hit count: %llu\n" "miss count: %llu\n", sbi->ll_sa_wrong, sbi->ll_sa_total, sbi->ll_sa_blocked, sbi->ll_sa_cached, sbi->ll_sa_hit, sbi->ll_sa_miss);}static struct lprocfs_vars lprocfs_llite_obd_vars[] = { { "uuid", ll_rd_sb_uuid, 0, 0 }, //{ "mntpt_path", ll_rd_path, 0, 0 }, { "fstype", ll_rd_fstype, 0, 0 }, { "blocksize", ll_rd_blksize, 0, 0 }, { "kbytestotal", ll_rd_kbytestotal, 0, 0 }, { "kbytesfree", ll_rd_kbytesfree, 0, 0 }, { "kbytesavail", ll_rd_kbytesavail, 0, 0 }, { "filestotal", ll_rd_filestotal, 0, 0 }, { "filesfree", ll_rd_filesfree, 0, 0 }, //{ "filegroups", lprocfs_rd_filegroups, 0, 0 }, { "max_read_ahead_mb", ll_rd_max_readahead_mb, ll_wr_max_readahead_mb, 0 }, { "max_read_ahead_whole_mb", ll_rd_max_read_ahead_whole_mb, ll_wr_max_read_ahead_whole_mb, 0 }, { "max_cached_mb", ll_rd_max_cached_mb, ll_wr_max_cached_mb, 0 }, { "checksum_pages", ll_rd_checksum, ll_wr_checksum, 0 }, { "max_rw_chunk", ll_rd_max_rw_chunk, ll_wr_max_rw_chunk, 0 }, { "stats_track_pid", ll_rd_track_pid, ll_wr_track_pid, 0 }, { "stats_track_ppid", ll_rd_track_ppid, ll_wr_track_ppid, 0 }, { "stats_track_gid", ll_rd_track_gid, ll_wr_track_gid, 0 }, { "contention_seconds", ll_rd_contention_time, ll_wr_contention_time, 0}, { "statahead_max", ll_rd_statahead_max, ll_wr_statahead_max, 0 }, { "statahead_stats", ll_rd_statahead_stats, 0, 0 }, { 0 }};#define MAX_STRING_SIZE 128struct llite_file_opcode { __u32 opcode; __u32 type; const char *opname;} llite_opcode_table[LPROC_LL_FILE_OPCODES] = { /* file operation */ { LPROC_LL_DIRTY_HITS, LPROCFS_TYPE_REGS, "dirty_pages_hits" }, { LPROC_LL_DIRTY_MISSES, LPROCFS_TYPE_REGS, "dirty_pages_misses" }, { LPROC_LL_WB_WRITEPAGE, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "writeback_from_writepage" }, { LPROC_LL_WB_PRESSURE, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "writeback_from_pressure" }, { LPROC_LL_WB_OK, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "writeback_ok_pages" }, { LPROC_LL_WB_FAIL, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "writeback_failed_pages" }, { LPROC_LL_READ_BYTES, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_BYTES, "read_bytes" }, { LPROC_LL_WRITE_BYTES, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_BYTES, "write_bytes" }, { LPROC_LL_BRW_READ, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "brw_read" }, { LPROC_LL_BRW_WRITE, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "brw_write" }, { LPROC_LL_IOCTL, LPROCFS_TYPE_REGS, "ioctl" }, { LPROC_LL_OPEN, LPROCFS_TYPE_REGS, "open" }, { LPROC_LL_RELEASE, LPROCFS_TYPE_REGS, "close" }, { LPROC_LL_MAP, LPROCFS_TYPE_REGS, "mmap" }, { LPROC_LL_LLSEEK, LPROCFS_TYPE_REGS, "seek" }, { LPROC_LL_FSYNC, LPROCFS_TYPE_REGS, "fsync" }, /* inode operation */ { LPROC_LL_SETATTR, LPROCFS_TYPE_REGS, "setattr" }, { LPROC_LL_TRUNC, LPROCFS_TYPE_REGS, "truncate" }, { LPROC_LL_FLOCK, LPROCFS_TYPE_REGS, "flock" },#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) { LPROC_LL_GETATTR, LPROCFS_TYPE_REGS, "getattr" },#else { LPROC_LL_REVALIDATE, LPROCFS_TYPE_REGS, "getattr" },#endif /* special inode operation */ { LPROC_LL_STAFS, LPROCFS_TYPE_REGS, "statfs" }, { LPROC_LL_ALLOC_INODE, LPROCFS_TYPE_REGS, "alloc_inode" }, { LPROC_LL_SETXATTR, LPROCFS_TYPE_REGS, "setxattr" }, { LPROC_LL_GETXATTR, LPROCFS_TYPE_REGS, "getxattr" }, { LPROC_LL_LISTXATTR, LPROCFS_TYPE_REGS, "listxattr" }, { LPROC_LL_REMOVEXATTR, LPROCFS_TYPE_REGS, "removexattr" }, { LPROC_LL_INODE_PERM, LPROCFS_TYPE_REGS, "inode_permission" }, { LPROC_LL_DIRECT_READ, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "direct_read" }, { LPROC_LL_DIRECT_WRITE, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES, "direct_write" }, { LPROC_LL_LOCKLESS_READ, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_BYTES, "lockless_read_bytes" }, { LPROC_LL_LOCKLESS_WRITE, LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_BYTES, "lockless_write_bytes" },};void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, int count){ if (!sbi->ll_stats) return; if (sbi->ll_stats_track_type == STATS_TRACK_ALL) lprocfs_counter_add(sbi->ll_stats, op, count); else if (sbi->ll_stats_track_type == STATS_TRACK_PID && sbi->ll_stats_track_id == current->pid) lprocfs_counter_add(sbi->ll_stats, op, count); else if (sbi->ll_stats_track_type == STATS_TRACK_PPID && sbi->ll_stats_track_id == current->p_pptr->pid) lprocfs_counter_add(sbi->ll_stats, op, count); else if (sbi->ll_stats_track_type == STATS_TRACK_GID && sbi->ll_stats_track_id == current->gid) lprocfs_counter_add(sbi->ll_stats, op, count);}EXPORT_SYMBOL(ll_stats_ops_tally);int lprocfs_register_mountpoint(struct proc_dir_entry *parent, struct super_block *sb, char *osc, char *mdc){ struct lprocfs_vars lvars[2]; struct lustre_sb_info *lsi = s2lsi(sb); struct ll_sb_info *sbi = ll_s2sbi(sb); struct obd_device *obd; char name[MAX_STRING_SIZE + 1], *ptr; int err, id, len; struct proc_dir_entry *entry; ENTRY; memset(lvars, 0, sizeof(lvars)); name[MAX_STRING_SIZE] = '\0'; lvars[0].name = name; LASSERT(sbi != NULL); LASSERT(mdc != NULL); LASSERT(osc != NULL); /* Get fsname */ len = strlen(lsi->lsi_lmd->lmd_profile); ptr = strrchr(lsi->lsi_lmd->lmd_profile, '-'); if (ptr && (strcmp(ptr, "-client") == 0)) len -= 7; /* Mount info */ snprintf(name, MAX_STRING_SIZE, "%.*s-%p", len, lsi->lsi_lmd->lmd_profile, sb); sbi->ll_proc_root = lprocfs_register(name, parent, NULL, NULL); if (IS_ERR(sbi->ll_proc_root)) { err = PTR_ERR(sbi->ll_proc_root); sbi->ll_proc_root = NULL; RETURN(err); } entry = create_proc_entry("dump_page_cache", 0444, sbi->ll_proc_root); if (entry == NULL) GOTO(out, err = -ENOMEM); entry->proc_fops = &llite_dump_pgcache_fops; entry->data = sbi; entry = create_proc_entry("read_ahead_stats", 0644, sbi->ll_proc_root); if (entry == NULL) GOTO(out, err = -ENOMEM); entry->proc_fops = &ll_ra_stats_fops; entry->data = sbi; entry = create_proc_entry("extents_stats", 0644, sbi->ll_proc_root); if (entry == NULL) GOTO(out, err = -ENOMEM); entry->proc_fops = &ll_rw_extents_stats_fops; entry->data = sbi;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -