Skip to content

Commit

Permalink
scsi: aacraid: Reply queue mapping to CPUs based on IRQ affinity
Browse files Browse the repository at this point in the history
[ Upstream commit 9dc704d ]

Fix the I/O hang that arises because of the MSIx vector not having a mapped
online CPU upon receiving completion.

SCSI cmds take the blk_mq route, which is setup during init. Reserved cmds
fetch the vector_no from mq_map after init is complete. Before init, they
have to use 0 - as per the norm.

Reviewed-by: Gilbert Wu <gilbert.wu@microchip.com>
Signed-off-by: Sagar Biradar <Sagar.Biradar@microchip.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Link: https://lore.kernel.org/r/20230519230834.27436-1-sagar.biradar@microchip.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Sagar Biradar authored and gregkh committed Sep 13, 2023
1 parent dcfd75b commit 7d1ac3c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
1 change: 1 addition & 0 deletions drivers/scsi/aacraid/aacraid.h
Expand Up @@ -1678,6 +1678,7 @@ struct aac_dev
u32 handle_pci_error;
bool init_reset;
u8 soft_reset_support;
u8 use_map_queue;
};

#define aac_adapter_interrupt(dev) \
Expand Down
6 changes: 5 additions & 1 deletion drivers/scsi/aacraid/commsup.c
Expand Up @@ -223,8 +223,12 @@ int aac_fib_setup(struct aac_dev * dev)
struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd)
{
struct fib *fibptr;
u32 blk_tag;
int i;

fibptr = &dev->fibs[scsi_cmd_to_rq(scmd)->tag];
blk_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd));
i = blk_mq_unique_tag_to_tag(blk_tag);
fibptr = &dev->fibs[i];
/*
* Null out fields that depend on being zero at the start of
* each I/O
Expand Down
14 changes: 14 additions & 0 deletions drivers/scsi/aacraid/linit.c
Expand Up @@ -19,6 +19,7 @@

#include <linux/compat.h>
#include <linux/blkdev.h>
#include <linux/blk-mq-pci.h>
#include <linux/completion.h>
#include <linux/init.h>
#include <linux/interrupt.h>
Expand Down Expand Up @@ -505,6 +506,15 @@ static int aac_slave_configure(struct scsi_device *sdev)
return 0;
}

static void aac_map_queues(struct Scsi_Host *shost)
{
struct aac_dev *aac = (struct aac_dev *)shost->hostdata;

blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
aac->pdev, 0);
aac->use_map_queue = true;
}

/**
* aac_change_queue_depth - alter queue depths
* @sdev: SCSI device we are considering
Expand Down Expand Up @@ -1489,6 +1499,7 @@ static struct scsi_host_template aac_driver_template = {
.bios_param = aac_biosparm,
.shost_groups = aac_host_groups,
.slave_configure = aac_slave_configure,
.map_queues = aac_map_queues,
.change_queue_depth = aac_change_queue_depth,
.sdev_groups = aac_dev_groups,
.eh_abort_handler = aac_eh_abort,
Expand Down Expand Up @@ -1776,6 +1787,8 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
shost->max_lun = AAC_MAX_LUN;

pci_set_drvdata(pdev, shost);
shost->nr_hw_queues = aac->max_msix;
shost->host_tagset = 1;

error = scsi_add_host(shost, &pdev->dev);
if (error)
Expand Down Expand Up @@ -1908,6 +1921,7 @@ static void aac_remove_one(struct pci_dev *pdev)
struct aac_dev *aac = (struct aac_dev *)shost->hostdata;

aac_cancel_rescan_worker(aac);
aac->use_map_queue = false;
scsi_remove_host(shost);

__aac_shutdown(aac);
Expand Down
25 changes: 23 additions & 2 deletions drivers/scsi/aacraid/src.c
Expand Up @@ -493,6 +493,10 @@ static int aac_src_deliver_message(struct fib *fib)
#endif

u16 vector_no;
struct scsi_cmnd *scmd;
u32 blk_tag;
struct Scsi_Host *shost = dev->scsi_host_ptr;
struct blk_mq_queue_map *qmap;

atomic_inc(&q->numpending);

Expand All @@ -505,8 +509,25 @@ static int aac_src_deliver_message(struct fib *fib)
if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)
&& dev->sa_firmware)
vector_no = aac_get_vector(dev);
else
vector_no = fib->vector_no;
else {
if (!fib->vector_no || !fib->callback_data) {
if (shost && dev->use_map_queue) {
qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT];
vector_no = qmap->mq_map[raw_smp_processor_id()];
}
/*
* We hardcode the vector_no for
* reserved commands as a valid shost is
* absent during the init
*/
else
vector_no = 0;
} else {
scmd = (struct scsi_cmnd *)fib->callback_data;
blk_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd));
vector_no = blk_mq_unique_tag_to_hwq(blk_tag);
}
}

if (native_hba) {
if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) {
Expand Down

0 comments on commit 7d1ac3c

Please sign in to comment.