On 12/03/15 18:04, Carsey, Jaben wrote: > > >> -----Original Message----- >> From: Laszlo Ersek [mailto:ler...@redhat.com] >> Sent: Thursday, December 03, 2015 3:26 AM >> To: Qiu, Shumin <shumin....@intel.com>; edk2-de...@ml01.01.org >> Cc: Carsey, Jaben <jaben.car...@intel.com> >> Subject: Re: [edk2] [PATCH] ShellPkg: Refine the code to reduce time cost of >> 'map -r' >> Importance: High >> >> On 12/03/15 06:35, Qiu Shumin wrote: >>> In some platform 'map -r' may cost more than 1 min. This patch filter the >> target handles by >>> BlockIO and SimpleFileSystem protocol to reduce the time cost. >> >> Hijacking this thread and asking a more general question -- I noticed >> recently that the "devices" and "drivers" commands can take quite long. >> I guess there is a lot of processing to be done for those. But, has it >> been considered to change the internal representation of the protocol >> database to speed things up? (I'm asking this without knowing too much >> about the current representation.) >> >> I'm not suggesting that the current proto DB representation is slow; I'm >> just curious if the perf consequences of the representation have been >> considered before. > > > not to my knowledge. Curiosity - do you mean internal representation in the > shell or in the platform? The shell maintains almost no internal > representation of anything.
In the platform. The performance of some of the protocol boot services could depend on that representation. But, maybe the shell could be optimized too (I haven't looked at the code). I can imagine that for cross-referencing various things it uses O(n^2) nested loops or something similar, even if state is not maintained longer than a command's execution. Thanks Laszlo > >> >> Thanks! >> Laszlo >> >>> >>> Cc: Jaben Carsey <jaben.car...@intel.com> >>> Contributed-under: TianoCore Contribution Agreement 1.0 >>> Signed-off-by: Qiu Shumin <shumin....@intel.com> >>> --- >>> .../Library/UefiShellCommandLib/ConsistMapping.c | 40 >> ++++++++++++++++------ >>> 1 file changed, 30 insertions(+), 10 deletions(-) >>> >>> diff --git a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c >> b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c >>> index 9bd7b2c..86e8dc5 100644 >>> --- a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c >>> +++ b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c >>> @@ -16,6 +16,10 @@ >>> #include <Library/SortLib.h> >>> #include <Library/UefiLib.h> >>> #include <Protocol/UsbIo.h> >>> +#include <Protocol/BlockIo.h> >>> +#include <Protocol/SimpleFileSystem.h> >>> + >>> + >>> >>> typedef enum { >>> MTDTypeUnknown, >>> @@ -1349,20 +1353,22 @@ ShellCommandConsistMappingInitialize ( >>> OUT EFI_DEVICE_PATH_PROTOCOL ***Table >>> ) >>> { >>> - EFI_HANDLE *HandleBuffer; >>> - UINTN HandleNum; >>> - UINTN HandleLoop; >>> - EFI_DEVICE_PATH_PROTOCOL **TempTable; >>> - EFI_DEVICE_PATH_PROTOCOL *DevicePath; >>> - EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; >>> - UINTN Index; >>> - EFI_STATUS Status; >>> + EFI_HANDLE *HandleBuffer; >>> + UINTN HandleNum; >>> + UINTN HandleLoop; >>> + EFI_DEVICE_PATH_PROTOCOL **TempTable; >>> + EFI_DEVICE_PATH_PROTOCOL *DevicePath; >>> + EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; >>> + EFI_BLOCK_IO_PROTOCOL *BlockIo; >>> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem; >>> + UINTN Index; >>> + EFI_STATUS Status; >>> >>> HandleBuffer = NULL; >>> >>> Status = gBS->LocateHandleBuffer ( >>> - AllHandles, >>> - NULL, >>> + ByProtocol, >>> + &gEfiDevicePathProtocolGuid, >>> NULL, >>> &HandleNum, >>> &HandleBuffer >>> @@ -1385,6 +1391,20 @@ ShellCommandConsistMappingInitialize ( >>> continue; >>> } >>> >>> + Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], >>> + &gEfiBlockIoProtocolGuid, >>> + (VOID **)&BlockIo >>> + ); >>> + if (EFI_ERROR(Status)) { >>> + Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], >>> + &gEfiSimpleFileSystemProtocolGuid, >>> + (VOID **)&SimpleFileSystem >>> + ); >>> + if (EFI_ERROR(Status)) { >>> + continue; >>> + } >>> + } >>> + >>> for (Index = 0; TempTable[Index] != NULL; Index++) { >>> if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) { >>> FreePool (HIDevicePath); >>> > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel