• Mario Kleiner's avatar
    drm/nouveau/kms/nv50: Fix atomic pageflip events. · bd9f6605
    Mario Kleiner authored
    The new atomic modesetting/pageflip code for nv50+ for
    Linux 4.10+ no longer uses pageflip irq's to signal
    flip completion. Instead it polls for flip completion
    from within a kthread/work queue.
    
    This creates a race between the vblank irq handler
    updating the vblank count and timestamp for the
    vblank of flip completion, and the kthread's
    polling code detecting flip completion and sending
    out the flip completion event.
    
    Depending on who executes a few microseconds earlier,
    the flip completion event will either contain correct
    count/timestamp or a stale count/timestamp from the
    previous vblank. This error was observed for about
    50% of all executed flips, e.g., observable under DRI2
    by the Xorg.log filling with flip handler warning
    messages.
    
    Call drm_accurate_vblank_count() before sending
    out flip completion events to enforce a vblank
    count/ts update for the vblank of flip completion
    and avoid stale counts/timestamps.
    
    This fix leads to one redundant call to drm_update_vblank_count
    for each completed flip, but no other side effects. On
    a ~6 year old Core i7 M620@ 2.67GHz the redundant call
    costs about 10 usecs per flip
    
    Successfully tested on GeForce 9500/9600/330M so far.
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Cc: Ben Skeggs <bskeggs@redhat.com>
    Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
    bd9f6605
nv50_display.c 117 KB