Nouveau Archive mirror
 help / color / mirror / Atom feed
From: Danilo Krummrich <me@dakr.org>
To: Dave Airlie <airlied@gmail.com>
Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH] nouveau: fix instmem race condition around ptr stores
Date: Mon, 15 Apr 2024 11:06:24 +0200	[thread overview]
Message-ID: <b3121ea0-b0b1-4688-a533-7e19f6838c54@dakr.org> (raw)
In-Reply-To: <20240411011510.2546857-1-airlied@gmail.com>

On 4/11/24 03:15, Dave Airlie wrote:
> From: Dave Airlie <airlied@redhat.com>
> 
> Running a lot of VK CTS in parallel against nouveau, once every
> few hours you might see something like this crash.
> 
> BUG: kernel NULL pointer dereference, address: 0000000000000008
> PGD 8000000114e6e067 P4D 8000000114e6e067 PUD 109046067 PMD 0
> Oops: 0000 [#1] PREEMPT SMP PTI
> CPU: 7 PID: 53891 Comm: deqp-vk Not tainted 6.8.0-rc6+ #27
> Hardware name: Gigabyte Technology Co., Ltd. Z390 I AORUS PRO WIFI/Z390 I AORUS PRO WIFI-CF, BIOS F8 11/05/2021
> RIP: 0010:gp100_vmm_pgt_mem+0xe3/0x180 [nouveau]
> Code: c7 48 01 c8 49 89 45 58 85 d2 0f 84 95 00 00 00 41 0f b7 46 12 49 8b 7e 08 89 da 42 8d 2c f8 48 8b 47 08 41 83 c7 01 48 89 ee <48> 8b 40 08 ff d0 0f 1f 00 49 8b 7e 08 48 89 d9 48 8d 75 04 48 c1
> RSP: 0000:ffffac20c5857838 EFLAGS: 00010202
> RAX: 0000000000000000 RBX: 00000000004d8001 RCX: 0000000000000001
> RDX: 00000000004d8001 RSI: 00000000000006d8 RDI: ffffa07afe332180
> RBP: 00000000000006d8 R08: ffffac20c5857ad0 R09: 0000000000ffff10
> R10: 0000000000000001 R11: ffffa07af27e2de0 R12: 000000000000001c
> R13: ffffac20c5857ad0 R14: ffffa07a96fe9040 R15: 000000000000001c
> FS:  00007fe395eed7c0(0000) GS:ffffa07e2c980000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000008 CR3: 000000011febe001 CR4: 00000000003706f0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> Call Trace:
> 
> ...
> 
>   ? gp100_vmm_pgt_mem+0xe3/0x180 [nouveau]
>   ? gp100_vmm_pgt_mem+0x37/0x180 [nouveau]
>   nvkm_vmm_iter+0x351/0xa20 [nouveau]
>   ? __pfx_nvkm_vmm_ref_ptes+0x10/0x10 [nouveau]
>   ? __pfx_gp100_vmm_pgt_mem+0x10/0x10 [nouveau]
>   ? __pfx_gp100_vmm_pgt_mem+0x10/0x10 [nouveau]
>   ? __lock_acquire+0x3ed/0x2170
>   ? __pfx_gp100_vmm_pgt_mem+0x10/0x10 [nouveau]
>   nvkm_vmm_ptes_get_map+0xc2/0x100 [nouveau]
>   ? __pfx_nvkm_vmm_ref_ptes+0x10/0x10 [nouveau]
>   ? __pfx_gp100_vmm_pgt_mem+0x10/0x10 [nouveau]
>   nvkm_vmm_map_locked+0x224/0x3a0 [nouveau]
> 
> Adding any sort of useful debug usually makes it go away, so I hand
> wrote the function in a line, and debugged the asm.
> 
> Every so often pt->memory->ptrs is NULL. This ptrs ptr is set in
> the nv50_instobj_acquire called from nvkm_kmap.
> 
> If Thread A and Thread B both get to nv50_instobj_acquire around
> the same time, and Thread A hits the refcount_set line, and in
> lockstep thread B succeeds at refcount_inc_not_zero, there is a
> chance the ptrs value won't have been stored since refcount_set
> is unordered. Force a memory barrier here, I picked smp_mb, since
> we want it on all CPUs and it's write followed by a read.
> 
> v2: use paired smp_rmb/smp_wmb.
> 
> Cc: linux-stable
> Signed-off-by: Dave Airlie <airlied@redhat.com>

Added a "Fixes:" tag and applied to drm-misc-fixes.

> ---
>   drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
> index a7f3fc342d87..dd5b5a17ece0 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
> @@ -222,8 +222,11 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
>   	void __iomem *map = NULL;
>   
>   	/* Already mapped? */
> -	if (refcount_inc_not_zero(&iobj->maps))
> +	if (refcount_inc_not_zero(&iobj->maps)) {
> +		/* read barrier match the wmb on refcount set */
> +		smp_rmb();
>   		return iobj->map;
> +	}
>   
>   	/* Take the lock, and re-check that another thread hasn't
>   	 * already mapped the object in the meantime.
> @@ -250,6 +253,8 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
>   			iobj->base.memory.ptrs = &nv50_instobj_fast;
>   		else
>   			iobj->base.memory.ptrs = &nv50_instobj_slow;
> +		/* barrier to ensure the ptrs are written before refcount is set */
> +		smp_wmb();
>   		refcount_set(&iobj->maps, 1);
>   	}
>   

  reply	other threads:[~2024-04-15  9:06 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-11  1:15 [PATCH] nouveau: fix instmem race condition around ptr stores Dave Airlie
2024-04-15  9:06 ` Danilo Krummrich [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-04-09  0:34 Dave Airlie
2024-04-09  8:27 ` Lucas Stach
2024-04-09 11:33   ` Danilo Krummrich
2024-04-09 19:37     ` Dave Airlie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b3121ea0-b0b1-4688-a533-7e19f6838c54@dakr.org \
    --to=me@dakr.org \
    --cc=airlied@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=nouveau@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).