support-kdebug-tracing [plain text]
Index: samba/source/configure.in
===================================================================
--- samba/source/configure.in.orig
+++ samba/source/configure.in
@@ -439,6 +439,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_ */