add nodeGetCPUmap() for getting available CPU IDs in a cpumap.

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
This commit is contained in:
KAMEZAWA Hiroyuki 2012-03-02 10:54:22 +08:00 committed by Eric Blake
parent b340994bac
commit ad18ff9dbf
3 changed files with 72 additions and 2 deletions

View File

@ -802,6 +802,7 @@ virNodeDeviceObjUnlock;
# nodeinfo.h
nodeCapsInitNUMA;
nodeGetCPUmap;
nodeGetCPUStats;
nodeGetCellsFreeMemory;
nodeGetFreeMemory;

View File

@ -1,7 +1,7 @@
/*
* nodeinfo.c: Helper routines for OS specific node information
*
* Copyright (C) 2006-2008, 2010-2011 Red Hat, Inc.
* Copyright (C) 2006-2008, 2010-2012 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@ -31,6 +31,7 @@
#include <dirent.h>
#include <sys/utsname.h>
#include <sched.h>
#include "conf/domain_conf.h"
#if HAVE_NUMACTL
# define NUMA_VERSION1_COMPATIBILITY 1
@ -569,6 +570,47 @@ int linuxNodeGetMemoryStats(FILE *meminfo,
cleanup:
return ret;
}
/*
* Linux maintains cpu bit map. For example, if cpuid=5's flag is not set
* and max cpu is 7. The map file shows 0-4,6-7. This function parses
* it and returns cpumap.
*/
static char *
linuxParseCPUmap(int *max_cpuid, const char *path)
{
char *map = NULL;
char *str = NULL;
int max_id, i;
if (virFileReadAll(path, 5 * VIR_DOMAIN_CPUMASK_LEN, &str) < 0) {
virReportOOMError();
goto error;
}
if (VIR_ALLOC_N(map, VIR_DOMAIN_CPUMASK_LEN) < 0) {
virReportOOMError();
goto error;
}
if (virDomainCpuSetParse(str, 0, map,
VIR_DOMAIN_CPUMASK_LEN) < 0) {
goto error;
}
for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
if (map[i]) {
max_id = i;
}
}
*max_cpuid = max_id;
return map;
error:
VIR_FREE(str);
VIR_FREE(map);
return NULL;
}
#endif
int nodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED, virNodeInfoPtr nodeinfo) {
@ -712,6 +754,30 @@ int nodeGetMemoryStats(virConnectPtr conn ATTRIBUTE_UNUSED,
#endif
}
char *
nodeGetCPUmap(virConnectPtr conn ATTRIBUTE_UNUSED,
int *max_id ATTRIBUTE_UNUSED,
const char *mapname ATTRIBUTE_UNUSED)
{
#ifdef __linux__
char *path;
char *cpumap;
if (virAsprintf(&path, CPU_SYS_PATH "/%s", mapname) < 0) {
virReportOOMError();
return NULL;
}
cpumap = linuxParseCPUmap(max_id, path);
VIR_FREE(path);
return cpumap;
#else
nodeReportError(VIR_ERR_NO_SUPPORT, "%s",
_("node cpumap not implemented on this platform"));
return NULL;
#endif
}
#if HAVE_NUMACTL
# if LIBNUMA_API_VERSION <= 1
# define NUMA_MAX_N_CPUS 4096

View File

@ -1,7 +1,7 @@
/*
* nodeinfo.c: Helper routines for OS specific node information
*
* Copyright (C) 2006-2008, 2011 Red Hat, Inc.
* Copyright (C) 2006-2008, 2011-2012 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@ -46,4 +46,7 @@ int nodeGetCellsFreeMemory(virConnectPtr conn,
int maxCells);
unsigned long long nodeGetFreeMemory(virConnectPtr conn);
char *nodeGetCPUmap(virConnectPtr conn,
int *max_id,
const char *mapname);
#endif /* __VIR_NODEINFO_H__*/