iommufd: Make destroy_rwsem use a lock class per object type
The selftest invokes things like replace under the object lock of its idev which protects the idev in a similar way to a real user. Unfortunately this triggers lockdep. A lock class per type will solve the problem. Link: https://lore.kernel.org/r/15-v8-6659224517ea+532-iommufd_alloc_jgg@nvidia.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Tested-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
e88d4ec154
commit
83f7bc6fdf
|
|
@ -119,6 +119,7 @@ enum iommufd_object_type {
|
|||
#ifdef CONFIG_IOMMUFD_TEST
|
||||
IOMMUFD_OBJ_SELFTEST,
|
||||
#endif
|
||||
IOMMUFD_OBJ_MAX,
|
||||
};
|
||||
|
||||
/* Base struct for all objects with a userspace ID handle. */
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
|
|||
size_t size,
|
||||
enum iommufd_object_type type)
|
||||
{
|
||||
static struct lock_class_key obj_keys[IOMMUFD_OBJ_MAX];
|
||||
struct iommufd_object *obj;
|
||||
int rc;
|
||||
|
||||
|
|
@ -40,7 +41,15 @@ struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
|
|||
if (!obj)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
obj->type = type;
|
||||
init_rwsem(&obj->destroy_rwsem);
|
||||
/*
|
||||
* In most cases the destroy_rwsem is obtained with try so it doesn't
|
||||
* interact with lockdep, however on destroy we have to sleep. This
|
||||
* means if we have to destroy an object while holding a get on another
|
||||
* object it triggers lockdep. Using one locking class per object type
|
||||
* is a simple and reasonable way to avoid this.
|
||||
*/
|
||||
__init_rwsem(&obj->destroy_rwsem, "iommufd_object::destroy_rwsem",
|
||||
&obj_keys[type]);
|
||||
refcount_set(&obj->users, 1);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue