On Fri, 28 Jan 2005 00:17:01 +0000
Russell King <[EMAIL PROTECTED]> wrote:

> Yes.  Someone suggested this evening that there may have been a recent
> change to do with some IPv6 refcounting which may have caused this
> problem.  Is that something you can confirm?

Yep, it would be this change below.  Try backing it out and see
if that makes your leak go away.

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2005/01/14 20:41:55-08:00 [EMAIL PROTECTED] 
#   [IPV6]: Fix locking in ip6_dst_lookup().
#   
#   The caller does not necessarily have the socket locked
#   (udpv6sendmsg() is one such case) so we have to use
#   sk_dst_check() instead of __sk_dst_check().
#   
#   Signed-off-by: Herbert Xu <[EMAIL PROTECTED]>
#   Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
# 
# net/ipv6/ip6_output.c
#   2005/01/14 20:41:34-08:00 [EMAIL PROTECTED] +3 -3
#   [IPV6]: Fix locking in ip6_dst_lookup().
#   
#   The caller does not necessarily have the socket locked
#   (udpv6sendmsg() is one such case) so we have to use
#   sk_dst_check() instead of __sk_dst_check().
#   
#   Signed-off-by: Herbert Xu <[EMAIL PROTECTED]>
#   Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
# 
diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
--- a/net/ipv6/ip6_output.c     2005-01-27 16:07:21 -08:00
+++ b/net/ipv6/ip6_output.c     2005-01-27 16:07:21 -08:00
@@ -745,7 +745,7 @@
        if (sk) {
                struct ipv6_pinfo *np = inet6_sk(sk);
        
-               *dst = __sk_dst_check(sk, np->dst_cookie);
+               *dst = sk_dst_check(sk, np->dst_cookie);
                if (*dst) {
                        struct rt6_info *rt = (struct rt6_info*)*dst;
        
@@ -772,9 +772,9 @@
                             && (np->daddr_cache == NULL ||
                                 !ipv6_addr_equal(&fl->fl6_dst, 
np->daddr_cache)))
                            || (fl->oif && fl->oif != (*dst)->dev->ifindex)) {
+                               dst_release(*dst);
                                *dst = NULL;
-                       } else
-                               dst_hold(*dst);
+                       }
                }
        }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to