ACK: [PATCH 1/1][Hirsute][Unstable] ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure

Colin Ian King colin.king at canonical.com
Tue May 4 11:33:24 UTC 2021


On 03/05/2021 22:51, dann frazier wrote:
> From: Marc Zyngier <maz at kernel.org>
> 
> BugLink: https://bugs.launchpad.net/bugs/1925075
> 
> When failing the driver probe because of invalid firmware properties,
> the GTDT driver unmaps the interrupt that it mapped earlier.
> 
> However, it never checks whether the mapping of the interrupt actially
> succeeded. Even more, should the firmware report an illegal interrupt
> number that overlaps with the GIC SGI range, this can result in an
> IPI being unmapped, and subsequent fireworks (as reported by Dann
> Frazier).
> 
> Rework the driver to have a slightly saner behaviour and actually
> check whether the interrupt has been mapped before unmapping things.
> 
> Reported-by: dann frazier <dann.frazier at canonical.com>
> Fixes: ca9ae5ec4ef0 ("acpi/arm64: Add SBSA Generic Watchdog support in GTDT driver")
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> Link: https://lore.kernel.org/r/YH87dtTfwYgavusz@xps13.dannf
> Cc: <stable at vger.kernel.org>
> Cc: Fu Wei <wefu at redhat.com>
> Reviewed-by: Sudeep Holla <sudeep.holla at arm.com>
> Tested-by: dann frazier <dann.frazier at canonical.com>
> Tested-by: Hanjun Guo <guohanjun at huawei.com>
> Reviewed-by: Hanjun Guo <guohanjun at huawei.com>
> Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
> Link: https://lore.kernel.org/r/20210421164317.1718831-2-maz@kernel.org
> Signed-off-by: Catalin Marinas <catalin.marinas at arm.com>
> (cherry picked from commit 1ecd5b129252249b9bc03d7645a7bda512747277 linux-next)
> Signed-off-by: dann frazier <dann.frazier at canonical.com>
> ---
>  drivers/acpi/arm64/gtdt.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/acpi/arm64/gtdt.c b/drivers/acpi/arm64/gtdt.c
> index f2d0e5915dab..0a0a982f9c28 100644
> --- a/drivers/acpi/arm64/gtdt.c
> +++ b/drivers/acpi/arm64/gtdt.c
> @@ -329,7 +329,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
>  					int index)
>  {
>  	struct platform_device *pdev;
> -	int irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
> +	int irq;
>  
>  	/*
>  	 * According to SBSA specification the size of refresh and control
> @@ -338,7 +338,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
>  	struct resource res[] = {
>  		DEFINE_RES_MEM(wd->control_frame_address, SZ_4K),
>  		DEFINE_RES_MEM(wd->refresh_frame_address, SZ_4K),
> -		DEFINE_RES_IRQ(irq),
> +		{},
>  	};
>  	int nr_res = ARRAY_SIZE(res);
>  
> @@ -348,10 +348,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
>  
>  	if (!(wd->refresh_frame_address && wd->control_frame_address)) {
>  		pr_err(FW_BUG "failed to get the Watchdog base address.\n");
> -		acpi_unregister_gsi(wd->timer_interrupt);
>  		return -EINVAL;
>  	}
>  
> +	irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
> +	res[2] = (struct resource)DEFINE_RES_IRQ(irq);
>  	if (irq <= 0) {
>  		pr_warn("failed to map the Watchdog interrupt.\n");
>  		nr_res--;
> @@ -364,7 +365,8 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
>  	 */
>  	pdev = platform_device_register_simple("sbsa-gwdt", index, res, nr_res);
>  	if (IS_ERR(pdev)) {
> -		acpi_unregister_gsi(wd->timer_interrupt);
> +		if (irq > 0)
> +			acpi_unregister_gsi(wd->timer_interrupt);
>  		return PTR_ERR(pdev);
>  	}
>  
> 

Makes sense, positive test results.

Acked-by: Colin Ian King <colin.king at canonical.com>



More information about the kernel-team mailing list