mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 21:15:53 +02:00
iommufd: Add a pre_destroy() op for objects
Add a pre_destroy() op which gives objects a chance to clear their short term users references before destruction. This op is intended for external driver created objects (e.g. idev) which does deterministic destruction. In order to manage the lifecycle of interrelated objects as well as the deterministic destruction (e.g. vdev can't outlive idev, and idev destruction can't fail), short term users references are allowed to live out of an ioctl execution. An immediate use case is, vdev holds idev's short term user reference until vdev destruction completes, idev leverages existing wait_shortterm mechanism to ensure it is destroyed after vdev. This extended usage makes the referenced object unable to just wait for its reference gone. It needs to actively trigger the reference removal, as well as prevent new references before wait. Should implement these work in pre_destroy(). Link: https://patch.msgid.link/r/20250716070349.1807226-4-yilun.xu@linux.intel.com Suggested-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Nicolin Chen <nicolinc@nvidia.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
e6d41ee312
commit
7dc0e1090b
|
|
@ -23,6 +23,7 @@
|
|||
#include "iommufd_test.h"
|
||||
|
||||
struct iommufd_object_ops {
|
||||
void (*pre_destroy)(struct iommufd_object *obj);
|
||||
void (*destroy)(struct iommufd_object *obj);
|
||||
void (*abort)(struct iommufd_object *obj);
|
||||
};
|
||||
|
|
@ -160,6 +161,9 @@ static int iommufd_object_dec_wait_shortterm(struct iommufd_ctx *ictx,
|
|||
if (refcount_dec_and_test(&to_destroy->shortterm_users))
|
||||
return 0;
|
||||
|
||||
if (iommufd_object_ops[to_destroy->type].pre_destroy)
|
||||
iommufd_object_ops[to_destroy->type].pre_destroy(to_destroy);
|
||||
|
||||
if (wait_event_timeout(ictx->destroy_wait,
|
||||
refcount_read(&to_destroy->shortterm_users) == 0,
|
||||
msecs_to_jiffies(60000)))
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user