FAILED: patch "[PATCH] scsi: mpi3mr: Serialize admin queue BAR writes on 32-bit" failed to apply to 6.16-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.16-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.16.y
git checkout FETCH_HEAD
git cherry-pick -x c91e140c82eb58724c435f623702e51cc7896646
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025082104-chunk-scoring-a931@gregkh' --subject-prefix 'PATCH 6.16.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c91e140c82eb58724c435f623702e51cc7896646 Mon Sep 17 00:00:00 2001
From: Ranjan Kumar <[email protected]>
Date: Sat, 28 Jun 2025 01:15:38 +0530
Subject: [PATCH] scsi: mpi3mr: Serialize admin queue BAR writes on 32-bit
systems
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.
drivers/scsi/mpi3mr/mpi3mr.h +4 -0
@@ -1137,6 +1137,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
@@ -1339,6 +1341,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;
drivers/scsi/mpi3mr/mpi3mr_fw.c +11 -4
@@ -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
@@ -2954,9 +2959,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;
drivers/scsi/mpi3mr/mpi3mr_os.c +2 -0
@@ -5365,6 +5365,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);spin_lock_init (&mrioc->trigger_lock);
Sasha Levin
maintainerPATCH 1/2 scsi: mpi3mr: Drop unnecessary volatile from __iomem pointers
From: Ranjan Kumar <[email protected]>
[ Upstream commit 6853885b21cb1d7157cc14c9d30cc17141565bae ]
The volatile qualifier is redundant for __iomem pointers.
Cleaned up usage in mpi3mr_writeq() and sysif_regs pointer as per Upstream compliance.
Stable-dep-of: c91e140c82eb ("scsi: mpi3mr: Serialize admin queue BAR writes on 32-bit systems")
--- drivers/scsi/mpi3mr/mpi3mr.h | 2 +- drivers/scsi/mpi3mr/mpi3mr_fw.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/mpi3mr/mpi3mr.h +1 -1
@@ -1185,7 +1185,7 @@ struct mpi3mr_ioc {char name[MPI3MR_NAME_LENGTH ];char driver_name[MPI3MR_NAME_LENGTH ]; -volatile struct mpi3_sysif_registers __iomem *sysif_regs; +struct mpi3_sysif_registers __iomem *sysif_regs;resource_size_t sysif_regs_phys;int bars;u64 dma_mask;
drivers/scsi/mpi3mr/mpi3mr_fw.c +2 -2
@@ -23,12 +23,12 @@ 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,volatile void __iomem *addr) +static inline void mpi3mr_writeq (__u64 b,void __iomem *addr) {writeq (b, addr); }#else -static inline void mpi3mr_writeq (__u64 b,volatile void __iomem *addr) +static inline void mpi3mr_writeq (__u64 b,void __iomem *addr) {__u64 data_out = b;
Signature · 1 line
2.50.1
Sasha Levin
maintainerPATCH 2/2 scsi: mpi3mr: Serialize admin queue BAR writes on 32-bit systems
From: Ranjan Kumar <[email protected]>
[ 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.
--- 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(-)
drivers/scsi/mpi3mr/mpi3mr.h +4 -0
@@ -1137,6 +1137,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
@@ -1339,6 +1341,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;
drivers/scsi/mpi3mr/mpi3mr_fw.c +11 -4
@@ -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
@@ -2954,9 +2959,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;
drivers/scsi/mpi3mr/mpi3mr_os.c +2 -0
@@ -5383,6 +5383,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);spin_lock_init (&mrioc->trigger_lock);
Signature · 1 line
2.50.1