Re: svn commit: r363308 - head/sys/net

2020-07-18 Thread Kristof Provost



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

2020-07-18 Thread Konstantin Belousov
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

2020-07-18 Thread Kristof Provost
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"