RDMA/core: Fix bogus WARN_ON during ib_unregister_device_queued()
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 26 Jun 2020 17:49:10 +0000 (14:49 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Aug 2020 06:23:50 +0000 (08:23 +0200)
commitef04199ce9d74b85ce251291f3b945bea3be570f
tree379f3c7e540b0c40aa94900ea54d4348f19450ad
parent9a0e58cf2a8ce61b22d6b58b8b6ca52f274cc0e8
RDMA/core: Fix bogus WARN_ON during ib_unregister_device_queued()

[ Upstream commit 0cb42c0265837fafa2b4f302c8a7fed2631d7869 ]

ib_unregister_device_queued() can only be used by drivers using the new
dealloc_device callback flow, and it has a safety WARN_ON to ensure
drivers are using it properly.

However, if unregister and register are raced there is a special
destruction path that maintains the uniform error handling semantic of
'caller does ib_dealloc_device() on failure'. This requires disabling the
dealloc_device callback which triggers the WARN_ON.

Instead of using NULL to disable the callback use a special function
pointer so the WARN_ON does not trigger.

Fixes: d0899892edd0 ("RDMA/device: Provide APIs from the core code to help unregistration")
Link: https://lore.kernel.org/r/0-v1-a36d512e0a99+762-syz_dealloc_driver_jgg@nvidia.com
Reported-by: syzbot+4088ed905e4ae2b0e13b@syzkaller.appspotmail.com
Suggested-by: Hillf Danton <hdanton@sina.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/core/device.c