Message ID | 1611078509-181959-9-git-send-email-steven.sistare@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio virtual address update | expand |
On Tue, 19 Jan 2021 09:48:28 -0800 Steve Sistare <steven.sistare@oracle.com> wrote: > Implement a notify callback that remembers if the container's file > descriptor has been closed. > > Signed-off-by: Steve Sistare <steven.sistare@oracle.com> > --- > 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, Alex > }; > > 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)
On 1/22/2021 6:00 PM, Alex Williamson wrote: > On Tue, 19 Jan 2021 09:48:28 -0800 > Steve Sistare <steven.sistare@oracle.com> wrote: > >> Implement a notify callback that remembers if the container's file >> descriptor has been closed. >> >> Signed-off-by: Steve Sistare <steven.sistare@oracle.com> >> --- >> 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) >
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; }; 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)
Implement a notify callback that remembers if the container's file descriptor has been closed. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> --- drivers/vfio/vfio_iommu_type1.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)