Message ID | 20100604115737.GA5570@secunet.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Le vendredi 04 juin 2010 à 13:57 +0200, Steffen Klassert a écrit : > xfrm triggers a warning if dst_pop() drops a refcount > on a noref dst. This patch changes dst_pop() to > skb_dst_pop(). skb_dst_pop() drops the refcnt only > on a refcounted dst. Also we don't clone the child > dst_entry, so it is not refcounted and we can use > skb_dst_set_noref() in xfrm_output_one(). > > Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> > --- Thanks a lot Steffen ! Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Fri, 04 Jun 2010 14:06:47 +0200 > Le vendredi 04 juin 2010 à 13:57 +0200, Steffen Klassert a écrit : >> xfrm triggers a warning if dst_pop() drops a refcount >> on a noref dst. This patch changes dst_pop() to >> skb_dst_pop(). skb_dst_pop() drops the refcnt only >> on a refcounted dst. Also we don't clone the child >> dst_entry, so it is not refcounted and we can use >> skb_dst_set_noref() in xfrm_output_one(). >> >> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> >> --- > > Thanks a lot Steffen ! > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied, thanks guys! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/net/dst.h b/include/net/dst.h index 612069b..81d1413 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -250,11 +250,11 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) * Linux networking. Thus, destinations are stackable. */ -static inline struct dst_entry *dst_pop(struct dst_entry *dst) +static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb) { - struct dst_entry *child = dst_clone(dst->child); + struct dst_entry *child = skb_dst(skb)->child; - dst_release(dst); + skb_dst_drop(skb); return child; } diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 6a32915..a3cca0a 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c @@ -95,13 +95,13 @@ resume: goto error_nolock; } - dst = dst_pop(dst); + dst = skb_dst_pop(skb); if (!dst) { XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); err = -EHOSTUNREACH; goto error_nolock; } - skb_dst_set(skb, dst); + skb_dst_set_noref(skb, dst); x = dst->xfrm; } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL));
xfrm triggers a warning if dst_pop() drops a refcount on a noref dst. This patch changes dst_pop() to skb_dst_pop(). skb_dst_pop() drops the refcnt only on a refcounted dst. Also we don't clone the child dst_entry, so it is not refcounted and we can use skb_dst_set_noref() in xfrm_output_one(). Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> --- include/net/dst.h | 6 +++--- net/xfrm/xfrm_output.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)