aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSalyzyn, Mark <Mark_Salyzyn@adaptec.com>2008-01-08 17:07:57 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-23 12:29:21 -0500
commitb18268fc631034882f5f3dd93daa248a3bfdd085 (patch)
tree6180457b1bff327306a10846e0b1422671633574 /drivers
parentb6ef70f33ca2a3084b4fea12414550724a9114dc (diff)
[SCSI] aacraid: improve queue balancing
The adapter queue is divided up equally to all the arrays to prevent command starvation to any individual array. On the other hand, physical targets are only granted a queue depth of one each. The code prior to this patch used to deal with the incremental discovery of targets, but the driver knows how many arrays are present prior to the scan so this knowledge is used to generate a better estimate for the queue depth. Remove the capability of 'physical=0' from preventing access to the class of adapters that have the RAID/SCSI mode of operation since none of the physicals on the SCSI channel are candidates ever for an array. As always, the user can override this default queue depth policy by making the appropriate adjustments utilizing sysfs. Signed-off-by: Mark Salyzyn <aacraid@adaptec.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/aacraid/linit.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 6a553ea730db..0523cc6d895c 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -401,16 +401,14 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
401 401
402static int aac_slave_configure(struct scsi_device *sdev) 402static int aac_slave_configure(struct scsi_device *sdev)
403{ 403{
404 struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
404 if ((sdev->type == TYPE_DISK) && 405 if ((sdev->type == TYPE_DISK) &&
405 (sdev_channel(sdev) != CONTAINER_CHANNEL)) { 406 (sdev_channel(sdev) != CONTAINER_CHANNEL) &&
407 (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))) {
406 if (expose_physicals == 0) 408 if (expose_physicals == 0)
407 return -ENXIO; 409 return -ENXIO;
408 if (expose_physicals < 0) { 410 if (expose_physicals < 0)
409 struct aac_dev *aac = 411 sdev->no_uld_attach = 1;
410 (struct aac_dev *)sdev->host->hostdata;
411 if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))
412 sdev->no_uld_attach = 1;
413 }
414 } 412 }
415 if (sdev->tagged_supported && (sdev->type == TYPE_DISK) && 413 if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
416 (sdev_channel(sdev) == CONTAINER_CHANNEL)) { 414 (sdev_channel(sdev) == CONTAINER_CHANNEL)) {
@@ -419,6 +417,7 @@ static int aac_slave_configure(struct scsi_device *sdev)
419 unsigned num_lsu = 0; 417 unsigned num_lsu = 0;
420 unsigned num_one = 0; 418 unsigned num_one = 0;
421 unsigned depth; 419 unsigned depth;
420 unsigned cid;
422 421
423 /* 422 /*
424 * Firmware has an individual device recovery time typically 423 * Firmware has an individual device recovery time typically
@@ -426,11 +425,15 @@ static int aac_slave_configure(struct scsi_device *sdev)
426 */ 425 */
427 if (sdev->timeout < (45 * HZ)) 426 if (sdev->timeout < (45 * HZ))
428 sdev->timeout = 45 * HZ; 427 sdev->timeout = 45 * HZ;
428 for (cid = 0; cid < aac->maximum_num_containers; ++cid)
429 if (aac->fsa_dev[cid].valid)
430 ++num_lsu;
429 __shost_for_each_device(dev, host) { 431 __shost_for_each_device(dev, host) {
430 if (dev->tagged_supported && (dev->type == TYPE_DISK) && 432 if (dev->tagged_supported && (dev->type == TYPE_DISK) &&
431 (sdev_channel(dev) == CONTAINER_CHANNEL)) 433 (sdev_channel(dev) == CONTAINER_CHANNEL)) {
432 ++num_lsu; 434 if (!aac->fsa_dev[sdev_id(dev)].valid)
433 else 435 ++num_lsu;
436 } else
434 ++num_one; 437 ++num_one;
435 } 438 }
436 if (num_lsu == 0) 439 if (num_lsu == 0)