On Mon, Dec 16, 2019 at 09:37:16PM -0300, Marcelo Ricardo Leitner wrote: > On Mon, Dec 16, 2019 at 11:56:38AM -0300, Marcelo Ricardo Leitner wrote: > ... > > Considering that genradix_prealloc() failure is not fatal, seems the > > fix here is to just ignore the failure in sctp_stream_alloc_out() and > > let genradix try again later on. > > Better yet, this fixes it here: > > ---8<--- > > diff --git a/net/sctp/stream.c b/net/sctp/stream.c > index df60b5ef24cb..e0b01bf912b3 100644 > --- a/net/sctp/stream.c > +++ b/net/sctp/stream.c > @@ -84,8 +84,10 @@ static int sctp_stream_alloc_out(struct sctp_stream *stream, __u16 outcnt, > return 0; > > ret = genradix_prealloc(&stream->out, outcnt, gfp); > - if (ret) > + if (ret) { > + genradix_free(&stream->out); > return ret; > + } > > stream->outcnt = outcnt; > return 0; > @@ -100,8 +102,10 @@ static int sctp_stream_alloc_in(struct sctp_stream *stream, __u16 incnt, > return 0; > > ret = genradix_prealloc(&stream->in, incnt, gfp); > - if (ret) > + if (ret) { > + genradix_free(&stream->in); > return ret; > + } > > stream->incnt = incnt; > return 0; > I get how that fixes this, but that doesn't really seem like the right fix in my mind. Shouldn't genradix_prealloc internally free any memory its allocated if it fails part way through its operation? Neil