static void stats_check_alloc(struct ifstat *s) { int cpus = get_number_cpus(); if (s->irqs_len != get_number_cpus()) { if (s->irqs) xfree(s->irqs); if (s->irqs_srx) xfree(s->irqs_srx); if (s->irqs_stx) xfree(s->irqs_stx); if (s->cpu_user) xfree(s->cpu_user); if (s->cpu_nice) xfree(s->cpu_nice); if (s->cpu_sys) xfree(s->cpu_sys); if (s->cpu_idle) xfree(s->cpu_idle); if (s->cpu_iow) xfree(s->cpu_iow); s->irqs_srx = xzmalloc(sizeof(*(s->irqs_srx)) * cpus); s->irqs_stx = xzmalloc(sizeof(*(s->irqs_stx)) * cpus); s->irqs = xzmalloc(sizeof(*(s->irqs)) * cpus); s->cpu_user = xzmalloc(sizeof(*(s->cpu_user)) * cpus); s->cpu_nice = xzmalloc(sizeof(*(s->cpu_nice)) * cpus); s->cpu_sys = xzmalloc(sizeof(*(s->cpu_sys)) * cpus); s->cpu_idle = xzmalloc(sizeof(*(s->cpu_idle)) * cpus); s->cpu_iow = xzmalloc(sizeof(*(s->cpu_iow)) * cpus); s->irqs_len = cpus; } }
int set_cpu_affinity(const char *str, int inverted) { int ret, i, cpus; const char *p, *q; cpu_set_t cpu_bitmask; q = str; cpus = get_number_cpus(); CPU_ZERO(&cpu_bitmask); for (i = 0; inverted && i < cpus; ++i) CPU_SET(i, &cpu_bitmask); while (p = q, q = next_token(q, ','), p) { unsigned int a; /* Beginning of range */ unsigned int b; /* End of range */ unsigned int s; /* Stride */ const char *c1, *c2; if (sscanf(p, "%u", &a) < 1) return -EINVAL; b = a; s = 1; c1 = next_token(p, '-'); c2 = next_token(p, ','); if (c1 != NULL && (c2 == NULL || c1 < c2)) { if (sscanf(c1, "%u", &b) < 1) return -EINVAL; c1 = next_token(c1, ':'); if (c1 != NULL && (c2 == NULL || c1 < c2)) if (sscanf(c1, "%u", &s) < 1) return -EINVAL; } if (!(a <= b)) return -EINVAL; while (a <= b) { if (inverted) CPU_CLR(a, &cpu_bitmask); else CPU_SET(a, &cpu_bitmask); a += s; } } ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask), &cpu_bitmask); if (ret) panic("Can't set this cpu affinity!\n"); return 0; }
char *get_cpu_affinity(char *cpu_string, size_t len) { int ret, i, cpu; cpu_set_t cpu_bitmask; if (len != get_number_cpus() + 1) return NULL; CPU_ZERO(&cpu_bitmask); ret = sched_getaffinity(getpid(), sizeof(cpu_bitmask), &cpu_bitmask); if (ret) { whine("Can't fetch cpu affinity!\n"); return NULL; } for (i = 0, cpu_string[len - 1] = 0; i < len - 1; ++i) { cpu = CPU_ISSET(i, &cpu_bitmask); cpu_string[i] = (cpu ? '1' : '0'); } return cpu_string; }