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)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 2 Jul 2020 17:25:42 +0000 (14:25 -0300)
commit0cb42c0265837fafa2b4f302c8a7fed2631d7869
treea7d90144f48831f74e09ef81f2972d1b38f16f48
parent65936bf25f90fe440bb2d11624c7d10fab266639
RDMA/core: Fix bogus WARN_ON during ib_unregister_device_queued()

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>
drivers/infiniband/core/device.c