Commit 34f0c627 authored by Don Brace's avatar Don Brace Committed by James Bottomley

hpsa: count passthru cmds with atomics, not a spin locked int

Performance enhancement. Remove spin_locks from the driver.
Reviewed-by: default avatarScott Teel <scott.teel@pmcs.com>
Signed-off-by: default avatarDon Brace <don.brace@pmcs.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 33811026
...@@ -5105,35 +5105,6 @@ static void check_ioctl_unit_attention(struct ctlr_info *h, ...@@ -5105,35 +5105,6 @@ static void check_ioctl_unit_attention(struct ctlr_info *h,
(void) check_for_unit_attention(h, c); (void) check_for_unit_attention(h, c);
} }
static int increment_passthru_count(struct ctlr_info *h)
{
unsigned long flags;
spin_lock_irqsave(&h->passthru_count_lock, flags);
if (h->passthru_count >= HPSA_MAX_CONCURRENT_PASSTHRUS) {
spin_unlock_irqrestore(&h->passthru_count_lock, flags);
return -1;
}
h->passthru_count++;
spin_unlock_irqrestore(&h->passthru_count_lock, flags);
return 0;
}
static void decrement_passthru_count(struct ctlr_info *h)
{
unsigned long flags;
spin_lock_irqsave(&h->passthru_count_lock, flags);
if (h->passthru_count <= 0) {
spin_unlock_irqrestore(&h->passthru_count_lock, flags);
/* not expecting to get here. */
dev_warn(&h->pdev->dev, "Bug detected, passthru_count seems to be incorrect.\n");
return;
}
h->passthru_count--;
spin_unlock_irqrestore(&h->passthru_count_lock, flags);
}
/* /*
* ioctl * ioctl
*/ */
...@@ -5156,16 +5127,16 @@ static int hpsa_ioctl(struct scsi_device *dev, int cmd, void __user *arg) ...@@ -5156,16 +5127,16 @@ static int hpsa_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
case CCISS_GETDRIVVER: case CCISS_GETDRIVVER:
return hpsa_getdrivver_ioctl(h, argp); return hpsa_getdrivver_ioctl(h, argp);
case CCISS_PASSTHRU: case CCISS_PASSTHRU:
if (increment_passthru_count(h)) if (atomic_dec_if_positive(&h->passthru_cmds_avail) < 0)
return -EAGAIN; return -EAGAIN;
rc = hpsa_passthru_ioctl(h, argp); rc = hpsa_passthru_ioctl(h, argp);
decrement_passthru_count(h); atomic_inc(&h->passthru_cmds_avail);
return rc; return rc;
case CCISS_BIG_PASSTHRU: case CCISS_BIG_PASSTHRU:
if (increment_passthru_count(h)) if (atomic_dec_if_positive(&h->passthru_cmds_avail) < 0)
return -EAGAIN; return -EAGAIN;
rc = hpsa_big_passthru_ioctl(h, argp); rc = hpsa_big_passthru_ioctl(h, argp);
decrement_passthru_count(h); atomic_inc(&h->passthru_cmds_avail);
return rc; return rc;
default: default:
return -ENOTTY; return -ENOTTY;
...@@ -6852,7 +6823,7 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -6852,7 +6823,7 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
spin_lock_init(&h->lock); spin_lock_init(&h->lock);
spin_lock_init(&h->offline_device_lock); spin_lock_init(&h->offline_device_lock);
spin_lock_init(&h->scan_lock); spin_lock_init(&h->scan_lock);
spin_lock_init(&h->passthru_count_lock); atomic_set(&h->passthru_cmds_avail, HPSA_MAX_CONCURRENT_PASSTHRUS);
h->resubmit_wq = alloc_workqueue("hpsa", WQ_MEM_RECLAIM, 0); h->resubmit_wq = alloc_workqueue("hpsa", WQ_MEM_RECLAIM, 0);
if (!h->resubmit_wq) { if (!h->resubmit_wq) {
......
...@@ -183,8 +183,7 @@ struct ctlr_info { ...@@ -183,8 +183,7 @@ struct ctlr_info {
/* cap concurrent passthrus at some reasonable maximum */ /* cap concurrent passthrus at some reasonable maximum */
#define HPSA_MAX_CONCURRENT_PASSTHRUS (10) #define HPSA_MAX_CONCURRENT_PASSTHRUS (10)
spinlock_t passthru_count_lock; /* protects passthru_count */ atomic_t passthru_cmds_avail;
int passthru_count;
/* /*
* Performant mode completion buffers * Performant mode completion buffers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment