On Wed, Apr 26, 2023 at 08:19:10PM +0200, Alexander Bluhm wrote:
>
> 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.
Thank you for discussing this topic at the hackathon, and I also greatly
appreciate your detailed explanation.
> 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?
ok kevlo@
> 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;
>
>