struct mlx5_core_srq *tmp;
        int err;
 
-       tmp = xa_erase_irq(&table->array, srq->srqn);
-       if (!tmp || tmp != srq)
+       /* Delete entry, but leave index occupied */
+       tmp = xa_cmpxchg_irq(&table->array, srq->srqn, srq, XA_ZERO_ENTRY, 0);
+       if (WARN_ON(tmp != srq))
                return;
 
        err = destroy_srq_split(dev, srq);
-       if (err)
+       if (err) {
+               /*
+                * We don't need to check returned result for an error,
+                * because  we are storing in pre-allocated space xarray
+                * entry and it can't fail at this stage.
+                */
+               xa_cmpxchg_irq(&table->array, srq->srqn, XA_ZERO_ENTRY, srq, 0);
                return;
+       }
+       xa_erase_irq(&table->array, srq->srqn);
 
        mlx5_core_res_put(&srq->common);
        wait_for_completion(&srq->common.free);