s390/debug: avoid function call for debug_sprintf_*
authorChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 1 Dec 2014 08:16:45 +0000 (09:16 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 8 Dec 2014 08:42:29 +0000 (09:42 +0100)
debug_sprintf_event/exception are called even for debug events
with a disabling debug level. All other functions already do
the check in a wrapper function. Lets do the same here.
Due to the var_args the compiler rejects to make this function
inline. So let's wrap this via a macro.
This patch saves around 80 ns on my z196 for a KVM round trip (we
have two debug statements for entry and exit) when KVM is build as
a module.
The savings for built-in drivers is smaller as we then avoid the
PLT overhead for a function call.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/debug.h
arch/s390/kernel/debug.c

index 530c15eb01e99ad5970b556234c65d34a8bdf141..0206c805232878c95a6588dbb9909ecb4268d5d0 100644 (file)
@@ -151,9 +151,21 @@ debug_text_event(debug_info_t* id, int level, const char* txt)
  * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
  */
 extern debug_entry_t *
-debug_sprintf_event(debug_info_t* id,int level,char *string,...)
+__debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
        __attribute__ ((format(printf, 3, 4)));
 
+#define debug_sprintf_event(_id, _level, _fmt, ...)                    \
+({                                                                     \
+       debug_entry_t *__ret;                                           \
+       debug_info_t *__id = _id;                                       \
+       int __level = _level;                                           \
+       if ((!__id) || (__level > __id->level))                         \
+               __ret = NULL;                                           \
+       else                                                            \
+               __ret = __debug_sprintf_event(__id, __level,            \
+                                             _fmt, ## __VA_ARGS__);    \
+       __ret;                                                          \
+})
 
 static inline debug_entry_t*
 debug_exception(debug_info_t* id, int level, void* data, int length)
@@ -194,9 +206,22 @@ debug_text_exception(debug_info_t* id, int level, const char* txt)
  * stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
  */
 extern debug_entry_t *
-debug_sprintf_exception(debug_info_t* id,int level,char *string,...)
+__debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
        __attribute__ ((format(printf, 3, 4)));
 
+#define debug_sprintf_exception(_id, _level, _fmt, ...)                        \
+({                                                                     \
+       debug_entry_t *__ret;                                           \
+       debug_info_t *__id = _id;                                       \
+       int __level = _level;                                           \
+       if ((!__id) || (__level > __id->level))                         \
+               __ret = NULL;                                           \
+       else                                                            \
+               __ret = __debug_sprintf_exception(__id, __level,        \
+                                                 _fmt, ## __VA_ARGS__);\
+       __ret;                                                          \
+})
+
 int debug_register_view(debug_info_t* id, struct debug_view* view);
 int debug_unregister_view(debug_info_t* id, struct debug_view* view);
 
index ee8390da6ea712943209af03e2d0e9bc3c0106f1..c1f21aca76e7fe0b1f7200f82c97646c51b08c00 100644 (file)
@@ -1019,7 +1019,7 @@ debug_count_numargs(char *string)
  */
 
 debug_entry_t*
-debug_sprintf_event(debug_info_t* id, int level,char *string,...)
+__debug_sprintf_event(debug_info_t *id, int level, char *string, ...)
 {
        va_list   ap;
        int numargs,idx;
@@ -1027,8 +1027,6 @@ debug_sprintf_event(debug_info_t* id, int level,char *string,...)
        debug_sprintf_entry_t *curr_event;
        debug_entry_t *active;
 
-       if((!id) || (level > id->level))
-               return NULL;
        if (!debug_active || !id->areas)
                return NULL;
        numargs=debug_count_numargs(string);
@@ -1050,14 +1048,14 @@ debug_sprintf_event(debug_info_t* id, int level,char *string,...)
 
        return active;
 }
-EXPORT_SYMBOL(debug_sprintf_event);
+EXPORT_SYMBOL(__debug_sprintf_event);
 
 /*
  * debug_sprintf_exception:
  */
 
 debug_entry_t*
-debug_sprintf_exception(debug_info_t* id, int level,char *string,...)
+__debug_sprintf_exception(debug_info_t *id, int level, char *string, ...)
 {
        va_list   ap;
        int numargs,idx;
@@ -1065,8 +1063,6 @@ debug_sprintf_exception(debug_info_t* id, int level,char *string,...)
        debug_sprintf_entry_t *curr_event;
        debug_entry_t *active;
 
-       if((!id) || (level > id->level))
-               return NULL;
        if (!debug_active || !id->areas)
                return NULL;
 
@@ -1089,7 +1085,7 @@ debug_sprintf_exception(debug_info_t* id, int level,char *string,...)
 
        return active;
 }
-EXPORT_SYMBOL(debug_sprintf_exception);
+EXPORT_SYMBOL(__debug_sprintf_exception);
 
 /*
  * debug_register_view: