On Tue, Nov 04, 2025 at 11:58:24PM -0800, Alex Mastro wrote:
> On Mon, Oct 27, 2025 at 02:31:02PM -0300, Jason Gunthorpe wrote:
> > @@ -1024,8 +1027,15 @@ static int iopt_fill_domain(struct io_pagetable
> > *iopt,
> > continue;
> >
> > mutex_lock(&pages->mutex);
> > + if (iopt_is_dmabuf(pages)) {
> > + rc = iopt_dmabuf_track_domain(pages, area, domain);
> > + if (rc)
> > + goto out_unfill;
>
> I think this error path results in locking pages->mutex recursively. Needs a
> mutex_unlock(&pages->mutex)?
Yes, let's use a guard then:
--- a/drivers/iommu/iommufd/io_pagetable.c
+++ b/drivers/iommu/iommufd/io_pagetable.c
@@ -1056,7 +1056,7 @@ static int iopt_fill_domain(struct io_pagetable *iopt,
if (!pages)
continue;
- mutex_lock(&pages->mutex);
+ guard(mutex)(&pages->mutex);
if (iopt_is_dmabuf(pages)) {
rc = iopt_dmabuf_track_domain(pages, area, domain);
if (rc)
@@ -1066,7 +1066,6 @@ static int iopt_fill_domain(struct io_pagetable *iopt,
if (rc) {
if (iopt_is_dmabuf(pages))
iopt_dmabuf_untrack_domain(pages, area, domain);
- mutex_unlock(&pages->mutex);
goto out_unfill;
}
if (!area->storage_domain) {
Thanks,
Jason