linux/drivers/soc/fsl/qbman
Richard Genoud 014077044e soc: fsl: qbman: fix race condition in qman_destroy_fq
When QMAN_FQ_FLAG_DYNAMIC_FQID is set, there's a race condition between
fq_table[fq->idx] state and freeing/allocating from the pool and
WARN_ON(fq_table[fq->idx]) in qman_create_fq() gets triggered.

Indeed, we can have:
         Thread A                             Thread B
    qman_destroy_fq()                    qman_create_fq()
      qman_release_fqid()
        qman_shutdown_fq()
        gen_pool_free()
           -- At this point, the fqid is available again --
                                           qman_alloc_fqid()
           -- so, we can get the just-freed fqid in thread B --
                                           fq->fqid = fqid;
                                           fq->idx = fqid * 2;
                                           WARN_ON(fq_table[fq->idx]);
                                           fq_table[fq->idx] = fq;
     fq_table[fq->idx] = NULL;

And adding some logs between qman_release_fqid() and
fq_table[fq->idx] = NULL makes the WARN_ON() trigger a lot more.

To prevent that, ensure that fq_table[fq->idx] is set to NULL before
gen_pool_free() is called by using smp_wmb().

Fixes: c535e923bb ("soc/fsl: Introduce DPAA 1.x QMan device driver")
Signed-off-by: Richard Genoud <richard.genoud@bootlin.com>
Tested-by: CHAMPSEIX Thomas <thomas.champseix@alstomgroup.com>
Link: https://lore.kernel.org/r/20251223072549.397625-1-richard.genoud@bootlin.com
Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
2026-02-23 14:49:27 +01:00
..
bman_ccsr.c soc: fsl: qbman: Remove RESERVEDMEM_OF_DECLARE usage 2024-03-06 18:30:59 -06:00
bman_portal.c
bman_priv.h
bman_test_api.c
bman_test.c
bman_test.h
bman.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
dpaa_sys.c soc: fsl: qbman: Remove RESERVEDMEM_OF_DECLARE usage 2024-03-06 18:30:59 -06:00
dpaa_sys.h soc: fsl: qbman: Remove RESERVEDMEM_OF_DECLARE usage 2024-03-06 18:30:59 -06:00
Kconfig soc: fsl: qbman: FSL_DPAA depends on COMPILE_TEST 2024-07-14 20:26:16 -07:00
Makefile
qman_ccsr.c soc: fsl: qbman: Remove redundant warnings 2024-09-03 07:50:57 +02:00
qman_portal.c soc: fsl: qbman: Use iommu_paging_domain_alloc() 2024-09-03 07:50:57 +02:00
qman_priv.h
qman_test_api.c
qman_test_stash.c soc: fsl: qbman: use kmalloc_array() instead of kmalloc() 2025-11-26 12:29:40 +01:00
qman_test.c
qman_test.h
qman.c soc: fsl: qbman: fix race condition in qman_destroy_fq 2026-02-23 14:49:27 +01:00