1#ifndef _PROFILE_H_ 2#define _PROFILE_H_ 3/* 4 Unix SMB/CIFS implementation. 5 store smbd profiling information in shared memory 6 Copyright (C) Andrew Tridgell 1999 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 22*/ 23 24/* 25 * Reasons for cache flush. 26 */ 27 28#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */ 29enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH, 30 OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH }; 31 32/* this file defines the profile structure in the profile shared 33 memory area */ 34 35#define PROF_SHMEM_KEY ((key_t)0x07021999) 36#define PROF_SHM_MAGIC 0x6349985 37#define PROF_SHM_VERSION 10 38 39/* time values in the following structure are in microseconds */ 40 41struct profile_stats { 42/* general counters */ 43 unsigned smb_count; /* how many SMB packets we have processed */ 44 unsigned uid_changes; /* how many times we change our effective uid */ 45/* system call counters */ 46 unsigned syscall_opendir_count; 47 unsigned syscall_opendir_time; 48 unsigned syscall_readdir_count; 49 unsigned syscall_readdir_time; 50 unsigned syscall_seekdir_count; 51 unsigned syscall_seekdir_time; 52 unsigned syscall_telldir_count; 53 unsigned syscall_telldir_time; 54 unsigned syscall_rewinddir_count; 55 unsigned syscall_rewinddir_time; 56 unsigned syscall_mkdir_count; 57 unsigned syscall_mkdir_time; 58 unsigned syscall_rmdir_count; 59 unsigned syscall_rmdir_time; 60 unsigned syscall_closedir_count; 61 unsigned syscall_closedir_time; 62 unsigned syscall_open_count; 63 unsigned syscall_open_time; 64 unsigned syscall_close_count; 65 unsigned syscall_close_time; 66 unsigned syscall_read_count; 67 unsigned syscall_read_time; 68 unsigned syscall_read_bytes; /* bytes read with read syscall */ 69 unsigned syscall_pread_count; 70 unsigned syscall_pread_time; 71 unsigned syscall_pread_bytes; /* bytes read with pread syscall */ 72 unsigned syscall_write_count; 73 unsigned syscall_write_time; 74 unsigned syscall_write_bytes; /* bytes written with write syscall */ 75 unsigned syscall_pwrite_count; 76 unsigned syscall_pwrite_time; 77 unsigned syscall_pwrite_bytes; /* bytes written with pwrite syscall */ 78 unsigned syscall_lseek_count; 79 unsigned syscall_lseek_time; 80 unsigned syscall_sendfile_count; 81 unsigned syscall_sendfile_time; 82 unsigned syscall_sendfile_bytes; /* bytes read with sendfile syscall */ 83 unsigned syscall_rename_count; 84 unsigned syscall_rename_time; 85 unsigned syscall_fsync_count; 86 unsigned syscall_fsync_time; 87 unsigned syscall_stat_count; 88 unsigned syscall_stat_time; 89 unsigned syscall_fstat_count; 90 unsigned syscall_fstat_time; 91 unsigned syscall_lstat_count; 92 unsigned syscall_lstat_time; 93 unsigned syscall_unlink_count; 94 unsigned syscall_unlink_time; 95 unsigned syscall_chmod_count; 96 unsigned syscall_chmod_time; 97 unsigned syscall_fchmod_count; 98 unsigned syscall_fchmod_time; 99 unsigned syscall_chown_count; 100 unsigned syscall_chown_time; 101 unsigned syscall_fchown_count; 102 unsigned syscall_fchown_time; 103 unsigned syscall_chdir_count; 104 unsigned syscall_chdir_time; 105 unsigned syscall_getwd_count; 106 unsigned syscall_getwd_time; 107 unsigned syscall_utime_count; 108 unsigned syscall_utime_time; 109 unsigned syscall_ftruncate_count; 110 unsigned syscall_ftruncate_time; 111 unsigned syscall_fcntl_lock_count; 112 unsigned syscall_fcntl_lock_time; 113 unsigned syscall_readlink_count; 114 unsigned syscall_readlink_time; 115 unsigned syscall_symlink_count; 116 unsigned syscall_symlink_time; 117 unsigned syscall_link_count; 118 unsigned syscall_link_time; 119 unsigned syscall_mknod_count; 120 unsigned syscall_mknod_time; 121 unsigned syscall_realpath_count; 122 unsigned syscall_realpath_time; 123 unsigned syscall_get_quota_count; 124 unsigned syscall_get_quota_time; 125 unsigned syscall_set_quota_count; 126 unsigned syscall_set_quota_time; 127/* stat cache counters */ 128 unsigned statcache_lookups; 129 unsigned statcache_misses; 130 unsigned statcache_hits; 131/* write cache counters */ 132 unsigned writecache_read_hits; 133 unsigned writecache_abutted_writes; 134 unsigned writecache_total_writes; 135 unsigned writecache_non_oplock_writes; 136 unsigned writecache_direct_writes; 137 unsigned writecache_init_writes; 138 unsigned writecache_flushed_writes[NUM_FLUSH_REASONS]; 139 unsigned writecache_num_perfect_writes; 140 unsigned writecache_num_write_caches; 141 unsigned writecache_allocated_write_caches; 142/* counters for individual SMB types */ 143 unsigned SMBmkdir_count; /* create directory */ 144 unsigned SMBmkdir_time; 145 unsigned SMBrmdir_count; /* delete directory */ 146 unsigned SMBrmdir_time; 147 unsigned SMBopen_count; /* open file */ 148 unsigned SMBopen_time; 149 unsigned SMBcreate_count; /* create file */ 150 unsigned SMBcreate_time; 151 unsigned SMBclose_count; /* close file */ 152 unsigned SMBclose_time; 153 unsigned SMBflush_count; /* flush file */ 154 unsigned SMBflush_time; 155 unsigned SMBunlink_count; /* delete file */ 156 unsigned SMBunlink_time; 157 unsigned SMBmv_count; /* rename file */ 158 unsigned SMBmv_time; 159 unsigned SMBgetatr_count; /* get file attributes */ 160 unsigned SMBgetatr_time; 161 unsigned SMBsetatr_count; /* set file attributes */ 162 unsigned SMBsetatr_time; 163 unsigned SMBread_count; /* read from file */ 164 unsigned SMBread_time; 165 unsigned SMBwrite_count; /* write to file */ 166 unsigned SMBwrite_time; 167 unsigned SMBlock_count; /* lock byte range */ 168 unsigned SMBlock_time; 169 unsigned SMBunlock_count; /* unlock byte range */ 170 unsigned SMBunlock_time; 171 unsigned SMBctemp_count; /* create temporary file */ 172 unsigned SMBctemp_time; 173 /* SMBmknew stats are currently combined with SMBcreate */ 174 unsigned SMBmknew_count; /* make new file */ 175 unsigned SMBmknew_time; 176 unsigned SMBchkpth_count; /* check directory path */ 177 unsigned SMBchkpth_time; 178 unsigned SMBexit_count; /* process exit */ 179 unsigned SMBexit_time; 180 unsigned SMBlseek_count; /* seek */ 181 unsigned SMBlseek_time; 182 unsigned SMBlockread_count; /* Lock a range and read */ 183 unsigned SMBlockread_time; 184 unsigned SMBwriteunlock_count; /* Unlock a range then write */ 185 unsigned SMBwriteunlock_time; 186 unsigned SMBreadbraw_count; /* read a block of data with no smb header */ 187 unsigned SMBreadbraw_time; 188 unsigned SMBreadBmpx_count; /* read block multiplexed */ 189 unsigned SMBreadBmpx_time; 190 unsigned SMBreadBs_count; /* read block (secondary response) */ 191 unsigned SMBreadBs_time; 192 unsigned SMBwritebraw_count; /* write a block of data with no smb header */ 193 unsigned SMBwritebraw_time; 194 unsigned SMBwriteBmpx_count; /* write block multiplexed */ 195 unsigned SMBwriteBmpx_time; 196 unsigned SMBwriteBs_count; /* write block (secondary request) */ 197 unsigned SMBwriteBs_time; 198 unsigned SMBwritec_count; /* secondary write request */ 199 unsigned SMBwritec_time; 200 unsigned SMBsetattrE_count; /* set file attributes expanded */ 201 unsigned SMBsetattrE_time; 202 unsigned SMBgetattrE_count; /* get file attributes expanded */ 203 unsigned SMBgetattrE_time; 204 unsigned SMBlockingX_count; /* lock/unlock byte ranges and X */ 205 unsigned SMBlockingX_time; 206 unsigned SMBtrans_count; /* transaction - name, bytes in/out */ 207 unsigned SMBtrans_time; 208 unsigned SMBtranss_count; /* transaction (secondary request/response) */ 209 unsigned SMBtranss_time; 210 unsigned SMBioctl_count; /* IOCTL */ 211 unsigned SMBioctl_time; 212 unsigned SMBioctls_count; /* IOCTL (secondary request/response) */ 213 unsigned SMBioctls_time; 214 unsigned SMBcopy_count; /* copy */ 215 unsigned SMBcopy_time; 216 unsigned SMBmove_count; /* move */ 217 unsigned SMBmove_time; 218 unsigned SMBecho_count; /* echo */ 219 unsigned SMBecho_time; 220 unsigned SMBwriteclose_count; /* write a file then close it */ 221 unsigned SMBwriteclose_time; 222 unsigned SMBopenX_count; /* open and X */ 223 unsigned SMBopenX_time; 224 unsigned SMBreadX_count; /* read and X */ 225 unsigned SMBreadX_time; 226 unsigned SMBwriteX_count; /* write and X */ 227 unsigned SMBwriteX_time; 228 unsigned SMBtrans2_count; /* TRANS2 protocol set */ 229 unsigned SMBtrans2_time; 230 unsigned SMBtranss2_count; /* TRANS2 protocol set, secondary command */ 231 unsigned SMBtranss2_time; 232 unsigned SMBfindclose_count; /* Terminate a TRANSACT2_FINDFIRST */ 233 unsigned SMBfindclose_time; 234 unsigned SMBfindnclose_count; /* Terminate a TRANSACT2_FINDNOTIFYFIRST */ 235 unsigned SMBfindnclose_time; 236 unsigned SMBtcon_count; /* tree connect */ 237 unsigned SMBtcon_time; 238 unsigned SMBtdis_count; /* tree disconnect */ 239 unsigned SMBtdis_time; 240 unsigned SMBnegprot_count; /* negotiate protocol */ 241 unsigned SMBnegprot_time; 242 unsigned SMBsesssetupX_count; /* Session Set Up & X (including User Logon) */ 243 unsigned SMBsesssetupX_time; 244 unsigned SMBulogoffX_count; /* user logoff */ 245 unsigned SMBulogoffX_time; 246 unsigned SMBtconX_count; /* tree connect and X*/ 247 unsigned SMBtconX_time; 248 unsigned SMBdskattr_count; /* get disk attributes */ 249 unsigned SMBdskattr_time; 250 unsigned SMBsearch_count; /* search directory */ 251 unsigned SMBsearch_time; 252 /* SBMffirst stats combined with SMBsearch */ 253 unsigned SMBffirst_count; /* find first */ 254 unsigned SMBffirst_time; 255 /* SBMfunique stats combined with SMBsearch */ 256 unsigned SMBfunique_count; /* find unique */ 257 unsigned SMBfunique_time; 258 unsigned SMBfclose_count; /* find close */ 259 unsigned SMBfclose_time; 260 unsigned SMBnttrans_count; /* NT transact */ 261 unsigned SMBnttrans_time; 262 unsigned SMBnttranss_count; /* NT transact secondary */ 263 unsigned SMBnttranss_time; 264 unsigned SMBntcreateX_count; /* NT create and X */ 265 unsigned SMBntcreateX_time; 266 unsigned SMBntcancel_count; /* NT cancel */ 267 unsigned SMBntcancel_time; 268 unsigned SMBntrename_count; /* NT rename file */ 269 unsigned SMBntrename_time; 270 unsigned SMBsplopen_count; /* open print spool file */ 271 unsigned SMBsplopen_time; 272 unsigned SMBsplwr_count; /* write to print spool file */ 273 unsigned SMBsplwr_time; 274 unsigned SMBsplclose_count; /* close print spool file */ 275 unsigned SMBsplclose_time; 276 unsigned SMBsplretq_count; /* return print queue */ 277 unsigned SMBsplretq_time; 278 unsigned SMBsends_count; /* send single block message */ 279 unsigned SMBsends_time; 280 unsigned SMBsendb_count; /* send broadcast message */ 281 unsigned SMBsendb_time; 282 unsigned SMBfwdname_count; /* forward user name */ 283 unsigned SMBfwdname_time; 284 unsigned SMBcancelf_count; /* cancel forward */ 285 unsigned SMBcancelf_time; 286 unsigned SMBgetmac_count; /* get machine name */ 287 unsigned SMBgetmac_time; 288 unsigned SMBsendstrt_count; /* send start of multi-block message */ 289 unsigned SMBsendstrt_time; 290 unsigned SMBsendend_count; /* send end of multi-block message */ 291 unsigned SMBsendend_time; 292 unsigned SMBsendtxt_count; /* send text of multi-block message */ 293 unsigned SMBsendtxt_time; 294 unsigned SMBinvalid_count; /* invalid command */ 295 unsigned SMBinvalid_time; 296/* Pathworks setdir command */ 297 unsigned pathworks_setdir_count; 298 unsigned pathworks_setdir_time; 299/* These are the TRANS2 sub commands */ 300 unsigned Trans2_open_count; 301 unsigned Trans2_open_time; 302 unsigned Trans2_findfirst_count; 303 unsigned Trans2_findfirst_time; 304 unsigned Trans2_findnext_count; 305 unsigned Trans2_findnext_time; 306 unsigned Trans2_qfsinfo_count; 307 unsigned Trans2_qfsinfo_time; 308 unsigned Trans2_setfsinfo_count; 309 unsigned Trans2_setfsinfo_time; 310 unsigned Trans2_qpathinfo_count; 311 unsigned Trans2_qpathinfo_time; 312 unsigned Trans2_setpathinfo_count; 313 unsigned Trans2_setpathinfo_time; 314 unsigned Trans2_qfileinfo_count; 315 unsigned Trans2_qfileinfo_time; 316 unsigned Trans2_setfileinfo_count; 317 unsigned Trans2_setfileinfo_time; 318 unsigned Trans2_fsctl_count; 319 unsigned Trans2_fsctl_time; 320 unsigned Trans2_ioctl_count; 321 unsigned Trans2_ioctl_time; 322 unsigned Trans2_findnotifyfirst_count; 323 unsigned Trans2_findnotifyfirst_time; 324 unsigned Trans2_findnotifynext_count; 325 unsigned Trans2_findnotifynext_time; 326 unsigned Trans2_mkdir_count; 327 unsigned Trans2_mkdir_time; 328 unsigned Trans2_session_setup_count; 329 unsigned Trans2_session_setup_time; 330 unsigned Trans2_get_dfs_referral_count; 331 unsigned Trans2_get_dfs_referral_time; 332 unsigned Trans2_report_dfs_inconsistancy_count; 333 unsigned Trans2_report_dfs_inconsistancy_time; 334/* These are the NT transact sub commands. */ 335 unsigned NT_transact_create_count; 336 unsigned NT_transact_create_time; 337 unsigned NT_transact_ioctl_count; 338 unsigned NT_transact_ioctl_time; 339 unsigned NT_transact_set_security_desc_count; 340 unsigned NT_transact_set_security_desc_time; 341 unsigned NT_transact_notify_change_count; 342 unsigned NT_transact_notify_change_time; 343 unsigned NT_transact_rename_count; 344 unsigned NT_transact_rename_time; 345 unsigned NT_transact_query_security_desc_count; 346 unsigned NT_transact_query_security_desc_time; 347 unsigned NT_transact_get_user_quota_count; 348 unsigned NT_transact_get_user_quota_time; 349 unsigned NT_transact_set_user_quota_count; 350 unsigned NT_transact_set_user_quota_time; 351/* These are ACL manipulation calls */ 352 unsigned get_nt_acl_count; 353 unsigned get_nt_acl_time; 354 unsigned fget_nt_acl_count; 355 unsigned fget_nt_acl_time; 356 unsigned set_nt_acl_count; 357 unsigned set_nt_acl_time; 358 unsigned fset_nt_acl_count; 359 unsigned fset_nt_acl_time; 360 unsigned chmod_acl_count; 361 unsigned chmod_acl_time; 362 unsigned fchmod_acl_count; 363 unsigned fchmod_acl_time; 364/* These are nmbd stats */ 365 unsigned name_release_count; 366 unsigned name_release_time; 367 unsigned name_refresh_count; 368 unsigned name_refresh_time; 369 unsigned name_registration_count; 370 unsigned name_registration_time; 371 unsigned node_status_count; 372 unsigned node_status_time; 373 unsigned name_query_count; 374 unsigned name_query_time; 375 unsigned host_announce_count; 376 unsigned host_announce_time; 377 unsigned workgroup_announce_count; 378 unsigned workgroup_announce_time; 379 unsigned local_master_announce_count; 380 unsigned local_master_announce_time; 381 unsigned master_browser_announce_count; 382 unsigned master_browser_announce_time; 383 unsigned lm_host_announce_count; 384 unsigned lm_host_announce_time; 385 unsigned get_backup_list_count; 386 unsigned get_backup_list_time; 387 unsigned reset_browser_count; 388 unsigned reset_browser_time; 389 unsigned announce_request_count; 390 unsigned announce_request_time; 391 unsigned lm_announce_request_count; 392 unsigned lm_announce_request_time; 393 unsigned domain_logon_count; 394 unsigned domain_logon_time; 395 unsigned sync_browse_lists_count; 396 unsigned sync_browse_lists_time; 397 unsigned run_elections_count; 398 unsigned run_elections_time; 399 unsigned election_count; 400 unsigned election_time; 401}; 402 403struct profile_header { 404 int prof_shm_magic; 405 int prof_shm_version; 406 struct profile_stats stats; 407}; 408 409extern struct profile_header *profile_h; 410extern struct profile_stats *profile_p; 411extern struct timeval profile_starttime; 412extern struct timeval profile_endtime; 413extern struct timeval profile_starttime_nested; 414extern struct timeval profile_endtime_nested; 415extern BOOL do_profile_flag; 416extern BOOL do_profile_times; 417 418/* these are helper macros - do not call them directly in the code 419 * use the DO_PROFILE_* START_PROFILE and END_PROFILE ones 420 * below which test for the profile flage first 421 */ 422#define INC_PROFILE_COUNT(x) profile_p->x++ 423#define DEC_PROFILE_COUNT(x) profile_p->x-- 424#define ADD_PROFILE_COUNT(x,y) profile_p->x += (y) 425#define PROFILE_TIME \ 426 ((profile_endtime.tv_sec - profile_starttime.tv_sec) *1000000 + \ 427 ((int)profile_endtime.tv_usec - (int)profile_starttime.tv_usec)) 428#define PROFILE_TIME_NESTED \ 429 ((profile_endtime_nested.tv_sec - profile_starttime_nested.tv_sec) *1000000 + \ 430 ((int)profile_endtime_nested.tv_usec - (int)profile_starttime_nested.tv_usec)) 431 432#ifdef WITH_PROFILE 433#define DO_PROFILE_INC(x) \ 434 if (do_profile_flag) { \ 435 INC_PROFILE_COUNT(x); \ 436 } 437#define DO_PROFILE_DEC(x) \ 438 if (do_profile_flag) { \ 439 DEC_PROFILE_COUNT(x); \ 440 } 441#define DO_PROFILE_DEC_INC(x,y) \ 442 if (do_profile_flag) { \ 443 DEC_PROFILE_COUNT(x); \ 444 INC_PROFILE_COUNT(y); \ 445 } 446#define DO_PROFILE_ADD(x,n) \ 447 if (do_profile_flag) { \ 448 ADD_PROFILE_COUNT(x,n); \ 449 } 450#define START_PROFILE(x) \ 451 if (do_profile_flag) { \ 452 if (do_profile_times) \ 453 GetTimeOfDay(&profile_starttime); \ 454 INC_PROFILE_COUNT(x##_count); \ 455 } 456#define START_PROFILE_NESTED(x) \ 457 if (do_profile_flag) { \ 458 if (do_profile_times) \ 459 GetTimeOfDay(&profile_starttime_nested); \ 460 INC_PROFILE_COUNT(x##_count); \ 461 } 462#define START_PROFILE_BYTES(x,n) \ 463 if (do_profile_flag) { \ 464 if (do_profile_times) \ 465 GetTimeOfDay(&profile_starttime); \ 466 INC_PROFILE_COUNT(x##_count); \ 467 ADD_PROFILE_COUNT(x##_bytes,n); \ 468 } 469#define END_PROFILE(x) \ 470 if (do_profile_times) { \ 471 GetTimeOfDay(&profile_endtime); \ 472 ADD_PROFILE_COUNT(x##_time,PROFILE_TIME); \ 473 } 474#define END_PROFILE_NESTED(x) \ 475 if (do_profile_times) { \ 476 GetTimeOfDay(&profile_endtime_nested); \ 477 ADD_PROFILE_COUNT(x##_time,PROFILE_TIME_NESTED); \ 478 } 479#else 480#define DO_PROFILE_INC(x) 481#define DO_PROFILE_DEC(x) 482#define DO_PROFILE_DEC_INC(x,y) 483#define DO_PROFILE_ADD(x,n) 484#define START_PROFILE(x) 485#define START_PROFILE_NESTED(x) 486#define START_PROFILE_BYTES(x,n) 487#define END_PROFILE(x) 488#define END_PROFILE_NESTED(x) 489#endif 490 491#endif 492