Re: [PATCH v3 10/23] drm/qxl: move qxl_primary_apply_cursor to correct place
From: Gerd Hoffmann <kraxel@redhat.com>
Date: 2019-01-28 08:10:05
quoted
The cursor must be set again after creating the primary surface. Also drop the error message.
quoted
if (!bo->is_primary) { - if (!same_shadow) + if (!same_shadow) { qxl_io_create_primary(qdev, 0, bo); + qxl_primary_apply_cursor(plane); + } bo->is_primary = true; }I don't see how the commit message matches what you're doing. It gives the impression that it must be applied under yet another condition, but the condition for applying the cursor is changed from bo_old->is_primary to !bo->is_primary.
The qxl device ties the cursor to the primary surface. Therefore calling qxl_io_destroy_primary() and qxl_io_create_primary() to switch the framebuffer causes the cursor information being lost and the driver must re-apply it. The correct call order to do that is qxl_io_destroy_primary() + qxl_io_create_primary() + qxl_primary_apply_cursor(). The old code did qxl_io_destroy_primary() + qxl_primary_apply_cursor() + qxl_io_create_primary(). Due to qxl_primary_apply_cursor request being queued in a ringbuffer and qxl_io_create_primary() trapping to the hypervisor instantly there is a high chance that qxl_io_create_primary() is processed first even with the wrong call order. But it's racy and thus not reliable.
It probably makes sense to someone that knows the driver.
If the above explains things better to you I should probably replace the commit message with that.
Acked-by: Noralf Trønnes <redacted>
thanks, Gerd