[PATCH] drm/i915/kvmgt: fix suspicious rcu dereference usage

Jike Song jike.song at intel.com
Wed Mar 15 09:04:20 UTC 2017


On 03/13/2017 05:01 PM, Zhenyu Wang wrote:
> 
> On 2017.03.13 16:44:33 +0800, changbin.du at intel.com wrote:
>> From: Changbin Du <changbin.du at intel.com>
>>
> 
> I'm cc Guangrong to confirm kvm lock for this.
> 
>> 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

Reviewed-by: Jike Song <jike.song at intel.com>

--
Thanks,
Jike

>>
>> Signed-off-by: Changbin Du <changbin.du at intel.com>
>> Cc: stable at kernel.org
>> ---
>>  drivers/gpu/drm/i915/gvt/kvmgt.c | 4 +++-
>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> index 84d8016..81402f0 100644
>> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
>> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> @@ -1417,7 +1417,7 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
>>  {
>>  	struct kvmgt_guest_info *info;
>>  	struct kvm *kvm;
>> -	int ret;
>> +	int idx, ret;
>>  	bool kthread = current->mm == NULL;
>>  
>>  	if (!handle_valid(handle))
>> @@ -1429,8 +1429,10 @@ static int kvmgt_rw_gpa(unsigned long handle, unsigned long gpa,
>>  	if (kthread)
>>  		use_mm(kvm->mm);
>>  
>> +	idx = srcu_read_lock(&kvm->srcu);
>>  	ret = write ? kvm_write_guest(kvm, gpa, buf, len) :
>>  		      kvm_read_guest(kvm, gpa, buf, len);
>> +	srcu_read_unlock(&kvm->srcu, idx);
>>  
>>  	if (kthread)
>>  		unuse_mm(kvm->mm);
>> -- 
>> 2.7.4
>>
>> _______________________________________________
>> intel-gvt-dev mailing list
>> intel-gvt-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
> 
> 
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
> 


More information about the intel-gvt-dev mailing list