forked from mirrors/gecko-dev
		
	Bug 1867190 - Add prefs for PHC probablities r=glandium
Differential Revision: https://phabricator.services.mozilla.com/D198652
This commit is contained in:
		
							parent
							
								
									9f2470a841
								
							
						
					
					
						commit
						3a813ca67c
					
				
					 5 changed files with 81 additions and 2 deletions
				
			
		|  | @ -343,7 +343,15 @@ static const Time kMaxTime = ~(Time(0)); | |||
| constexpr Delay Rnd64ToDelay(Delay aAvgDelay, uint64_t aRnd) { | ||||
|   MOZ_ASSERT(IsPowerOfTwo(aAvgDelay), "must be a power of two"); | ||||
| 
 | ||||
|   return (aRnd & (aAvgDelay * 2 - 1)) + 1; | ||||
|   return (aRnd & (uint64_t(aAvgDelay) * 2 - 1)) + 1; | ||||
| } | ||||
| 
 | ||||
| static Delay CheckProbability(int64_t aProb) { | ||||
|   // Limit delays calculated from prefs to 0x80000000, this is the largest
 | ||||
|   // power-of-two that fits in a Delay since it is a uint32_t.
 | ||||
|   // The minimum is 2 that way not every allocation goes straight to PHC.
 | ||||
|   return RoundUpPow2( | ||||
|       std::min(std::max(aProb, int64_t(2)), int64_t(0x80000000))); | ||||
| } | ||||
| 
 | ||||
| // Maps a pointer to a PHC-specific structure:
 | ||||
|  | @ -863,6 +871,15 @@ class GMut { | |||
|     mPhcState = aState; | ||||
|   } | ||||
| 
 | ||||
|   void SetProbabilities(int64_t aAvgDelayFirst, int64_t aAvgDelayNormal, | ||||
|                         int64_t aAvgDelayPageReuse) { | ||||
|     MutexAutoLock lock(GMut::sMutex); | ||||
| 
 | ||||
|     mAvgFirstAllocDelay = CheckProbability(aAvgDelayFirst); | ||||
|     mAvgAllocDelay = CheckProbability(aAvgDelayNormal); | ||||
|     mAvgPageReuseDelay = CheckProbability(aAvgDelayPageReuse); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   template <int N> | ||||
|   uint64_t RandomSeed() { | ||||
|  | @ -1807,4 +1824,14 @@ void SetPHCState(PHCState aState) { | |||
| 
 | ||||
|   gMut->SetState(aState); | ||||
| } | ||||
| 
 | ||||
| void SetPHCProbabilities(int64_t aAvgDelayFirst, int64_t aAvgDelayNormal, | ||||
|                          int64_t aAvgDelayPageReuse) { | ||||
|   if (!maybe_init()) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   gMut->SetProbabilities(aAvgDelayFirst, aAvgDelayNormal, aAvgDelayPageReuse); | ||||
| } | ||||
| 
 | ||||
| }  // namespace mozilla::phc
 | ||||
|  |  | |||
|  | @ -129,6 +129,10 @@ enum PHCState { | |||
| 
 | ||||
| MOZ_JEMALLOC_API void SetPHCState(PHCState aState); | ||||
| 
 | ||||
| MOZ_JEMALLOC_API void SetPHCProbabilities(int64_t aAvgDelayFirst, | ||||
|                                           int64_t aAvgDelayNormal, | ||||
|                                           int64_t aAvgDelayPageReuse); | ||||
| 
 | ||||
| struct MemoryUsage { | ||||
|   // The amount of memory used for PHC metadata, eg information about each
 | ||||
|   // allocation including stacks.
 | ||||
|  |  | |||
|  | @ -11051,6 +11051,21 @@ | |||
|   value: 8000 | ||||
|   mirror: always | ||||
| 
 | ||||
| - name: memory.phc.avg_delay.first | ||||
|   type: uint32_t | ||||
|   value: 65536 | ||||
|   mirror: always | ||||
| 
 | ||||
| - name: memory.phc.avg_delay.normal | ||||
|   type: uint32_t | ||||
|   value: 16384 | ||||
|   mirror: always | ||||
| 
 | ||||
| - name: memory.phc.avg_delay.page_reuse | ||||
|   type: uint32_t | ||||
|   value: 262144 | ||||
|   mirror: always | ||||
| 
 | ||||
| #--------------------------------------------------------------------------- | ||||
| # Prefs starting with "midi." | ||||
| #--------------------------------------------------------------------------- | ||||
|  |  | |||
|  | @ -2288,6 +2288,24 @@ phc: | |||
|       setPref: | ||||
|         branch: user | ||||
|         pref: memory.phc.min_ram_mb | ||||
|     phcAvgDelayFirst: | ||||
|       description: The delay before the first PHC allocation | ||||
|       type: int | ||||
|       setPref: | ||||
|         branch: user | ||||
|         pref: memory.phc.avg_delay.first | ||||
|     phcAvgDelayNormal: | ||||
|       description: The delay between PHC allocations | ||||
|       type: int | ||||
|       setPref: | ||||
|         branch: user | ||||
|         pref: memory.phc.avg_delay.normal | ||||
|     phcAvgDelayPageReuse: | ||||
|       description: The delay before reusing a PHC page | ||||
|       type: int | ||||
|       setPref: | ||||
|         branch: user | ||||
|         pref: memory.phc.avg_delay.page_reuse | ||||
| 
 | ||||
| mailto: | ||||
|   description: Prefs to control aspects of the mailto handler | ||||
|  |  | |||
|  | @ -19,6 +19,9 @@ using namespace phc; | |||
| 
 | ||||
| static const char kPHCEnabledPref[] = "memory.phc.enabled"; | ||||
| static const char kPHCMinRamMBPref[] = "memory.phc.min_ram_mb"; | ||||
| static const char kPHCAvgDelayFirst[] = "memory.phc.avg_delay.first"; | ||||
| static const char kPHCAvgDelayNormal[] = "memory.phc.avg_delay.normal"; | ||||
| static const char kPHCAvgDelayPageRuse[] = "memory.phc.avg_delay.page_reuse"; | ||||
| 
 | ||||
| // True if PHC has ever been enabled for this process.
 | ||||
| static bool sWasPHCEnabled = false; | ||||
|  | @ -32,6 +35,12 @@ static void UpdatePHCState() { | |||
|   // slightly lower actual RAM available after some hardware devices
 | ||||
|   // reserve some.
 | ||||
|   if (StaticPrefs::memory_phc_enabled() && mem_size >= min_mem_size) { | ||||
|     // Set PHC probablities before enabling PHC so that the first allocation
 | ||||
|     // delay gets used.
 | ||||
|     SetPHCProbabilities(StaticPrefs::memory_phc_avg_delay_first(), | ||||
|                         StaticPrefs::memory_phc_avg_delay_normal(), | ||||
|                         StaticPrefs::memory_phc_avg_delay_page_reuse()); | ||||
| 
 | ||||
|     SetPHCState(Enabled); | ||||
|     sWasPHCEnabled = true; | ||||
|   } else { | ||||
|  | @ -41,7 +50,10 @@ static void UpdatePHCState() { | |||
| 
 | ||||
| static void PrefChangeCallback(const char* aPrefName, void* aNull) { | ||||
|   MOZ_ASSERT((0 == strcmp(aPrefName, kPHCEnabledPref)) || | ||||
|              (0 == strcmp(aPrefName, kPHCMinRamMBPref))); | ||||
|              (0 == strcmp(aPrefName, kPHCMinRamMBPref)) || | ||||
|              (0 == strcmp(aPrefName, kPHCAvgDelayFirst)) || | ||||
|              (0 == strcmp(aPrefName, kPHCAvgDelayNormal)) || | ||||
|              (0 == strcmp(aPrefName, kPHCAvgDelayPageRuse))); | ||||
| 
 | ||||
|   UpdatePHCState(); | ||||
| } | ||||
|  | @ -49,6 +61,9 @@ static void PrefChangeCallback(const char* aPrefName, void* aNull) { | |||
| void InitPHCState() { | ||||
|   Preferences::RegisterCallback(PrefChangeCallback, kPHCEnabledPref); | ||||
|   Preferences::RegisterCallback(PrefChangeCallback, kPHCMinRamMBPref); | ||||
|   Preferences::RegisterCallback(PrefChangeCallback, kPHCAvgDelayFirst); | ||||
|   Preferences::RegisterCallback(PrefChangeCallback, kPHCAvgDelayNormal); | ||||
|   Preferences::RegisterCallback(PrefChangeCallback, kPHCAvgDelayPageRuse); | ||||
|   UpdatePHCState(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Paul Bone
						Paul Bone