On Sun, 20 Jan 2008 10:36:56 -0600
James Bottomley <[EMAIL PROTECTED]> wrote:

> 
> On Wed, 2008-01-16 at 13:32 +0900, FUJITA Tomonori wrote:
> > This is the third version of:
> > 
> > http://marc.info/?l=linux-scsi&m=120038907123706&w=2
> [...]
> > diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
> > index 54ff611..0a4a5b8 100644
> > --- a/drivers/scsi/scsi.c
> > +++ b/drivers/scsi/scsi.c
> > @@ -186,6 +190,21 @@ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host 
> > *shost, gfp_t gfp_mask)
> >                     list_del_init(&cmd->list);
> >             }
> >             spin_unlock_irqrestore(&shost->free_list_lock, flags);
> > +
> > +           if (cmd) {
> > +                   buf = cmd->sense_buffer;
> > +                   memset(cmd, 0, sizeof(*cmd));
> > +                   cmd->sense_buffer = buf;
> > +           }
> > +   } else {
> > +           buf = kmem_cache_alloc(sense_buffer_slab, __GFP_DMA|gfp_mask);
> 
> This is going to cause the enterprise some angst because ZONE_DMA can be
> very small, and the enterprise requrements for commands in flight very
> large.  I also think its unnecessary if we know the host isn't requiring
> ISA DMA.

Yes, I should have done properly.


>  How about the below to fix this, it's based on the existing
> infrastructure for solving the very same problem.

Looks nice. Integrating sense_buffer_pool into struct
scsi_host_cmd_pool looks much better.


> James
> 
> ---
> 
> >From e7ffbd81684779f5eb41d66d5f499b82af40e12b Mon Sep 17 00:00:00 2001
> From: James Bottomley <[EMAIL PROTECTED]>
> Date: Sun, 20 Jan 2008 09:28:24 -0600
> Subject: [SCSI] don't use __GFP_DMA for sense buffers if not required
> 
> Only hosts which actually have ISA DMA requirements need sense buffers
> coming out of ZONE_DMA, so only use the __GFP_DMA flag for that case
> to avoid allocating this scarce resource if it's not necessary.
> 
> Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
> ---
>  drivers/scsi/hosts.c     |    9 +----
>  drivers/scsi/scsi.c      |  106 +++++++++++++++++++--------------------------
>  drivers/scsi/scsi_priv.h |    2 -
>  3 files changed, 46 insertions(+), 71 deletions(-)
> 

(snip)

> @@ -310,7 +313,6 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
>  {
>       struct scsi_host_cmd_pool *pool;
>       struct scsi_cmnd *cmd;
> -     unsigned char *sense_buffer;
>  
>       spin_lock_init(&shost->free_list_lock);
>       INIT_LIST_HEAD(&shost->free_list);
> @@ -322,10 +324,13 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
>       mutex_lock(&host_cmd_pool_mutex);
>       pool = (shost->unchecked_isa_dma ? &scsi_cmd_dma_pool : &scsi_cmd_pool);
>       if (!pool->users) {
> -             pool->slab = kmem_cache_create(pool->name,
> -                             sizeof(struct scsi_cmnd), 0,
> -                             pool->slab_flags, NULL);
> -             if (!pool->slab)
> +             pool->cmd_slab = kmem_cache_create(pool->cmd_name,
> +                                                sizeof(struct scsi_cmnd), 0,
> +                                                pool->slab_flags, NULL);
> +             pool->sense_slab = kmem_cache_create(pool->sense_name,
> +                                                  SCSI_SENSE_BUFFERSIZE, 0,
> +                                                  pool->slab_flags, NULL);
> +             if (!pool->cmd_slab || !pool->sense_slab)
>                       goto fail;


If one of the above allocations fails, the allocated slab leaks?


diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 045e69d..1a9fba6 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -327,11 +327,16 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
                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->cmd_slab || !pool->sense_slab)
+               if (!pool->sense_slab) {
+                       kmem_cache_destroy(pool->cmd_slab);
                        goto fail;
+               }
        }
 
        pool->users++;
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to