| From 523cff95d9870c813a3f744a0cadd8ce36e5092b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 29 Jul 2021 17:19:54 -0400 |
| Subject: drm/amdgpu: fix fdinfo race with process exit |
| |
| From: Philip Yang <Philip.Yang@amd.com> |
| |
| [ Upstream commit d7eff46c214c036606dd3cd305bd5a128aecfe8c ] |
| |
| Get process vm root BO ref in case process is exiting and root BO is |
| freed, to avoid NULL pointer dereference backtrace: |
| |
| BUG: unable to handle kernel NULL pointer dereference at |
| 0000000000000000 |
| Call Trace: |
| amdgpu_show_fdinfo+0xfe/0x2a0 [amdgpu] |
| seq_show+0x12c/0x180 |
| seq_read+0x153/0x410 |
| vfs_read+0x91/0x140[ 3427.206183] ksys_read+0x4f/0xb0 |
| do_syscall_64+0x5b/0x1a0 |
| entry_SYSCALL_64_after_hwframe+0x65/0xca |
| |
| Signed-off-by: Philip Yang <Philip.Yang@amd.com> |
| Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c |
| index d94c5419ec25..5a6857c44bb6 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c |
| @@ -59,6 +59,7 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f) |
| uint64_t vram_mem = 0, gtt_mem = 0, cpu_mem = 0; |
| struct drm_file *file = f->private_data; |
| struct amdgpu_device *adev = drm_to_adev(file->minor->dev); |
| + struct amdgpu_bo *root; |
| int ret; |
| |
| ret = amdgpu_file_to_fpriv(f, &fpriv); |
| @@ -69,13 +70,19 @@ void amdgpu_show_fdinfo(struct seq_file *m, struct file *f) |
| dev = PCI_SLOT(adev->pdev->devfn); |
| fn = PCI_FUNC(adev->pdev->devfn); |
| |
| - ret = amdgpu_bo_reserve(fpriv->vm.root.bo, false); |
| + root = amdgpu_bo_ref(fpriv->vm.root.bo); |
| + if (!root) |
| + return; |
| + |
| + ret = amdgpu_bo_reserve(root, false); |
| if (ret) { |
| DRM_ERROR("Fail to reserve bo\n"); |
| return; |
| } |
| amdgpu_vm_get_memory(&fpriv->vm, &vram_mem, >t_mem, &cpu_mem); |
| - amdgpu_bo_unreserve(fpriv->vm.root.bo); |
| + amdgpu_bo_unreserve(root); |
| + amdgpu_bo_unref(&root); |
| + |
| seq_printf(m, "pdev:\t%04x:%02x:%02x.%d\npasid:\t%u\n", domain, bus, |
| dev, fn, fpriv->vm.pasid); |
| seq_printf(m, "vram mem:\t%llu kB\n", vram_mem/1024UL); |
| -- |
| 2.33.0 |
| |