]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: pm8001: Use non-atomic bitmap ops for tag alloc + free
authorJohn Garry <john.garry@huawei.com>
Fri, 10 Jun 2022 16:46:41 +0000 (00:46 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 17 Jun 2022 01:45:09 +0000 (21:45 -0400)
In pm8001_tag_alloc() we don't require atomic set_bit() as we are already
in atomic context. In pm8001_tag_free() we should use the same host
spinlock to protect clearing the tag (and then don't require the atomic
clear_bit()).

Link: https://lore.kernel.org/r/1654879602-33497-4-git-send-email-john.garry@huawei.com
Tested-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/pm8001/pm8001_sas.c

index 3a863d776724351eba164f7302cf48cc150b80fa..8e3f2f9ddaacd037cb34b5181179fccd7bbdaaff 100644 (file)
@@ -66,7 +66,11 @@ static int pm8001_find_tag(struct sas_task *task, u32 *tag)
 void pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag)
 {
        void *bitmap = pm8001_ha->tags;
-       clear_bit(tag, bitmap);
+       unsigned long flags;
+
+       spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags);
+       __clear_bit(tag, bitmap);
+       spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags);
 }
 
 /**
@@ -76,9 +80,9 @@ void pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag)
   */
 int pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out)
 {
-       unsigned int tag;
        void *bitmap = pm8001_ha->tags;
        unsigned long flags;
+       unsigned int tag;
 
        spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags);
        tag = find_first_zero_bit(bitmap, pm8001_ha->tags_num);
@@ -86,7 +90,7 @@ int pm8001_tag_alloc(struct pm8001_hba_info *pm8001_ha, u32 *tag_out)
                spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags);
                return -SAS_QUEUE_FULL;
        }
-       set_bit(tag, bitmap);
+       __set_bit(tag, bitmap);
        spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags);
        *tag_out = tag;
        return 0;