s3: Add SMB2 performance counters.
authorIra Cooper <samba@ira.wakeful.net>
Thu, 1 Jul 2010 21:51:41 +0000 (17:51 -0400)
committerJeremy Allison <jra@samba.org>
Thu, 8 Jul 2010 01:06:59 +0000 (18:06 -0700)
A performance counter was added for every base type of SMB2 op.

source3/include/smbprofile.h
source3/profile/profile.c
source3/smbd/smb2_server.c
source3/utils/status_profile.c

index 5b52bad8c1aea5d39b8b635c218a4caf0818f2f1..b406c7dd27f54a4feb9bd91ddd6836d6ac5c4aea 100644 (file)
@@ -26,7 +26,7 @@
 
 #define PROF_SHMEM_KEY ((key_t)0x07021999)
 #define PROF_SHM_MAGIC 0x6349985
-#define PROF_SHM_VERSION 11
+#define PROF_SHM_VERSION 12
 
 /* time values in the following structure are in microseconds */
 
@@ -756,6 +756,82 @@ enum profile_stats_values
 #define election_count __profile_stats_value(PR_VALUE_ELECTION, count)
 #define election_time __profile_stats_value(PR_VALUE_ELECTION, time)
 
+       PR_VALUE_SMB2_NEGPROT,
+#define smb2_negprot_count __profile_stats_value(PR_VALUE_SMB2_NEGPROT, count)
+#define smb2_negprot_time __profile_stats_value(PR_VALUE_SMB2_NEGPROT, time)
+
+       PR_VALUE_SMB2_SESSSETUP,
+#define smb2_sesssetup_count __profile_stats_value(PR_VALUE_SMB2_SESSSETUP, count)
+#define smb2_sesssetup_time __profile_stats_value(PR_VALUE_SMB2_SESSSETUP, time)
+
+       PR_VALUE_SMB2_LOGOFF,
+#define smb2_logoff_count __profile_stats_value(PR_VALUE_SMB2_LOGOFF, count)
+#define smb2_logoff_time __profile_stats_value(PR_VALUE_SMB2_LOGOFF, time)
+
+       PR_VALUE_SMB2_TCON,
+#define smb2_tcon_count __profile_stats_value(PR_VALUE_SMB2_TCON, count)
+#define smb2_tcon_time __profile_stats_value(PR_VALUE_SMB2_TCON, time)
+
+       PR_VALUE_SMB2_TDIS,
+#define smb2_tdis_count __profile_stats_value(PR_VALUE_SMB2_TDIS, count)
+#define smb2_tdis_time __profile_stats_value(PR_VALUE_SMB2_TDIS, time)
+
+       PR_VALUE_SMB2_CREATE,
+#define smb2_create_count __profile_stats_value(PR_VALUE_SMB2_CREATE, count)
+#define smb2_create_time __profile_stats_value(PR_VALUE_SMB2_CREATE, time)
+
+       PR_VALUE_SMB2_CLOSE,
+#define smb2_close_count __profile_stats_value(PR_VALUE_SMB2_CLOSE, count)
+#define smb2_close_time __profile_stats_value(PR_VALUE_SMB2_CLOSE, time)
+
+       PR_VALUE_SMB2_FLUSH,
+#define smb2_flush_count __profile_stats_value(PR_VALUE_SMB2_FLUSH, count)
+#define smb2_flush_time __profile_stats_value(PR_VALUE_SMB2_FLUSH, time)
+
+       PR_VALUE_SMB2_READ,
+#define smb2_read_count __profile_stats_value(PR_VALUE_SMB2_READ, count)
+#define smb2_read_time __profile_stats_value(PR_VALUE_SMB2_READ, time)
+
+       PR_VALUE_SMB2_WRITE,
+#define smb2_write_count __profile_stats_value(PR_VALUE_SMB2_WRITE, count)
+#define smb2_write_time __profile_stats_value(PR_VALUE_SMB2_WRITE, time)
+
+       PR_VALUE_SMB2_LOCK,
+#define smb2_lock_count __profile_stats_value(PR_VALUE_SMB2_LOCK, count)
+#define smb2_lock_time __profile_stats_value(PR_VALUE_SMB2_LOCK, time)
+
+       PR_VALUE_SMB2_IOCTL,
+#define smb2_ioctl_count __profile_stats_value(PR_VALUE_SMB2_IOCTL, count)
+#define smb2_ioctl_time __profile_stats_value(PR_VALUE_SMB2_IOCTL, time)
+
+       PR_VALUE_SMB2_CANCEL,
+#define smb2_cancel_count __profile_stats_value(PR_VALUE_SMB2_CANCEL, count)
+#define smb2_cancel_time __profile_stats_value(PR_VALUE_SMB2_CANCEL, time)
+
+       PR_VALUE_SMB2_KEEPALIVE,
+#define smb2_keepalive_count __profile_stats_value(PR_VALUE_SMB2_KEEPALIVE, count)
+#define smb2_keepalive_time __profile_stats_value(PR_VALUE_SMB2_KEEPALIVE, time)
+
+       PR_VALUE_SMB2_FIND,
+#define smb2_find_count __profile_stats_value(PR_VALUE_SMB2_FIND, count)
+#define smb2_find_time __profile_stats_value(PR_VALUE_SMB2_FIND, time)
+
+       PR_VALUE_SMB2_NOTIFY,
+#define smb2_notify_count __profile_stats_value(PR_VALUE_SMB2_NOTIFY, count)
+#define smb2_notify_time __profile_stats_value(PR_VALUE_SMB2_NOTIFY, time)
+
+       PR_VALUE_SMB2_GETINFO,
+#define smb2_getinfo_count __profile_stats_value(PR_VALUE_SMB2_GETINFO, count)
+#define smb2_getinfo_time __profile_stats_value(PR_VALUE_SMB2_GETINFO, time)
+
+       PR_VALUE_SMB2_SETINFO,
+#define smb2_setinfo_count __profile_stats_value(PR_VALUE_SMB2_SETINFO, count)
+#define smb2_setinfo_time __profile_stats_value(PR_VALUE_SMB2_SETINFO, time)
+
+       PR_VALUE_SMB2_BREAK,
+#define smb2_break_count __profile_stats_value(PR_VALUE_SMB2_BREAK, count)
+#define smb2_break_time __profile_stats_value(PR_VALUE_SMB2_BREAK, time)
+
        /* This mist remain the last value. */
        PR_VALUE_MAX
 }; /* enum profile_stats_values */
@@ -890,6 +966,13 @@ static inline uint64_t profile_timestamp(void)
                    profile_timestamp() - __profstamp_##x); \
        }
 
+#define PROFILE_AND_RETURN(x,t,c) { \
+       t __return_value; \
+       START_PROFILE(x); \
+       __return_value = (c); \
+       END_PROFILE(x); \
+       return __return_value; \
+}
 
 #else /* WITH_PROFILE */
 
@@ -900,7 +983,7 @@ static inline uint64_t profile_timestamp(void)
 #define START_PROFILE(x)
 #define START_PROFILE_BYTES(x,n)
 #define END_PROFILE(x)
-
+#define PROFILE_AND_RETURN(x,t,c) return (c);
 #endif /* WITH_PROFILE */
 
 #endif
index 817bbb6b2dcfdc91cf0125f200c0e9276bb09d53..c8e7c38da7a1657e06a86907ce7c6302eac15372 100644 (file)
@@ -455,6 +455,25 @@ bool profile_setup(struct messaging_context *msg_ctx, bool rdonly)
            "sync_browse_lists",        /* PR_VALUE_SYNC_BROWSE_LISTS */
            "run_elections",            /* PR_VALUE_RUN_ELECTIONS */
            "election",                 /* PR_VALUE_ELECTION */
+           "smb2_negprot",             /* PR_VALUE_SMB2_NEGPROT */
+           "smb2_sesssetup",           /* PR_VALUE_SMB2_SESSETUP */
+           "smb2_logoff",              /* PR_VALUE_SMB2_LOGOFF */
+           "smb2_tcon",                /* PR_VALUE_SMB2_TCON */
+           "smb2_tdis",                /* PR_VALUE_SMB2_TDIS */
+           "smb2_create",              /* PR_VALUE_SMB2_CREATE */
+           "smb2_close",               /* PR_VALUE_SMB2_CLOSE */
+           "smb2_flush",               /* PR_VALUE_SMB2_FLUSH */
+           "smb2_read",                /* PR_VALUE_SMB2_READ */
+           "smb2_write",               /* PR_VALUE_SMB2_WRITE */
+           "smb2_lock",                /* PR_VALUE_SMB2_LOCK */
+           "smb2_ioctl",               /* PR_VALUE_SMB2_IOCTL */
+           "smb2_cancel",              /* PR_VALUE_SMB2_CANCEL */
+           "smb2_keepalive",           /* PR_VALUE_SMB2_KEEPALIVE */
+           "smb2_find",                /* PR_VALUE_SMB2_FIND */
+           "smb2_notify",              /* PR_VALUE_SMB2_NOTIFY */
+           "smb2_getinfo",             /* PR_VALUE_SMB2_GETINFO */
+           "smb2_setinfo"              /* PR_VALUE_SMB2_SETINFO */
+           "smb2_break",               /* PR_VALUE_SMB2_BREAK */
            "" /* PR_VALUE_MAX */
        };
 
index c977653e8d4d726961d392f2d3f6c70ebe21c750..85310c4a25dec90f556731a83268a5823e69bf14 100644 (file)
@@ -1018,16 +1018,22 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 
        switch (opcode) {
        case SMB2_OP_NEGPROT:
-               return smbd_smb2_request_process_negprot(req);
+               PROFILE_AND_RETURN(smb2_negprot,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_negprot(req));
 
        case SMB2_OP_SESSSETUP:
-               return smbd_smb2_request_process_sesssetup(req);
+               PROFILE_AND_RETURN(smb2_sesssetup,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_sesssetup(req));
 
        case SMB2_OP_LOGOFF:
                if (!NT_STATUS_IS_OK(session_status)) {
                        return smbd_smb2_request_error(req, session_status);
                }
-               return smbd_smb2_request_process_logoff(req);
+               PROFILE_AND_RETURN(smb2_logoff,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_logoff(req));
 
        case SMB2_OP_TCON:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1037,7 +1043,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_tcon(req);
+               PROFILE_AND_RETURN(smb2_tcon,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_tcon(req));
 
        case SMB2_OP_TDIS:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1047,7 +1055,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_tdis(req);
+               PROFILE_AND_RETURN(smb2_tdis,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_tdis(req));
 
        case SMB2_OP_CREATE:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1057,7 +1067,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_create(req);
+               PROFILE_AND_RETURN(smb2_create,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_create(req));
 
        case SMB2_OP_CLOSE:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1067,7 +1079,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_close(req);
+               PROFILE_AND_RETURN(smb2_close,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_close(req));
 
        case SMB2_OP_FLUSH:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1077,7 +1091,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_flush(req);
+               PROFILE_AND_RETURN(smb2_flush,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_flush(req));
 
        case SMB2_OP_READ:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1087,7 +1103,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_read(req);
+               PROFILE_AND_RETURN(smb2_read,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_read(req));
 
        case SMB2_OP_WRITE:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1097,7 +1115,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_write(req);
+               PROFILE_AND_RETURN(smb2_write,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_write(req));
 
        case SMB2_OP_LOCK:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1115,7 +1135,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                        }
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_lock(req);
+               PROFILE_AND_RETURN(smb2_lock,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_lock(req));
 
        case SMB2_OP_IOCTL:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1125,13 +1147,20 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_ioctl(req);
+               PROFILE_AND_RETURN(smb2_ioctl,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_ioctl(req));
 
        case SMB2_OP_CANCEL:
-               return smbd_smb2_request_process_cancel(req);
+               PROFILE_AND_RETURN(smb2_cancel,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_cancel(req));
 
        case SMB2_OP_KEEPALIVE:
-               return smbd_smb2_request_process_keepalive(req);
+               PROFILE_AND_RETURN(smb2_keepalive,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_keepalive(req));
+
 
        case SMB2_OP_FIND:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1141,7 +1170,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_find(req);
+               PROFILE_AND_RETURN(smb2_find,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_find(req));
 
        case SMB2_OP_NOTIFY:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1151,7 +1182,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_notify(req);
+               PROFILE_AND_RETURN(smb2_notify,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_notify(req));
 
        case SMB2_OP_GETINFO:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1161,7 +1194,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_getinfo(req);
+               PROFILE_AND_RETURN(smb2_getinfo,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_getinfo(req));
 
        case SMB2_OP_SETINFO:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1171,7 +1206,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_setinfo(req);
+               PROFILE_AND_RETURN(smb2_setinfo,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_setinfo(req));
 
        case SMB2_OP_BREAK:
                if (!NT_STATUS_IS_OK(session_status)) {
@@ -1181,7 +1218,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                if (!NT_STATUS_IS_OK(status)) {
                        return smbd_smb2_request_error(req, status);
                }
-               return smbd_smb2_request_process_break(req);
+               PROFILE_AND_RETURN(smb2_break,
+                                  NTSTATUS,
+                                  smbd_smb2_request_process_break(req));
        }
 
        return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
index a51537d3da8e775004f692aec055cd0c51f391b2..d39ae2d074183875d71d4c25c855369ac60b6cd0 100644 (file)
@@ -400,7 +400,48 @@ bool status_profile_dump(bool verbose)
        d_printf("run_elections_time:             %u\n", profile_p->run_elections_time);
        d_printf("election_count:                 %u\n", profile_p->election_count);
        d_printf("election_time:                  %u\n", profile_p->election_time);
+       profile_separator("SMB2 Calls");
+       d_printf("smb2_negprot_count:             %u\n", profile_p->smb2_negprot_count);
+       d_printf("smb2_negprot_time:              %u\n", profile_p->smb2_negprot_time);
+       d_printf("smb2_sesssetup_count:           %u\n", profile_p->smb2_sesssetup_count);
+       d_printf("smb2_sesssetup_time:            %u\n", profile_p->smb2_sesssetup_time);
+       d_printf("smb2_logoff_count:              %u\n", profile_p->smb2_logoff_count);
+       d_printf("smb2_logoff_time:               %u\n", profile_p->smb2_logoff_time);
+       d_printf("smb2_tcon_count:                %u\n", profile_p->smb2_tcon_count);
+       d_printf("smb2_tcon_time:                 %u\n", profile_p->smb2_tcon_time);
+       d_printf("smb2_tdis_count:                %u\n", profile_p->smb2_tdis_count);
+       d_printf("smb2_tdis_time:                 %u\n", profile_p->smb2_tdis_time);
+       d_printf("smb2_create_count:              %u\n", profile_p->smb2_create_count);
+       d_printf("smb2_create_time:               %u\n", profile_p->smb2_create_time);
+       d_printf("smb2_close_count:               %u\n", profile_p->smb2_close_count);
+       d_printf("smb2_close_time:                %u\n", profile_p->smb2_close_time);
+       d_printf("smb2_flush_count:               %u\n", profile_p->smb2_flush_count);
+       d_printf("smb2_flush_time:                %u\n", profile_p->smb2_flush_time);
+       d_printf("smb2_read_count:                %u\n", profile_p->smb2_read_count);
+       d_printf("smb2_read_time:                 %u\n", profile_p->smb2_read_time);
+       d_printf("smb2_write_count:               %u\n", profile_p->smb2_write_count);
+       d_printf("smb2_write_time:                %u\n", profile_p->smb2_write_time);
+       d_printf("smb2_lock_count:                %u\n", profile_p->smb2_lock_count);
+       d_printf("smb2_lock_time:                 %u\n", profile_p->smb2_lock_time);
+       d_printf("smb2_ioctl_count:               %u\n", profile_p->smb2_ioctl_count);
+       d_printf("smb2_ioctl_time:                %u\n", profile_p->smb2_ioctl_time);
+       d_printf("smb2_cancel_count:              %u\n", profile_p->smb2_cancel_count);
+       d_printf("smb2_cancel_time:               %u\n", profile_p->smb2_cancel_time);
+       d_printf("smb2_keepalive_count:           %u\n", profile_p->smb2_keepalive_count);
+       d_printf("smb2_keepalive_time:            %u\n", profile_p->smb2_keepalive_time);
+       d_printf("smb2_find_count:                %u\n", profile_p->smb2_find_count);
+       d_printf("smb2_find_time:                 %u\n", profile_p->smb2_find_time);
+       d_printf("smb2_notify_count:              %u\n", profile_p->smb2_notify_count);
+       d_printf("smb2_notify_time:               %u\n", profile_p->smb2_notify_time);
+       d_printf("smb2_getinfo_count:             %u\n", profile_p->smb2_getinfo_count);
+       d_printf("smb2_getinfo_time:              %u\n", profile_p->smb2_getinfo_time);
+       d_printf("smb2_setinfo_count:             %u\n", profile_p->smb2_setinfo_count);
+       d_printf("smb2_setinfo_time:              %u\n", profile_p->smb2_setinfo_time);
+       d_printf("smb2_break_count:               %u\n", profile_p->smb2_break_count);
+       d_printf("smb2_break_time:                %u\n", profile_p->smb2_break_time);
+
 #else /* WITH_PROFILE */
+
        fprintf(stderr, "Profile data unavailable\n");
 #endif /* WITH_PROFILE */