From 819a661be5efcb045be4d34d7269ab35dc0fcb88 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 15 Sep 2019 14:05:00 +0100 Subject: Getting region date per process in Darwin --- src/zmalloc.c | 12 ++++++++++++ src/zmalloc.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/zmalloc.c b/src/zmalloc.c index fd8bb6938..48f4b1e99 100644 --- a/src/zmalloc.c +++ b/src/zmalloc.c @@ -396,6 +396,18 @@ size_t zmalloc_get_smap_bytes_by_field(char *field, long pid) { } #else size_t zmalloc_get_smap_bytes_by_field(char *field, long pid) { +#if defined(__APPLE__) + struct proc_regioninfo pri; + if (proc_pidinfo(pid, PROC_PIDREGIONINFO, 0, &pri, PROC_PIDREGIONINFO_SIZE) == + PROC_PIDREGIONINFO_SIZE) { + if (!strcmp(field, "Private_Dirty")) { + return (size_t)pri.pri_pages_dirtied * 4096; + } else if (!strcmp(field, "Rss")) { + return (size_t)pri.pri_pages_resident * 4096; + } + } + return 0; +#endif ((void) field); ((void) pid); return 0; diff --git a/src/zmalloc.h b/src/zmalloc.h index 6fb19b046..4aa33509d 100644 --- a/src/zmalloc.h +++ b/src/zmalloc.h @@ -57,6 +57,7 @@ #elif defined(__APPLE__) #include +#include #define HAVE_MALLOC_SIZE 1 #define zmalloc_size(p) malloc_size(p) #endif -- cgit v1.2.1 From 5a8a0050269382d94d88016ba04272eef658bc97 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 20 Sep 2019 11:01:36 +0100 Subject: Adding AnonHugePages case + comments --- src/zmalloc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/zmalloc.c b/src/zmalloc.c index 48f4b1e99..764738636 100644 --- a/src/zmalloc.c +++ b/src/zmalloc.c @@ -395,15 +395,24 @@ size_t zmalloc_get_smap_bytes_by_field(char *field, long pid) { return bytes; } #else +/* Get sum of the specified field from libproc api call. + * As there are per page value basis we need to convert + * them accordingly. + * + * Note that AnonHugePages is a no-op as THP feature + * is not supported in this platform + */ size_t zmalloc_get_smap_bytes_by_field(char *field, long pid) { #if defined(__APPLE__) struct proc_regioninfo pri; if (proc_pidinfo(pid, PROC_PIDREGIONINFO, 0, &pri, PROC_PIDREGIONINFO_SIZE) == PROC_PIDREGIONINFO_SIZE) { - if (!strcmp(field, "Private_Dirty")) { + if (!strcmp(field, "Private_Dirty:")) { return (size_t)pri.pri_pages_dirtied * 4096; - } else if (!strcmp(field, "Rss")) { + } else if (!strcmp(field, "Rss:")) { return (size_t)pri.pri_pages_resident * 4096; + } else if (!strcmp(field, "AnonHugePages:")) { + return 0; } } return 0; -- cgit v1.2.1