afsd: Improve syscall tracing 58/11858/13
authorPerry Ruiter <pruiter@sinenomine.net>
Fri, 24 Apr 2015 04:33:27 +0000 (21:33 -0700)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 10 Aug 2018 13:30:19 +0000 (09:30 -0400)
When afsd is started with the -debug flag, extensive debug output is
generated including tracing for each syscall.  Unfortunately the
existing syscall tracing is not especially helpful.  It dumps out two
constants that we already knew at compile time, the first parameter of
the syscall along with the syscall's return code.  Specifically it does
not tell you which syscall is currently being traced.  Here's a current
example of afsd -debug:

    afsd: cacheFiles autotuned to 581250
    afsd: dCacheSize autotuned to 10000
    afsd: cacheStatEntries autotuned to 15000
    SScall(183, 28, 6860800)=0
    SScall(183, 28, -847416368)=0
    SScall(183, 28, 1)=0
    afsd: Forking rx listener daemon.
    afsd: Forking rx callback listener.
    afsd: Forking rxevent daemon.
    SScall(183, 28, 0)=0
    SScall(183, 28, 1)=0
    ...

This patch drops the compile time constants (183 and 28 in the above
sample output) and replaces them with the name of the syscall being
traced.  Additionally the first parameter to a syscall is as likely to
be an address as a decimal value so display it in hex. Here's an example
of afsd -debug with these changes:

    afsd: cacheFiles autotuned to 581250
    afsd: dCacheSize autotuned to 10000
    afsd: cacheStatEntries autotuned to 15000
    os_syscall(AFSOP_SET_THISCELL, 0x68bf80)=0
    os_syscall(AFSOP_SEED_ENTROPY, 0x7fff9ce40c10)=0
    os_syscall(AFSOP_ADVISEADDR, 0x1)=0
    afsd: Forking rx listener daemon.
    afsd: Forking rx callback listener.
    afsd: Forking rxevent daemon.
    os_syscall(AFSOP_RXEVENT_DAEMON, 0x0)=0
    os_syscall(AFSOP_BASIC_INIT, 0x1)=0
    ...

[mmeffie@sinenomine.net: avoid c99 array initialization.]

Change-Id: I4f3d46d420d19abeddbf719efa04aef7e553d51f
Reviewed-on: https://gerrit.openafs.org/11858
Tested-by: Mark Vitale <mvitale@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/afsd/afsd_kernel.c
src/config/afs_args.h

index 093ba5c..71de913 100644 (file)
@@ -124,6 +124,72 @@ kern_return_t DiskArbDiskAppearedWithMountpointPing_auto(char *, unsigned int,
 # endif
 #endif
 
+static char *afsd_syscalls[AFSOP_MAX_OPCODE + 1]; /* For syscall tracing. */
+
+static void
+afsd_init_syscall_opcodes(void)
+{
+#define add_opcode(x) afsd_syscalls[x] = #x
+    add_opcode(AFSOP_START_RXCALLBACK);
+    add_opcode(AFSOP_START_AFS);
+    add_opcode(AFSOP_START_BKG);
+    add_opcode(AFSOP_START_TRUNCDAEMON);
+    add_opcode(AFSOP_START_CS);
+    add_opcode(AFSOP_ADDCELL);
+    add_opcode(AFSOP_CACHEINIT);
+    add_opcode(AFSOP_CACHEINFO);
+    add_opcode(AFSOP_VOLUMEINFO);
+    add_opcode(AFSOP_CACHEFILE);
+    add_opcode(AFSOP_CACHEINODE);
+    add_opcode(AFSOP_AFSLOG);
+    add_opcode(AFSOP_ROOTVOLUME);
+    add_opcode(AFSOP_STARTLOG);
+    add_opcode(AFSOP_ENDLOG);
+    add_opcode(AFSOP_AFS_VFSMOUNT);
+    add_opcode(AFSOP_ADVISEADDR);
+    add_opcode(AFSOP_CLOSEWAIT);
+    add_opcode(AFSOP_RXEVENT_DAEMON);
+    add_opcode(AFSOP_GETMTU);
+    add_opcode(AFSOP_GETIFADDRS);
+    add_opcode(AFSOP_ADDCELL2);
+    add_opcode(AFSOP_AFSDB_HANDLER);
+    add_opcode(AFSOP_SET_DYNROOT);
+    add_opcode(AFSOP_ADDCELLALIAS);
+    add_opcode(AFSOP_SET_FAKESTAT);
+    add_opcode(AFSOP_CELLINFO);
+    add_opcode(AFSOP_SET_THISCELL);
+    add_opcode(AFSOP_BASIC_INIT);
+    add_opcode(AFSOP_SET_BACKUPTREE);
+    add_opcode(AFSOP_SET_RXPCK);
+    add_opcode(AFSOP_BUCKETPCT);
+    add_opcode(AFSOP_SET_RXMAXMTU);
+    add_opcode(AFSOP_BKG_HANDLER);
+    add_opcode(AFSOP_GETMASK);
+    add_opcode(AFSOP_SET_RXMAXFRAGS);
+    add_opcode(AFSOP_SET_RMTSYS_FLAG);
+    add_opcode(AFSOP_SEED_ENTROPY);
+    add_opcode(AFSOP_SET_INUMCALC);
+    add_opcode(AFSOP_RXLISTENER_DAEMON);
+    add_opcode(AFSOP_CACHEBASEDIR);
+    add_opcode(AFSOP_CACHEDIRS);
+    add_opcode(AFSOP_CACHEFILES);
+    add_opcode(AFSOP_SETINT);
+    add_opcode(AFSOP_GO);
+    add_opcode(AFSOP_CHECKLOCKS);
+    add_opcode(AFSOP_SHUTDOWN);
+    add_opcode(AFSOP_STOP_RXCALLBACK);
+    add_opcode(AFSOP_STOP_AFS);
+    add_opcode(AFSOP_STOP_BKG);
+    add_opcode(AFSOP_STOP_TRUNCDAEMON);
+    /* AFSOP_STOP_RXEVENT -- not a syscall opcode */
+    /* AFSOP_STOP_COMPLETE -- not a syscall opcode */
+    add_opcode(AFSOP_STOP_CS);
+    /* AFSOP_STOP_RXK_LISTENER -- not a syscall opcode */
+    add_opcode(AFSOP_STOP_AFSDB);
+    add_opcode(AFSOP_STOP_NETIF);
+#undef add_opcode
+}
+
 void
 afsd_set_rx_rtpri(void)
 {
@@ -274,19 +340,36 @@ afsd_call_syscall(struct afsd_syscall_args *args)
     error = os_syscall(args);
 
     if (afsd_debug) {
+       char *opcode;
+       char buffer[32];
         const char *syscall_str;
+
 #if defined(AFS_SYSCALL)
         syscall_str = AFS_STRINGIZE(AFS_SYSCALL);
 #else
         syscall_str = "[AFS_SYSCALL]";
 #endif
+
+       if ((args->syscall < 0) ||
+           (args->syscall >= (sizeof(afsd_syscalls) / sizeof(*afsd_syscalls))))
+           opcode = NULL;
+       else
+           opcode = afsd_syscalls[args->syscall];
+
+       if (opcode == NULL) {
+           snprintf(buffer, sizeof(buffer), "unknown (%d)", args->syscall);
+           opcode = buffer;
+       }
+
        if (error == -1) {
            char *s = strerror(errno);
-           printf("SScall(%s, %d, %d)=%d (%d, %s)\n", syscall_str, AFSCALL_CALL,
-                  (int)args->params[0], error, errno, s);
+           printf("os_syscall(%s, %d, %s, 0x%lx)=%d (%d, %s)\n",
+                   syscall_str, AFSCALL_CALL, opcode,
+                  (long)args->params[0], error, errno, s);
        } else {
-           printf("SScall(%s, %d, %d)=%d\n", syscall_str, AFSCALL_CALL,
-                  (int)args->params[0], error);
+           printf("os_syscall(%s %d %s, 0x%lx)=%d\n",
+                   syscall_str, AFSCALL_CALL, opcode,
+                  (long)args->params[0], error);
        }
     }
 
@@ -573,6 +656,7 @@ main(int argc, char **argv)
 {
     int code;
 
+    afsd_init_syscall_opcodes();
     afsd_init();
 
     code = afsd_parse(argc, argv);
index dd90b80..ae7d2d7 100644 (file)
@@ -12,6 +12,9 @@
 
 /*
  * AFS system call opcodes
+ *
+ * When adding new opcodes, please also update afsd_init_syscall_opcodes()
+ * for syscall tracing.
  */
 
 #define AFSOP_START_RXCALLBACK   0     /* no aux parms */