mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 14:45:24 +00:00
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:
parent
b340994bac
commit
ad18ff9dbf
@ -802,6 +802,7 @@ virNodeDeviceObjUnlock;
|
|||||||
|
|
||||||
# nodeinfo.h
|
# nodeinfo.h
|
||||||
nodeCapsInitNUMA;
|
nodeCapsInitNUMA;
|
||||||
|
nodeGetCPUmap;
|
||||||
nodeGetCPUStats;
|
nodeGetCPUStats;
|
||||||
nodeGetCellsFreeMemory;
|
nodeGetCellsFreeMemory;
|
||||||
nodeGetFreeMemory;
|
nodeGetFreeMemory;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* nodeinfo.c: Helper routines for OS specific node information
|
* 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
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -31,6 +31,7 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
#include "conf/domain_conf.h"
|
||||||
|
|
||||||
#if HAVE_NUMACTL
|
#if HAVE_NUMACTL
|
||||||
# define NUMA_VERSION1_COMPATIBILITY 1
|
# define NUMA_VERSION1_COMPATIBILITY 1
|
||||||
@ -569,6 +570,47 @@ int linuxNodeGetMemoryStats(FILE *meminfo,
|
|||||||
cleanup:
|
cleanup:
|
||||||
return ret;
|
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
|
#endif
|
||||||
|
|
||||||
int nodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED, virNodeInfoPtr nodeinfo) {
|
int nodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED, virNodeInfoPtr nodeinfo) {
|
||||||
@ -712,6 +754,30 @@ int nodeGetMemoryStats(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
#endif
|
#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 HAVE_NUMACTL
|
||||||
# if LIBNUMA_API_VERSION <= 1
|
# if LIBNUMA_API_VERSION <= 1
|
||||||
# define NUMA_MAX_N_CPUS 4096
|
# define NUMA_MAX_N_CPUS 4096
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* nodeinfo.c: Helper routines for OS specific node information
|
* 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
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -46,4 +46,7 @@ int nodeGetCellsFreeMemory(virConnectPtr conn,
|
|||||||
int maxCells);
|
int maxCells);
|
||||||
unsigned long long nodeGetFreeMemory(virConnectPtr conn);
|
unsigned long long nodeGetFreeMemory(virConnectPtr conn);
|
||||||
|
|
||||||
|
char *nodeGetCPUmap(virConnectPtr conn,
|
||||||
|
int *max_id,
|
||||||
|
const char *mapname);
|
||||||
#endif /* __VIR_NODEINFO_H__*/
|
#endif /* __VIR_NODEINFO_H__*/
|
||||||
|
Loading…
Reference in New Issue
Block a user