diff options
Diffstat (limited to 'arch/s390/kernel/debug.c')
| -rw-r--r-- | arch/s390/kernel/debug.c | 40 | 
1 files changed, 31 insertions, 9 deletions
| diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 6848828b962e..19e5e9eba546 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -2,8 +2,8 @@   *  arch/s390/kernel/debug.c   *   S/390 debug facility   * - *    Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH, - *                             IBM Corporation + *    Copyright IBM Corp. 1999, 2012 + *   *    Author(s): Michael Holzheu (holzheu@de.ibm.com),   *               Holger Smolinski (Holger.Smolinski@de.ibm.com)   * @@ -167,6 +167,7 @@ static debug_info_t *debug_area_last = NULL;  static DEFINE_MUTEX(debug_mutex);  static int initialized; +static int debug_critical;  static const struct file_operations debug_file_ops = {  	.owner   = THIS_MODULE, @@ -932,6 +933,11 @@ debug_stop_all(void)  } +void debug_set_critical(void) +{ +	debug_critical = 1; +} +  /*   * debug_event_common:   * - write debug entry with given size @@ -945,7 +951,11 @@ debug_event_common(debug_info_t * id, int level, const void *buf, int len)  	if (!debug_active || !id->areas)  		return NULL; -	spin_lock_irqsave(&id->lock, flags); +	if (debug_critical) { +		if (!spin_trylock_irqsave(&id->lock, flags)) +			return NULL; +	} else +		spin_lock_irqsave(&id->lock, flags);  	active = get_active_entry(id);  	memset(DEBUG_DATA(active), 0, id->buf_size);  	memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size)); @@ -968,7 +978,11 @@ debug_entry_t  	if (!debug_active || !id->areas)  		return NULL; -	spin_lock_irqsave(&id->lock, flags); +	if (debug_critical) { +		if (!spin_trylock_irqsave(&id->lock, flags)) +			return NULL; +	} else +		spin_lock_irqsave(&id->lock, flags);  	active = get_active_entry(id);  	memset(DEBUG_DATA(active), 0, id->buf_size);  	memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size)); @@ -1013,7 +1027,11 @@ debug_sprintf_event(debug_info_t* id, int level,char *string,...)  		return NULL;  	numargs=debug_count_numargs(string); -	spin_lock_irqsave(&id->lock, flags); +	if (debug_critical) { +		if (!spin_trylock_irqsave(&id->lock, flags)) +			return NULL; +	} else +		spin_lock_irqsave(&id->lock, flags);  	active = get_active_entry(id);  	curr_event=(debug_sprintf_entry_t *) DEBUG_DATA(active);  	va_start(ap,string); @@ -1047,7 +1065,11 @@ debug_sprintf_exception(debug_info_t* id, int level,char *string,...)  	numargs=debug_count_numargs(string); -	spin_lock_irqsave(&id->lock, flags); +	if (debug_critical) { +		if (!spin_trylock_irqsave(&id->lock, flags)) +			return NULL; +	} else +		spin_lock_irqsave(&id->lock, flags);  	active = get_active_entry(id);  	curr_event=(debug_sprintf_entry_t *)DEBUG_DATA(active);  	va_start(ap,string); @@ -1428,10 +1450,10 @@ debug_hex_ascii_format_fn(debug_info_t * id, struct debug_view *view,  	rc += sprintf(out_buf + rc, "| ");  	for (i = 0; i < id->buf_size; i++) {  		unsigned char c = in_buf[i]; -		if (!isprint(c)) -			rc += sprintf(out_buf + rc, "."); -		else +		if (isascii(c) && isprint(c))  			rc += sprintf(out_buf + rc, "%c", c); +		else +			rc += sprintf(out_buf + rc, ".");  	}  	rc += sprintf(out_buf + rc, "\n");  	return rc; | 
