While attempting to further optimize show-details performance,
it was observed that get_drive_phy_loc was iterating over all
ioa's, even though a specific ioa is passed into the function.
On large configurations, this resulted in show-details taking
longer than 5 seconds. If we remove this redundant code, show-details
will now complete in less than 1 second in a similar configuration.

Signed-off-by: Brian King <brk...@linux.vnet.ibm.com>
---
 iprconfig.c | 94 ++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 46 insertions(+), 48 deletions(-)

diff --git a/iprconfig.c b/iprconfig.c
index 9f4f61f..6a5fd21 100644
--- a/iprconfig.c
+++ b/iprconfig.c
@@ -17780,66 +17780,64 @@ static int get_drive_phy_loc(struct ipr_ioa *ioa)
        char phy_loc[PHYSICAL_LOCATION_LENGTH + 1];
        int times, index;
 
-       for_each_ioa(ioa)  {
-               is_spi = ioa_is_spi(ioa);
+       is_spi = ioa_is_spi(ioa);
 
-               for_each_hotplug_dev(ioa, dev) {
-                       if (ioa->sis64)
-                               get_res_path(dev);
-                       else
-                               get_res_addrs(dev);
-               }
+       for_each_hotplug_dev(ioa, dev) {
+               if (ioa->sis64)
+                       get_res_path(dev);
+               else
+                       get_res_addrs(dev);
+       }
 
-               for_each_ses(ioa, ses) {
-                       times = 5;
-                       if (strlen(ses->physical_location) == 0)
-                               get_ses_phy_loc(ses);
-                       while (times--) {
-                               if (!ipr_receive_diagnostics(ses, 2, &ses_data, 
sizeof(ses_data)))
-                                       break;
-                       }
-                       if (times < 0 ) continue;
+       for_each_ses(ioa, ses) {
+               times = 5;
+               if (strlen(ses->physical_location) == 0)
+                       get_ses_phy_loc(ses);
+               while (times--) {
+                       if (!ipr_receive_diagnostics(ses, 2, &ses_data, 
sizeof(ses_data)))
+                               break;
+               }
+               if (times < 0 ) continue;
 
-                       if (ipr_receive_diagnostics(ses, 1, &ses_cfg, 
sizeof(ses_cfg)))
-                               continue;
+               if (ipr_receive_diagnostics(ses, 1, &ses_cfg, sizeof(ses_cfg)))
+                       continue;
 
-                       if (ipr_receive_diagnostics(ses, 7, &drive_data, 
sizeof(drive_data)))
-                               continue;
+               if (ipr_receive_diagnostics(ses, 7, &drive_data, 
sizeof(drive_data)))
+                       continue;
 
-                       overall = ipr_get_overall_elem(&ses_data, &ses_cfg);
-                       ses_bus = ses->scsi_dev_data->channel;
-                       scsi_id_found = 0;
+               overall = ipr_get_overall_elem(&ses_data, &ses_cfg);
+               ses_bus = ses->scsi_dev_data->channel;
+               scsi_id_found = 0;
 
-                       if (!is_spi && (overall->device_environment == 0))
-                               is_vses = 1;
-                       else
-                               is_vses = 0;
+               if (!is_spi && (overall->device_environment == 0))
+                       is_vses = 1;
+               else
+                       is_vses = 0;
 
-                       scsi_dbg(ses, "%s\n", is_vses ? "Found VSES" : "Found 
real SES");
+               scsi_dbg(ses, "%s\n", is_vses ? "Found VSES" : "Found real 
SES");
 
-                       for_each_elem_status(elem_status, &ses_data, &ses_cfg) {
-                               index = index_in_page2(&ses_data, 
elem_status->slot_id);
-                               if (index != -1)
-                                       get_drive_phy_loc_with_ses_phy_loc(ses, 
&drive_data, index, phy_loc, 0);
-
-                               if (elem_status->status == 
IPR_DRIVE_ELEM_STATUS_UNSUPP)
-                                       continue;
-                               if (elem_status->status == 
IPR_DRIVE_ELEM_STATUS_NO_ACCESS)
-                                       continue;
-                               if (is_spi && (scsi_id_found & (1 << 
elem_status->slot_id)))
-                                       continue;
-                               scsi_id_found |= (1 << elem_status->slot_id);
+               for_each_elem_status(elem_status, &ses_data, &ses_cfg) {
+                       index = index_in_page2(&ses_data, elem_status->slot_id);
+                       if (index != -1)
+                               get_drive_phy_loc_with_ses_phy_loc(ses, 
&drive_data, index, phy_loc, 0);
 
-                               if (ioa->sis64)
-                                       dev = get_dev_for_slot_64bit(ses, 
elem_status->slot_id, phy_loc);
-                               else
-                                       dev = get_dev_for_slot(ses, 
elem_status->slot_id, is_vses, phy_loc);
-                               if (!dev)
-                                       continue;
+                       if (elem_status->status == IPR_DRIVE_ELEM_STATUS_UNSUPP)
+                               continue;
+                       if (elem_status->status == 
IPR_DRIVE_ELEM_STATUS_NO_ACCESS)
+                               continue;
+                       if (is_spi && (scsi_id_found & (1 << 
elem_status->slot_id)))
+                               continue;
+                       scsi_id_found |= (1 << elem_status->slot_id);
 
-                       }
+                       if (ioa->sis64)
+                               dev = get_dev_for_slot_64bit(ses, 
elem_status->slot_id, phy_loc);
+                       else
+                               dev = get_dev_for_slot(ses, 
elem_status->slot_id, is_vses, phy_loc);
+                       if (!dev)
+                               continue;
 
                }
+
        }
        return 0;
 }
-- 
1.8.3.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to