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.

-- 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();
--
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

Reply via email to