Module Name: src Committed By: martin Date: Wed Sep 11 16:12:50 UTC 2024
Modified Files: src/sys/net [netbsd-10]: if_tap.c Log Message: Pull up following revision(s) (requested by rin in ticket #825): sys/net/if_tap.c: revision 1.129 sys/net/if_tap.c: revision 1.130 sys/net/if_tap.c: revision 1.131 sys/net/if_tap.c: revision 1.132 tap(4): Prune dead branches around tap_dev_close. No functional change intended. PR kern/58166 tap(4): Prune dead branches around tap_dev_destroyer. No functional change intended. PR kern/58166 tap(4): Use DETACH_FORCE with config_detach. It doesn't make a difference here, because tap_detach never fails, but let's make it more obvious at the call site that failure is forbidden here. No functional change intended. PR kern/58166 tap(4): Just use mutex_enter. PR kern/58167 To generate a diff of this commit: cvs rdiff -u -r1.127.4.1 -r1.127.4.2 src/sys/net/if_tap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_tap.c diff -u src/sys/net/if_tap.c:1.127.4.1 src/sys/net/if_tap.c:1.127.4.2 --- src/sys/net/if_tap.c:1.127.4.1 Fri Jan 6 13:54:58 2023 +++ src/sys/net/if_tap.c Wed Sep 11 16:12:49 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tap.c,v 1.127.4.1 2023/01/06 13:54:58 martin Exp $ */ +/* $NetBSD: if_tap.c,v 1.127.4.2 2024/09/11 16:12:49 martin Exp $ */ /* * Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation. @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.127.4.1 2023/01/06 13:54:58 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.127.4.2 2024/09/11 16:12:49 martin Exp $"); #if defined(_KERNEL_OPT) @@ -117,7 +117,7 @@ CFATTACH_DECL_NEW(tap, sizeof(struct tap extern struct cfdriver tap_cd; /* Real device access routines */ -static int tap_dev_close(struct tap_softc *); +static void tap_dev_close(struct tap_softc *); static int tap_dev_read(int, struct uio *, int); static int tap_dev_write(int, struct uio *, int); static int tap_dev_ioctl(int, u_long, void *, struct lwp *); @@ -210,7 +210,7 @@ struct if_clone tap_cloners = IF_CLONE_I /* Helper functions shared by the two cloning code paths */ static struct tap_softc * tap_clone_creator(int); -int tap_clone_destroyer(device_t); +static void tap_clone_destroyer(device_t); static struct sysctllog *tap_sysctl_clog; @@ -625,33 +625,25 @@ tap_clone_creator(int unit) return device_private(config_attach_pseudo(cf)); } -/* - * The clean design of if_clone and autoconf(9) makes that part - * really straightforward. The second argument of config_detach - * means neither QUIET nor FORCED. - */ static int tap_clone_destroy(struct ifnet *ifp) { struct tap_softc *sc = ifp->if_softc; - int error = tap_clone_destroyer(sc->sc_dev); - if (error == 0) - atomic_dec_uint(&tap_count); - return error; + tap_clone_destroyer(sc->sc_dev); + atomic_dec_uint(&tap_count); + return 0; } -int +static void tap_clone_destroyer(device_t dev) { cfdata_t cf = device_cfdata(dev); int error; - if ((error = config_detach(dev, 0)) != 0) - aprint_error_dev(dev, "unable to detach instance\n"); + error = config_detach(dev, DETACH_FORCE); + KASSERTMSG(error == 0, "error=%d", error); kmem_free(cf, sizeof(*cf)); - - return error; } /* @@ -759,7 +751,8 @@ tap_cdev_close(dev_t dev, int flags, int if (sc == NULL) return ENXIO; - return tap_dev_close(sc); + tap_dev_close(sc); + return 0; } /* @@ -773,33 +766,27 @@ tap_fops_close(file_t *fp) { struct tap_softc *sc; int unit = fp->f_devunit; - int error; sc = device_lookup_private(&tap_cd, unit); if (sc == NULL) return ENXIO; - /* tap_dev_close currently always succeeds, but it might not - * always be the case. */ KERNEL_LOCK(1, NULL); - if ((error = tap_dev_close(sc)) != 0) { - KERNEL_UNLOCK_ONE(NULL); - return error; - } + tap_dev_close(sc); - /* Destroy the device now that it is no longer useful, - * unless it's already being destroyed. */ - if ((sc->sc_flags & TAP_GOING) != 0) { - KERNEL_UNLOCK_ONE(NULL); - return 0; - } + /* + * Destroy the device now that it is no longer useful, unless + * it's already being destroyed. + */ + if ((sc->sc_flags & TAP_GOING) != 0) + goto out; + tap_clone_destroyer(sc->sc_dev); - error = tap_clone_destroyer(sc->sc_dev); - KERNEL_UNLOCK_ONE(NULL); - return error; +out: KERNEL_UNLOCK_ONE(NULL); + return 0; } -static int +static void tap_dev_close(struct tap_softc *sc) { struct ifnet *ifp; @@ -832,8 +819,6 @@ tap_dev_close(struct tap_softc *sc) } sc->sc_flags &= ~(TAP_INUSE | TAP_ASYNCIO); if_link_state_change(ifp, LINK_STATE_DOWN); - - return 0; } static int @@ -872,13 +857,7 @@ tap_dev_read(int unit, struct uio *uio, if ((ifp->if_flags & IFF_UP) == 0) return EHOSTDOWN; - /* In the TAP_NBIO case, we have to make sure we won't be sleeping */ - if ((sc->sc_flags & TAP_NBIO) != 0) { - if (!mutex_tryenter(&sc->sc_lock)) - return EWOULDBLOCK; - } else - mutex_enter(&sc->sc_lock); - + mutex_enter(&sc->sc_lock); if (IFQ_IS_EMPTY(&ifp->if_snd)) { ifp->if_flags &= ~IFF_OACTIVE; if (sc->sc_flags & TAP_NBIO)