From fc1d3133d7ffc739f2356eb5d30c2994d585e7bb Mon Sep 17 00:00:00 2001
From: Donald Buczek <buczek@molgen.mpg.de>
Date: Sun, 19 Feb 2023 13:55:09 +0100
Subject: [PATCH] scsi: mpt3sas: Rate-limit scsi_dma_map() error messages

---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 5651f7869c167..b484377cfc573 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -131,6 +131,9 @@ enum mpt3sas_perf_mode {
 	MPT_PERF_MODE_LATENCY	= 2,
 };
 
+
+static DEFINE_RATELIMIT_STATE(dma_map_failed_warning_rlstate, (60 * 60 * HZ), 4);   /* max 4 per hour */
+
 static int
 _base_wait_on_iocstate(struct MPT3SAS_ADAPTER *ioc,
 		u32 ioc_state, int timeout);
@@ -2595,9 +2598,10 @@ _base_check_pcie_native_sgl(struct MPT3SAS_ADAPTER *ioc,
 	/* Get the SG list pointer and info. */
 	sges_left = scsi_dma_map(scmd);
 	if (sges_left < 0) {
-		sdev_printk(KERN_ERR, scmd->device,
-			"scsi_dma_map failed: request for %d bytes!\n",
-			scsi_bufflen(scmd));
+		if (__ratelimit(&dma_map_failed_warning_rlstate))
+			sdev_printk(KERN_ERR, scmd->device,
+				"scsi_dma_map failed in _base_check_pcie_native_sgl: request for %d bytes!\n",
+				scsi_bufflen(scmd));
 		return 1;
 	}
 
@@ -2707,10 +2711,11 @@ _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc,
 	sg_scmd = scsi_sglist(scmd);
 	sges_left = scsi_dma_map(scmd);
 	if (sges_left < 0) {
-		sdev_printk(KERN_ERR, scmd->device,
-		 "scsi_dma_map failed: request for %d bytes!\n",
-		 scsi_bufflen(scmd));
-		return -ENOMEM;
+	    if (__ratelimit(&dma_map_failed_warning_rlstate))
+			sdev_printk(KERN_ERR, scmd->device,
+				"scsi_dma_map failed in _base_build_sg_scmd: request for %d bytes!\n",
+				scsi_bufflen(scmd));
+	    return -ENOMEM;
 	}
 
 	sg_local = &mpi_request->SGL;
@@ -2855,9 +2860,10 @@ _base_build_sg_scmd_ieee(struct MPT3SAS_ADAPTER *ioc,
 	sg_scmd = scsi_sglist(scmd);
 	sges_left = scsi_dma_map(scmd);
 	if (sges_left < 0) {
-		sdev_printk(KERN_ERR, scmd->device,
-			"scsi_dma_map failed: request for %d bytes!\n",
-			scsi_bufflen(scmd));
+		if (__ratelimit(&dma_map_failed_warning_rlstate))
+			sdev_printk(KERN_ERR, scmd->device,
+				"scsi_dma_map failed in _base_build_sg_scmd_ieee: request for %d bytes!\n",
+				scsi_bufflen(scmd));
 		return -ENOMEM;
 	}