18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* FS-Cache latency histogram 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. 58c2ecf20Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#define FSCACHE_DEBUG_LEVEL THREAD 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci#include <linux/proc_fs.h> 118c2ecf20Sopenharmony_ci#include <linux/seq_file.h> 128c2ecf20Sopenharmony_ci#include "internal.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ciatomic_t fscache_obj_instantiate_histogram[HZ]; 158c2ecf20Sopenharmony_ciatomic_t fscache_objs_histogram[HZ]; 168c2ecf20Sopenharmony_ciatomic_t fscache_ops_histogram[HZ]; 178c2ecf20Sopenharmony_ciatomic_t fscache_retrieval_delay_histogram[HZ]; 188c2ecf20Sopenharmony_ciatomic_t fscache_retrieval_histogram[HZ]; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/* 218c2ecf20Sopenharmony_ci * display the time-taken histogram 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_cistatic int fscache_histogram_show(struct seq_file *m, void *v) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci unsigned long index; 268c2ecf20Sopenharmony_ci unsigned n[5], t; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci switch ((unsigned long) v) { 298c2ecf20Sopenharmony_ci case 1: 308c2ecf20Sopenharmony_ci seq_puts(m, "JIFS SECS OBJ INST OP RUNS OBJ RUNS RETRV DLY RETRIEVLS\n"); 318c2ecf20Sopenharmony_ci return 0; 328c2ecf20Sopenharmony_ci case 2: 338c2ecf20Sopenharmony_ci seq_puts(m, "===== ===== ========= ========= ========= ========= =========\n"); 348c2ecf20Sopenharmony_ci return 0; 358c2ecf20Sopenharmony_ci default: 368c2ecf20Sopenharmony_ci index = (unsigned long) v - 3; 378c2ecf20Sopenharmony_ci n[0] = atomic_read(&fscache_obj_instantiate_histogram[index]); 388c2ecf20Sopenharmony_ci n[1] = atomic_read(&fscache_ops_histogram[index]); 398c2ecf20Sopenharmony_ci n[2] = atomic_read(&fscache_objs_histogram[index]); 408c2ecf20Sopenharmony_ci n[3] = atomic_read(&fscache_retrieval_delay_histogram[index]); 418c2ecf20Sopenharmony_ci n[4] = atomic_read(&fscache_retrieval_histogram[index]); 428c2ecf20Sopenharmony_ci if (!(n[0] | n[1] | n[2] | n[3] | n[4])) 438c2ecf20Sopenharmony_ci return 0; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci t = (index * 1000) / HZ; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci seq_printf(m, "%4lu 0.%03u %9u %9u %9u %9u %9u\n", 488c2ecf20Sopenharmony_ci index, t, n[0], n[1], n[2], n[3], n[4]); 498c2ecf20Sopenharmony_ci return 0; 508c2ecf20Sopenharmony_ci } 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* 548c2ecf20Sopenharmony_ci * set up the iterator to start reading from the first line 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_cistatic void *fscache_histogram_start(struct seq_file *m, loff_t *_pos) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci if ((unsigned long long)*_pos >= HZ + 2) 598c2ecf20Sopenharmony_ci return NULL; 608c2ecf20Sopenharmony_ci if (*_pos == 0) 618c2ecf20Sopenharmony_ci *_pos = 1; 628c2ecf20Sopenharmony_ci return (void *)(unsigned long) *_pos; 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* 668c2ecf20Sopenharmony_ci * move to the next line 678c2ecf20Sopenharmony_ci */ 688c2ecf20Sopenharmony_cistatic void *fscache_histogram_next(struct seq_file *m, void *v, loff_t *pos) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci (*pos)++; 718c2ecf20Sopenharmony_ci return (unsigned long long)*pos > HZ + 2 ? 728c2ecf20Sopenharmony_ci NULL : (void *)(unsigned long) *pos; 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci/* 768c2ecf20Sopenharmony_ci * clean up after reading 778c2ecf20Sopenharmony_ci */ 788c2ecf20Sopenharmony_cistatic void fscache_histogram_stop(struct seq_file *m, void *v) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci} 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ciconst struct seq_operations fscache_histogram_ops = { 838c2ecf20Sopenharmony_ci .start = fscache_histogram_start, 848c2ecf20Sopenharmony_ci .stop = fscache_histogram_stop, 858c2ecf20Sopenharmony_ci .next = fscache_histogram_next, 868c2ecf20Sopenharmony_ci .show = fscache_histogram_show, 878c2ecf20Sopenharmony_ci}; 88