Re: [Linux-stm32] [PATCH v3] irqchip/stm32mp-exti: fix the unit of the hwspinlock timeout

Antonio Borneo <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,org.infradead.lists.linux-arm-kernel
Message-ID <[email protected]>
On Fri, 2026-08-21 at 10:47 +0800, Ju Nan wrote:
> HWSPNLCK_TIMEOUT is passed to hwspin_lock_timeout_in_atomic(), whose
> timeout argument is in milliseconds, not microseconds:
> 
>   atomic_delay += HWSPINLOCK_RETRY_DELAY_US;
>   if (atomic_delay > to * 1000)
>           return -ETIMEDOUT;
> 
> So stm32mp_exti_set_type() asks for a 1 second timeout where the comment
> next to the macro says it wants 1 millisecond. The semaphore is polled
> with udelay() from a section that holds chip_data->rlock, a
> raw_spinlock_t, so preemption stays disabled for the whole wait on every
> configuration, PREEMPT_RT included.
> 
> The hwspinlock core documents this explicitly:
> 
>   If the mode is HWLOCK_IN_ATOMIC (called from an atomic context) the
>   timeout is handled with busy-waiting delays, hence shall not exceed
>   few msecs.
> 
> Fixes: 5257169ade8c ("irqchip/stm32-exti: Use the hwspin_lock_timeout_in_atomic() API")
> Reviewed-by: Radu Rendec <[email protected]>
> Signed-off-by: Ju Nan <[email protected]>
> ---
> changelog:
> 
> v3: redefine the timeout macro with time unit on it
> v2: add "Fixes" tag suggested by Radu Rendec
> v1: https://lore.kernel.org/all/[email protected]/
> ---
>  drivers/irqchip/irq-stm32mp-exti.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-stm32mp-exti.c b/drivers/irqchip/irq-stm32mp-exti.c
> index a24f4f1a4..ce4e03ee1 100644
> --- a/drivers/irqchip/irq-stm32mp-exti.c
> +++ b/drivers/irqchip/irq-stm32mp-exti.c
> @@ -23,7 +23,7 @@
>  
>  #define IRQS_PER_BANK                  32
>  
> -#define HWSPNLCK_TIMEOUT               1000 /* usec */
> +#define HWSPNLCK_TIMEOUT_MS            1
>  
>  #define EXTI_EnCIDCFGR(n)              (0x180 + (n) * 4)
>  #define EXTI_HWCFGR1                   0x3f0
> @@ -377,7 +377,7 @@ static int stm32mp_exti_set_type(struct irq_data *d, unsigned int type)
>         raw_spin_lock(&chip_data->rlock);
>  
>         if (hwlock) {
> -               err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT);
> +               err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT_MS);
>                 if (err) {
>                         pr_err("%s can't get hwspinlock (%d)\n", __func__, err);
>                         goto unlock;

Thanks!

Reviewed-by: Antonio Borneo <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.