aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-01 10:37:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-01 10:37:15 -0400
commitf51fdffad5b7709d0ade40736b58a2da2707fa15 (patch)
tree6d188ad3361bf26446f3718d2c28f609082fd924
parent2161a2a644a6d33a29d68395518d103ed805758f (diff)
parent539294b76af8922297702a7ebb8cafe68f7e5376 (diff)
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fix from James Bottomley: "One final fix before 4.8. There was a memory leak triggered by turning scsi mq off due to the fact that we assume on host release that the already running hosts weren't mq based because that's the state of the global flag (even though they were). Fix it by tracking this on a per host host basis" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: Avoid that toggling use_blk_mq triggers a memory leak
-rw-r--r--drivers/scsi/hosts.c2
-rw-r--r--drivers/scsi/scsi.c1
-rw-r--r--drivers/scsi/scsi_priv.h1
-rw-r--r--include/scsi/scsi_host.h5
4 files changed, 4 insertions, 5 deletions
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index ba9af4a2bd2a..ec6381e57eb7 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -486,6 +486,8 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
486 else 486 else
487 shost->dma_boundary = 0xffffffff; 487 shost->dma_boundary = 0xffffffff;
488 488
489 shost->use_blk_mq = scsi_use_blk_mq;
490
489 device_initialize(&shost->shost_gendev); 491 device_initialize(&shost->shost_gendev);
490 dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); 492 dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
491 shost->shost_gendev.bus = &scsi_bus_type; 493 shost->shost_gendev.bus = &scsi_bus_type;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 1f36aca44394..1deb6adc411f 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -1160,7 +1160,6 @@ bool scsi_use_blk_mq = true;
1160bool scsi_use_blk_mq = false; 1160bool scsi_use_blk_mq = false;
1161#endif 1161#endif
1162module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO); 1162module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO);
1163EXPORT_SYMBOL_GPL(scsi_use_blk_mq);
1164 1163
1165static int __init init_scsi(void) 1164static int __init init_scsi(void)
1166{ 1165{
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index 57a4b9973320..85c8a51bc563 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -29,6 +29,7 @@ extern int scsi_init_hosts(void);
29extern void scsi_exit_hosts(void); 29extern void scsi_exit_hosts(void);
30 30
31/* scsi.c */ 31/* scsi.c */
32extern bool scsi_use_blk_mq;
32extern int scsi_setup_command_freelist(struct Scsi_Host *shost); 33extern int scsi_setup_command_freelist(struct Scsi_Host *shost);
33extern void scsi_destroy_command_freelist(struct Scsi_Host *shost); 34extern void scsi_destroy_command_freelist(struct Scsi_Host *shost);
34#ifdef CONFIG_SCSI_LOGGING 35#ifdef CONFIG_SCSI_LOGGING
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 0dee7afa93d6..7e4cd53139ed 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -771,12 +771,9 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost)
771 shost->tmf_in_progress; 771 shost->tmf_in_progress;
772} 772}
773 773
774extern bool scsi_use_blk_mq;
775
776static inline bool shost_use_blk_mq(struct Scsi_Host *shost) 774static inline bool shost_use_blk_mq(struct Scsi_Host *shost)
777{ 775{
778 return scsi_use_blk_mq; 776 return shost->use_blk_mq;
779
780} 777}
781 778
782extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); 779extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *);