Blob Blame History Raw
diff -Naurp pcp-4.3.2.wip/qa/1393 pcp-4.3.2/qa/1393
--- pcp-4.3.2.wip/qa/1393	1970-01-01 10:00:00.000000000 +1000
+++ pcp-4.3.2/qa/1393	2020-02-17 17:29:39.572489770 +1100
@@ -0,0 +1,64 @@
+#!/bin/sh
+# PCP QA Test No. 1393
+# Test sparse and non-contiguous numa-nodes and CPUs
+# RHBZ#1730492 - Some numa nodes have no instances.
+#
+# Copyright (c) 2019 Red Hat.  All Rights Reserved.
+#
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+# get standard environment, filters and checks
+. ./common.product
+. ./common.filter
+. ./common.check
+
+[ $PCP_PLATFORM = linux ] || _notrun "Linux-specific PMDA testing"
+
+_cleanup()
+{
+    cd $here
+    $sudo rm -rf $tmp $tmp.*
+}
+
+status=1	# failure is the default!
+$sudo rm -rf $tmp $tmp.* $seq.full
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_sort_instname()
+{
+    tee $tmp.sort | sed -n 2p
+    awk '/inst / {print "  ", $4, $6}' $tmp.sort | sed -e 's/\]//' | LC_COLLATE=POSIX sort
+}
+
+# real QA test starts here
+mkdir -p $tmp
+tar -C $tmp -xf linux/sysfs-numa-001.tgz
+pmda=$PCP_PMDAS_DIR/linux/pmda_linux.$DSO_SUFFIX,linux_init
+export LINUX_STATSPATH="$tmp"
+
+metrics="hinv.map.cpu_node hinv.node.online \
+  kernel.percpu.cpu.idle kernel.percpu.cpu.user kernel.pernode.cpu.idle \
+  kernel.pernode.cpu.user mem.numa.alloc.local_node mem.numa.util.total \
+  mem.numa.util.free mem.numa.util.used"
+
+echo == check basic numa metrics 4 nodes, 8 CPUs
+pminfo -L -K clear -K add,60,$pmda -f hinv.nnode hinv.ncpu
+for m in $metrics; do pminfo -L -K clear -K add,60,$pmda -f $m| _sort_instname; done
+
+echo;echo ==;echo == delete node2, leaving node0, node1 and node3;echo ==
+rm -rf $LINUX_STATSPATH/sys/devices/system/node/node2
+rm -rf $LINUX_STATSPATH/sys/devices/system/memory/memory*/node2
+echo '0,1,3' >$LINUX_STATSPATH/sys/devices/system/node/online
+echo '0,1,3' >$LINUX_STATSPATH/sys/devices/system/node/possible
+rm -rf $LINUX_STATSPATH/sys/devices/system/cpu/cpu{4,5}
+sed -i '/^cpu[45]$/d' $LINUX_STATSPATH/proc/stat
+echo '0,1,2,3,6,7' >$LINUX_STATSPATH/sys/devices/system/cpu/online
+echo '0,1,2,3,6,7' >$LINUX_STATSPATH/sys/devices/system/cpu/present
+pminfo -L -K clear -K add,60,$pmda -f hinv.nnode hinv.ncpu
+for m in $metrics; do pminfo -L -K clear -K add,60,$pmda -f $m| _sort_instname; done
+
+# success, all done
+status=0
+exit
diff -Naurp pcp-4.3.2.wip/qa/1393.out pcp-4.3.2/qa/1393.out
--- pcp-4.3.2.wip/qa/1393.out	1970-01-01 10:00:00.000000000 +1000
+++ pcp-4.3.2/qa/1393.out	2020-02-17 17:28:43.162140076 +1100
@@ -0,0 +1,129 @@
+QA output created by 1393
+== check basic numa metrics 4 nodes, 8 CPUs
+
+hinv.nnode
+    value 4
+
+hinv.ncpu
+    value 8
+hinv.map.cpu_node
+   "cpu0" 0
+   "cpu1" 0
+   "cpu2" 1
+   "cpu3" 1
+   "cpu4" 2
+   "cpu5" 2
+   "cpu6" 3
+   "cpu7" 3
+hinv.node.online
+   "node0" 1
+   "node1" 1
+   "node2" 1
+   "node3" 1
+kernel.percpu.cpu.idle
+   "cpu0" 82176250
+   "cpu1" 82246600
+   "cpu2" 82152810
+   "cpu3" 82283820
+   "cpu4" 82098120
+   "cpu5" 82009220
+   "cpu6" 82276330
+   "cpu7" 82191150
+kernel.percpu.cpu.user
+   "cpu0" 373300
+   "cpu1" 349760
+   "cpu2" 363240
+   "cpu3" 369770
+   "cpu4" 412040
+   "cpu5" 419270
+   "cpu6" 344030
+   "cpu7" 433650
+kernel.pernode.cpu.idle
+   "node0" 164422850
+   "node1" 164436630
+   "node2" 164107340
+   "node3" 164467480
+kernel.pernode.cpu.user
+   "node0" 723060
+   "node1" 733010
+   "node2" 831310
+   "node3" 777680
+mem.numa.alloc.local_node
+   "node0" 32241822
+   "node1" 32048777
+   "node2" 35574473
+   "node3" 32921660
+mem.numa.util.total
+   "node0" 1030924
+   "node1" 1031416
+   "node2" 965616
+   "node3" 1006408
+mem.numa.util.free
+   "node0" 354088
+   "node1" 557252
+   "node2" 229456
+   "node3" 271916
+mem.numa.util.used
+   "node0" 676836
+   "node1" 474164
+   "node2" 736160
+   "node3" 734492
+
+==
+== delete node2, leaving node0, node1 and node3
+==
+
+hinv.nnode
+    value 3
+
+hinv.ncpu
+    value 6
+hinv.map.cpu_node
+   "cpu0" 0
+   "cpu1" 0
+   "cpu2" 1
+   "cpu3" 1
+   "cpu6" 3
+   "cpu7" 3
+hinv.node.online
+   "node0" 1
+   "node1" 1
+   "node3" 1
+kernel.percpu.cpu.idle
+   "cpu0" 82176250
+   "cpu1" 82246600
+   "cpu2" 82152810
+   "cpu3" 82283820
+   "cpu6" 82276330
+   "cpu7" 82191150
+kernel.percpu.cpu.user
+   "cpu0" 373300
+   "cpu1" 349760
+   "cpu2" 363240
+   "cpu3" 369770
+   "cpu6" 344030
+   "cpu7" 433650
+kernel.pernode.cpu.idle
+   "node0" 164422850
+   "node1" 164436630
+   "node3" 164467480
+kernel.pernode.cpu.user
+   "node0" 723060
+   "node1" 733010
+   "node3" 777680
+mem.numa.alloc.local_node
+   "node0" 32241822
+   "node1" 32048777
+   "node3" 32921660
+mem.numa.util.total
+   "node0" 1030924
+   "node1" 1031416
+   "node3" 1006408
+mem.numa.util.free
+   "node0" 354088
+   "node1" 557252
+   "node3" 271916
+mem.numa.util.used
+   "node0" 676836
+   "node1" 474164
+   "node3" 734492
diff -Naurp pcp-4.3.2.wip/qa/747 pcp-4.3.2/qa/747
--- pcp-4.3.2.wip/qa/747	2017-11-30 12:48:48.000000000 +1100
+++ pcp-4.3.2/qa/747	2020-02-17 17:28:43.161140088 +1100
@@ -19,27 +19,10 @@ status=1	# failure is the default!
 $sudo rm -rf $tmp.* $seq.full
 trap "cd $here; rm -rf $tmp.*; exit \$status" 0 1 2 3 15
 
-# deal with non-determinism in the order in which the per cpu indom
-# is populated
-# input is assumed to be in the format ...
-# 	head ...
-# 	stuff to fix ...
-# 	tail ...
-#
-_fix_percpu_indom()
+_sort_instname()
 {
-    rm -f $tmp.head $tmp.percpu $tmp.tail
-    $PCP_AWK_PROG '
-/^hinv\.cpu\.online/		{ state = 1 }
-/^kernel\.percpu\./		{ state = 1 }
-state == 0			{ print >"'"$tmp.head"'"; next }
-state == 1			{ print >"'"$tmp.percpu"'" }
-state == 2			{ print >"'"$tmp.tail"'"; next }
-state == 1 && NF == 0		{ state = 2 }'
-    [ -f $tmp.head ] && cat $tmp.head
-    [ -f $tmp.percpu ] && $here/src/sortinst -i <$tmp.percpu \
-			  | sed -e 's/cpu[0-9][0-9]*/cpuN/'
-    [ -f $tmp.tail ] && cat $tmp.tail
+    tee $tmp.sort | sed -n 2p
+    awk '/inst / {print "  ", $4, $6}' $tmp.sort | sed -e 's/\]//' | LC_COLLATE=POSIX sort
 }
 
 # real QA test starts here
@@ -54,7 +37,7 @@ allcpu_metrics=`pminfo $local kernel.all
 percpu_metrics=`pminfo $local kernel.percpu.cpu | LC_COLLATE=POSIX sort`
 pernode_metrics=`pminfo $local kernel.pernode.cpu | LC_COLLATE=POSIX sort`
 
-for tgz in $here/linux/sysdev-*.tgz
+for tgz in $here/linux/sysdev-*.tgz $here/linux/sysfs-numa-001.tgz
 do
     rm -fr $root
     mkdir $root || _fail "root in use when processing $tgz"
@@ -65,7 +48,7 @@ do
     echo "== Checking hinv metric values - $base"
     for m in $hinv_metrics
     do
-	pminfo $local -f $m | _fix_percpu_indom
+	pminfo $local -f $m | _sort_instname
     done
     echo && echo "== done" && echo
 
@@ -76,12 +59,15 @@ do
     echo "== Checking per-CPU metric values - $base"
     for m in $percpu_metrics
     do
-	pminfo $local -f $m | _fix_percpu_indom
+	pminfo $local -f $m | _sort_instname
     done
     echo && echo "== done" && echo
 
     echo "== Checking per-node CPU metric values - $base"
-    pminfo $local -f $pernode_metrics
+    for m in $pernode_metrics
+    do
+	pminfo $local -f $m | _sort_instname
+    done
     echo && echo "== done" && echo
 
     cd $here
diff -Naurp pcp-4.3.2.wip/qa/747.out pcp-4.3.2/qa/747.out
--- pcp-4.3.2.wip/qa/747.out	2017-11-30 12:48:48.000000000 +1100
+++ pcp-4.3.2/qa/747.out	2020-02-17 17:28:43.161140088 +1100
@@ -1,14 +1,12 @@
 QA output created by 747
 == Checking hinv metric values - sysdev-root-001.tgz
-
 hinv.cpu.online
-    inst [0 or "cpuN"] value 1
-    inst [1 or "cpuN"] value 1
-    inst [2 or "cpuN"] value 0
-    inst [3 or "cpuN"] value 1
-
+   "cpu0" 1
+   "cpu1" 1
+   "cpu2" 0
+   "cpu3" 1
 hinv.node.online
-    inst [0 or "node0"] value 1
+   "node0" 1
 
 == done
 
@@ -56,127 +54,352 @@ kernel.all.cpu.wait.total
 == done
 
 == Checking per-CPU metric values - sysdev-root-001.tgz
-
 kernel.percpu.cpu.guest
-    inst [0 or "cpuN"] value 20
-    inst [1 or "cpuN"] value 0
-    inst [2 or "cpuN"] value 0
-    inst [3 or "cpuN"] value 0
-
+   "cpu0" 20
+   "cpu1" 0
+   "cpu2" 0
+   "cpu3" 0
 kernel.percpu.cpu.guest_nice
-    inst [0 or "cpuN"] value 30
-    inst [1 or "cpuN"] value 0
-    inst [2 or "cpuN"] value 0
-    inst [3 or "cpuN"] value 0
-
+   "cpu0" 30
+   "cpu1" 0
+   "cpu2" 0
+   "cpu3" 0
 kernel.percpu.cpu.idle
-    inst [0 or "cpuN"] value 286728520
-    inst [1 or "cpuN"] value 286695100
-    inst [2 or "cpuN"] value 286198490
-    inst [3 or "cpuN"] value 287003820
-
+   "cpu0" 286728520
+   "cpu1" 286695100
+   "cpu2" 286198490
+   "cpu3" 287003820
 kernel.percpu.cpu.intr
-    inst [0 or "cpuN"] value 36540
-    inst [1 or "cpuN"] value 25500
-    inst [2 or "cpuN"] value 51900
-    inst [3 or "cpuN"] value 31930
-
+   "cpu0" 36540
+   "cpu1" 25500
+   "cpu2" 51900
+   "cpu3" 31930
 kernel.percpu.cpu.irq.hard
-    inst [0 or "cpuN"] value 13940
-    inst [1 or "cpuN"] value 10830
-    inst [2 or "cpuN"] value 18940
-    inst [3 or "cpuN"] value 12030
-
+   "cpu0" 13940
+   "cpu1" 10830
+   "cpu2" 18940
+   "cpu3" 12030
 kernel.percpu.cpu.irq.soft
-    inst [0 or "cpuN"] value 22600
-    inst [1 or "cpuN"] value 14670
-    inst [2 or "cpuN"] value 32960
-    inst [3 or "cpuN"] value 19900
-
+   "cpu0" 22600
+   "cpu1" 14670
+   "cpu2" 32960
+   "cpu3" 19900
 kernel.percpu.cpu.nice
-    inst [0 or "cpuN"] value 4620
-    inst [1 or "cpuN"] value 1380
-    inst [2 or "cpuN"] value 630
-    inst [3 or "cpuN"] value 550
-
+   "cpu0" 4620
+   "cpu1" 1380
+   "cpu2" 630
+   "cpu3" 550
 kernel.percpu.cpu.steal
-    inst [0 or "cpuN"] value 10
-    inst [1 or "cpuN"] value 0
-    inst [2 or "cpuN"] value 0
-    inst [3 or "cpuN"] value 0
-
+   "cpu0" 10
+   "cpu1" 0
+   "cpu2" 0
+   "cpu3" 0
 kernel.percpu.cpu.sys
-    inst [0 or "cpuN"] value 105050
-    inst [1 or "cpuN"] value 146320
-    inst [2 or "cpuN"] value 109360
-    inst [3 or "cpuN"] value 146920
-
+   "cpu0" 105050
+   "cpu1" 146320
+   "cpu2" 109360
+   "cpu3" 146920
 kernel.percpu.cpu.user
-    inst [0 or "cpuN"] value 101190
-    inst [1 or "cpuN"] value 359270
-    inst [2 or "cpuN"] value 113190
-    inst [3 or "cpuN"] value 275520
-
+   "cpu0" 101190
+   "cpu1" 359270
+   "cpu2" 113190
+   "cpu3" 275520
 kernel.percpu.cpu.vnice
-    inst [0 or "cpuN"] value 4590
-    inst [1 or "cpuN"] value 1380
-    inst [2 or "cpuN"] value 630
-    inst [3 or "cpuN"] value 550
-
+   "cpu0" 4590
+   "cpu1" 1380
+   "cpu2" 630
+   "cpu3" 550
 kernel.percpu.cpu.vuser
-    inst [0 or "cpuN"] value 101170
-    inst [1 or "cpuN"] value 359270
-    inst [2 or "cpuN"] value 113190
-    inst [3 or "cpuN"] value 275520
-
+   "cpu0" 101170
+   "cpu1" 359270
+   "cpu2" 113190
+   "cpu3" 275520
 kernel.percpu.cpu.wait.total
-    inst [0 or "cpuN"] value 877160
-    inst [1 or "cpuN"] value 649420
-    inst [2 or "cpuN"] value 1373400
-    inst [3 or "cpuN"] value 420180
+   "cpu0" 877160
+   "cpu1" 649420
+   "cpu2" 1373400
+   "cpu3" 420180
 
 == done
 
 == Checking per-node CPU metric values - sysdev-root-001.tgz
-
 kernel.pernode.cpu.guest
-    inst [0 or "node0"] value 20
-
+   "node0" 20
 kernel.pernode.cpu.guest_nice
-    inst [0 or "node0"] value 30
-
+   "node0" 30
 kernel.pernode.cpu.idle
-    inst [0 or "node0"] value 1146625930
-
+   "node0" 1146625930
 kernel.pernode.cpu.intr
-    inst [0 or "node0"] value 145870
-
+   "node0" 145870
 kernel.pernode.cpu.irq.hard
-    inst [0 or "node0"] value 55740
-
+   "node0" 55740
 kernel.pernode.cpu.irq.soft
-    inst [0 or "node0"] value 90130
-
+   "node0" 90130
 kernel.pernode.cpu.nice
-    inst [0 or "node0"] value 7180
-
+   "node0" 7180
 kernel.pernode.cpu.steal
-    inst [0 or "node0"] value 10
-
+   "node0" 10
 kernel.pernode.cpu.sys
-    inst [0 or "node0"] value 507650
-
+   "node0" 507650
 kernel.pernode.cpu.user
-    inst [0 or "node0"] value 849170
-
+   "node0" 849170
 kernel.pernode.cpu.vnice
-    inst [0 or "node0"] value 7150
-
+   "node0" 7150
 kernel.pernode.cpu.vuser
-    inst [0 or "node0"] value 849150
+   "node0" 849150
+kernel.pernode.cpu.wait.total
+   "node0" 3320160
+
+== done
+
+== Checking hinv metric values - sysfs-numa-001.tgz
+hinv.cpu.online
+   "cpu0" 1
+   "cpu1" 1
+   "cpu2" 1
+   "cpu3" 1
+   "cpu4" 1
+   "cpu5" 1
+   "cpu6" 1
+   "cpu7" 1
+hinv.node.online
+   "node0" 1
+   "node1" 1
+   "node2" 1
+   "node3" 1
+
+== done
+
+== Checking aggregate CPU metric values - sysfs-numa-001.tgz
+
+kernel.all.cpu.guest
+    value 0
+
+kernel.all.cpu.guest_nice
+    value 0
+
+kernel.all.cpu.idle
+    value 657434330
+
+kernel.all.cpu.intr
+    value 368500
+
+kernel.all.cpu.irq.hard
+    value 252590
 
+kernel.all.cpu.irq.soft
+    value 115910
+
+kernel.all.cpu.nice
+    value 41160
+
+kernel.all.cpu.steal
+    value 143770
+
+kernel.all.cpu.sys
+    value 1200190
+
+kernel.all.cpu.user
+    value 3065100
+
+kernel.all.cpu.vnice
+    value 41160
+
+kernel.all.cpu.vuser
+    value 3065100
+
+kernel.all.cpu.wait.total
+    value 979420
+
+== done
+
+== Checking per-CPU metric values - sysfs-numa-001.tgz
+kernel.percpu.cpu.guest
+   "cpu0" 0
+   "cpu1" 0
+   "cpu2" 0
+   "cpu3" 0
+   "cpu4" 0
+   "cpu5" 0
+   "cpu6" 0
+   "cpu7" 0
+kernel.percpu.cpu.guest_nice
+   "cpu0" 0
+   "cpu1" 0
+   "cpu2" 0
+   "cpu3" 0
+   "cpu4" 0
+   "cpu5" 0
+   "cpu6" 0
+   "cpu7" 0
+kernel.percpu.cpu.idle
+   "cpu0" 82176250
+   "cpu1" 82246600
+   "cpu2" 82152810
+   "cpu3" 82283820
+   "cpu4" 82098120
+   "cpu5" 82009220
+   "cpu6" 82276330
+   "cpu7" 82191150
+kernel.percpu.cpu.intr
+   "cpu0" 31120
+   "cpu1" 27570
+   "cpu2" 65310
+   "cpu3" 32900
+   "cpu4" 30160
+   "cpu5" 74500
+   "cpu6" 69300
+   "cpu7" 37570
+kernel.percpu.cpu.irq.hard
+   "cpu0" 18700
+   "cpu1" 18690
+   "cpu2" 42080
+   "cpu3" 22020
+   "cpu4" 19450
+   "cpu5" 49820
+   "cpu6" 57240
+   "cpu7" 24550
+kernel.percpu.cpu.irq.soft
+   "cpu0" 12420
+   "cpu1" 8880
+   "cpu2" 23230
+   "cpu3" 10880
+   "cpu4" 10710
+   "cpu5" 24680
+   "cpu6" 12060
+   "cpu7" 13020
+kernel.percpu.cpu.nice
+   "cpu0" 2920
+   "cpu1" 3150
+   "cpu2" 2220
+   "cpu3" 4210
+   "cpu4" 7660
+   "cpu5" 9690
+   "cpu6" 2090
+   "cpu7" 9170
+kernel.percpu.cpu.steal
+   "cpu0" 16870
+   "cpu1" 13990
+   "cpu2" 26210
+   "cpu3" 17510
+   "cpu4" 15000
+   "cpu5" 16110
+   "cpu6" 18960
+   "cpu7" 19090
+kernel.percpu.cpu.sys
+   "cpu0" 124510
+   "cpu1" 156270
+   "cpu2" 125800
+   "cpu3" 133860
+   "cpu4" 189540
+   "cpu5" 192970
+   "cpu6" 133390
+   "cpu7" 143810
+kernel.percpu.cpu.user
+   "cpu0" 373300
+   "cpu1" 349760
+   "cpu2" 363240
+   "cpu3" 369770
+   "cpu4" 412040
+   "cpu5" 419270
+   "cpu6" 344030
+   "cpu7" 433650
+kernel.percpu.cpu.vnice
+   "cpu0" 2920
+   "cpu1" 3150
+   "cpu2" 2220
+   "cpu3" 4210
+   "cpu4" 7660
+   "cpu5" 9690
+   "cpu6" 2090
+   "cpu7" 9170
+kernel.percpu.cpu.vuser
+   "cpu0" 373300
+   "cpu1" 349760
+   "cpu2" 363240
+   "cpu3" 369770
+   "cpu4" 412040
+   "cpu5" 419270
+   "cpu6" 344030
+   "cpu7" 433650
+kernel.percpu.cpu.wait.total
+   "cpu0" 179200
+   "cpu1" 105950
+   "cpu2" 88480
+   "cpu3" 79880
+   "cpu4" 166720
+   "cpu5" 196030
+   "cpu6" 78000
+   "cpu7" 85130
+
+== done
+
+== Checking per-node CPU metric values - sysfs-numa-001.tgz
+kernel.pernode.cpu.guest
+   "node0" 0
+   "node1" 0
+   "node2" 0
+   "node3" 0
+kernel.pernode.cpu.guest_nice
+   "node0" 0
+   "node1" 0
+   "node2" 0
+   "node3" 0
+kernel.pernode.cpu.idle
+   "node0" 164422850
+   "node1" 164436630
+   "node2" 164107340
+   "node3" 164467480
+kernel.pernode.cpu.intr
+   "node0" 58690
+   "node1" 98210
+   "node2" 104660
+   "node3" 106870
+kernel.pernode.cpu.irq.hard
+   "node0" 37390
+   "node1" 64100
+   "node2" 69270
+   "node3" 81790
+kernel.pernode.cpu.irq.soft
+   "node0" 21300
+   "node1" 34110
+   "node2" 35390
+   "node3" 25080
+kernel.pernode.cpu.nice
+   "node0" 6070
+   "node1" 6430
+   "node2" 17350
+   "node3" 11260
+kernel.pernode.cpu.steal
+   "node0" 30860
+   "node1" 43720
+   "node2" 31110
+   "node3" 38050
+kernel.pernode.cpu.sys
+   "node0" 280780
+   "node1" 259660
+   "node2" 382510
+   "node3" 277200
+kernel.pernode.cpu.user
+   "node0" 723060
+   "node1" 733010
+   "node2" 831310
+   "node3" 777680
+kernel.pernode.cpu.vnice
+   "node0" 6070
+   "node1" 6430
+   "node2" 17350
+   "node3" 11260
+kernel.pernode.cpu.vuser
+   "node0" 723060
+   "node1" 733010
+   "node2" 831310
+   "node3" 777680
 kernel.pernode.cpu.wait.total
-    inst [0 or "node0"] value 3320160
+   "node0" 285150
+   "node1" 168360
+   "node2" 362750
+   "node3" 163130
 
 == done
 
diff -Naurp pcp-4.3.2.wip/qa/group pcp-4.3.2/qa/group
--- pcp-4.3.2.wip/qa/group	2020-02-17 12:19:02.743341620 +1100
+++ pcp-4.3.2/qa/group	2020-02-17 17:28:43.161140088 +1100
@@ -1651,6 +1651,7 @@ BAD
 1388 pmwebd local
 1389 pmwebd local
 1390 atop local
+1393 pmda.linux local
 1395 pmda.prometheus local python
 1396 pcp python pidstat local BAD @vm34
 1397 pmda.smart local valgrind
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/linux.h pcp-4.3.2/src/pmdas/linux/linux.h
--- pcp-4.3.2.wip/src/pmdas/linux/linux.h	2019-01-25 11:25:19.000000000 +1100
+++ pcp-4.3.2/src/pmdas/linux/linux.h	2020-02-17 17:28:43.155140157 +1100
@@ -277,20 +277,23 @@ typedef struct {
 } softnet_t;
 
 typedef struct {
-    unsigned int	cpuid;
-    unsigned int	nodeid;
+    unsigned int	nodeid; /* node%d instance name */
+    unsigned int	instid; /* internal instance id */
+    cpuacct_t		stat;
+    struct linux_table	*meminfo;
+    struct linux_table	*memstat;
+    double		bandwidth;
+} pernode_t;
+
+typedef struct {
+    unsigned int	cpuid;  /* cpu%d instance name */
+    unsigned int	instid; /* internal instance id */
+    pernode_t		*node;
     char		*name;
     cpuacct_t		stat;
     cpuinfo_t		info;
     softnet_t		*softnet;
 } percpu_t;
 
-typedef struct {
-    unsigned int	nodeid;
-    cpuacct_t		stat;
-    struct linux_table	*meminfo;
-    struct linux_table	*memstat;
-    double		bandwidth;
-} pernode_t;
 
 #endif /* LINUX_PMDA_H */
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/numa_meminfo.c pcp-4.3.2/src/pmdas/linux/numa_meminfo.c
--- pcp-4.3.2.wip/src/pmdas/linux/numa_meminfo.c	2018-03-05 18:14:58.000000000 +1100
+++ pcp-4.3.2/src/pmdas/linux/numa_meminfo.c	2020-02-17 17:28:43.152140192 +1100
@@ -113,14 +113,14 @@ refresh_numa_meminfo(void)
 	    continue;
 
 	pmsprintf(buf, sizeof(buf), "%s/sys/devices/system/node/node%d/meminfo",
-		linux_statspath, i);
+		linux_statspath, np->nodeid);
 	if ((fp = fopen(buf, "r")) != NULL) {
 	    linux_table_scan(fp, np->meminfo);
 	    fclose(fp);
 	}
 
 	pmsprintf(buf, sizeof(buf), "%s/sys/devices/system/node/node%d/numastat",
-		linux_statspath, i);
+		linux_statspath, np->nodeid);
 	if ((fp = fopen(buf, "r")) != NULL) {
 	    linux_table_scan(fp, np->memstat);
 	    fclose(fp);
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/pmda.c pcp-4.3.2/src/pmdas/linux/pmda.c
--- pcp-4.3.2.wip/src/pmdas/linux/pmda.c	2020-02-17 12:19:15.146197738 +1100
+++ pcp-4.3.2/src/pmdas/linux/pmda.c	2020-02-17 17:28:43.156140146 +1100
@@ -6098,6 +6098,7 @@ linux_fetchCallBack(pmdaMetric *mdesc, u
     net_addr_t		*addrp;
     net_interface_t	*netip;
     scsi_entry_t	*scsi_entry;
+    char		*name;
 
     if (mdesc->m_user != NULL) {
 	/* 
@@ -7306,7 +7307,7 @@ linux_fetchCallBack(pmdaMetric *mdesc, u
 	    atom->cp = get_machine_info(kernel_uname.machine);
 	    break;
 	case 8: /* hinv.map.cpu_node */
-	    atom->ul = cp->nodeid;
+	    atom->ul = cp->node->nodeid;
 	    break;
 	case 9: /* hinv.cpu.model_name */
 	    if ((i = cp->info.model_name) < 0)
@@ -7333,14 +7334,14 @@ linux_fetchCallBack(pmdaMetric *mdesc, u
     case CLUSTER_SYSFS_DEVICES:
 	switch (item) {
 	case 0: /* hinv.cpu.online */
-	    if (pmdaCacheLookup(INDOM(CPU_INDOM), inst, NULL, NULL) < 0)
+	    if (pmdaCacheLookup(INDOM(CPU_INDOM), inst, &name, NULL) < 0)
 		return PM_ERR_INST;
-	    atom->ul = refresh_sysfs_online(inst, "cpu");
+	    atom->ul = refresh_sysfs_online(name, "cpu");
 	    break;
 	case 1: /* hinv.node.online */
-	    if (pmdaCacheLookup(INDOM(NODE_INDOM), inst, NULL, NULL) < 0)
+	    if (pmdaCacheLookup(INDOM(NODE_INDOM), inst, &name, NULL) < 0)
 		return PM_ERR_INST;
-	    atom->ul = refresh_sysfs_online(inst, "node");
+	    atom->ul = refresh_sysfs_online(name, "node");
 	    break;
 
 	default:
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/proc_cpuinfo.c pcp-4.3.2/src/pmdas/linux/proc_cpuinfo.c
--- pcp-4.3.2.wip/src/pmdas/linux/proc_cpuinfo.c	2018-03-05 18:14:58.000000000 +1100
+++ pcp-4.3.2/src/pmdas/linux/proc_cpuinfo.c	2020-02-17 17:28:43.156140146 +1100
@@ -28,7 +28,7 @@
  * CPU or NUMA node ("node" parameter).
  */
 int
-refresh_sysfs_online(unsigned int node_num, const char *node)
+refresh_sysfs_online(char *instname, const char *node_or_cpu)
 {
     const char *sysfs_path = "sys/devices/system";
     char path[MAXPATHLEN];
@@ -36,8 +36,8 @@ refresh_sysfs_online(unsigned int node_n
     FILE *fp;
     int n;
 
-    pmsprintf(path, sizeof(path), "%s/%s/%s/%s%u/online",
-		linux_statspath, sysfs_path, node, node, node_num);
+    pmsprintf(path, sizeof(path), "%s/%s/%s/%s/online",
+		linux_statspath, sysfs_path, node_or_cpu, instname);
     if ((fp = fopen(path, "r")) == NULL)
 	return 1;
     n = fscanf(fp, "%u", &online);
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/proc_cpuinfo.h pcp-4.3.2/src/pmdas/linux/proc_cpuinfo.h
--- pcp-4.3.2.wip/src/pmdas/linux/proc_cpuinfo.h	2017-11-30 12:48:48.000000000 +1100
+++ pcp-4.3.2/src/pmdas/linux/proc_cpuinfo.h	2020-02-17 17:28:43.156140146 +1100
@@ -19,4 +19,4 @@
  */
 
 extern int refresh_proc_cpuinfo(void);
-extern int refresh_sysfs_online(unsigned int, const char *);
+extern int refresh_sysfs_online(char *, const char *);
diff -Naurp pcp-4.3.2.wip/src/pmdas/linux/proc_stat.c pcp-4.3.2/src/pmdas/linux/proc_stat.c
--- pcp-4.3.2.wip/src/pmdas/linux/proc_stat.c	2018-09-18 16:41:15.000000000 +1000
+++ pcp-4.3.2/src/pmdas/linux/proc_stat.c	2020-02-17 17:28:43.157140134 +1100
@@ -60,7 +60,7 @@ setup_cpu_info(cpuinfo_t *cip)
 }
 
 static void
-cpu_add(pmInDom cpus, unsigned int cpuid, unsigned int nodeid)
+cpu_add(pmInDom cpus, unsigned int cpuid, pernode_t *np)
 {
     percpu_t	*cpu;
     char	name[64];
@@ -68,23 +68,24 @@ cpu_add(pmInDom cpus, unsigned int cpuid
     if ((cpu = (percpu_t *)calloc(1, sizeof(percpu_t))) == NULL)
 	return;
     cpu->cpuid = cpuid;
-    cpu->nodeid = nodeid;
+    cpu->node = np;
     setup_cpu_info(&cpu->info);
     pmsprintf(name, sizeof(name)-1, "cpu%u", cpuid);
-    pmdaCacheStore(cpus, PMDA_CACHE_ADD, name, (void*)cpu);
+    cpu->instid = pmdaCacheStore(cpus, PMDA_CACHE_ADD, name, (void*)cpu);
 }
 
-static void
+static pernode_t *
 node_add(pmInDom nodes, unsigned int nodeid)
 {
     pernode_t	*node;
     char	name[64];
 
     if ((node = (pernode_t *)calloc(1, sizeof(pernode_t))) == NULL)
-	return;
+	return NULL;
     node->nodeid = nodeid;
     pmsprintf(name, sizeof(name)-1, "node%u", nodeid);
-    pmdaCacheStore(nodes, PMDA_CACHE_ADD, name, (void*)node);
+    node->instid = pmdaCacheStore(nodes, PMDA_CACHE_ADD, name, (void*)node);
+    return node;
 }
 
 void
@@ -98,6 +99,7 @@ cpu_node_setup(void)
     DIR			*cpu_dir;
     int			i, count;
     char		path[MAXPATHLEN];
+    pernode_t		*np;
     static int		setup;
 
     if (setup)
@@ -112,16 +114,16 @@ cpu_node_setup(void)
     count = scandir(path, &node_files, NULL, versionsort);
     if (!node_files || (linux_test_mode & LINUX_TEST_NCPUS)) {
 	/* QA mode or no sysfs support, assume single NUMA node */
-	node_add(nodes, 0);	/* default to just node zero */
+	np = node_add(nodes, 0);	/* default to just node zero */
 	for (cpu = 0; cpu < _pm_ncpus; cpu++)
-	    cpu_add(cpus, cpu, 0);	/* all in node zero */
+	    cpu_add(cpus, cpu, np);	/* all in node zero */
 	goto done;
     }
 
     for (i = 0; i < count; i++) {
 	if (sscanf(node_files[i]->d_name, "node%u", &node) != 1)
 	    continue;
-	node_add(nodes, node);
+	np = node_add(nodes, node);
 	pmsprintf(path, sizeof(path), "%s/%s/%s",
 		 linux_statspath, node_path, node_files[i]->d_name);
 	if ((cpu_dir = opendir(path)) == NULL)
@@ -129,7 +131,7 @@ cpu_node_setup(void)
 	while ((cpu_entry = readdir(cpu_dir)) != NULL) {
 	    if (sscanf(cpu_entry->d_name, "cpu%u", &cpu) != 1)
 		continue;
-	    cpu_add(cpus, cpu, node);
+	    cpu_add(cpus, cpu, np);
 	}
 	closedir(cpu_dir);
     }
@@ -172,6 +174,7 @@ refresh_proc_stat(proc_stat_t *proc_stat
     percpu_t	*cp;
     pmInDom	cpus, nodes;
     char	buf[MAXPATHLEN], *name, *sp, **bp;
+    char	cpuname[32];
     int		n = 0, i, size;
 
     static int fd = -1; /* kept open until exit(), unless testing */
@@ -282,7 +285,8 @@ refresh_proc_stat(proc_stat_t *proc_stat
 	    cp = NULL;
 	    np = NULL;
 	    i = atoi(&bufindex[n][3]);	/* extract CPU identifier */
-	    if (pmdaCacheLookup(cpus, i, &name, (void **)&cp) < 0 || !cp)
+	    pmsprintf(cpuname, sizeof(cpuname), "cpu%u", i); /* instance name */
+	    if (pmdaCacheLookupName(cpus, cpuname, &i, (void **)&cp) < 0 || !cp)
 		continue;
 	    memset(&cp->stat, 0, sizeof(cp->stat));
 	    sscanf(bufindex[n], PERCPU_FMT, &i,
@@ -290,10 +294,10 @@ refresh_proc_stat(proc_stat_t *proc_stat
 		    &cp->stat.idle, &cp->stat.wait, &cp->stat.irq,
 		    &cp->stat.sirq, &cp->stat.steal, &cp->stat.guest,
 		    &cp->stat.guest_nice);
-	    pmdaCacheStore(cpus, PMDA_CACHE_ADD, name, (void *)cp);
+	    pmdaCacheStore(cpus, PMDA_CACHE_ADD, cpuname, (void *)cp);
 
 	    /* update per-node aggregate CPU utilisation stats as well */
-	    if (pmdaCacheLookup(nodes, cp->nodeid, NULL, (void **)&np) < 0)
+	    if (pmdaCacheLookup(nodes, cp->node->instid, NULL, (void **)&np) < 0 || !np)
 		continue;
 	    np->stat.user += cp->stat.user;
 	    np->stat.nice += cp->stat.nice;