#include #include #include #include #include #include #include #include #include static void * set_masks(void *arg) { cpuset_t all, mask; int i, loop, rc; rc = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(all), &all); if (rc != 0) err(1, "getaffinity"); /* * Loop forever, setting the eligible cpu set to a randome * set. */ for (loop = 0; ; loop++) { CPU_ZERO(&mask); for (i = 0; i < CHAR_BIT * sizeof(mask); i++) { if (!CPU_ISSET(i, &all)) continue; if ((random() & 1) == 1) CPU_SET(i, &mask); } if (CPU_EMPTY(&mask)) continue; rc = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(mask), &mask); if (rc != 0) err(1, "setaffinity"); if ((loop & 0xFF) == 0) printf("Did %d loops of cpuset\n", loop); (void)usleep(1); } return (NULL); } static void * do_syscall(void *arg) { void *p; int loop, rc; for (loop = 0; ; loop++) { p = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_ANON, -1, 0); if (p == MAP_FAILED) err(1, "mmap"); rc = munmap(p, PAGE_SIZE); if (rc != 0) err(1, "munmap"); if ((loop & 0xFF) == 0) printf("Did %d loops of syscall\n", loop); (void)usleep(1); } return (NULL); } int main(void) { pthread_t set, sys; void *ret; int rc; srandom(time(NULL)); rc = pthread_create(&set, NULL, set_masks, NULL); if (rc != 0) err(1, "create set"); rc = pthread_create(&sys, NULL, do_syscall, NULL); if (rc != 0) err(1, "create sys"); (void)pthread_join(set, &ret); (void)pthread_join(sys, &ret); return (0); }