summary refs log tree commit diff
path: root/arch/s390/kernel/debug.c
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2017-10-09 17:49:38 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2017-10-18 14:11:19 +0200
commit94158e544fd60c6a94af348790dae76578ed8dae (patch)
treee0281c7e55dc2e7ac77d7e1f3270d3d35c1515ac /arch/s390/kernel/debug.c
parent7c3eaaa3917d8b5491f58ea263bf6e719fd3155f (diff)
downloadlinux-94158e544fd60c6a94af348790dae76578ed8dae.tar.gz
s390/debug: improve debug_event
debug_event currently truncates the data if used with a size larger than
the buf_size of the debug feature. For lots of callers of this function,
wrappers have been implemented that loop until all data is handled.

Move that functionality into debug_event_common and get rid of the wrappers.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Acked-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/debug.c')
-rw-r--r--arch/s390/kernel/debug.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c
index c960797c8a6f..df916738fbd8 100644
--- a/arch/s390/kernel/debug.c
+++ b/arch/s390/kernel/debug.c
@@ -900,12 +900,16 @@ debug_entry_t *debug_event_common(debug_info_t *id, int level, const void *buf,
 	} 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));
-	debug_finish_entry(id, active, level, 0);
-	spin_unlock_irqrestore(&id->lock, flags);
+	do {
+		active = get_active_entry(id);
+		memset(DEBUG_DATA(active), 0, id->buf_size);
+		memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size));
+		debug_finish_entry(id, active, level, 0);
+		len -= id->buf_size;
+		buf += id->buf_size;
+	} while (len > 0);
 
+	spin_unlock_irqrestore(&id->lock, flags);
 	return active;
 }
 EXPORT_SYMBOL(debug_event_common);
@@ -928,12 +932,16 @@ debug_entry_t *debug_exception_common(debug_info_t *id, int level,
 	} 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));
-	debug_finish_entry(id, active, level, 1);
-	spin_unlock_irqrestore(&id->lock, flags);
+	do {
+		active = get_active_entry(id);
+		memset(DEBUG_DATA(active), 0, id->buf_size);
+		memcpy(DEBUG_DATA(active), buf, min(len, id->buf_size));
+		debug_finish_entry(id, active, level, len <= id->buf_size);
+		len -= id->buf_size;
+		buf += id->buf_size;
+	} while (len > 0);
 
+	spin_unlock_irqrestore(&id->lock, flags);
 	return active;
 }
 EXPORT_SYMBOL(debug_exception_common);