diff mbox series

[29/31] hisi_sas: use task tag to reference the slot

Message ID 20210222132405.91369-30-hare@suse.de (mailing list archive)
State Changes Requested
Headers show
Series scsi: enable reserved commands for LLDDs | expand

Commit Message

Hannes Reinecke Feb. 22, 2021, 1:24 p.m. UTC
Use the task task to reference the command slot and drop the
internal slot bitmap.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/hisi_sas/hisi_sas.h      |  1 -
 drivers/scsi/hisi_sas/hisi_sas_main.c | 78 ++-------------------------
 2 files changed, 5 insertions(+), 74 deletions(-)

Comments

luojiaxing March 10, 2021, 1:54 a.m. UTC | #1
On 2021/2/22 21:24, Hannes Reinecke wrote:
> Use the task task to reference the command slot and drop the
> internal slot bitmap.
>
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
>   drivers/scsi/hisi_sas/hisi_sas.h      |  1 -
>   drivers/scsi/hisi_sas/hisi_sas_main.c | 78 ++-------------------------
>   2 files changed, 5 insertions(+), 74 deletions(-)
>
> diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
> index 2401a9575215..6efe980789ee 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas.h
> +++ b/drivers/scsi/hisi_sas/hisi_sas.h
> @@ -419,7 +419,6 @@ struct hisi_hba {
>   	struct workqueue_struct *wq;
>   
>   	int slot_index_count;
> -	int last_slot_index;
>   	int last_dev_id;
>   	unsigned long *slot_index_tags;
>   	unsigned long reject_stp_links_msk;
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
> index af653f4393ea..6402c4e4befa 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
> @@ -155,62 +155,6 @@ void hisi_sas_stop_phys(struct hisi_hba *hisi_hba)
>   }
>   EXPORT_SYMBOL_GPL(hisi_sas_stop_phys);
>   
> -static void hisi_sas_slot_index_clear(struct hisi_hba *hisi_hba, int slot_idx)
> -{
> -	void *bitmap = hisi_hba->slot_index_tags;
> -
> -	clear_bit(slot_idx, bitmap);
> -}
> -
> -static void hisi_sas_slot_index_free(struct hisi_hba *hisi_hba, int slot_idx)
> -{
> -	if (hisi_hba->hw->slot_index_alloc ||
> -	    slot_idx >= HISI_SAS_UNRESERVED_IPTT) {
> -		spin_lock(&hisi_hba->lock);
> -		hisi_sas_slot_index_clear(hisi_hba, slot_idx);
> -		spin_unlock(&hisi_hba->lock);
> -	}
> -}
> -
> -static void hisi_sas_slot_index_set(struct hisi_hba *hisi_hba, int slot_idx)
> -{
> -	void *bitmap = hisi_hba->slot_index_tags;
> -
> -	set_bit(slot_idx, bitmap);
> -}
> -
> -static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba)
> -{
> -	int index;
> -	void *bitmap = hisi_hba->slot_index_tags;
> -
> -	spin_lock(&hisi_hba->lock);
> -	index = find_next_zero_bit(bitmap, hisi_hba->slot_index_count,
> -				   hisi_hba->last_slot_index + 1);
> -	if (index >= hisi_hba->slot_index_count) {
> -		index = find_next_zero_bit(bitmap,
> -				hisi_hba->slot_index_count,
> -				HISI_SAS_UNRESERVED_IPTT);
> -		if (index >= hisi_hba->slot_index_count) {
> -			spin_unlock(&hisi_hba->lock);
> -			return -SAS_QUEUE_FULL;
> -		}
> -	}
> -	hisi_sas_slot_index_set(hisi_hba, index);
> -	hisi_hba->last_slot_index = index;
> -	spin_unlock(&hisi_hba->lock);
> -
> -	return index;
> -}
> -
> -static void hisi_sas_slot_index_init(struct hisi_hba *hisi_hba)
> -{
> -	int i;
> -
> -	for (i = 0; i < hisi_hba->slot_index_count; ++i)
> -		hisi_sas_slot_index_clear(hisi_hba, i);
> -}
> -
>   void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
>   			     struct hisi_sas_slot *slot)
>   {
> @@ -246,8 +190,6 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
>   	spin_unlock(&sas_dev->lock);
>   
>   	memset(slot, 0, offsetof(struct hisi_sas_slot, buf));
> -
> -	hisi_sas_slot_index_free(hisi_hba, slot->idx);
>   }
>   EXPORT_SYMBOL_GPL(hisi_sas_slot_task_free);
>   
> @@ -482,10 +424,8 @@ static int hisi_sas_task_prep(struct sas_task *task,
>   
>   	if (hisi_hba->hw->slot_index_alloc)
>   		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
> -	else if (scmd)
> -		rc = scmd->request->tag;
>   	else
> -		rc = hisi_sas_slot_index_alloc(hisi_hba);
> +		rc = scmd->request->tag;
>   
>   	if (rc < 0)
>   		goto err_out_dif_dma_unmap;
> @@ -1975,9 +1915,10 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
>   	port = to_hisi_sas_port(sas_port);
>   
>   	/* simply get a slot and send abort command */
> -	rc = = task->tag;
> -	if (rc < 0)
> -		rc = hisi_sas_slot_index_alloc(hisi_hba);
> +	if (hisi_hha->hw->slot_index_alloc)


hisi_hha is wrong , it should be hisi_hba


> +		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
> +	else
> +		rc = = task->tag;


Delete unnecessary "="


>   	if (rc < 0)
>   		goto err_out;
>   
> @@ -2440,12 +2381,6 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba)
>   	if (!hisi_hba->breakpoint)
>   		goto err_out;
>   
> -	hisi_hba->slot_index_count = max_command_entries;
> -	s = hisi_hba->slot_index_count / BITS_PER_BYTE;
> -	hisi_hba->slot_index_tags = devm_kzalloc(dev, s, GFP_KERNEL);
> -	if (!hisi_hba->slot_index_tags)
> -		goto err_out;
> -
>   	s = sizeof(struct hisi_sas_initial_fis) * HISI_SAS_MAX_PHYS;
>   	hisi_hba->initial_fis = dmam_alloc_coherent(dev, s,
>   						    &hisi_hba->initial_fis_dma,
> @@ -2460,9 +2395,6 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba)
>   	if (!hisi_hba->sata_breakpoint)
>   		goto err_out;
>   
> -	hisi_sas_slot_index_init(hisi_hba);
> -	hisi_hba->last_slot_index = HISI_SAS_UNRESERVED_IPTT;
> -
>   	hisi_hba->wq = create_singlethread_workqueue(dev_name(dev));
>   	if (!hisi_hba->wq) {
>   		dev_err(dev, "sas_alloc: failed to create workqueue\n");
diff mbox series

Patch

diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 2401a9575215..6efe980789ee 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -419,7 +419,6 @@  struct hisi_hba {
 	struct workqueue_struct *wq;
 
 	int slot_index_count;
-	int last_slot_index;
 	int last_dev_id;
 	unsigned long *slot_index_tags;
 	unsigned long reject_stp_links_msk;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index af653f4393ea..6402c4e4befa 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -155,62 +155,6 @@  void hisi_sas_stop_phys(struct hisi_hba *hisi_hba)
 }
 EXPORT_SYMBOL_GPL(hisi_sas_stop_phys);
 
-static void hisi_sas_slot_index_clear(struct hisi_hba *hisi_hba, int slot_idx)
-{
-	void *bitmap = hisi_hba->slot_index_tags;
-
-	clear_bit(slot_idx, bitmap);
-}
-
-static void hisi_sas_slot_index_free(struct hisi_hba *hisi_hba, int slot_idx)
-{
-	if (hisi_hba->hw->slot_index_alloc ||
-	    slot_idx >= HISI_SAS_UNRESERVED_IPTT) {
-		spin_lock(&hisi_hba->lock);
-		hisi_sas_slot_index_clear(hisi_hba, slot_idx);
-		spin_unlock(&hisi_hba->lock);
-	}
-}
-
-static void hisi_sas_slot_index_set(struct hisi_hba *hisi_hba, int slot_idx)
-{
-	void *bitmap = hisi_hba->slot_index_tags;
-
-	set_bit(slot_idx, bitmap);
-}
-
-static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba)
-{
-	int index;
-	void *bitmap = hisi_hba->slot_index_tags;
-
-	spin_lock(&hisi_hba->lock);
-	index = find_next_zero_bit(bitmap, hisi_hba->slot_index_count,
-				   hisi_hba->last_slot_index + 1);
-	if (index >= hisi_hba->slot_index_count) {
-		index = find_next_zero_bit(bitmap,
-				hisi_hba->slot_index_count,
-				HISI_SAS_UNRESERVED_IPTT);
-		if (index >= hisi_hba->slot_index_count) {
-			spin_unlock(&hisi_hba->lock);
-			return -SAS_QUEUE_FULL;
-		}
-	}
-	hisi_sas_slot_index_set(hisi_hba, index);
-	hisi_hba->last_slot_index = index;
-	spin_unlock(&hisi_hba->lock);
-
-	return index;
-}
-
-static void hisi_sas_slot_index_init(struct hisi_hba *hisi_hba)
-{
-	int i;
-
-	for (i = 0; i < hisi_hba->slot_index_count; ++i)
-		hisi_sas_slot_index_clear(hisi_hba, i);
-}
-
 void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 			     struct hisi_sas_slot *slot)
 {
@@ -246,8 +190,6 @@  void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 	spin_unlock(&sas_dev->lock);
 
 	memset(slot, 0, offsetof(struct hisi_sas_slot, buf));
-
-	hisi_sas_slot_index_free(hisi_hba, slot->idx);
 }
 EXPORT_SYMBOL_GPL(hisi_sas_slot_task_free);
 
@@ -482,10 +424,8 @@  static int hisi_sas_task_prep(struct sas_task *task,
 
 	if (hisi_hba->hw->slot_index_alloc)
 		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
-	else if (scmd)
-		rc = scmd->request->tag;
 	else
-		rc = hisi_sas_slot_index_alloc(hisi_hba);
+		rc = scmd->request->tag;
 
 	if (rc < 0)
 		goto err_out_dif_dma_unmap;
@@ -1975,9 +1915,10 @@  hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
 	port = to_hisi_sas_port(sas_port);
 
 	/* simply get a slot and send abort command */
-	rc = = task->tag;
-	if (rc < 0)
-		rc = hisi_sas_slot_index_alloc(hisi_hba);
+	if (hisi_hha->hw->slot_index_alloc)
+		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
+	else
+		rc = = task->tag;
 	if (rc < 0)
 		goto err_out;
 
@@ -2440,12 +2381,6 @@  int hisi_sas_alloc(struct hisi_hba *hisi_hba)
 	if (!hisi_hba->breakpoint)
 		goto err_out;
 
-	hisi_hba->slot_index_count = max_command_entries;
-	s = hisi_hba->slot_index_count / BITS_PER_BYTE;
-	hisi_hba->slot_index_tags = devm_kzalloc(dev, s, GFP_KERNEL);
-	if (!hisi_hba->slot_index_tags)
-		goto err_out;
-
 	s = sizeof(struct hisi_sas_initial_fis) * HISI_SAS_MAX_PHYS;
 	hisi_hba->initial_fis = dmam_alloc_coherent(dev, s,
 						    &hisi_hba->initial_fis_dma,
@@ -2460,9 +2395,6 @@  int hisi_sas_alloc(struct hisi_hba *hisi_hba)
 	if (!hisi_hba->sata_breakpoint)
 		goto err_out;
 
-	hisi_sas_slot_index_init(hisi_hba);
-	hisi_hba->last_slot_index = HISI_SAS_UNRESERVED_IPTT;
-
 	hisi_hba->wq = create_singlethread_workqueue(dev_name(dev));
 	if (!hisi_hba->wq) {
 		dev_err(dev, "sas_alloc: failed to create workqueue\n");