• Daniel Vetter's avatar
    drm/vkms: totally reworked crc data tracking · 8b186587
    Daniel Vetter authored
    The crc computation worker needs to be able to get at some data
    structures and framebuffer mappings, while potentially more atomic
    updates are going on. The solution thus far is to copy relevant bits
    around, but that's very tedious.
    
    Here's a new approach, which tries to be more clever, but relies on a
    few not-so-obvious things:
    - crtc_state is always updated when a plane_state changes. Therefore
      we can just stuff plane_state pointers into a crtc_state. That
      solves the problem of easily getting at the needed plane_states.
    - with the flushing changes from previous patches the above also holds
      without races due to the next atomic update being a bit eager with
      cleaning up pending work - we always wait for all crc work items to
      complete before unmapping framebuffers.
    - we also need to make sure that the hrtimer fires off the right
      worker. Keep a new distinct crc_state pointer, under the
      vkms_output->lock protection for this. Note that crtc->state is
      updated very early in the atomic commit, way before we arm the
      vblank event - the vblank event should always match the buffers we
      use to compute the crc. This also solves an issue in the hrtimer,
      where we've accessed drm_crtc->state without holding the right locks
      (we held none - oops).
    - in the worker itself we can then just access the plane states we
      need, again solving a bunch of ordering and locking issues.
      Accessing plane->state requires locks, accessing the private
      vkms_crtc_state->active_planes pointer only requires that the memory
      doesn't get freed too early.
    
    The idea behind vkms_crtc_state->active_planes is that this would
    contain all visible planes, in z-order, as a first step towards a more
    generic blending implementation.
    
    Note that this patch also fixes races between prepare_fb/cleanup_fb
    and the crc worker accessing ->vaddr.
    
    Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Cc: Haneen Mohammed <hamohammed.sa@gmail.com>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
    Reviewed-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Tested-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Signed-off-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190606222751.32567-10-daniel.vetter@ffwll.ch
    8b186587
vkms_drv.h 3.71 KB