summaryrefslogtreecommitdiff
path: root/drivers/irqchip/irq-riscv-imsic-state.c
diff options
context:
space:
mode:
authorAnup Patel <apatel@ventanamicro.com>2025-02-17 14:26:54 +0530
committerThomas Gleixner <tglx@linutronix.de>2025-02-20 15:19:27 +0100
commit51611130d57d2061729010bd0575701aa4b7ff74 (patch)
treec2a3ad651e33ab9db83d159fa6f50a6644cff101 /drivers/irqchip/irq-riscv-imsic-state.c
parent0f67911e821c67ecfccc365a2103ce276a9a56fe (diff)
irqchip/riscv-imsic: Implement irq_force_complete_move() for IMSIC
Implement irq_force_complete_move() for IMSIC driver so that in-flight vector movements on a CPU can be cleaned-up when the CPU goes down. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20250217085657.789309-9-apatel@ventanamicro.com
Diffstat (limited to 'drivers/irqchip/irq-riscv-imsic-state.c')
-rw-r--r--drivers/irqchip/irq-riscv-imsic-state.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c
index 1aeba76d7279..eb0a9b6a5239 100644
--- a/drivers/irqchip/irq-riscv-imsic-state.c
+++ b/drivers/irqchip/irq-riscv-imsic-state.c
@@ -311,6 +311,23 @@ void imsic_vector_unmask(struct imsic_vector *vec)
raw_spin_unlock(&lpriv->lock);
}
+void imsic_vector_force_move_cleanup(struct imsic_vector *vec)
+{
+ struct imsic_local_priv *lpriv;
+ struct imsic_vector *mvec;
+ unsigned long flags;
+
+ lpriv = per_cpu_ptr(imsic->lpriv, vec->cpu);
+ raw_spin_lock_irqsave(&lpriv->lock, flags);
+
+ mvec = READ_ONCE(vec->move_prev);
+ WRITE_ONCE(vec->move_prev, NULL);
+ if (mvec)
+ imsic_vector_free(mvec);
+
+ raw_spin_unlock_irqrestore(&lpriv->lock, flags);
+}
+
static bool imsic_vector_move_update(struct imsic_local_priv *lpriv,
struct imsic_vector *vec, bool is_old_vec,
bool new_enable, struct imsic_vector *move_vec)