OSDN Git Service

IB/uverbs: Clarify the kref'ing ordering for alloc_commit
authorJason Gunthorpe <jgg@mellanox.com>
Wed, 11 Jul 2018 02:55:15 +0000 (20:55 -0600)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 25 Jul 2018 20:21:21 +0000 (14:21 -0600)
commitc561c288463102b12c9089a42c6c2a9f55c4fb53
tree4264c61e2b4327f89977b9c555f5814a636fb9db
parent1250c3048cf1632f5dbb99a0242410baff67955d
IB/uverbs: Clarify the kref'ing ordering for alloc_commit

The alloc_commit callback makes the uobj visible to other threads,
and it does so using a 'move' semantic of the uobj kref on the stack
into the public storage (eg the IDR, uobject list and file_private_data)

Once this is done another thread could start up and trigger deletion
of the kref. Fortunately cleanup_rwsem happens to prevent this from
being a bug, but that is a fantastically unclear side effect.

Re-organize things so that alloc_commit is that last thing to touch
the uobj, get rid of the sneaky implicit dependency on cleanup_rwsem,
and add a comment reminding that uobj is no longer kref'd after
alloc_commit.

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/rdma_core.c