From 31a58792f31fc67c5b51466b106f1dca9cd8085a Mon Sep 17 00:00:00 2001 From: Channagoud Kadabi Date: Thu, 31 Aug 2017 16:34:05 -0700 Subject: [PATCH] drivers: edac: Register IRQ after all the resources are allocated llcc ecc interrupt handler registers for interrupt and then allocates for resources. These resources are used in the interrupt handler. So there is small window after interrupt is registered and resources are allocated where ecc can happen. This results into NULL pointer exception. Avoid the race condition by moving the interrupt registration after all the resources are allocated. Change-Id: I26efb8c243ff155e75be837188cfc5f998400cf5 Signed-off-by: Channagoud Kadabi --- drivers/edac/qcom_llcc_edac.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/edac/qcom_llcc_edac.c b/drivers/edac/qcom_llcc_edac.c index 4b89cbf9e06d..038e89c59252 100644 --- a/drivers/edac/qcom_llcc_edac.c +++ b/drivers/edac/qcom_llcc_edac.c @@ -397,21 +397,6 @@ static int qcom_llcc_erp_probe(struct platform_device *pdev) if (rc) goto out_mem; - if (interrupt_mode) { - drv->ecc_irq = platform_get_irq_byname(pdev, "ecc_irq"); - if (!drv->ecc_irq) { - rc = -ENODEV; - goto out_dev; - } - - rc = devm_request_irq(dev, drv->ecc_irq, llcc_ecc_irq_handler, - IRQF_TRIGGER_HIGH, "llcc_ecc", edev_ctl); - if (rc) { - dev_err(dev, "failed to request ecc irq\n"); - goto out_dev; - } - } - drv->llcc_banks = devm_kzalloc(&pdev->dev, sizeof(u32) * drv->num_banks, GFP_KERNEL); @@ -437,6 +422,21 @@ static int qcom_llcc_erp_probe(struct platform_device *pdev) platform_set_drvdata(pdev, edev_ctl); + if (interrupt_mode) { + drv->ecc_irq = platform_get_irq_byname(pdev, "ecc_irq"); + if (!drv->ecc_irq) { + rc = -ENODEV; + goto out_dev; + } + + rc = devm_request_irq(dev, drv->ecc_irq, llcc_ecc_irq_handler, + IRQF_TRIGGER_HIGH, "llcc_ecc", edev_ctl); + if (rc) { + dev_err(dev, "failed to request ecc irq\n"); + goto out_dev; + } + } + return 0; out_dev: