Skip to content

Commit

Permalink
[SCSI] add kmemcache for scsi_io_context
Browse files Browse the repository at this point in the history
Add kmemcache of scsi io contexts.

In the future when we finalize on where these functions will live
we can add a mempool for it and do a bioset for out REQ_BLOCK_PC
bios. This is needed becuase the dm-multipath handlers will
want to use the scsi_exectute* functions for failover and we cannot
have them and the bio device allocating from the same mempool.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
  • Loading branch information
Mike Christie authored and James Bottomley committed Dec 15, 2005
1 parent 0d95716 commit aa7b5cd
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions drivers/scsi/scsi_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,14 +306,16 @@ 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;

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);
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit aa7b5cd

Please sign in to comment.