]> err.no Git - linux-2.6/commitdiff
[SCSI] add shared tag map helpers
authorJames Bottomley <James.Bottomley@steeleye.com>
Wed, 30 Aug 2006 13:45:51 +0000 (09:45 -0400)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Thu, 31 Aug 2006 15:18:03 +0000 (11:18 -0400)
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>
drivers/scsi/hosts.c
include/scsi/scsi_host.h
include/scsi/scsi_tcq.h

index f244d4f6597a42a9ddc2a9fb6530ef8db8368c31..68ef1636678dfe21189a39ebb10accba5068e70e 100644 (file)
@@ -265,6 +265,9 @@ static void scsi_host_dev_release(struct device *dev)
                destroy_workqueue(shost->work_q);
 
        scsi_destroy_command_freelist(shost);
+       if (shost->bqt)
+               blk_free_tags(shost->bqt);
+
        kfree(shost->shost_data);
 
        if (parent)
index b3dd90f3e85868a4023fecceecefb7336f795324..39c6f8cc20c3c7984484d0ee5f57d3e5e1fd7646 100644 (file)
@@ -16,6 +16,7 @@ struct scsi_target;
 struct Scsi_Host;
 struct scsi_host_cmd_pool;
 struct scsi_transport_template;
+struct blk_queue_tags;
 
 
 /*
@@ -465,6 +466,12 @@ struct Scsi_Host {
        struct scsi_host_template *hostt;
        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;
         * however, eh routines can safely access during eh processing
index e47e36a4ef49f01cb24d9fdc14efa4882d3b91cb..4eea254b1ce9e22a51433fbc58444f026f4a817c 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/blkdev.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
 
 
 #define MSG_SIMPLE_TAG 0x20
@@ -66,7 +67,8 @@ static inline void scsi_activate_tcq(struct scsi_device *sdev, int depth)
                return;
 
        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);
 }
@@ -131,4 +133,14 @@ static inline struct scsi_cmnd *scsi_find_tag(struct scsi_device *sdev, int tag)
        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 */