学习NFS SUNRPC 开始于下面这个文档,有一定的参考价值:
http://download.youkuaiyun.com/detail/chenqiang0721/5729801
v2.6.34 如何打开 SUNRPC 调试:
SUNRPC 中很多代码中都用dprintk 输出debug 信息,比如,
static int xs_tcp_send_request(struct rpc_task *task)
{
struct rpc_rqst *req = task->tk_rqstp;
struct rpc_xprt *xprt = req->rq_xprt;
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
struct xdr_buf *xdr = &req->rq_snd_buf;
int status;
xs_encode_tcp_record_marker(&req->rq_snd_buf);
xs_pktdump("packet data:",
req->rq_svec->iov_base,
req->rq_svec->iov_len);
/* Continue transmitting the packet/record. We must be careful
* to cope with writespace callbacks arriving _after_ we have
* called sendmsg(). */
while (1) {
status = xs_sendpages(transport->sock,
NULL, 0, xdr, req->rq_bytes_sent);
dprintk("RPC: xs_tcp_send_request(%u) = %d\n",
xdr->len - req->rq_bytes_sent, status);
dprintk() 的定义在 include/linux/sunrpc/debug.h
#define dprintk(args...) dfprintk(FACILITY, ## args)
#undef ifdebug
#ifdef RPC_DEBUG
# define ifdebug(fac) if (unlikely(rpc_debug & RPCDBG_##fac))
# define dfprintk(fac, args...) do { ifdebug(fac) printk(args); } while(0)
# define RPC_IFDEBUG(x) x
也就是,rpc_debug 和 子的debug选项位与,获得这个debug 语句是否输出。
其中,rpc_debug 是通过 /proc/sys/sunrpc/rpc_debug 获取的数值
子的debug 选项包括:
/*
* RPC debug facilities
*/
#define RPCDBG_XPRT 0x0001
#define RPCDBG_CALL 0x0002
#define RPCDBG_DEBUG 0x0004
#define RPCDBG_NFS 0x0008
#define RPCDBG_AUTH 0x0010
#define RPCDBG_BIND 0x0020
#define RPCDBG_SCHED 0x0040
#define RPCDBG_TRANS 0x0080
#define RPCDBG_SVCXPRT 0x0100
#define RPCDBG_SVCDSP 0x0200
#define RPCDBG_MISC 0x0400
#define RPCDBG_CACHE 0x0800
#define RPCDBG_ALL 0x7fff
也就是说,想打开其中的任何一个debug 选项,只需要 执行: # echo "子选项的值" > /proc/sys/sunrpc/rpc_debug
在 sunrpc 中的各个文件中会对 FACILITY 进行赋值,这样不同文件中使用 dprintk() 就对应了不同的子debug 选项,例如
net/sunrpc/xprtsock.c
#ifdef RPC_DEBUG
# undef RPC_DEBUG_DATA
# define RPCDBG_FACILITY RPCDBG_TRANS
#endif
#echo 32767 > /proc/sys/sunrpc/rpc_debug 就将会输出所有的debug 信息。