1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * linux/include/linux/sunrpc/debug.h
4 *
5 * Debugging support for sunrpc module
6 *
7 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
8 */
9#ifndef _LINUX_SUNRPC_DEBUG_H_
10#define _LINUX_SUNRPC_DEBUG_H_
11
12#include <uapi/linux/sunrpc/debug.h>
13
14/*
15 * Debugging macros etc
16 */
17#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
18extern unsigned int rpc_debug;
19extern unsigned int nfs_debug;
20extern unsigned int nfsd_debug;
21extern unsigned int nlm_debug;
22#endif
23
24#define dprintk(fmt, ...) \
25 dfprintk(FACILITY, fmt, ##__VA_ARGS__)
26#define dprintk_cont(fmt, ...) \
27 dfprintk_cont(FACILITY, fmt, ##__VA_ARGS__)
28#define dprintk_rcu(fmt, ...) \
29 dfprintk_rcu(FACILITY, fmt, ##__VA_ARGS__)
30#define dprintk_rcu_cont(fmt, ...) \
31 dfprintk_rcu_cont(FACILITY, fmt, ##__VA_ARGS__)
32
33#undef ifdebug
34#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
35# define ifdebug(fac) if (unlikely(rpc_debug & RPCDBG_##fac))
36
37# define dfprintk(fac, fmt, ...) \
38do { \
39 ifdebug(fac) \
40 printk(KERN_DEFAULT fmt, ##__VA_ARGS__); \
41} while (0)
42
43# define dfprintk_cont(fac, fmt, ...) \
44do { \
45 ifdebug(fac) \
46 printk(KERN_CONT fmt, ##__VA_ARGS__); \
47} while (0)
48
49# define dfprintk_rcu(fac, fmt, ...) \
50do { \
51 ifdebug(fac) { \
52 rcu_read_lock(); \
53 printk(KERN_DEFAULT fmt, ##__VA_ARGS__); \
54 rcu_read_unlock(); \
55 } \
56} while (0)
57
58# define dfprintk_rcu_cont(fac, fmt, ...) \
59do { \
60 ifdebug(fac) { \
61 rcu_read_lock(); \
62 printk(KERN_CONT fmt, ##__VA_ARGS__); \
63 rcu_read_unlock(); \
64 } \
65} while (0)
66
67# define RPC_IFDEBUG(x) x
68#else
69# define ifdebug(fac) if (0)
70# define dfprintk(fac, fmt, ...) do {} while (0)
71# define dfprintk_cont(fac, fmt, ...) do {} while (0)
72# define dfprintk_rcu(fac, fmt, ...) do {} while (0)
73# define RPC_IFDEBUG(x)
74#endif
75
76/*
77 * Sysctl interface for RPC debugging
78 */
79
80struct rpc_clnt;
81struct rpc_xprt;
82
83#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
84void rpc_register_sysctl(void);
85void rpc_unregister_sysctl(void);
86void sunrpc_debugfs_init(void);
87void sunrpc_debugfs_exit(void);
88void rpc_clnt_debugfs_register(struct rpc_clnt *);
89void rpc_clnt_debugfs_unregister(struct rpc_clnt *);
90void rpc_xprt_debugfs_register(struct rpc_xprt *);
91void rpc_xprt_debugfs_unregister(struct rpc_xprt *);
92#else
93static inline void
94sunrpc_debugfs_init(void)
95{
96 return;
97}
98
99static inline void
100sunrpc_debugfs_exit(void)
101{
102 return;
103}
104
105static inline void
106rpc_clnt_debugfs_register(struct rpc_clnt *clnt)
107{
108 return;
109}
110
111static inline void
112rpc_clnt_debugfs_unregister(struct rpc_clnt *clnt)
113{
114 return;
115}
116
117static inline void
118rpc_xprt_debugfs_register(struct rpc_xprt *xprt)
119{
120 return;
121}
122
123static inline void
124rpc_xprt_debugfs_unregister(struct rpc_xprt *xprt)
125{
126 return;
127}
128#endif
129
130#endif /* _LINUX_SUNRPC_DEBUG_H_ */
131