diff options
author | Michael Stokes <mjstokes@google.com> | 2023-06-01 11:59:57 +0200 |
---|---|---|
committer | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2023-06-15 17:38:40 +0000 |
commit | a26b51ecfb9ac6fb8fa5b1998c7c1896ab5b1478 (patch) | |
tree | 107b6d0aa850bf36a49c23c11354600341d00aa7 /mali_kbase | |
parent | 9f1798282259b99011ba7a837d1555ebd05a0341 (diff) | |
download | gpu-a26b51ecfb9ac6fb8fa5b1998c7c1896ab5b1478.tar.gz |
Add missing hwaccess_lock around atom_flags updates.
Commit 0935897 (pa/1761483) added two additional katom flags, but
updates to these new flags were not protected by hwaccess_lock, and
could thus race with other updates and ultimately corrupt atom_flags.
Bug: 265931966
Test: SST soak test
Change-Id: I95acc5e335d8013394b11149abf5d9b793648c6f
Diffstat (limited to 'mali_kbase')
-rw-r--r-- | mali_kbase/mali_kbase_jd.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/mali_kbase/mali_kbase_jd.c b/mali_kbase/mali_kbase_jd.c index 8667819..66064ec 100644 --- a/mali_kbase/mali_kbase_jd.c +++ b/mali_kbase/mali_kbase_jd.c @@ -762,10 +762,13 @@ static void jd_mark_simple_gfx_frame_atoms(struct kbase_jd_atom *katom) } if (dep_fence && dep_vtx) { + unsigned long flags; dev_dbg(kbdev->dev, "Simple gfx frame: {vtx=%pK, wait=%pK}->frag=%pK\n", dep_vtx, dep_fence, katom); + spin_lock_irqsave(&kbdev->hwaccess_lock, flags); katom->atom_flags |= KBASE_KATOM_FLAG_SIMPLE_FRAME_FRAGMENT; dep_vtx->atom_flags |= KBASE_KATOM_FLAG_DEFER_WHILE_POWEROFF; + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); } } @@ -839,14 +842,15 @@ bool kbase_jd_done_nolock(struct kbase_jd_atom *katom, bool post_immediately) dev_dbg(kctx->kbdev->dev, "Simple-frame fragment atom %pK unblocked\n", node); - node->atom_flags &= - ~KBASE_KATOM_FLAG_SIMPLE_FRAME_FRAGMENT; for (i = 0; i < 2; i++) { if (node->dep[i].atom && node->dep[i].atom->atom_flags & KBASE_KATOM_FLAG_DEFER_WHILE_POWEROFF) { + unsigned long flags; + spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, flags); node->dep[i].atom->atom_flags &= ~KBASE_KATOM_FLAG_DEFER_WHILE_POWEROFF; + spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags); dev_dbg(kctx->kbdev->dev, " Undeferred atom %pK\n", node->dep[i].atom); |