[Intel-gfx] [PATCH] drm/i915/gt: Acquire a GT wakeref for the breadcrumb interrupt
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Fri Dec 6 11:02:15 UTC 2019
On 05/12/2019 21:58, Chris Wilson wrote:
> Take a wakeref on the intel_gt specifically for the enabled breadcrumb
> interrupt so that we can safely process the mmio. If the intel_gt is
> already asleep by the time we try and setup the breadcrumb interrupt, by
> a process of elimination we know the request must have been completed
> and we can skip its enablement!
>
> <4> [1518.350005] Unclaimed write to register 0x220a8
> <4> [1518.350323] WARNING: CPU: 2 PID: 3685 at drivers/gpu/drm/i915/intel_uncore.c:1163 __unclaimed_reg_debug+0x40/0x50 [i915]
> <4> [1518.350393] Modules linked in: vgem snd_hda_codec_hdmi x86_pkg_temp_thermal i915 coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep snd_hda_core btusb cdc_ether btrtl usbnet btbcm btintel r8152 snd_pcm mii bluetooth ecdh_generic ecc i2c_hid pinctrl_sunrisepoint pinctrl_intel intel_lpss_pci prime_numbers [last unloaded: vgem]
> <4> [1518.350646] CPU: 2 PID: 3685 Comm: gem_exec_parse_ Tainted: G U 5.4.0-rc8-CI-CI_DRM_7490+ #1
> <4> [1518.350708] Hardware name: Google Caroline/Caroline, BIOS MrChromebox 08/27/2018
> <4> [1518.350946] RIP: 0010:__unclaimed_reg_debug+0x40/0x50 [i915]
> <4> [1518.350992] Code: 74 05 5b 5d 41 5c c3 45 84 e4 48 c7 c0 95 8d 47 a0 48 c7 c6 8b 8d 47 a0 48 0f 44 f0 89 ea 48 c7 c7 9e 8d 47 a0 e8 40 45 e3 e0 <0f> 0b 83 2d 27 4f 2a 00 01 5b 5d 41 5c c3 66 90 41 55 41 54 55 53
> <4> [1518.351100] RSP: 0018:ffffc900007f39c8 EFLAGS: 00010086
> <4> [1518.351140] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000006
> <4> [1518.351202] RDX: 0000000080000006 RSI: 0000000000000000 RDI: 00000000ffffffff
> <4> [1518.351249] RBP: 00000000000220a8 R08: 0000000000000000 R09: 0000000000000000
> <4> [1518.351296] R10: ffffc900007f3990 R11: ffffc900007f3868 R12: 0000000000000000
> <4> [1518.351342] R13: 00000000fefeffff R14: 0000000000000092 R15: ffff888155fea000
> <4> [1518.351391] FS: 00007fc255abfe40(0000) GS:ffff88817ab00000(0000) knlGS:0000000000000000
> <4> [1518.351445] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> <4> [1518.351485] CR2: 00007fc2554882d0 CR3: 0000000168ca2005 CR4: 00000000003606e0
> <4> [1518.351529] Call Trace:
> <4> [1518.351746] fwtable_write32+0x114/0x1d0 [i915]
> <4> [1518.351795] ? sync_file_alloc+0x80/0x80
> <4> [1518.352039] gen8_logical_ring_enable_irq+0x30/0x50 [i915]
> <4> [1518.352295] irq_enable.part.10+0x23/0x40 [i915]
> <4> [1518.352523] i915_request_enable_breadcrumb+0xb5/0x330 [i915]
> <4> [1518.352575] ? sync_file_alloc+0x80/0x80
> <4> [1518.352612] __dma_fence_enable_signaling+0x60/0x160
> <4> [1518.352653] ? sync_file_alloc+0x80/0x80
> <4> [1518.352685] dma_fence_add_callback+0x44/0xd0
> <4> [1518.352726] sync_file_poll+0x95/0xc0
> <4> [1518.352767] do_sys_poll+0x24d/0x570
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 22 +++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> index 55317081d48b..8a9facf4f3b6 100644
> --- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> @@ -28,6 +28,7 @@
>
> #include "i915_drv.h"
> #include "i915_trace.h"
> +#include "intel_gt_pm.h"
>
> static void irq_enable(struct intel_engine_cs *engine)
> {
> @@ -53,15 +54,17 @@ static void irq_disable(struct intel_engine_cs *engine)
>
> static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b)
> {
> + struct intel_engine_cs *engine =
> + container_of(b, struct intel_engine_cs, breadcrumbs);
> +
> lockdep_assert_held(&b->irq_lock);
>
> GEM_BUG_ON(!b->irq_enabled);
> if (!--b->irq_enabled)
> - irq_disable(container_of(b,
> - struct intel_engine_cs,
> - breadcrumbs));
> + irq_disable(engine);
>
> b->irq_armed = false;
> + intel_gt_pm_put_async(engine->gt);
> }
>
> void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine)
> @@ -207,14 +210,17 @@ static void signal_irq_work(struct irq_work *work)
> intel_engine_breadcrumbs_irq(engine);
> }
>
> -static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
> +static bool __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
> {
> struct intel_engine_cs *engine =
> container_of(b, struct intel_engine_cs, breadcrumbs);
>
> lockdep_assert_held(&b->irq_lock);
> if (b->irq_armed)
> - return;
> + return true;
> +
> + if (!intel_gt_pm_get_if_awake(engine->gt))
> + return false;
>
> /*
> * The breadcrumb irq will be disarmed on the interrupt after the
> @@ -234,6 +240,8 @@ static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
>
> if (!b->irq_enabled++)
> irq_enable(engine);
> +
> + return true;
> }
>
> void intel_engine_init_breadcrumbs(struct intel_engine_cs *engine)
> @@ -277,7 +285,8 @@ bool i915_request_enable_breadcrumb(struct i915_request *rq)
> spin_lock(&b->irq_lock);
> GEM_BUG_ON(test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags));
>
> - __intel_breadcrumbs_arm_irq(b);
> + if (!__intel_breadcrumbs_arm_irq(b))
> + goto unlock;
>
> /*
> * We keep the seqno in retirement order, so we can break
> @@ -306,6 +315,7 @@ bool i915_request_enable_breadcrumb(struct i915_request *rq)
> GEM_BUG_ON(!check_signal_order(ce, rq));
>
> set_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
> +unlock:
> spin_unlock(&b->irq_lock);
> }
>
>
Any special reason not to do PM management on the engine rather than GT?
Regards,
Tvrtko
More information about the Intel-gfx
mailing list