linux/fs/nfsd/stats.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Statistics for NFS server.
   4 *
   5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
   6 */
   7#ifndef _NFSD_STATS_H
   8#define _NFSD_STATS_H
   9
  10#include <uapi/linux/nfsd/stats.h>
  11#include <linux/percpu_counter.h>
  12
  13
  14enum {
  15        NFSD_STATS_RC_HITS,             /* repcache hits */
  16        NFSD_STATS_RC_MISSES,           /* repcache misses */
  17        NFSD_STATS_RC_NOCACHE,          /* uncached reqs */
  18        NFSD_STATS_FH_STALE,            /* FH stale error */
  19        NFSD_STATS_IO_READ,             /* bytes returned to read requests */
  20        NFSD_STATS_IO_WRITE,            /* bytes passed in write requests */
  21#ifdef CONFIG_NFSD_V4
  22        NFSD_STATS_FIRST_NFS4_OP,       /* count of individual nfsv4 operations */
  23        NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
  24#define NFSD_STATS_NFS4_OP(op)  (NFSD_STATS_FIRST_NFS4_OP + (op))
  25#endif
  26        NFSD_STATS_COUNTERS_NUM
  27};
  28
  29struct nfsd_stats {
  30        struct percpu_counter   counter[NFSD_STATS_COUNTERS_NUM];
  31
  32        atomic_t        th_cnt;         /* number of available threads */
  33};
  34
  35extern struct nfsd_stats        nfsdstats;
  36
  37extern struct svc_stat          nfsd_svcstats;
  38
  39int nfsd_percpu_counters_init(struct percpu_counter counters[], int num);
  40void nfsd_percpu_counters_reset(struct percpu_counter counters[], int num);
  41void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num);
  42int nfsd_stat_init(void);
  43void nfsd_stat_shutdown(void);
  44
  45static inline void nfsd_stats_rc_hits_inc(void)
  46{
  47        percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_HITS]);
  48}
  49
  50static inline void nfsd_stats_rc_misses_inc(void)
  51{
  52        percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_MISSES]);
  53}
  54
  55static inline void nfsd_stats_rc_nocache_inc(void)
  56{
  57        percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]);
  58}
  59
  60static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
  61{
  62        percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
  63        if (exp)
  64                percpu_counter_inc(&exp->ex_stats.counter[EXP_STATS_FH_STALE]);
  65}
  66
  67static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
  68{
  69        percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
  70        if (exp)
  71                percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_READ], amount);
  72}
  73
  74static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
  75{
  76        percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
  77        if (exp)
  78                percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_WRITE], amount);
  79}
  80
  81static inline void nfsd_stats_payload_misses_inc(struct nfsd_net *nn)
  82{
  83        percpu_counter_inc(&nn->counter[NFSD_NET_PAYLOAD_MISSES]);
  84}
  85
  86static inline void nfsd_stats_drc_mem_usage_add(struct nfsd_net *nn, s64 amount)
  87{
  88        percpu_counter_add(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
  89}
  90
  91static inline void nfsd_stats_drc_mem_usage_sub(struct nfsd_net *nn, s64 amount)
  92{
  93        percpu_counter_sub(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
  94}
  95
  96#endif /* _NFSD_STATS_H */
  97