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