1// SPDX-License-Identifier: GPL-2.0-or-later 2/* FS-Cache latency histogram 3 * 4 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 8#define FSCACHE_DEBUG_LEVEL THREAD 9#include <linux/module.h> 10#include <linux/proc_fs.h> 11#include <linux/seq_file.h> 12#include "internal.h" 13 14atomic_t fscache_obj_instantiate_histogram[HZ]; 15atomic_t fscache_objs_histogram[HZ]; 16atomic_t fscache_ops_histogram[HZ]; 17atomic_t fscache_retrieval_delay_histogram[HZ]; 18atomic_t fscache_retrieval_histogram[HZ]; 19 20/* 21 * display the time-taken histogram 22 */ 23static int fscache_histogram_show(struct seq_file *m, void *v) 24{ 25 unsigned long index; 26 unsigned n[5], t; 27 28 switch ((unsigned long) v) { 29 case 1: 30 seq_puts(m, "JIFS SECS OBJ INST OP RUNS OBJ RUNS RETRV DLY RETRIEVLS\n"); 31 return 0; 32 case 2: 33 seq_puts(m, "===== ===== ========= ========= ========= ========= =========\n"); 34 return 0; 35 default: 36 index = (unsigned long) v - 3; 37 n[0] = atomic_read(&fscache_obj_instantiate_histogram[index]); 38 n[1] = atomic_read(&fscache_ops_histogram[index]); 39 n[2] = atomic_read(&fscache_objs_histogram[index]); 40 n[3] = atomic_read(&fscache_retrieval_delay_histogram[index]); 41 n[4] = atomic_read(&fscache_retrieval_histogram[index]); 42 if (!(n[0] | n[1] | n[2] | n[3] | n[4])) 43 return 0; 44 45 t = (index * 1000) / HZ; 46 47 seq_printf(m, "%4lu 0.%03u %9u %9u %9u %9u %9u\n", 48 index, t, n[0], n[1], n[2], n[3], n[4]); 49 return 0; 50 } 51} 52 53/* 54 * set up the iterator to start reading from the first line 55 */ 56static void *fscache_histogram_start(struct seq_file *m, loff_t *_pos) 57{ 58 if ((unsigned long long)*_pos >= HZ + 2) 59 return NULL; 60 if (*_pos == 0) 61 *_pos = 1; 62 return (void *)(unsigned long) *_pos; 63} 64 65/* 66 * move to the next line 67 */ 68static void *fscache_histogram_next(struct seq_file *m, void *v, loff_t *pos) 69{ 70 (*pos)++; 71 return (unsigned long long)*pos > HZ + 2 ? 72 NULL : (void *)(unsigned long) *pos; 73} 74 75/* 76 * clean up after reading 77 */ 78static void fscache_histogram_stop(struct seq_file *m, void *v) 79{ 80} 81 82const struct seq_operations fscache_histogram_ops = { 83 .start = fscache_histogram_start, 84 .stop = fscache_histogram_stop, 85 .next = fscache_histogram_next, 86 .show = fscache_histogram_show, 87}; 88