On Fri, Sep 23, 2022 at 8:40 PM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote: > > sg_alloc_table_chained() is called by several drivers, but if it is > called before sg_pool_init(), it results in a NULL pointer dereference > in sg_pool_alloc(). > > Since commit 9b1d6c895002 ("lib: scatterlist: move SG pool code from > SCSI driver to lib/sg_pool.c"), we rely on module_init(sg_pool_init) > is invoked before other module_init calls but this assumption is > fragile. > > I slightly changed the link order while Kbuild refactoring Kbuild, A nit. while Kbuild refactoring Kbuild -> while refactoring Kbuild > then uncovered this issue. I should keep the current link order, but > depending on a specific call order among module_init is so fragine. fragine -> fragile. > We usually define the init order by specifying *_initcall correctly, > or delay the driver probing by returning -EPROBE_DEFER. > > Change module_initcall() to subsys_initcall(), and also delete the > pointless module_exit() because lib/sg_pool.c is always compiled as > built-in. (CONFIG_SG_POOL is bool) > > Link: https://lore.kernel.org/all/20220921043946.GA1355561@xxxxxxxxxxxx/ > Link: https://lore.kernel.org/all/8e70837d-d859-dfb2-bf7f-83f8b31467bc@xxxxxxxxxxx/ > Fixes: 9b1d6c895002 ("lib: scatterlist: move SG pool code from SCSI driver to lib/sg_pool.c") > Reported-by: Guenter Roeck <linux@xxxxxxxxxxxx> > Reported-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- > > I am sending this to DMA subsystem because I did not find > a corresponding one for lib/sg_pool.c > > lib/sg_pool.c | 16 ++-------------- > 1 file changed, 2 insertions(+), 14 deletions(-) > > diff --git a/lib/sg_pool.c b/lib/sg_pool.c > index a0b1a52cd6f7..9bfe60ca3f37 100644 > --- a/lib/sg_pool.c > +++ b/lib/sg_pool.c > @@ -1,5 +1,5 @@ > // SPDX-License-Identifier: GPL-2.0-only > -#include <linux/module.h> > +#include <linux/init.h> > #include <linux/scatterlist.h> > #include <linux/mempool.h> > #include <linux/slab.h> > @@ -177,16 +177,4 @@ static __init int sg_pool_init(void) > return -ENOMEM; > } > > -static __exit void sg_pool_exit(void) > -{ > - int i; > - > - for (i = 0; i < SG_MEMPOOL_NR; i++) { > - struct sg_pool *sgp = sg_pools + i; > - mempool_destroy(sgp->pool); > - kmem_cache_destroy(sgp->slab); > - } > -} > - > -module_init(sg_pool_init); > -module_exit(sg_pool_exit); > +subsys_initcall(sg_pool_init); > -- > 2.34.1 > -- Best Regards Masahiro Yamada