On 1/22/2021 6:00 PM, Alex Williamson wrote: > On Tue, 19 Jan 2021 09:48:28 -0800 > Steve Sistare <steven.sistare@xxxxxxxxxx> wrote: > >> Implement a notify callback that remembers if the container's file >> descriptor has been closed. >> >> Signed-off-by: Steve Sistare <steven.sistare@xxxxxxxxxx> >> --- >> drivers/vfio/vfio_iommu_type1.c | 15 +++++++++++++++ >> 1 file changed, 15 insertions(+) >> >> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c >> index c307f62..0167996 100644 >> --- a/drivers/vfio/vfio_iommu_type1.c >> +++ b/drivers/vfio/vfio_iommu_type1.c >> @@ -74,6 +74,7 @@ struct vfio_iommu { >> bool nesting; >> bool dirty_page_tracking; >> bool pinned_page_dirty_scope; >> + bool controlled; > > s/controlled/container_open/? Thanks, I like controlled because it documents the issue nicely: it is no longer possible for the user to change the state via IOConTroL. If you like more context, then container_controlled. But container_open is fine. - Steve >> }; >> >> struct vfio_domain { >> @@ -2518,6 +2519,7 @@ static void *vfio_iommu_type1_open(unsigned long arg) >> INIT_LIST_HEAD(&iommu->iova_list); >> iommu->dma_list = RB_ROOT; >> iommu->dma_avail = dma_entry_limit; >> + iommu->controlled = true; >> mutex_init(&iommu->lock); >> BLOCKING_INIT_NOTIFIER_HEAD(&iommu->notifier); >> >> @@ -3043,6 +3045,18 @@ static int vfio_iommu_type1_dma_rw(void *iommu_data, dma_addr_t user_iova, >> return ret; >> } >> >> +static void vfio_iommu_type1_notify(void *iommu_data, unsigned int event, >> + void *data) >> +{ >> + struct vfio_iommu *iommu = iommu_data; >> + >> + if (event != VFIO_DRIVER_NOTIFY_CONTAINER_CLOSE) >> + return; >> + mutex_lock(&iommu->lock); >> + iommu->controlled = false; >> + mutex_unlock(&iommu->lock); >> +} >> + >> static const struct vfio_iommu_driver_ops vfio_iommu_driver_ops_type1 = { >> .name = "vfio-iommu-type1", >> .owner = THIS_MODULE, >> @@ -3056,6 +3070,7 @@ static int vfio_iommu_type1_dma_rw(void *iommu_data, dma_addr_t user_iova, >> .register_notifier = vfio_iommu_type1_register_notifier, >> .unregister_notifier = vfio_iommu_type1_unregister_notifier, >> .dma_rw = vfio_iommu_type1_dma_rw, >> + .notify = vfio_iommu_type1_notify, >> }; >> >> static int __init vfio_iommu_type1_init(void) >