support-kdebug-tracing   [plain text]


Index: samba/source/configure.in
===================================================================
--- samba/source/configure.in.orig
+++ samba/source/configure.in
@@ -450,6 +450,29 @@ AC_ARG_WITH(profiling-data,
   AC_MSG_RESULT(no)
 )
 
+#################################################
+# check for Darwin kdebug trace facility
+AC_MSG_CHECKING(whether to Darwin kdebug tracing)
+AC_ARG_WITH(kdebug-trace,
+[  --with-kdebug-trace   Emit kdebug traces when profiling (default=no)],
+[ case "$withval" in
+  yes)
+    if test x"$samba_cv_WITH_PROFILE" != x"yes" ; then
+	AC_ERROR(kdebug tracing requires --with-profiling-data)
+    fi
+
+    AC_MSG_RESULT(yes)
+    AC_DEFINE(WITH_KDEBUG_TRACE,1,[Whether to use kdebug tracing])
+    samba_cv_WITH_KDEBUG_TRACE=yes
+    ;;
+  *)
+    AC_MSG_RESULT(no)
+    samba_cv_WITH_KDEBUG_TRACE=no
+    ;;
+  esac ],
+  AC_MSG_RESULT(no)
+)
+
 dnl Checks for programs.
 
 AC_PROG_INSTALL
Index: samba/source/include/smbprofile.h
===================================================================
--- samba/source/include/smbprofile.h.orig
+++ samba/source/include/smbprofile.h
@@ -22,6 +22,16 @@
 
 */
 
+#include "smbkdebug.h"
+
+#ifndef KDEBUG_TRACE_START
+#define KDEBUG_TRACE_START(traceid)
+#endif
+
+#ifndef KDEBUG_TRACE_END
+#define KDEBUG_TRACE_END(traceid)
+#endif
+
 /* this file defines the profile structure in the profile shared
    memory area */
 
@@ -717,7 +727,7 @@ enum profile_stats_values
 #define election_count __profile_stats_value(PR_VALUE_ELECTION, count)
 #define election_time __profile_stats_value(PR_VALUE_ELECTION, time)
 
-	/* This mist remain the last value. */
+	/* This must remain the last value. */
 	PR_VALUE_MAX
 }; /* enum profile_stats_values */
 
@@ -831,6 +841,7 @@ static inline SMB_BIG_UINT profile_times
 
 #define START_PROFILE(x) \
 	SMB_BIG_UINT __profstamp_##x = 0; \
+	KDEBUG_TRACE_START(kdebug_##x); \
 	if (do_profile_flag) { \
 		__profstamp_##x = do_profile_times ? profile_timestamp() : 0;\
 		INC_PROFILE_COUNT(x##_count); \
@@ -838,6 +849,7 @@ static inline SMB_BIG_UINT profile_times
 
 #define START_PROFILE_BYTES(x,n) \
 	SMB_BIG_UINT __profstamp_##x = 0; \
+	KDEBUG_TRACE_START(kdebug_##x); \
 	if (do_profile_flag) { \
 		__profstamp_##x = do_profile_times ? profile_timestamp() : 0;\
 		INC_PROFILE_COUNT(x##_count); \
@@ -845,6 +857,7 @@ static inline SMB_BIG_UINT profile_times
   	}
 
 #define END_PROFILE(x) \
+	KDEBUG_TRACE_END(kdebug_##x); \
 	if (do_profile_times) { \
 		ADD_PROFILE_COUNT(x##_time, \
 		    profile_timestamp() - __profstamp_##x); \
Index: samba/source/profile/profile.c
===================================================================
--- samba/source/profile/profile.c.orig
+++ samba/source/profile/profile.c
@@ -33,6 +33,9 @@ static BOOL read_only;
 clockid_t __profile_clock;
 BOOL have_profiling_clock = False;
 #endif
+#if defined(WITH_KDEBUG_TRACE)
+unsigned int kdebug_enable; /* Should match declaration in sys/kdebug.h */
+#endif
 #endif
 
 struct profile_header *profile_h;
@@ -51,11 +54,13 @@ void set_profile_level(int level, struct
 	case 0:		/* turn off profiling */
 		do_profile_flag = False;
 		do_profile_times = False;
+		kdebug_enable = False;
 		DEBUG(1,("INFO: Profiling turned OFF from pid %d\n",
 			 (int)procid_to_pid(&src)));
 		break;
 	case 1:		/* turn on counter profiling only */
 		do_profile_flag = True;
+		kdebug_enable = True;
 		do_profile_times = False;
 		DEBUG(1,("INFO: Profiling counts turned ON from pid %d\n",
 			 (int)procid_to_pid(&src)));
@@ -74,6 +79,7 @@ void set_profile_level(int level, struct
 		}
 #endif
 
+		kdebug_enable = True;
 		do_profile_flag = True;
 		do_profile_times = True;
 		DEBUG(1,("INFO: Full profiling turned ON from pid %d\n",
Index: samba/source/include/smbkdebug.h
===================================================================
--- /dev/null
+++ samba/source/include/smbkdebug.h
@@ -0,0 +1,247 @@
+/*
+   Unix SMB/CIFS implementation.
+   Define trace codes for kernel debuggind facility.
+   Copyright (C) 2007 Apple Inc. All rights reserved.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef _SMBKDEBUG_H_
+#define _SMBKDEBUG_H_
+
+#if defined(WITH_PROFILE) && defined(WITH_KDEBUG_TRACE)
+#include <sys/kdebug.h>
+#include <sys/syscall.h>
+
+#ifndef DBG_APP_SAMBA
+/* This should come from <sys/kdebug.h>, but we might be building against old
+ * definitions.
+ */
+#define DBG_APP_SAMBA 128
+#endif
+
+/* This is ugly because, sys/kdebug.h is really intended for use in the kernel.
+ * So we have junk like a declaration of kernel_debug, but no definition of it.
+ */
+
+#undef KERNEL_DEBUG
+#define KERNEL_DEBUG(x,a,b,c,d,e)	\
+do {					\
+    if (kdebug_enable)			\
+        sys_kernel_debug((unsigned int)x, (unsigned int)a, (unsigned int)b, \
+		     (unsigned int)c, (unsigned int)d, (unsigned int)e); \
+} while(0)
+
+#define KDEBUG_TRACE_START(traceid) \
+    KERNEL_DEBUG(APPSDBG_CODE(DBG_APP_SAMBA, traceid) | DBG_FUNC_START, \
+	    0,0,0,0,0)
+
+#define KDEBUG_TRACE_END(traceid) \
+    KERNEL_DEBUG(APPSDBG_CODE(DBG_APP_SAMBA, traceid) | DBG_FUNC_END, \
+	    0,0,0,0,0)
+
+static inline void sys_kernel_debug(int code, int a1, int a2,
+			    int a3, int a4, int a5)
+{
+	syscall(SYS_kdebug_trace, code, a1, a2, a3, a4, a5);
+}
+
+#undef kernel_debug
+
+/* At one time, these values were derived from the PR_VALUE profile point
+ * constants. However, they need to match the values in
+ * /usr/share/misc/trace.codes, which is maintained out of tree. So we now
+ * hardcode the trace IDs to guarantee their stability.
+ *
+ * Do not change the values of these defines, just add new ones to the end.
+ */
+
+#define kdebug_smbd_idle		0
+#define kdebug_syscall_opendir		1
+#define kdebug_syscall_readdir		2
+#define kdebug_syscall_seekdir		3
+#define kdebug_syscall_telldir		4
+#define kdebug_syscall_rewinddir	5
+#define kdebug_syscall_mkdir		6
+#define kdebug_syscall_rmdir		7
+#define kdebug_syscall_closedir		8
+#define kdebug_syscall_open		9
+#define kdebug_syscall_close		10
+#define kdebug_syscall_read		11
+#define kdebug_syscall_pread		12
+#define kdebug_syscall_write		13
+#define kdebug_syscall_pwrite		14
+#define kdebug_syscall_lseek		15
+#define kdebug_syscall_sendfile		16
+#define kdebug_syscall_rename		17
+#define kdebug_syscall_fsync		18
+#define kdebug_syscall_stat		19
+#define kdebug_syscall_fstat		20
+#define kdebug_syscall_lstat		21
+#define kdebug_syscall_unlink		22
+#define kdebug_syscall_chmod		23
+#define kdebug_syscall_fchmod		24
+#define kdebug_syscall_chown		25
+#define kdebug_syscall_fchown		26
+#define kdebug_syscall_chdir		27
+#define kdebug_syscall_getwd		28
+#define kdebug_syscall_utime		29
+#define kdebug_syscall_ftruncate	30
+#define kdebug_syscall_fcntl_lock	31
+#define kdebug_syscall_kernel_flock	32
+#define kdebug_syscall_fcntl_getlock	33
+#define kdebug_syscall_readlink		34
+#define kdebug_syscall_symlink		35
+#define kdebug_syscall_link		36
+#define kdebug_syscall_mknod		37
+#define kdebug_syscall_realpath		38
+#define kdebug_syscall_get_quota	39
+#define kdebug_syscall_set_quota	40
+#define kdebug_SMBmkdir		41
+#define kdebug_SMBrmdir		42
+#define kdebug_SMBopen		43
+#define kdebug_SMBcreate	44
+#define kdebug_SMBclose		45
+#define kdebug_SMBflush		46
+#define kdebug_SMBunlink	47
+#define kdebug_SMBmv		48
+#define kdebug_SMBgetatr	49
+#define kdebug_SMBsetatr	50
+#define kdebug_SMBread		51
+#define kdebug_SMBwrite		52
+#define kdebug_SMBlock		53
+#define kdebug_SMBunlock	54
+#define kdebug_SMBctemp		55
+#define kdebug_SMBmknew		56
+#define kdebug_SMBcheckpath	57
+#define kdebug_SMBexit		58
+#define kdebug_SMBlseek		59
+#define kdebug_SMBlockread		60
+#define kdebug_SMBwriteunlock		61
+#define kdebug_SMBreadbraw		62
+#define kdebug_SMBreadBmpx		63
+#define kdebug_SMBreadBs		64
+#define kdebug_SMBwritebraw		65
+#define kdebug_SMBwriteBmpx		66
+#define kdebug_SMBwriteBs		67
+#define kdebug_SMBwritec		68
+#define kdebug_SMBsetattrE		69
+#define kdebug_SMBgetattrE		70
+#define kdebug_SMBlockingX		71
+#define kdebug_SMBtrans			72
+#define kdebug_SMBtranss		73
+#define kdebug_SMBioctl			74
+#define kdebug_SMBioctls		75
+#define kdebug_SMBcopy			76
+#define kdebug_SMBmove			77
+#define kdebug_SMBecho			78
+#define kdebug_SMBwriteclose		79
+#define kdebug_SMBopenX			80
+#define kdebug_SMBreadX			81
+#define kdebug_SMBwriteX		82
+#define kdebug_SMBtrans2		83
+#define kdebug_SMBtranss2		84
+#define kdebug_SMBfindclose		85
+#define kdebug_SMBfindnclose		86
+#define kdebug_SMBtcon			87
+#define kdebug_SMBtdis			88
+#define kdebug_SMBnegprot		89
+#define kdebug_SMBsesssetupX		90
+#define kdebug_SMBulogoffX		91
+#define kdebug_SMBtconX			92
+#define kdebug_SMBdskattr		93
+#define kdebug_SMBsearch		94
+#define kdebug_SMBffirst		95
+#define kdebug_SMBfunique		96
+#define kdebug_SMBfclose		97
+#define kdebug_SMBnttrans		98
+#define kdebug_SMBnttranss		99
+#define kdebug_SMBntcreateX		100
+#define kdebug_SMBntcancel		101
+#define kdebug_SMBntrename		102
+#define kdebug_SMBsplopen		103
+#define kdebug_SMBsplwr			104
+#define kdebug_SMBsplclose		105
+#define kdebug_SMBsplretq		106
+#define kdebug_SMBsends			107
+#define kdebug_SMBsendb			108
+#define kdebug_SMBfwdname		109
+#define kdebug_SMBcancelf		110
+#define kdebug_SMBgetmac		111
+#define kdebug_SMBsendstrt		112
+#define kdebug_SMBsendend		113
+#define kdebug_SMBsendtxt		114
+#define kdebug_SMBinvalid		115
+#define kdebug_pathworks_setdir		116
+#define kdebug_Trans2_open		117
+#define kdebug_Trans2_findfirst		118
+#define kdebug_Trans2_findnext		119
+#define kdebug_Trans2_qfsinfo		120
+#define kdebug_Trans2_setfsinfo		121
+#define kdebug_Trans2_qpathinfo		122
+#define kdebug_Trans2_setpathinfo	123
+#define kdebug_Trans2_qfileinfo		124
+#define kdebug_Trans2_setfileinfo	125
+#define kdebug_Trans2_fsctl		126
+#define kdebug_Trans2_ioctl		127
+#define kdebug_Trans2_findnotifyfirst	128
+#define kdebug_Trans2_findnotifynext	129
+#define kdebug_Trans2_mkdir		130
+#define kdebug_Trans2_session_setup		131
+#define kdebug_Trans2_get_dfs_referral		132
+#define kdebug_Trans2_report_dfs_inconsistancy	133
+#define kdebug_NT_transact_create		134
+#define kdebug_NT_transact_ioctl		135
+#define kdebug_NT_transact_set_security_desc	136
+#define kdebug_NT_transact_notify_change	137
+#define kdebug_NT_transact_rename		138
+#define kdebug_NT_transact_query_security_desc	139
+#define kdebug_NT_transact_get_user_quota	140
+#define kdebug_NT_transact_set_user_quota	141
+#define kdebug_get_nt_acl		142
+#define kdebug_fget_nt_acl		143
+#define kdebug_set_nt_acl		144
+#define kdebug_fset_nt_acl		145
+#define kdebug_chmod_acl		146
+#define kdebug_fchmod_acl		147
+#define kdebug_name_release		148
+#define kdebug_name_refresh		149
+#define kdebug_name_registration	150
+#define kdebug_node_status		151
+#define kdebug_name_query		152
+#define kdebug_host_announce		153
+#define kdebug_workgroup_announce	154
+#define kdebug_local_master_announce	155
+#define kdebug_master_browser_announce	156
+#define kdebug_lm_host_announce		157
+#define kdebug_get_backup_list		158
+#define kdebug_reset_browser		159
+#define kdebug_announce_request		160
+#define kdebug_lm_announce_request	161
+#define kdebug_domain_logon		162
+#define kdebug_sync_browse_lists	163
+#define kdebug_run_elections		164
+#define kdebug_election			165
+
+#define kdebug_syscall_lchown 166 /* added by jra in rev 23105 */
+#define kdebug_syscall_ntimes 167 /* added by jra in rev 21714 */
+#define kdebug_syscall_linux_setlease 168 /* added by jmcd in rev 21324 */
+
+/* XXX jpeach added chflags in rev 21757 and didn't update the profiling */
+
+#endif /* WITH_PROFILE && defined(WITH_KDEBUG_TRACE) */
+
+#endif /* _SMBKDEBUG_H_ */