Commit 3f5f5d53 authored by Rodrigo Vivi's avatar Rodrigo Vivi

Merge tag 'gvt-fixes-2019-04-11' of https://github.com/intel/gvt-linux into drm-intel-fixes

gvt-fixes-2019-04-11

- Fix sparse warning on iomem usage (Chris)
- Prevent use-after-free for ppgtt shadow table free (Chris)
- Fix display plane size regression for tiled surface (Xiong)
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
From: Zhenyu Wang <zhenyuw@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190411064910.GF17995@zhen-hp.sh.intel.com
parents 21635d73 cd7879f7
...@@ -209,7 +209,7 @@ static int vgpu_get_plane_info(struct drm_device *dev, ...@@ -209,7 +209,7 @@ static int vgpu_get_plane_info(struct drm_device *dev,
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct intel_vgpu_primary_plane_format p; struct intel_vgpu_primary_plane_format p;
struct intel_vgpu_cursor_plane_format c; struct intel_vgpu_cursor_plane_format c;
int ret; int ret, tile_height = 1;
if (plane_id == DRM_PLANE_TYPE_PRIMARY) { if (plane_id == DRM_PLANE_TYPE_PRIMARY) {
ret = intel_vgpu_decode_primary_plane(vgpu, &p); ret = intel_vgpu_decode_primary_plane(vgpu, &p);
...@@ -228,12 +228,15 @@ static int vgpu_get_plane_info(struct drm_device *dev, ...@@ -228,12 +228,15 @@ static int vgpu_get_plane_info(struct drm_device *dev,
break; break;
case PLANE_CTL_TILED_X: case PLANE_CTL_TILED_X:
info->drm_format_mod = I915_FORMAT_MOD_X_TILED; info->drm_format_mod = I915_FORMAT_MOD_X_TILED;
tile_height = 8;
break; break;
case PLANE_CTL_TILED_Y: case PLANE_CTL_TILED_Y:
info->drm_format_mod = I915_FORMAT_MOD_Y_TILED; info->drm_format_mod = I915_FORMAT_MOD_Y_TILED;
tile_height = 32;
break; break;
case PLANE_CTL_TILED_YF: case PLANE_CTL_TILED_YF:
info->drm_format_mod = I915_FORMAT_MOD_Yf_TILED; info->drm_format_mod = I915_FORMAT_MOD_Yf_TILED;
tile_height = 32;
break; break;
default: default:
gvt_vgpu_err("invalid tiling mode: %x\n", p.tiled); gvt_vgpu_err("invalid tiling mode: %x\n", p.tiled);
...@@ -264,8 +267,8 @@ static int vgpu_get_plane_info(struct drm_device *dev, ...@@ -264,8 +267,8 @@ static int vgpu_get_plane_info(struct drm_device *dev,
return -EINVAL; return -EINVAL;
} }
info->size = (info->stride * info->height + PAGE_SIZE - 1) info->size = (info->stride * roundup(info->height, tile_height)
>> PAGE_SHIFT; + PAGE_SIZE - 1) >> PAGE_SHIFT;
if (info->size == 0) { if (info->size == 0) {
gvt_vgpu_err("fb size is zero\n"); gvt_vgpu_err("fb size is zero\n");
return -EINVAL; return -EINVAL;
......
...@@ -750,14 +750,20 @@ static void ppgtt_free_spt(struct intel_vgpu_ppgtt_spt *spt) ...@@ -750,14 +750,20 @@ static void ppgtt_free_spt(struct intel_vgpu_ppgtt_spt *spt)
static void ppgtt_free_all_spt(struct intel_vgpu *vgpu) static void ppgtt_free_all_spt(struct intel_vgpu *vgpu)
{ {
struct intel_vgpu_ppgtt_spt *spt; struct intel_vgpu_ppgtt_spt *spt, *spn;
struct radix_tree_iter iter; struct radix_tree_iter iter;
void **slot; LIST_HEAD(all_spt);
void __rcu **slot;
rcu_read_lock();
radix_tree_for_each_slot(slot, &vgpu->gtt.spt_tree, &iter, 0) { radix_tree_for_each_slot(slot, &vgpu->gtt.spt_tree, &iter, 0) {
spt = radix_tree_deref_slot(slot); spt = radix_tree_deref_slot(slot);
ppgtt_free_spt(spt); list_move(&spt->post_shadow_list, &all_spt);
} }
rcu_read_unlock();
list_for_each_entry_safe(spt, spn, &all_spt, post_shadow_list)
ppgtt_free_spt(spt);
} }
static int ppgtt_handle_guest_write_page_table_bytes( static int ppgtt_handle_guest_write_page_table_bytes(
......
...@@ -905,7 +905,7 @@ static inline bool intel_vgpu_in_aperture(struct intel_vgpu *vgpu, u64 off) ...@@ -905,7 +905,7 @@ static inline bool intel_vgpu_in_aperture(struct intel_vgpu *vgpu, u64 off)
static int intel_vgpu_aperture_rw(struct intel_vgpu *vgpu, u64 off, static int intel_vgpu_aperture_rw(struct intel_vgpu *vgpu, u64 off,
void *buf, unsigned long count, bool is_write) void *buf, unsigned long count, bool is_write)
{ {
void *aperture_va; void __iomem *aperture_va;
if (!intel_vgpu_in_aperture(vgpu, off) || if (!intel_vgpu_in_aperture(vgpu, off) ||
!intel_vgpu_in_aperture(vgpu, off + count)) { !intel_vgpu_in_aperture(vgpu, off + count)) {
...@@ -920,9 +920,9 @@ static int intel_vgpu_aperture_rw(struct intel_vgpu *vgpu, u64 off, ...@@ -920,9 +920,9 @@ static int intel_vgpu_aperture_rw(struct intel_vgpu *vgpu, u64 off,
return -EIO; return -EIO;
if (is_write) if (is_write)
memcpy(aperture_va + offset_in_page(off), buf, count); memcpy_toio(aperture_va + offset_in_page(off), buf, count);
else else
memcpy(buf, aperture_va + offset_in_page(off), count); memcpy_fromio(buf, aperture_va + offset_in_page(off), count);
io_mapping_unmap(aperture_va); io_mapping_unmap(aperture_va);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment