aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChangbin Du <changbin.du@intel.com>2017-03-15 21:45:09 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-03-17 04:46:45 -0400
commit5180edc2421117766fcb9c2d2dc6bfaeefdeb709 (patch)
tree5f53bef16fcbfcc50dd25e1dcacd33c84b4c8cce /drivers/gpu/drm/i915
parentcf2135ca3d50d6468e9216fef3d0d33c31af635b (diff)
drm/i915/kvmgt: fix suspicious rcu dereference usage
The srcu read lock must be held while accessing kvm memslots. This patch fix below warning for function kvmgt_rw_gpa(). [ 165.345093] [ ERR: suspicious RCU usage. ] [ 165.416538] Call Trace: [ 165.418989] dump_stack+0x85/0xc2 [ 165.422310] lockdep_rcu_suspicious+0xd7/0x110 [ 165.426769] kvm_read_guest_page+0x195/0x1b0 [kvm] [ 165.431574] kvm_read_guest+0x50/0x90 [kvm] [ 165.440492] kvmgt_rw_gpa+0x43/0xa0 [kvmgt] [ 165.444683] kvmgt_read_gpa+0x11/0x20 [kvmgt] [ 165.449061] gtt_get_entry64+0x4d/0xc0 [i915] [ 165.453438] ppgtt_populate_shadow_page_by_guest_entry+0x380/0xdc0 [i915] [ 165.460254] shadow_mm+0xd1/0x460 [i915] [ 165.472488] intel_vgpu_create_mm+0x1ab/0x210 [i915] [ 165.477472] intel_vgpu_g2v_create_ppgtt_mm+0x5f/0xc0 [i915] [ 165.483154] pvinfo_mmio_write+0x19b/0x1d0 [i915] [ 165.499068] intel_vgpu_emulate_mmio_write+0x3f9/0x600 [i915] [ 165.504827] intel_vgpu_rw+0x114/0x150 [kvmgt] [ 165.509281] intel_vgpu_write+0x16f/0x1a0 [kvmgt] [ 165.513993] vfio_mdev_write+0x20/0x30 [vfio_mdev] [ 165.518793] vfio_device_fops_write+0x24/0x30 [vfio] [ 165.523770] __vfs_write+0x28/0x120 [ 165.540529] vfs_write+0xce/0x1f0 v2: fix Cc format for stable Signed-off-by: Changbin Du <changbin.du@intel.com> Cc: <stable@vger.kernel.org> # v4.10+ Reviewed-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> Reviewed-by: Jike Song <jike.song@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/gvt/kvmgt.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
index cd218b07c6f6..1ea3eb270de8 100644
--- a/drivers/gpu/drm/i915/gvt/kvmgt.c
+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
@@ -1424,7 +1424,7 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
1424{ 1424{
1425 struct kvmgt_guest_info *info; 1425 struct kvmgt_guest_info *info;
1426 struct kvm *kvm; 1426 struct kvm *kvm;
1427 int ret; 1427 int idx, ret;
1428 bool kthread = current->mm == NULL; 1428 bool kthread = current->mm == NULL;
1429 1429
1430 if (!handle_valid(handle)) 1430 if (!handle_valid(handle))
@@ -1436,8 +1436,10 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
1436 if (kthread) 1436 if (kthread)
1437 use_mm(kvm->mm); 1437 use_mm(kvm->mm);
1438 1438
1439 idx = srcu_read_lock(&kvm->srcu);
1439 ret = write ? kvm_write_guest(kvm, gpa, buf, len) : 1440 ret = write ? kvm_write_guest(kvm, gpa, buf, len) :
1440 kvm_read_guest(kvm, gpa, buf, len); 1441 kvm_read_guest(kvm, gpa, buf, len);
1442 srcu_read_unlock(&kvm->srcu, idx);
1441 1443
1442 if (kthread) 1444 if (kthread)
1443 unuse_mm(kvm->mm); 1445 unuse_mm(kvm->mm);