]> git.pld-linux.org Git - packages/kernel.git/commitdiff
replace scsi_mod insertion patch with final fix
authorJan Palus <atler@pld-linux.org>
Sat, 10 Aug 2019 15:45:15 +0000 (17:45 +0200)
committerJan Palus <atler@pld-linux.org>
Sat, 10 Aug 2019 15:45:15 +0000 (17:45 +0200)
queued for 5.4 at the time of this writing

bz204119.patch

index 98500068a5f94ebdbb8bf2595dd2a23a69e3ca61..deccfcaf3b90648d70e2a8004527a169b9f55127 100644 (file)
+From dccc96abfb21dc19d69e707c38c8ba439bba7160 Mon Sep 17 00:00:00 2001
+From: Bart Van Assche <bvanassche@acm.org>
+Date: Thu, 1 Aug 2019 15:38:14 -0700
+Subject: scsi: core: Reduce memory required for SCSI logging
+
+The data structure used for log messages is so large that it can cause a
+boot failure. Since allocations from that data structure can fail anyway,
+use kmalloc() / kfree() instead of that data structure.
+
+See also https://bugzilla.kernel.org/show_bug.cgi?id=204119.
+See also commit ded85c193a39 ("scsi: Implement per-cpu logging buffer") # v4.0.
+
+Reported-by: Jan Palus <jpalus@fastmail.com>
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Hannes Reinecke <hare@suse.com>
+Cc: Johannes Thumshirn <jthumshirn@suse.de>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Jan Palus <jpalus@fastmail.com>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+---
+ drivers/scsi/scsi_logging.c | 48 +++------------------------------------------
+ include/scsi/scsi_dbg.h     |  2 --
+ 2 files changed, 3 insertions(+), 47 deletions(-)
+
 diff --git a/drivers/scsi/scsi_logging.c b/drivers/scsi/scsi_logging.c
-index 39b8cc4574b4..148d8635d5f6 100644
+index 39b8cc4574b4..c6ed0b12e807 100644
 --- a/drivers/scsi/scsi_logging.c
 +++ b/drivers/scsi/scsi_logging.c
-@@ -15,7 +15,7 @@
+@@ -15,57 +15,15 @@
  #include <scsi/scsi_eh.h>
  #include <scsi/scsi_dbg.h>
-
 -#define SCSI_LOG_SPOOLSIZE 4096
-+#define SCSI_LOG_SPOOLSIZE SCSI_LOG_BUFSIZE
+-
+-#if (SCSI_LOG_SPOOLSIZE / SCSI_LOG_BUFSIZE) > BITS_PER_LONG
+-#warning SCSI logging bitmask too large
+-#endif
+-
+-struct scsi_log_buf {
+-      char buffer[SCSI_LOG_SPOOLSIZE];
+-      unsigned long map;
+-};
+-
+-static DEFINE_PER_CPU(struct scsi_log_buf, scsi_format_log);
+-
+ static char *scsi_log_reserve_buffer(size_t *len)
+ {
+-      struct scsi_log_buf *buf;
+-      unsigned long map_bits = sizeof(buf->buffer) / SCSI_LOG_BUFSIZE;
+-      unsigned long idx = 0;
+-
+-      preempt_disable();
+-      buf = this_cpu_ptr(&scsi_format_log);
+-      idx = find_first_zero_bit(&buf->map, map_bits);
+-      if (likely(idx < map_bits)) {
+-              while (test_and_set_bit(idx, &buf->map)) {
+-                      idx = find_next_zero_bit(&buf->map, map_bits, idx);
+-                      if (idx >= map_bits)
+-                              break;
+-              }
+-      }
+-      if (WARN_ON(idx >= map_bits)) {
+-              preempt_enable();
+-              return NULL;
+-      }
+-      *len = SCSI_LOG_BUFSIZE;
+-      return buf->buffer + idx * SCSI_LOG_BUFSIZE;
++      *len = 128;
++      return kmalloc(*len, GFP_ATOMIC);
+ }
+ static void scsi_log_release_buffer(char *bufptr)
+ {
+-      struct scsi_log_buf *buf;
+-      unsigned long idx;
+-      int ret;
+-
+-      buf = this_cpu_ptr(&scsi_format_log);
+-      if (bufptr >= buf->buffer &&
+-          bufptr < buf->buffer + SCSI_LOG_SPOOLSIZE) {
+-              idx = (bufptr - buf->buffer) / SCSI_LOG_BUFSIZE;
+-              ret = test_and_clear_bit(idx, &buf->map);
+-              WARN_ON(!ret);
+-      }
+-      preempt_enable();
++      kfree(bufptr);
+ }
+ static inline const char *scmd_name(const struct scsi_cmnd *scmd)
+diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h
+index e03bd9d41fa8..7b196d234626 100644
+--- a/include/scsi/scsi_dbg.h
++++ b/include/scsi/scsi_dbg.h
+@@ -6,8 +6,6 @@ struct scsi_cmnd;
+ struct scsi_device;
+ struct scsi_sense_hdr;
+-#define SCSI_LOG_BUFSIZE 128
+-
+ extern void scsi_print_command(struct scsi_cmnd *);
+ extern size_t __scsi_format_command(char *, size_t,
+                                  const unsigned char *, size_t);
+-- 
+cgit 1.2-0.3.lf.el7
 
- #if (SCSI_LOG_SPOOLSIZE / SCSI_LOG_BUFSIZE) > BITS_PER_LONG
- #warning SCSI logging bitmask too large
This page took 0.681164 seconds and 4 git commands to generate.