<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Aug 8, 2022 at 11:39 AM Jason Ekstrand <<a href="mailto:jason.ekstrand@collabora.com">jason.ekstrand@collabora.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sun, 2022-08-07 at 18:35 +0200, Christian König wrote:<br>
> Am 02.08.22 um 23:01 schrieb Jason Ekstrand:<br>
> > Ever since 68129f431faa ("dma-buf: warn about containers in<br>
> > dma_resv object"),<br>
> > dma_resv_add_shared_fence will warn if you attempt to add a<br>
> > container fence.<br>
> > While most drivers were fine, fences can also be added to a<br>
> > dma_resv via the<br>
> > recently added DMA_BUF_IOCTL_IMPORT_SYNC_FILE. Use<br>
> > dma_fence_unwrap_for_each<br>
> > to add each fence one at a time.<br>
> > <br>
> > Fixes: 594740497e99 ("dma-buf: Add an API for importing sync files<br>
> > (v10)")<br>
> > Signed-off-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@collabora.com" target="_blank">jason.ekstrand@collabora.com</a>><br>
> > Reported-by: Sarah Walker <<a href="mailto:Sarah.Walker@imgtec.com" target="_blank">Sarah.Walker@imgtec.com</a>><br>
> > Cc: Christian König <<a href="mailto:christian.koenig@amd.com" target="_blank">christian.koenig@amd.com</a>><br>
> > ---<br>
> > drivers/dma-buf/dma-buf.c | 23 +++++++++++++++++------<br>
> > 1 file changed, 17 insertions(+), 6 deletions(-)<br>
> > <br>
> > diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c<br>
> > index 630133284e2b..8d5d45112f52 100644<br>
> > --- a/drivers/dma-buf/dma-buf.c<br>
> > +++ b/drivers/dma-buf/dma-buf.c<br>
> > @@ -15,6 +15,7 @@<br>
> > #include <linux/slab.h><br>
> > #include <linux/dma-buf.h><br>
> > #include <linux/dma-fence.h><br>
> > +#include <linux/dma-fence-unwrap.h><br>
> > #include <linux/anon_inodes.h><br>
> > #include <linux/export.h><br>
> > #include <linux/debugfs.h><br>
> > @@ -391,8 +392,10 @@ static long dma_buf_import_sync_file(struct<br>
> > dma_buf *dmabuf,<br>
> > const void __user *user_data)<br>
> > {<br>
> > struct dma_buf_import_sync_file arg;<br>
> > - struct dma_fence *fence;<br>
> > + struct dma_fence *fence, *f;<br>
> > enum dma_resv_usage usage;<br>
> > + struct dma_fence_unwrap iter;<br>
> > + unsigned int num_fences;<br>
> > int ret = 0;<br>
> > <br>
> > if (copy_from_user(&arg, user_data, sizeof(arg)))<br>
> > @@ -411,13 +414,21 @@ static long dma_buf_import_sync_file(struct<br>
> > dma_buf *dmabuf,<br>
> > usage = (arg.flags & DMA_BUF_SYNC_WRITE) ?<br>
> > DMA_RESV_USAGE_WRITE :<br>
> > <br>
> > DMA_RESV_USAGE_READ;<br>
> > <br>
> > - dma_resv_lock(dmabuf->resv, NULL);<br>
> > + num_fences = 0;<br>
> > + dma_fence_unwrap_for_each(f, &iter, fence)<br>
> > + ++num_fences;<br>
> > <br>
> > - ret = dma_resv_reserve_fences(dmabuf->resv, 1);<br>
> > - if (!ret)<br>
> > - dma_resv_add_fence(dmabuf->resv, fence, usage);<br>
> > + if (num_fences > 0) {<br>
> > + dma_resv_lock(dmabuf->resv, NULL);<br>
> > <br>
> > - dma_resv_unlock(dmabuf->resv);<br>
> > + ret = dma_resv_reserve_fences(dmabuf->resv,<br>
> > num_fences);<br>
> <br>
> That looks like it is misplaced.<br>
> <br>
> You *must* only lock the reservation object once and then add all<br>
> fences <br>
> in one go.<br>
<br>
That's what I'm doing. Lock, reserve, add a bunch, unlock. I am<br>
assuming that the iterator won't suddenly want to iterate more fences<br>
between my initial count and when I go to add them but I think that<br>
assumption is ok.<br></blockquote><div><br></div><div>Bump. This has been sitting here for a couple of weeks. I still don't see the problem.</div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
--Jason<br>
<br>
<br>
> Thinking now about it we probably had a bug around that before as<br>
> well. <br>
> Going to double check tomorrow.<br>
> <br>
> Regards,<br>
> Christian.<br>
> <br>
> > + if (!ret) {<br>
> > + dma_fence_unwrap_for_each(f, &iter, fence)<br>
> > + dma_resv_add_fence(dmabuf->resv, f,<br>
> > usage);<br>
> > + }<br>
> > +<br>
> > + dma_resv_unlock(dmabuf->resv);<br>
> > + }<br>
> > <br>
> > dma_fence_put(fence);<br>
> > <br>
> <br>
<br>
</blockquote></div></div>