From: "Jason A. Donenfeld" <ja...@zx2c4.com>

Upstream commit:
    commit 2cec4448db38758832c2edad439f99584bb8fa0d
    Author: Jason A. Donenfeld <ja...@zx2c4.com>
    Date:   Mon Jan 13 18:42:29 2020 -0500

    net: openvswitch: use skb_list_walk_safe helper for gso segments

    This is a straight-forward conversion case for the new function, keeping
    the flow of the existing code as intact as possible.

    Signed-off-by: Jason A. Donenfeld <ja...@zx2c4.com>
    Signed-off-by: David S. Miller <da...@davemloft.net>

Cc: Jason A. Donenfeld <ja...@zx2c4.com>
Signed-off-by: Greg Rose <gvrose8...@gmail.com>
---
 datapath/datapath.c                          | 11 ++++-------
 datapath/linux/compat/include/linux/skbuff.h |  7 +++++++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 1bc8e1439..52a59f135 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -343,8 +343,7 @@ static int queue_gso_packets(struct datapath *dp, struct 
sk_buff *skb,
        }
 #endif
        /* Queue all of the segments. */
-       skb = segs;
-       do {
+       skb_list_walk_safe(segs, skb, nskb) {
                *OVS_CB(skb) = ovs_cb;
 #ifdef HAVE_SKB_GSO_UDP
                if (gso_type & SKB_GSO_UDP && skb != segs)
@@ -354,17 +353,15 @@ static int queue_gso_packets(struct datapath *dp, struct 
sk_buff *skb,
                if (err)
                        break;
 
-       } while ((skb = skb->next));
+       }
 
        /* Free all of the segments. */
-       skb = segs;
-       do {
-               nskb = skb->next;
+       skb_list_walk_safe(segs, skb, nskb) {
                if (err)
                        kfree_skb(skb);
                else
                        consume_skb(skb);
-       } while ((skb = nskb));
+       }
        return err;
 }
 
diff --git a/datapath/linux/compat/include/linux/skbuff.h 
b/datapath/linux/compat/include/linux/skbuff.h
index 6d248b3ed..204ce5497 100644
--- a/datapath/linux/compat/include/linux/skbuff.h
+++ b/datapath/linux/compat/include/linux/skbuff.h
@@ -487,4 +487,11 @@ static inline __u32 skb_get_hash_raw(const struct sk_buff 
*skb)
 }
 #endif
 
+#ifndef skb_list_walk_safe
+/* Iterate through singly-linked GSO fragments of an skb. */
+#define skb_list_walk_safe(first, skb, next_skb)                               
\
+       for ((skb) = (first), (next_skb) = (skb) ? (skb)->next : NULL; (skb);  \
+            (skb) = (next_skb), (next_skb) = (skb) ? (skb)->next : NULL)
+#endif
+
 #endif
-- 
2.17.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to