[PATCH v3 10/23] drm/qxl: move qxl_primary_apply_cursor to correct place

Gerd Hoffmann kraxel at redhat.com
Mon Jan 28 08:10:05 UTC 2019


> > The cursor must be set again after creating the primary surface.
> > Also drop the error message.

> >  	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 <noralf at tronnes.org>

thanks,
  Gerd



More information about the dri-devel mailing list