| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-26627: scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler |
| |
| Inside scsi_eh_wakeup(), scsi_host_busy() is called & checked with host |
| lock every time for deciding if error handler kthread needs to be waken up. |
| |
| This can be too heavy in case of recovery, such as: |
| |
| - N hardware queues |
| |
| - queue depth is M for each hardware queue |
| |
| - each scsi_host_busy() iterates over (N * M) tag/requests |
| |
| If recovery is triggered in case that all requests are in-flight, each |
| scsi_eh_wakeup() is strictly serialized, when scsi_eh_wakeup() is called |
| for the last in-flight request, scsi_host_busy() has been run for (N * M - |
| 1) times, and request has been iterated for (N*M - 1) * (N * M) times. |
| |
| If both N and M are big enough, hard lockup can be triggered on acquiring |
| host lock, and it is observed on mpi3mr(128 hw queues, queue depth 8169). |
| |
| Fix the issue by calling scsi_host_busy() outside the host lock. We don't |
| need the host lock for getting busy count because host the lock never |
| covers that. |
| |
| [mkp: Drop unnecessary 'busy' variables pointed out by Bart] |
| |
| The Linux kernel CVE team has assigned CVE-2024-26627 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 5.10.210 with commit f5944853f7a961fedc1227dc8f60393f8936d37c |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 5.15.149 with commit d37c1c81419fdef66ebd0747cf76fb8b7d979059 |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 6.1.77 with commit db6338f45971b4285ea368432a84033690eaf53c |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 6.6.16 with commit 65ead8468c21c2676d4d06f50b46beffdea69df1 |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 6.7.4 with commit 07e3ca0f17f579491b5f54e9ed05173d6c1d6fcb |
| Issue introduced in 5.5 with commit 6eb045e092efefafc6687409a6fa6d1dabf0fb69 and fixed in 6.8 with commit 4373534a9850627a2695317944898eb1283a2db0 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-26627 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| drivers/scsi/scsi_error.c |
| drivers/scsi/scsi_lib.c |
| drivers/scsi/scsi_priv.h |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/f5944853f7a961fedc1227dc8f60393f8936d37c |
| https://git.kernel.org/stable/c/d37c1c81419fdef66ebd0747cf76fb8b7d979059 |
| https://git.kernel.org/stable/c/db6338f45971b4285ea368432a84033690eaf53c |
| https://git.kernel.org/stable/c/65ead8468c21c2676d4d06f50b46beffdea69df1 |
| https://git.kernel.org/stable/c/07e3ca0f17f579491b5f54e9ed05173d6c1d6fcb |
| https://git.kernel.org/stable/c/4373534a9850627a2695317944898eb1283a2db0 |