bug 1436914 - Stop reporting virtual memory size from CFG-enabled processes r?dmajor
If CFG is enabled, our Virtual Memory is ballooned by 2TB or so for Windows'
indirect jump bitmap. This makes our vsize amounts rather unhelpful, so let's
pretend the numbers aren't available.
MozReview-Commit-ID: I4xj114mKPO
--- a/xpcom/base/nsMemoryReporterManager.cpp
+++ b/xpcom/base/nsMemoryReporterManager.cpp
@@ -34,16 +34,17 @@
#include "mozilla/UniquePtrExtensions.h"
#include "mozilla/dom/MemoryReportTypes.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/gfx/GPUProcessManager.h"
#include "mozilla/ipc/FileDescriptorUtils.h"
#ifdef XP_WIN
#include <process.h>
+#include <processthreadsapi.h>
#ifndef getpid
#define getpid _getpid
#endif
#else
#include <unistd.h>
#endif
using namespace mozilla;
@@ -1510,16 +1511,25 @@ NS_IMPL_ISUPPORTS(DMDReporter, nsIMemory
#endif // MOZ_DMD
/**
** nsMemoryReporterManager implementation
**/
NS_IMPL_ISUPPORTS(nsMemoryReporterManager, nsIMemoryReporterManager)
+#ifdef XP_WIN
+typedef BOOL (WINAPI *GetProcessMitigationPolicyFunc)(
+ HANDLE hProcess,
+ PROCESS_MITIGATION_POLICY MitigationPolicy,
+ PVOID lpBuffer,
+ SIZE_T dwLength
+);
+#endif // XP_WIN
+
NS_IMETHODIMP
nsMemoryReporterManager::Init()
{
if (!NS_IsMainThread()) {
MOZ_CRASH();
}
// Under normal circumstances this function is only called once. However,
@@ -1617,17 +1627,32 @@ nsMemoryReporterManager::nsMemoryReporte
, mSavedStrongReporters(nullptr)
, mSavedWeakReporters(nullptr)
, mNextGeneration(1)
, mPendingProcessesState(nullptr)
, mPendingReportersState(nullptr)
#ifdef HAVE_JEMALLOC_STATS
, mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID))
#endif
+ , mIsCFGEnabled(false)
{
+#ifdef XP_WIN
+ HMODULE kernel32 = GetModuleHandleW(L"kernel32.dll");
+ FARPROC ptr = GetProcAddress(kernel32, "GetProcessMitigationPolicy");
+ if (ptr) {
+ auto GPMP_func = reinterpret_cast<GetProcessMitigationPolicyFunc>(ptr);
+ PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY pmcfgp;
+ if (GPMP_func(GetCurrentProcess(),
+ ProcessControlFlowGuardPolicy,
+ &pmcfgp,
+ sizeof(pmcfgp))) {
+ mIsCFGEnabled = pmcfgp.EnableControlFlowGuard;
+ }
+ }
+#endif
}
nsMemoryReporterManager::~nsMemoryReporterManager()
{
delete mStrongReporters;
delete mWeakReporters;
NS_ASSERTION(!mSavedStrongReporters, "failed to restore strong reporters");
NS_ASSERTION(!mSavedWeakReporters, "failed to restore weak reporters");
@@ -2272,27 +2297,35 @@ nsMemoryReporterManager::UnblockRegistra
mIsRegistrationBlocked = false;
return NS_OK;
}
NS_IMETHODIMP
nsMemoryReporterManager::GetVsize(int64_t* aVsize)
{
#ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS
+ if (mIsCFGEnabled) {
+ aVsize = 0;
+ return NS_ERROR_NOT_AVAILABLE;
+ }
return VsizeDistinguishedAmount(aVsize);
#else
*aVsize = 0;
return NS_ERROR_NOT_AVAILABLE;
#endif
}
NS_IMETHODIMP
nsMemoryReporterManager::GetVsizeMaxContiguous(int64_t* aAmount)
{
#ifdef HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER
+ if (mIsCFGEnabled) {
+ aAmount = 0;
+ return NS_ERROR_NOT_AVAILABLE;
+ }
return VsizeMaxContiguousDistinguishedAmount(aAmount);
#else
*aAmount = 0;
return NS_ERROR_NOT_AVAILABLE;
#endif
}
NS_IMETHODIMP
--- a/xpcom/base/nsMemoryReporterManager.h
+++ b/xpcom/base/nsMemoryReporterManager.h
@@ -275,16 +275,18 @@ private:
PendingProcessesState* mPendingProcessesState;
// This is reinitialized each time a call to GetReports is initiated.
PendingReportersState* mPendingReportersState;
// Used in GetHeapAllocatedAsync() to run jemalloc_stats async.
nsCOMPtr<nsIEventTarget> mThreadPool;
+ bool mIsCFGEnabled;
+
PendingProcessesState* GetStateForGeneration(uint32_t aGeneration);
static MOZ_MUST_USE bool
StartChildReport(mozilla::MemoryReportingProcess* aChild,
const PendingProcessesState* aState);
};
#define NS_MEMORY_REPORTER_MANAGER_CID \
{ 0xfb97e4f5, 0x32dd, 0x497a, \