From 04bde9d181f522f6b94e785a37bfbd2a613fcbb2 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 11 Nov 2005 05:31:41 -0600 Subject: [PATCH] --- yaml --- r: 15654 b: refs/heads/master c: aa7b5cd750c766f66a92c9f78ba176bc77512b7e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi_lib.c | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index cd3b77121306..a37dbac2725c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0d95716d6a1308c465d8c17ed1a217628936bb0c +refs/heads/master: aa7b5cd750c766f66a92c9f78ba176bc77512b7e diff --git a/trunk/drivers/scsi/scsi_lib.c b/trunk/drivers/scsi/scsi_lib.c index 3e136bfe4219..54a72f197487 100644 --- a/trunk/drivers/scsi/scsi_lib.c +++ b/trunk/drivers/scsi/scsi_lib.c @@ -306,6 +306,8 @@ struct scsi_io_context { char sense[SCSI_SENSE_BUFFERSIZE]; }; +static kmem_cache_t *scsi_io_context_cache; + static void scsi_end_async(struct request *req) { struct scsi_io_context *sioc = req->end_io_data; @@ -313,7 +315,7 @@ static void scsi_end_async(struct request *req) if (sioc->done) sioc->done(sioc->data, sioc->sense, req->errors, req->data_len); - kfree(sioc); + kmem_cache_free(scsi_io_context_cache, sioc); __blk_put_request(req->q, req); } @@ -452,9 +454,10 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, int err = 0; int write = (data_direction == DMA_TO_DEVICE); - sioc = kzalloc(sizeof(*sioc), gfp); + sioc = kmem_cache_alloc(scsi_io_context_cache, gfp); if (!sioc) return DRIVER_ERROR << 24; + memset(sioc, 0, sizeof(*sioc)); req = blk_get_request(sdev->request_queue, write, gfp); if (!req) @@ -1765,6 +1768,14 @@ int __init scsi_init_queue(void) { int i; + scsi_io_context_cache = kmem_cache_create("scsi_io_context", + sizeof(struct scsi_io_context), + 0, 0, NULL, NULL); + if (!scsi_io_context_cache) { + printk(KERN_ERR "SCSI: can't init scsi io context cache\n"); + return -ENOMEM; + } + for (i = 0; i < SG_MEMPOOL_NR; i++) { struct scsi_host_sg_pool *sgp = scsi_sg_pools + i; int size = sgp->size * sizeof(struct scatterlist); @@ -1792,6 +1803,8 @@ void scsi_exit_queue(void) { int i; + kmem_cache_destroy(scsi_io_context_cache); + for (i = 0; i < SG_MEMPOOL_NR; i++) { struct scsi_host_sg_pool *sgp = scsi_sg_pools + i; mempool_destroy(sgp->pool);