Network interface RUNNING and UP flags
Coleman
cokane at cokane.org
Mon Aug 9 14:47:36 PDT 2004
Ah yes, now I see. There is no mutex on struct ifnet then? And I suppose
those splimp/splx calls should remain. I'll look at whats available and
relay my findings to you guys.
On Mon, 2004-08-09 at 17:14, Maksim Yevmenkin wrote:
> Hello,
>
> > Here, I pushed that section of code up before the prior
> > mtx_unlock(&tp->tap_mtx) above it, then removed the splimp/splx
> > calls. Is this what you were referring to (attached)? Also, I noticed
> > splx and splimp are called in a number of other places in this
> > driver, even under -CURRENT. You want those out too? The patch is a
> > patch on the original -CURRENT version of the driver and not a patch
> > to the previous patch I received.
>
> ok, the "tap_mtx" lock is used to protect fields which belongs to the
> "struct tap_softc". the IFF_xxx flags are set in the "if_flags" field,
> which belongs to the "struct ifnet". note that other parts of the system
> will access the same "struct ifnet", and, thus separate lock is required
> to protect all fields inside the "struct ifnet". currently it is done
> (or rather not done) with splimp(9)/splx(9) calls. i guess this will be
> fixed some time in the future.
>
> my original patch was not 100% correct. i have attached better (imo)
> patch. please try it out, and, if there are no objections, i will commit it.
>
> thanks,
> max
>
>
> ______________________________________________________________________
> --- if_tap.c.orig Fri Aug 6 15:02:06 2004
> +++ if_tap.c Mon Aug 9 13:57:48 2004
> @@ -340,7 +340,8 @@
> struct thread *td;
> {
> struct tap_softc *tp = NULL;
> - int error;
> + struct ifnet *ifp = NULL;
> + int error, s;
>
> if ((error = suser(td)) != 0)
> return (error);
> @@ -368,10 +369,15 @@
> bcopy(tp->arpcom.ac_enaddr, tp->ether_addr, sizeof(tp->ether_addr));
> tp->tap_pid = td->td_proc->p_pid;
> tp->tap_flags |= TAP_OPEN;
> + ifp = &tp->tap_if;
> mtx_unlock(&tp->tap_mtx);
>
> - TAPDEBUG("%s is open. minor = %#x\n",
> - tp->tap_if.if_xname, minor(dev));
> + s = splimp();
> + ifp->if_flags |= IFF_RUNNING;
> + ifp->if_flags &= ~IFF_OACTIVE;
> + splx(s);
> +
> + TAPDEBUG("%s is open. minor = %#x\n", ifp->if_xname, minor(dev));
>
> return (0);
> } /* tapopen */
More information about the freebsd-hackers
mailing list