Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <dev@lankhorst.se>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org, Maarten Lankhorst <dev@lankhorst.se>
Subject: [PATCH v9 29/30] drm/i915/pmu: Convert to raw spinlock
Date: Mon, 22 Jun 2026 20:10:42 +0200	[thread overview]
Message-ID: <20260622181044.39335-30-dev@lankhorst.se> (raw)
In-Reply-To: <20260622181044.39335-1-dev@lankhorst.se>

The pmu lock needs to be a raw spinlock, because cpuctx->lock from perf
is a raw spinlock too, and otherwise you get the below splat:

<3> [133.631044] BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
<3> [133.631048] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/0
<3> [133.631049] preempt_count: 2, expected: 0
<3> [133.631050] RCU nest depth: 0, expected: 0
<4> [133.631051] 2 locks held by swapper/0/0:
<4> [133.631053]  #0: ffff88845d62e178 (&cpuctx_lock){....}-{2:2}, at: __perf_install_in_context+0x3f/0x390
<4> [133.631062]  #1: ffff88813d822200 (&pmu->lock){+.+.}-{2:2}, at: i915_pmu_enable+0x48/0x390 [i915]
<4> [133.631263] irq event stamp: 8368282
<4> [133.631264] hardirqs last  enabled at (8368281): [<ffffffff81527da9>] tick_nohz_idle_exit+0x99/0x170
<4> [133.631268] hardirqs last disabled at (8368282): [<ffffffff81539c93>] flush_smp_call_function_queue+0x73/0xf0
<4> [133.631273] softirqs last  enabled at (347482): [<ffffffff813d13fb>] __local_bh_enable_ip+0x14b/0x190
<4> [133.631277] softirqs last disabled at (347458): [<ffffffff8154619a>] cgroup_idr_alloc.constprop.0+0x2a/0x130
<4> [133.631283] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Tainted: G S   U       L      7.1.0-Patchwork_159035v16-g0984dfdee2a4+ #1 PREEMPT_{RT,(lazy)}
<4> [133.631287] Tainted: [S]=CPU_OUT_OF_SPEC, [U]=USER, [L]=SOFTLOCKUP
<4> [133.631287] Hardware name: Intel Corporation CoffeeLake Client Platform/CoffeeLake S UDIMM RVP, BIOS CNLSFWR1.R00.X220.B00.2103302221 03/30/2021
<4> [133.631289] Call Trace:
<4> [133.631290]  <TASK>
<4> [133.631291]  dump_stack_lvl+0x91/0xf0
<4> [133.631297]  dump_stack+0x10/0x20
<4> [133.631300]  __might_resched+0x174/0x260
<4> [133.631306]  rt_spin_lock+0x63/0x200
<4> [133.631309]  ? i915_pmu_enable+0x48/0x390 [i915]
<4> [133.631484]  i915_pmu_enable+0x48/0x390 [i915]
<4> [133.631656]  i915_pmu_event_add+0x71/0x90 [i915]
<4> [133.631827]  event_sched_in+0x105/0x270
<4> [133.631833]  merge_sched_in+0x2db/0x4e0
<4> [133.631840]  visit_groups_merge.constprop.0.isra.0+0x284/0x440
<4> [133.631845]  ? lock_is_held_type+0xa3/0x130
<4> [133.631851]  ctx_sched_in+0x32f/0x430
<4> [133.631860]  perf_event_sched_in+0x83/0xa0
<4> [133.631866]  ctx_resched+0x1c9/0x320
<4> [133.631874]  __perf_install_in_context+0x266/0x390
<4> [133.631881]  ? __pfx_remote_function+0x10/0x10
<4> [133.631885]  remote_function+0x4f/0x70
<4> [133.631888]  __flush_smp_call_function_queue+0xca/0x6e0
<4> [133.631892]  ? trace_hardirqs_on+0x22/0xf0
<4> [133.631899]  flush_smp_call_function_queue+0x85/0xf0
<4> [133.631904]  do_idle+0x16f/0x2e0
<4> [133.631911]  cpu_startup_entry+0x29/0x30
<4> [133.631914]  rest_init+0x104/0x200
<4> [133.631920]  start_kernel+0xa3a/0xcc0
<4> [133.631926]  ? sme_unmap_bootdata+0x14/0x80
<4> [133.631933]  x86_64_start_reservations+0x18/0x30
<4> [133.631936]  x86_64_start_kernel+0x106/0x150
<4> [133.631938]  ? soft_restart_cpu+0x14/0x14
<4> [133.631943]  common_startup_64+0x13e/0x141
<4> [133.631957]  </TASK>

The testcase that triggers this is perf_pmu.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/i915_pmu.c | 22 +++++++++++-----------
 drivers/gpu/drm/i915/i915_pmu.h |  2 +-
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c
index 1c3bafda9c708..65771e54b9b51 100644
--- a/drivers/gpu/drm/i915/i915_pmu.c
+++ b/drivers/gpu/drm/i915/i915_pmu.c
@@ -232,7 +232,7 @@ static u64 get_rc6(struct intel_gt *gt)
 		intel_gt_pm_put_async(gt, wakeref);
 	}
 
-	spin_lock_irqsave(&pmu->lock, flags);
+	raw_spin_lock_irqsave(&pmu->lock, flags);
 
 	if (wakeref) {
 		store_sample(pmu, gt_id, __I915_SAMPLE_RC6, val);
@@ -253,7 +253,7 @@ static u64 get_rc6(struct intel_gt *gt)
 	else
 		store_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED, val);
 
-	spin_unlock_irqrestore(&pmu->lock, flags);
+	raw_spin_unlock_irqrestore(&pmu->lock, flags);
 
 	return val;
 }
@@ -304,7 +304,7 @@ void i915_pmu_gt_parked(struct intel_gt *gt)
 	if (!pmu->registered)
 		return;
 
-	spin_lock_irq(&pmu->lock);
+	raw_spin_lock_irq(&pmu->lock);
 
 	park_rc6(gt);
 
@@ -316,7 +316,7 @@ void i915_pmu_gt_parked(struct intel_gt *gt)
 	if (pmu->unparked == 0)
 		pmu->timer_enabled = false;
 
-	spin_unlock_irq(&pmu->lock);
+	raw_spin_unlock_irq(&pmu->lock);
 }
 
 void i915_pmu_gt_unparked(struct intel_gt *gt)
@@ -326,7 +326,7 @@ void i915_pmu_gt_unparked(struct intel_gt *gt)
 	if (!pmu->registered)
 		return;
 
-	spin_lock_irq(&pmu->lock);
+	raw_spin_lock_irq(&pmu->lock);
 
 	/*
 	 * Re-enable sampling timer when GPU goes active.
@@ -336,7 +336,7 @@ void i915_pmu_gt_unparked(struct intel_gt *gt)
 
 	pmu->unparked |= BIT(gt->info.id);
 
-	spin_unlock_irq(&pmu->lock);
+	raw_spin_unlock_irq(&pmu->lock);
 }
 
 static void
@@ -742,7 +742,7 @@ static void i915_pmu_enable(struct perf_event *event)
 	if (bit == -1)
 		goto update;
 
-	spin_lock_irqsave(&pmu->lock, flags);
+	raw_spin_lock_irqsave(&pmu->lock, flags);
 
 	/*
 	 * Update the bitmask of enabled events and increment
@@ -784,7 +784,7 @@ static void i915_pmu_enable(struct perf_event *event)
 		engine->pmu.enable_count[sample]++;
 	}
 
-	spin_unlock_irqrestore(&pmu->lock, flags);
+	raw_spin_unlock_irqrestore(&pmu->lock, flags);
 
 update:
 	/*
@@ -805,7 +805,7 @@ static void i915_pmu_disable(struct perf_event *event)
 	if (bit == -1)
 		return;
 
-	spin_lock_irqsave(&pmu->lock, flags);
+	raw_spin_lock_irqsave(&pmu->lock, flags);
 
 	if (is_engine_event(event)) {
 		u8 sample = engine_event_sample(event);
@@ -838,7 +838,7 @@ static void i915_pmu_disable(struct perf_event *event)
 		pmu->timer_enabled &= pmu_needs_timer(pmu);
 	}
 
-	spin_unlock_irqrestore(&pmu->lock, flags);
+	raw_spin_unlock_irqrestore(&pmu->lock, flags);
 }
 
 static void i915_pmu_event_start(struct perf_event *event, int flags)
@@ -1156,7 +1156,7 @@ void i915_pmu_register(struct drm_i915_private *i915)
 	};
 	int ret = -ENOMEM;
 
-	spin_lock_init(&pmu->lock);
+	raw_spin_lock_init(&pmu->lock);
 	hrtimer_setup(&pmu->timer, i915_sample, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	init_rc6(pmu);
 
diff --git a/drivers/gpu/drm/i915/i915_pmu.h b/drivers/gpu/drm/i915/i915_pmu.h
index 5826cc81858c4..52d4b602310a0 100644
--- a/drivers/gpu/drm/i915/i915_pmu.h
+++ b/drivers/gpu/drm/i915/i915_pmu.h
@@ -71,7 +71,7 @@ struct i915_pmu {
 	/**
 	 * @lock: Lock protecting enable mask and ref count handling.
 	 */
-	spinlock_t lock;
+	raw_spinlock_t lock;
 	/**
 	 * @unparked: GT unparked mask.
 	 */
-- 
2.53.0


  parent reply	other threads:[~2026-06-22 18:11 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-22 18:10 [PATCH v9 00/30] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 01/30] drm/vblank_work: Add methods to schedule vblank_work in 2 stages Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 02/30] drm/vblank: Add a 2-stage version of drm_crtc_arm_vblank_event Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 03/30] drm/intel/display: Make intel_crtc_arm_vblank_event static Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 04/30] drm/intel/display: Convert vblank event handling to 2-stage arming Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 05/30] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 06/30] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 07/30] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 08/30] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 09/30] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 10/30] drm/i915/display: Do not take uncore lock in i915_get_vblank_counter Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 11/30] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 12/30] drm/i915/display: Use intel_de_read/write_fw in colorops Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 13/30] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 14/30] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 15/30] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 16/30] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 17/30] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 18/30] drm/i915/gt: Fix selftests on PREEMPT_RT Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 19/30] drm/i915/gt: Set stop_timeout() correctly on PREEMPT-RT Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 20/30] drm/i915/display: Remove uncore lock from vlv_atomic_update_fifo Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 21/30] drm/i915: Use sleeping selftests for igt_atomic on PREEMPT_RT Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 22/30] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 23/30] PREEMPT_RT injection Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 24/30] FOR-CI: bump MAX_STACK_TRACE_ENTRIES Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 25/30] drm/i915/gt: Add a spinlock to prevent starvation of irq_work Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 26/30] drm/xe: Avoid using stolen memory for DPT Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 27/30] drm/xe/display: Avoid using stolen memory for framebuffer when media gt exists Maarten Lankhorst
2026-06-22 18:10 ` [PATCH v9 28/30] drm/xe/display: Do not allocate into stolen for new framebuffers Maarten Lankhorst
2026-06-22 18:10 ` Maarten Lankhorst [this message]
2026-06-22 18:10 ` [PATCH v9 30/30] drm/i915/guc: Make timestamp.lock a raw spinlock Maarten Lankhorst
2026-06-23 12:57   ` [PATCH v9.5] drm/i915: Disable "busy" pmu event on CONFIG_PREEMPT_RT Maarten Lankhorst
2026-06-23 13:27   ` [PATCH v9.6] " Maarten Lankhorst
2026-08-01  1:01     ` kernel test robot
2026-06-22 19:09 ` ✗ i915.CI.BAT: failure for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev17) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260622181044.39335-30-dev@lankhorst.se \
    --to=dev@lankhorst.se \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox