diff --git a/README.adoc b/README.adoc index c88767b..085ca15 100644 --- a/README.adoc +++ b/README.adoc @@ -12784,6 +12784,8 @@ It relates to the more common `.opt` build just as explained at xref:debug-the-e How it goes faster is explained at: https://stackoverflow.com/questions/59860091/how-to-increase-the-simulation-speed-of-a-gem5-run/59861375#59861375 +Disables debug symbols (no `-g`) for some reason. + Benchmarks present at: * xref:benchmark-emulators-on-userland-executables[xrefstyle=full] @@ -19013,6 +19015,7 @@ Examples: * link:userland/linux/sched_getcpu.c[] * link:userland/linux/getcpu.c[]: a wrapper close the the syscall that also returns the current NUMA node +* link:userland/linux/getcpu_syscal.c[]: the wrapper segfaults on error handling, so double checking with the real syscall: https://stackoverflow.com/questions/9260937/unix-socket-error-14-efault-bad-address/61879849#61879849 * link:userland/linux/sched_getcpu_barrier.c[]: this uses a barrier to ensure that gem5 will run each thread on one separate CPU Returns the CPU that the process/thread is currently running on: diff --git a/userland/linux/getcpu.c b/userland/linux/getcpu.c index 3decd13..fc28c5e 100644 --- a/userland/linux/getcpu.c +++ b/userland/linux/getcpu.c @@ -14,7 +14,7 @@ /* man getcpu says this exists since glibc 2.29, but I can't find it in Ubuntu 20.04 glibc 2.31 not even with locate * (there is a hit under /usr/src/linux-headers-5.4.0-29/include/linux/getcpu.h but it only defines `struct getcpu_cache` * and nothing else: - * https://stackoverflow.com/questions/23224607/how-do-i-include-linux-header-files-like-linux-getcpu-h + * https://stackoverflow.com/questions/23224607/how-do-i-include-linux-header-files-like-linux-getcpu-h/61774312#61774312 * Furthermore, there is already a prototype in sched.h, so we can't define our own either. */ #if 0 #include @@ -23,7 +23,7 @@ void* main_thread(void *arg) { (void)arg; unsigned cpu, numa; - getcpu(&cpu, &numa); + assert(!getcpu(&cpu, &numa)); printf("%u %u\n", cpu, numa); return NULL; } diff --git a/userland/linux/getcpu_syscall.c b/userland/linux/getcpu_syscall.c new file mode 100644 index 0000000..b9b7dc9 --- /dev/null +++ b/userland/linux/getcpu_syscall.c @@ -0,0 +1,48 @@ +/* https://cirosantilli.com/linux-kernel-module-cheat#getcpu */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +void* main_thread(void *arg) { + (void)arg; + unsigned cpu = 1, numa; + int err, ret; + assert(!syscall(SYS_getcpu, &cpu, &numa, NULL)); + err = errno; + if (ret == -1) { + printf("%d\n", err); + perror("getcpu"); + } + printf("%d %u %u\n", ret, cpu, numa); + return NULL; +} + +int main(int argc, char **argv) { + pthread_t *threads; + unsigned int nthreads, i; + if (argc > 1) { + nthreads = strtoll(argv[1], NULL, 0); + } else { + nthreads = 1; + } + threads = malloc(nthreads * sizeof(*threads)); + for (i = 0; i < nthreads; ++i) { + assert(pthread_create( + &threads[i], + NULL, + main_thread, + NULL + ) == 0); + } + for (i = 0; i < nthreads; ++i) { + pthread_join(threads[i], NULL); + } + free(threads); + return EXIT_SUCCESS; +}