diff mbox series

xen/sched: call xfree() after local IRQ is enabled

Message ID 20250318040023.4998-1-anderson.choi@boeing.com (mailing list archive)
State New
Headers show
Series xen/sched: call xfree() after local IRQ is enabled | expand

Commit Message

Choi, Anderson March 18, 2025, 4 a.m. UTC
xen panic is observed with the following configuration.

1. Debug xen build (CONFIG_DEBUG=y)
2. dom1 of an ARINC653 domain
3. shutdown dom1 with xl command

$ xl shutdown <domain_name>

(XEN) ****************************************
(XEN) Panic on CPU 2:
(XEN) Assertion '!in_irq() && (local_irq_is_enabled() ||
num_online_cpus() <= 1)' failed at common/xmalloc_tlsf.c:714
(XEN) ****************************************

panic was triggered since xfree() was called with local IRQ disabled and
therefore assertion failed.

Fix this by calling xfree() after local IRQ is enabled.

Fixes: 19049f8d796a sched: fix locking in a653sched_free_vdata()
Signed-off-by: Anderson Choi <anderson.choi@boeing.com>
---
 xen/common/sched/arinc653.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Jan Beulich March 18, 2025, 6:40 a.m. UTC | #1
On 18.03.2025 05:00, Anderson Choi wrote:
> xen panic is observed with the following configuration.
> 
> 1. Debug xen build (CONFIG_DEBUG=y)
> 2. dom1 of an ARINC653 domain
> 3. shutdown dom1 with xl command
> 
> $ xl shutdown <domain_name>
> 
> (XEN) ****************************************
> (XEN) Panic on CPU 2:
> (XEN) Assertion '!in_irq() && (local_irq_is_enabled() ||
> num_online_cpus() <= 1)' failed at common/xmalloc_tlsf.c:714
> (XEN) ****************************************
> 
> panic was triggered since xfree() was called with local IRQ disabled and
> therefore assertion failed.
> 
> Fix this by calling xfree() after local IRQ is enabled.
> 
> Fixes: 19049f8d796a sched: fix locking in a653sched_free_vdata()
> Signed-off-by: Anderson Choi <anderson.choi@boeing.com>

Just one nit on the patch title: There's no mention at all there of which
scheduler it is. Imo "sched" there would better be replaced by the scheduler
name.

Jan

> ---
>  xen/common/sched/arinc653.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/common/sched/arinc653.c b/xen/common/sched/arinc653.c
> index 0a3733c04e90..b95492e1d96f 100644
> --- a/xen/common/sched/arinc653.c
> +++ b/xen/common/sched/arinc653.c
> @@ -463,10 +463,11 @@ a653sched_free_udata(const struct scheduler *ops, void *priv)
>      if ( !is_idle_unit(av->unit) )
>          list_del(&av->list);
>  
> -    xfree(av);
>      update_schedule_units(ops);
>  
>      spin_unlock_irqrestore(&sched_priv->lock, flags);
> +
> +    xfree(av);
>  }
>  
>  /**
Choi, Anderson March 18, 2025, 7:36 a.m. UTC | #2
Jan,

> EXT email: be mindful of links/attachments.
> 
> On 18.03.2025 05:00, Anderson Choi wrote:
>> xen panic is observed with the following configuration.
>> 
>> 1. Debug xen build (CONFIG_DEBUG=y)
>> 2. dom1 of an ARINC653 domain
>> 3. shutdown dom1 with xl command
>> 
>> $ xl shutdown <domain_name>
>> 
>> (XEN) ****************************************
>> (XEN) Panic on CPU 2:
>> (XEN) Assertion '!in_irq() && (local_irq_is_enabled() ||
>> num_online_cpus() <= 1)' failed at common/xmalloc_tlsf.c:714
>> (XEN) ****************************************
>> 
>> panic was triggered since xfree() was called with local IRQ disabled
>> and therefore assertion failed.
>> 
>> Fix this by calling xfree() after local IRQ is enabled.
>> 
>> Fixes: 19049f8d796a sched: fix locking in a653sched_free_vdata()
>> Signed-off-by: Anderson Choi <anderson.choi@boeing.com>
> 
> Just one nit on the patch title: There's no mention at all there of which scheduler
> it is. Imo "sched" there would better be replaced by the scheduler name.
> 
> Jan
> 
>> ---
...

Thanks for the comment. I have just submitted patch v2 with the following title.

[PATCH v2] xen/arinc653: call xfree() with local IRQ enabled

Regards,
Anderson
diff mbox series

Patch

diff --git a/xen/common/sched/arinc653.c b/xen/common/sched/arinc653.c
index 0a3733c04e90..b95492e1d96f 100644
--- a/xen/common/sched/arinc653.c
+++ b/xen/common/sched/arinc653.c
@@ -463,10 +463,11 @@  a653sched_free_udata(const struct scheduler *ops, void *priv)
     if ( !is_idle_unit(av->unit) )
         list_del(&av->list);
 
-    xfree(av);
     update_schedule_units(ops);
 
     spin_unlock_irqrestore(&sched_priv->lock, flags);
+
+    xfree(av);
 }
 
 /**