Skip to content

Commit

Permalink
s390/debug: avoid function call for debug_sprintf_*
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christian Borntraeger authored and Martin Schwidefsky committed Dec 8, 2014
1 parent ed7d56e commit 832a771
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
29 changes: 27 additions & 2 deletions arch/s390/include/asm/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);

Expand Down
12 changes: 4 additions & 8 deletions arch/s390/kernel/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -1019,16 +1019,14 @@ 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;
unsigned long flags;
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);
Expand All @@ -1050,23 +1048,21 @@ 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;
unsigned long flags;
debug_sprintf_entry_t *curr_event;
debug_entry_t *active;

if((!id) || (level > id->level))
return NULL;
if (!debug_active || !id->areas)
return NULL;

Expand All @@ -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:
Expand Down

0 comments on commit 832a771

Please sign in to comment.