tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Simplify bridge(4)
On Tue, Mar 29, 2016 at 12:27 AM, Taylor R Campbell
<campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> Date: Mon, 28 Mar 2016 16:07:19 +0900
> From: Ryota Ozaki <ozaki.ryota%gmail.com@localhost>
>
> On Fri, Mar 25, 2016 at 11:40 PM, Taylor R Campbell
> <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> > No need for the _PSZ variants here: the bridge list is used only under
> > an exclusive lock.
> >
> > Actually... I don't see any users of that list! Do we need it any
> > more? Why was it there to begin with?
> >
> > Looks like it was added in the first commit and never used. Let's get
> > rid of it! (Separate commit.)
>
> Heh, that's true. Removed!
>
> Great!
>
> So patches are updated:
> http://www.netbsd.org/~ozaki-r/bridge-psz-list.diff
> http://www.netbsd.org/~ozaki-r/bridge-default-mpsafe.diff
>
> Thanks, I'll take a look when I have a chance.
>
> BTW, I found a possible race condition in bridge_output:
> [...]
> bif can be freed after bridge_release_member on another CPU,
> however, LIST_FOREACH_READER touches bif after it.
>
> IIUC, using psref solves the issue like this:
>
> BRIDGE_PSZ_RENTER(s);
> bif = (&sc->sc_iflist)->lh_first;
> while (bif != LIST_END(&sc->sc_iflist)) {
> struct bridge_iflist *next;
>
> membar_datadep_consumer();
>
> psref_acquire(&psref, &bif->target);
> BRIDGE_PSZ_REXIT(s);
>
> // sleepable operations
>
> BRIDGE_PSZ_RENTER(s);
> next = bif->field.le_next;
> psref_release(&psref, &bif->target);
> bif = next;
> }
> BRIDGE_PSZ_REXIT(s);
>
> So I'm thinking the above patches should be committed
> after introducing psref.
>
> You don't *need* to switch to psref for this to work: it is sufficient
> for bridge_release_member to work inside a pserialize read section.
> Currently the only reason it doesn't work inside a pserialize read
> section is that it acquires an adaptive lock
Yes. So I thought I need to use a spin mutex if I want to put
bridge_release_member inside the pserialize read section.
> -- but it doesn't look
> like it actually needs to acquire that lock.
Hm, I'm confused. I added the lock because convar(9) says:
The mutex passed to the wait function (mtx) must also be held when
calling cv_broadcast().
Isn't it correct?
>
> However, as an aside, I am a little puzzled by the protocol that
> bridge_try_hold_bif, bridge_release_member, and bridge_delete_member
> follow.
>
> (Also: Use LIST_FIRST and LIST_NEXT, not .lh_first and .le_next!)
Sure!
Thanks,
ozaki-r
Home |
Main Index |
Thread Index |
Old Index