Thread (23 messages) flat view 23 messages, 6 authors, 2017-09-22

Re: Latest net-next from GIT panic

From: Paweł Staszewski <hidden>
Date: 2017-09-21 13:20:59

Possibly related (same subject, not in this thread)


W dniu 2017-09-21 o 13:31, Paweł Staszewski pisze:

W dniu 2017-09-21 o 13:03, Eric Dumazet pisze:
quoted
OK we have two problems here

1) We need to unify skb_dst_force()  ( for net tree )

2) Vlan devices should try to correctly handle IFF_XMIT_DST_RELEASE from
lower device. This will considerably help your performance.


For 1), this is what I had in mind, can you try it ?

Thanks a lot !
diff --git a/include/net/dst.h b/include/net/dst.h
index 
93568bd0a3520bb7402f04d90cf04ac99c81cfbe..f23851eeaad917e8dafc06b58d23a2575405c894 
100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -271,7 +271,7 @@ static inline void dst_use_noref(struct dst_entry 
*dst, unsigned long time)
  static inline struct dst_entry *dst_clone(struct dst_entry *dst)
  {
      if (dst)
-        atomic_inc(&dst->__refcnt);
+        dst_hold(dst);
      return dst;
  }
  @@ -311,21 +311,6 @@ static inline void skb_dst_copy(struct sk_buff 
*nskb, const struct sk_buff *oskb
      __skb_dst_copy(nskb, oskb->_skb_refdst);
  }
  -/**
- * skb_dst_force - makes sure skb dst is refcounted
- * @skb: buffer
- *
- * If dst is not yet refcounted, let's do it
- */
-static inline void skb_dst_force(struct sk_buff *skb)
-{
-    if (skb_dst_is_noref(skb)) {
-        WARN_ON(!rcu_read_lock_held());
-        skb->_skb_refdst &= ~SKB_DST_NOREF;
-        dst_clone(skb_dst(skb));
-    }
-}
-
  /**
   * dst_hold_safe - Take a reference on a dst if possible
   * @dst: pointer to dst entry
@@ -356,6 +341,23 @@ static inline void skb_dst_force_safe(struct 
sk_buff *skb)
      }
  }
  +/**
+ * skb_dst_force - makes sure skb dst is refcounted
+ * @skb: buffer
+ *
+ * If dst is not yet refcounted, let's do it
+ */
+static inline void skb_dst_force(struct sk_buff *skb)
+{
+    if (skb_dst_is_noref(skb)) {
+        struct dst_entry *dst = skb_dst(skb);
+
+        WARN_ON(!rcu_read_lock_held());
+        if (!dst_hold_safe(dst))
+            dst = NULL;
+        skb->_skb_refdst = (unsigned long)dst;
+    }
+}
    /**
   *    __skb_tunnel_rx - prepare skb for rx reinsert
Patch applied - soo far no problems - and no warnings in dmesg
ok after adding patch all is working from now for about 1 hour of normal 
traffic witc all bgp sessions connected and about 600k prefixes in kernel.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help