diff mbox series

[03/10] drm/i915/icl: No need to early bailout on interrupt

Message ID 20180920143350.29249-4-mika.kuoppala@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series ICL interrupt handling improvements | expand

Commit Message

Mika Kuoppala Sept. 20, 2018, 2:33 p.m. UTC
Getting interrupt without any second level indications
is unlikely. So there is no real advantage to bailout early
as all the second level handlers can handle empty master
control status.

Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

Comments

Chris Wilson Sept. 20, 2018, 2:55 p.m. UTC | #1
Quoting Mika Kuoppala (2018-09-20 15:33:43)
> Getting interrupt without any second level indications
> is unlikely. So there is no real advantage to bailout early
> as all the second level handlers can handle empty master
> control status.
> 
> Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>

Looks reasonable,
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
Daniele Ceraolo Spurio Sept. 20, 2018, 4:11 p.m. UTC | #2
On 20/09/18 07:33, Mika Kuoppala wrote:
> Getting interrupt without any second level indications
> is unlikely.

Do you have any numbers for this? I remember seeing empty interrupts 
quite often (i.e. up to 5-10%) in early testing on workloads submitting 
lots of no-ops due to the double buffering, when both events ended up 
being serviced by the first interrupt. The code was different at the 
time though, so those might just have been due to less optimal SW 
handing, but I'd be curious to see the numbers if you have any.

Thanks,
Daniele
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 1e05ffe16816..27395a90bbef 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3134,10 +3134,6 @@  static irqreturn_t gen11_irq_handler(int irq, void *arg)
 	raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
 
 	master_ctl = raw_reg_read(regs, GEN11_GFX_MSTR_IRQ) & ~GEN11_MASTER_IRQ;
-	if (!master_ctl) {
-		raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
-		return IRQ_NONE;
-	}
 
 	/* Find, clear, then process each source of interrupt. */
 	gen11_gt_irq_handler(i915, master_ctl);
@@ -3162,7 +3158,7 @@  static irqreturn_t gen11_irq_handler(int irq, void *arg)
 
 	gen11_gu_misc_irq_handler(i915, master_ctl, gu_misc_iir);
 
-	return IRQ_HANDLED;
+	return master_ctl ? IRQ_HANDLED : IRQ_NONE;
 }
 
 static void i915_reset_device(struct drm_i915_private *dev_priv,