s390/debug: avoid function call for debug_sprintf_*
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>
This commit is contained in:
committed by
Martin Schwidefsky
parent
ed7d56e174
commit
832a771034
@ -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!
|
* stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
|
||||||
*/
|
*/
|
||||||
extern debug_entry_t *
|
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)));
|
__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*
|
static inline debug_entry_t*
|
||||||
debug_exception(debug_info_t* id, int level, void* data, int length)
|
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!
|
* stored in the s390dbf. See Documentation/s390/s390dbf.txt for more details!
|
||||||
*/
|
*/
|
||||||
extern debug_entry_t *
|
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)));
|
__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_register_view(debug_info_t* id, struct debug_view* view);
|
||||||
int debug_unregister_view(debug_info_t* id, struct debug_view* view);
|
int debug_unregister_view(debug_info_t* id, struct debug_view* view);
|
||||||
|
|
||||||
|
@ -1019,7 +1019,7 @@ debug_count_numargs(char *string)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
debug_entry_t*
|
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;
|
va_list ap;
|
||||||
int numargs,idx;
|
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_sprintf_entry_t *curr_event;
|
||||||
debug_entry_t *active;
|
debug_entry_t *active;
|
||||||
|
|
||||||
if((!id) || (level > id->level))
|
|
||||||
return NULL;
|
|
||||||
if (!debug_active || !id->areas)
|
if (!debug_active || !id->areas)
|
||||||
return NULL;
|
return NULL;
|
||||||
numargs=debug_count_numargs(string);
|
numargs=debug_count_numargs(string);
|
||||||
@ -1050,14 +1048,14 @@ debug_sprintf_event(debug_info_t* id, int level,char *string,...)
|
|||||||
|
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(debug_sprintf_event);
|
EXPORT_SYMBOL(__debug_sprintf_event);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debug_sprintf_exception:
|
* debug_sprintf_exception:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
debug_entry_t*
|
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;
|
va_list ap;
|
||||||
int numargs,idx;
|
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_sprintf_entry_t *curr_event;
|
||||||
debug_entry_t *active;
|
debug_entry_t *active;
|
||||||
|
|
||||||
if((!id) || (level > id->level))
|
|
||||||
return NULL;
|
|
||||||
if (!debug_active || !id->areas)
|
if (!debug_active || !id->areas)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -1089,7 +1085,7 @@ debug_sprintf_exception(debug_info_t* id, int level,char *string,...)
|
|||||||
|
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(debug_sprintf_exception);
|
EXPORT_SYMBOL(__debug_sprintf_exception);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debug_register_view:
|
* debug_register_view:
|
||||||
|
Reference in New Issue
Block a user