Re: add protection metrics of zoneinfo

"Wu, Liming" <[email protected]> Thu, 09 Feb 2017 00:10:50 -0800
Newsgroups gmane.comp.sysutils.pcp
Message-ID <[email protected]>
Nathan,

  suggestion is appreciated. I modify the code.

It's best if you can help me to review it.

Thanks.

---

LiMing
additional_protection_metric_of_zoneinfo.patch (application/octet-stream, 6.9 KB)
From 2cd725dc22005c40cf098d089d187e2d2238e666 Mon Sep 17 00:00:00 2001
From: Liming <[email protected]>
Date: Thu, 9 Feb 2017 14:43:23 +0800
Subject: [PATCH] additional protection metric of zoneinfo

Different hardware platforms have different protection array elements,
so the way of 'instance domain' is used to store elements of
protection. Nathan's suggestion is appreciated.
---
 src/pmdas/linux/help            |  1 +
 src/pmdas/linux/linux.h         |  2 ++
 src/pmdas/linux/pmda.c          | 29 +++++++++++++++++++++++++++--
 src/pmdas/linux/proc_zoneinfo.c | 22 ++++++++++++++++++++--
 src/pmdas/linux/proc_zoneinfo.h |  3 ++-
 src/pmdas/linux/root_linux      |  1 +
 6 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/src/pmdas/linux/help b/src/pmdas/linux/help
index be2c30d..de42ab0 100644
--- a/src/pmdas/linux/help
+++ b/src/pmdas/linux/help
@@ -974,6 +974,7 @@ table entry.
 @ mem.zoneinfo.spanned spanned space in each zone for each NUMA node
 @ mem.zoneinfo.present present space in each zone for each NUMA node
 @ mem.zoneinfo.managed managed space in each zone for each NUMA node
+@ mem.zoneinfo.protection protection space in each zone for each NUMA node
 @ mem.ksm.full_scans Number of times that KSM has scanned for duplicated content
 @ mem.ksm.merge_across_nodes Kernel allows merging across NUMA nodes
 @ mem.ksm.pages_shared The number of nodes in the stable tree
diff --git a/src/pmdas/linux/linux.h b/src/pmdas/linux/linux.h
index 2869ce0..fc2ade9 100644
--- a/src/pmdas/linux/linux.h
+++ b/src/pmdas/linux/linux.h
@@ -92,6 +92,7 @@ enum {
 	CLUSTER_BUDDYINFO,	/* 67 /proc/buddyinfo */
 	CLUSTER_ZONEINFO,	/* 68 /proc/zoneinfo */
 	CLUSTER_KSM_INFO,	/* 69 /sys/kernel/mm/ksm */
+	CLUSTER_ZONEINFO_PROTECTION,	/* 70 /proc/zoneinfo protection item */
 
 	NUM_CLUSTERS		/* one more than highest numbered cluster */
 };
@@ -150,6 +151,7 @@ enum {
 	IPC_SEM_INDOM,	        /* 30 - ipc sem_stat msgid */
 	BUDDYINFO_INDOM,	/* 31 - kernel buddys */
 	ZONEINFO_INDOM,	        /* 32 - proc zoneinfo */
+	ZONEINFO_PROTECTION_INDOM,	        /* 33 - proc zoneinfo protection item */
 
 	NUM_INDOMS		/* one more than highest numbered cluster */
 };
diff --git a/src/pmdas/linux/pmda.c b/src/pmdas/linux/pmda.c
index 419d617..11a71ae 100644
--- a/src/pmdas/linux/pmda.c
+++ b/src/pmdas/linux/pmda.c
@@ -331,6 +331,7 @@ static pmdaIndom indomtab[] = {
     { IPC_SEM_INDOM, 0, NULL },
     { BUDDYINFO_INDOM, 0, NULL },
     { ZONEINFO_INDOM, 0, NULL },
+    { ZONEINFO_PROTECTION_INDOM, 0, NULL },
 };
 
 
@@ -3620,6 +3621,11 @@ static pmdaMetric metrictab[] = {
     { PMDA_PMID(CLUSTER_ZONEINFO,7), PM_TYPE_U64, ZONEINFO_INDOM, PM_SEM_INSTANT,
       PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, },
 
+/* mem.zoneinfo.protection */
+  { NULL,
+    { PMDA_PMID(CLUSTER_ZONEINFO_PROTECTION,0), PM_TYPE_U64, ZONEINFO_PROTECTION_INDOM, PM_SEM_INSTANT,
+      PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0) }, },
+
 /*
  * /proc/cpuinfo cluster (cpu indom)
  */
@@ -5207,8 +5213,10 @@ linux_refresh(pmdaExt *pmda, int *need_refresh, int context)
     if (need_refresh[CLUSTER_BUDDYINFO])
 	refresh_proc_buddyinfo(&proc_buddyinfo);
 
-    if (need_refresh[CLUSTER_ZONEINFO])
-	refresh_proc_zoneinfo(INDOM(ZONEINFO_INDOM));
+    if (need_refresh[CLUSTER_ZONEINFO] ||
+        need_refresh[CLUSTER_ZONEINFO_PROTECTION])
+	refresh_proc_zoneinfo(INDOM(ZONEINFO_INDOM),
+			      INDOM(ZONEINFO_PROTECTION_INDOM));
 
     if (need_refresh[CLUSTER_KSM_INFO])
 	refresh_ksm_info(&ksm_info);
@@ -5291,6 +5299,9 @@ linux_instance(pmInDom indom, int inst, char *name, __pmInResult **result, pmdaE
     case ZONEINFO_INDOM:
 	need_refresh[CLUSTER_ZONEINFO]++;
         break;
+    case ZONEINFO_PROTECTION_INDOM:
+        need_refresh[CLUSTER_ZONEINFO_PROTECTION]++;
+        break;
     /* no default label : pmdaInstance will pick up errors */
     }
 
@@ -6602,6 +6613,20 @@ linux_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
     /*
      * Cluster added by Wu Liming <[email protected]>
      */
+    case CLUSTER_ZONEINFO_PROTECTION: {
+	unsigned long long *value;
+	sts = pmdaCacheLookup(INDOM(ZONEINFO_PROTECTION_INDOM), inst, NULL, (void **)&value);
+	if (sts < 0)
+	    return sts;
+	if (sts == PMDA_CACHE_INACTIVE)
+	    return PM_ERR_INST;
+	switch (idp->item) {
+	case 0: /* mem.zoneinfo.protection */
+            atom->ull = (__uint64_t)value;
+	}
+	break;
+    }
+
     case CLUSTER_ZONEINFO: {
 	zoneinfo_entry_t *info;
 
diff --git a/src/pmdas/linux/proc_zoneinfo.c b/src/pmdas/linux/proc_zoneinfo.c
index dc4e01f..d3a65d0 100644
--- a/src/pmdas/linux/proc_zoneinfo.c
+++ b/src/pmdas/linux/proc_zoneinfo.c
@@ -17,7 +17,7 @@
 #include "proc_zoneinfo.h"
 
 int
-refresh_proc_zoneinfo(pmInDom indom)
+refresh_proc_zoneinfo(pmInDom indom, pmInDom zoneinfo_protection_indom)
 {
     int node, values;
     zoneinfo_entry_t *info;
@@ -54,7 +54,7 @@ refresh_proc_zoneinfo(pmInDom indom)
 	    changed = 1;
 	}
 	/* inner loop to extract all values for this node */
-	while (values < ZONE_VALUES && fgets(buf, sizeof(buf), fp) != NULL) {
+	while (values < ZONE_VALUES + 1 && fgets(buf, sizeof(buf), fp) != NULL) {
 	    if ((sscanf(buf, "  pages free %llu", &value)) == 1) {
 		info->values[ZONE_FREE] = (value << _pm_pageshift) / 1024;
 		values++;
@@ -96,6 +96,24 @@ refresh_proc_zoneinfo(pmInDom indom)
 		values++;
 		continue;
 	    }
+            else if (strncmp(buf, "        protection: (", 20) == 0) {
+                char protected_name[64];
+                char *endp, *bp = buf + 20 + 1;
+                unsigned long long value = 0;
+                int index = 0;
+
+                for (index = 0;; index++) {
+                    value = (strtoul(bp, &endp, 10) << _pm_pageshift) / 1024;
+                    sprintf(protected_name, "%s::lowmem_reserved%d", 
+                            instname, index);
+                    pmdaCacheStore(zoneinfo_protection_indom, PMDA_CACHE_ADD,
+                                   protected_name, (void *)value);
+                    if (*endp != ',')
+                        break;
+                    bp = endp + 2;   /* skip comma and space, then continue */
+                }
+		values++;
+            }
 	}
 	pmdaCacheStore(indom, PMDA_CACHE_ADD, instname, (void *)info);
 
diff --git a/src/pmdas/linux/proc_zoneinfo.h b/src/pmdas/linux/proc_zoneinfo.h
index a39c4e0..88c35a2 100644
--- a/src/pmdas/linux/proc_zoneinfo.h
+++ b/src/pmdas/linux/proc_zoneinfo.h
@@ -32,4 +32,5 @@ typedef struct {
     __uint64_t	values[ZONE_VALUES];
 } zoneinfo_entry_t;
 
-extern int refresh_proc_zoneinfo(pmInDom indom);
+extern int refresh_proc_zoneinfo(pmInDom indom,
+                                 pmInDom zoneinfo_protection_indom);
diff --git a/src/pmdas/linux/root_linux b/src/pmdas/linux/root_linux
index a2a0462..0bcff26 100644
--- a/src/pmdas/linux/root_linux
+++ b/src/pmdas/linux/root_linux
@@ -519,6 +519,7 @@ mem.zoneinfo {
     spanned		60:68:5
     present		60:68:6
     managed		60:68:7
+    protection		60:70:0
 }
 
 swap {
-- 
1.8.3.1
regression_testing_for_protection_metric.patch (application/octet-stream, 7.6 KB)
From 9c8a86a75bbf47360743ca7b72772e3358e6b60c Mon Sep 17 00:00:00 2001
From: Liming <[email protected]>
Date: Thu, 9 Feb 2017 15:43:51 +0800
Subject: [PATCH] regression testing for protection metric

---
 qa/821     |   2 +-
 qa/821.out | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 101 insertions(+), 1 deletion(-)

diff --git a/qa/821 b/qa/821
index 4faca78..ccb37d4 100755
--- a/qa/821
+++ b/qa/821
@@ -15,7 +15,7 @@ echo "QA output created by $seq"
 
 [ $PCP_PLATFORM = linux ] || _notrun "Linux-specific memory metric testing"
 userid=`id -u`	# test exercises procfs access from both root and non-root
-[ "$userid" != 0 ] || _notrun "Test cannot be run as privileged root user"
+#[ "$userid" != 0 ] || _notrun "Test cannot be run as privileged root user"
 
 config="$PCP_PMDAS_DIR/linux/bandwidth.conf"
 
diff --git a/qa/821.out b/qa/821.out
index 7d7abec..1311b9f 100644
--- a/qa/821.out
+++ b/qa/821.out
@@ -863,6 +863,20 @@ mem.zoneinfo.present
     inst [N or "DMA::node0"] value 15984
     inst [N or "Normal::node0"] value 14653440
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 56164
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 56164
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 6336
+    inst [N or "DMA::node0::lowmem_reserved2"] value 62500
+    inst [N or "DMA::node0::lowmem_reserved3"] value 62500
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
@@ -1954,6 +1968,20 @@ mem.zoneinfo.present
     inst [N or "DMA::node0"] value 15984
     inst [N or "Normal::node0"] value 14653440
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 56164
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 56164
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 6336
+    inst [N or "DMA::node0::lowmem_reserved2"] value 62500
+    inst [N or "DMA::node0::lowmem_reserved3"] value 62500
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
@@ -2809,6 +2837,24 @@ mem.zoneinfo.present
     inst [N or "Normal::node0"] value 65011712
     inst [N or "Normal::node1"] value 67108864
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 249844
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 249844
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 7016
+    inst [N or "DMA::node0::lowmem_reserved2"] value 256864
+    inst [N or "DMA::node0::lowmem_reserved3"] value 256864
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+    inst [N or "Normal::node1::lowmem_reserved0"] value 0
+    inst [N or "Normal::node1::lowmem_reserved1"] value 0
+    inst [N or "Normal::node1::lowmem_reserved2"] value 0
+    inst [N or "Normal::node1::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
@@ -3795,6 +3841,24 @@ mem.zoneinfo.present
     inst [N or "Normal::node0"] value 65011712
     inst [N or "Normal::node1"] value 67108864
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 249844
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 249844
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 7016
+    inst [N or "DMA::node0::lowmem_reserved2"] value 256864
+    inst [N or "DMA::node0::lowmem_reserved3"] value 256864
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+    inst [N or "Normal::node1::lowmem_reserved0"] value 0
+    inst [N or "Normal::node1::lowmem_reserved1"] value 0
+    inst [N or "Normal::node1::lowmem_reserved2"] value 0
+    inst [N or "Normal::node1::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
@@ -4652,6 +4716,24 @@ mem.zoneinfo.present
     inst [N or "Normal::node0"] value 65011712
     inst [N or "Normal::node1"] value 67108864
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 249844
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 249844
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 7016
+    inst [N or "DMA::node0::lowmem_reserved2"] value 256864
+    inst [N or "DMA::node0::lowmem_reserved3"] value 256864
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+    inst [N or "Normal::node1::lowmem_reserved0"] value 0
+    inst [N or "Normal::node1::lowmem_reserved1"] value 0
+    inst [N or "Normal::node1::lowmem_reserved2"] value 0
+    inst [N or "Normal::node1::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
@@ -5638,6 +5720,24 @@ mem.zoneinfo.present
     inst [N or "Normal::node0"] value 65011712
     inst [N or "Normal::node1"] value 67108864
 
+mem.zoneinfo.protection
+    inst [N or "DMA32::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved1"] value 0
+    inst [N or "DMA32::node0::lowmem_reserved2"] value 249844
+    inst [N or "DMA32::node0::lowmem_reserved3"] value 249844
+    inst [N or "DMA::node0::lowmem_reserved0"] value 0
+    inst [N or "DMA::node0::lowmem_reserved1"] value 7016
+    inst [N or "DMA::node0::lowmem_reserved2"] value 256864
+    inst [N or "DMA::node0::lowmem_reserved3"] value 256864
+    inst [N or "Normal::node0::lowmem_reserved0"] value 0
+    inst [N or "Normal::node0::lowmem_reserved1"] value 0
+    inst [N or "Normal::node0::lowmem_reserved2"] value 0
+    inst [N or "Normal::node0::lowmem_reserved3"] value 0
+    inst [N or "Normal::node1::lowmem_reserved0"] value 0
+    inst [N or "Normal::node1::lowmem_reserved1"] value 0
+    inst [N or "Normal::node1::lowmem_reserved2"] value 0
+    inst [N or "Normal::node1::lowmem_reserved3"] value 0
+
 mem.zoneinfo.scanned
     inst [N or "DMA32::node0"] value 0
     inst [N or "DMA::node0"] value 0
-- 
1.8.3.1