2022-02-02 18:06:46

by Marc Zyngier

[permalink] [raw]
Subject: [PATCH] irqchip/gic-v3-its: Skip HP notifier when no ITS is registered

We have some systems out there that have both LPI support and an
ITS, but that don't expose the ITS in their firmware tables
(either because it is broken or because they run under a hypervisor
that hides it...).

Is such a configuration, we still register the HP notifier to free
the allocated tables if needed, resulting in a warning as there is
no memory to free (nothing was allocated the first place).

Fix it by keying the HP notifier on the presence of at least one
sucessfully probed ITS.

Fixes: d23bc2bc1d63 ("irqchip/gic-v3-its: Postpone LPI pending table freeing and memreserve")
Reported-by: Steev Klimaszewski <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
Cc: Valentin Schneider <[email protected]>
---
drivers/irqchip/irq-gic-v3-its.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 9e93ff2b6375..cd772973114a 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -5517,6 +5517,9 @@ int __init its_lpi_memreserve_init(void)
if (!efi_enabled(EFI_CONFIG_TABLES))
return 0;

+ if (list_empty(&its_nodes))
+ return 0;
+
gic_rdists->cpuhp_memreserve_state = CPUHP_INVALID;
state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
"irqchip/arm/gicv3/memreserve:online",
--
2.34.1


2022-02-03 05:24:50

by Marc Zyngier

[permalink] [raw]
Subject: Re: [PATCH] irqchip/gic-v3-its: Skip HP notifier when no ITS is registered

On 2022-02-02 12:50, Valentin Schneider wrote:
> On 02/02/22 10:34, Marc Zyngier wrote:
>> We have some systems out there that have both LPI support and an
>> ITS, but that don't expose the ITS in their firmware tables
>> (either because it is broken or because they run under a hypervisor
>> that hides it...).
>>
>
> Huh :)

Yeah. Got to love these WoA machines where EL2 hides most of the
useful HW, but also can't be bothered to consistently emulate
the registers they trap (cue the bug that was causing the SMMUv2
driver to explode on store of xzr to an MMIO register). Bah.

>
>> Is such a configuration, we still register the HP notifier to free
>> the allocated tables if needed, resulting in a warning as there is
>> no memory to free (nothing was allocated the first place).
>>
>
> Right, so list_empty(&its_nodes) means no ->pend_page, but still having
> the
> HP notifier means we hit the WARN_ON(!pend_page).
>
>> Fix it by keying the HP notifier on the presence of at least one
>> sucessfully probed ITS.
>>
>
> That looks fine to me.
>
> Reviewed-by: Valentin Schneider <[email protected]>

Thanks,

M.
--
Jazz is not dead. It just smells funny...

2022-02-03 13:20:08

by Valentin Schneider

[permalink] [raw]
Subject: Re: [PATCH] irqchip/gic-v3-its: Skip HP notifier when no ITS is registered

On 02/02/22 10:34, Marc Zyngier wrote:
> We have some systems out there that have both LPI support and an
> ITS, but that don't expose the ITS in their firmware tables
> (either because it is broken or because they run under a hypervisor
> that hides it...).
>

Huh :)

> Is such a configuration, we still register the HP notifier to free
> the allocated tables if needed, resulting in a warning as there is
> no memory to free (nothing was allocated the first place).
>

Right, so list_empty(&its_nodes) means no ->pend_page, but still having the
HP notifier means we hit the WARN_ON(!pend_page).

> Fix it by keying the HP notifier on the presence of at least one
> sucessfully probed ITS.
>

That looks fine to me.

Reviewed-by: Valentin Schneider <[email protected]>

> Fixes: d23bc2bc1d63 ("irqchip/gic-v3-its: Postpone LPI pending table freeing and memreserve")
> Reported-by: Steev Klimaszewski <[email protected]>
> Signed-off-by: Marc Zyngier <[email protected]>
> Cc: Valentin Schneider <[email protected]>
> ---
> drivers/irqchip/irq-gic-v3-its.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 9e93ff2b6375..cd772973114a 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -5517,6 +5517,9 @@ int __init its_lpi_memreserve_init(void)
> if (!efi_enabled(EFI_CONFIG_TABLES))
> return 0;
>
> + if (list_empty(&its_nodes))
> + return 0;
> +
> gic_rdists->cpuhp_memreserve_state = CPUHP_INVALID;
> state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
> "irqchip/arm/gicv3/memreserve:online",
> --
> 2.34.1

Subject: [irqchip: irq/irqchip-fixes] irqchip/gic-v3-its: Skip HP notifier when no ITS is registered

The following commit has been merged into the irq/irqchip-fixes branch of irqchip:

Commit-ID: eba1e44beef88aa722f07755f79f604cd5d92290
Gitweb: https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms/eba1e44beef88aa722f07755f79f604cd5d92290
Author: Marc Zyngier <[email protected]>
AuthorDate: Wed, 02 Feb 2022 10:34:54
Committer: Marc Zyngier <[email protected]>
CommitterDate: Wed, 02 Feb 2022 10:43:10

irqchip/gic-v3-its: Skip HP notifier when no ITS is registered

We have some systems out there that have both LPI support and an
ITS, but that don't expose the ITS in their firmware tables
(either because it is broken or because they run under a hypervisor
that hides it...).

Is such a configuration, we still register the HP notifier to free
the allocated tables if needed, resulting in a warning as there is
no memory to free (nothing was allocated the first place).

Fix it by keying the HP notifier on the presence of at least one
sucessfully probed ITS.

Fixes: d23bc2bc1d63 ("irqchip/gic-v3-its: Postpone LPI pending table freeing and memreserve")
Reported-by: Steev Klimaszewski <[email protected]>
Tested-by: Steev Klimaszewski <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
Cc: Valentin Schneider <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
---
drivers/irqchip/irq-gic-v3-its.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 9e93ff2..cd77297 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -5517,6 +5517,9 @@ int __init its_lpi_memreserve_init(void)
if (!efi_enabled(EFI_CONFIG_TABLES))
return 0;

+ if (list_empty(&its_nodes))
+ return 0;
+
gic_rdists->cpuhp_memreserve_state = CPUHP_INVALID;
state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
"irqchip/arm/gicv3/memreserve:online",