diff options
author | Dong-Heon Jung <dheon.jung@samsung.com> | 2019-08-31 06:05:53 +0900 |
---|---|---|
committer | Gleb Balykov <g.balykov@samsung.com> | 2020-03-25 15:29:41 +0300 |
commit | efa62c091a5c9a2729f8948c1d3703156fb78e3b (patch) | |
tree | c1d104e16f236b1650100712debef5fac80ed798 /src/pal/src | |
parent | 06a2676689168f5190c29e7638a47a783cb9258b (diff) | |
download | coreclr-efa62c091a5c9a2729f8948c1d3703156fb78e3b.tar.gz coreclr-efa62c091a5c9a2729f8948c1d3703156fb78e3b.tar.bz2 coreclr-efa62c091a5c9a2729f8948c1d3703156fb78e3b.zip |
Mark Relocation Section as NotNeeded (#25715)
- After relocation, relocation section in zap image is not necessary.
- Mark the section as NotNeeded by giving advice(madvise with MADV_DONTNEED)
- It reduces 120~150KB PSS in tizen sample apps.
Diffstat (limited to 'src/pal/src')
-rw-r--r-- | src/pal/src/include/pal/map.hpp | 7 | ||||
-rw-r--r-- | src/pal/src/loader/module.cpp | 33 | ||||
-rw-r--r-- | src/pal/src/map/map.cpp | 51 |
3 files changed, 91 insertions, 0 deletions
diff --git a/src/pal/src/include/pal/map.hpp b/src/pal/src/include/pal/map.hpp index 16ee58ec43..a2d8e2b748 100644 --- a/src/pal/src/include/pal/map.hpp +++ b/src/pal/src/include/pal/map.hpp @@ -138,6 +138,13 @@ extern "C" returns TRUE if successful, FALSE otherwise --*/ BOOL MAPUnmapPEFile(LPCVOID lpAddress); + + /*++ + Function : + MAPMarkSectionAsNotNeeded - mark a section as NotNeeded + returns TRUE if successful, FALSE otherwise + --*/ + BOOL MAPMarkSectionAsNotNeeded(LPCVOID lpAddress); } namespace CorUnix diff --git a/src/pal/src/loader/module.cpp b/src/pal/src/loader/module.cpp index 78069b8875..35c51ac5ee 100644 --- a/src/pal/src/loader/module.cpp +++ b/src/pal/src/loader/module.cpp @@ -1000,6 +1000,39 @@ PAL_LOADUnloadPEFile(PVOID ptr) } /*++ + PAL_LOADMarkSectionAsNotNeeded + + Mark a section as NotNeeded that was loaded by PAL_LOADLoadPEFile(). + +Parameters: + IN ptr - the section address mapped by PAL_LOADLoadPEFile() + +Return value: + TRUE - success + FALSE - failure (incorrect ptr, etc.) +--*/ +BOOL +PALAPI +PAL_LOADMarkSectionAsNotNeeded(void * ptr) +{ + BOOL retval = FALSE; + + ENTRY("PAL_LOADMarkSectionAsNotNeeded (ptr=%p)\n", ptr); + + if (nullptr == ptr) + { + ERROR( "Invalid pointer value\n" ); + } + else + { + retval = MAPMarkSectionAsNotNeeded(ptr); + } + + LOGEXIT("PAL_LOADMarkSectionAsNotNeeded returns %d\n", retval); + return retval; +} + +/*++ PAL_GetSymbolModuleBase Get base address of the module containing a given symbol diff --git a/src/pal/src/map/map.cpp b/src/pal/src/map/map.cpp index 6caf5e1722..aadd04dd26 100644 --- a/src/pal/src/map/map.cpp +++ b/src/pal/src/map/map.cpp @@ -3173,3 +3173,54 @@ BOOL MAPUnmapPEFile(LPCVOID lpAddress) TRACE_(LOADER)("MAPUnmapPEFile returning %d\n", retval); return retval; } + +/*++ +Function : + MAPMarkSectionAsNotNeeded - Mark a section as NotNeeded + returns TRUE if successful, FALSE otherwise +--*/ +BOOL MAPMarkSectionAsNotNeeded(LPCVOID lpAddress) +{ + TRACE_(LOADER)("MAPMarkSectionAsNotNeeded(lpAddress=%p)\n", lpAddress); + + if ( NULL == lpAddress ) + { + ERROR_(LOADER)( "lpAddress cannot be NULL\n" ); + return FALSE; + } + + BOOL retval = TRUE; + CPalThread * pThread = InternalGetCurrentThread(); + InternalEnterCriticalSection(pThread, &mapping_critsec); + PLIST_ENTRY pLink, pLinkNext = NULL; + + // Look through the entire MappedViewList for all mappings associated with the + // section with an address 'lpAddress' which we want to mark as NotNeeded. + + for(pLink = MappedViewList.Flink; + pLink != &MappedViewList; + pLink = pLinkNext) + { + pLinkNext = pLink->Flink; + PMAPPED_VIEW_LIST pView = CONTAINING_RECORD(pLink, MAPPED_VIEW_LIST, Link); + + if (pView->lpAddress == lpAddress) // this entry is associated with the section + { + if (-1 == madvise(pView->lpAddress, pView->NumberOfBytesToMap, MADV_DONTNEED)) + { + ERROR_(LOADER)("Unable to mark the section as NotNeeded.\n"); + retval = FALSE; + } + else + { + pView->dwDesiredAccess = 0; + } + break; + } + } + + InternalLeaveCriticalSection(pThread, &mapping_critsec); + + TRACE_(LOADER)("MAPMarkSectionAsNotNeeded returning %d\n", retval); + return retval; +} |