On Sun, Jan 26, 2020 at 04:26:46PM +0200, Leon Romanovsky wrote: > From: Parav Pandit <parav@xxxxxxxxxxxx> > > Below cited commit missed to consider AF_IB and loopback code flow in > rdma_resolve_addr(). > This leads to unbalanced cm_id refcount in cma_work_handler() which > puts the refcount which was not incremented in rdma_resolve_addr(). > > A call trace is observed with such code flow. > > BUG: unable to handle kernel NULL pointer dereference at (null) > [<ffffffff96b67e16>] __mutex_lock_slowpath+0x166/0x1d0 > [<ffffffff96b6715f>] mutex_lock+0x1f/0x2f > [<ffffffffc0beabb5>] cma_work_handler+0x25/0xa0 > [<ffffffff964b9ebf>] process_one_work+0x17f/0x440 > [<ffffffff964baf56>] worker_thread+0x126/0x3c0 > > Hence, hold the cm_id reference when scheduling resolve work item. > > Fixes: 722c7b2bfead ("RDMA/{cma, core}: Avoid callback on rdma_addr_cancel()") > Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > --- > drivers/infiniband/core/cma.c | 2 ++ > 1 file changed, 2 insertions(+) It is very hard to read this flow around the 'work', the incr of the refcount in rdma_resolve_route() seems very poorly placed. But this looks correct, so applied to for-next Thanks, Jason