The branch main has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b2dcb848688e1e8346762531208dd7d468ff3854

commit b2dcb848688e1e8346762531208dd7d468ff3854
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2023-04-19 21:37:01 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2023-04-19 21:49:00 +0000

    LinuxKPI: skbuff.h: fix -Warray-bounds warnings
    
    Harmonize sk_buff_head and sk_buff further and fix -Warray-bounds
    warnings reports by gcc.  At the same time simplify some code by
    re-using other functions or factoring some code out.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      3 days
---
 sys/compat/linuxkpi/common/include/linux/skbuff.h | 61 +++++++++++++----------
 1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/skbuff.h 
b/sys/compat/linuxkpi/common/include/linux/skbuff.h
index 12a6be42e743..fca161537837 100644
--- a/sys/compat/linuxkpi/common/include/linux/skbuff.h
+++ b/sys/compat/linuxkpi/common/include/linux/skbuff.h
@@ -89,8 +89,16 @@ enum sk_buff_pkt_type {
 
 struct sk_buff_head {
                /* XXX TODO */
-       struct sk_buff          *next;
-       struct sk_buff          *prev;
+       union {
+               struct {
+                       struct sk_buff          *next;
+                       struct sk_buff          *prev;
+               };
+               struct sk_buff_head_l {
+                       struct sk_buff          *next;
+                       struct sk_buff          *prev;
+               } list;
+       };
        size_t                  qlen;
        spinlock_t              lock;
 };
@@ -527,8 +535,8 @@ __skb_insert(struct sk_buff *new, struct sk_buff *prev, 
struct sk_buff *next,
        SKB_TRACE_FMT(new, "prev %p next %p q %p", prev, next, q);
        new->prev = prev;
        new->next = next;
-       next->prev = new;
-       prev->next = new;
+       ((struct sk_buff_head_l *)next)->prev = new;
+       ((struct sk_buff_head_l *)prev)->next = new;
        q->qlen++;
 }
 
@@ -538,7 +546,7 @@ __skb_queue_after(struct sk_buff_head *q, struct sk_buff 
*skb,
 {
 
        SKB_TRACE_FMT(q, "skb %p new %p", skb, new);
-       __skb_insert(new, skb, skb->next, q);
+       __skb_insert(new, skb, ((struct sk_buff_head_l *)skb)->next, q);
 }
 
 static inline void
@@ -551,24 +559,18 @@ __skb_queue_before(struct sk_buff_head *q, struct sk_buff 
*skb,
 }
 
 static inline void
-__skb_queue_tail(struct sk_buff_head *q, struct sk_buff *skb)
+__skb_queue_tail(struct sk_buff_head *q, struct sk_buff *new)
 {
-       struct sk_buff *s;
 
-       SKB_TRACE2(q, skb);
-       q->qlen++;
-       s = (struct sk_buff *)q;
-       s->prev->next = skb;
-       skb->prev = s->prev;
-       skb->next = s;
-       s->prev = skb;
+       SKB_TRACE2(q, new);
+       __skb_queue_after(q, (struct sk_buff *)q, new);
 }
 
 static inline void
-skb_queue_tail(struct sk_buff_head *q, struct sk_buff *skb)
+skb_queue_tail(struct sk_buff_head *q, struct sk_buff *new)
 {
        SKB_TRACE2(q, skb);
-       return (__skb_queue_tail(q, skb));
+       return (__skb_queue_tail(q, new));
 }
 
 static inline struct sk_buff *
@@ -817,26 +819,31 @@ skb_mark_not_on_list(struct sk_buff *skb)
        SKB_TODO();
 }
 
+static inline void
+___skb_queue_splice_init(const struct sk_buff_head *from,
+    struct sk_buff *p, struct sk_buff *n)
+{
+       struct sk_buff *b, *e;
+
+       b = from->next;
+       e = from->prev;
+
+       b->prev = p;
+       ((struct sk_buff_head_l *)p)->next = b;
+       e->next = n;
+       ((struct sk_buff_head_l *)n)->prev = e;
+}
+
 static inline void
 skb_queue_splice_init(struct sk_buff_head *from, struct sk_buff_head *to)
 {
-       struct sk_buff *b, *e, *n;
 
        SKB_TRACE2(from, to);
 
        if (skb_queue_empty(from))
                return;
 
-       /* XXX do we need a barrier around this? */
-       b = from->next;
-       e = from->prev;
-       n = to->next;
-
-       b->prev = (struct sk_buff *)to;
-       to->next = b;
-       e->next = n;
-       n->prev = e;
-
+       ___skb_queue_splice_init(from, (struct sk_buff *)to, to->next);
        to->qlen += from->qlen;
        __skb_queue_head_init(from);
 }

Reply via email to