Commit c63b0084 authored by Easwar Hariharan's avatar Easwar Hariharan Committed by Wen Zhiwei
Browse files

scsi: storvsc: Ratelimit warning logs to prevent VM denial of service

stable inclusion
from stable-v6.6.75
commit 088bde862f8d3d0fc52e40e66a0484a246837087
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBSPQB

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=088bde862f8d3d0fc52e40e66a0484a246837087

--------------------------------

commit d2138eab8cde61e0e6f62d0713e45202e8457d6d upstream.

If there's a persistent error in the hypervisor, the SCSI warning for
failed I/O can flood the kernel log and max out CPU utilization,
preventing troubleshooting from the VM side. Ratelimit the warning so
it doesn't DoS the VM.

Closes: https://github.com/microsoft/WSL/issues/9173


Signed-off-by: default avatarEaswar Hariharan <eahariha@linux.microsoft.com>
Link: https://lore.kernel.org/r/20250107-eahariha-ratelimit-storvsc-v1-1-7fc193d1f2b0@linux.microsoft.com


Reviewed-by: default avatarMichael Kelley <mhklinux@outlook.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 3287794d
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -171,6 +171,12 @@ do { \
		dev_warn(&(dev)->device, fmt, ##__VA_ARGS__);	\
} while (0)

#define storvsc_log_ratelimited(dev, level, fmt, ...)				\
do {										\
	if (do_logging(level))							\
		dev_warn_ratelimited(&(dev)->device, fmt, ##__VA_ARGS__);	\
} while (0)

struct vmscsi_request {
	u16 length;
	u8 srb_status;
@@ -1177,7 +1183,7 @@ static void storvsc_on_io_completion(struct storvsc_device *stor_device,
		int loglevel = (stor_pkt->vm_srb.cdb[0] == TEST_UNIT_READY) ?
			STORVSC_LOGGING_WARN : STORVSC_LOGGING_ERROR;

		storvsc_log(device, loglevel,
		storvsc_log_ratelimited(device, loglevel,
			"tag#%d cmd 0x%x status: scsi 0x%x srb 0x%x hv 0x%x\n",
			scsi_cmd_to_rq(request->cmd)->tag,
			stor_pkt->vm_srb.cdb[0],