To minimize the overhead of debug printouts during non-debug runs, the check for "is_debug" is moved from log_debug() function to dprintf() macro. Now log_debug is called only if "is_debug" is set. This spares a function call, parameter passing and the costs of complex arguments expanding and evaluation. To minimize the potential cost of log_debug() even more, the check for is_debug is put under unlikely() statement. Signed-off-by: Alexander Nezhinsky <alexandern@xxxxxxxxxxxx> --- usr/log.c | 5 +---- usr/log.h | 6 +++++- usr/tgtd.h | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/usr/log.c b/usr/log.c index 056314a..66f3e14 100644 --- a/usr/log.c +++ b/usr/log.c @@ -43,7 +43,7 @@ static struct logarea *la; static char *log_name; -static int is_debug; +int is_debug = 0; static pid_t pid; static int logarea_init (int size) @@ -297,9 +297,6 @@ void log_error(const char *fmt, ...) void log_debug(const char *fmt, ...) { - if (!is_debug) - return; - va_list ap; va_start(ap, fmt); dolog(LOG_DEBUG, fmt, ap); diff --git a/usr/log.h b/usr/log.h index b84f6d6..426237e 100644 --- a/usr/log.h +++ b/usr/log.h @@ -28,6 +28,9 @@ #include <sys/sem.h> +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + union semun { int val; struct semid_ds *buf; @@ -76,7 +79,8 @@ do { \ #define dprintf(fmt, args...) \ do { \ - log_debug("%s(%d) " fmt, __FUNCTION__, __LINE__, ##args); \ + if (unlikely(is_debug)) \ + log_debug("%s(%d) " fmt, __FUNCTION__, __LINE__, ##args); \ } while (0) #endif /* LOG_H */ diff --git a/usr/tgtd.h b/usr/tgtd.h index 3323a9b..cc2c468 100644 --- a/usr/tgtd.h +++ b/usr/tgtd.h @@ -207,6 +207,7 @@ static inline int kreq_init(void) \ #endif extern int system_active; +extern int is_debug; extern int kspace_send_tsk_mgmt_res(struct mgmt_req *mreq); extern int kspace_send_cmd_res(uint64_t nid, int result, struct scsi_cmd *); -- 1.6.5 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html