From: "Christian König" <christian.koenig@amd.com>
To: "Michel Dänzer" <michel@daenzer.net>
Cc: linaro-mm-sig@lists.linaro.org, linux-kernel@vger.kernel.org,
dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org
Subject: Re: [PATCH] dma-buf/poll: Get a file reference for outstanding fence callbacks
Date: Fri, 23 Jul 2021 10:04:58 +0200 [thread overview]
Message-ID: <f5f37693-bfe2-e52f-172b-00f4aa94dbd9@amd.com> (raw)
In-Reply-To: <20210723075857.4065-1-michel@daenzer.net>
Am 23.07.21 um 09:58 schrieb Michel Dänzer:
> From: Michel Dänzer <mdaenzer@redhat.com>
>
> This makes sure we don't hit the
>
> BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
>
> in dma_buf_release, which could be triggered by user space closing the
> dma-buf file description while there are outstanding fence callbacks
> from dma_buf_poll.
I was also wondering the same thing while working on this, but then
thought that the poll interface would take care of this.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <mdaenzer@redhat.com>
> ---
> drivers/dma-buf/dma-buf.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 6c520c9bd93c..ec25498a971f 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -65,12 +65,9 @@ static void dma_buf_release(struct dentry *dentry)
> BUG_ON(dmabuf->vmapping_counter);
>
> /*
> - * Any fences that a dma-buf poll can wait on should be signaled
> - * before releasing dma-buf. This is the responsibility of each
> - * driver that uses the reservation objects.
> - *
> - * If you hit this BUG() it means someone dropped their ref to the
> - * dma-buf while still having pending operation to the buffer.
> + * If you hit this BUG() it could mean:
> + * * There's a file reference imbalance in dma_buf_poll / dma_buf_poll_cb or somewhere else
> + * * dmabuf->cb_in/out.active are non-0 despite no pending fence callback
> */
> BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
>
> @@ -196,6 +193,7 @@ static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
> static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
> {
> struct dma_buf_poll_cb_t *dcb = (struct dma_buf_poll_cb_t *)cb;
> + struct dma_buf *dmabuf = container_of(dcb->poll, struct dma_buf, poll);
> unsigned long flags;
>
> spin_lock_irqsave(&dcb->poll->lock, flags);
> @@ -203,6 +201,8 @@ static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
> dcb->active = 0;
> spin_unlock_irqrestore(&dcb->poll->lock, flags);
> dma_fence_put(fence);
> + /* Paired with get_file in dma_buf_poll */
> + fput(dmabuf->file);
Is calling fput() in interrupt context ok? IIRC that could potentially
sleep.
Regards,
Christian.
> }
>
> static bool dma_buf_poll_shared(struct dma_resv *resv,
> @@ -278,6 +278,9 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
> spin_unlock_irq(&dmabuf->poll.lock);
>
> if (events & EPOLLOUT) {
> + /* Paired with fput in dma_buf_poll_cb */
> + get_file(dmabuf->file);
> +
> if (!dma_buf_poll_shared(resv, dcb) &&
> !dma_buf_poll_excl(resv, dcb))
> /* No callback queued, wake up any other waiters */
> @@ -299,6 +302,9 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
> spin_unlock_irq(&dmabuf->poll.lock);
>
> if (events & EPOLLIN) {
> + /* Paired with fput in dma_buf_poll_cb */
> + get_file(dmabuf->file);
> +
> if (!dma_buf_poll_excl(resv, dcb))
> /* No callback queued, wake up any other waiters */
> dma_buf_poll_cb(NULL, &dcb->cb);
WARNING: multiple messages have this Message-ID (diff)
From: "Christian König" <christian.koenig@amd.com>
To: "Michel Dänzer" <michel@daenzer.net>
Cc: Sumit Semwal <sumit.semwal@linaro.org>,
dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org,
linaro-mm-sig@lists.linaro.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] dma-buf/poll: Get a file reference for outstanding fence callbacks
Date: Fri, 23 Jul 2021 10:04:58 +0200 [thread overview]
Message-ID: <f5f37693-bfe2-e52f-172b-00f4aa94dbd9@amd.com> (raw)
In-Reply-To: <20210723075857.4065-1-michel@daenzer.net>
Am 23.07.21 um 09:58 schrieb Michel Dänzer:
> From: Michel Dänzer <mdaenzer@redhat.com>
>
> This makes sure we don't hit the
>
> BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
>
> in dma_buf_release, which could be triggered by user space closing the
> dma-buf file description while there are outstanding fence callbacks
> from dma_buf_poll.
I was also wondering the same thing while working on this, but then
thought that the poll interface would take care of this.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <mdaenzer@redhat.com>
> ---
> drivers/dma-buf/dma-buf.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 6c520c9bd93c..ec25498a971f 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -65,12 +65,9 @@ static void dma_buf_release(struct dentry *dentry)
> BUG_ON(dmabuf->vmapping_counter);
>
> /*
> - * Any fences that a dma-buf poll can wait on should be signaled
> - * before releasing dma-buf. This is the responsibility of each
> - * driver that uses the reservation objects.
> - *
> - * If you hit this BUG() it means someone dropped their ref to the
> - * dma-buf while still having pending operation to the buffer.
> + * If you hit this BUG() it could mean:
> + * * There's a file reference imbalance in dma_buf_poll / dma_buf_poll_cb or somewhere else
> + * * dmabuf->cb_in/out.active are non-0 despite no pending fence callback
> */
> BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
>
> @@ -196,6 +193,7 @@ static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
> static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
> {
> struct dma_buf_poll_cb_t *dcb = (struct dma_buf_poll_cb_t *)cb;
> + struct dma_buf *dmabuf = container_of(dcb->poll, struct dma_buf, poll);
> unsigned long flags;
>
> spin_lock_irqsave(&dcb->poll->lock, flags);
> @@ -203,6 +201,8 @@ static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
> dcb->active = 0;
> spin_unlock_irqrestore(&dcb->poll->lock, flags);
> dma_fence_put(fence);
> + /* Paired with get_file in dma_buf_poll */
> + fput(dmabuf->file);
Is calling fput() in interrupt context ok? IIRC that could potentially
sleep.
Regards,
Christian.
> }
>
> static bool dma_buf_poll_shared(struct dma_resv *resv,
> @@ -278,6 +278,9 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
> spin_unlock_irq(&dmabuf->poll.lock);
>
> if (events & EPOLLOUT) {
> + /* Paired with fput in dma_buf_poll_cb */
> + get_file(dmabuf->file);
> +
> if (!dma_buf_poll_shared(resv, dcb) &&
> !dma_buf_poll_excl(resv, dcb))
> /* No callback queued, wake up any other waiters */
> @@ -299,6 +302,9 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
> spin_unlock_irq(&dmabuf->poll.lock);
>
> if (events & EPOLLIN) {
> + /* Paired with fput in dma_buf_poll_cb */
> + get_file(dmabuf->file);
> +
> if (!dma_buf_poll_excl(resv, dcb))
> /* No callback queued, wake up any other waiters */
> dma_buf_poll_cb(NULL, &dcb->cb);
next prev parent reply other threads:[~2021-07-23 8:05 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-23 7:58 [PATCH] dma-buf/poll: Get a file reference for outstanding fence callbacks Michel Dänzer
2021-07-23 7:58 ` Michel Dänzer
2021-07-23 8:04 ` Christian König [this message]
2021-07-23 8:04 ` Christian König
2021-07-23 8:19 ` Michel Dänzer
2021-07-23 8:22 ` [Linaro-mm-sig] " Christian König
2021-11-03 14:50 ` Michel Dänzer
2021-11-04 8:20 ` Christian König
2021-07-23 9:02 ` Daniel Vetter
2021-07-23 9:02 ` Daniel Vetter
2021-07-23 9:11 ` Michel Dänzer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f5f37693-bfe2-e52f-172b-00f4aa94dbd9@amd.com \
--to=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=michel@daenzer.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.