/* * stap -g -I../tapset sunrpc-xprtsock.stp */ %{ #include #include #include struct rpcbind_args { struct rpc_xprt * r_xprt; u32 r_prog; u32 r_vers; u32 r_prot; unsigned short r_port; const char * r_netid; const char * r_addr; const char * r_owner; int r_status; }; %} function rpcb_status:long(_rpc:long) %{ struct rpcbind_args *rpc = (struct rpcbind_args *)(long) kread(&(THIS->_rpc)); THIS->__retvalue = rpc->r_status; CATCH_DEREF_FAULT(); %} function rpcb_proc:string(_rpc:long) %{ struct rpcbind_args *rpc = (struct rpcbind_args *)(long) kread(&(THIS->_rpc)); snprintf(THIS->__retvalue, MAXSTRINGLEN, "%d:%d:%d", rpc->r_prog, rpc->r_vers, rpc->r_prot); CATCH_DEREF_FAULT(); %} probe kernel.function("tcp_sendpage").return { if ($return == -107) /* ENOTCONN */ printf("%s(%d): tcp_sendpage: return %d (%s)\n", execname(), pid(), $return, errno_str($return)); } probe module("sunrpc").function("xs_sendpages").return { if ($return == -107) /* ENOTCONN */ printf("%s(%d): xs_sendpages: return %d (%s)\n", execname(), pid(), $return, errno_str($return)); } probe module("sunrpc").function("xs_send_kvec").return { if ($return == -107) /* ENOTCONN */ printf("%s(%d): xs_send_kvec: return %d (%s)\n", execname(), pid(), $return, errno_str($return)); } /* probe module("sunrpc").function("xs_send_pagedata").return { if ($return == -107) printf("%s(%d): xs_send_pagedata: return %d (%s)\n", execname(), pid(), $return, errno_str($return)); } */ probe module("sunrpc").function("xs_tcp_send_request").return { if ($return == -107) /* ENOTCONN */ printf("%s(%d): xs_tcp_send_request: return %d (%s)\n", execname(), pid(), $return, errno_str($return)); } global rpcb_task probe module("sunrpc").function("rpcb_getport_async") { rpcb_task = $task } probe module("sunrpc").function("rpcb_getport_async").return { if (task_status(rpcb_task)) printf("%s(%d): rpcb_getport_async: status %d\n", execname(), pid(), task_status(rpcb_task)); } global rpc_args; probe module("sunrpc").function("rpcb_getport_done") { if (task_status($child)) printf("%s(%d): rpcb_getport_done: task status %d\n", execname(), pid(), task_status($child)); rpc_args = $data; } probe module("sunrpc").function("rpcb_getport_done").return { if (rpcb_status(rpc_args)) printf("%s(%d): rpcb_getport_done: rpcbind: %s: status %d\n", execname(), pid(), rpcb_proc(rpc_args), rpcb_status(rpc_args)); } global xstcp_task probe module("sunrpc").function("xs_tcp_connect") { xstcp_task = $task } probe module("sunrpc").function("xs_tcp_connect").return { if (task_status(xstcp_task)) printf("%s(%d): xs_tcp_connect: status %d\n", execname(), pid(), task_status(rpcb_task)); } probe begin { log("starting xprtsock probe") } probe end { log("ending xprtsock probe") }