linux/fs/xfs/linux-2.6/xfs_stats.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include <linux/proc_fs.h>
  20
  21DEFINE_PER_CPU(struct xfsstats, xfsstats);
  22
  23static int xfs_stat_proc_show(struct seq_file *m, void *v)
  24{
  25        int             c, i, j, val;
  26        __uint64_t      xs_xstrat_bytes = 0;
  27        __uint64_t      xs_write_bytes = 0;
  28        __uint64_t      xs_read_bytes = 0;
  29
  30        static const struct xstats_entry {
  31                char    *desc;
  32                int     endpoint;
  33        } xstats[] = {
  34                { "extent_alloc",       XFSSTAT_END_EXTENT_ALLOC        },
  35                { "abt",                XFSSTAT_END_ALLOC_BTREE         },
  36                { "blk_map",            XFSSTAT_END_BLOCK_MAPPING       },
  37                { "bmbt",               XFSSTAT_END_BLOCK_MAP_BTREE     },
  38                { "dir",                XFSSTAT_END_DIRECTORY_OPS       },
  39                { "trans",              XFSSTAT_END_TRANSACTIONS        },
  40                { "ig",                 XFSSTAT_END_INODE_OPS           },
  41                { "log",                XFSSTAT_END_LOG_OPS             },
  42                { "push_ail",           XFSSTAT_END_TAIL_PUSHING        },
  43                { "xstrat",             XFSSTAT_END_WRITE_CONVERT       },
  44                { "rw",                 XFSSTAT_END_READ_WRITE_OPS      },
  45                { "attr",               XFSSTAT_END_ATTRIBUTE_OPS       },
  46                { "icluster",           XFSSTAT_END_INODE_CLUSTER       },
  47                { "vnodes",             XFSSTAT_END_VNODE_OPS           },
  48                { "buf",                XFSSTAT_END_BUF                 },
  49                { "abtb2",              XFSSTAT_END_ABTB_V2             },
  50                { "abtc2",              XFSSTAT_END_ABTC_V2             },
  51                { "bmbt2",              XFSSTAT_END_BMBT_V2             },
  52                { "ibt2",               XFSSTAT_END_IBT_V2              },
  53        };
  54
  55        /* Loop over all stats groups */
  56        for (i=j = 0; i < ARRAY_SIZE(xstats); i++) {
  57                seq_printf(m, "%s", xstats[i].desc);
  58                /* inner loop does each group */
  59                while (j < xstats[i].endpoint) {
  60                        val = 0;
  61                        /* sum over all cpus */
  62                        for_each_possible_cpu(c)
  63                                val += *(((__u32*)&per_cpu(xfsstats, c) + j));
  64                        seq_printf(m, " %u", val);
  65                        j++;
  66                }
  67                seq_putc(m, '\n');
  68        }
  69        /* extra precision counters */
  70        for_each_possible_cpu(i) {
  71                xs_xstrat_bytes += per_cpu(xfsstats, i).xs_xstrat_bytes;
  72                xs_write_bytes += per_cpu(xfsstats, i).xs_write_bytes;
  73                xs_read_bytes += per_cpu(xfsstats, i).xs_read_bytes;
  74        }
  75
  76        seq_printf(m, "xpc %Lu %Lu %Lu\n",
  77                        xs_xstrat_bytes, xs_write_bytes, xs_read_bytes);
  78        seq_printf(m, "debug %u\n",
  79#if defined(DEBUG)
  80                1);
  81#else
  82                0);
  83#endif
  84        return 0;
  85}
  86
  87static int xfs_stat_proc_open(struct inode *inode, struct file *file)
  88{
  89        return single_open(file, xfs_stat_proc_show, NULL);
  90}
  91
  92static const struct file_operations xfs_stat_proc_fops = {
  93        .owner          = THIS_MODULE,
  94        .open           = xfs_stat_proc_open,
  95        .read           = seq_read,
  96        .llseek         = seq_lseek,
  97        .release        = single_release,
  98};
  99
 100int
 101xfs_init_procfs(void)
 102{
 103        if (!proc_mkdir("fs/xfs", NULL))
 104                goto out;
 105
 106        if (!proc_create("fs/xfs/stat", 0, NULL,
 107                         &xfs_stat_proc_fops))
 108                goto out_remove_entry;
 109        return 0;
 110
 111 out_remove_entry:
 112        remove_proc_entry("fs/xfs", NULL);
 113 out:
 114        return -ENOMEM;
 115}
 116
 117void
 118xfs_cleanup_procfs(void)
 119{
 120        remove_proc_entry("fs/xfs/stat", NULL);
 121        remove_proc_entry("fs/xfs", NULL);
 122}
 123