Commit 86e33a29 authored by James Bottomley's avatar James Bottomley Committed by James Bottomley

[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: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 492dfb48
...@@ -265,6 +265,9 @@ static void scsi_host_dev_release(struct device *dev) ...@@ -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; ...@@ -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 { ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment