On Tue, 2005-08-30 at 09:10 +0300, Michael S. Tsirkin wrote: 
> Quoting r. Tom Duffy <[EMAIL PROTECTED]>:
> > I just got back from vacation and I am still waiting for a machine so  
> > I can setup a rudimentary IB network at home to test my code.  I have  
> > a patch that converts sdp_buff.[ch] to use linux/list.h (glad you  
> > didn't decide to work on that), but I want to test it before  
> > submitting to the list (it compiles!).
> 
> I actually need that ASAP so that I can finally use
> list_for_each and such instead of the stupid wrappers in
> sdp_buff for my zcopy code.
> Tom, could you please post the patch?

Note: This patch is *UNTESTED*.  Please verify before committing.

Signed-off-by: Tom Duffy <[EMAIL PROTECTED]>

Index: drivers/infiniband/ulp/sdp/sdp_buff.c
===================================================================
--- drivers/infiniband/ulp/sdp/sdp_buff.c       (revision 3240)
+++ drivers/infiniband/ulp/sdp/sdp_buff.c       (working copy)
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2005 Topspin Communications.  All rights reserved.
  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2005 Tom Duffy ([EMAIL PROTECTED])
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -52,31 +53,18 @@ static inline struct sdpc_buff *do_buff_
 {
        struct sdpc_buff *buff;
 
-       if (!pool->head)
+       if (list_empty(&pool->head))
                return NULL;
 
        if (fifo)
-               buff = pool->head;
+               buff = list_entry(pool->head.next, struct sdpc_buff, list);
        else
-               buff = pool->head->prev;
+               buff = list_entry(pool->head.prev, struct sdpc_buff, list);
 
        if (!test_func || !test_func(buff, usr_arg)) {
-               if (buff->next == buff && buff->prev == buff)
-                       pool->head = NULL;
-               else {
-                       buff->next->prev = buff->prev;
-                       buff->prev->next = buff->next;
-
-                       pool->head = buff->next;
-               }
-
+               list_del(&buff->list);
                pool->size--;
-
-               buff->next = NULL;
-               buff->prev = NULL;
-               buff->pool = NULL;
-       }
-       else
+       } else
                buff = NULL;
 
        return buff;
@@ -91,20 +79,10 @@ static inline void do_buff_q_put(struct 
        /* fifo: false == tail, true == head */
        BUG_ON(buff->pool);
 
-       if (!pool->head) {
-               buff->next = buff;
-               buff->prev = buff;
-               pool->head = buff;
-       } else {
-               buff->next = pool->head;
-               buff->prev = pool->head->prev;
-
-               buff->next->prev = buff;
-               buff->prev->next = buff;
-
-               if (fifo)
-                       pool->head = buff;
-       }
+       if (fifo)
+               list_add(&buff->list, &pool->head);
+       else
+               list_add_tail(&buff->list, &pool->head);
 
        pool->size++;
        buff->pool = pool;
@@ -116,10 +94,12 @@ static inline void do_buff_q_put(struct 
 static inline struct sdpc_buff *sdp_buff_q_look(struct sdpc_buff_q *pool,
                                                int fifo)
 {
-       if (!pool->head || fifo)
-               return pool->head;
+       if (list_empty(&pool->head))
+               return NULL;
+       if (fifo)
+               return list_entry(pool->head.next, struct sdpc_buff, list);
        else
-               return pool->head->prev;
+               return list_entry(pool->head.prev, struct sdpc_buff, list);
 }
 
 /*
@@ -128,28 +108,11 @@ static inline struct sdpc_buff *sdp_buff
 static inline void do_buff_q_remove(struct sdpc_buff_q *pool,
                                    struct sdpc_buff *buff)
 {
-       struct sdpc_buff *prev;
-       struct sdpc_buff *next;
-
        BUG_ON(pool != buff->pool);
 
-       if (buff->next == buff && buff->prev == buff)
-               pool->head = NULL;
-       else {
-               next = buff->next;
-               prev = buff->prev;
-               next->prev = prev;
-               prev->next = next;
-
-               if (pool->head == buff)
-                       pool->head = next;
-       }
-
+       list_del(&buff->list);
        pool->size--;
-
        buff->pool = NULL;
-       buff->next = NULL;
-       buff->prev = NULL;
 }
 
 /*
@@ -157,7 +120,7 @@ static inline void do_buff_q_remove(stru
  */
 void sdp_buff_q_init(struct sdpc_buff_q *pool)
 {
-       pool->head = NULL;
+       INIT_LIST_HEAD(&pool->head);
        pool->size = 0;
 }
 
@@ -201,28 +164,24 @@ struct sdpc_buff *sdp_buff_q_fetch(struc
                                               void *arg),
                                   void *usr_arg)
 {
-       struct sdpc_buff *buff;
+       struct sdpc_buff *buff, *tmp;
        int result = 0;
-       int counter;
 
        /*
         * check to see if there is anything to traverse.
         */
-       if (pool->head)
+       list_for_each_entry_safe(buff, tmp, &pool->head, list) {
                /*
-                * lock to prevent corruption of table
+                * XXX lock to prevent corruption of table
                 */
-               for (counter = 0, buff = pool->head;
-                    counter < pool->size; counter++, buff = buff->next) {
-                       result = test(buff, usr_arg);
-                       if (result > 0) {
-                               do_buff_q_remove(pool, buff);
-                               return buff;
-                       }
-
-                       if (result < 0)
-                               break;
+               result = test(buff, usr_arg);
+               if (result > 0) {
+                       do_buff_q_remove(pool, buff);
+                       return buff;
                }
+               if (result < 0)
+                       break;
+       }
 
        return NULL;
 }
@@ -237,22 +196,18 @@ int sdp_buff_q_trav_head(struct sdpc_buf
 {
        struct sdpc_buff *buff;
        int result = 0;
-       int counter;
 
        /*
         * check to see if there is anything to traverse.
         */
-       if (pool->head)
+       list_for_each_entry(buff, &pool->head, list) {
                /*
-                * lock to prevent corruption of table
+                * XXX lock to prevent corruption of table
                 */
-               for (counter = 0, buff = pool->head;
-                    counter < pool->size; counter++, buff = buff->next) {
-
-                       result = trav_func(buff, usr_arg);
-                       if (result < 0)
-                               break;
-               }
+               result = trav_func(buff, usr_arg);
+               if (result < 0)
+                       break;
+       }
 
        return result;
 }
@@ -398,7 +353,7 @@ static int sdp_buff_pool_alloc(struct sd
                m_pool->buff_cur++;
        }
 
-       if (!main_pool->pool.head) {
+       if (list_empty(&main_pool->pool.head)) {
                sdp_warn("Failed to allocate any buffers. <%d:%d:%d>",
                         total, m_pool->buff_cur, m_pool->alloc_inc);
 
@@ -545,7 +500,7 @@ struct sdpc_buff *sdp_buff_pool_get(void
         */
        spin_lock_irqsave(&main_pool->lock, flags);
 
-       if (!main_pool->pool.head) {
+       if (list_empty(&main_pool->pool.head)) {
                result = sdp_buff_pool_alloc(main_pool);
                if (result < 0) {
                        sdp_warn("Error <%d> allocating buffers.", result);
@@ -554,23 +509,12 @@ struct sdpc_buff *sdp_buff_pool_get(void
                }
        }
 
-       buff = main_pool->pool.head;
-
-       if (buff->next == buff)
-               main_pool->pool.head = NULL;
-       else {
-               buff->next->prev = buff->prev;
-               buff->prev->next = buff->next;
-
-               main_pool->pool.head = buff->next;
-       }
-
+       buff = list_entry(main_pool->pool.head.next, struct sdpc_buff, list);
+       list_del(&buff->list);
        main_pool->pool.size--;
 
        spin_unlock_irqrestore(&main_pool->lock, flags);
 
-       buff->next = NULL;
-       buff->prev = NULL;
        buff->pool = NULL;
        /*
         * main pool specific reset
@@ -596,7 +540,6 @@ void sdp_buff_pool_put(struct sdpc_buff 
                return;
 
        BUG_ON(buff->pool);
-       BUG_ON(buff->next || buff->prev);
        /*
         * reset pointers
         */
@@ -606,17 +549,7 @@ void sdp_buff_pool_put(struct sdpc_buff 
 
        spin_lock_irqsave(&main_pool->lock, flags);
 
-       if (!main_pool->pool.head) {
-               buff->next = buff;
-               buff->prev = buff;
-               main_pool->pool.head = buff;
-       } else {
-               buff->next = main_pool->pool.head;
-               buff->prev = main_pool->pool.head->prev;
-
-               buff->next->prev = buff;
-               buff->prev->next = buff;
-       }
+       list_add(&buff->list, &main_pool->pool.head);
 
        main_pool->pool.size++;
 
@@ -634,16 +567,8 @@ void sdp_buff_pool_chain_link(struct sdp
        buff->tail = buff->head;
        buff->pool = &main_pool->pool;
 
-       if (!head) {
-               buff->next = buff;
-               buff->prev = buff;
-       } else {
-               buff->next = head;
-               buff->prev = head->prev;
-
-               buff->next->prev = buff;
-               buff->prev->next = buff;
-       }
+       if (head)
+               __list_splice(&buff->list, &head->list);
 }
 
 /*
@@ -652,8 +577,6 @@ void sdp_buff_pool_chain_link(struct sdp
 void sdp_buff_pool_chain_put(struct sdpc_buff *buff, u32 count)
 {
        unsigned long flags;
-       struct sdpc_buff *next;
-       struct sdpc_buff *prev;
        /*
         * return an entire Link of buffers to the queue, this save on
         * lock contention for the buffer pool, for code paths where
@@ -665,18 +588,7 @@ void sdp_buff_pool_chain_put(struct sdpc
 
        spin_lock_irqsave(&main_pool->lock, flags);
 
-       if (!main_pool->pool.head)
-               main_pool->pool.head = buff;
-       else {
-               prev = buff->prev;
-               next = main_pool->pool.head->next;
-
-               buff->prev = main_pool->pool.head;
-               main_pool->pool.head->next = buff;
-
-               prev->next = next;
-               next->prev = prev;
-       }
+       list_add(&main_pool->pool.head, &buff->list);
 
        main_pool->pool.size += count;
 
Index: drivers/infiniband/ulp/sdp/sdp_buff.h
===================================================================
--- drivers/infiniband/ulp/sdp/sdp_buff.h       (revision 3240)
+++ drivers/infiniband/ulp/sdp/sdp_buff.h       (working copy)
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2005 Topspin Communications.  All rights reserved.
  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2005 Tom Duffy ([EMAIL PROTECTED])
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -36,18 +37,19 @@
 #ifndef _SDP_BUFF_H
 #define _SDP_BUFF_H
 
+#include <linux/list.h>
+
 #include "sdp_queue.h"
 /*
  * structures
  */
 struct sdpc_buff_q {
-       struct sdpc_buff *head; /* double linked list of buffers */
+       struct list_head head; /* double linked list of buffers */
        u32 size;               /* number of buffers in the pool */
 };
 
 struct sdpc_buff {
-       struct sdpc_buff   *next;
-       struct sdpc_buff   *prev;
+       struct list_head    list;
        u32                 type; /* element type. (for generic queue) */
        struct sdpc_buff_q *pool; /* pool currently holding this buffer. */
        void (*release)(struct sdpc_buff *buff); /* release the object */




_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to