On Sat, Apr 15, 2023 at 10:44:15PM +0800, Kevin Lo wrote:
> On Fri, Apr 14, 2023 at 02:01:29PM +0200, Alexander Bluhm wrote:
> > I think you are trying to change the kernel in the wrong direction.
> > It should not fail, but handle the requests.  Panic if there is a
> > bug.
> > 
> > Why do you think M_CANFAIL is a good thing at this place?
> 
> Because M_WAITOK will not return NULl, I think adding M_CANFAIL will
> keep the mallocarray call unchanged.

The goal is not to handle errors by failing, but to prevent them.
Better keep M_WAITOK, avoid M_CANFAIL, and remove the check.

Discussion in the hackroom concluded that M_CANFAIL is for input
from userland that can be unlimited large.  If userland requests
too much, it can fail.  But it is not for normal operation of the
kernel.

M_NOWAIT should be used when the kernel has a good way to deal with
a temporary failure, e.g. drop the packet.

M_CANFAIL | M_WAITOK deals with user input that cannot be fullfilled
permanently and should be reported as an error.

M_WAITOK is for all other cases.  If it panics, fix the underlying
bug that requested unrealistic memory size.

Here use number of queues which should be reasonable low and limited
by the driver code.  Keep M_WAITOK and remove the error check.

By the way, M_DEVBUF is also wrong.  It should be M_TEMP as it is
freed in the same function and not stored permanently.  But I wont
fix that now as malloc(9) type usage is far from consistent.

ok?

bluhm

Index: dev/pci/if_igc.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_igc.c,v
retrieving revision 1.12
diff -u -p -r1.12 if_igc.c
--- dev/pci/if_igc.c    9 Mar 2023 00:13:47 -0000       1.12
+++ dev/pci/if_igc.c    21 Apr 2023 18:25:35 -0000
@@ -1209,9 +1209,8 @@ igc_rxrinfo(struct igc_softc *sc, struct
        struct rx_ring *rxr;
        int error, i, n = 0;
 
-       if ((ifr = mallocarray(sc->sc_nqueues, sizeof(*ifr), M_DEVBUF,
-           M_WAITOK | M_ZERO)) == NULL)
-               return ENOMEM;
+       ifr = mallocarray(sc->sc_nqueues, sizeof(*ifr), M_DEVBUF,
+           M_WAITOK | M_ZERO);
 
        for (i = 0; i < sc->sc_nqueues; i++) {
                rxr = &sc->rx_rings[i];
Index: dev/pci/if_ix.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_ix.c,v
retrieving revision 1.192
diff -u -p -r1.192 if_ix.c
--- dev/pci/if_ix.c     6 Feb 2023 20:27:44 -0000       1.192
+++ dev/pci/if_ix.c     21 Apr 2023 18:25:35 -0000
@@ -640,9 +640,8 @@ ixgbe_rxrinfo(struct ix_softc *sc, struc
        u_int n = 0;
 
        if (sc->num_queues > 1) {
-               if ((ifr = mallocarray(sc->num_queues, sizeof(*ifr), M_DEVBUF,
-                   M_WAITOK | M_ZERO)) == NULL)
-                       return (ENOMEM);
+               ifr = mallocarray(sc->num_queues, sizeof(*ifr), M_DEVBUF,
+                   M_WAITOK | M_ZERO);
        } else
                ifr = &ifr1;
 
Index: dev/pci/if_oce.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_oce.c,v
retrieving revision 1.106
diff -u -p -r1.106 if_oce.c
--- dev/pci/if_oce.c    11 Mar 2022 18:00:48 -0000      1.106
+++ dev/pci/if_oce.c    21 Apr 2023 18:25:35 -0000
@@ -902,9 +902,8 @@ oce_rxrinfo(struct oce_softc *sc, struct
        u_int n = 0;
 
        if (sc->sc_nrq > 1) {
-               if ((ifr = mallocarray(sc->sc_nrq, sizeof(*ifr), M_DEVBUF,
-                   M_WAITOK | M_ZERO)) == NULL)
-                       return (ENOMEM);
+               ifr = mallocarray(sc->sc_nrq, sizeof(*ifr), M_DEVBUF,
+                   M_WAITOK | M_ZERO);
        } else
                ifr = &ifr1;
 

Reply via email to