Re: svn commit: r363308 - head/sys/net
On 18 Jul 2020, at 20:47, Konstantin Belousov wrote: On Sat, Jul 18, 2020 at 12:43:11PM +, Kristof Provost wrote: Author: kp Date: Sat Jul 18 12:43:11 2020 New Revision: 363308 URL: https://svnweb.freebsd.org/changeset/base/363308 Log: bridge: Don't sleep during epoch While it doesn't trigger INVARIANTS or WITNESS on head it does in stable/12. There's also no reason for it, as we can easily report the out of memory error to the caller (i.e. userspace). All of these can already fail. This makes syscalls (ioctl) fail randomly. Can you pre-allocate the buffers before entering epoch, instead ? Not easily, no. The bridge ioctl handling is all done via bridge_ioctl(), which enters epoch and dispatches to the bridge_control_table. We’d have to modify every single ioctl function. These are also not the only ioctl functions that can return ENOMEM (or EINVAL). bridge_ioctl_add() already did, for example. Best regards, Kristof ___ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"
Re: svn commit: r363308 - head/sys/net
On Sat, Jul 18, 2020 at 12:43:11PM +, Kristof Provost wrote: > Author: kp > Date: Sat Jul 18 12:43:11 2020 > New Revision: 363308 > URL: https://svnweb.freebsd.org/changeset/base/363308 > > Log: > bridge: Don't sleep during epoch > > While it doesn't trigger INVARIANTS or WITNESS on head it does in stable/12. > There's also no reason for it, as we can easily report the out of memory > error > to the caller (i.e. userspace). All of these can already fail. This makes syscalls (ioctl) fail randomly. Can you pre-allocate the buffers before entering epoch, instead ? > > PR: 248046 > MFC after: 3 days > > Modified: > head/sys/net/if_bridge.c > > Modified: head/sys/net/if_bridge.c > == > --- head/sys/net/if_bridge.c Sat Jul 18 12:21:08 2020(r363307) > +++ head/sys/net/if_bridge.c Sat Jul 18 12:43:11 2020(r363308) > @@ -1393,9 +1393,9 @@ bridge_ioctl_gifs(struct bridge_softc *sc, void *arg) > bifc->ifbic_len = buflen; > return (0); > } > - BRIDGE_UNLOCK(sc); > - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); > - BRIDGE_LOCK(sc); > + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); > + if (outbuf == NULL) > + return (ENOMEM); > > count = 0; > buf = outbuf; > @@ -1455,9 +1455,9 @@ bridge_ioctl_rts(struct bridge_softc *sc, void *arg) > count++; > buflen = sizeof(bareq) * count; > > - BRIDGE_UNLOCK(sc); > - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); > - BRIDGE_LOCK(sc); > + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); > + if (outbuf == NULL) > + return (ENOMEM); > > count = 0; > buf = outbuf; > @@ -1783,9 +1783,9 @@ bridge_ioctl_gifsstp(struct bridge_softc *sc, void *ar > return (0); > } > > - BRIDGE_UNLOCK(sc); > - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); > - BRIDGE_LOCK(sc); > + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); > + if (outbuf == NULL) > + return (ENOMEM); > > count = 0; > buf = outbuf; ___ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"
svn commit: r363308 - head/sys/net
Author: kp Date: Sat Jul 18 12:43:11 2020 New Revision: 363308 URL: https://svnweb.freebsd.org/changeset/base/363308 Log: bridge: Don't sleep during epoch While it doesn't trigger INVARIANTS or WITNESS on head it does in stable/12. There's also no reason for it, as we can easily report the out of memory error to the caller (i.e. userspace). All of these can already fail. PR: 248046 MFC after:3 days Modified: head/sys/net/if_bridge.c Modified: head/sys/net/if_bridge.c == --- head/sys/net/if_bridge.cSat Jul 18 12:21:08 2020(r363307) +++ head/sys/net/if_bridge.cSat Jul 18 12:43:11 2020(r363308) @@ -1393,9 +1393,9 @@ bridge_ioctl_gifs(struct bridge_softc *sc, void *arg) bifc->ifbic_len = buflen; return (0); } - BRIDGE_UNLOCK(sc); - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); - BRIDGE_LOCK(sc); + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); + if (outbuf == NULL) + return (ENOMEM); count = 0; buf = outbuf; @@ -1455,9 +1455,9 @@ bridge_ioctl_rts(struct bridge_softc *sc, void *arg) count++; buflen = sizeof(bareq) * count; - BRIDGE_UNLOCK(sc); - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); - BRIDGE_LOCK(sc); + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); + if (outbuf == NULL) + return (ENOMEM); count = 0; buf = outbuf; @@ -1783,9 +1783,9 @@ bridge_ioctl_gifsstp(struct bridge_softc *sc, void *ar return (0); } - BRIDGE_UNLOCK(sc); - outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO); - BRIDGE_LOCK(sc); + outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO); + if (outbuf == NULL) + return (ENOMEM); count = 0; buf = outbuf; ___ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"