summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-rw-r--r--tapset/ChangeLog6
-rw-r--r--tapset/LKET/Changelog10
-rwxr-xr-xtapset/LKET/hookid_defs.stp132
-rwxr-xr-xtapset/LKET/register_event.stp139
-rwxr-xr-xtapset/LKET/rpc.stp796
-rw-r--r--tapset/rpc.stp522
6 files changed, 1426 insertions, 179 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 00b372d1..4e53cc01 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,9 @@
+2006-09-19 Li Guanglei <guanglei@cn.ibm.com>
+
+ From Gui Jian <guijian@cn.ibm.com>
+
+ * rpc.stp: Some changes and more comments of RPC tapset
+
2006-09-18 Martin Hunt <hunt@redhat.com>
* logging.stp (stp_print_binary): New function.
diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog
index 0bb71f14..99e8d3ab 100644
--- a/tapset/LKET/Changelog
+++ b/tapset/LKET/Changelog
@@ -1,3 +1,13 @@
+2006-09-19 Li Guanglei <guanglei@cn.ibm.com>
+
+ From Gui Jian <guijian@cn.ibm.com>
+
+ * rpc.stp: New trace hooks for RPC activities on client,
+ server and scheduler.
+ * register_event.stp: Add the register_sys_event() calls
+ for new RPC trace hooks
+ * hookid_defs.stp: Add the definitions of RPC trace hooks
+
2006-09-15 Li Guanglei <guanglei@cn.ibm.com>
* *.stp: Make sure all integers passed into _lket_trace()
diff --git a/tapset/LKET/hookid_defs.stp b/tapset/LKET/hookid_defs.stp
index 71684425..c8896a56 100755
--- a/tapset/LKET/hookid_defs.stp
+++ b/tapset/LKET/hookid_defs.stp
@@ -132,6 +132,50 @@ global
HOOKID_SIGNAL_FLUSH_ENTRY,
+ /* RPC */
+ GROUP_SUNRPC,
+
+ HOOKID_SUNRPC_CLNT_CREATE_CLIENT_ENTRY,
+ HOOKID_SUNRPC_CLNT_CREATE_CLIENT_RETURN,
+ HOOKID_SUNRPC_CLNT_CLONE_CLIENT_ENTRY,
+ HOOKID_SUNRPC_CLNT_CLONE_CLIENT_RETURN,
+ HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_ENTRY,
+ HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_RETURN,
+ HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_ENTRY,
+ HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_RETURN,
+ HOOKID_SUNRPC_CLNT_CALL_SYNC_ENTRY,
+ HOOKID_SUNRPC_CLNT_CALL_SYNC_RETURN,
+ HOOKID_SUNRPC_CLNT_CALL_ASYNC_ENTRY,
+ HOOKID_SUNRPC_CLNT_CALL_ASYNC_RETURN,
+ HOOKID_SUNRPC_CLNT_RESTART_CALL_ENTRY,
+ HOOKID_SUNRPC_CLNT_RESTART_CALL_RETURN,
+
+ HOOKID_SUNRPC_SVC_REGISTER_ENTRY,
+ HOOKID_SUNRPC_SVC_REGISTER_RETURN,
+ HOOKID_SUNRPC_SVC_CREATE_ENTRY,
+ HOOKID_SUNRPC_SVC_CREATE_RETURN,
+ HOOKID_SUNRPC_SVC_DESTROY_ENTRY,
+ HOOKID_SUNRPC_SVC_DESTROY_RETURN,
+ HOOKID_SUNRPC_SVC_PROCESS_ENTRY,
+ HOOKID_SUNRPC_SVC_PROCESS_RETURN,
+ HOOKID_SUNRPC_SVC_AUTHORISE_ENTRY,
+ HOOKID_SUNRPC_SVC_AUTHORISE_RETURN,
+ HOOKID_SUNRPC_SVC_RECV_ENTRY,
+ HOOKID_SUNRPC_SVC_RECV_RETURN,
+ HOOKID_SUNRPC_SVC_SEND_ENTRY,
+ HOOKID_SUNRPC_SVC_SEND_RETURN,
+ HOOKID_SUNRPC_SVC_DROP_ENTRY,
+ HOOKID_SUNRPC_SVC_DROP_RETURN,
+
+ HOOKID_SUNRPC_SCHED_NEW_TASK_ENTRY,
+ HOOKID_SUNRPC_SCHED_NEW_TASK_RETURN,
+ HOOKID_SUNRPC_SCHED_EXECUTE_ENTRY,
+ HOOKID_SUNRPC_SCHED_EXECUTE_RETURN,
+ HOOKID_SUNRPC_SCHED_DELAY_ENTRY,
+ HOOKID_SUNRPC_SCHED_DELAY_RETURN,
+ HOOKID_SUNRPC_SCHED_RELEASE_TASK_ENTRY,
+ HOOKID_SUNRPC_SCHED_RELEASE_TASK_RETURN,
+
/* CPU Frequency */
GROUP_CPUFREQ,
@@ -304,6 +348,7 @@ global
HOOKID_NFSD_PROC_CREATE_ENTRY,
HOOKID_NFSD_PROC_CREATE_RETURN
+
%{
/* used in embedded c codes */
@@ -319,6 +364,7 @@ int _GROUP_NETDEV = 8;
int _GROUP_IOSYSCALL = 9;
int _GROUP_AIO = 10;
int _GROUP_SIGNAL = 11;
+int _GROUP_SUNRPC = 12;
int _GROUP_CPUFREQ = 15;
int _GROUP_NFS = 16;
int _GROUP_NFSD = 17;
@@ -428,6 +474,47 @@ int _HOOKID_SIGNAL_PROC_MASK_ENTRY = 13;
int _HOOKID_SIGNAL_PROC_MASK_RETURN = 14;
int _HOOKID_SIGNAL_FLUSH_ENTRY = 15;
+int _HOOKID_SUNRPC_CLNT_CREATE_CLIENT_ENTRY = 1;
+int _HOOKID_SUNRPC_CLNT_CREATE_CLIENT_RETURN = 2;
+int _HOOKID_SUNRPC_CLNT_CLONE_CLIENT_ENTRY = 3;
+int _HOOKID_SUNRPC_CLNT_CLONE_CLIENT_RETURN = 4;
+int _HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_ENTRY = 5;
+int _HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_RETURN = 6;
+int _HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_ENTRY = 7;
+int _HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_RETURN = 8;
+int _HOOKID_SUNRPC_CLNT_CALL_SYNC_ENTRY = 9;
+int _HOOKID_SUNRPC_CLNT_CALL_SYNC_RETURN = 10;
+int _HOOKID_SUNRPC_CLNT_CALL_ASYNC_ENTRY = 11;
+int _HOOKID_SUNRPC_CLNT_CALL_ASYNC_RETURN = 12;
+int _HOOKID_SUNRPC_CLNT_RESTART_CALL_ENTRY = 13;
+int _HOOKID_SUNRPC_CLNT_RESTART_CALL_RETURN = 14;
+
+int _HOOKID_SUNRPC_SVC_REGISTER_ENTRY = 33;
+int _HOOKID_SUNRPC_SVC_REGISTER_RETURN = 34;
+int _HOOKID_SUNRPC_SVC_CREATE_ENTRY = 35;
+int _HOOKID_SUNRPC_SVC_CREATE_RETURN = 36;
+int _HOOKID_SUNRPC_SVC_DESTROY_ENTRY = 37;
+int _HOOKID_SUNRPC_SVC_DESTROY_RETURN = 38;
+int _HOOKID_SUNRPC_SVC_PROCESS_ENTRY = 39;
+int _HOOKID_SUNRPC_SVC_PROCESS_RETURN = 40;
+int _HOOKID_SUNRPC_SVC_AUTHORISE_ENTRY = 41;
+int _HOOKID_SUNRPC_SVC_AUTHORISE_RETURN = 42;
+int _HOOKID_SUNRPC_SVC_RECV_ENTRY = 43;
+int _HOOKID_SUNRPC_SVC_RECV_RETURN = 44;
+int _HOOKID_SUNRPC_SVC_SEND_ENTRY = 45;
+int _HOOKID_SUNRPC_SVC_SEND_RETURN = 46;
+int _HOOKID_SUNRPC_SVC_DROP_ENTRY = 47;
+int _HOOKID_SUNRPC_SVC_DROP_RETURN = 48;
+
+int _HOOKID_SUNRPC_SCHED_NEW_TASK_ENTRY = 65;
+int _HOOKID_SUNRPC_SCHED_NEW_TASK_RETURN = 66;
+int _HOOKID_SUNRPC_SCHED_EXECUTE_ENTRY = 67;
+int _HOOKID_SUNRPC_SCHED_EXECUTE_RETURN = 68;
+int _HOOKID_SUNRPC_SCHED_DELAY_ENTRY = 69;
+int _HOOKID_SUNRPC_SCHED_DELAY_RETURN = 70;
+int _HOOKID_SUNRPC_SCHED_RELEASE_TASK_ENTRY = 71;
+int _HOOKID_SUNRPC_SCHED_RELEASE_TASK_RETURN = 72;
+
int _HOOKID_SWITCH_CPUFREQ = 1;
int _HOOKID_NFS_FOP_LLSEEK_ENTRY= 1;
@@ -540,7 +627,6 @@ int _HOOKID_NFSD_PROC_RENAME_ENTRY= 35;
int _HOOKID_NFSD_PROC_RENAME_RETURN= 36;
int _HOOKID_NFSD_PROC_CREATE_ENTRY= 37;
int _HOOKID_NFSD_PROC_CREATE_RETURN= 38;
-
%}
function hookid_init()
@@ -668,6 +754,49 @@ function hookid_init()
HOOKID_SIGNAL_PROC_MASK_RETURN = 14
HOOKID_SIGNAL_FLUSH_ENTRY = 15
+ GROUP_SUNRPC = 12
+
+ HOOKID_SUNRPC_CLNT_CREATE_CLIENT_ENTRY = 1
+ HOOKID_SUNRPC_CLNT_CREATE_CLIENT_RETURN = 2
+ HOOKID_SUNRPC_CLNT_CLONE_CLIENT_ENTRY = 3
+ HOOKID_SUNRPC_CLNT_CLONE_CLIENT_RETURN = 4
+ HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_ENTRY = 5
+ HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_RETURN = 6
+ HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_ENTRY = 7
+ HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_RETURN = 8
+ HOOKID_SUNRPC_CLNT_CALL_SYNC_ENTRY = 9
+ HOOKID_SUNRPC_CLNT_CALL_SYNC_RETURN = 10
+ HOOKID_SUNRPC_CLNT_CALL_ASYNC_ENTRY = 11
+ HOOKID_SUNRPC_CLNT_CALL_ASYNC_RETURN = 12
+ HOOKID_SUNRPC_CLNT_RESTART_CALL_ENTRY = 13
+ HOOKID_SUNRPC_CLNT_RESTART_CALL_RETURN = 14
+
+ HOOKID_SUNRPC_SVC_REGISTER_ENTRY = 33
+ HOOKID_SUNRPC_SVC_REGISTER_RETURN = 34
+ HOOKID_SUNRPC_SVC_CREATE_ENTRY = 35
+ HOOKID_SUNRPC_SVC_CREATE_RETURN = 36
+ HOOKID_SUNRPC_SVC_DESTROY_ENTRY = 37
+ HOOKID_SUNRPC_SVC_DESTROY_RETURN = 38
+ HOOKID_SUNRPC_SVC_PROCESS_ENTRY = 39
+ HOOKID_SUNRPC_SVC_PROCESS_RETURN = 40
+ HOOKID_SUNRPC_SVC_AUTHORISE_ENTRY = 41
+ HOOKID_SUNRPC_SVC_AUTHORISE_RETURN = 42
+ HOOKID_SUNRPC_SVC_RECV_ENTRY = 43
+ HOOKID_SUNRPC_SVC_RECV_RETURN = 44
+ HOOKID_SUNRPC_SVC_SEND_ENTRY = 45
+ HOOKID_SUNRPC_SVC_SEND_RETURN = 46
+ HOOKID_SUNRPC_SVC_DROP_ENTRY = 47
+ HOOKID_SUNRPC_SVC_DROP_RETURN = 48
+
+ HOOKID_SUNRPC_SCHED_NEW_TASK_ENTRY = 65
+ HOOKID_SUNRPC_SCHED_NEW_TASK_RETURN = 66
+ HOOKID_SUNRPC_SCHED_EXECUTE_ENTRY = 67
+ HOOKID_SUNRPC_SCHED_EXECUTE_RETURN = 68
+ HOOKID_SUNRPC_SCHED_DELAY_ENTRY = 69
+ HOOKID_SUNRPC_SCHED_DELAY_RETURN = 70
+ HOOKID_SUNRPC_SCHED_RELEASE_TASK_ENTRY = 71
+ HOOKID_SUNRPC_SCHED_RELEASE_TASK_RETURN = 72
+
GROUP_CPUFREQ = 15
HOOKID_SWITCH_CPUFREQ = 2
@@ -787,7 +916,6 @@ function hookid_init()
HOOKID_NFSD_PROC_RENAME_RETURN= 36
HOOKID_NFSD_PROC_CREATE_ENTRY= 37
HOOKID_NFSD_PROC_CREATE_RETURN= 38
-
}
diff --git a/tapset/LKET/register_event.stp b/tapset/LKET/register_event.stp
index 0809146f..8579e9c3 100755
--- a/tapset/LKET/register_event.stp
+++ b/tapset/LKET/register_event.stp
@@ -10,8 +10,8 @@ global usr_evt_name, usr_evt_fmt
%{
-#define _MAXGROUPID 20
-#define _MAXHOOKID 80
+#define _MAXGROUPID 0xFF
+#define _MAXHOOKID 0xFF
int get_fmtcode(char *fmt)
{
@@ -321,6 +321,139 @@ function register_sys_events()
register_sys_event(GROUP_SIGNAL, HOOKID_SIGNAL_FLUSH_ENTRY,
"INT32", "pid")
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CREATE_CLIENT_ENTRY,
+ "STRING:INT64:INT8:INT16:INT16:INT8",
+ "server:prog:vers:prot:port:authflavor")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CREATE_CLIENT_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CLONE_CLIENT_ENTRY,
+ "STRING:INT64:INT16:INT16:INT32",
+ "server:prog:tasks:clones:rpccount")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CLONE_CLIENT_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_ENTRY,
+ "STRING:INT64:INT16:INT16:INT32",
+ "server:prog:clones:tasks:rpccount")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_RETURN,
+ "INT8", "void")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_ENTRY,
+ "STRING:INT64:INT8:INT64:INT8",
+ "server:old_prog:old_vers:new_prog:new_vers")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CALL_SYNC_ENTRY,
+ "STRING:INT64:INT8:INT64:INT64",
+ "server:prog:vers:proc:flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CALL_SYNC_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CALL_ASYNC_ENTRY,
+ "STRING:INT64:INT8:INT64:INT64",
+ "server:prog:vers:proc:flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_CALL_ASYNC_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_RESTART_CALL_ENTRY,
+ "INT64:INT64",
+ "tk_pid:tk_flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_CLNT_RESTART_CALL_RETURN,
+ "INT8", "void")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_REGISTER_ENTRY,
+ "STRING:INT64:INT16:INT32",
+ "service:program:protocol:prot")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_REGISTER_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_CREATE_ENTRY,
+ "INT64:INT8:INT8",
+ "program:high_version:num_versions")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_CREATE_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_DESTROY_ENTRY,
+ "STRING:INT64:INT32",
+ "service:program:num_threads")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_DESTROY_RETURN,
+ "INT8", "void")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_PROCESS_ENTRY,
+ "STRING:INT64:INT64:INT64:INT64:INT8:INT8",
+ "service:sv_prog:peer_ip:rq_xid:rq_prog:rq_vers:rq_proc")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_PROCESS_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_AUTHORISE_ENTRY,
+ "INT64:INT64:INT64:INT8:INT64",
+ "peer_ip:xid:prog:vers:proc")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_AUTHORISE_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_SEND_ENTRY,
+ "STRING:INT64:INT64:INT64:INT64:INT8:INT64",
+ "sv_name:peer_ip:sv_prog:xid:prog:vers:proc")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_SEND_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_RECV_ENTRY,
+ "STRING:INT64",
+ "sv_name:timeout")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_RECV_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_DROP_ENTRY,
+ "STRING:INT64:INT64:INT64:INT8:INT64",
+ "sv_name:peer_ip:xid:prog:vers:proc")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SVC_DROP_RETURN,
+ "INT8", "void")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_NEW_TASK_ENTRY,
+ "INT64:INT64:INT8:INT64:INT64",
+ "xid:prog:vers:prot:flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_NEW_TASK_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_RELEASE_TASK_ENTRY,
+ "INT64:INT64:INT8:INT64:INT64",
+ "xid:prog:vers:prot:flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_RELEASE_TASK_RETURN,
+ "INT8", "void")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_EXECUTE_ENTRY,
+ "INT64:INT64:INT8:INT64:INT64:INT64",
+ "xid:prog:vers:prot:tk_pid:tk_flags")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_EXECUTE_RETURN,
+ "INT64", "return")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_DELAY_ENTRY,
+ "INT64:INT64:INT64:INT64:INT64",
+ "xid:prog:tk_pid:tk_flags:delay")
+
+ register_sys_event(GROUP_SUNRPC, HOOKID_SUNRPC_SCHED_DELAY_RETURN,
+ "INT8", "void")
+
register_sys_event(GROUP_CPUFREQ, HOOKID_SWITCH_CPUFREQ,
"INT64", "cpufreq")
@@ -595,7 +728,6 @@ function register_sys_events()
register_sys_event(GROUP_NFSD, HOOKID_NFSD_RENAME_RETURN,
"INT32","return")
-
register_sys_event(GROUP_NFSD, HOOKID_NFSD_CLOSE_ENTRY,
"STRING",
"filename")
@@ -648,6 +780,7 @@ function register_sys_events()
"size:ino0:ino1:ino2:version:filename")
register_sys_event(GROUP_NFSD, HOOKID_NFSD_PROC_CREATE_RETURN,
"INT32","return")
+
reset_maxaction()
}
diff --git a/tapset/LKET/rpc.stp b/tapset/LKET/rpc.stp
new file mode 100755
index 00000000..256df6e9
--- /dev/null
+++ b/tapset/LKET/rpc.stp
@@ -0,0 +1,796 @@
+# SunRPC trace hooks
+# Copyright (C) 2006 IBM Corp.
+#
+# This file is part of systemtap, and is free software. You can
+# redistribute it and/or modify it under the terms of the GNU General
+# Public License (GPL); either version 2, or (at your option) any
+# later version.
+#
+probe never
+{
+ printf("%d\n", GROUP_SUNRPC)
+}
+
+probe addevent.sunrpc
+ = addevent.sunrpc.entry, addevent.sunrpc.return
+{}
+
+probe addevent.sunrpc.entry
+ =
+ addevent.sunrpc.clnt.entry,
+ addevent.sunrpc.svc.entry,
+ addevent.sunrpc.sched.entry
+{}
+
+probe addevent.sunrpc.return
+ =
+ addevent.sunrpc.clnt.return,
+ addevent.sunrpc.svc.return,
+ addevent.sunrpc.sched.return
+{}
+
+/******************************************************************
+ * trace hooks on high level RPC client functions *
+ ******************************************************************/
+probe addevent.sunrpc.clnt
+ = addevent.sunrpc.clnt.entry, addevent.sunrpc.clnt.return
+{}
+
+probe addevent.sunrpc.clnt.entry
+ =
+ addevent.sunrpc.clnt.create_client.entry,
+ addevent.sunrpc.clnt.clone_client.entry,
+ addevent.sunrpc.clnt.bind_new_program.entry,
+ addevent.sunrpc.clnt.shutdown_client.entry,
+ addevent.sunrpc.clnt.call_sync.entry,
+ addevent.sunrpc.clnt.call_async.entry,
+ addevent.sunrpc.clnt.restart_call.entry
+{}
+
+probe addevent.sunrpc.clnt.return
+ =
+ addevent.sunrpc.clnt.create_client.return,
+ addevent.sunrpc.clnt.clone_client.return,
+ addevent.sunrpc.clnt.bind_new_program.return,
+ addevent.sunrpc.clnt.shutdown_client.return,
+ addevent.sunrpc.clnt.call_sync.return,
+ addevent.sunrpc.clnt.call_async.return,
+ addevent.sunrpc.clnt.restart_call.return
+{}
+
+// Fires when an RPC client is to be created
+probe addevent.sunrpc.clnt.create_client.entry
+ += _addevent.sunrpc.clnt.create_client.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.create_client.entry
+ = sunrpc.clnt.create_client
+{
+ log_sunrpc_client_info(HOOKID_SUNRPC_CLNT_CREATE_CLIENT_ENTRY,
+ servername, prog, vers, prot, port, authflavor)
+}
+
+probe addevent.sunrpc.clnt.create_client.return
+ += _addevent.sunrpc.clnt.create_client.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.create_client.return
+ = sunrpc.clnt.create_client.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_CLNT_CREATE_CLIENT_RETURN,
+ $return)
+}
+
+// Fires when the RPC client structure is to be cloned
+probe addevent.sunrpc.clnt.clone_client.entry
+ += _addevent.sunrpc.clnt.clone_client.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.clone_client.entry
+ = sunrpc.clnt.clone_client
+{
+ log_sunrpc_client_info(HOOKID_SUNRPC_CLNT_CLONE_CLIENT_ENTRY,
+ servername, prog, vers, prot, port, authflavor)
+}
+
+probe addevent.sunrpc.clnt.clone_client.return
+ += _addevent.sunrpc.clnt.clone_client.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.clone_client.return
+ = sunrpc.clnt.clone_client.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_CLNT_CLONE_CLIENT_RETURN,
+ $return)
+}
+
+// Fires when an RPC client is to be shut down.
+probe addevent.sunrpc.clnt.shutdown_client.entry
+ += _addevent.sunrpc.clnt.shutdown_client.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.shutdown_client.entry
+ = sunrpc.clnt.shutdown_client
+{
+ log_sunrpc_shutdown_client(HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_ENTRY,
+ servername, prog, clones, tasks, rpccnt)
+}
+
+probe addevent.sunrpc.clnt.shutdown_client.return
+ += _addevent.sunrpc.clnt.shutdown_client.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.shutdown_client.return
+ = sunrpc.clnt.shutdown_client.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_CLNT_SHUTDOWN_CLIENT_RETURN)
+}
+
+function log_sunrpc_shutdown_client(hookid:long, servername:string,
+ prog:long, clones:long, tasks:long, rpccnt:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%2b%2b%4b",
+ THIS->servername, (_FMT_)THIS->prog,
+ (_FMT_)THIS->clones, (_FMT_)THIS->tasks,
+ (_FMT_)THIS->rpccnt);
+%}
+
+// Fires when a new RPC program is to be bound an existing client
+probe addevent.sunrpc.clnt.bind_new_program.entry
+ += _addevent.sunrpc.clnt.bind_new_program.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.bind_new_program.entry
+ = sunrpc.clnt.bind_new_program
+{
+ log_sunrpc_bind_new_program(HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_ENTRY,
+ servername, old_prog, old_vers, prog, vers)
+}
+
+probe addevent.sunrpc.clnt.bind_new_program.return
+ += _addevent.sunrpc.clnt.bind_new_program.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.bind_new_program.return
+ = sunrpc.clnt.bind_new_program.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_CLNT_BIND_NEW_PROGRAM_RETURN,
+ $return)
+}
+
+function log_sunrpc_bind_new_program(hookid:long, servername:string,
+ old_prog:long, old_vers:long, prog:long, vers:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%1b%8b%1b",
+ THIS->servername, (_FMT_)THIS->old_prog,
+ (_FMT_)THIS->old_vers, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers);
+%}
+
+// rpc_call_sync
+probe addevent.sunrpc.clnt.call_sync.entry
+ += _addevent.sunrpc.clnt.call_sync.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.call_sync.entry
+ = sunrpc.clnt.call_sync
+{
+ log_sunrpc_call_sync(HOOKID_SUNRPC_CLNT_CALL_SYNC_ENTRY, servername,
+ prog, vers, proc, flags)
+}
+
+probe addevent.sunrpc.clnt.call_sync.return
+ += _addevent.sunrpc.clnt.call_sync.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.call_sync.return
+ = sunrpc.clnt.call_sync.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_CLNT_CALL_SYNC_RETURN, $return)
+}
+
+function log_sunrpc_call_sync(hookid:long, servername:string, prog:long,
+ vers:long, proc:long, flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%1b%8b%8b",
+ THIS->servername, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->proc,
+ (_FMT_)THIS->flags);
+%}
+
+// rpc_call_async
+probe addevent.sunrpc.clnt.call_async.entry
+ += _addevent.sunrpc.clnt.call_async.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.call_async.entry
+ = sunrpc.clnt.call_async
+{
+ log_sunrpc_call_async(HOOKID_SUNRPC_CLNT_CALL_ASYNC_ENTRY, servername,
+ prog, vers, proc, flags)
+}
+
+probe addevent.sunrpc.clnt.call_async.return
+ += _addevent.sunrpc.clnt.call_async.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.call_async.return
+ = sunrpc.clnt.call_async.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_CLNT_CALL_ASYNC_RETURN, $return)
+}
+
+function log_sunrpc_call_async(hookid:long, servername:string, prog:long,
+ vers:long, proc:long, flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%1b%8b%8b",
+ THIS->servername, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->proc,
+ (_FMT_)THIS->flags);
+%}
+
+// Fires when want to restart a task
+probe addevent.sunrpc.clnt.restart_call.entry
+ += _addevent.sunrpc.clnt.restart_call.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.restart_call.entry
+ = sunrpc.clnt.restart_call
+{
+ log_sunrpc_restart_call(HOOKID_SUNRPC_CLNT_RESTART_CALL_ENTRY, tk_pid,
+ tk_flags)
+}
+
+probe addevent.sunrpc.clnt.restart_call.return
+ += _addevent.sunrpc.clnt.restart_call.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.clnt.restart_call.return
+ = sunrpc.clnt.restart_call.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_CLNT_RESTART_CALL_RETURN) //void
+}
+
+function log_sunrpc_restart_call(hookid:long, tk_pid:long, tk_flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%8b",
+ (_FMT_)THIS->tk_pid, (_FMT_)THIS->tk_flags);
+%}
+
+/*********************************************
+ * Probe points on RPC server interface *
+ ********************************************/
+probe addevent.sunrpc.svc
+ = addevent.sunrpc.svc.entry, addevent.sunrpc.svc.return
+{}
+
+probe addevent.sunrpc.svc.entry
+ =
+ addevent.sunrpc.svc.register.entry,
+ addevent.sunrpc.svc.create.entry,
+ addevent.sunrpc.svc.destroy.entry,
+ addevent.sunrpc.svc.process.entry,
+ addevent.sunrpc.svc.authorise.entry,
+ addevent.sunrpc.svc.recv.entry,
+ addevent.sunrpc.svc.send.entry,
+ addevent.sunrpc.svc.drop.entry
+{}
+
+probe addevent.sunrpc.svc.return
+ =
+ addevent.sunrpc.svc.register.return,
+ addevent.sunrpc.svc.create.return,
+ addevent.sunrpc.svc.destroy.return,
+ addevent.sunrpc.svc.process.return,
+ addevent.sunrpc.svc.authorise.return,
+ addevent.sunrpc.svc.recv.return,
+ addevent.sunrpc.svc.send.return,
+ addevent.sunrpc.svc.drop.return
+{}
+
+// Fires when an RPC service is to be registered with the local portmapper.
+probe addevent.sunrpc.svc.register.entry
+ += _addevent.sunrpc.svc.register.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.register.entry
+ = sunrpc.svc.register
+{
+ log_sunrpc_svc_register(HOOKID_SUNRPC_SVC_REGISTER_ENTRY, sv_name,
+ prog, prot, port)
+}
+
+probe addevent.sunrpc.svc.register.return
+ += _addevent.sunrpc.svc.register.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.register.return
+ = sunrpc.svc.register.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_REGISTER_RETURN,
+ $return)
+}
+
+function log_sunrpc_svc_register(hookid:long, sv_name:string,
+ prog:long, prot:long, port:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%2b%4b",
+ THIS->sv_name, (_FMT_)THIS->prog,
+ (_FMT_)THIS->prot, (_FMT_)THIS->port);
+%}
+
+// Fires when an RPC service is to be created
+probe addevent.sunrpc.svc.create.entry
+ += _addevent.sunrpc.svc.create.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.create.entry
+ = sunrpc.svc.create
+{
+ log_sunrpc_svc_create(HOOKID_SUNRPC_SVC_CREATE_ENTRY, prog,
+ pg_nvers, bufsize)
+}
+
+probe addevent.sunrpc.svc.create.return
+ += _addevent.sunrpc.svc.create.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.create.return
+ = sunrpc.svc.create.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_CREATE_RETURN, $return)
+}
+
+function log_sunrpc_svc_create(hookid:long, prog:long,
+ pg_nvers:long, bufsize:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%1b%4b",
+ (_FMT_)THIS->prog, (_FMT_)THIS->pg_nvers,
+ (_FMT_)THIS->bufsize);
+%}
+
+// Fires when an RPC service is to be destroyed
+probe addevent.sunrpc.svc.destroy.entry
+ += _addevent.sunrpc.svc.destroy.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.destroy.entry
+ = sunrpc.svc.destroy
+{
+ log_sunrpc_svc_destroy(HOOKID_SUNRPC_SVC_DESTROY_ENTRY,
+ sv_name, sv_prog, sv_nrthreads)
+}
+
+probe addevent.sunrpc.svc.destroy.return
+ += _addevent.sunrpc.svc.destroy.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.destroy.return
+ = sunrpc.svc.destroy.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_SVC_DESTROY_RETURN)
+}
+
+function log_sunrpc_svc_destroy(hookid:long, sv_name:string,
+ sv_prog:long, sv_nrthreads:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%4b", THIS->sv_name,
+ (_FMT_)THIS->sv_prog, (_FMT_)THIS->sv_nrthreads);
+%}
+
+// Fires when an RPC request is to be processed
+probe addevent.sunrpc.svc.process.entry
+ += _addevent.sunrpc.svc.process.entry
+{
+ update_record()
+}
+probe _addevent.sunrpc.svc.process.entry
+ = sunrpc.svc.process
+{
+ log_sunrpc_task_info(HOOKID_SUNRPC_SVC_PROCESS_ENTRY, sv_name,
+ sv_prog, peer_ip, rq_xid, rq_prog, rq_vers, rq_proc)
+}
+
+probe addevent.sunrpc.svc.process.return
+ += _addevent.sunrpc.svc.process.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.process.return
+ = sunrpc.svc.process.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_PROCESS_RETURN, $return)
+}
+
+// Fires when an RPC request is to be authorised
+probe addevent.sunrpc.svc.authorise.entry
+ += _addevent.sunrpc.svc.authorise.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.authorise.entry
+ = sunrpc.svc.authorise
+{
+ log_sunrpc_svc_authorise(HOOKID_SUNRPC_SVC_AUTHORISE_ENTRY, sv_name,
+ peer_ip, rq_xid, rq_prog, rq_vers, rq_proc)
+}
+
+probe addevent.sunrpc.svc.authorise.return
+ += _addevent.sunrpc.svc.authorise.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.authorise.return
+ = sunrpc.svc.authorise.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_AUTHORISE_RETURN, $return)
+}
+
+function log_sunrpc_svc_authorise(hookid:long, sv_name:string, peer_ip:long,
+ rq_xid:long, rq_prog:long, rq_vers:long, rq_proc:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%s%8b%8b%8b%1b%8b",
+ THIS->sv_name, (_FMT_)THIS->peer_ip,
+ (_FMT_)THIS->rq_xid, (_FMT_)THIS->rq_prog,
+ (_FMT_)THIS->rq_vers, (_FMT_)THIS->rq_proc);
+%}
+
+/*
+ * Fires when receiving the next request on any socket.
+ */
+probe addevent.sunrpc.svc.recv.entry
+ += _addevent.sunrpc.svc.recv.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.recv.entry
+ = sunrpc.svc.recv
+{
+ log_sunrpc_svc_recv(HOOKID_SUNRPC_SVC_SEND_ENTRY, sv_name, timeout)
+}
+
+probe addevent.sunrpc.svc.recv.return
+ += _addevent.sunrpc.svc.recv.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.recv.return
+ = sunrpc.svc.recv.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_SEND_RETURN, $return)
+}
+
+function log_sunrpc_svc_recv(hookid:long, sv_name:string, timeout:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%s%8b", THIS->sv_name,
+ (_FMT_)THIS->timeout);
+%}
+
+// Fires when want to return reply to client.
+probe addevent.sunrpc.svc.send.entry
+ += _addevent.sunrpc.svc.send.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.send.entry
+ = sunrpc.svc.send
+{
+ log_sunrpc_svc_send(HOOKID_SUNRPC_SVC_SEND_ENTRY, sv_name, peer_ip,
+ rq_xid, rq_prog, rq_vers, rq_proc)
+}
+
+probe addevent.sunrpc.svc.send.return
+ += _addevent.sunrpc.svc.send.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.send.return
+ = sunrpc.svc.send.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SVC_SEND_RETURN, $return)
+}
+
+function log_sunrpc_svc_send(hookid:long, sv_name:string, peer_ip:long,
+ rq_xid:long, rq_prog:long, rq_vers:long, rq_proc:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%s%8b%8b%8b%8b%1b%8b",
+ THIS->sv_name, (_FMT_)THIS->peer_ip,
+ (_FMT_)THIS->rq_xid, (_FMT_)THIS->rq_prog,
+ (_FMT_)THIS->rq_vers, (_FMT_)THIS->rq_proc);
+%}
+
+// Fires when a request is to be dropped
+probe addevent.sunrpc.svc.drop.entry
+ += _addevent.sunrpc.svc.drop.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.drop.entry
+ = sunrpc.svc.drop
+{
+ log_sunrpc_svc_drop(HOOKID_SUNRPC_SVC_DROP_ENTRY, sv_name, peer_ip,
+ rq_xid, rq_prog, rq_vers, rq_proc)
+}
+
+probe addevent.sunrpc.svc.drop.return
+ += _addevent.sunrpc.svc.drop.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.svc.drop.return
+ = sunrpc.svc.drop.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_SVC_DROP_RETURN)
+}
+
+function log_sunrpc_svc_drop(hookid:long, sv_name:string, peer_ip:long,
+ rq_xid:long, rq_prog:long, rq_vers:long, rq_proc:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%s%8b%8b%8b%1b%8b",
+ THIS->sv_name, (_FMT_)THIS->peer_ip,
+ (_FMT_)THIS->rq_xid, (_FMT_)THIS->rq_prog,
+ (_FMT_)THIS->rq_vers, (_FMT_)THIS->rq_proc);
+%}
+
+/*******************************************************************
+ * Probe points on RPC scheduler *
+ ******************************************************************/
+probe addevent.sunrpc.sched
+ = addevent.sunrpc.sched.entry, addevent.sunrpc.sched.return
+{}
+
+probe addevent.sunrpc.sched.entry
+ =
+ addevent.sunrpc.sched.new_task.entry,
+ addevent.sunrpc.sched.execute.entry,
+ addevent.sunrpc.sched.delay.entry,
+ addevent.sunrpc.sched.release_task.entry
+{}
+
+probe addevent.sunrpc.sched.return
+ =
+ addevent.sunrpc.sched.new_task.return,
+ addevent.sunrpc.sched.execute.return,
+ addevent.sunrpc.sched.delay.return,
+ addevent.sunrpc.sched.release_task.return
+{}
+
+// Fires when creating a new task for the specified client
+probe addevent.sunrpc.sched.new_task.entry
+ += _addevent.sunrpc.sched.new_task.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.new_task.entry
+ = sunrpc.sched.new_task
+{
+ log_sunrpc_new_task(HOOKID_SUNRPC_SCHED_NEW_TASK_ENTRY, xid, prog,
+ vers, prot, flags)
+}
+
+probe addevent.sunrpc.sched.new_task.return
+ += _addevent.sunrpc.sched.new_task.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.new_task.return
+ = sunrpc.sched.new_task.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SCHED_NEW_TASK_RETURN, $return)
+}
+
+function log_sunrpc_new_task(hookid:long, xid:long, prog:long, vers:long,
+ prot:long, flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%8b%1b%8b%8b",
+ (_FMT_)THIS->xid, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->prot,
+ (_FMT_)THIS->flags);
+%}
+
+// Fires when releasing a task
+probe addevent.sunrpc.sched.release_task.entry
+ += _addevent.sunrpc.sched.release_task.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.release_task.entry
+ = sunrpc.sched.release_task
+{
+ log_sunrpc_release_task(HOOKID_SUNRPC_SCHED_RELEASE_TASK_ENTRY,
+ xid, prog, vers, prot, tk_flags)
+}
+
+probe addevent.sunrpc.sched.release_task.return
+ += _addevent.sunrpc.sched.release_task.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.release_task.return
+ = sunrpc.sched.release_task.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_SCHED_RELEASE_TASK_RETURN)
+}
+
+function log_sunrpc_release_task(hookid:long, xid:long, prog:long, vers:long,
+ prot:long, flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%8b%1b%8b%8b",
+ (_FMT_)THIS->xid, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->prot,
+ (_FMT_)THIS->flags);
+%}
+
+// Fires when an RPC request is to be executed
+probe addevent.sunrpc.sched.execute.entry
+ += _addevent.sunrpc.sched.execute.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.execute.entry
+ = sunrpc.sched.execute
+{
+ log_sunrpc_execute(HOOKID_SUNRPC_SCHED_EXECUTE_ENTRY, xid, prog,
+ vers, prot, tk_pid, tk_flags)
+}
+
+probe addevent.sunrpc.sched.execute.return
+ += _addevent.sunrpc.sched.execute.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.execute.return
+ = sunrpc.sched.execute.return
+{
+ log_sunrpc_return_int64(HOOKID_SUNRPC_SCHED_EXECUTE_RETURN, $return)
+}
+
+function log_sunrpc_execute(hookid:long, xid:long, prog:long, vers:long,
+ prot:long, tk_pid:long, tk_flags:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%8b%1b%8b%8b%8b",
+ (_FMT_)THIS->xid, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->prot,
+ (_FMT_)THIS->tk_pid, (_FMT_)THIS->tk_flags);
+%}
+
+// Fires when want to delay an RPC request
+probe addevent.sunrpc.sched.delay.entry
+ += _addevent.sunrpc.sched.delay.entry
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.delay.entry
+ = sunrpc.sched.delay
+{
+ log_sunrpc_delay(HOOKID_SUNRPC_SCHED_DELAY_ENTRY, xid, prog,
+ tk_pid, tk_flags, delay)
+}
+
+probe addevent.sunrpc.sched.delay.return
+ += _addevent.sunrpc.sched.delay.return
+{
+ update_record()
+}
+
+probe _addevent.sunrpc.sched.delay.return
+ = sunrpc.sched.delay.return
+{
+ log_sunrpc_return_void(HOOKID_SUNRPC_SCHED_DELAY_RETURN)
+}
+
+function log_sunrpc_delay(hookid:long, xid:long, prog:long, tk_pid:long,
+ tk_flags:long, delay:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b%8b%8b%8b%8b",
+ (_FMT_)THIS->xid, (_FMT_)THIS->prog,
+ (_FMT_)THIS->tk_pid, (_FMT_)THIS->tk_flags,
+ (_FMT_)THIS->delay);
+%}
+
+/******************************************************************
+ * Helper functions *
+ *****************************************************************/
+function log_sunrpc_client_info(hookid:long, servername:string,
+ prog:long, vers:long, prot:long,
+ port:long, authflavor:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%1b%2b%2b%1b",
+ THIS->servername, (_FMT_)THIS->prog,
+ (_FMT_)THIS->vers, (_FMT_)THIS->prot,
+ (_FMT_)THIS->port, (_FMT_)THIS->authflavor);
+%}
+
+function log_sunrpc_task_info(hookid:long, sv_name:string,
+ sv_prog:long, peer_ip:long, rq_xid:long,
+ rq_prog:long, rq_vers:long, rq_proc:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%0s%8b%8b%8b%8b%1b%1b",
+ THIS->sv_name, (_FMT_)THIS->sv_prog,
+ (_FMT_)THIS->peer_ip, (_FMT_)THIS->rq_xid,
+ (_FMT_)THIS->rq_prog, (_FMT_)THIS->rq_vers,
+ (_FMT_)THIS->rq_proc);
+%}
+
+function log_sunrpc_return_int64(hookid:long, ret:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%8b", (_FMT_)THIS->ret);
+%}
+
+function log_sunrpc_return_int32(hookid:long, ret:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%4b", (_FMT_)THIS->ret);
+%}
+
+function log_sunrpc_return_int16(hookid:long, ret:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%2b", (_FMT_)THIS->ret);
+%}
+
+function log_sunrpc_return_int8(hookid:long, ret:long)
+%{
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%1b", (_FMT_)THIS->ret);
+%}
+
+function log_sunrpc_return_void(hookid:long)
+%{
+#define VOIDRETURN 0
+ _lket_trace(_GROUP_SUNRPC, THIS->hookid, "%1b", (_FMT_)VOIDRETURN);
+%}
+
diff --git a/tapset/rpc.stp b/tapset/rpc.stp
index de54c122..c300b5e4 100644
--- a/tapset/rpc.stp
+++ b/tapset/rpc.stp
@@ -54,18 +54,25 @@ probe sunrpc.clnt.return =
* rpc_create_client(struct rpc_xprt *xprt, char *servname,
* struct rpc_program *info, u32 version,
* rpc_authflavor_t authflavor)
- *
+ *
+ * @servername: the server machine name
+ * @progname: the RPC program name
+ * @prog: the RPC program number
+ * @vers: the RPC program version number
+ * @prot: the IP protocol number
+ * @port: the port number
+ * @authflavor: the authentication flavor
*/
probe sunrpc.clnt.create_client = kernel.function("rpc_create_client") ?,
module("sunrpc").function("rpc_create_client") ?
{
- servername = kernel_string($servname) /* server name */
- progname = kernel_string($info->name) /* program name */
- prog = $info->number /* program number */
- vers = vers_from_prog($info, $version) /* program version */
- prot = $xprt->prot /* IP protocol */
- port = $xprt->port /* port number */
- authflavor = $authflavor /* authentication flavor */
+ servername = kernel_string($servname)
+ progname = kernel_string($info->name)
+ prog = $info->number
+ vers = vers_from_prog($info, $version)
+ prot = $xprt->prot
+ port = $xprt->port
+ authflavor = $authflavor
name = "sunrpc.clnt.create_client"
argstr = sprintf("%s %s %d %d %d %d %d", servername, progname,
@@ -77,17 +84,26 @@ probe sunrpc.clnt.create_client.return =
module("sunrpc").function("rpc_create_client").return ?
{
name = "sunrpc.clnt.create_client"
+ retstr = returnstr($return)
}
/*
* Fires when the RPC client structure is to be cloned
*
* struct rpc_clnt * rpc_clone_client(struct rpc_clnt *clnt)
+ *
+ * @servername: the server machine name
+ * @progname: the RPC program name
+ * @prog: the RPC program number
+ * @vers: the RPC program version number
+ * @prot: the IP protocol number
+ * @port: the port number
+ * @authflavor: the authentication flavor
*/
probe sunrpc.clnt.clone_client = kernel.function("rpc_clone_client") ?,
module("sunrpc").function("rpc_clone_client") ?
{
- servname = kernel_string($clnt->cl_server)
+ servername = kernel_string($clnt->cl_server)
progname = kernel_string($clnt->cl_protname)
prog = prog_from_clnt($clnt)
vers = vers_from_clnt($clnt)
@@ -96,7 +112,7 @@ probe sunrpc.clnt.clone_client = kernel.function("rpc_clone_client") ?,
authflavor = $clnt->cl_auth->au_flavor
name = "sunrpc.clnt.clone_client"
- argstr = sprintf("%s %s %d %d %d %d %d", servname, progname,
+ argstr = sprintf("%s %s %d %d %d %d %d", servername, progname,
prog, vers, prot, port, authflavor)
}
@@ -105,6 +121,71 @@ probe sunrpc.clnt.clone_client.return =
module("sunrpc").function("rpc_clone_client").return ?
{
name = "sunrpc.clnt.clone_client"
+ retstr = returnstr($return)
+}
+
+/*
+ * Fires when an RPC client is to be shut down.
+ *
+ * int rpc_shutdown_client(struct rpc_clnt *clnt)
+ *
+ * @servername: the server machine name
+ * @progname: the RPC program name
+ * @prog: the RPC program number
+ * @vers: the RPC program version number
+ * @prot: the IP protocol number
+ * @port: the port number
+ * @authflavor: the authentication flavor
+ *
+ * @clones: the number of clones
+ * @tasks: the number of references
+ *
+ * @netreconn: the count of reconnections
+ * @rpccnt: the count of RPC calls
+ * @om_ops: the count of operations
+ * @om_ntrans: the count of RPC transmissions
+ * @om_bytes_sent: the count of bytes out
+ * @om_bytes_recv: the count of bytes in
+ * @om_queue: the jiffies queued for xmit
+ * @om_rtt: the RPC RTT jiffies
+ * @om_execute: the RPC execution jiffies
+ */
+probe sunrpc.clnt.shutdown_client = kernel.function("rpc_shutdown_client") ?,
+ module("sunrpc").function("rpc_shutdown_client") ?
+{
+ servername = kernel_string($clnt->cl_server)
+ prog = prog_from_clnt($clnt)
+ vers = vers_from_clnt($clnt)
+ prot = prot_from_clnt($clnt)
+ port = port_from_clnt($clnt)
+ authflavor = $clnt->cl_auth->au_flavor
+ clones = clones_from_clnt($clnt)
+ tasks = tasks_from_clnt($clnt)
+
+ /* per-program statistics */
+ netreconn = $clnt->cl_stats->netreconn
+ rpccnt = $clnt->cl_stats->rpccnt
+
+ /* per-client statistics */
+ om_ops = $clnt->cl_metrics->om_ops
+ om_ntrans = $clnt->cl_metrics->om_ntrans
+ om_bytes_sent = $clnt->cl_metrics->om_bytes_sent
+ om_bytes_recv = $clnt->cl_metrics->om_bytes_recv
+ om_queue = $clnt->cl_metrics->om_queue
+ om_rtt = $clnt->cl_metrics->om_rtt
+ om_execute = $clnt->cl_metrics->om_execute
+
+ name = "sunrpc.clnt.shutdown_client"
+ argstr = sprintf("%s %s %d %d %d %d %d %d", servername, progname,
+ vers, prot, port, authflavor, clones, tasks)
+}
+
+probe sunrpc.clnt.shutdown_client.return =
+ kernel.function("rpc_shutdown_client").return ?,
+ module("sunrpc").function("rpc_shutdown_client").return ?
+{
+ name = "sunrpc.clnt.shutdown_client"
+ retstr = returnstr($return)
}
/*
@@ -112,22 +193,29 @@ probe sunrpc.clnt.clone_client.return =
*
* struct rpc_clnt * rpc_bind_new_program(struct rpc_clnt *old,
* struct rpc_program *program, int vers)
+ *
+ * @servername: the server machine name
+ * @old_progname: the name of old RPC program
+ * @old_prog: the number of old RPC program
+ * @old_vers: the version of old RPC program
+ * @progname: the name of new RPC program
+ * @prog: the number of new RPC program
+ * @vers: the version of new RPC program
*/
probe sunrpc.clnt.bind_new_program =
kernel.function("rpc_bind_new_program") ?,
module("sunrpc").function("rpc_bind_new_program") ?
{
- servname = kernel_string($old->cl_server)
+ servername = kernel_string($old->cl_server)
old_progname = kernel_string($old->cl_protname)
old_prog = prog_from_clnt($old)
old_vers = vers_from_clnt($old)
-
progname = kernel_string($program->name)
prog = $program->number
vers = vers_from_prog($program, $vers)
name = "sunrpc.clnt.bind_new_program"
- argstr = sprintf("%s %s %d %s %d", servname, old_progname,
+ argstr = sprintf("%s %s %d %s %d", servername, old_progname,
old_vers, progname, vers)
}
@@ -136,56 +224,29 @@ probe sunrpc.clnt.bind_new_program.return =
module("sunrpc").function("rpc_bind_new_program").return ?
{
name = "sunrpc.clnt.bind_new_program"
-}
-
-/*
- * Fires when an RPC client is to be shut down.
- *
- * int rpc_shutdown_client(struct rpc_clnt *clnt)
- */
-probe sunrpc.clnt.shutdown_client = kernel.function("rpc_shutdown_client") ?,
- module("sunrpc").function("rpc_shutdown_client") ?
-{
- servname = kernel_string($clnt->cl_server)
- progname = kernel_string($clnt->cl_protname)
- vers = vers_from_clnt($clnt)
- tasks = tasks_from_clnt($clnt)
-
- /* per-program statistics */
- netcnt = $clnt->cl_stats->netcnt
- netreconn = $clnt->cl_stats->netreconn
- rpccnt = $clnt->cl_stats->rpccnt
- rpcgarbage = $clnt->cl_stats->rpcgarbage
-
- /* per-client statistics */
- om_ops = $clnt->cl_metrics->om_ops /* count of operations */
- om_ntrans = $clnt->cl_metrics->om_ntrans/* count of RPC transmissions */
- om_bytes_sent = $clnt->cl_metrics->om_bytes_sent /* count of bytes out*/
- om_bytes_recv = $clnt->cl_metrics->om_bytes_recv /* count of bytes in */
- om_queue = $clnt->cl_metrics->om_queue /* jiffies queued for xmit */
- om_rtt = $clnt->cl_metrics->om_rtt /* RPC RTT jiffies */
- om_execute = $clnt->cl_metrics->om_execute /* RPC execution jiffies */
-
- name = "sunrpc.clnt.shutdown_client"
- argstr = sprintf("%s %s %d %d", servname, progname, vers, tasks)
-}
-
-probe sunrpc.clnt.shutdown_client.return =
- kernel.function("rpc_shutdown_client").return ?,
- module("sunrpc").function("rpc_shutdown_client").return ?
-{
- name = "sunrpc.clnt.shutdown_client"
retstr = returnstr($return)
}
/*
* int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg,
* int flags)
+ *
+ * @servername: the server machine name
+ * @progname: the RPC program name
+ * @prog: the RPC program number
+ * @vers: the RPC program version number
+ * @prot: the IP protocol number
+ * @port: the port number
+ * @xid: current transmission id
+ * @dead: whether this client is abandoned
+ * @procname: the procedure name in this RPC call
+ * @proc: the procedure number in this RPC call
+ * @flags: flags
*/
probe sunrpc.clnt.call_sync = kernel.function("rpc_call_sync") ?,
module("sunrpc").function("rpc_call_sync") ?
{
- servname = kernel_string($clnt->cl_server)
+ servername = kernel_string($clnt->cl_server)
progname = kernel_string($clnt->cl_protname)
prog = prog_from_clnt($clnt)
vers = vers_from_clnt($clnt)
@@ -194,13 +255,13 @@ probe sunrpc.clnt.call_sync = kernel.function("rpc_call_sync") ?,
xid = xid_from_clnt($clnt)
dead = $clnt->cl_dead
- proc = proc_from_msg($msg)
procname= $msg->rpc_proc->p_name
? kernel_string($msg->rpc_proc->p_name) : "NULL"
+ proc = proc_from_msg($msg)
flags = $flags
name = "sunrpc.clnt.call_sync"
- argstr = sprintf("%s %d %s %d %s 0x%x", servname, xid, progname,
+ argstr = sprintf("%s %d %s %d %s 0x%x", servername, xid, progname,
vers, procname, flags)
}
@@ -214,11 +275,23 @@ probe sunrpc.clnt.call_sync.return = kernel.function("rpc_call_sync").return ?,
/*
* int rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg,
* int flags, const struct rpc_call_ops *tk_ops, void *data)
+ *
+ * @servername: the server machine name
+ * @progname: the RPC program name
+ * @prog: the RPC program number
+ * @vers: the RPC program version number
+ * @prot: the IP protocol number
+ * @port: the port number
+ * @xid: current transmission id
+ * @dead: whether this client is abandoned
+ * @procname: the procedure name in this RPC call
+ * @proc: the procedure number in this RPC call
+ * @flags: flags
*/
probe sunrpc.clnt.call_async = kernel.function("rpc_call_async") ?,
module("sunrpc").function("rpc_call_async") ?
{
- servname = kernel_string($clnt->cl_server)
+ servername = kernel_string($clnt->cl_server)
progname = kernel_string($clnt->cl_protname)
prog = prog_from_clnt($clnt)
vers = vers_from_clnt($clnt)
@@ -234,7 +307,7 @@ probe sunrpc.clnt.call_async = kernel.function("rpc_call_async") ?,
flags = $flags
name = "sunrpc.clnt.call_async"
- argstr = sprintf("%s %d %s %d %s 0x%x", servname, xid, progname,
+ argstr = sprintf("%s %d %s %d %s 0x%x", servername, xid, progname,
vers, procname, flags)
}
@@ -250,20 +323,29 @@ probe sunrpc.clnt.call_async.return =
* Fires when an (async) RPC call is to be restarted
*
* void rpc_restart_call(struct rpc_task *task)
+ *
+ * @servername: the server machine name
+ * @prog: the RPC program number
+ * @xid: the transmission id
+ * @tk_pid: the debugging aid of task
+ * @tk_flags: the task flags
+ * @tk_priority: the task priority
+ * @tk_runstate: the task run status
*/
probe sunrpc.clnt.restart_call = kernel.function("rpc_restart_call") ?,
module("sunrpc").function("rpc_restart_call") ?
{
- xid = $task->tk_rqstp->rq_xid
+ servername = kernel_string($task->tk_client->cl_server)
prog = prog_from_clnt($task->tk_client)
- vers = vers_from_clnt($task->tk_client)
-
+ xid = $task->tk_rqstp->rq_xid
tk_pid = $task->tk_pid
tk_flags = $task->tk_flags
+ tk_priority = $task->tk_priority
+ tk_runstate = $task->tk_runstate
name = "sunrpc.clnt.restart_call"
- argstr = sprintf("%d %d %d %d %d", xid, prog, vers,
- tk_pid, tk_flags)
+ argstr = sprintf("%s %d %d %d %d %d %d", servername, prog, xid, tk_pid,
+ tk_flags, tk_priority, tk_runstate)
}
probe sunrpc.clnt.restart_call.return =
@@ -276,7 +358,6 @@ probe sunrpc.clnt.restart_call.return =
/*********************************************
* Probe points on RPC server interface *
********************************************/
-
probe sunrpc.svc.entry =
sunrpc.svc.register,
sunrpc.svc.create,
@@ -304,6 +385,12 @@ probe sunrpc.svc.return =
* If proto and port == 0, it means to unregister a service.
*
* int svc_register(struct svc_serv *serv, int proto, unsigned short port)
+ *
+ * @sv_name: the service name
+ * @progname: the name of the program
+ * @prog: the number of the program
+ * @prot: the IP protocol number
+ * @port: the port number
*/
probe sunrpc.svc.register = kernel.function("svc_register") ?,
module("sunrpc").function("svc_register") ?
@@ -330,19 +417,22 @@ probe sunrpc.svc.register.return = kernel.function("svc_register").return ?,
*
* struct svc_serv *
* svc_create(struct svc_program *prog, unsigned int bufsize)
+ *
+ * @progname: the name of the program
+ * @prog: the number of the program
+ * @pg_nvers: the number of supported versions
+ * @bufsize: the buffer size
*/
probe sunrpc.svc.create = kernel.function("svc_create") ?,
module("sunrpc").function("svc_create") ?
{
- pg_name = kernel_string($prog->pg_name)
- pg_prog = $prog->pg_prog
- pg_hivers = $prog->pg_hivers
+ progname = kernel_string($prog->pg_name)
+ prog = $prog->pg_prog
pg_nvers = $prog->pg_nvers
bufsize = $bufsize
name = "sunrpc.svc.create"
- argstr = sprintf("%s %d %d %d %d", pg_name, pg_prog,
- pg_hivers, pg_nvers, bufsize)
+ argstr = sprintf("%s %d %d %d", progname, prog, pg_nvers, bufsize)
}
probe sunrpc.svc.create.return = kernel.function("svc_create").return ?,
@@ -355,6 +445,16 @@ probe sunrpc.svc.create.return = kernel.function("svc_create").return ?,
* Fires when an RPC service is to be destroyed
*
* void svc_destroy(struct svc_serv *serv)
+ *
+ * @sv_name: the service name
+ * @sv_progname: the name of the program
+ * @sv_prog: the number of the program
+ * @sv_nrthreads:the number of concurrent threads
+ * @netcnt: the count of received RPC requests
+ * @nettcpconn: the count of accepted TCP connections
+ * @rpccnt: the count of valid RPC requests
+ * @rpcbadfmt: the count of requests dropped for bad formats
+ * @rpcbadauth: the count of requests drooped for authentication failure
*/
probe sunrpc.svc.destroy = kernel.function("svc_destroy") ?,
module("sunrpc").function("svc_destroy") ?
@@ -368,7 +468,8 @@ probe sunrpc.svc.destroy = kernel.function("svc_destroy") ?,
netcnt = $serv->sv_stats->netcnt
netcpconn = $serv->sv_stats->nettcpconn
rpccnt = $serv->sv_stats->rpccnt
- rpcbadclnt = $serv->sv_stats->rpcbadclnt
+ rpcbadfmt = $serv->sv_stats->rpcbadfmt
+ rpcbadauth = $serv->sv_stats->rpcbadauth
name = "sunrpc.svc.destroy"
argstr = sprintf("%s %d %d", sv_name, sv_prog, sv_nrthreads)
@@ -384,19 +485,30 @@ probe sunrpc.svc.destroy.return = kernel.function("svc_destroy").return ?,
* Fires when an RPC request is to be processed
*
* int svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
+ *
+ * @sv_name: the service name
+ * @sv_prog: the number of the program
+ * @sv_nrthreads:the number of concurrent threads
+ * @peer_ip: the peer address where the request is from
+ * @rq_xid: the transmission id in the request
+ * @rq_prog: the program number in the request
+ * @rq_vers: the program version in the request
+ * @rq_proc: the procedure number in the request
+ * @rq_prot: the IP protocol of the reqeust
*/
probe sunrpc.svc.process = kernel.function("svc_process") ?,
module("sunrpc").function("svc_process") ?
{
sv_name = kernel_string($serv->sv_name) /* service name */
sv_prog = $serv->sv_program->pg_prog
+ sv_nrthreads = $serv->sv_nrthreads
- peer_ip = addr_from_rqst($rqstp)/* peer address */
- rq_xid = $rqstp->rq_xid /* transmission id */
- rq_prog = $rqstp->rq_prog /* program number */
- rq_vers = $rqstp->rq_vers /* program version */
- rq_proc = $rqstp->rq_proc /* procedure number */
- rq_prot = $rqstp->rq_prot /* IP protocol */
+ peer_ip = addr_from_rqst($rqstp)
+ rq_xid = $rqstp->rq_xid
+ rq_prog = $rqstp->rq_prog
+ rq_vers = $rqstp->rq_vers
+ rq_proc = $rqstp->rq_proc
+ rq_prot = $rqstp->rq_prot
name = "sunrpc.svc.process"
argstr = sprintf("%s %d %d %d %d %d %d", sv_name, sv_prog, peer_ip,
@@ -411,21 +523,32 @@ probe sunrpc.svc.process.return = kernel.function("svc_process").return ?,
}
/*
+ * Fires when an RPC request is to be authorised
+ *
* int svc_authorise(struct svc_rqst *rqstp)
+ *
+ * @sv_name: the service name
+ * @peer_ip: the peer address where the request is from
+ * @rq_xid: the transmission id in the request
+ * @rq_prog: the program number in the request
+ * @rq_vers: the program version in the request
+ * @rq_proc: the procedure number in the request
+ * @rq_prot: the IP protocol of the reqeust
*/
probe sunrpc.svc.authorise = kernel.function("svc_authorise")?,
module("sunrpc").function("svc_authorise")?
{
- peer_ip = addr_from_rqst($rqstp) /* peer address */
- xid = $rqstp->rq_xid /* transmission id */
- prog = $rqstp->rq_prog /* program number */
- vers = $rqstp->rq_vers /* program version */
- proc = $rqstp->rq_proc /* procedure number */
- prot = $rqstp->rq_prot /* IP protocol */
+ sv_name = kernel_string($rqstp->rq_server->sv_name)
+ peer_ip = addr_from_rqst($rqstp)
+ rq_xid = $rqstp->rq_xid
+ rq_prog = $rqstp->rq_prog
+ rq_vers = $rqstp->rq_vers
+ rq_proc = $rqstp->rq_proc
+ rq_prot = $rqstp->rq_prot
name = "sunrpc.svc.authorise"
- argstr = sprintf("%d %d %d %d %d %d %d", peer_ip, xid, prog,
- vers, proc, prot, addr)
+ argstr = sprintf("%d %d %d %d %d %d", peer_ip, rq_xid, rq_prog,
+ rq_vers, rq_proc, rq_prot)
}
probe sunrpc.svc.authorise.return = kernel.function("svc_authorise").return ?,
@@ -436,14 +559,21 @@ probe sunrpc.svc.authorise.return = kernel.function("svc_authorise").return ?,
}
/*
- * Fires when receiving the next request on any socket.
+ * Fires when the server is to receive the next request on any socket.
*
* int svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
+ *
+ * @sv_name: the service name
+ * @sv_prog: the number of the program
+ * @sv_nrthreads:the number of concurrent threads
+ * @timeout: the timeout of waiting for data
*/
probe sunrpc.svc.recv = kernel.function("svc_recv")?,
module("sunrpc").function("svc_recv")?
{
sv_name = kernel_string($serv->sv_name)
+ sv_prog = $serv->sv_program->pg_prog
+ sv_nrthreads = $serv->sv_nrthreads
timeout = $timeout
name = "sunrpc.svc.recv"
@@ -461,23 +591,29 @@ probe sunrpc.svc.recv.return = kernel.function("svc_recv").return ?,
* Fires when want to return reply to client.
*
* int svc_send(struct svc_rqst *rqstp)
+ *
+ * @sv_name: the service name
+ * @peer_ip: the peer address where the request is from
+ * @rq_xid: the transmission id in the request
+ * @rq_prog: the program number in the request
+ * @rq_vers: the program version in the request
+ * @rq_proc: the procedure number in the request
+ * @rq_prot: the IP protocol of the reqeust
*/
probe sunrpc.svc.send = kernel.function("svc_send")?,
module("sunrpc").function("svc_send")?
{
sv_name = kernel_string($rqstp->rq_server->sv_name)
- sv_prog = $rqstp->rq_server->sv_program->pg_prog
-
- peer_ip = addr_from_rqst($rqstp) /* peer address */
- xid = $rqstp->rq_xid /* transmission id */
- prog = $rqstp->rq_prog /* program number */
- vers = $rqstp->rq_vers /* program version */
- proc = $rqstp->rq_proc /* procedure number */
- prot = $rqstp->rq_prot /* IP protocol */
+ peer_ip = addr_from_rqst($rqstp)
+ rq_xid = $rqstp->rq_xid
+ rq_prog = $rqstp->rq_prog
+ rq_vers = $rqstp->rq_vers
+ rq_proc = $rqstp->rq_proc
+ rq_prot = $rqstp->rq_prot
name = "sunrpc.svc.send"
- argstr = sprintf("%s %d %d %d %d %d %d %d", sv_name, sv_prog,
- peer_ip, xid, prog, vers, proc, prot)
+ argstr = sprintf("%s %d %d %d %d %d %d", sv_name, peer_ip,
+ rq_xid, rq_prog, rq_vers, rq_proc, rq_prot)
}
probe sunrpc.svc.send.return = kernel.function("svc_send").return ?,
@@ -491,23 +627,29 @@ probe sunrpc.svc.send.return = kernel.function("svc_send").return ?,
* Fires when a request is to be dropped
*
* void svc_drop(struct svc_rqst *rqstp)
+ *
+ * @sv_name: the service name
+ * @peer_ip: the peer address where the request is from
+ * @rq_xid: the transmission id in the request
+ * @rq_prog: the program number in the request
+ * @rq_vers: the program version in the request
+ * @rq_proc: the procedure number in the request
+ * @rq_prot: the IP protocol of the reqeust
*/
probe sunrpc.svc.drop = kernel.function("svc_drop")?,
module("sunrpc").function("svc_drop")?
{
sv_name = kernel_string($rqstp->rq_server->sv_name)
- sv_prog = $rqstp->rq_server->sv_program->pg_prog
-
- peer_ip = addr_from_rqst($rqstp) /* peer address */
- xid = $rqstp->rq_xid /* transmission id */
- prog = $rqstp->rq_prog /* program number */
- vers = $rqstp->rq_vers /* program version */
- proc = $rqstp->rq_proc /* procedure number */
- prot = $rqstp->rq_prot /* IP protocol */
+ peer_ip = addr_from_rqst($rqstp)
+ rq_xid = $rqstp->rq_xid
+ rq_prog = $rqstp->rq_prog
+ rq_vers = $rqstp->rq_vers
+ rq_proc = $rqstp->rq_proc
+ rq_prot = $rqstp->rq_prot
name = "sunrpc.svc.drop"
- argstr = sprintf("%s %d %d %d %d %d %d %d", sv_name, sv_prog,
- peer_ip, xid, prog, vers, proc, prot)
+ argstr = sprintf("%s %d %d %d %d %d %d", sv_name, peer_ip,
+ rq_xid, rq_prog, rq_vers, rq_proc, rq_prot)
}
probe sunrpc.svc.drop.return = kernel.function("svc_drop").return ?,
@@ -519,26 +661,94 @@ probe sunrpc.svc.drop.return = kernel.function("svc_drop").return ?,
/*******************************************************************
* Probe points on RPC scheduler *
******************************************************************/
-
probe sunrpc.sched.entry =
sunrpc.sched.new_task,
+ sunrpc.sched.release_task,
sunrpc.sched.execute,
- sunrpc.sched.delay,
- sunrpc.sched.release_task
+ sunrpc.sched.delay
{}
probe sunrpc.sched.return =
sunrpc.sched.new_task.return,
+ sunrpc.sched.release_task.return,
sunrpc.sched.execute.return,
- sunrpc.sched.delay.return,
- sunrpc.sched.release_task.return
+ sunrpc.sched.delay.return
{}
/*
+ * Fires when a new task is to be created for the specified client.
+ *
+ * struct rpc_task * rpc_new_task(struct rpc_clnt *clnt, int flags,
+ * const struct rpc_call_ops *tk_ops, void *calldata)
+ *
+ * @xid: the transmission id in the RPC call
+ * @prog: the program number in the RPC call
+ * @vers: the program version in the RPC call
+ * @prot: the IP protocol in the RPC call
+ * @tk_flags: the flags of the task
+ */
+probe sunrpc.sched.new_task = kernel.function("rpc_new_task") ?,
+ module("sunrpc").function("rpc_new_task") ?
+{
+ xid = xid_from_clnt($clnt)
+ prog = prog_from_clnt($clnt)
+ vers = vers_from_clnt($clnt)
+ prot = prot_from_clnt($clnt)
+ flags = $flags
+
+ name = "sunrpc.sched.new_task"
+ argstr = sprintf("%d %d %d %d %d", xid, prog, vers, prot, flags)
+}
+
+probe sunrpc.sched.new_task.return = kernel.function("rpc_new_task").return ?,
+ module("sunrpc").function("rpc_new_task").return ?
+{
+ name = "sunrpc.sched.new_task"
+}
+
+/*
+ * Fires when all resources associated with a task are to be released
+ *
+ * void rpc_release_task(struct rpc_task *task)
+ *
+ * @xid: the transmission id in the RPC call
+ * @prog: the program number in the RPC call
+ * @vers: the program version in the RPC call
+ * @prot: the IP protocol in the RPC call
+ * @tk_flags: the flags of the task
+ */
+probe sunrpc.sched.release_task = kernel.function("rpc_release_task") ?,
+ module("sunrpc").function("rpc_release_task") ?
+{
+ xid = xid_from_clnt($task->tk_client)
+ prog = prog_from_clnt($task->tk_client)
+ vers = vers_from_clnt($task->tk_client)
+ prot = prot_from_clnt($task->tk_client)
+ tk_flags = $task->tk_flags
+
+ name = "sunrpc.sched.release_task"
+ argstr = sprintf("%d %d %d %d %d", xid, prog, vers, prot, tk_flags)
+}
+
+probe sunrpc.sched.release_task.return =
+ kernel.function("rpc_release_task").return ?,
+ module("sunrpc").function("rpc_release_task").return ?
+{
+ name = "sunrpc.sched.release_task"
+}
+
+/*
* Fires when the RPC `scheduler'(or rather, the finite state machine)
* is to be executed
*
* static int __rpc_execute(struct rpc_task *task)
+ *
+ * @xid: the transmission id in the RPC call
+ * @prog: the program number in the RPC call
+ * @vers: the program version in the RPC call
+ * @prot: the IP protocol in the RPC call
+ * @tk_pid: the debugging id of the task
+ * @tk_flags: the flags of the task
*/
probe sunrpc.sched.execute = kernel.function("__rpc_execute") ?,
module("sunrpc").function("__rpc_execute") ?
@@ -551,8 +761,8 @@ probe sunrpc.sched.execute = kernel.function("__rpc_execute") ?,
tk_flags = $task->tk_flags
name = "sunrpc.sched.execute"
- argstr = sprintf("%d %d %d %d %d %d", xid, prog,
- vers, prot, tk_pid, tk_flags)
+ argstr = sprintf("%d %d %d %d %d %d", xid, prog, vers, prot,
+ tk_pid, tk_flags)
}
probe sunrpc.sched.execute.return = kernel.function("__rpc_execute").return ?,
@@ -566,6 +776,14 @@ probe sunrpc.sched.execute.return = kernel.function("__rpc_execute").return ?,
* Fires when a task is to be delayed
*
* void rpc_delay(struct rpc_task *task, unsigned long delay)
+ *
+ * @xid: the transmission id in the RPC call
+ * @prog: the program number in the RPC call
+ * @vers: the program version in the RPC call
+ * @prot: the IP protocol in the RPC call
+ * @tk_pid: the debugging id of the task
+ * @tk_flags: the flags of the task
+ * @delay: the time delayed
*/
probe sunrpc.sched.delay = kernel.function("rpc_delay") ?,
module("sunrpc").function("rpc_delay") ?
@@ -579,8 +797,8 @@ probe sunrpc.sched.delay = kernel.function("rpc_delay") ?,
delay = $delay
name = "sunrpc.clnt.delay"
- argstr = sprintf("%d %d %d %d %d %d", xid, prog, vers,
- prot, tk_pid, tk_flags)
+ argstr = sprintf("%d %d %d %d %d %d %d", xid, prog, vers,
+ prot, tk_pid, tk_flags, delay)
}
probe sunrpc.sched.delay.return = kernel.function("rpc_delay").return ?,
@@ -589,105 +807,61 @@ probe sunrpc.sched.delay.return = kernel.function("rpc_delay").return ?,
name = "sunrpc.clnt.delay"
}
-/*
- * Fires when a new task is to be created for the specified client.
- *
- * struct rpc_task * rpc_new_task(struct rpc_clnt *clnt, int flags,
- * const struct rpc_call_ops *tk_ops, void *calldata)
- */
-probe sunrpc.sched.new_task = kernel.function("rpc_new_task") ?,
- module("sunrpc").function("rpc_new_task") ?
-{
- xid = xid_from_clnt($clnt)
- prog = prog_from_clnt($clnt)
- vers = vers_from_clnt($clnt)
- prot = prot_from_clnt($clnt)
- flags = $flags
-
- name = "sunrpc.sched.new_task"
- argstr = sprintf("%d %d %d %d %d", xid, prog, vers, prot, flags)
-}
-
-probe sunrpc.sched.new_task.return = kernel.function("rpc_new_task").return ?,
- module("sunrpc").function("rpc_new_task").return ?
-{
- name = "sunrpc.sched.new_task"
-}
-
-/*
- * Fires when all resources associated with a task are to be released
- *
- * void rpc_release_task(struct rpc_task *task)
- */
-probe sunrpc.sched.release_task = kernel.function("rpc_release_task") ?,
- module("sunrpc").function("rpc_release_task") ?
-{
- xid = xid_from_clnt($task->tk_client)
- prog = prog_from_clnt($task->tk_client)
- vers = vers_from_clnt($task->tk_client)
- prot = prot_from_clnt($task->tk_client)
- flags = $task->tk_flags
-
- name = "sunrpc.sched.release_task"
- argstr = sprintf("%d %d %d %d %d", xid, prog, vers, prot, flags)
-}
-
-probe sunrpc.sched.release_task.return =
- kernel.function("rpc_release_task").return ?,
- module("sunrpc").function("rpc_release_task").return ?
-{
- name = "sunrpc.sched.release_task"
-}
-
/******************************************************************
- * Helpler functions *
+ * Helper functions *
*****************************************************************/
function xid_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
- THIS->__retvalue = clnt ? clnt->cl_xprt->tcp_xid : 0;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
+ THIS->__retvalue = clnt ? clnt->cl_xprt->xid : 0;
%}
function prog_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
THIS->__retvalue = clnt ? clnt->cl_pmap->pm_prog : 0;
%}
function vers_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
THIS->__retvalue = clnt ? clnt->cl_pmap->pm_vers : 0;
%}
function prot_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
THIS->__retvalue = clnt ? clnt->cl_pmap->pm_prot : 0;
%}
function port_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
THIS->__retvalue = clnt ? clnt->cl_pmap->pm_port : 0;
%}
+function clones_from_clnt:long(clnt:long)
+%{
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
+ THIS->__retvalue = atomic_read(&clnt->cl_count);
+%}
+
function tasks_from_clnt:long(clnt:long)
%{
- struct rpc_clnt *clnt = (struct rpc_clnt *)THIS->clnt;
+ struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
THIS->__retvalue = atomic_read(&clnt->cl_users);
%}
function proc_from_msg:long(msg:long)
%{
- struct rpc_message *msg = (struct rpc_message *)THIS->msg;
+ struct rpc_message *msg = (struct rpc_message *)(long)THIS->msg;
THIS->__retvalue = msg ? msg->rpc_proc->p_proc : 0;
%}
function vers_from_prog:long(program:long, vers:long)
%{
- struct rpc_program *program = (struct rpc_program *)THIS->program;
+ struct rpc_program *program = (struct rpc_program *)(long)THIS->program;
if (!program || THIS->vers >= program->nrvers || !program->version[THIS->vers])
THIS->__retvalue = 0;
else
@@ -696,7 +870,7 @@ function vers_from_prog:long(program:long, vers:long)
function addr_from_rqst:long(rqstp:long)
%{
- struct svc_rqst *rqstp = (struct svc_rqst *)THIS->rqstp;
+ struct svc_rqst *rqstp = (struct svc_rqst *)(long)THIS->rqstp;
THIS->__retvalue = rqstp ? rqstp->rq_addr.sin_addr.s_addr : 0;
%}