Peter Zijlstra
87e24f4b67
perf/x86: Fix local vs remote memory events for NHM/WSM
Verified using the below proglet.. before:
[root@westmere ~]# perf stat -e node-stores -e node-store-misses ./numa 0
remote write
Performance counter stats for './numa 0':
2,101,554 node-stores
2,096,931 node-store-misses
5.021546079 seconds time elapsed
[root@westmere ~]# perf stat -e node-stores -e node-store-misses ./numa 1
local write
Performance counter stats for './numa 1':
501,137 node-stores
199 node-store-misses
5.124451068 seconds time elapsed
After:
[root@westmere ~]# perf stat -e node-stores -e node-store-misses ./numa 0
remote write
Performance counter stats for './numa 0':
2,107,516 node-stores
2,097,187 node-store-misses
5.012755149 seconds time elapsed
[root@westmere ~]# perf stat -e node-stores -e node-store-misses ./numa 1
local write
Performance counter stats for './numa 1':
2,063,355 node-stores
165 node-store-misses
5.082091494 seconds time elapsed
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <dirent.h>
#include <signal.h>
#include <unistd.h>
#include <numaif.h>
#include <stdlib.h>
#define SIZE (32*1024*1024)
volatile int done;
void sig_done(int sig)
{
done = 1;
}
int main(int argc, char **argv)
{
cpu_set_t *mask, *mask2;
size_t size;
int i, err, t;
int nrcpus = 1024;
char *mem;
unsigned long nodemask = 0x01; /* node 0 */
DIR *node;
struct dirent *de;
int read = 0;
int local = 0;
if (argc < 2) {
printf("usage: %s [0-3]\n", argv[0]);
printf(" bit0 - local/remote\n");
printf(" bit1 - read/write\n");
exit(0);
}
switch (atoi(argv[1])) {
case 0:
printf("remote write\n");
break;
case 1:
printf("local write\n");
local = 1;
break;
case 2:
printf("remote read\n");
read = 1;
break;
case 3:
printf("local read\n");
local = 1;
read = 1;
break;
}
mask = CPU_ALLOC(nrcpus);
size = CPU_ALLOC_SIZE(nrcpus);
CPU_ZERO_S(size, mask);
node = opendir("/sys/devices/system/node/node0/");
if (!node)
perror("opendir");
while ((de = readdir(node))) {
int cpu;
if (sscanf(de->d_name, "cpu%d", &cpu) == 1)
CPU_SET_S(cpu, size, mask);
}
closedir(node);
mask2 = CPU_ALLOC(nrcpus);
CPU_ZERO_S(size, mask2);
for (i = 0; i < size; i++)
CPU_SET_S(i, size, mask2);
CPU_XOR_S(size, mask2, mask2, mask); // invert
if (!local)
mask = mask2;
err = sched_setaffinity(0, size, mask);
if (err)
perror("sched_setaffinity");
mem = mmap(0, SIZE, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
err = mbind(mem, SIZE, MPOL_BIND, &nodemask, 8*sizeof(nodemask), MPOL_MF_MOVE);
if (err)
perror("mbind");
signal(SIGALRM, sig_done);
alarm(5);
if (!read) {
while (!done) {
for (i = 0; i < SIZE; i++)
mem[i] = 0x01;
}
} else {
while (!done) {
for (i = 0; i < SIZE; i++)
t += *(volatile char *)(mem + i);
}
}
return 0;
}
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: <stable@kernel.org>
Link: http://lkml.kernel.org/n/tip-tq73sxus35xmqpojf7ootxgs@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2012-03-12 20:43:41 +01:00
..
2011-12-23 11:00:50 -08:00
2012-01-08 12:35:44 +01:00
2012-03-12 20:43:41 +01:00
2011-11-14 13:05:15 +01:00
2011-09-27 18:08:04 +02:00
2012-01-11 18:50:26 -08:00
2011-07-23 10:34:47 -07:00
2011-07-14 11:47:53 -07:00
2012-01-13 09:32:18 +10:30
2011-11-17 13:35:37 -08:00
2011-11-17 13:35:37 -08:00
2011-12-12 14:26:10 -08:00
2011-07-14 11:47:53 -07:00
2012-01-03 22:54:55 -05:00
2011-03-23 19:47:19 -07:00
2011-03-23 19:47:19 -07:00
2011-10-10 06:56:57 +02:00
2011-10-31 19:30:35 -04:00
2011-12-19 13:09:56 -08:00
2012-02-02 11:11:13 -08:00
2012-01-26 21:28:45 +01:00
2012-01-18 15:51:48 -08:00
2012-01-11 19:13:40 -08:00
2011-03-16 14:03:32 +01:00
2012-01-17 16:41:31 -08:00
2012-02-20 19:45:26 -05:00
2011-05-25 19:56:26 -04:00
2011-12-08 10:22:07 -08:00
2011-12-08 10:22:07 -08:00
2011-03-15 20:01:36 -07:00
2011-12-21 15:38:55 -05:00
2011-07-14 11:47:53 -07:00
2012-01-07 12:03:30 -08:00
2011-07-21 14:10:00 +02:00
2011-03-23 22:15:54 +01:00
2011-07-01 10:37:14 +02:00
2011-07-26 16:49:47 -07:00
2011-12-05 12:25:44 +01:00
2011-12-07 09:27:11 +01:00
2012-01-06 13:58:21 -08:00
2011-12-21 16:26:03 -08:00
2011-12-06 20:41:02 +01:00
2011-10-10 06:56:57 +02:00
2011-10-26 17:03:38 +02:00
2011-12-27 11:17:08 +02:00
2011-11-20 10:53:48 +02:00
2012-01-16 18:19:19 -08:00
2011-03-18 10:39:30 +01:00
2012-02-07 10:53:42 +01:00
2012-01-07 12:03:30 -08:00
2011-10-14 13:16:35 +02:00
2011-07-24 22:06:04 +09:30
2011-12-20 12:14:26 +01:00
2012-01-03 22:54:55 -05:00
2011-12-07 23:26:57 +01:00
2011-12-21 15:38:55 -05:00
2011-08-12 20:46:24 -07:00
2011-06-10 14:55:36 +02:00
2011-11-15 12:22:31 +01:00
2011-05-10 10:21:35 +02:00
2011-10-31 19:30:35 -04:00
2012-02-20 10:58:54 -08:00
2012-02-20 10:58:54 -08:00
2011-12-06 10:02:38 +01:00
2012-01-17 16:16:56 -05:00
2011-12-05 18:13:11 +01:00
2011-05-02 14:44:46 -07:00
2012-01-30 10:52:33 +01:00
2011-07-21 11:19:28 +02:00
2011-07-21 11:19:28 +02:00
2011-12-05 17:09:21 +01:00
2012-01-11 19:12:33 -08:00
2012-01-10 16:30:54 -08:00
2012-01-07 12:19:37 +01:00
2012-01-11 19:13:40 -08:00
2011-06-14 22:48:51 -04:00
2011-08-04 16:13:49 -07:00
2011-09-28 10:34:31 +02:00
2011-11-18 16:25:07 -08:00
2011-11-17 13:35:37 -08:00
2011-10-31 19:30:35 -04:00
2011-05-21 19:10:33 +02:00
2011-10-31 19:30:35 -04:00
2011-10-31 19:30:35 -04:00
2011-07-14 11:47:53 -07:00
2012-02-20 10:58:28 -08:00
2011-12-05 18:00:31 +01:00
2012-01-19 12:56:50 -08:00
2011-03-18 10:39:30 +01:00
2012-01-17 18:10:11 -08:00
2011-08-10 19:26:46 -05:00
2011-12-05 12:17:29 +01:00
2011-08-10 19:26:46 -05:00
2011-08-04 16:13:53 -07:00
2012-01-11 18:50:26 -08:00
2012-02-18 10:19:41 -08:00