[PATCH 3/3] present: Check for an invalid target CRTC before flipping
Kenneth Graunke
kenneth at whitecape.org
Sun Feb 8 02:10:07 PST 2015
On Friday, February 06, 2015 08:25:44 AM Chris Wilson wrote:
> Once we have chosen the target CRTC, check for an error when querying
> the current MSC so we can report the error before attempting to record
> the uninitialised MSC/UST, and subsequently feeding garbage values to
> drmWaitVBlank.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> present/present.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/present/present.c b/present/present.c
> index 1ce587e..4a1cf0c 100644
> --- a/present/present.c
> +++ b/present/present.c
> @@ -727,7 +727,9 @@ present_pixmap(WindowPtr window,
> else if (!target_crtc)
> target_crtc = present_get_crtc(window);
>
> - present_get_ust_msc(screen, target_crtc, &ust, &crtc_msc);
> + ret = present_get_ust_msc(screen, target_crtc, &ust, &crtc_msc);
> + if (ret)
> + return ret;
>
> target_msc = present_window_to_crtc_msc(window, target_crtc, window_msc, crtc_msc);
You've definitely found a bug here. Some drivers' get_ust_msc hooks
(UXA, modesetting) return BadMatch and leave crtc_msc uninitialized.
At which point we'd happily continue and use rubbish values.
I discovered this today as well, when using valgrind to try and debug
some crashes in xf86-video-modesetting using my 'pageflip' branch:
[term1]# valgrind --vgdb-error=1 X
[term2]# gdb
[term2](gdb) target remote | vgdb
[term2](gdb) c
[term3]$ DISPLAY=:0 glxgears -fullscreen &
[term3]$ DISPLAY=:0 xset force dpms off
<hit a key to DPMS on>
valgrind will complain about the uninitialized values in the crtc_msc >=
target_msc branch.
But...is an early return really the right thing to do? I tested this
with xf86-video-modesetting and my 'pageflip' branch, and it caused
"glxgears -fullscreen" to die from a BadMatch error after a single DPMS
cycle. I tried changing it to 'return Success', and that caused it to
stop drawing altogether. I also tried it with UXA+DRI3, and it seemed
to break there as well. So it seems like we need to do something more.
I can't see how this would affect SNA at all - SNA always returns
Success from sna_present_get_ust_msc(), so it shouldn't ever hit this
error path. Instead, you seem to be using the last values.
Maybe present_get_usc_msc should never fail, and we should have drivers
return the last values, like SNA does?
Keith, Eric - thoughts?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.x.org/archives/xorg-devel/attachments/20150208/17a80545/attachment.sig>
More information about the xorg-devel
mailing list