106 lines · 1.6 KB · C
RawDownload
/* * Copyright 2013-2015, Michael Ellerman, IBM Corp. * Licensed under GPLv2. */ #define _GNU_SOURCE	/* For CPU_ZERO etc. */ #include <elf.h>#include <errno.h>#include <fcntl.h>#include <link.h>#include <sched.h>#include <stdio.h>#include <sys/stat.h>#include <sys/types.h>#include <unistd.h> #include "utils.h" static char auxv[4096]; int read_auxv(char *buf, ssize_t buf_size){	ssize_t num;	int rc, fd; 	fd = open("/proc/self/auxv", O_RDONLY);	if (fd == -1) {		perror("open");		return -errno;	} 	num = read(fd, buf, buf_size);	if (num < 0) {		perror("read");		rc = -EIO;		goto out;	} 	if (num > buf_size) {		printf("overflowed auxv buffer\n");		rc = -EOVERFLOW;		goto out;	} 	rc = 0;out:	close(fd);	return rc;} void *find_auxv_entry(int type, char *auxv){	ElfW(auxv_t) *p; 	p = (ElfW(auxv_t) *)auxv; 	while (p->a_type != AT_NULL) {		if (p->a_type == type)			return p; 		p++;	} 	return NULL;} void *get_auxv_entry(int type){	ElfW(auxv_t) *p; 	if (read_auxv(auxv, sizeof(auxv)))		return NULL; 	p = find_auxv_entry(type, auxv);	if (p)		return (void *)p->a_un.a_val; 	return NULL;} int pick_online_cpu(void){	cpu_set_t mask;	int cpu; 	CPU_ZERO(&mask); 	if (sched_getaffinity(0, sizeof(mask), &mask)) {		perror("sched_getaffinity");		return -1;	} 	/* We prefer a primary thread, but skip 0 */	for (cpu = 8; cpu < CPU_SETSIZE; cpu += 8)		if (CPU_ISSET(cpu, &mask))			return cpu; 	/* Search for anything, but in reverse */	for (cpu = CPU_SETSIZE - 1; cpu >= 0; cpu--)		if (CPU_ISSET(cpu, &mask))			return cpu; 	printf("No cpus in affinity mask?!\n");	return -1;}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t