basebuilder_pel7x64builder0
6 years ago
2 changed files with 147 additions and 2 deletions
@ -0,0 +1,137 @@
@@ -0,0 +1,137 @@
|
||||
From 71fac05d32d8665b19fad2041ab81056d7a96325 Mon Sep 17 00:00:00 2001 |
||||
From: Brian King <brking@linux.vnet.ibm.com> |
||||
Date: Tue, 8 May 2018 15:04:33 -0500 |
||||
Subject: [PATCH] iprutils: Further show-details speedup |
||||
|
||||
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 <brking@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; |
||||
} |
||||
-- |
||||
2.14.4 |
||||
|
Loading…
Reference in new issue