1*b38f99c1SBahubali B Gumaji /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*b38f99c1SBahubali B Gumaji /* 3*b38f99c1SBahubali B Gumaji * Copyright (C) 2025, LG Electronics. 4*b38f99c1SBahubali B Gumaji * Author(s): Hyunchul Lee <hyc.lee@gmail.com> 5*b38f99c1SBahubali B Gumaji * Copyright (C) 2025, Samsung Electronics. 6*b38f99c1SBahubali B Gumaji * Author(s): Vedansh Bhardwaj <v.bhardwaj@samsung.com> 7*b38f99c1SBahubali B Gumaji */ 8*b38f99c1SBahubali B Gumaji 9*b38f99c1SBahubali B Gumaji #ifndef __KSMBD_STATS_H__ 10*b38f99c1SBahubali B Gumaji #define __KSMBD_STATS_H__ 11*b38f99c1SBahubali B Gumaji 12*b38f99c1SBahubali B Gumaji #define KSMBD_COUNTER_MAX_REQS 19 13*b38f99c1SBahubali B Gumaji 14*b38f99c1SBahubali B Gumaji enum { 15*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_SESSIONS = 0, 16*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_TREE_CONNS, 17*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_REQUESTS, 18*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_READ_BYTES, 19*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_WRITE_BYTES, 20*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_FIRST_REQ, 21*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_LAST_REQ = KSMBD_COUNTER_FIRST_REQ + 22*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_MAX_REQS - 1, 23*b38f99c1SBahubali B Gumaji KSMBD_COUNTER_MAX, 24*b38f99c1SBahubali B Gumaji }; 25*b38f99c1SBahubali B Gumaji 26*b38f99c1SBahubali B Gumaji #ifdef CONFIG_PROC_FS 27*b38f99c1SBahubali B Gumaji extern struct ksmbd_counters ksmbd_counters; 28*b38f99c1SBahubali B Gumaji 29*b38f99c1SBahubali B Gumaji struct ksmbd_counters { 30*b38f99c1SBahubali B Gumaji struct percpu_counter counters[KSMBD_COUNTER_MAX]; 31*b38f99c1SBahubali B Gumaji }; 32*b38f99c1SBahubali B Gumaji 33*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_inc(int type) 34*b38f99c1SBahubali B Gumaji { 35*b38f99c1SBahubali B Gumaji percpu_counter_inc(&ksmbd_counters.counters[type]); 36*b38f99c1SBahubali B Gumaji } 37*b38f99c1SBahubali B Gumaji 38*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_dec(int type) 39*b38f99c1SBahubali B Gumaji { 40*b38f99c1SBahubali B Gumaji percpu_counter_dec(&ksmbd_counters.counters[type]); 41*b38f99c1SBahubali B Gumaji } 42*b38f99c1SBahubali B Gumaji 43*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_add(int type, s64 value) 44*b38f99c1SBahubali B Gumaji { 45*b38f99c1SBahubali B Gumaji percpu_counter_add(&ksmbd_counters.counters[type], value); 46*b38f99c1SBahubali B Gumaji } 47*b38f99c1SBahubali B Gumaji 48*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_sub(int type, s64 value) 49*b38f99c1SBahubali B Gumaji { 50*b38f99c1SBahubali B Gumaji percpu_counter_sub(&ksmbd_counters.counters[type], value); 51*b38f99c1SBahubali B Gumaji } 52*b38f99c1SBahubali B Gumaji 53*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_inc_reqs(unsigned int cmd) 54*b38f99c1SBahubali B Gumaji { 55*b38f99c1SBahubali B Gumaji if (cmd < KSMBD_COUNTER_MAX_REQS) 56*b38f99c1SBahubali B Gumaji percpu_counter_inc(&ksmbd_counters.counters[KSMBD_COUNTER_FIRST_REQ + cmd]); 57*b38f99c1SBahubali B Gumaji } 58*b38f99c1SBahubali B Gumaji 59*b38f99c1SBahubali B Gumaji static inline s64 ksmbd_counter_sum(int type) 60*b38f99c1SBahubali B Gumaji { 61*b38f99c1SBahubali B Gumaji return percpu_counter_sum_positive(&ksmbd_counters.counters[type]); 62*b38f99c1SBahubali B Gumaji } 63*b38f99c1SBahubali B Gumaji #else 64*b38f99c1SBahubali B Gumaji 65*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_inc(int type) {} 66*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_dec(int type) {} 67*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_add(int type, s64 value) {} 68*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_sub(int type, s64 value) {} 69*b38f99c1SBahubali B Gumaji static inline void ksmbd_counter_inc_reqs(unsigned int cmd) {} 70*b38f99c1SBahubali B Gumaji static inline s64 ksmbd_counter_sum(int type) { return 0; } 71*b38f99c1SBahubali B Gumaji #endif 72*b38f99c1SBahubali B Gumaji 73*b38f99c1SBahubali B Gumaji #endif 74