meminfo: Add ReadVmallocInfo()

This is to replace occurrences of get_allocated_vmalloc_memory().
Splitting into libmeminfo already found a bug with current code which
failed to account for memory allocated by modules due to addition of
the extra [%module_name%] in __builtin_return_address().

  See: https://elixir.bootlin.com/linux/latest/source/kernel/kallsyms.c#L373

Also improves the performance a bit in the process.

Bug: 119639955
Bug: 111694435
Test: libmeminfo_test 1 --gtest_filter=SysMemInfoParser.TestVmallocInfo
Test: libmeminfo_benchmark --benchmark_filter=BM_VmallocInfo_*
Result:
----------------------------------------------------------------
Benchmark                         Time           CPU Iterations
----------------------------------------------------------------
BM_VmallocInfo_old_fixed     459239 ns     457268 ns       1532
BM_VmallocInfo_new           386032 ns     384353 ns       1821
----------------------------------------------------------------

Change-Id: I1b6606ac73b5cc2dac31d24487b462ec9abfb2ef
Signed-off-by: Sandeep Patil <[email protected]>
diff --git a/libmeminfo_test.cpp b/libmeminfo_test.cpp
index 2856c2d..8c3c0fb 100644
--- a/libmeminfo_test.cpp
+++ b/libmeminfo_test.cpp
@@ -30,6 +30,7 @@
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
+#include <android-base/stringprintf.h>
 
 using namespace std;
 using namespace android::meminfo;
@@ -516,6 +517,66 @@
     EXPECT_EQ(mem[MEMINFO_KERNEL_STACK], 4880);
 }
 
+TEST(SysMemInfoParser, TestVmallocInfoNoMemory) {
+    std::string vmallocinfo =
+            R"vmallocinfo(0x0000000000000000-0x0000000000000000   69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap)vmallocinfo";
+
+    TemporaryFile tf;
+    ASSERT_TRUE(tf.fd != -1);
+    ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
+    std::string file = std::string(tf.path);
+
+    SysMemInfo smi;
+    EXPECT_EQ(smi.ReadVmallocInfo(file), 0);
+}
+
+TEST(SysMemInfoParser, TestVmallocInfoKernel) {
+    std::string vmallocinfo =
+            R"vmallocinfo(0x0000000000000000-0x0000000000000000    8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc)vmallocinfo";
+
+    TemporaryFile tf;
+    ASSERT_TRUE(tf.fd != -1);
+    ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
+    std::string file = std::string(tf.path);
+
+    SysMemInfo smi;
+    EXPECT_EQ(smi.ReadVmallocInfo(file), getpagesize());
+}
+
+TEST(SysMemInfoParser, TestVmallocInfoModule) {
+    std::string vmallocinfo =
+            R"vmallocinfo(0x0000000000000000-0x0000000000000000   28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
+
+    TemporaryFile tf;
+    ASSERT_TRUE(tf.fd != -1);
+    ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
+    std::string file = std::string(tf.path);
+
+    SysMemInfo smi;
+    EXPECT_EQ(smi.ReadVmallocInfo(file), 6 * getpagesize());
+}
+
+TEST(SysMemInfoParser, TestVmallocInfoAll) {
+    std::string vmallocinfo =
+            R"vmallocinfo(0x0000000000000000-0x0000000000000000   69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
+0x0000000000000000-0x0000000000000000    8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap
+0x0000000000000000-0x0000000000000000    8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc
+0x0000000000000000-0x0000000000000000   28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
+
+    TemporaryFile tf;
+    ASSERT_TRUE(tf.fd != -1);
+    ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
+    std::string file = std::string(tf.path);
+
+    SysMemInfo smi;
+    EXPECT_EQ(smi.ReadVmallocInfo(file), 7 * getpagesize());
+}
+
 int main(int argc, char** argv) {
     ::testing::InitGoogleTest(&argc, argv);
     if (argc <= 1) {