[SCSI] add shared tag map helpers
This patch adds support for sharing tag maps at the host level (i.e. either every queue [LUN] has its own tag map or there's a single one for the entire host). This formulation is primarily intended to help single issue queue hardware, like the aic7xxx Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
492dfb4896
commit
86e33a296c
3 changed files with 23 additions and 1 deletions
|
@ -265,6 +265,9 @@ static void scsi_host_dev_release(struct device *dev)
|
||||||
destroy_workqueue(shost->work_q);
|
destroy_workqueue(shost->work_q);
|
||||||
|
|
||||||
scsi_destroy_command_freelist(shost);
|
scsi_destroy_command_freelist(shost);
|
||||||
|
if (shost->bqt)
|
||||||
|
blk_free_tags(shost->bqt);
|
||||||
|
|
||||||
kfree(shost->shost_data);
|
kfree(shost->shost_data);
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
|
|
|
@ -16,6 +16,7 @@ struct scsi_target;
|
||||||
struct Scsi_Host;
|
struct Scsi_Host;
|
||||||
struct scsi_host_cmd_pool;
|
struct scsi_host_cmd_pool;
|
||||||
struct scsi_transport_template;
|
struct scsi_transport_template;
|
||||||
|
struct blk_queue_tags;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -465,6 +466,12 @@ struct Scsi_Host {
|
||||||
struct scsi_host_template *hostt;
|
struct scsi_host_template *hostt;
|
||||||
struct scsi_transport_template *transportt;
|
struct scsi_transport_template *transportt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* area to keep a shared tag map (if needed, will be
|
||||||
|
* NULL if not)
|
||||||
|
*/
|
||||||
|
struct blk_queue_tag *bqt;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following two fields are protected with host_lock;
|
* The following two fields are protected with host_lock;
|
||||||
* however, eh routines can safely access during eh processing
|
* however, eh routines can safely access during eh processing
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <scsi/scsi_cmnd.h>
|
#include <scsi/scsi_cmnd.h>
|
||||||
#include <scsi/scsi_device.h>
|
#include <scsi/scsi_device.h>
|
||||||
|
#include <scsi/scsi_host.h>
|
||||||
|
|
||||||
|
|
||||||
#define MSG_SIMPLE_TAG 0x20
|
#define MSG_SIMPLE_TAG 0x20
|
||||||
|
@ -66,7 +67,8 @@ static inline void scsi_activate_tcq(struct scsi_device *sdev, int depth)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!blk_queue_tagged(sdev->request_queue))
|
if (!blk_queue_tagged(sdev->request_queue))
|
||||||
blk_queue_init_tags(sdev->request_queue, depth, NULL);
|
blk_queue_init_tags(sdev->request_queue, depth,
|
||||||
|
sdev->host->bqt);
|
||||||
|
|
||||||
scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
|
scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
|
||||||
}
|
}
|
||||||
|
@ -131,4 +133,14 @@ static inline struct scsi_cmnd *scsi_find_tag(struct scsi_device *sdev, int tag)
|
||||||
return sdev->current_cmnd;
|
return sdev->current_cmnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scsi_init_shared_tag_map - create a shared tag map
|
||||||
|
* @shost: the host to share the tag map among all devices
|
||||||
|
* @depth: the total depth of the map
|
||||||
|
*/
|
||||||
|
static inline void scsi_init_shared_tag_map(struct Scsi_Host *shost, int depth)
|
||||||
|
{
|
||||||
|
shost->bqt = blk_init_tags(depth);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _SCSI_SCSI_TCQ_H */
|
#endif /* _SCSI_SCSI_TCQ_H */
|
||||||
|
|
Loading…
Reference in a new issue