Skip to content

Commit f691eaa

Browse files
icklejnikula
authored andcommitted
drm/i915/gtt: Defer the free for alloc error paths
If we hit an error while allocating the page tables, we have to unwind the incomplete updates, and wish to free the unused pd. However, we are not allowed to be hoding the spinlock at that point, and so must use the later free to defer it until after we drop the lock. <3> [414.363795] BUG: sleeping function called from invalid context at drivers/gpu/drm/i915/i915_gem_gtt.c:472 <3> [414.364167] in_atomic(): 1, irqs_disabled(): 0, pid: 3905, name: i915_selftest <4> [414.364406] 3 locks held by i915_selftest/3905: <4> [414.364408] #0: 0000000034fe8aa8 (&dev->mutex){....}, at: device_driver_attach+0x18/0x50 <4> [414.364415] #1: 000000006bd8a560 (&dev->struct_mutex){+.+.}, at: igt_ctx_exec+0xb7/0x410 [i915] <4> [414.364476] #2: 000000003dfdc766 (&(&pd->lock)->rlock){+.+.}, at: gen8_ppgtt_alloc_pdp+0x448/0x540 [i915] <3> [414.364529] Preemption disabled at: <4> [414.364530] [<0000000000000000>] 0x0 <4> [414.364696] CPU: 0 PID: 3905 Comm: i915_selftest Tainted: G U 5.2.0-rc7-CI-CI_DRM_6403+ #1 <4> [414.364698] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014 <4> [414.364699] Call Trace: <4> [414.364704] dump_stack+0x67/0x9b <4> [414.364708] ___might_sleep+0x167/0x250 <4> [414.364777] vm_free_page+0x24/0xc0 [i915] <4> [414.364852] free_pd+0xf/0x20 [i915] <4> [414.364897] gen8_ppgtt_alloc_pdp+0x489/0x540 [i915] <4> [414.364946] gen8_ppgtt_alloc_4lvl+0x8e/0x2e0 [i915] <4> [414.364992] ppgtt_bind_vma+0x2e/0x60 [i915] <4> [414.365039] i915_vma_bind+0xe8/0x2c0 [i915] <4> [414.365088] __i915_vma_do_pin+0xa1/0xd20 [i915] Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111050 Fixes: 1d1b549 ("drm/i915/gtt: Replace struct_mutex serialisation for allocation") Signed-off-by: Chris Wilson <[email protected]> Cc: Matthew Auld <[email protected]> Cc: Mika Kuoppala <[email protected]> Reviewed-by: Mika Kuoppala <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 0686108) Signed-off-by: Jani Nikula <[email protected]>
1 parent d1b739f commit f691eaa

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/gpu/drm/i915/i915_gem_gtt.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,7 +1446,8 @@ static int gen8_ppgtt_alloc_pdp(struct i915_address_space *vm,
14461446
gen8_ppgtt_set_pdpe(pdp, vm->scratch_pd, pdpe);
14471447
GEM_BUG_ON(!atomic_read(&pdp->used));
14481448
atomic_dec(&pdp->used);
1449-
free_pd(vm, pd);
1449+
GEM_BUG_ON(alloc);
1450+
alloc = pd; /* defer the free to after the lock */
14501451
}
14511452
spin_unlock(&pdp->lock);
14521453
unwind:
@@ -1515,7 +1516,8 @@ static int gen8_ppgtt_alloc_4lvl(struct i915_address_space *vm,
15151516
spin_lock(&pml4->lock);
15161517
if (atomic_dec_and_test(&pdp->used)) {
15171518
gen8_ppgtt_set_pml4e(pml4, vm->scratch_pdp, pml4e);
1518-
free_pd(vm, pdp);
1519+
GEM_BUG_ON(alloc);
1520+
alloc = pdp; /* defer the free until after the lock */
15191521
}
15201522
spin_unlock(&pml4->lock);
15211523
unwind:

0 commit comments

Comments
 (0)