diff options
author | Varun Prakash <varun@chelsio.com> | 2019-04-21 19:00:43 +0530 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2019-04-29 08:34:08 -0400 |
commit | e95a5e4b1a219c55c360a91a71064f9318733211 (patch) | |
tree | 0f8f4a1ac3104d31055c725db96e0bd14d9f5f72 | |
parent | a1f9ab4844acdd8415dddd588f4fcac4d5b05c8e (diff) |
scsi: csiostor: create per port irq affinity mask set
csiostor driver allocates per port num_online_cpus() irq vectors, so create
per-port irq affinity mask set to spread irq vectors evenly.
Signed-off-by: Varun Prakash <varun@chelsio.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/csiostor/csio_isr.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/scsi/csiostor/csio_isr.c b/drivers/scsi/csiostor/csio_isr.c index 7c8814715711..b2540402fafc 100644 --- a/drivers/scsi/csiostor/csio_isr.c +++ b/drivers/scsi/csiostor/csio_isr.c @@ -474,13 +474,39 @@ csio_reduce_sqsets(struct csio_hw *hw, int cnt) csio_dbg(hw, "Reduced sqsets to %d\n", hw->num_sqsets); } +static void csio_calc_sets(struct irq_affinity *affd, unsigned int nvecs) +{ + struct csio_hw *hw = affd->priv; + u8 i; + + if (!nvecs) + return; + + if (nvecs < hw->num_pports) { + affd->nr_sets = 1; + affd->set_size[0] = nvecs; + return; + } + + affd->nr_sets = hw->num_pports; + for (i = 0; i < hw->num_pports; i++) + affd->set_size[i] = nvecs / hw->num_pports; +} + static int csio_enable_msix(struct csio_hw *hw) { int i, j, k, n, min, cnt; int extra = CSIO_EXTRA_VECS; struct csio_scsi_cpu_info *info; - struct irq_affinity desc = { .pre_vectors = 2 }; + struct irq_affinity desc = { + .pre_vectors = CSIO_EXTRA_VECS, + .calc_sets = csio_calc_sets, + .priv = hw, + }; + + if (hw->num_pports > IRQ_AFFINITY_MAX_SETS) + return -ENOSPC; min = hw->num_pports + extra; cnt = hw->num_sqsets + extra; |