X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Flproc_llite.c;h=4e785a3eb1dd4746731f2ed04a6db7ed2bbc9e2f;hb=4cc21ecbcee4d29017fe5d400f3a88321d65d58d;hp=f2a69229ff74704e26a65a205ee4aa33329fb7b3;hpb=e4deafd378448a0ef27ec4c2d1c191cc55bf691c;p=fs%2Flustre-release.git diff --git a/lustre/llite/lproc_llite.c b/lustre/llite/lproc_llite.c index f2a6922..4e785a3 100644 --- a/lustre/llite/lproc_llite.c +++ b/lustre/llite/lproc_llite.c @@ -47,7 +47,8 @@ static int ll_rd_blksize(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { *eof = 1; rc = snprintf(page, count, "%u\n", osfs.os_bsize); @@ -64,7 +65,8 @@ static int ll_rd_kbytestotal(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { __u32 blk_size = osfs.os_bsize >> 10; __u64 result = osfs.os_blocks; @@ -87,7 +89,8 @@ static int ll_rd_kbytesfree(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { __u32 blk_size = osfs.os_bsize >> 10; __u64 result = osfs.os_bfree; @@ -109,7 +112,8 @@ static int ll_rd_kbytesavail(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { __u32 blk_size = osfs.os_bsize >> 10; __u64 result = osfs.os_bavail; @@ -131,7 +135,8 @@ static int ll_rd_filestotal(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { *eof = 1; rc = snprintf(page, count, LPU64"\n", osfs.os_files); @@ -147,7 +152,8 @@ static int ll_rd_filesfree(char *page, char **start, off_t off, int count, int rc; LASSERT(sb != NULL); - rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ); + rc = ll_statfs_internal(sb, &osfs, cfs_time_current_64() - HZ, + OBD_STATFS_NODELAY); if (!rc) { *eof = 1; rc = snprintf(page, count, LPU64"\n", osfs.os_ffree); @@ -454,7 +460,98 @@ static int ll_wr_track_gid(struct file *file, const char *buffer, return (ll_wr_track_id(buffer, count, data, STATS_TRACK_GID)); } -static struct lprocfs_vars lprocfs_obd_vars[] = { +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 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_lockless_truncate(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_lockless_truncate_enable); +} + +static int ll_wr_lockless_truncate(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_lockless_truncate_enable) + ?: count; +} + +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 }, @@ -476,6 +573,11 @@ static struct lprocfs_vars lprocfs_obd_vars[] = { { "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 }, + { "statahead_max", ll_rd_statahead_max, ll_wr_statahead_max, 0 }, + { "statahead_stats", ll_rd_statahead_stats, 0, 0 }, + { "contention_seconds", ll_rd_contention_time, ll_wr_contention_time, 0}, + { "lockless_truncate", ll_rd_lockless_truncate, + ll_wr_lockless_truncate, 0}, { 0 } }; @@ -515,12 +617,9 @@ struct llite_file_opcode { /* inode operation */ { LPROC_LL_SETATTR, LPROCFS_TYPE_REGS, "setattr" }, { LPROC_LL_TRUNC, LPROCFS_TYPE_REGS, "truncate" }, + { LPROC_LL_LOCKLESS_TRUNC, LPROCFS_TYPE_REGS, "lockless_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" }, @@ -533,6 +632,10 @@ struct llite_file_opcode { "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" }, }; @@ -562,8 +665,7 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent, 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; + int err, id, len, rc; ENTRY; memset(lvars, 0, sizeof(lvars)); @@ -592,39 +694,35 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent, 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; - - entry = create_proc_entry("extents_stats_per_process", 0644, - sbi->ll_proc_root); - if (entry == NULL) - GOTO(out, err = -ENOMEM); - entry->proc_fops = &ll_rw_extents_stats_pp_fops; - entry->data = sbi; - - entry = create_proc_entry("offset_stats", 0644, sbi->ll_proc_root); - if (entry == NULL) - GOTO(out, err = -ENOMEM); - entry->proc_fops = &ll_rw_offset_stats_fops; - entry->data = sbi; + rc = lprocfs_seq_create(sbi->ll_proc_root, "dump_page_cache", 0444, + &llite_dump_pgcache_fops, sbi); + if (rc) + CWARN("Error adding the dump_page_cache file\n"); + + rc = lprocfs_seq_create(sbi->ll_proc_root, "read_ahead_stats", 0644, + &ll_ra_stats_fops, sbi); + if (rc) + CWARN("Error adding the read_ahead_stats file\n"); + + rc = lprocfs_seq_create(sbi->ll_proc_root, "extents_stats", 0644, + &ll_rw_extents_stats_fops, sbi); + if (rc) + CWARN("Error adding the extent_stats file\n"); + + rc = lprocfs_seq_create(sbi->ll_proc_root, "extents_stats_per_process", + 0644, &ll_rw_extents_stats_pp_fops, sbi); + if (rc) + CWARN("Error adding the extents_stats_per_process file\n"); + + rc = lprocfs_seq_create(sbi->ll_proc_root, "offset_stats", 0644, + &ll_rw_offset_stats_fops, sbi); + if (rc) + CWARN("Error adding the offset_stats file\n"); /* File operations stats */ - sbi->ll_stats = lprocfs_alloc_stats(LPROC_LL_FILE_OPCODES); + sbi->ll_stats = lprocfs_alloc_stats(LPROC_LL_FILE_OPCODES, + LPROCFS_STATS_FLAG_PERCPU); if (sbi->ll_stats == NULL) GOTO(out, err = -ENOMEM); /* do counter init */ @@ -633,15 +731,11 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent, void *ptr = NULL; if (type & LPROCFS_TYPE_REGS) ptr = "regs"; - else { - if (type & LPROCFS_TYPE_BYTES) - ptr = "bytes"; - else { - if (type & LPROCFS_TYPE_PAGES) - ptr = "pages"; - } - } - lprocfs_counter_init(sbi->ll_stats, + else if (type & LPROCFS_TYPE_BYTES) + ptr = "bytes"; + else if (type & LPROCFS_TYPE_PAGES) + ptr = "pages"; + lprocfs_counter_init(sbi->ll_stats, llite_opcode_table[id].opcode, (type & LPROCFS_CNTR_AVGMINMAX), llite_opcode_table[id].opname, ptr); @@ -650,7 +744,7 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent, if (err) GOTO(out, err); - err = lprocfs_add_vars(sbi->ll_proc_root, lprocfs_obd_vars, sb); + err = lprocfs_add_vars(sbi->ll_proc_root, lprocfs_llite_obd_vars, sb); if (err) GOTO(out, err); @@ -736,7 +830,7 @@ static int llite_dump_pgcache_seq_show(struct seq_file *seq, void *v) /* 2.4 doesn't seem to have SEQ_START_TOKEN, so we implement * it in our own state */ if (dummy_llap->llap_magic == 0) { - seq_printf(seq, "gener | llap cookie origin wq du | page " + seq_printf(seq, "gener | llap cookie origin wq du wb | page " "inode index count [ page flags ]\n"); return 0; } @@ -751,13 +845,17 @@ static int llite_dump_pgcache_seq_show(struct seq_file *seq, void *v) LASSERTF(llap->llap_origin < LLAP__ORIGIN_MAX, "%u\n", llap->llap_origin); - seq_printf(seq, "%5lu | %p %p %s %s %s | %p %p %lu %u [", + seq_printf(seq," %5lu | %p %p %s %s %s %s | %p %lu/%u(%p) " + "%lu %u [", sbi->ll_pglist_gen, llap, llap->llap_cookie, llap_origins[llap->llap_origin], llap->llap_write_queued ? "wq" : "- ", llap->llap_defer_uptodate ? "du" : "- ", - page, page->mapping->host, page->index, + PageWriteback(page) ? "wb" : "-", + page, page->mapping->host->i_ino, + page->mapping->host->i_generation, + page->mapping->host, page->index, page_count(page)); seq_page_flag(seq, page, locked, has_flags); seq_page_flag(seq, page, error, has_flags); @@ -767,9 +865,10 @@ static int llite_dump_pgcache_seq_show(struct seq_file *seq, void *v) #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) seq_page_flag(seq, page, highmem, has_flags); #endif + seq_page_flag(seq, page, writeback, has_flags); if (!has_flags) seq_puts(seq, "-]\n"); - else + else seq_puts(seq, "]\n"); } @@ -1275,5 +1374,9 @@ static ssize_t ll_rw_offset_stats_seq_write(struct file *file, const char *buf, LPROC_SEQ_FOPS(ll_rw_offset_stats); -LPROCFS_INIT_VARS(llite, NULL, lprocfs_obd_vars) +void lprocfs_llite_init_vars(struct lprocfs_static_vars *lvars) +{ + lvars->module_vars = NULL; + lvars->obd_vars = lprocfs_llite_obd_vars; +} #endif /* LPROCFS */