Sunny,
I reposted the patch serials to follow your suggestions.

Regards,
Ray


>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Wang, 
>Sunny (HPS SW)
>Sent: Friday, April 1, 2016 7:42 PM
>To: Ni, Ruiyu <ruiyu...@intel.com>
>Cc: Fu, Siyuan <siyuan...@intel.com>; edk2-devel@lists.01.org; Tian, Feng 
><feng.t...@intel.com>
>Subject: Re: [edk2] [Patch v3 2/3] MdeModulePkg/Bds: Free resources after ram 
>disk boot finishes
>
>Hi Ray,
>For this patch, I just found a minor issue and also have a suggestion below. 
>Others look good to me.
>
>Minor issue:
>The following newly created functions' parameter lack IN and/or OUT modifiers:
>1. BmGetLoadFileRamDisk
>2. BmGetRamDiskMemoryInfo
>3. BmDestroyRamDisk
>
>Suggestion:
>It looks like both BmGetLoadFileRamDisk and BmGetFileBufferFromLoadFileSystem) 
>should be better to return
>RamDiskDevicePath instead of RamDiskHandle because both BmDestroyRamDisk and 
>BmGetRamDiskMemoryInfo only need
>RamDisk's device path. In other words, if we change to return 
>RamDiskDevicePath, we will NOT need to have
>DevicePathFromHandle function calls in newly added code. What do you think?
>By the way, if you agree with my suggestion above, we may also consider to 
>directly use FullPath instead of adding new
>output parameter RamDiskHandle/RamDiskDevicePath to 
>BmGetFileBufferFromLoadFileSystem(). For this one, I didn't take a
>deep look, so it maybe is not feasible. Just mention it here for your 
>reference.
>
>Regards,
>Sunny Wang
>
>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Ruiyu Ni
>Sent: Wednesday, March 30, 2016 8:29 AM
>To: edk2-devel@lists.01.org
>Cc: Ruiyu Ni <ruiyu...@intel.com>; Siyuan Fu <siyuan...@intel.com>; Feng Tian 
><feng.t...@intel.com>
>Subject: [edk2] [Patch v3 2/3] MdeModulePkg/Bds: Free resources after ram disk 
>boot finishes
>
>The resource free includes to un-register the ram disk device and free the 
>memory occupied by the ram disk.
>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
>Cc: Siyuan Fu <siyuan...@intel.com>
>Cc: Feng Tian <feng.t...@intel.com>
>---
> MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c   | 155 ++++++++++++++++++++-
> .../Library/UefiBootManagerLib/InternalBm.h        |   1 +
> .../UefiBootManagerLib/UefiBootManagerLib.inf      |   1 +
> 3 files changed, 153 insertions(+), 4 deletions(-)
>
>diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>index 6e5c13b..598de26 100644
>--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>@@ -1095,6 +1095,7 @@ BmMatchHttpBootDevicePath (
>   @param LoadFileHandle The handle of LoadFile instance.
>   @param FullPath       Return the full device path pointing to the load 
> option.
>   @param FileSize       Return the size of the load option.
>+  @param RamDiskHandle  Return the RAM Disk handle.
>
>   @return  The load option buffer.
> **/
>@@ -1102,7 +1103,8 @@ VOID *
> BmGetFileBufferFromLoadFileSystem (
>   IN  EFI_HANDLE                      LoadFileHandle,
>   OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
>-  OUT UINTN                           *FileSize
>+  OUT UINTN                           *FileSize,
>+  OUT EFI_HANDLE                      *RamDiskHandle
>   )
> {
>   EFI_STATUS                      Status;
>@@ -1140,7 +1142,13 @@ BmGetFileBufferFromLoadFileSystem (
>     FreePool (Handles);
>   }
>
>-  if (Index != HandleCount) {
>+  if (Index == HandleCount) {
>+    Handle = NULL;
>+  }
>+
>+  *RamDiskHandle = Handle;
>+
>+  if (Handle != NULL) {
>     return BmExpandMediaDevicePath (DevicePathFromHandle (Handle), FullPath, 
> FileSize);
>   } else {
>     return NULL;
>@@ -1149,6 +1157,124 @@ BmGetFileBufferFromLoadFileSystem (
>
>
> /**
>+  Return the RAM DISK handle created by LoadFile.
>+
>+  @param FilePath  The source file path.
>+
>+  @return RAM DISK handle.
>+**/
>+EFI_HANDLE
>+BmGetLoadFileRamDisk (
>+  EFI_DEVICE_PATH_PROTOCOL    *FilePath
>+  )
>+{
>+  EFI_STATUS                  Status;
>+  EFI_DEVICE_PATH_PROTOCOL    *RamDiskDevicePath;
>+  EFI_DEVICE_PATH_PROTOCOL    *Node;
>+  EFI_HANDLE                  Handle;
>+
>+  Node = FilePath;
>+  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node,
>+ &Handle);  if (!EFI_ERROR (Status) &&
>+      (DevicePathType (Node) == MEDIA_DEVICE_PATH) &&
>+      (DevicePathSubType (Node) == MEDIA_RAM_DISK_DP)
>+      ) {
>+
>+    //
>+    // Construct the device path pointing to RAM Disk
>+    //
>+    Node = NextDevicePathNode (Node);
>+    RamDiskDevicePath = DuplicateDevicePath (FilePath);
>+    ASSERT (RamDiskDevicePath != NULL);
>+    SetDevicePathEndNode ((VOID *) ((UINTN) RamDiskDevicePath +
>+ ((UINTN) Node - (UINTN) FilePath)));
>+
>+    //
>+    // Query the RAM Disk handle using the constructed device path.
>+    //
>+    Node = RamDiskDevicePath;
>+    Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &Node, &Handle);
>+    ASSERT ((Status == EFI_SUCCESS) && IsDevicePathEnd (Node));
>+    FreePool (RamDiskDevicePath);
>+    return Handle;
>+  }
>+
>+  return NULL;
>+}
>+
>+/**
>+  Return the buffer and buffer size occupied by the RAM Disk.
>+
>+  @param RamDiskHandle      RAM Disk handle.
>+  @param RamDiskSizeInPages Return RAM Disk size in pages.
>+
>+  @retval RAM Disk buffer.
>+**/
>+VOID *
>+BmGetRamDiskMemoryInfo (
>+  EFI_HANDLE                  RamDiskHandle,
>+  UINTN                       *RamDiskSizeInPages
>+  )
>+{
>+
>+  EFI_STATUS                  Status;
>+  EFI_DEVICE_PATH_PROTOCOL    *DevicePath;
>+  EFI_HANDLE                  Handle;
>+  UINT64                      StartingAddr;
>+  UINT64                      EndingAddr;
>+
>+  *RamDiskSizeInPages = 0;
>+  if (RamDiskHandle == NULL) {
>+    return NULL;
>+  }
>+  DevicePath = DevicePathFromHandle (RamDiskHandle);
>+
>+  //
>+  // Get the buffer occupied by RAM Disk.
>+  //
>+  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid,
>+&DevicePath, &Handle);
>+  ASSERT_EFI_ERROR (Status);
>+  ASSERT ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
>+(DevicePathSubType (DevicePath) == MEDIA_RAM_DISK_DP));
>+  StartingAddr = ReadUnaligned64 ((UINT64 *) ((MEDIA_RAM_DISK_DEVICE_PATH *) 
>DevicePath)->StartingAddr);
>+  EndingAddr   = ReadUnaligned64 ((UINT64 *) ((MEDIA_RAM_DISK_DEVICE_PATH *) 
>DevicePath)->EndingAddr);
>+  *RamDiskSizeInPages = EFI_SIZE_TO_PAGES ((UINTN) (EndingAddr -
>+StartingAddr + 1));
>+  return (VOID *) (UINTN) StartingAddr; }
>+
>+/**
>+  Destroy the RAM Disk handle.
>+
>+  The destroy operation includes to call RamDisk.Unregister to
>+ unregister the RAM DISK from RAM DISK driver, free the memory
>+ allocated for the RAM Disk.
>+
>+  @param RamDiskHandle   RAM Disk handle.
>+**/
>+VOID
>+BmDestroyRamDisk (
>+  EFI_HANDLE                  RamDiskHandle
>+  )
>+{
>+  EFI_STATUS                  Status;
>+  EFI_RAM_DISK_PROTOCOL       *RamDisk;
>+  VOID                        *RamDiskBuffer;
>+  UINTN                       RamDiskSizeInPages;
>+
>+  if (RamDiskHandle == NULL) {
>+    return;
>+  }
>+  RamDiskBuffer = BmGetRamDiskMemoryInfo (RamDiskHandle,
>+ &RamDiskSizeInPages);
>+
>+  //
>+  // Destroy RAM Disk.
>+  //
>+  Status = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, (VOID
>+*) &RamDisk);
>+  ASSERT_EFI_ERROR (Status);
>+  Status = RamDisk->Unregister (DevicePathFromHandle (RamDiskHandle));
>+  ASSERT_EFI_ERROR (Status);
>+  FreePages (RamDiskBuffer, RamDiskSizeInPages); }
>+
>+/**
>   Get the file buffer from the specified Load File instance.
>
>   @param LoadFileHandle The specified Load File instance.
>@@ -1170,6 +1296,7 @@ BmGetFileBufferFromLoadFile (
>   EFI_LOAD_FILE_PROTOCOL              *LoadFile;
>   VOID                                *FileBuffer;
>   BOOLEAN                             LoadFileSystem;
>+  EFI_HANDLE                          RamDiskHandle;
>   UINTN                               BufferSize;
>
>   *FileSize = 0;
>@@ -1204,7 +1331,13 @@ BmGetFileBufferFromLoadFile (
>   }
>
>   if (LoadFileSystem) {
>-    FileBuffer = BmGetFileBufferFromLoadFileSystem (LoadFileHandle, FullPath, 
>FileSize);
>+    FileBuffer = BmGetFileBufferFromLoadFileSystem (LoadFileHandle, FullPath, 
>FileSize, &RamDiskHandle);
>+    if (FileBuffer == NULL) {
>+      //
>+      // If there is no bootable executable in the populated
>+      //
>+      BmDestroyRamDisk (RamDiskHandle);
>+    }
>   } else {
>     *FileSize = BufferSize;
>     *FullPath = DuplicateDevicePath (DevicePathFromHandle (LoadFileHandle)); 
> @@ -1432,6 +1565,7 @@
>EfiBootManagerBoot (
>   UINTN                     OriginalOptionNumber;
>   EFI_DEVICE_PATH_PROTOCOL  *FilePath;
>   EFI_DEVICE_PATH_PROTOCOL  *Node;
>+  EFI_HANDLE                RamDiskHandle;
>   EFI_HANDLE                FvHandle;
>   VOID                      *FileBuffer;
>   UINTN                     FileSize;
>@@ -1512,10 +1646,14 @@ EfiBootManagerBoot (
>   //
>   // 5. Load EFI boot option to ImageHandle
>   //
>-  ImageHandle = NULL;
>+  ImageHandle   = NULL;
>+  RamDiskHandle = NULL;
>   if (DevicePathType (BootOption->FilePath) != BBS_DEVICE_PATH) {
>     Status     = EFI_NOT_FOUND;
>     FileBuffer = BmGetLoadOptionBuffer (BootOption->FilePath, &FilePath, 
> &FileSize);
>+    if (FileBuffer != NULL) {
>+      RamDiskHandle = BmGetLoadFileRamDisk (FilePath);
>+    }
>     DEBUG_CODE (
>       if (FileBuffer != NULL && CompareMem (BootOption->FilePath, FilePath, 
> GetDevicePathSize (FilePath)) != 0) {
>         DEBUG ((EFI_D_INFO, "[Bds] DevicePath expand: ")); @@ -1552,6 
> +1690,10 @@ EfiBootManagerBoot (
>         (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR)
>         );
>       BootOption->Status = Status;
>+      //
>+      // Destroy the RAM disk
>+      //
>+      BmDestroyRamDisk (RamDiskHandle);
>       return;
>     }
>   }
>@@ -1648,6 +1790,11 @@ EfiBootManagerBoot (
>   PERF_END_EX (gImageHandle, "BdsAttempt", NULL, 0, (UINT32) OptionNumber);
>
>   //
>+  // Destroy the RAM disk
>+  //
>+  BmDestroyRamDisk (RamDiskHandle);
>+
>+  //
>   // Clear the Watchdog Timer after the image returns
>   //
>   gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); diff --git
>a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h 
>b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
>index 7b6252a..4660323 100644
>--- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
>+++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
>@@ -43,6 +43,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
>EXPRESS OR IMPLIED.
> #include <Protocol/DriverHealth.h>
> #include <Protocol/FormBrowser2.h>
> #include <Protocol/VariableLock.h>
>+#include <Protocol/RamDisk.h>
>
> #include <Guid/ZeroGuid.h>
> #include <Guid/MemoryTypeInformation.h> diff --git
>a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>index e9e74b1..9d62d3d 100644
>--- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>+++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>@@ -108,6 +108,7 @@
>   gEfiDiskInfoProtocolGuid                      ## SOMETIMES_CONSUMES
>   gEfiDriverHealthProtocolGuid                  ## SOMETIMES_CONSUMES
>   gEfiFormBrowser2ProtocolGuid                  ## SOMETIMES_CONSUMES
>+  gEfiRamDiskProtocolGuid                       ## SOMETIMES_CONSUMES
>
> [Pcd]
>   gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange      
> ## SOMETIMES_CONSUMES
>--
>2.7.0.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to