From: sashiko-bot@kernel.org
To: "Fan Wu" <fanwu01@zju.edu.cn>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH] scsi: megaraid_sas: kill tasklet after free_irq in teardown paths
Date: Wed, 19 Aug 2026 01:25:54 +0000 [thread overview]
Message-ID: <20260819012555.245851F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260819005043.439436-1-fanwu01@zju.edu.cn>
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Unprotected concurrent access to the global `megasas_mgmt_info` array during device probe and detach causes out-of-bounds writes.
- [High] The error paths in `megasas_resume` fail to disable/destroy IRQs, kill the tasklet, and free PCI IRQ vectors, causing a use-after-free.
- [High] Legacy INTx IRQ vectors are systematically leaked in teardown and error paths.
- [High] Incomplete tasklet cleanup in initialization error paths allows a pending tasklet to execute after the `instance` is freed.
- [High] The asynchronous work item `instance->work_init` is never cancelled during driver teardown, suspend, or probe error paths.
--
--- Patch [1]: [PATCH] scsi: megaraid_sas: kill tasklet after free_irq in teardown paths ---
commit 8d9eb16b77703617161e881af92f251c7fb898af
Author: Fan Wu <fanwu01@zju.edu.cn>
scsi: megaraid_sas: kill tasklet after free_irq in teardown paths
On MFI-series adapters the interrupt handler arms instance->isr_tasklet
for as long as the interrupt is registered, so the tasklet can be armed
again after tasklet_kill() has returned. This patch moves tasklet_kill()
after megasas_destroy_irqs() to ensure tasklets are stopped after
the handler is drained.
Cc: stable@vger.kernel.org
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
> index f0152b043e18c..e72009a587567 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -6536,6 +6536,7 @@ static int megasas_init_fw(struct megasas_instance *instance)
> fail_get_ld_pd_list:
> instance->instancet->disable_intr(instance);
> megasas_destroy_irqs(instance);
> + tasklet_kill(&instance->isr_tasklet);
> fail_init_adapter:
[Severity: High]
This isn't a bug introduced by this patch, but does the jump to
fail_init_adapter leave the tasklet pending if IRQ setup fails?
If megasas_setup_irqs_msix() partially succeeds but fails on a
subsequent vector, it returns an error and the code jumps to
fail_init_adapter, bypassing the tasklet_kill() added here.
Since the rollback loop in megasas_setup_irqs_msix() calls free_irq()
which doesn't kill scheduled tasklets, can the pending tasklet
execute and dereference the freed instance memory?
> if (instance->msix_vectors)
> pci_free_irq_vectors(instance->pdev);
[Severity: High]
This is a pre-existing issue, but does this conditional check leak
legacy INTx IRQ vectors?
When MSI-X is unavailable, the driver falls back to allocating a
legacy INTx interrupt, but instance->msix_vectors remains 0.
By wrapping pci_free_irq_vectors() in this condition across the
teardown and error paths, it appears the cleanup is skipped for
INTx vectors.
Does this permanently leak IRQ resources in the error paths?
[ ... ]
> @@ -7618,6 +7619,7 @@ static int megasas_probe_one(struct pci_dev *pdev,
>
> instance->instancet->disable_intr(instance);
> megasas_destroy_irqs(instance);
> + tasklet_kill(&instance->isr_tasklet);
[Severity: High]
This is a pre-existing issue, but do the error paths in megasas_probe_one()
properly clean up interrupts and tasklets before freeing the instance?
If a late step in the probe fails, such as megasas_fusion_start_watchdog(),
the code jumps to fail_init_mfi. At this point, IRQs have already been
requested and the tasklet initialized.
However, the fail_init_mfi path skips disable_intr, megasas_destroy_irqs,
and tasklet_kill, but proceeds to free the coherent DMA buffers and the
host structure.
Can an active ISR or scheduled tasklet execute after these are freed,
resulting in a use-after-free?
[ ... ]
> @@ -8010,8 +8011,6 @@ static void megasas_detach_one(struct pci_dev *pdev)
> /* cancel all wait events */
> wake_up_all(&instance->int_cmd_wait_q);
>
[Severity: High]
This is a pre-existing issue, but is the asynchronous work item
instance->work_init properly cancelled during detach?
The driver schedules instance->work_init on the global system
workqueue to handle firmware state changes and online controller
resets. Neither the detach path nor the suspend and probe error
handlers appear to call cancel_work_sync(&instance->work_init).
If a controller fault triggers the work right before teardown,
will the asynchronous work dereference the freed instance memory?
> - tasklet_kill(&instance->isr_tasklet);
> -
> /*
> * Take the instance off the instance array. Note that we will not
> * decrement the max_index. We let this array be sparse array
[Severity: Critical]
This is a pre-existing issue, but does this sparse array management
allow unbounded growth and out-of-bounds writes?
Because megasas_detach_one() intentionally does not decrement
max_index, repeated unbind and bind cycles via sysfs or hotplugs
will cause max_index to grow continuously.
Since there is no bounds checking in megasas_probe_one() when
inserting new instances:
megasas_probe_one() {
...
megasas_mgmt_info.count++;
megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = instance;
megasas_mgmt_info.max_index++;
...
}
Will max_index eventually exceed MAX_MGMT_ADAPTERS and overwrite
adjacent kernel memory?
> @@ -8028,6 +8027,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
> instance->instancet->disable_intr(instance);
>
> megasas_destroy_irqs(instance);
> + tasklet_kill(&instance->isr_tasklet);
>
> if (instance->msix_vectors)
> pci_free_irq_vectors(instance->pdev);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260819005043.439436-1-fanwu01@zju.edu.cn?part=1
prev parent reply other threads:[~2026-08-19 1:25 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 0:50 [PATCH] scsi: megaraid_sas: kill tasklet after free_irq in teardown paths Fan Wu
2026-08-19 1:25 ` sashiko-bot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260819012555.245851F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=fanwu01@zju.edu.cn \
--cc=linux-scsi@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.