Whamcloud - gitweb
merge b_devel into HEAD (20030626 merge tag) for 0.7.1
[fs/lustre-release.git] / lustre / llite / lproc_llite.c
index 59cec1f..14eac3f 100644 (file)
@@ -36,6 +36,7 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
 {
         return 0;
 }
+void lprocfs_unregister_mountpoint(struct ll_sb_info *sbi){}
 #else
 
 #define LPROC_LLITE_STAT_FCT(fct_name, get_statfs_fct)                    \
@@ -100,16 +101,69 @@ struct lprocfs_vars lprocfs_obd_vars[] = {
 };
 
 #define MAX_STRING_SIZE 128
+
+struct llite_file_opcode {
+        __u32       opcode;
+        __u32       type;
+        const char *opname;
+} llite_opcode_table[LPROC_LL_FILE_OPCODES] = {
+        /* file operation */
+        { LPROC_LL_DIRTY_PAGES,    LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES,
+                                   "dirty_pages" },
+        { 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_RAW,    LPROCFS_TYPE_REGS, "setattr_raw" },
+        { LPROC_LL_SETATTR,        LPROCFS_TYPE_REGS, "setattr" },
+        { LPROC_LL_TRUNC,          LPROCFS_TYPE_REGS, "punch" },
+#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_DIRECT_READ,    LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES,
+                                   "direct_read" },
+        { LPROC_LL_DIRECT_WRITE,   LPROCFS_CNTR_AVGMINMAX|LPROCFS_TYPE_PAGES,
+                                   "direct_write" },
+
+};
+
 int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
                                 struct super_block *sb, char *osc, char *mdc)
 {
         struct lprocfs_vars lvars[2];
         struct ll_sb_info *sbi = ll_s2sbi(sb);
         struct obd_device *obd;
-        struct proc_dir_entry *entry;
         char name[MAX_STRING_SIZE + 1];
         struct obd_uuid uuid;
-        int err;
+        int err, id;
+        struct lprocfs_stats *svc_stats = NULL;
         ENTRY;
 
         memset(lvars, 0, sizeof(lvars));
@@ -131,17 +185,41 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
                 sbi->ll_proc_root = NULL;
                 RETURN(err);
         }
+
+        svc_stats = lprocfs_alloc_stats(LPROC_LL_FILE_OPCODES);
+        if (svc_stats == NULL) {
+                err = -ENOMEM;
+                goto out;
+        }
+        /* do counter init */
+        for (id = 0; id < LPROC_LL_FILE_OPCODES; id++) {
+                __u32 type = llite_opcode_table[id].type;
+                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(svc_stats, llite_opcode_table[id].opcode,
+                                     (type & LPROCFS_CNTR_AVGMINMAX),
+                                     llite_opcode_table[id].opname, ptr);
+        }
+        err = lprocfs_register_stats(sbi->ll_proc_root, "stats", svc_stats);
+        if (err)
+                goto out;
+        else
+                sbi->ll_stats = svc_stats;
+        /* need place to keep svc_stats */
+
         /* Static configuration info */
         err = lprocfs_add_vars(sbi->ll_proc_root, lprocfs_obd_vars, sb);
         if (err)
-                RETURN(err);
-
-        /* llite page cache stats */
-        entry = create_proc_entry("pgcache", 0444, sbi->ll_proc_root);
-        if (entry == NULL)
-                RETURN(-ENOMEM);
-        entry->proc_fops = &ll_pgcache_seq_fops;
-        entry->data = sbi;
+                goto out;
 
         /* MDC info */
         strncpy(uuid.uuid, mdc, sizeof(uuid.uuid));
@@ -156,13 +234,13 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
         lvars[0].read_fptr = lprocfs_rd_name;
         err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
         if (err)
-                RETURN(err);
+                goto out;
 
         snprintf(name, MAX_STRING_SIZE, "%s/uuid", obd->obd_type->typ_name);
         lvars[0].read_fptr = lprocfs_rd_uuid;
         err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
-        if (err < 0)
-                RETURN(err);
+        if (err)
+                goto out;
 
         /* OSC */
         strncpy(uuid.uuid, osc, sizeof(uuid.uuid));
@@ -177,14 +255,32 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
         lvars[0].read_fptr = lprocfs_rd_name;
         err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
         if (err)
-                RETURN(err);
+                goto out;
 
         snprintf(name, MAX_STRING_SIZE, "%s/uuid", obd->obd_type->typ_name);
         lvars[0].read_fptr = lprocfs_rd_uuid;
         err = lprocfs_add_vars(sbi->ll_proc_root, lvars, obd);
-
+out:
+        if (err) {
+                if (svc_stats)
+                        lprocfs_free_stats(svc_stats);
+                if (sbi->ll_proc_root)
+                        lprocfs_remove(sbi->ll_proc_root);
+        }
         RETURN(err);
 }
 
+void lprocfs_unregister_mountpoint(struct ll_sb_info *sbi)
+{
+        if (sbi->ll_proc_root) {
+                struct proc_dir_entry *file_stats =
+                        lprocfs_srch(sbi->ll_proc_root, "stats");
+
+                if (file_stats) {
+                        lprocfs_free_stats(sbi->ll_stats);
+                        lprocfs_remove(file_stats);
+                }
+        }
+}
 #undef MAX_STRING_SIZE
 #endif /* LPROCFS */