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.

This attached patch is against current scsi-misc-2.6.

ObligatoryDisclaimer: Please accept my condolences regarding Outlook's handling 
of patch attachments (inline gets damaged, use attachment).

Signed-off-by: Mark Salyzyn <[EMAIL PROTECTED]>

 drivers/scsi/aacraid/linit.c |   23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

--- a/drivers/scsi/aacraid/linit.c      2008-01-08 16:38:32.783320829 -0500
+++ b/drivers/scsi/aacraid/linit.c      2008-01-08 16:55:07.805050564 -0500
@@ -401,16 +401,14 @@

 static int aac_slave_configure(struct scsi_device *sdev)
 {
+       struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
        if ((sdev->type == TYPE_DISK) &&
-                       (sdev_channel(sdev) != CONTAINER_CHANNEL)) {
+                       (sdev_channel(sdev) != CONTAINER_CHANNEL) &&
+                       (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))) {
                if (expose_physicals == 0)
                        return -ENXIO;
-               if (expose_physicals < 0) {
-                       struct aac_dev *aac =
-                               (struct aac_dev *)sdev->host->hostdata;
-                       if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))
-                               sdev->no_uld_attach = 1;
-               }
+               if (expose_physicals < 0)
+                       sdev->no_uld_attach = 1;
        }
        if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
                        (sdev_channel(sdev) == CONTAINER_CHANNEL)) {
@@ -419,6 +417,7 @@
                unsigned num_lsu = 0;
                unsigned num_one = 0;
                unsigned depth;
+               unsigned cid;

                /*
                 * Firmware has an individual device recovery time typically
@@ -426,11 +425,15 @@
                 */
                if (sdev->timeout < (45 * HZ))
                        sdev->timeout = 45 * HZ;
+               for (cid = 0; cid < aac->maximum_num_containers; ++cid)
+                       if (aac->fsa_dev[cid].valid)
+                               ++num_lsu;
                __shost_for_each_device(dev, host) {
                        if (dev->tagged_supported && (dev->type == TYPE_DISK) &&

-                               (sdev_channel(dev) == CONTAINER_CHANNEL))
-                               ++num_lsu;
-                       else
+                               (sdev_channel(dev) == CONTAINER_CHANNEL)) {
+                               if (!aac->fsa_dev[sdev_id(dev)].valid)
+                                       ++num_lsu;
+                       } else
                                ++num_one;
                }
                if (num_lsu == 0)

Sincerely -- Mark Salyzyn

Attachment: aacraid_queue_depth.patch
Description: aacraid_queue_depth.patch

Reply via email to