Skip to content

Commit 838a150

Browse files
author
Baptiste Lepers
committed
Initial commit
0 parents  commit 838a150

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+6841
-0
lines changed

Makefile

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
CFLAGS = -I ../merge_data/ -I./utils/ -g -O0 -Wall -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I /usr/lib/x86_64-linux-gnu/glib-2.0/include/ -I../standalone_kernel_module/
2+
LDFLAGS = -lglib-2.0 -lelf -lbfd -lnuma -lm
3+
OBJECTS = ./utils/symbols.o \
4+
./utils/process.o \
5+
./utils/machine.o \
6+
./utils/rbtree.o \
7+
./utils/pqueue.o \
8+
./utils/compatibility.o \
9+
./utils/compatibility-machine.o \
10+
./utils/perf.o \
11+
./utils/data.o \
12+
./utils/mmap.o \
13+
builtin-memory-repartition.o \
14+
builtin-stack-repartition.o \
15+
builtin-dump.o \
16+
builtin-cache.o \
17+
builtin-memory-overlap.o \
18+
builtin-stats.o \
19+
builtin-sched.o \
20+
builtin-top.o \
21+
builtin-get-pid.o \
22+
builtin-memory-localize.o \
23+
builtin-zones.o \
24+
builtin-migrate.o \
25+
builtin-static-obj.o \
26+
builtin-get-npages.o \
27+
builtin-sql.o \
28+
builtin-object.o \
29+
builtin-pages.o \
30+
parse.o
31+
32+
.PHONY: all clean
33+
34+
35+
has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - -lbfd && rm a.out && echo y")
36+
ifeq ($(has_bfd),y)
37+
else
38+
$(error $(has_bfd) No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling)
39+
endif
40+
41+
has_glib := $(shell sh -c "(echo 'int main(void) { return 0; }') | $(CC) -x c - -lglib-2.0 && rm a.out && echo y")
42+
ifeq ($(has_glib),y)
43+
else
44+
$(error $(has_glib) No glib2.0 found. Install libglib2.0-dev.)
45+
endif
46+
47+
has_numa := $(shell sh -c "(echo 'int main(void) { return 0; }') | $(CC) -x c - -lnuma && rm a.out && echo y")
48+
ifeq ($(has_numa),y)
49+
else
50+
$(error $(has_numa) No libnuma found. Install libnuma-dev.)
51+
endif
52+
53+
54+
all : makefile.dep parse
55+
56+
makefile.dep : *.[Cch] utils/*.[Cch]
57+
for i in *.[Cc] utils/*.[Cch]; do gcc -MM "$${i}" ${CFLAGS}; done > $@
58+
59+
-include makefile.dep
60+
61+
parse: ${OBJECTS}
62+
$(CC) $^ -o $@ $(LDFLAGS)
63+
64+
clean:
65+
rm -f parse *.o utils/*.o

builtin-cache.c

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
#include "parse.h"
2+
#include "builtin-cache.h"
3+
4+
static int restrict_to_data_misses = 0;
5+
6+
static char* source_name[] = {
7+
"invalid",
8+
"Local L3",
9+
"Other core L1/L2",
10+
"Local DRAM",
11+
"?",
12+
"?",
13+
"?",
14+
"APIC/PCI",
15+
16+
"invalid",
17+
"?",
18+
"Remote L1/L2/L3",
19+
"Remote DRAM",
20+
"?",
21+
"?",
22+
"?",
23+
"APIC/PCI",
24+
};
25+
static int global_data_source[16];
26+
static int stack_data_source[16];
27+
static int kernel_data_source[16];
28+
static int softirq_data_source[16];
29+
static int user_data_source[16];
30+
static int num_local_per_source[16];
31+
static int num_distant_per_source[16];
32+
static int num_local_per_source_user[16];
33+
static int num_distant_per_source_user[16];
34+
static int num_local_per_source_kernel[16];
35+
static int num_distant_per_source_kernel[16];
36+
static int total_samples;
37+
static int data_miss;
38+
static int load, store;
39+
static int lin_valid, phy_valid;
40+
static int nb_non_null_phys_kern, nb_non_null_phys_user;
41+
42+
void cache_init() {
43+
memset(global_data_source, 0, sizeof(global_data_source));
44+
memset(stack_data_source, 0, sizeof(stack_data_source));
45+
memset(kernel_data_source, 0, sizeof(kernel_data_source));
46+
memset(softirq_data_source, 0, sizeof(softirq_data_source));
47+
memset(user_data_source, 0, sizeof(user_data_source));
48+
total_samples = data_miss = load = store = 0;
49+
lin_valid = phy_valid = 0;
50+
nb_non_null_phys_user = nb_non_null_phys_kern = 0;
51+
}
52+
53+
void cache_parse(struct s* s) {
54+
uint64_t udata3 = (((uint64_t)s->ibs_op_data3_high)<<32) + (uint64_t)s->ibs_op_data3_low;
55+
ibs_op_data3_t *data3 = (void*)&udata3;
56+
if(!s->ibs_dc_phys)
57+
return;
58+
59+
if(!restrict_to_data_misses || (restrict_to_data_misses && data3->ibsdcmiss)) {
60+
int status = (s->ibs_op_data2_low & 7) + 1*((s->ibs_op_data2_low & 16)>>1);
61+
/*if(status == 0)
62+
return;*/
63+
64+
total_samples++;
65+
66+
global_data_source[status]++;
67+
if(is_kernel(s))
68+
kernel_data_source[status]++;
69+
else
70+
user_data_source[status]++;
71+
if(is_softirq(s))
72+
softirq_data_source[status]++;
73+
74+
if(s->stack && s->ibs_dc_linear) {
75+
if(s->ibs_dc_linear >= s->usersp && s->ibs_dc_linear <= (uint64_t)s->stack) {
76+
stack_data_source[status]++;
77+
}
78+
}
79+
if(data3->ibsdcmiss)
80+
data_miss++;
81+
if(data3->ibsstop)
82+
store++;
83+
if(data3->ibsldop)
84+
load++;
85+
if(data3->ibsdclinaddrvalid)
86+
lin_valid++;
87+
if(data3->ibsdcphyaddrvalid)
88+
phy_valid++;
89+
if(s->ibs_dc_phys) {
90+
/*if(cpu_to_node(s->cpu) != get_addr_node(s) && status == 3)
91+
printf("#Bug: %d access locally to %d (%lx)\n", cpu_to_node(s->cpu), get_addr_node(s), s->ibs_dc_phys);*/
92+
if(is_kernel(s)) {
93+
nb_non_null_phys_kern++;
94+
if(cpu_to_node(s->cpu) != get_addr_node(s))
95+
num_distant_per_source_kernel[status]++;
96+
else
97+
num_local_per_source_kernel[status]++;
98+
} else {
99+
nb_non_null_phys_user++;
100+
if(cpu_to_node(s->cpu) != get_addr_node(s))
101+
num_distant_per_source_user[status]++;
102+
else
103+
num_local_per_source_user[status]++;
104+
}
105+
}
106+
}
107+
}
108+
109+
void cache_show() {
110+
int i, n, sum_glob = 0, sum_stack = 0, sum_user = 0, sum_kernel = 0, sum_irq, sum_local = 0, sum_distant = 0, sum_local_user = 0, sum_distant_user = 0, sum_local_kernel = 0, sum_distant_kernel = 0;
111+
112+
printf("\t\t");
113+
for(i = 0; i < 12; i++) {
114+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
115+
printf("%d (%s)%n", i, source_name[i], &n);
116+
printf("%*.*s", 24-n, 24-n, "");
117+
sum_glob += global_data_source[i];
118+
sum_stack += stack_data_source[i];
119+
sum_kernel += kernel_data_source[i];
120+
sum_user += user_data_source[i];
121+
sum_irq += softirq_data_source[i];
122+
123+
num_local_per_source[i] = num_local_per_source_user[i] + num_local_per_source_kernel[i];
124+
sum_local += num_local_per_source[i];
125+
sum_local_user += num_local_per_source_user[i];
126+
sum_local_kernel += num_local_per_source_kernel[i];
127+
128+
num_distant_per_source[i] = num_distant_per_source_user[i] + num_distant_per_source_kernel[i];
129+
sum_distant += num_distant_per_source[i];
130+
sum_distant_user += num_distant_per_source_user[i];
131+
sum_distant_kernel += num_distant_per_source_kernel[i];
132+
}
133+
printf("\n");
134+
if(!sum_glob) sum_glob = 1;
135+
if(!sum_stack) sum_stack = 1;
136+
if(!sum_kernel) sum_kernel = 1;
137+
if(!sum_user) sum_user = 1;
138+
if(!sum_irq) sum_irq = 1;
139+
if(!sum_distant) sum_distant = 1;
140+
if(!sum_distant_user) sum_distant_user = 1;
141+
if(!sum_distant_kernel) sum_distant_kernel = 1;
142+
143+
printf("Total:\t\t");
144+
for(i = 0; i < 12; i++) {
145+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
146+
if(global_data_source[i] > 10000000)
147+
printf("%dK\t(%5.2f%%)\t", global_data_source[i]/1000, 100.*((float)global_data_source[i])/((float)sum_glob));
148+
else
149+
printf("%d\t(%5.2f%%)\t", global_data_source[i], 100.*((float)global_data_source[i])/((float)sum_glob));
150+
}
151+
printf("\n");
152+
153+
printf("Stack:\t\t");
154+
for(i = 0; i < 12; i++) {
155+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
156+
printf("%d\t(%5.2f%%)\t", stack_data_source[i], 100.*((float)stack_data_source[i])/((float)sum_stack));
157+
}
158+
printf("\n");
159+
160+
printf("User:\t\t");
161+
for(i = 0; i < 12; i++) {
162+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
163+
printf("%d\t(%5.2f%%)\t", user_data_source[i], 100.*((float)user_data_source[i])/((float)sum_user));
164+
}
165+
printf("\n");
166+
167+
printf("Kernel:\t\t");
168+
for(i = 0; i < 12; i++) {
169+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
170+
printf("%d\t(%5.2f%%)\t", kernel_data_source[i], 100.*((float)kernel_data_source[i])/((float)sum_kernel));
171+
}
172+
printf("\n");
173+
174+
printf("SoftIRQ:\t");
175+
for(i = 0; i < 12; i++) {
176+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
177+
printf("%d\t(%5.2f%%)\t", softirq_data_source[i], 100.*((float)softirq_data_source[i])/((float)sum_irq));
178+
}
179+
printf("\n");
180+
181+
printf("Locality:\t");
182+
for(i = 0; i < 12; i++) {
183+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
184+
printf("\t %5.2f%% \t", 100.*((float)num_local_per_source[i])/((float)(num_local_per_source[i]+num_distant_per_source[i])));
185+
}
186+
printf("\n");
187+
188+
printf("Loc (user):\t");
189+
for(i = 0; i < 12; i++) {
190+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
191+
printf("\t %5.2f%% \t", 100.*((float)num_local_per_source_user[i])/((float)(num_local_per_source_user[i]+num_distant_per_source_user[i])));
192+
}
193+
printf("\n");
194+
195+
printf("Loc (kern):\t");
196+
for(i = 0; i < 12; i++) {
197+
if(i==4 || i==5 || i==6 || i==7 || i==8 || i==9) continue;
198+
printf("\t %5.2f%% \t", 100.*((float)num_local_per_source_kernel[i])/((float)(num_local_per_source_kernel[i]+num_distant_per_source_kernel[i])));
199+
}
200+
printf("\n");
201+
202+
printf("\n");
203+
204+
printf("%d data miss (%.2f%%)\n", data_miss, 100.*((float)data_miss)/((float)total_samples));
205+
printf("%d load\n", load);
206+
printf("%d store (%.2f%%)\n", store, 100.*((float)store)/((float)(load+store)));
207+
printf("%d lin_valid\n", lin_valid);
208+
printf("%d phy_valid\n", phy_valid);
209+
210+
printf("Non null kernel: %d\n", nb_non_null_phys_kern);
211+
printf("Non null user: %d\n", nb_non_null_phys_user);
212+
printf("%.2f%% of local accesses\n", 100.*((float)sum_local)/((float)sum_local+sum_distant));
213+
printf("%.2f%% of local accesses (user)\n", 100.*((float)sum_local_user)/((float)sum_local_user+sum_distant_user));
214+
printf("%.2f%% of local accesses (kern)\n", 100.*((float)sum_local_kernel)/((float)sum_local_kernel+sum_distant_kernel));
215+
216+
for(i = 4; i < 8; i++) {
217+
if(global_data_source[i]) {
218+
fprintf(stdout, "#Warning: data in global_data_source[%d] (%s)\n", i, source_name[i]);
219+
}
220+
}
221+
for(i = 8; i < 16; i++) {
222+
if(i==10 || i==11) continue;
223+
if(global_data_source[i]) {
224+
fprintf(stdout, "#Warning: data in global_data_source[%d] (%s)\n", i, source_name[i]);
225+
}
226+
}
227+
}
228+

builtin-cache.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef BUILTIN_CACHE
2+
#define BUILTIN_CACHE
3+
4+
void cache_init();
5+
void cache_parse(struct s* s);
6+
void cache_show();
7+
8+
#endif
9+

0 commit comments

Comments
 (0)