linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andi Kleen <andi@firstfloor.org>
To: linux-scsi@vger.kernel.org, James.Bottomley@HansenPartnership.com
Subject: [PATCH] [17/22] Switch to a single SCSI command pool
Date: Mon, 25 Feb 2008 00:35:30 +0100 (CET)	[thread overview]
Message-ID: <20080224233530.4A5B41B4183@basil.firstfloor.org> (raw)
In-Reply-To: <200802251235.889863872@firstfloor.org>


Now that no low level driver relies on ISA DMAable scsi_cmnds anymore
it is safe to always use the same static slab for them.

Signed-off-by: Andi Kleen <ak@suse.de>

---
 drivers/scsi/scsi.c |   46 +++++++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

Index: linux/drivers/scsi/scsi.c
===================================================================
--- linux.orig/drivers/scsi/scsi.c
+++ linux/drivers/scsi/scsi.c
@@ -140,24 +140,22 @@ const char * scsi_device_type(unsigned t
 
 EXPORT_SYMBOL(scsi_device_type);
 
+static struct kmem_cache *scsi_cmd_slab;
+
 struct scsi_host_cmd_pool {
-	struct kmem_cache	*cmd_slab;
 	struct kmem_cache	*sense_slab;
 	unsigned int		users;
-	char			*cmd_name;
 	char			*sense_name;
 	unsigned int		slab_flags;
 	gfp_t			gfp_mask;
 };
 
 static struct scsi_host_cmd_pool scsi_cmd_pool = {
-	.cmd_name	= "scsi_cmd_cache",
 	.sense_name	= "scsi_sense_cache",
 	.slab_flags	= SLAB_HWCACHE_ALIGN,
 };
 
 static struct scsi_host_cmd_pool scsi_cmd_dma_pool = {
-	.cmd_name	= "scsi_cmd_cache(DMA)",
 	.sense_name	= "scsi_sense_cache(DMA)",
 	.slab_flags	= SLAB_HWCACHE_ALIGN|SLAB_CACHE_DMA,
 	.gfp_mask	= __GFP_DMA,
@@ -178,10 +176,8 @@ struct scsi_cmnd *__scsi_get_command(str
 	struct scsi_cmnd *cmd;
 	unsigned char *buf;
 
-	cmd = kmem_cache_alloc(shost->cmd_pool->cmd_slab,
-			       gfp_mask | shost->cmd_pool->gfp_mask);
-
-	if (unlikely(!cmd)) {
+	cmd = kmem_cache_alloc(scsi_cmd_slab, gfp_mask);
+	if (!cmd) {
 		unsigned long flags;
 
 		spin_lock_irqsave(&shost->free_list_lock, flags);
@@ -204,7 +200,7 @@ struct scsi_cmnd *__scsi_get_command(str
 			memset(cmd, 0, sizeof(*cmd));
 			cmd->sense_buffer = buf;
 		} else {
-			kmem_cache_free(shost->cmd_pool->cmd_slab, cmd);
+			kmem_cache_free(scsi_cmd_slab, cmd);
 			cmd = NULL;
 		}
 	}
@@ -269,7 +265,7 @@ void __scsi_put_command(struct Scsi_Host
 	if (likely(cmd != NULL)) {
 		kmem_cache_free(shost->cmd_pool->sense_slab,
 				cmd->sense_buffer);
-		kmem_cache_free(shost->cmd_pool->cmd_slab, cmd);
+		kmem_cache_free(scsi_cmd_slab, cmd);
 	}
 
 	put_device(dev);
@@ -331,20 +327,24 @@ int scsi_setup_command_freelist(struct S
 	 * yet existent.
 	 */
 	mutex_lock(&host_cmd_pool_mutex);
+
+	if (!scsi_cmd_slab) {
+		scsi_cmd_slab = kmem_cache_create("scsi_cmd_cache",
+						  sizeof(struct scsi_cmnd), 0,
+						  SLAB_HWCACHE_ALIGN, NULL);
+		if (!scsi_cmd_slab)
+			goto fail;
+	}
+
 	pool = (shost->unchecked_isa_dma || sense_buffer_isa(shost)) ?
 			&scsi_cmd_dma_pool : &scsi_cmd_pool;
 	if (!pool->users) {
-		pool->cmd_slab = kmem_cache_create(pool->cmd_name,
-						   sizeof(struct scsi_cmnd), 0,
-						   pool->slab_flags, NULL);
-		if (!pool->cmd_slab)
-			goto fail;
-
 		pool->sense_slab = kmem_cache_create(pool->sense_name,
 						     SCSI_SENSE_BUFFERSIZE, 0,
 						     pool->slab_flags, NULL);
 		if (!pool->sense_slab) {
-			kmem_cache_destroy(pool->cmd_slab);
+			kmem_cache_destroy(scsi_cmd_slab);
+			scsi_cmd_slab = NULL;
 			goto fail;
 		}
 	}
@@ -356,8 +356,7 @@ int scsi_setup_command_freelist(struct S
 	/*
 	 * Get one backup command for this host.
 	 */
-	cmd = kmem_cache_alloc(shost->cmd_pool->cmd_slab,
-			       GFP_KERNEL | shost->cmd_pool->gfp_mask);
+	cmd = kmem_cache_alloc(scsi_cmd_slab, GFP_KERNEL);
 	if (!cmd)
 		goto fail2;
 
@@ -372,10 +371,11 @@ int scsi_setup_command_freelist(struct S
 
  fail2:
 	if (cmd)
-		kmem_cache_free(shost->cmd_pool->cmd_slab, cmd);
+		kmem_cache_free(scsi_cmd_slab, cmd);
 	mutex_lock(&host_cmd_pool_mutex);
 	if (!--pool->users) {
-		kmem_cache_destroy(pool->cmd_slab);
+		kmem_cache_destroy(scsi_cmd_slab);
+		scsi_cmd_slab = NULL;
 		kmem_cache_destroy(pool->sense_slab);
 	}
  fail:
@@ -396,12 +396,13 @@ void scsi_destroy_command_freelist(struc
 		list_del_init(&cmd->list);
 		kmem_cache_free(shost->cmd_pool->sense_slab,
 				cmd->sense_buffer);
-		kmem_cache_free(shost->cmd_pool->cmd_slab, cmd);
+		kmem_cache_free(scsi_cmd_slab, cmd);
 	}
 
 	mutex_lock(&host_cmd_pool_mutex);
 	if (!--shost->cmd_pool->users) {
-		kmem_cache_destroy(shost->cmd_pool->cmd_slab);
+		kmem_cache_destroy(scsi_cmd_slab);
+		scsi_cmd_slab = NULL;
 		kmem_cache_destroy(shost->cmd_pool->sense_slab);
 	}
 	mutex_unlock(&host_cmd_pool_mutex);

  parent reply	other threads:[~2008-02-24 23:51 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-24 23:35 [PATCH] [0/22] Remove isa_unchecked_dma and some more GFP_DMAs in the mid layer Andi Kleen
2008-02-24 23:35 ` [PATCH] [1/22] Add new sense_buffer_mask host template field Andi Kleen
2008-02-25 14:48   ` James Bottomley
2008-02-25 15:01     ` Andi Kleen
2008-02-24 23:35 ` [PATCH] [2/22] Remove unchecked_isa in BusLogic Andi Kleen
2008-02-24 23:35 ` [PATCH] [3/22] Remove unchecked_isa_dma in advansys.c Andi Kleen
2008-02-25 21:47   ` Matthew Wilcox
2008-02-25 22:40     ` Andi Kleen
2008-02-25 22:50       ` Matthew Wilcox
2008-02-25 22:54         ` Jeff Garzik
2008-02-25 22:58           ` James Bottomley
2008-02-26  3:44         ` Andi Kleen
2008-02-26 15:18           ` James Bottomley
2008-02-26 18:40             ` Matthew Wilcox
2008-02-26 13:56       ` Matthew Wilcox
2008-02-24 23:35 ` [PATCH] [4/22] Remove unchecked_isa_dma in gdth Andi Kleen
2008-02-24 23:35 ` [PATCH] [6/22] Remove unchecked_isa_dma in aha1542 Andi Kleen
2008-02-24 23:35 ` [PATCH] [7/22] Remove unchecked_isa_dma in aha152x/wd7000/sym53c416/u14-34f/NCR53c406a Andi Kleen
2008-02-24 23:35 ` [PATCH] [8/22] Remove random noop unchecked_isa_dma users Andi Kleen
2008-02-25 14:19   ` Salyzyn, Mark
2008-02-24 23:35 ` [PATCH] [10/22] Remove unchecked_isa_dma support for hostdata Andi Kleen
2008-02-24 23:35 ` [PATCH] [11/22] Remove unchecked_isa_dma checks in sg.c Andi Kleen
2008-02-24 23:35 ` [PATCH] [12/22] Remove GFP_DMAs/unchecked_isa_dma checks in scsi_scan.c Andi Kleen
2008-02-25 14:46   ` James Bottomley
2008-02-25 14:58     ` Andi Kleen
2008-02-25 15:04       ` James Bottomley
2008-02-25 15:11         ` Andi Kleen
2008-02-25 15:45           ` James Bottomley
2008-02-25 16:34             ` Andi Kleen
2008-02-24 23:35 ` [PATCH] [13/22] Don't disable direct_io for unchecked_isa_dma in st.c Andi Kleen
2008-02-24 23:35 ` [PATCH] [14/22] Remove automatic block layer bouncing for unchecked_isa_dma Andi Kleen
2008-02-24 23:35 ` [PATCH] [15/22] Remove GFP_DMA use in sr_ioctl Andi Kleen
2008-02-24 23:35 ` [PATCH] [16/22] Remove unchecked_isa_dma from sysfs Andi Kleen
2008-02-24 23:35 ` Andi Kleen [this message]
2008-02-24 23:35 ` [PATCH] [18/22] Finally remove unchecked_isa_dma support for Cmnds Andi Kleen
2008-02-24 23:35 ` [PATCH] [19/22] Finally kill unchecked_isa_dma Andi Kleen
2008-02-24 23:35 ` [PATCH] [20/22] Remove GFP_DMA in sr.c Andi Kleen
2008-02-24 23:35 ` [PATCH] [21/22] Remove GFP_DMA in ch.c Andi Kleen
2008-02-24 23:35 ` [PATCH] [22/22] Remove GFP_DMA in sr_vendor.c Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080224233530.4A5B41B4183@basil.firstfloor.org \
    --to=andi@firstfloor.org \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).