From: Vasily Averin <vvs@virtuozzo.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: Caicai <caizhaopeng@uniontech.com>,
Dave Airlie <airlied@redhat.com>, David Airlie <airlied@linux.ie>,
virtualization@lists.linux-foundation.org,
dri-devel@lists.freedesktop.org,
"linux-kernel@vger.kernel.org\"" <linux-kernel@vger.kernel.org>,
Zhangyueqian <zhangyueqian@uniontech.com>,
"Denis V. Lunev" <den@virtuozzo.com>
Subject: Re: [PATCH 1/1] drm/qxl: add mutex_lock/mutex_unlock to ensure the order in which resources are rele
Date: Wed, 29 Apr 2020 09:12:46 +0300 [thread overview]
Message-ID: <bc954de7-bfe0-8e0c-79d4-90d726a0ffa6@virtuozzo.com> (raw)
In-Reply-To: <20200421084300.zggroiptwbrblzqy () sirius ! home ! kraxel ! org>
On 4/21/20 11:43 AM, Gerd Hoffmann wrote:
> On Sat, Apr 18, 2020 at 02:39:17PM +0800, Caicai wrote:
>> When a qxl resource is released, the list that needs to be released is
>> fetched from the linked list ring and cleared. When you empty the list,
>> instead of trying to determine whether the ttm buffer object for each
>> qxl in the list is locked, you release the qxl object and remove the
>> element from the list until the list is empty. It was found that the
>> linked list was cleared first, and that the lock on the corresponding
>> ttm Bo for the QXL had not been released, so that the new qxl could not
>> be locked when it used the TTM.
>
> So the dma_resv_reserve_shared() call in qxl_release_validate_bo() is
> unbalanced? Because the dma_resv_unlock() call in
> qxl_release_fence_buffer_objects() never happens due to
> qxl_release_free_list() clearing the list beforehand? Is that correct?
we observe similar issue: RHEL7 guests crashes in
qxl_draw_opaque_fb()
qxl_release_fence_buffer_objects()
crashdump investigation shows that qlx_object was freed and reused,
so its original content was re-written.
At the same time qxl_device have empty release_idr,
ant there are no allocated qxl_bo_list entries.
i.e. qxl_release_free was really called.
> The only way I see for this to happen is that the guest is preempted
> between qxl_push_{cursor,command}_ring_release() and
> qxl_release_fence_buffer_objects() calls. The host can complete the qxl
> command then, signal the guest, and the IRQ handler calls
> qxl_release_free_list() before qxl_release_fence_buffer_objects() runs.
We think the same: qxl_release was freed by garbage collector before
original thread had called qxl_release_fence_buffer_objects().
> Looking through the code I think it should be safe to simply swap the
> qxl_release_fence_buffer_objects() +
> qxl_push_{cursor,command}_ring_release() calls to close that race
> window. Can you try that and see if it fixes the bug for you?
I'm going to prepare and test such patch but I have one question here:
qxl_push_*_ring_release can be called with interruptible=true and fail
How to correctly handle this case? Is the hunk below correct from your POV?
--- a/drivers/gpu/drm/qxl/qxl_ioctl.c
+++ b/drivers/gpu/drm/qxl/qxl_ioctl.c
@@ -261,12 +261,8 @@ static int qxl_process_single_command(struct qxl_device *qdev,
apply_surf_reloc(qdev, &reloc_info[i]);
}
+ qxl_release_fence_buffer_objects(release);
ret = qxl_push_command_ring_release(qdev, release, cmd->type, true);
- if (ret)
- qxl_release_backoff_reserve_list(release); <<<< ????
- else
- qxl_release_fence_buffer_objects(release);
-
out_free_bos:
out_free_release:
Thank you,
Vasily Averin
next parent reply other threads:[~2020-04-29 6:13 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20200421084300.zggroiptwbrblzqy () sirius ! home ! kraxel ! org>
2020-04-29 6:12 ` Vasily Averin [this message]
2020-04-29 8:28 ` Gerd Hoffmann
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=bc954de7-bfe0-8e0c-79d4-90d726a0ffa6@virtuozzo.com \
--to=vvs@virtuozzo.com \
--cc=airlied@linux.ie \
--cc=airlied@redhat.com \
--cc=caizhaopeng@uniontech.com \
--cc=den@virtuozzo.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=kraxel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.org \
--cc=zhangyueqian@uniontech.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®