Hi, Hajime Tazaki wrote: > > Yoshifuji-san, > > At Mon, 13 Jul 2015 17:38:48 +0900, > Erik Kline wrote: >> >> On 13 July 2015 at 15:32, YOSHIFUJI Hideaki >> <hideaki.yoshif...@miraclelinux.com> wrote: >>> Hi, >>> >>> Erik Kline wrote: >>>> Hmm, when I run a UML linux with this patch (which, I'm ashamed to >>>> say, I failed to do before) I get these kinds of errors: >>>> >>>> unregister_netdevice: waiting for <TAPdevice> to become free. >>>> Usage count = 1 >>>> unregister_netdevice: waiting for <TAPdevice> to become free. >>>> Usage count = 1 >>>> >>>> Perhaps they're unrelated... I'm still investigating. >>> >>> Would you test attached patch please? >> >> That does look logically correct, so +1 to it regardless, but it does >> not seem to have fixed the issue I'm seeing. >> >> I still haven't produced the smallest possible demo test program. > > sorry to jump-in, but there is a side-effect with this > patch, which my tcp and dccp tests (ipv6) are failed. > > because newly added function (__ipv6_dev_get_saddr) won't > update a variable 'hiscore' (it swaps with 'score' in some > case), the caller (ipv6_dev_get_saddr) can't fill an > appropriate saddr in the end. > > I don't know if this is a good patch but the following diff > makes my test happy.
We should update score as well... > > -- Hajime > > diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c > index 4ab74d5..c4e9416 100644 > --- a/net/ipv6/addrconf.c > +++ b/net/ipv6/addrconf.c > @@ -1363,7 +1363,8 @@ static void __ipv6_dev_get_saddr(struct net *net, > unsigned int prefs, > const struct in6_addr *saddr, > struct inet6_dev *idev, > - struct ipv6_saddr_score *scores) > + struct ipv6_saddr_score *scores, > + struct ipv6_saddr_score **in_hiscore) > { > struct ipv6_saddr_score *score = &scores[0], *hiscore = &scores[1]; > > @@ -1424,6 +1425,7 @@ static void __ipv6_dev_get_saddr(struct net *net, > in6_ifa_hold(score->ifa); > > swap(hiscore, score); > + *in_hiscore = hiscore; > > /* restore our iterator */ > score->ifa = hiscore->ifa; > @@ -1480,13 +1482,15 @@ int ipv6_dev_get_saddr(struct net *net, const struct > net_device *dst_dev, > } > > if (use_oif_addr) { > - __ipv6_dev_get_saddr(net, &dst, prefs, saddr, idev, scores); > + __ipv6_dev_get_saddr(net, &dst, prefs, saddr, idev, > + scores, &hiscore); > } else { > for_each_netdev_rcu(net, dev) { > idev = __in6_dev_get(dev); > if (!idev) > continue; > - __ipv6_dev_get_saddr(net, &dst, prefs, saddr, idev, > scores); > + __ipv6_dev_get_saddr(net, &dst, prefs, saddr, idev, > + scores, &hiscore); > } > } > rcu_read_unlock(); > -- Hideaki Yoshifuji <hideaki.yoshif...@miraclelinux.com> Technical Division, MIRACLE LINUX CORPORATION -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html