s390/debug: improve debug_event
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 9 Oct 2017 15:49:38 +0000 (17:49 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 18 Oct 2017 12:11:19 +0000 (14:11 +0200)
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>
arch/s390/include/asm/pci_debug.h
arch/s390/kernel/debug.c
drivers/s390/block/scm_blk.h
drivers/s390/cio/chsc_sch.c
drivers/s390/cio/cio_debug.h
drivers/s390/cio/eadm_sch.c
drivers/s390/cio/qdio_debug.h

index ac24b26fc065be9bad9443fc7a86cd1e24ab3abe..773ff1352a960bce23107c44eb9df8de95101a55 100644 (file)
@@ -18,11 +18,7 @@ extern debug_info_t *pci_debug_err_id;
 
 static inline void zpci_err_hex(void *addr, int len)
 {
-       while (len > 0) {
-               debug_event(pci_debug_err_id, 0, (void *) addr, len);
-               len -= pci_debug_err_id->buf_size;
-               addr += pci_debug_err_id->buf_size;
-       }
+       debug_event(pci_debug_err_id, 0, addr, len);
 }
 
 #endif
index c960797c8a6f150089f95f4e870474c2a02a236c..df916738fbd86bac3044f78743057924e6b67d28 100644 (file)
@@ -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);
index 71288dd9dd7f51e8ced7e4eb799096d313f51cf3..f9338d20858b677a59954f92a8cfbc6f4fb24a1f 100644 (file)
@@ -55,13 +55,7 @@ extern debug_info_t *scm_debug;
 
 static inline void SCM_LOG_HEX(int level, void *data, int length)
 {
-       if (!debug_level_enabled(scm_debug, level))
-               return;
-       while (length > 0) {
-               debug_event(scm_debug, level, data, length);
-               length -= scm_debug->buf_size;
-               data += scm_debug->buf_size;
-       }
+       debug_event(scm_debug, level, data, length);
 }
 
 static inline void SCM_LOG_STATE(int level, struct scm_device *scmdev)
index 735052ecd3e57e320136ad440612eca26340d97c..8e7e19b9e92c028e1097fe9ff82386203594bc37 100644 (file)
@@ -43,11 +43,7 @@ static DEFINE_MUTEX(on_close_mutex);
 
 static void CHSC_LOG_HEX(int level, void *data, int length)
 {
-       while (length > 0) {
-               debug_event(chsc_debug_log_id, level, data, length);
-               length -= chsc_debug_log_id->buf_size;
-               data += chsc_debug_log_id->buf_size;
-       }
+       debug_event(chsc_debug_log_id, level, data, length);
 }
 
 MODULE_AUTHOR("IBM Corporation");
index e64e8278c42e9979af1d35fb57c685be02327731..9fead866163fcc9680fa6c41d8c45923a6692f3a 100644 (file)
@@ -22,13 +22,7 @@ extern debug_info_t *cio_debug_crw_id;
 
 static inline void CIO_HEX_EVENT(int level, void *data, int length)
 {
-       if (unlikely(!cio_debug_trace_id))
-               return;
-       while (length > 0) {
-               debug_event(cio_debug_trace_id, level, data, length);
-               length -= cio_debug_trace_id->buf_size;
-               data += cio_debug_trace_id->buf_size;
-       }
+       debug_event(cio_debug_trace_id, level, data, length);
 }
 
 #endif
index 0f11f3bcac8284d9a5191913ad9aaf3647cd3293..d14795f7110b4021a2fa58b08b332af34573a735 100644 (file)
@@ -43,13 +43,7 @@ static debug_info_t *eadm_debug;
 
 static void EADM_LOG_HEX(int level, void *data, int length)
 {
-       if (!debug_level_enabled(eadm_debug, level))
-               return;
-       while (length > 0) {
-               debug_event(eadm_debug, level, data, length);
-               length -= eadm_debug->buf_size;
-               data += eadm_debug->buf_size;
-       }
+       debug_event(eadm_debug, level, data, length);
 }
 
 static void orb_init(union orb *orb)
index 1d595d17bf11f6b529eca2caafc494721130b32c..be402da10778123e8b6c9fb9feec1290a1ad0032 100644 (file)
@@ -33,11 +33,7 @@ extern debug_info_t *qdio_dbf_error;
 
 static inline void DBF_HEX(void *addr, int len)
 {
-       while (len > 0) {
-               debug_event(qdio_dbf_setup, DBF_ERR, addr, len);
-               len -= qdio_dbf_setup->buf_size;
-               addr += qdio_dbf_setup->buf_size;
-       }
+       debug_event(qdio_dbf_setup, DBF_ERR, addr, len);
 }
 
 #define DBF_ERROR(text...) \
@@ -49,11 +45,7 @@ static inline void DBF_HEX(void *addr, int len)
 
 static inline void DBF_ERROR_HEX(void *addr, int len)
 {
-       while (len > 0) {
-               debug_event(qdio_dbf_error, DBF_ERR, addr, len);
-               len -= qdio_dbf_error->buf_size;
-               addr += qdio_dbf_error->buf_size;
-       }
+       debug_event(qdio_dbf_error, DBF_ERR, addr, len);
 }
 
 #define DBF_DEV_EVENT(level, device, text...) \
@@ -68,11 +60,7 @@ static inline void DBF_ERROR_HEX(void *addr, int len)
 static inline void DBF_DEV_HEX(struct qdio_irq *dev, void *addr,
                               int len, int level)
 {
-       while (len > 0) {
-               debug_event(dev->debug_area, level, addr, len);
-               len -= dev->debug_area->buf_size;
-               addr += dev->debug_area->buf_size;
-       }
+       debug_event(dev->debug_area, level, addr, len);
 }
 
 int qdio_allocate_dbf(struct qdio_initialize *init_data,