Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
mfd: rp1: fix IRQ thread affinity on PREEMPT_RT
rp1_irq_set_affinity() delegates to msi_domain_set_affinity() but
does not call irq_data_update_effective_affinity() and does not
return IRQ_SET_MASK_OK_DONE. Without this, the generic IRQ core
never calls irq_set_thread_affinity(), so on PREEMPT_RT the
force-threaded handler remains pinned to its original CPU even
though the hardware interrupt is steered correctly.

This causes PPS timestamps to be captured on a non-isolated CPU,
adding variable latency to precision timing applications.

Fix by updating the effective affinity and returning
IRQ_SET_MASK_OK_DONE on success.

Fixes: #7301

Signed-off-by: Michael Byczkowski <by@by-online.de>
  • Loading branch information
by committed Apr 14, 2026
commit 3fc3c2e4c5a39579ceaadad4fbc62518c5e95771
8 changes: 7 additions & 1 deletion drivers/mfd/rp1.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,14 @@ static int rp1_irq_set_affinity(struct irq_data *irqd, const struct cpumask *des
{
struct rp1_dev *rp1 = irqd->domain->host_data;
struct irq_data *pcie_irqd = rp1->pcie_irqds[irqd->hwirq];
int ret;

return msi_domain_set_affinity(pcie_irqd, dest, force);
ret = msi_domain_set_affinity(pcie_irqd, dest, force);
if (ret >= 0) {
irq_data_update_effective_affinity(irqd, dest);
return IRQ_SET_MASK_OK_DONE;
}
return ret;
}

static struct irq_chip rp1_irq_chip = {
Expand Down