cciss: reinstate proper FIFO order of command queue list
Jens Axboe [Mon, 10 Jan 2011 20:50:33 +0000 (21:50 +0100)]
Commit 8a3173de inadvertently changed the ordering when
switching to hlists. Change to regular list heads so we
can use tail list adds, this improves performance.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>

drivers/block/cciss.c
drivers/block/cciss.h
drivers/block/cciss_cmd.h

index 5e4fadc..a54f7f4 100644 (file)
@@ -266,9 +266,9 @@ static void set_performant_mode(ctlr_info_t *h, CommandList_struct *c)
 /*
  * Enqueuing and dequeuing functions for cmdlists.
  */
-static inline void addQ(struct hlist_head *list, CommandList_struct *c)
+static inline void addQ(struct list_head *list, CommandList_struct *c)
 {
-       hlist_add_head(&c->list, list);
+       list_add_tail(&c->list, list);
 }
 
 static inline void removeQ(CommandList_struct *c)
@@ -281,12 +281,12 @@ static inline void removeQ(CommandList_struct *c)
         * them off as 'stale' to prevent the driver from
         * falling over.
         */
-       if (WARN_ON(hlist_unhashed(&c->list))) {
+       if (WARN_ON(list_empty(&c->list))) {
                c->cmd_type = CMD_MSG_STALE;
                return;
        }
 
-       hlist_del_init(&c->list);
+       list_del_init(&c->list);
 }
 
 static void enqueue_cmd_and_start_io(ctlr_info_t *h,
@@ -935,7 +935,7 @@ static CommandList_struct *cmd_alloc(ctlr_info_t *h)
 
        c->cmdindex = i;
 
-       INIT_HLIST_NODE(&c->list);
+       INIT_LIST_HEAD(&c->list);
        c->busaddr = (__u32) cmd_dma_handle;
        temp64.val = (__u64) err_dma_handle;
        c->ErrDesc.Addr.lower = temp64.val32.lower;
@@ -974,7 +974,7 @@ static CommandList_struct *cmd_special_alloc(ctlr_info_t *h)
        }
        memset(c->err_info, 0, sizeof(ErrorInfo_struct));
 
-       INIT_HLIST_NODE(&c->list);
+       INIT_LIST_HEAD(&c->list);
        c->busaddr = (__u32) cmd_dma_handle;
        temp64.val = (__u64) err_dma_handle;
        c->ErrDesc.Addr.lower = temp64.val32.lower;
@@ -2933,8 +2933,8 @@ static void start_io(ctlr_info_t *h)
 {
        CommandList_struct *c;
 
-       while (!hlist_empty(&h->reqQ)) {
-               c = hlist_entry(h->reqQ.first, CommandList_struct, list);
+       while (!list_empty(&h->reqQ)) {
+               c = list_entry(h->reqQ.next, CommandList_struct, list);
                /* can't do anything if fifo is full */
                if ((h->access.fifo_full(h))) {
                        dev_warn(&h->pdev->dev, "fifo full\n");
@@ -3447,11 +3447,10 @@ static inline u32 process_nonindexed_cmd(ctlr_info_t *h, u32 raw_tag)
 {
        u32 tag;
        CommandList_struct *c = NULL;
-       struct hlist_node *tmp;
        __u32 busaddr_masked, tag_masked;
 
        tag = cciss_tag_discard_error_bits(raw_tag);
-       hlist_for_each_entry(c, tmp, &h->cmpQ, list) {
+       list_for_each_entry(c, &h->cmpQ, list) {
                busaddr_masked = cciss_tag_discard_error_bits(c->busaddr);
                tag_masked = cciss_tag_discard_error_bits(tag);
                if (busaddr_masked == tag_masked) {
@@ -4632,8 +4631,8 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        h = hba[i];
        h->pdev = pdev;
        h->busy_initializing = 1;
-       INIT_HLIST_HEAD(&h->cmpQ);
-       INIT_HLIST_HEAD(&h->reqQ);
+       INIT_LIST_HEAD(&h->cmpQ);
+       INIT_LIST_HEAD(&h->reqQ);
        mutex_init(&h->busy_shutting_down);
 
        if (cciss_pci_init(h) != 0)
index ae340ff..7915dd4 100644 (file)
@@ -103,8 +103,8 @@ struct ctlr_info
        struct access_method access;
 
        /* queue and queue Info */ 
-       struct hlist_head reqQ;
-       struct hlist_head cmpQ;
+       struct list_head reqQ;
+       struct list_head cmpQ;
        unsigned int Qdepth;
        unsigned int maxQsinceinit;
        unsigned int maxSG;
index eb060f1..35463d2 100644 (file)
@@ -195,7 +195,7 @@ typedef struct _CommandList_struct {
   int                     ctlr;
   int                     cmd_type; 
   long                    cmdindex;
-  struct hlist_node list;
+  struct list_head list;
   struct request *        rq;
   struct completion *waiting;
   int   retry_count;