On Fri, May 31, 2019 at 09:41:58AM +0200, Hannes Reinecke wrote: > (Resending due to missing mailing list submission) > > Update v3 to support SCSI multiqueue. > > Signed-off-by: Hannes Reinecke <hare@xxxxxxxx> > --- > drivers/scsi/hisi_sas/hisi_sas.h | 1 - > drivers/scsi/hisi_sas/hisi_sas_main.c | 45 +++++++++++++++++----------------- > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 44 +++++++++++---------------------- > 3 files changed, 36 insertions(+), 54 deletions(-) > > diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h > index fc87994b5d73..4b6f32f60689 100644 > --- a/drivers/scsi/hisi_sas/hisi_sas.h > +++ b/drivers/scsi/hisi_sas/hisi_sas.h > @@ -378,7 +378,6 @@ struct hisi_hba { > u32 intr_coal_count; /* Interrupt count to coalesce */ > > int cq_nvecs; > - unsigned int *reply_map; > > /* debugfs memories */ > u32 *debugfs_global_reg; > diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c > index 8a7feb8ed8d6..f4237c4754a4 100644 > --- a/drivers/scsi/hisi_sas/hisi_sas_main.c > +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c > @@ -200,16 +200,12 @@ static void hisi_sas_slot_index_set(struct hisi_hba *hisi_hba, int slot_idx) > set_bit(slot_idx, bitmap); > } > > -static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba, > - struct scsi_cmnd *scsi_cmnd) > +static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba) > { > int index; > void *bitmap = hisi_hba->slot_index_tags; > unsigned long flags; > > - if (scsi_cmnd) > - return scsi_cmnd->request->tag; > - > spin_lock_irqsave(&hisi_hba->lock, flags); > index = find_next_zero_bit(bitmap, hisi_hba->slot_index_count, > hisi_hba->last_slot_index + 1); Then you switch to hisi_sas_slot_index_alloc() for allocating the unique tag via spin_lock & find_next_zero_bit(). Do you think this way is more efficient than blk-mq's sbitmap? The worsen thing is that V3's actual max queue depth is (4096 - 96), but this patch claims that the device can support (4096 - 96) * 32 command slots, finally hisi_sas_slot_index_alloc() is used to respect the actual max queue depth(4000). Big contention is caused on hisi_sas_slot_index_alloc(), meantime huge memory is wasted for request pool. Thanks, Ming