blob: 540dcd1363c77e01ccbe12babd3301a02a513021 [file] [log] [blame]
/*
* Copyright (C) 2015 Intel Corporation
* Author: Tony Luck
*
* This software may be redistributed and/or modified under the terms of
* the GNU General Public License ("GPL") version 2 only as published by the
* Free Software Foundation.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*
* read /proc/cpuinfo to discover:
* 1) number of cpu sockets
* 2) Number of logical cpus
* 3) Model name of the cpu
*/
void proc_cpuinfo(int *nsockets, int *ncpus, char *model)
{
FILE *fp = fopen("/proc/cpuinfo", "r");
char *p, line[4096];
long s, sockmask = 0;
int i;
*nsockets = 0;
*ncpus = 0;
if (fp == NULL)
return;
while (fgets(line, sizeof line, fp)) {
if (model[0] == '\0' && strncmp(line, "model name", 10) == 0) {
p = strchr(&line[10], ':');
while (isspace(*++p))
;
strcpy(model, p);
} else if (strncmp(line, "physical id", 11) == 0) {
(*ncpus)++;
p = strchr(&line[10], ':');
s = strtol(p+1, NULL, 10);
sockmask |= 1 << s;
}
}
for (i = 0; i < 8 * sizeof sockmask; i++)
if (sockmask & (1l << i))
(*nsockets)++;
fclose(fp);
}