>
> When rte_rcu_qsbr_dq_enqueue() fails in DQ mode, the deleted key slot
> is never freed and becomes permanently leaked. Fall back to synchronous
> reclamation instead of only logging an error.
>
> Signed-off-by: Robin Jarry <[email protected]>
> ---
> lib/hash/rte_cuckoo_hash.c | 9 +++------
> 1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c
> index da12825c6ed2..8189bde024be 100644
> --- a/lib/hash/rte_cuckoo_hash.c
> +++ b/lib/hash/rte_cuckoo_hash.c
> @@ -1870,18 +1870,15 @@ __rte_hash_del_key_with_hash(const struct
> rte_hash *h, const void *key,
> /* Key index where key is stored, adding the first dummy index
> */
> rcu_dq_entry.key_idx = ret + 1;
> rcu_dq_entry.ext_bkt_idx = index;
> - if (h->dq == NULL) {
> + if (h->dq == NULL || rte_rcu_qsbr_dq_enqueue(h->dq,
> &rcu_dq_entry) != 0) {
> /* Wait for quiescent state change if using
> - * RTE_HASH_QSBR_MODE_SYNC
> + * RTE_HASH_QSBR_MODE_SYNC or if RCU enqueue
> failed.
> */
> rte_rcu_qsbr_synchronize(h->hash_rcu_cfg->v,
> RTE_QSBR_THRID_INVALID);
> __hash_rcu_qsbr_free_resource((void *)((uintptr_t)h),
> &rcu_dq_entry, 1);
> - } else if (h->dq)
> - /* Push into QSBR FIFO if using
> RTE_HASH_QSBR_MODE_DQ */
> - if (rte_rcu_qsbr_dq_enqueue(h->dq, &rcu_dq_entry) !=
> 0)
> - HASH_LOG(ERR, "Failed to push QSBR FIFO");
> + }
> }
> __hash_rw_writer_unlock(h);
> return ret;
> --
Acked-by: Konstantin Ananyev <[email protected]>
> 2.53.0