linux/drivers/gpu/drm/i915/gvt
Zhao Yan 510fe10b61 drm/i915/gvt: fix a bug of partially write ggtt enties
when guest writes ggtt entries, it could write 8 bytes a time if
gtt_entry_size is 8. But, qemu could split the 8 bytes into 2 consecutive
4-byte writes.

If each 4-byte partial write could trigger a host ggtt write, it is very
possible that a wrong combination is written to the host ggtt. E.g.
the higher 4 bytes is the old value, but the lower 4 bytes is the new
value, and this 8-byte combination is wrong but written to the ggtt, thus
causing bugs.

To handle this condition, we just record the first 4-byte write, then wait
until the second 4-byte write comes and write the combined 64-bit data to
host ggtt table.

To save memory space and to spot partial write as early as possible, we
don't keep this information for every ggtt index. Instread, we just record
the last ggtt write position, and assume the two 4-byte writes come in
consecutively for each vgpu.

This assumption is right based on the characteristic of ggtt entry which
stores memory address. When gtt_entry_size is 8, the guest memory physical
address should be 64 bits, so any sane guest driver should write 8-byte
long data at a time, so 2 consecutive 4-byte writes at the same ggtt index
should be trapped in gvt.

v2:
when incomplete ggtt entry write is located, e.g.
    1. guest only writes 4 bytes at a ggtt offset and no long writes the
       rest 4 bytes.
    2. guest writes 4 bytes of a ggtt offset, then write at other ggtt
       offsets, then return back to write the left 4 bytes of the first
       ggtt offset.
add error handling logic to remap host entry to scratch page, and mark
guest virtual ggtt entry as not present.  (zhenyu wang)

Signed-off-by: Zhao Yan <yan.y.zhao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
2018-07-02 11:09:38 +08:00
..
aperture_gm.c drm/i915: Add interface to reserve fence registers for vGPU 2017-09-04 16:34:59 +01:00
cfg_space.c drm/i915/gvt: Fix aperture read/write emulation when enable x-no-mmap=on 2018-02-06 11:41:27 -08:00
cmd_parser.c Merge tag 'gvt-fixes-2018-04-19' of https://github.com/intel/gvt-linux into drm-intel-next-fixes 2018-06-07 12:06:07 +03:00
cmd_parser.h
debug.h drm/i915/gvt: Make gvt_vgpu_err use pr_err 2017-11-16 11:48:34 +08:00
debugfs.c drm/i915/gvt: scan non-privileged batch buffer for debug purpose 2018-04-23 13:09:34 +08:00
display.c drm/i915/gvt: Disable primary/sprite/cursor plane at virtual display initialization 2018-03-30 14:47:19 +08:00
display.h drm/i915/gvt: Fix the validation on size field of dp aux header 2018-04-12 11:29:01 +08:00
dmabuf.c drm/i915/gvt: Add drm_format_mod update 2018-03-30 14:47:20 +08:00
dmabuf.h drm/i915/gvt: Dmabuf support for GVT-g 2017-12-04 11:24:33 +08:00
edid.c drm/i915/gvt: cleanup usage for typed mmio reg vs. offset 2017-12-22 16:33:03 +08:00
edid.h
execlist.c drm/i915/gvt: refine intel_vgpu_submission_ops as per engine ops 2018-02-06 11:40:59 -08:00
execlist.h drm/i915/gvt: Make elsp_dwords in the right order 2017-11-16 11:46:07 +08:00
fb_decoder.c drm/i915/gvt: Delete redundant error message in fb_decode.c 2018-03-30 14:47:19 +08:00
fb_decoder.h drm/i915/gvt: Add framebuffer decoder support 2017-12-04 11:24:33 +08:00
firmware.c drm/i915/gvt: Add mmio iterator intel_gvt_for_each_tracked_mmio() 2017-11-16 11:48:32 +08:00
gtt.c drm/i915/gvt: fix a bug of partially write ggtt enties 2018-07-02 11:09:38 +08:00
gtt.h drm/i915/gvt: fix a bug of partially write ggtt enties 2018-07-02 11:09:38 +08:00
gvt.c drm/i915/gvt: Provide generic page_track infrastructure for write-protected page 2018-03-06 13:19:20 +08:00
gvt.h drm/i915/gvt: Remove disable_warn_untrack and print untracked mmio with debug level 2018-05-14 05:18:54 +08:00
handlers.c Merge tag 'gvt-fixes-2018-04-19' of https://github.com/intel/gvt-linux into drm-intel-next-fixes 2018-06-07 12:06:07 +03:00
hypercall.h drm/i915/gvt: Fix guest vGPU hang caused by very high dma setup overhead 2018-03-06 13:19:27 +08:00
interrupt.c
interrupt.h
kvmgt.c Merge tag 'gvt-fixes-2018-04-19' of https://github.com/intel/gvt-linux into drm-intel-next-fixes 2018-06-07 12:06:07 +03:00
Makefile drm/i915/gvt: Provide generic page_track infrastructure for write-protected page 2018-03-06 13:19:20 +08:00
mmio_context.c drm/i915: Wrap engine->context_pin() and engine->context_unpin() 2018-04-30 16:01:13 +01:00
mmio_context.h drm/i915/gvt: init mmio by lri command in vgpu inhibit context 2018-03-06 13:19:23 +08:00
mmio.c treewide: Use array_size() in vzalloc() 2018-06-12 16:19:22 -07:00
mmio.h drm/i915/gvt: cleanup usage for typed mmio reg vs. offset 2017-12-22 16:33:03 +08:00
mpt.h drm/i915/gvt: Fix guest vGPU hang caused by very high dma setup overhead 2018-03-06 13:19:27 +08:00
opregion.c drm/i915/gvt: Use KVM r/w to access guest opregion 2018-02-06 11:41:34 -08:00
page_track.c drm/i915/gvt: Return error at the failure of finding page_track 2018-03-06 14:49:38 +08:00
page_track.h drm/i915/gvt: Provide generic page_track infrastructure for write-protected page 2018-03-06 13:19:20 +08:00
reg.h drm/i915/gvt: Use I915_GTT_PAGE_SIZE 2017-11-16 11:48:22 +08:00
sched_policy.c drm/i915/gvt: Update time slice more frequently 2018-04-23 13:09:32 +08:00
sched_policy.h drm/i915/gvt: Kick scheduler when new workload queued 2017-12-04 11:24:35 +08:00
scheduler.c Revert "drm/i915/gvt: set max priority for gvt context" 2018-05-14 05:26:09 +08:00
scheduler.h drm/i915/gvt: scan non-privileged batch buffer for debug purpose 2018-04-23 13:09:34 +08:00
trace_points.c
trace.h drm/i915/gvt: scan non-privileged batch buffer for debug purpose 2018-04-23 13:09:34 +08:00
vgpu.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00