Re: [PATCH] irqchip: gic-v3-its: irq_pipeline: Fix OOB context in-band lock warning for ITS lock

Jan Kiszka <[email protected]> Mon, 13 Jul 2026 12:29:28 +0200
Newsgroups dev.linux.lists.xenomai
Message-ID <[email protected]>
On 13.07.26 12:20, linz wrote:
> 
> At 2026-07-10 18:59:08, "Florian Bezdeka" <[email protected]> wrote:
>> On Fri, 2026-07-10 at 12:12 +0200, Jan Kiszka wrote:
>>> On 25.06.26 11:32, linz wrote:
>>>> Hi, I find a call trace when I use v6.6.y-dovetail + xenomai v3.3 branch, the call trace is as follows
>>>>
>>>> [    1.510903] IRQ pipeline: some code running in oob context 'Xenomai'
>>>>                              called an in-band only routine
>>>> [    1.510912] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G S                 6.6.63-dovetail2 #8
>>>> [    1.510918] Hardware name: Pe2204 DEMO DDR4 (DT)
>>>> [    1.510920] IRQ stage: Xenomai
>>>> [    1.510923] Call trace:
>>>> [    1.510926]  dump_backtrace+0x90/0xe4
>>>> [    1.510940]  show_stack+0x14/0x1c
>>>> [    1.510946]  dump_stack_lvl+0x84/0xc8
>>>> [    1.510953]  dump_stack+0x14/0x1c
>>>> [    1.510957]  check_inband_stage+0xb0/0xc8
>>>> [    1.510965]  inband_irq_save+0xc/0x28
>>>> [    1.510971]  _raw_spin_lock_irqsave+0x14/0x90
>>>> [    1.510977]  its_send_single_command+0x24/0x154
>>>> [    1.510984]  lpi_update_config+0x9c/0x144
>>>> [    1.510990]  its_mask_irq+0x2c/0x64
>>>> [    1.510997]  irq_chip_mask_parent+0x18/0x20
>>>> [    1.511005]  its_mask_msi_irq+0x1c/0x28
>>>> [    1.511012]  handle_fasteoi_irq+0x1cc/0x2b4
>>>> [    1.511016]  generic_pipeline_irq_desc+0x6c/0xa4
>>>> [    1.511021]  generic_handle_domain_irq+0x18/0x20
>>>> [    1.511028]  gic_handle_irq+0x4c/0x120
>>>> [    1.511032]  handle_irq_pipelined+0x40/0x64
>>>> [    1.511038]  call_on_irq_stack+0x24/0x30
>>>> [    1.511044]  do_interrupt_handler+0x138/0x158
>>>> [    1.511050]  el1_interrupt+0x40/0x110
>>>> [    1.511055]  el1h_64_irq_handler+0x14/0x1c
>>>> [    1.511061]  el1h_64_irq+0x64/0x68
>>>> [    1.511064]  default_idle_call+0x30/0x78
>>>> [    1.511071]  do_idle+0x128/0x150
>>>> [    1.511077]  cpu_startup_entry+0x34/0x38
>>>> [    1.511081]  kernel_init+0x0/0x1d4
>>>> [    1.511088]  arch_post_acpi_subsys_init+0x0/0x8
>>>> [    1.511096]  start_kernel+0x504/0x5cc
>>>> [    1.511103]  __primary_switched+0xbc/0xc4
>>>>
>>>>
>>>> The function call causing the issue is as follows:
>>>> generic_handle_domain_irq
>>>>     => generic_pipeline_irq_desc
>>>>         => generic_handle_irq_desc
>>>>             => handle_fasteoi_irq
>>>>                 => mask_cond_eoi_irq
>>>>                     => mask_irq
>>>>                         => its_mask_msi_irq
>>>>                             => irq_chip_mask_parent
>>>>                                 => its_mask_irq
>>>>                                     => lpi_update_config
>>>>                                         => its_send_inv
>>>>                                             => BUILD_SINGLE_CMD_FUNC
>>>>                                                 => raw_spin_lock_irqsave(&its->lock, flags);
>>>>
>>>>
>>>> On Dovetail-enabled kernels with Xenomai IRQ pipeline, GICv3 ITS interrupt handling runs in OOB (out-of-band) interrupt context. The original raw_spinlock_t used for its_node->lock invokes the standard in-band-only raw_spin_lock_irqsave() interface.
>>>> This triggers the following pipeline context violation warning: IRQ pipeline: some code running in oob context 'Xenomai' called an in-band only routine
>>>>
>>>> raw_spin_lock_irqsave() is an in-band exclusive API and cannot be safely called from Xenomai OOB interrupt context, which violates the IRQ pipeline isolation rules.
>>>>
>>>> I think that fix this by replacing raw_spinlock_t with hybrid_spinlock_t for the ITS node lock. The hybrid spinlock supports both in-band Linux kernel context and OOB Xenomai pipeline context, adapting lock/irqsave logic dynamically according to the running context, eliminating the context mismatch warning while guaranteeing lock mutual exclusion.
>>>>
>>>> The fixed up patch is as follows:
>>>>
>>>> From 1037fcf6d75ecf37e1caf283d1198177e7410be3 Mon Sep 17 00:00:00 2001
>>>> From: zhanglin <[email protected]>
>>>> Date: Thu, 25 Jun 2026 16:56:31 +0800
>>>> Subject: [PATCH] irqchip: gic-v3-its: irq_pipeline: fix OOB context in-band
>>>>  lock warning for ITS lock
>>>>
>>>> ---
>>>>  drivers/irqchip/irq-gic-v3-its.c | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
>>>> index 0e57735eac..847b008b71 100644
>>>> --- a/drivers/irqchip/irq-gic-v3-its.c
>>>> +++ b/drivers/irqchip/irq-gic-v3-its.c
>>>> @@ -94,7 +94,7 @@ struct its_device;
>>>>   * list.
>>>>   */
>>>>  struct its_node {
>>>> -    raw_spinlock_t        lock;
>>>> +    hybrid_spinlock_t     lock;
>>>>      struct mutex        dev_alloc_lock;
>>>>      struct list_head    entry;
>>>>      void __iomem        *base;
>>>> -- 
>>>> 2.34.1
>>>>
>>>> Please help to review it, thank you.
>>>
>>> Thanks for reporting.
>>>
>>> Philippe, Florian, any comments on this?
>>>
>>> Jan
>>
>> hybrid_spinlock_t doesn't look right at first glance, it's use should be
>> limited to struct irq_desc and IRQ chips. I would have expected
>> hard_spinlock_t, but I might miss something.
>>
>> Assuming the gic-v3 IRQ chip is already marked / flagged as
>> IRQCHIP_PIPELINE_SAFE, right?
>>
>> Florian
> 
>>
> 
> 
> Thank you for your feedback
> 
> The gic-v3 IRQ chip is already marked with IRQCHIP_PIPELINE_SAFE. 
> The its_irq_chip is not marked with IRQCHIP_PIPELINE_SAFE. I added the flag and tested, but it did not have any effect.
> 
> Meanwhile, I read the code related to IRQCHIP_PIPELINE_SAFE. If the gic-v3 IRQ chip is not marked with IRQCHIP_PIPELINE_SAFE, a call trace like the following would be reported:
> MSI domain irqchip XXX is not pipeline-safe! or irqchip XXX is not pipeline-safe!
> However, I did not see any such message in dmsg logs.
> 
> Based on Florian's suggestion, I revisited the Xenomai 4 documentation regarding hybrid_spinlock_t and hard_spinlock_t. 
> I agree with Florian's point that hybrid_spinlock_t should be limited to struct irq_desc and IRQ chips, and that hard_spinlock_t is more appropriate for the ITS node lock.
> 
> I changed the lock to hard_spinlock_t and tested it. The call trace no longer appears and the system works fine.
> 
> The patch is as follows. Please help review it:
> 
> From e0cbc9316af331bf007c86e1fcab0ef8699b05c9 Mon Sep 17 00:00:00 2001
> From: zhanglin1040 <[email protected]>
> Date: Mon, 13 Jul 2026 17:53:44 +0800
> Subject: [PATCH] irqchip: gic-v3-its: irq_pipeline: fix OOB context in-band
>  lock warning for ITS lock using hard spinlocks instead of hybrid spinlocks
> 

Missing commit message. Reason for the change needs to go here.

> ---
>  drivers/irqchip/irq-gic-v3-its.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 0e57735eac..3f2b02b8f4 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -94,7 +94,7 @@ struct its_device;
>   * list.
>   */
>  struct its_node {
> -    raw_spinlock_t        lock;
> +    hard_spinlock_t        lock;
>      struct mutex        dev_alloc_lock;
>      struct list_head    entry;
>      void __iomem        *base;
> -- 
> 2.34.1

Please send new versions of a patch in a new thread, incrementing the
patch version counter in the subject (here: "[PATCH v2] irqchip:
gic-v3-its: irq_pipeline: fix ...").

Jan

-- 
Siemens AG, Foundational Technologies
Linux Expert Center