~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/xfs/xfs_stats.c

Version: ~ [ linux-5.15-rc5 ] ~ [ linux-5.14.11 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.72 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.152 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.210 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.250 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.286 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.288 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 21 struct xstats xfsstats;
 22 
 23 static int counter_val(struct xfsstats __percpu *stats, int idx)
 24 {
 25         int val = 0, cpu;
 26 
 27         for_each_possible_cpu(cpu)
 28                 val += *(((__u32 *)per_cpu_ptr(stats, cpu) + idx));
 29         return val;
 30 }
 31 
 32 int xfs_stats_format(struct xfsstats __percpu *stats, char *buf)
 33 {
 34         int             i, j;
 35         int             len = 0;
 36         __uint64_t      xs_xstrat_bytes = 0;
 37         __uint64_t      xs_write_bytes = 0;
 38         __uint64_t      xs_read_bytes = 0;
 39 
 40         static const struct xstats_entry {
 41                 char    *desc;
 42                 int     endpoint;
 43         } xstats[] = {
 44                 { "extent_alloc",       XFSSTAT_END_EXTENT_ALLOC        },
 45                 { "abt",                XFSSTAT_END_ALLOC_BTREE         },
 46                 { "blk_map",            XFSSTAT_END_BLOCK_MAPPING       },
 47                 { "bmbt",               XFSSTAT_END_BLOCK_MAP_BTREE     },
 48                 { "dir",                XFSSTAT_END_DIRECTORY_OPS       },
 49                 { "trans",              XFSSTAT_END_TRANSACTIONS        },
 50                 { "ig",                 XFSSTAT_END_INODE_OPS           },
 51                 { "log",                XFSSTAT_END_LOG_OPS             },
 52                 { "push_ail",           XFSSTAT_END_TAIL_PUSHING        },
 53                 { "xstrat",             XFSSTAT_END_WRITE_CONVERT       },
 54                 { "rw",                 XFSSTAT_END_READ_WRITE_OPS      },
 55                 { "attr",               XFSSTAT_END_ATTRIBUTE_OPS       },
 56                 { "icluster",           XFSSTAT_END_INODE_CLUSTER       },
 57                 { "vnodes",             XFSSTAT_END_VNODE_OPS           },
 58                 { "buf",                XFSSTAT_END_BUF                 },
 59                 { "abtb2",              XFSSTAT_END_ABTB_V2             },
 60                 { "abtc2",              XFSSTAT_END_ABTC_V2             },
 61                 { "bmbt2",              XFSSTAT_END_BMBT_V2             },
 62                 { "ibt2",               XFSSTAT_END_IBT_V2              },
 63                 { "fibt2",              XFSSTAT_END_FIBT_V2             },
 64                 { "rmapbt",             XFSSTAT_END_RMAP_V2             },
 65                 { "refcntbt",           XFSSTAT_END_REFCOUNT            },
 66                 /* we print both series of quota information together */
 67                 { "qm",                 XFSSTAT_END_QM                  },
 68         };
 69 
 70         /* Loop over all stats groups */
 71 
 72         for (i = j = 0; i < ARRAY_SIZE(xstats); i++) {
 73                 len += snprintf(buf + len, PATH_MAX - len, "%s",
 74                                 xstats[i].desc);
 75                 /* inner loop does each group */
 76                 for (; j < xstats[i].endpoint; j++)
 77                         len += snprintf(buf + len, PATH_MAX - len, " %u",
 78                                         counter_val(stats, j));
 79                 len += snprintf(buf + len, PATH_MAX - len, "\n");
 80         }
 81         /* extra precision counters */
 82         for_each_possible_cpu(i) {
 83                 xs_xstrat_bytes += per_cpu_ptr(stats, i)->s.xs_xstrat_bytes;
 84                 xs_write_bytes += per_cpu_ptr(stats, i)->s.xs_write_bytes;
 85                 xs_read_bytes += per_cpu_ptr(stats, i)->s.xs_read_bytes;
 86         }
 87 
 88         len += snprintf(buf + len, PATH_MAX-len, "xpc %Lu %Lu %Lu\n",
 89                         xs_xstrat_bytes, xs_write_bytes, xs_read_bytes);
 90         len += snprintf(buf + len, PATH_MAX-len, "debug %u\n",
 91 #if defined(DEBUG)
 92                 1);
 93 #else
 94                 0);
 95 #endif
 96 
 97         return len;
 98 }
 99 
100 void xfs_stats_clearall(struct xfsstats __percpu *stats)
101 {
102         int             c;
103         __uint32_t      vn_active;
104 
105         xfs_notice(NULL, "Clearing xfsstats");
106         for_each_possible_cpu(c) {
107                 preempt_disable();
108                 /* save vn_active, it's a universal truth! */
109                 vn_active = per_cpu_ptr(stats, c)->s.vn_active;
110                 memset(per_cpu_ptr(stats, c), 0, sizeof(*stats));
111                 per_cpu_ptr(stats, c)->s.vn_active = vn_active;
112                 preempt_enable();
113         }
114 }
115 
116 /* legacy quota interfaces */
117 #ifdef CONFIG_XFS_QUOTA
118 static int xqm_proc_show(struct seq_file *m, void *v)
119 {
120         /* maximum; incore; ratio free to inuse; freelist */
121         seq_printf(m, "%d\t%d\t%d\t%u\n",
122                    0, counter_val(xfsstats.xs_stats, XFSSTAT_END_XQMSTAT),
123                    0, counter_val(xfsstats.xs_stats, XFSSTAT_END_XQMSTAT + 1));
124         return 0;
125 }
126 
127 static int xqm_proc_open(struct inode *inode, struct file *file)
128 {
129         return single_open(file, xqm_proc_show, NULL);
130 }
131 
132 static const struct file_operations xqm_proc_fops = {
133         .open           = xqm_proc_open,
134         .read           = seq_read,
135         .llseek         = seq_lseek,
136         .release        = single_release,
137 };
138 
139 /* legacy quota stats interface no 2 */
140 static int xqmstat_proc_show(struct seq_file *m, void *v)
141 {
142         int j;
143 
144         seq_printf(m, "qm");
145         for (j = XFSSTAT_END_IBT_V2; j < XFSSTAT_END_XQMSTAT; j++)
146                 seq_printf(m, " %u", counter_val(xfsstats.xs_stats, j));
147         seq_putc(m, '\n');
148         return 0;
149 }
150 
151 static int xqmstat_proc_open(struct inode *inode, struct file *file)
152 {
153         return single_open(file, xqmstat_proc_show, NULL);
154 }
155 
156 static const struct file_operations xqmstat_proc_fops = {
157         .owner          = THIS_MODULE,
158         .open           = xqmstat_proc_open,
159         .read           = seq_read,
160         .llseek         = seq_lseek,
161         .release        = single_release,
162 };
163 #endif /* CONFIG_XFS_QUOTA */
164 
165 #ifdef CONFIG_PROC_FS
166 int
167 xfs_init_procfs(void)
168 {
169         if (!proc_mkdir("fs/xfs", NULL))
170                 return -ENOMEM;
171 
172         if (!proc_symlink("fs/xfs/stat", NULL,
173                           "/sys/fs/xfs/stats/stats"))
174                 goto out;
175 
176 #ifdef CONFIG_XFS_QUOTA
177         if (!proc_create("fs/xfs/xqmstat", 0, NULL,
178                          &xqmstat_proc_fops))
179                 goto out;
180         if (!proc_create("fs/xfs/xqm", 0, NULL,
181                          &xqm_proc_fops))
182                 goto out;
183 #endif
184         return 0;
185 
186 out:
187         remove_proc_subtree("fs/xfs", NULL);
188         return -ENOMEM;
189 }
190 
191 void
192 xfs_cleanup_procfs(void)
193 {
194         remove_proc_subtree("fs/xfs", NULL);
195 }
196 #endif /* CONFIG_PROC_FS */
197 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp