gpio: graniterapids: Fix vGPIO driver crash
authorAlan Borzeszkowski <alan.borzeszkowski@linux.intel.com>
Wed, 4 Dec 2024 07:04:09 +0000 (09:04 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 10 Dec 2024 09:35:12 +0000 (10:35 +0100)
Move setting irq_chip.name from probe() function to the initialization
of "irq_chip" struct in order to fix vGPIO driver crash during bootup.

Crash was caused by unauthorized modification of irq_chip.name field
where irq_chip struct was initialized as const.

This behavior is a consequence of suboptimal implementation of
gpio_irq_chip_set_chip(), which should be changed to avoid
casting away const qualifier.

Crash log:
BUG: unable to handle page fault for address: ffffffffc0ba81c0
/#PF: supervisor write access in kernel mode
/#PF: error_code(0x0003) - permissions violation
CPU: 33 UID: 0 PID: 1075 Comm: systemd-udevd Not tainted 6.12.0-rc6-00077-g2e1b3cc9d7f7 #1
Hardware name: Intel Corporation Kaseyville RP/Kaseyville RP, BIOS KVLDCRB1.PGS.0026.D73.2410081258 10/08/2024
RIP: 0010:gnr_gpio_probe+0x171/0x220 [gpio_graniterapids]

Cc: stable@vger.kernel.org
Signed-off-by: Alan Borzeszkowski <alan.borzeszkowski@linux.intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Andy Shevchenko <andy@kernel.org>
Link: https://lore.kernel.org/r/20241204070415.1034449-2-mika.westerberg@linux.intel.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-graniterapids.c

index f2e911a3d2ca022f7455cb9f599177738ac764d4..9da2999dc30fb8e62fd09283dafe95f4a7aff3d2 100644 (file)
@@ -234,6 +234,7 @@ static int gnr_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 }
 
 static const struct irq_chip gnr_gpio_irq_chip = {
+       .name           = "gpio-graniterapids",
        .irq_ack        = gnr_gpio_irq_ack,
        .irq_mask       = gnr_gpio_irq_mask,
        .irq_unmask     = gnr_gpio_irq_unmask,
@@ -324,7 +325,6 @@ static int gnr_gpio_probe(struct platform_device *pdev)
 
        girq = &priv->gc.irq;
        gpio_irq_chip_set_chip(girq, &gnr_gpio_irq_chip);
-       girq->chip->name        = dev_name(dev);
        girq->parent_handler    = NULL;
        girq->num_parents       = 0;
        girq->parents           = NULL;