On Fri, Jul 21, 2023 at 03:50:14PM -0500, Bob Pearson wrote: > Since the AH creation and destroy verbs APIs can be called in > interrupt context it is necessary to not sleep in these cases. > This was partially dealt with in previous fixes but some cases > remain where the code could still potentially sleep. > > This patch fixes this by extending the __rxe_finalize() call to > have a sleepable parameter and using this in the AH verbs calls. > It also fixes one call to rxe_cleanup which did not use the > sleepable API. > > Fixes: 215d0a755e1b ("RDMA/rxe: Stop lookup of partially built objects") > Signed-off-by: Bob Pearson <rpearsonhpe@xxxxxxxxx> > --- > drivers/infiniband/sw/rxe/rxe_pool.c | 5 +++-- > drivers/infiniband/sw/rxe/rxe_pool.h | 5 +++-- > drivers/infiniband/sw/rxe/rxe_verbs.c | 11 ++++++----- > 3 files changed, 12 insertions(+), 9 deletions(-) > > diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c b/drivers/infiniband/sw/rxe/rxe_pool.c > index 6215c6de3a84..de0043b6d3f3 100644 > --- a/drivers/infiniband/sw/rxe/rxe_pool.c > +++ b/drivers/infiniband/sw/rxe/rxe_pool.c > @@ -247,10 +247,11 @@ int __rxe_put(struct rxe_pool_elem *elem) > return kref_put(&elem->ref_cnt, rxe_elem_release); > } > > -void __rxe_finalize(struct rxe_pool_elem *elem) > +void __rxe_finalize(struct rxe_pool_elem *elem, bool sleepable) > { > void *xa_ret; > + gfp_t gfp_flags = sleepable ? GFP_KERNEL : GFP_ATOMIC; > > - xa_ret = xa_store(&elem->pool->xa, elem->index, elem, GFP_KERNEL); > + xa_ret = xa_store(&elem->pool->xa, elem->index, elem, gfp_flags); > WARN_ON(xa_err(xa_ret)); > } You don't need to do this, there is no allocation here, when you call xa_alloc_cyclic() it reserved all the memory necessary for this. Just add a comment and mark it GFP_ATOMIC. Jason