mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
ice: fix locking around wait_event_interruptible_locked_irq
Commit50327223a8("ice: add lock to protect low latency interface") introduced a wait queue used to protect the low latency timer interface. The queue is used with the wait_event_interruptible_locked_irq macro, which unlocks the wait queue lock while sleeping. The irq variant uses spin_lock_irq and spin_unlock_irq to manage this. The wait queue lock was previously locked using spin_lock_irqsave. This difference in lock variants could lead to issues, since wait_event would unlock the wait queue and restore interrupts while sleeping. The ice_read_phy_tstamp_ll_e810() function is ultimately called through ice_read_phy_tstamp, which is called from ice_ptp_process_tx_tstamp or ice_ptp_clear_unexpected_tx_ready. The former is called through the miscellaneous IRQ thread function, while the latter is called from the service task work queue thread. Neither of these functions has interrupts disabled, so use spin_lock_irq instead of spin_lock_irqsave. Fixes:50327223a8("ice: add lock to protect low latency interface") Cc: stable@vger.kernel.org Reported-by: Jakub Kicinski <kuba@kernel.org> Closes: https://lore.kernel.org/netdev/20250109181823.77f44c69@kernel.org/ Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Reviewed-by: Simon Horman <horms@kernel.org> Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Link: https://patch.msgid.link/20260515182419.1597859-2-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
317bbe5301
commit
89bbff099b
|
|
@ -4503,18 +4503,17 @@ static int
|
|||
ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
||||
{
|
||||
struct ice_e810_params *params = &hw->ptp.phy.e810;
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
int err;
|
||||
|
||||
spin_lock_irqsave(¶ms->atqbal_wq.lock, flags);
|
||||
spin_lock_irq(¶ms->atqbal_wq.lock);
|
||||
|
||||
/* Wait for any pending in-progress low latency interrupt */
|
||||
err = wait_event_interruptible_locked_irq(params->atqbal_wq,
|
||||
!(params->atqbal_flags &
|
||||
ATQBAL_FLAGS_INTR_IN_PROGRESS));
|
||||
if (err) {
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4529,7 +4528,7 @@ ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
|||
REG_LL_PROXY_H);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read PTP timestamp using low latency read\n");
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4539,7 +4538,7 @@ ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
|||
/* Read the low 32 bit value and set the TS valid bit */
|
||||
*lo = rd32(hw, REG_LL_PROXY_L) | TS_VALID;
|
||||
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user