From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D9B91DE3D6 for ; Fri, 22 Aug 2025 15:10:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755875418; cv=none; b=arVw3GLf4u6QSURrFZgVwGCD0E4mBAO7Ak8dnxXZzEPXnOj2OdW2lrt9vCQu/RCFcUBVhRT/ChCQIEeFrKEABTIg9WfT4yovXCnI6TPx2SIGQUtZC/TuHAUejdyREkn4OAHZDerTmALJIjEvW5z9DbRjCrrKWMUO3jWPaRjbXBM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755875418; c=relaxed/simple; bh=k8W0CPBGEuGD4cJ93KVjRER9Q0iQjXStu8gFdztrNtI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UXzbnE/rLVZWxXwLAj2y4s4Aejk7P7gnLCsC6P5rgXt8VJJhN9ag2SNPN7dfN9GJhoL1ChrAfCS93N2dKa+SqXBwV0+UzX+kcGsdCf1VXsnNJiisUxba3zTNhHMs9RwceCLCSWPrugvkhBt9AgGRzPB7DhpyIk0n2MxwKYTnMUw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vDw6jLMn; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vDw6jLMn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 73EAEC116B1; Fri, 22 Aug 2025 15:10:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755875417; bh=k8W0CPBGEuGD4cJ93KVjRER9Q0iQjXStu8gFdztrNtI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vDw6jLMng8wqBXH8j8LSYLQgMnxzTzvGGHgGk+dsy9J36jkPMWtlr6o6juPETLuhN 0PuuuDHa+S3dlGUbZ60kWCNUnmw3g8Zs9BHy8wvaYOP7++YDCaesDLKIqtaJLi4eE3 y8c9u5/nR83e0NaQJcfajuPMGxe0cs02rr61l3uHKQi/Rn1jihatD+wwDRyt1QHeck w6bTujgBhFh+/rmambt4F+Wpsxo4sxCInFgKfZXNj+1brRwM0q3iu51wye3qIcXUYZ 39+TB1WkLcwAFIVvhw08w8WPlKGUOOaGbtvnsBvZ6ye/NC/teaNNAiMmWIXnpIEUBH xpFZZ7pUSWNXw== From: Sasha Levin To: stable@vger.kernel.org Cc: Ranjan Kumar , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 6.1.y 2/2] scsi: mpi3mr: Serialize admin queue BAR writes on 32-bit systems Date: Fri, 22 Aug 2025 11:10:13 -0400 Message-ID: <20250822151013.1280211-2-sashal@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250822151013.1280211-1-sashal@kernel.org> References: <2025082105-penalize-quadrant-9ad9@gregkh> <20250822151013.1280211-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Ranjan Kumar [ Upstream commit c91e140c82eb58724c435f623702e51cc7896646 ] On 32-bit systems, 64-bit BAR writes to admin queue registers are performed as two 32-bit writes. Without locking, this can cause partial writes when accessed concurrently. Updated per-queue spinlocks is used to serialize these writes and prevent race conditions. Fixes: 824a156633df ("scsi: mpi3mr: Base driver code") Cc: stable@vger.kernel.org Signed-off-by: Ranjan Kumar Link: https://lore.kernel.org/r/20250627194539.48851-4-ranjan.kumar@broadcom.com Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/mpi3mr/mpi3mr.h | 4 ++++ drivers/scsi/mpi3mr/mpi3mr_fw.c | 15 +++++++++++---- drivers/scsi/mpi3mr/mpi3mr_os.c | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index 90c9a539768d..ffeadd1e3543 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -1005,6 +1005,8 @@ struct scmd_priv { * @logdata_buf: Circular buffer to store log data entries * @logdata_buf_idx: Index of entry in buffer to store * @logdata_entry_sz: log data entry size + * @adm_req_q_bar_writeq_lock: Admin request queue lock + * @adm_reply_q_bar_writeq_lock: Admin reply queue lock * @pend_large_data_sz: Counter to track pending large data * @io_throttle_data_length: I/O size to track in 512b blocks * @io_throttle_high: I/O size to start throttle in 512b blocks @@ -1186,6 +1188,8 @@ struct mpi3mr_ioc { u8 *logdata_buf; u16 logdata_buf_idx; u16 logdata_entry_sz; + spinlock_t adm_req_q_bar_writeq_lock; + spinlock_t adm_reply_q_bar_writeq_lock; atomic_t pend_large_data_sz; u32 io_throttle_data_length; diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index d2fcecf94eaf..b721abfd853d 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -23,17 +23,22 @@ module_param(poll_queues, int, 0444); MODULE_PARM_DESC(poll_queues, "Number of queues for io_uring poll mode. (Range 1 - 126)"); #if defined(writeq) && defined(CONFIG_64BIT) -static inline void mpi3mr_writeq(__u64 b, void __iomem *addr) +static inline void mpi3mr_writeq(__u64 b, void __iomem *addr, + spinlock_t *write_queue_lock) { writeq(b, addr); } #else -static inline void mpi3mr_writeq(__u64 b, void __iomem *addr) +static inline void mpi3mr_writeq(__u64 b, void __iomem *addr, + spinlock_t *write_queue_lock) { __u64 data_out = b; + unsigned long flags; + spin_lock_irqsave(write_queue_lock, flags); writel((u32)(data_out), addr); writel((u32)(data_out >> 32), (addr + 4)); + spin_unlock_irqrestore(write_queue_lock, flags); } #endif @@ -2662,9 +2667,11 @@ static int mpi3mr_setup_admin_qpair(struct mpi3mr_ioc *mrioc) (mrioc->num_admin_req); writel(num_admin_entries, &mrioc->sysif_regs->admin_queue_num_entries); mpi3mr_writeq(mrioc->admin_req_dma, - &mrioc->sysif_regs->admin_request_queue_address); + &mrioc->sysif_regs->admin_request_queue_address, + &mrioc->adm_req_q_bar_writeq_lock); mpi3mr_writeq(mrioc->admin_reply_dma, - &mrioc->sysif_regs->admin_reply_queue_address); + &mrioc->sysif_regs->admin_reply_queue_address, + &mrioc->adm_reply_q_bar_writeq_lock); writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi); writel(mrioc->admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci); return retval; diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 7bd24f71cc38..c9a0c6b739a1 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -4948,6 +4948,8 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) spin_lock_init(&mrioc->tgtdev_lock); spin_lock_init(&mrioc->watchdog_lock); spin_lock_init(&mrioc->chain_buf_lock); + spin_lock_init(&mrioc->adm_req_q_bar_writeq_lock); + spin_lock_init(&mrioc->adm_reply_q_bar_writeq_lock); spin_lock_init(&mrioc->sas_node_lock); INIT_LIST_HEAD(&mrioc->fwevt_list); -- 2.50.1