All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/3] drm/i915: Fix VMA UAF on destroy against deactivate race
@ 2024-01-22 14:04 ` Janusz Krzysztofik
  0 siblings, 0 replies; 19+ messages in thread
From: Janusz Krzysztofik @ 2024-01-22 14:04 UTC (permalink / raw)
  To: intel-gfx
  Cc: Thomas Hellström, Chris Wilson, Andrzej Hajda, dri-devel,
	Daniel Vetter, Rodrigo Vivi, David Airlie, Nirmoy Das

Object debugging tools were sporadically reporting illegal attempts to
free a still active i915 VMA object when parking a GPU tile believed to be
idle.

[161.359441] ODEBUG: free active (active state 0) object: ffff88811643b958 object type: i915_active hint: __i915_vma_active+0x0/0x50 [i915]
[161.360082] WARNING: CPU: 5 PID: 276 at lib/debugobjects.c:514 debug_print_object+0x80/0xb0
...
[161.360304] CPU: 5 PID: 276 Comm: kworker/5:2 Not tainted 6.5.0-rc1-CI_DRM_13375-g003f860e5577+ #1
[161.360314] Hardware name: Intel Corporation Rocket Lake Client Platform/RocketLake S UDIMM 6L RVP, BIOS RKLSFWI1.R00.3173.A03.2204210138 04/21/2022
[161.360322] Workqueue: i915-unordered __intel_wakeref_put_work [i915]
[161.360592] RIP: 0010:debug_print_object+0x80/0xb0
...
[161.361347] debug_object_free+0xeb/0x110
[161.361362] i915_active_fini+0x14/0x130 [i915]
[161.361866] release_references+0xfe/0x1f0 [i915]
[161.362543] i915_vma_parked+0x1db/0x380 [i915]
[161.363129] __gt_park+0x121/0x230 [i915]
[161.363515] ____intel_wakeref_put_last+0x1f/0x70 [i915]

That has been tracked down to be happening when another thread is
deactivating the VMA inside __active_retire() helper, after the VMA's
active counter has been already decremented to 0, but before deactivation
of the VMA's object is reported to the object debugging tool.

There was an attempt to fix this issue on 2-tile Meteor Lake by acquiring
an extra wakeref for a Primary GT from i915_gem_do_execbuffer() -- see
commit f56fe3e91787 ("drm/i915: Fix a VMA UAF for multi-gt platform").
However, it occurred insufficient -- the issue was still reported by CI.
That wakeref was released on exit from i915_gem_do_execbuffer(), then
potentially before completion of the request and deactivation of its
associated VMAs.

I believe the issue was introduced by commit d93939730347 ("drm/i915:
Remove the vma refcount") which moved a call to i915_active_fini() from
a dropped i915_vma_release(), called on last put of the removed VMA kref,
to i915_vma_parked() processing path called on last put of a GT wakeref.
However, its visibility to the object debugging tool was suppressed by a
bug in i915_active that was fixed two weeks later with commit e92eb246feb9
("drm/i915/active: Fix missing debug object activation").

Fix the issue by getting a wakeref for the VMA's tile when activating it,
and putting that wakeref only after the VMA is deactivated.  However,
exclude global GTT from that processing path, otherwise the GPU never goes
idle.  Since __i915_vma_retire() may be called from atomic contexts, use
async variant of wakeref put.

Having that fixed, stop explicitly acquiring the extra GT0 wakeref from
inside i915_gem_do_execbuffer(), and also drop an extra call to
i915_active_wait(), introduced by commit 7a2280e8dcd2 ("drm/i915: Wait for
active retire before i915_active_fini()") as another insufficient fix for
this UAF race.

v4: Refresh on top of commit 5e4e06e4087e ("drm/i915: Track gt pm
    wakerefs") (Andi),
  - for more easy backporting, split out removal of former insufficient
    workarounds and move them to separate patches (Nirmoy).

Janusz Krzysztofik (3):
  drm/i915/vma: Fix UAF on destroy against retire race
  Manually revert "drm/i915: Fix a VMA UAF for multi-gt platform"
  Revert "drm/i915: Wait for active retire before i915_active_fini()"

 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 17 -----------
 drivers/gpu/drm/i915/i915_vma.c               | 28 +++++++++++++------
 drivers/gpu/drm/i915/i915_vma_types.h         |  1 +
 3 files changed, 20 insertions(+), 26 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2024-01-23 22:34 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-22 14:04 [PATCH v4 0/3] drm/i915: Fix VMA UAF on destroy against deactivate race Janusz Krzysztofik
2024-01-22 14:04 ` Janusz Krzysztofik
2024-01-22 14:04 ` [PATCH v4 1/3] drm/i915/vma: Fix UAF on destroy against retire race Janusz Krzysztofik
2024-01-22 14:04   ` Janusz Krzysztofik
2024-01-22 21:09   ` Rodrigo Vivi
2024-01-22 21:09     ` Rodrigo Vivi
2024-01-23 10:51     ` Janusz Krzysztofik
2024-01-23 10:51       ` Janusz Krzysztofik
2024-01-23 22:33       ` Rodrigo Vivi
2024-01-23 22:33         ` Rodrigo Vivi
2024-01-22 14:04 ` [PATCH v4 2/3] Manually revert "drm/i915: Fix a VMA UAF for multi-gt platform" Janusz Krzysztofik
2024-01-22 14:04   ` Janusz Krzysztofik
2024-01-22 21:13   ` Rodrigo Vivi
2024-01-22 21:13     ` Rodrigo Vivi
2024-01-22 14:04 ` [PATCH v4 3/3] Revert "drm/i915: Wait for active retire before i915_active_fini()" Janusz Krzysztofik
2024-01-22 14:04   ` Janusz Krzysztofik
2024-01-22 21:05 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Fix VMA UAF on destroy against deactivate race Patchwork
2024-01-22 21:05 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-01-22 21:23 ` ✗ Fi.CI.BAT: failure " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.