[PATCH] drm/i915/gvt: request srcu_read_lock before checking if one gfn is valid

Zhenyu Wang zhenyuw at linux.intel.com
Thu Sep 13 08:33:06 UTC 2018


On 2018.09.13 13:44:10 +0800, Weinan Li wrote:
> Fix the suspicious RCU usage issue in intel_vgpu_emulate_mmio_write.
> Here need to request the srcu read lock of kvm->srcu before doing
> gfn_to_memslot(). The detailed log is as below:
> [  218.710688] =============================
> [  218.710690] WARNING: suspicious RCU usage
> [  218.710693] 4.14.15-dd+ #314 Tainted: G     U
> [  218.710695] -----------------------------
> [  218.710697] ./include/linux/kvm_host.h:575 suspicious
> rcu_dereference_check() usage!
> [  218.710699]
>                other info that might help us debug this:
> 
> [  218.710702]
>                rcu_scheduler_active = 2, debug_locks = 1
> [  218.710704] 1 lock held by qemu-system-x86/2144:
> [  218.710706]  #0:  (&gvt->lock){+.+.}, at: [<ffffffff816a1eea>]
> intel_vgpu_emulate_mmio_write+0x5a/0x2d0
> [  218.710721]
>                stack backtrace:
> [  218.710724] CPU: 0 PID: 2144 Comm: qemu-system-x86 Tainted: G     U
> 4.14.15-dd+ #314

log format is a little corruptted, could you fix that?

> [  218.710727] Hardware name: Dell Inc. OptiPlex 7040/0Y7WYT, BIOS 1.1.1
> 10/07/2015
> [  218.710729] Call Trace:
> [  218.710734]  dump_stack+0x7c/0xb3
> [  218.710739]  gfn_to_memslot+0x15f/0x170
> [  218.710743]  kvm_is_visible_gfn+0xa/0x30
> [  218.710746]  intel_vgpu_emulate_gtt_mmio_write+0x267/0x3c0
> [  218.710751]  ? __mutex_unlock_slowpath+0x3b/0x260
> [  218.710754]  intel_vgpu_emulate_mmio_write+0x182/0x2d0
> [  218.710759]  intel_vgpu_rw+0xba/0x170 [kvmgt]
> [  218.710763]  intel_vgpu_write+0x14d/0x1a0 [kvmgt]
> [  218.710767]  __vfs_write+0x23/0x130
> [  218.710770]  vfs_write+0xb0/0x1b0
> [  218.710774]  SyS_pwrite64+0x73/0x90
> [  218.710777]  entry_SYSCALL_64_fastpath+0x25/0x9c
> [  218.710780] RIP: 0033:0x7f33e8a91da3
> [  218.710783] RSP: 002b:00007f33dddc8700 EFLAGS: 00000293
>

Fixes tag?

> Signed-off-by: Weinan Li <weinan.z.li at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/kvmgt.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> index b755728..c107214 100644
> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> @@ -1833,6 +1833,8 @@ static bool kvmgt_is_valid_gfn(unsigned long handle, unsigned long gfn)
>  {
>  	struct kvmgt_guest_info *info;
>  	struct kvm *kvm;
> +	int idx;
> +	bool ret;
>  
>  	if (!handle_valid(handle))
>  		return false;
> @@ -1840,8 +1842,11 @@ static bool kvmgt_is_valid_gfn(unsigned long handle, unsigned long gfn)
>  	info = (struct kvmgt_guest_info *)handle;
>  	kvm = info->kvm;
>  
> -	return kvm_is_visible_gfn(kvm, gfn);
> +	idx = srcu_read_lock(&kvm->srcu);
> +	ret = kvm_is_visible_gfn(kvm, gfn);
> +	srcu_read_unlock(&kvm->srcu, idx);
>  
> +	return ret;

Looks right to me, thanks to catch this!

>  }
>  
>  struct intel_gvt_mpt kvmgt_mpt = {
> -- 
> 1.9.1
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20180913/72f53df9/attachment.sig>


More information about the intel-gvt-dev mailing list