Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Dec 2011 12:45:55 +0300
From:      Sergey Kandaurov <pluknet@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        Bjoern Zeeb <bz@freebsd.org>, net@freebsd.org
Subject:   Re: [PATCH] Minor fixes to netinet6/icmp6.c
Message-ID:  <CAE-mSOJ722UNqkVNs%2B8_LQ4pVt4VTmSkDhr3re5aDhsHPfQffQ@mail.gmail.com>
In-Reply-To: <4EF6752C.4040109@FreeBSD.org>
References:  <201112231446.38057.jhb@freebsd.org> <CAE-mSOLryQb6n0RcxM=LHFCLN=25Tfk5bLnLjK1e5XbU5ncmWw@mail.gmail.com> <4EF6752C.4040109@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 25 December 2011 04:58, John Baldwin <jhb@freebsd.org> wrote:
> On 12/23/11 6:38 PM, Sergey Kandaurov wrote:
>>
>> On 23 December 2011 23:46, John Baldwin<jhb@freebsd.org> =A0wrote:
>>>
>>> I found these nits while working on the patches to convert if_addr_mtx =
to
>>> an
>>> rwlock. =A0The first change is cosmetic, it just un-inlines a
>>> TAILQ_FOREACH().
>>> The second change is an actual bug. =A0The code is currently reading
>>> TAILQ_FIRST(&V_ifnet) without holding the appropriate lock.
>>>
>>> Index: icmp6.c
>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>>> --- icmp6.c =A0 =A0 (revision 228777)
>>> +++ icmp6.c =A0 =A0 (working copy)
>>> @@ -1780,7 +1780,7 @@ ni6_addrs(struct icmp6_nodeinfo *ni6, struct mbuf
>>> =A0 =A0 =A0 =A0}
>>>
>>> =A0 =A0 =A0 =A0IFNET_RLOCK_NOSLEEP();
>>> - =A0 =A0 =A0 for (ifp =3D TAILQ_FIRST(&V_ifnet); ifp; ifp =3D TAILQ_NE=
XT(ifp,
>>> if_list)) {
>>> + =A0 =A0 =A0 TAILQ_FOREACH(ifp,&V_ifnet, if_list) {
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0addrsofif =3D 0;
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IF_ADDR_LOCK(ifp);
>>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0TAILQ_FOREACH(ifa,&ifp->if_addrhead, ifa=
_link) {
>>
>>
>> FWIW, there are much more of them in netinet6.
>> Some time ago I started to un-expand them to queue(3).
>> [not unfinished yet..]
>
>
> I went ahead and did a sweep for queue(3) changes in netinet6. =A0I went =
a bit
Great, thank you! This sweep is long overdue.

> further and removed things like the ndpr_next hack, etc. =A0This only inc=
ludes
> queue(3) changes though, not your other fixes like moving common code out=
 of
Oops, yeah. This is an unrelated change.

> blocks. =A0I also fixed a few places to use *_EMPTY() instead of checking
> *_FIRST() against NULL. =A0There should be no functional change.
>
> http://www.FreeBSD.org/~jhb/patches/inet6_queue.patch

Looks good. Please, commit with two notes:

a) You changed a loop with precondition
        while (i < DRLSTSIZ) { ... }
into
        if (i >=3D DRLSTSIZ)
and moved it below i++ increment, which effectively became
a loop with post-condition like do { ...} while ().
To preserve the current behavior I would move this check up
right under *_FOREACH() loop, like this:

                TAILQ_FOREACH(dr, &V_nd_defrouter, dr_entry) {
                                                if (i >=3D DRLSTSIZ)
                                                         break;
b)
It should be safe to use non-SAFE() FOREACH() variants of
queue(3) macros for most occurrences. SAFE() versions are
usually only used when you need to add/remove an element
on list w/o need to subsequent restart the *_FOREACH() loop.

--=20
wbr,
pluknet



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAE-mSOJ722UNqkVNs%2B8_LQ4pVt4VTmSkDhr3re5aDhsHPfQffQ>