diff options
author | Sandeep Patil <sspatil@google.com> | 2018-11-19 11:38:40 -0800 |
---|---|---|
committer | Sandeep Patil <sspatil@google.com> | 2018-12-04 15:59:42 -0800 |
commit | 549feab6314690460e58f50e6084dfb95a1022e3 (patch) | |
tree | 955ff6cb40807c600296ed1bed943955bf2cbb3d /libmeminfo | |
parent | 70fa72dd01ba9cac7ed4243676c9f7135926fce7 (diff) | |
download | system_core-549feab6314690460e58f50e6084dfb95a1022e3.tar.gz system_core-549feab6314690460e58f50e6084dfb95a1022e3.tar.bz2 system_core-549feab6314690460e58f50e6084dfb95a1022e3.zip |
libmeminfo: Add support to fiter accounting based on page flags
Bug: 114325007
Bug: 111694435
Test: libmeminfo_test 1 --gtest_filter=ValidateProcMemInfoFlags.*
Change-Id: Ifa7006de78dd909b5b4db282a8c9931ebf97a68a
Signed-off-by: Sandeep Patil <sspatil@google.com>
Diffstat (limited to 'libmeminfo')
-rw-r--r-- | libmeminfo/include/meminfo/procmeminfo.h | 4 | ||||
-rw-r--r-- | libmeminfo/libmeminfo_test.cpp | 49 | ||||
-rw-r--r-- | libmeminfo/procmeminfo.cpp | 6 |
3 files changed, 57 insertions, 2 deletions
diff --git a/libmeminfo/include/meminfo/procmeminfo.h b/libmeminfo/include/meminfo/procmeminfo.h index dd599128d..3b620a00b 100644 --- a/libmeminfo/include/meminfo/procmeminfo.h +++ b/libmeminfo/include/meminfo/procmeminfo.h @@ -29,7 +29,7 @@ namespace meminfo { class ProcMemInfo final { // Per-process memory accounting public: - ProcMemInfo(pid_t pid, bool get_wss = false); + ProcMemInfo(pid_t pid, bool get_wss = false, uint64_t pgflags = 0, uint64_t pgflags_mask = 0); const std::vector<Vma>& Maps(); const MemUsage& Usage(); @@ -45,6 +45,8 @@ class ProcMemInfo final { pid_t pid_; bool get_wss_; + uint64_t pgflags_; + uint64_t pgflags_mask_; std::vector<Vma> maps_; diff --git a/libmeminfo/libmeminfo_test.cpp b/libmeminfo/libmeminfo_test.cpp index 923e156d5..6d731737b 100644 --- a/libmeminfo/libmeminfo_test.cpp +++ b/libmeminfo/libmeminfo_test.cpp @@ -245,6 +245,55 @@ TEST_F(ValidatePageAcct, TestPageIdle) { } } +TEST(ValidateProcMemInfoFlags, TestPageFlags1) { + // Create proc object using libpagemap + pm_kernel_t* ker; + ASSERT_EQ(0, pm_kernel_create(&ker)); + pm_process_t* proc; + ASSERT_EQ(0, pm_process_create(ker, pid, &proc)); + + // count swapbacked pages using libpagemap + pm_memusage_t proc_usage; + pm_memusage_zero(&proc_usage); + ASSERT_EQ(0, pm_process_usage_flags(proc, &proc_usage, (1 << KPF_SWAPBACKED), + (1 << KPF_SWAPBACKED))); + + // Create ProcMemInfo that counts swapbacked pages + ProcMemInfo proc_mem(pid, false, (1 << KPF_SWAPBACKED), (1 << KPF_SWAPBACKED)); + + EXPECT_EQ(proc_usage.vss, proc_mem.Usage().vss); + EXPECT_EQ(proc_usage.rss, proc_mem.Usage().rss); + EXPECT_EQ(proc_usage.pss, proc_mem.Usage().pss); + EXPECT_EQ(proc_usage.uss, proc_mem.Usage().uss); + + pm_process_destroy(proc); + pm_kernel_destroy(ker); +} + +TEST(ValidateProcMemInfoFlags, TestPageFlags2) { + // Create proc object using libpagemap + pm_kernel_t* ker; + ASSERT_EQ(0, pm_kernel_create(&ker)); + pm_process_t* proc; + ASSERT_EQ(0, pm_process_create(ker, pid, &proc)); + + // count non-swapbacked pages using libpagemap + pm_memusage_t proc_usage; + pm_memusage_zero(&proc_usage); + ASSERT_EQ(0, pm_process_usage_flags(proc, &proc_usage, (1 << KPF_SWAPBACKED), 0)); + + // Create ProcMemInfo that counts non-swapbacked pages + ProcMemInfo proc_mem(pid, false, 0, (1 << KPF_SWAPBACKED)); + + EXPECT_EQ(proc_usage.vss, proc_mem.Usage().vss); + EXPECT_EQ(proc_usage.rss, proc_mem.Usage().rss); + EXPECT_EQ(proc_usage.pss, proc_mem.Usage().pss); + EXPECT_EQ(proc_usage.uss, proc_mem.Usage().uss); + + pm_process_destroy(proc); + pm_kernel_destroy(ker); +} + TEST(SysMemInfoParser, TestSysMemInfoFile) { std::string meminfo = R"meminfo(MemTotal: 3019740 kB MemFree: 1809728 kB diff --git a/libmeminfo/procmeminfo.cpp b/libmeminfo/procmeminfo.cpp index e3839346a..56b62e826 100644 --- a/libmeminfo/procmeminfo.cpp +++ b/libmeminfo/procmeminfo.cpp @@ -53,7 +53,8 @@ static void add_mem_usage(MemUsage* to, const MemUsage& from) { to->shared_dirty += from.shared_dirty; } -ProcMemInfo::ProcMemInfo(pid_t pid, bool get_wss) : pid_(pid), get_wss_(get_wss) { +ProcMemInfo::ProcMemInfo(pid_t pid, bool get_wss, uint64_t pgflags, uint64_t pgflags_mask) + : pid_(pid), get_wss_(get_wss), pgflags_(pgflags), pgflags_mask_(pgflags_mask) { if (!ReadMaps(get_wss_)) { LOG(ERROR) << "Failed to read maps for Process " << pid_; } @@ -170,6 +171,9 @@ bool ProcMemInfo::ReadVmaStats(int pagemap_fd, Vma& vma, bool get_wss) { return false; } + // skip unwanted pages from the count + if ((pg_flags[i] & pgflags_mask_) != pgflags_) continue; + if (!pinfo.PageMapCount(page_frame, &pg_counts[i])) { LOG(ERROR) << "Failed to get page count for " << page_frame << " in process " << pid_; return false; |