RE: [PATCH v5 0/6] Deliver vGPU display refresh event to userspace

From: Zhang, Tina
Date: Mon Sep 02 2019 - 21:26:58 EST


Hi,

Some people are asking whether the display refresh irq could be provided by qemu vfio display?

Some background: currently, we have two display timers. One is provided by QEMU UI and the other one is provided by the vgpu. The vgpu display framebuffer consumers (i.e. QEMU UIs) depend on the UI timer to consume the contents in the vgpu display framebuffer, meanwhile the display framebuffer producer (e.g. gvt-g display model) updates the framebuffer content according to the vblank timer provided by gpu vendor driver. Since these two timers are not synced, tearing could be noticed.

So, theoretically to solve this tearing problem, we could have two options:

Option 1: Like what we have in this patch set: stop the QEMU UI timer and let both the framebuffer consumers and the framebuffer producer sync to the display refresh event provided by vendor driver. So, QEMU UI can do the refresh depending on this display refresh event to make sure to have a tear-free framebuffer.

Option 2: QEMU provides the emulated display refresh event to the vgpus provided by vendor driver. For vgpus, the display refresh event can be considered as the vblank event which is leveraged by guest window manager to do the plane update or mode-setting.

People are asking if option 2 could be a better choice.

Thanks.

BR,
Tina

> -----Original Message-----
> From: Zhang, Tina
> Sent: Friday, August 16, 2019 10:35 AM
> To: intel-gvt-dev@xxxxxxxxxxxxxxxxxxxxx
> Cc: Zhang, Tina <tina.zhang@xxxxxxxxx>; kraxel@xxxxxxxxxx;
> alex.williamson@xxxxxxxxxx; kvm@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Yuan, Hang <hang.yuan@xxxxxxxxx>; Lv, Zhiyuan
> <zhiyuan.lv@xxxxxxxxx>
> Subject: [PATCH v5 0/6] Deliver vGPU display refresh event to userspace
>
> This series tries to send the vGPU display refresh event to user land.
>
> Instead of delivering page flip events only or vblank events only, we choose
> to combine two of them, i.e. post display refresh event at vblanks and skip
> some of them when no page flip happens. Vblanks as upper bound are safe
> and skipping no-page-flip vblanks guarantees both trivial performance
> impacts and good user experience without screen tearing. Plus, we have the
> mask/unmask mechansim providing user space flexibility to switch between
> event-notified refresh and classic timer-based refresh.
>
> In addition, there are some cases that guest app only uses one framebuffer
> for both drawing and display. In such case, guest OS won't do the plane page
> flip when the framebuffer is updated, thus the user land won't be notified
> about the updated framebuffer. Hence, in single framebuffer case, we apply
> a heuristic to determine whether it is the case or not. If it is, notify user land
> when each vblank event triggers.
>
> v5:
> - Introduce a vGPU display irq cap which can notify user space with
> both primary and cursor plane update events through one eventfd. (Gerd &
> Alex)
> v4:
> - Deliver page flip event and single framebuffer refresh event bounded by
> display vblanks. (Kechen)
> v3:
> - Deliver display vblank event instead of page flip event. (Zhenyu)
> v2:
> - Use VFIO irq chain to get eventfds from userspace instead of adding a new
> ABI. (Alex)
> v1:
> - https://patchwork.kernel.org/cover/10962341/
>
> Kechen Lu (2):
> drm/i915/gvt: Deliver async primary plane page flip events at vblank
> drm/i915/gvt: Add cursor plane reg update trap emulation handler
>
> Tina Zhang (4):
> vfio: Define device specific irq type capability
> vfio: Introduce vGPU display irq type
> drm/i915/gvt: Register vGPU display event irq
> drm/i915/gvt: Deliver vGPU refresh event to userspace
>
> drivers/gpu/drm/i915/gvt/cmd_parser.c | 6 +-
> drivers/gpu/drm/i915/gvt/display.c | 49 +++++-
> drivers/gpu/drm/i915/gvt/display.h | 3 +
> drivers/gpu/drm/i915/gvt/gvt.h | 6 +
> drivers/gpu/drm/i915/gvt/handlers.c | 32 +++-
> drivers/gpu/drm/i915/gvt/hypercall.h | 1 +
> drivers/gpu/drm/i915/gvt/interrupt.c | 7 +
> drivers/gpu/drm/i915/gvt/interrupt.h | 3 +
> drivers/gpu/drm/i915/gvt/kvmgt.c | 230 +++++++++++++++++++++++++-
> drivers/gpu/drm/i915/gvt/mpt.h | 17 ++
> include/uapi/linux/vfio.h | 40 ++++-
> 11 files changed, 375 insertions(+), 19 deletions(-)
>
> --
> 2.17.1