> -----Original Message----- > From: Kubacki, Michael A > Sent: Tuesday, October 15, 2019 7:30 AM > To: devel@edk2.groups.io > Cc: Bi, Dandan; Ard Biesheuvel; Dong, Eric; Laszlo Ersek; Gao, Liming; Kinney, > Michael D; Ni, Ray; Wang, Jian J; Wu, Hao A; Yao, Jiewen > Subject: [PATCH V4 08/10] MdeModulePkg/Variable: Add RT > GetNextVariableName() cache support > > https://bugzilla.tianocore.org/show_bug.cgi?id=2220 > > This change implements the Runtime Service GetNextVariableName() > using the runtime cache in VariableSmmRuntimeDxe. Runtime Service > calls to GetNextVariableName() will no longer trigger a SW SMI > when gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache > is set to TRUE (default value).
I think from the perspective of this patch, the default value for the feature PCD is still FALSE, and the last patch of the series will actually switch the default value to TRUE, right? If my take is correct, I think we can drop the mention of "(default value)" here. Other than this, the patch looks good to me: Reviewed-by: Hao A Wu <hao.a...@intel.com> Best Regards, Hao Wu > > Overall system performance and stability will be improved by > eliminating an SMI for these calls as they typically result in a > relatively large number of invocations to retrieve all variable > names in all variable stores present. > > Cc: Dandan Bi <dandan...@intel.com> > Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> > Cc: Eric Dong <eric.d...@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > Cc: Liming Gao <liming....@intel.com> > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Jian J Wang <jian.j.w...@intel.com> > Cc: Hao A Wu <hao.a...@intel.com> > Cc: Jiewen Yao <jiewen....@intel.com> > Signed-off-by: Michael Kubacki <michael.a.kuba...@intel.com> > --- > > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe. > c | 137 ++++++++++++++++++-- > 1 file changed, 128 insertions(+), 9 deletions(-) > > diff --git > a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDx > e.c > b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDx > e.c > index e236ddff33..a795b9fcab 100644 > --- > a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDx > e.c > +++ > b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDx > e.c > @@ -823,7 +823,7 @@ RuntimeServiceGetVariable ( > } > > /** > - This code Finds the Next available variable. > + Finds the next available variable in a runtime cache variable store. > > @param[in, out] VariableNameSize Size of the variable name. > @param[in, out] VariableName Pointer to variable name. > @@ -836,8 +836,81 @@ RuntimeServiceGetVariable ( > > **/ > EFI_STATUS > -EFIAPI > -RuntimeServiceGetNextVariableName ( > +GetNextVariableNameInRuntimeCache ( > + IN OUT UINTN *VariableNameSize, > + IN OUT CHAR16 *VariableName, > + IN OUT EFI_GUID *VendorGuid > + ) > +{ > + EFI_STATUS Status; > + UINTN VarNameSize; > + VARIABLE_HEADER *VariablePtr; > + VARIABLE_STORE_HEADER > *VariableStoreHeader[VariableStoreTypeMax]; > + > + Status = EFI_NOT_FOUND; > + > + // > + // The UEFI specification restricts Runtime Services callers from invoking > the same or certain other Runtime Service > + // functions prior to completion and return from a previous Runtime > Service call. These restrictions prevent > + // a GetVariable () or GetNextVariable () call from being issued until a > prior > call has returned. The runtime > + // cache read lock should always be free when entering this function. > + // > + ASSERT (!mVariableRuntimeCacheReadLock); > + > + CheckForRuntimeCacheSync (); > + > + mVariableRuntimeCacheReadLock = TRUE; > + if (!mVariableRuntimeCachePendingUpdate) { > + // > + // 0: Volatile, 1: HOB, 2: Non-Volatile. > + // The index and attributes mapping must be kept in this order as > FindVariable > + // makes use of this mapping to implement search algorithm. > + // > + VariableStoreHeader[VariableStoreTypeVolatile] = > mVariableRuntimeVolatileCacheBuffer; > + VariableStoreHeader[VariableStoreTypeHob] = > mVariableRuntimeHobCacheBuffer; > + VariableStoreHeader[VariableStoreTypeNv] = > mVariableRuntimeNvCacheBuffer; > + > + Status = VariableServiceGetNextVariableInternal ( > + VariableName, > + VendorGuid, > + VariableStoreHeader, > + &VariablePtr, > + mVariableAuthFormat > + ); > + if (!EFI_ERROR (Status)) { > + VarNameSize = NameSizeOfVariable (VariablePtr, > mVariableAuthFormat); > + ASSERT (VarNameSize != 0); > + if (VarNameSize <= *VariableNameSize) { > + CopyMem (VariableName, GetVariableNamePtr (VariablePtr, > mVariableAuthFormat), VarNameSize); > + CopyMem (VendorGuid, GetVendorGuidPtr (VariablePtr, > mVariableAuthFormat), sizeof (EFI_GUID)); > + Status = EFI_SUCCESS; > + } else { > + Status = EFI_BUFFER_TOO_SMALL; > + } > + > + *VariableNameSize = VarNameSize; > + } > + } > + mVariableRuntimeCacheReadLock = FALSE; > + > + return Status; > +} > + > +/** > + Finds the next available variable in a SMM variable store. > + > + @param[in, out] VariableNameSize Size of the variable name. > + @param[in, out] VariableName Pointer to variable name. > + @param[in, out] VendorGuid Variable Vendor Guid. > + > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_SUCCESS Find the specified variable. > + @retval EFI_NOT_FOUND Not found. > + @retval EFI_BUFFER_TO_SMALL DataSize is too small for the result. > + > +**/ > +EFI_STATUS > +GetNextVariableNameInSmm ( > IN OUT UINTN *VariableNameSize, > IN OUT CHAR16 *VariableName, > IN OUT EFI_GUID *VendorGuid > @@ -849,10 +922,6 @@ RuntimeServiceGetNextVariableName ( > UINTN OutVariableNameSize; > UINTN InVariableNameSize; > > - if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == > NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > OutVariableNameSize = *VariableNameSize; > InVariableNameSize = StrSize (VariableName); > SmmGetNextVariableName = NULL; > @@ -864,8 +933,6 @@ RuntimeServiceGetNextVariableName ( > return EFI_INVALID_PARAMETER; > } > > - AcquireLockOnlyAtBootTime(&mVariableServicesLock); > - > // > // Init the communicate buffer. The buffer data size is: > // SMM_COMMUNICATE_HEADER_SIZE + > SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + PayloadSize. > @@ -924,7 +991,59 @@ RuntimeServiceGetNextVariableName ( > CopyMem (VariableName, SmmGetNextVariableName->Name, > SmmGetNextVariableName->NameSize); > > Done: > + return Status; > +} > + > +/** > + This code Finds the Next available variable. > + > + @param[in, out] VariableNameSize Size of the variable name. > + @param[in, out] VariableName Pointer to variable name. > + @param[in, out] VendorGuid Variable Vendor Guid. > + > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_SUCCESS Find the specified variable. > + @retval EFI_NOT_FOUND Not found. > + @retval EFI_BUFFER_TO_SMALL DataSize is too small for the result. > + > +**/ > +EFI_STATUS > +EFIAPI > +RuntimeServiceGetNextVariableName ( > + IN OUT UINTN *VariableNameSize, > + IN OUT CHAR16 *VariableName, > + IN OUT EFI_GUID *VendorGuid > + ) > +{ > + EFI_STATUS Status; > + UINTN MaxLen; > + > + Status = EFI_NOT_FOUND; > + > + if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == > NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Calculate the possible maximum length of name string, including the Null > terminator. > + // > + MaxLen = *VariableNameSize / sizeof (CHAR16); > + if ((MaxLen == 0) || (StrnLenS (VariableName, MaxLen) == MaxLen)) { > + // > + // Null-terminator is not found in the first VariableNameSize bytes of > the > input VariableName buffer, > + // follow spec to return EFI_INVALID_PARAMETER. > + // > + return EFI_INVALID_PARAMETER; > + } > + > + AcquireLockOnlyAtBootTime (&mVariableServicesLock); > + if (FeaturePcdGet (PcdEnableVariableRuntimeCache)) { > + Status = GetNextVariableNameInRuntimeCache (VariableNameSize, > VariableName, VendorGuid); > + } else { > + Status = GetNextVariableNameInSmm (VariableNameSize, VariableName, > VendorGuid); > + } > ReleaseLockOnlyAtBootTime (&mVariableServicesLock); > + > return Status; > } > > -- > 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#49072): https://edk2.groups.io/g/devel/message/49072 Mute This Topic: https://groups.io/mt/34540093/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-