]> Pileus Git - ~andy/linux/commitdiff
tipc: improve the link deferred queue insertion algorithm
authorAllan Stephens <allan.stephens@windriver.com>
Tue, 25 Oct 2011 14:44:35 +0000 (10:44 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Mon, 6 Feb 2012 21:59:15 +0000 (16:59 -0500)
Re-code the algorithm for inserting an out-of-sequence message into
a unicast or broadcast link's deferred message queue.  It remains
functionally equivalent but should be easier to understand/maintain.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/link.c

index ac1832a66f8af9a415144408b63ecf6bdfe01b73..c317abf74a7875e5b5c92e2ba923a7b9567d5157 100644 (file)
@@ -1853,17 +1853,16 @@ cont:
 }
 
 /*
- * link_defer_buf(): Sort a received out-of-sequence packet
- *                   into the deferred reception queue.
- * Returns the increase of the queue length,i.e. 0 or 1
+ * tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue
+ *
+ * Returns increase in queue length (i.e. 0 or 1)
  */
 
-u32 tipc_link_defer_pkt(struct sk_buff **head,
-                       struct sk_buff **tail,
+u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
                        struct sk_buff *buf)
 {
-       struct sk_buff *prev = NULL;
-       struct sk_buff *crs = *head;
+       struct sk_buff *queue_buf;
+       struct sk_buff **prev;
        u32 seq_no = buf_seqno(buf);
 
        buf->next = NULL;
@@ -1881,31 +1880,30 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
                return 1;
        }
 
-       /* Scan through queue and sort it in */
-       do {
-               struct tipc_msg *msg = buf_msg(crs);
+       /* Locate insertion point in queue, then insert; discard if duplicate */
+       prev = head;
+       queue_buf = *head;
+       for (;;) {
+               u32 curr_seqno = buf_seqno(queue_buf);
 
-               if (less(seq_no, msg_seqno(msg))) {
-                       buf->next = crs;
-                       if (prev)
-                               prev->next = buf;
-                       else
-                               *head = buf;
-                       return 1;
+               if (seq_no == curr_seqno) {
+                       buf_discard(buf);
+                       return 0;
                }
-               if (seq_no == msg_seqno(msg))
+
+               if (less(seq_no, curr_seqno))
                        break;
-               prev = crs;
-               crs = crs->next;
-       } while (crs);
 
-       /* Message is a duplicate of an existing message */
+               prev = &queue_buf->next;
+               queue_buf = queue_buf->next;
+       }
 
-       buf_discard(buf);
-       return 0;
+       buf->next = queue_buf;
+       *prev = buf;
+       return 1;
 }
 
-/**
+/*
  * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
  */