Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
1a7be8c6
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1a7be8c6
编写于
6月 26, 2014
作者:
M
Martin Kletzander
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
numatune: add support for per-node memory bindings in private APIs
Signed-off-by:
N
Martin Kletzander
<
mkletzan@redhat.com
>
上级
a05c0152
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
117 addition
and
30 deletion
+117
-30
src/conf/numatune_conf.c
src/conf/numatune_conf.c
+95
-16
src/conf/numatune_conf.h
src/conf/numatune_conf.h
+10
-4
src/libvirt_private.syms
src/libvirt_private.syms
+1
-0
src/lxc/lxc_cgroup.c
src/lxc/lxc_cgroup.c
+2
-1
src/qemu/qemu_cgroup.c
src/qemu/qemu_cgroup.c
+1
-1
src/qemu/qemu_driver.c
src/qemu/qemu_driver.c
+5
-5
src/util/virnuma.c
src/util/virnuma.c
+3
-3
未找到文件。
src/conf/numatune_conf.c
浏览文件 @
1a7be8c6
...
...
@@ -63,6 +63,18 @@ struct _virDomainNumatune {
};
static
inline
bool
virDomainNumatuneNodeSpecified
(
virDomainNumatunePtr
numatune
,
int
cellid
)
{
if
(
numatune
&&
cellid
>=
0
&&
cellid
<
numatune
->
nmem_nodes
)
return
numatune
->
mem_nodes
[
cellid
].
nodeset
;
return
false
;
}
static
int
virDomainNumatuneNodeParseXML
(
virDomainDefPtr
def
,
xmlXPathContextPtr
ctxt
)
...
...
@@ -330,26 +342,37 @@ virDomainNumatuneFree(virDomainNumatunePtr numatune)
}
virDomainNumatuneMemMode
virDomainNumatuneGetMode
(
virDomainNumatunePtr
numatune
)
virDomainNumatuneGetMode
(
virDomainNumatunePtr
numatune
,
int
cellid
)
{
return
(
numatune
&&
numatune
->
memory
.
specified
)
?
numatune
->
memory
.
mode
:
0
;
if
(
!
numatune
)
return
0
;
if
(
virDomainNumatuneNodeSpecified
(
numatune
,
cellid
))
return
numatune
->
mem_nodes
[
cellid
].
mode
;
if
(
numatune
->
memory
.
specified
)
return
numatune
->
memory
.
mode
;
return
0
;
}
virBitmapPtr
virDomainNumatuneGetNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
)
virBitmapPtr
auto_nodeset
,
int
cellid
)
{
if
(
!
numatune
)
return
NULL
;
if
(
numatune
->
memory
.
placement
==
VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO
)
if
(
numatune
->
memory
.
specified
&&
numatune
->
memory
.
placement
==
VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO
)
return
auto_nodeset
;
/*
* This weird logic has the same meaning as switch with
* auto/static/default, but can be more readably changed later.
*/
if
(
numatune
->
memory
.
placement
!=
VIR_DOMAIN_NUMATUNE_PLACEMENT_STATIC
)
if
(
virDomainNumatuneNodeSpecified
(
numatune
,
cellid
))
return
numatune
->
mem_nodes
[
cellid
].
nodeset
;
if
(
!
numatune
->
memory
.
specified
)
return
NULL
;
return
numatune
->
memory
.
nodeset
;
...
...
@@ -357,23 +380,31 @@ virDomainNumatuneGetNodeset(virDomainNumatunePtr numatune,
char
*
virDomainNumatuneFormatNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
)
virBitmapPtr
auto_nodeset
,
int
cellid
)
{
return
virBitmapFormat
(
virDomainNumatuneGetNodeset
(
numatune
,
auto_nodeset
));
auto_nodeset
,
cellid
));
}
int
virDomainNumatuneMaybeFormatNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
,
char
**
mask
)
char
**
mask
,
int
cellid
)
{
*
mask
=
NULL
;
if
(
!
numatune
)
return
0
;
if
(
numatune
->
memory
.
placement
==
VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO
&&
if
(
!
virDomainNumatuneNodeSpecified
(
numatune
,
cellid
)
&&
!
numatune
->
memory
.
specified
)
return
0
;
if
(
numatune
->
memory
.
specified
&&
numatune
->
memory
.
placement
==
VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO
&&
!
auto_nodeset
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"Advice from numad is needed in case of "
...
...
@@ -381,7 +412,7 @@ virDomainNumatuneMaybeFormatNodeset(virDomainNumatunePtr numatune,
return
-
1
;
}
*
mask
=
virDomainNumatuneFormatNodeset
(
numatune
,
auto_nodeset
);
*
mask
=
virDomainNumatuneFormatNodeset
(
numatune
,
auto_nodeset
,
cellid
);
if
(
!*
mask
)
return
-
1
;
...
...
@@ -475,6 +506,35 @@ virDomainNumatuneSet(virDomainDefPtr def,
return
ret
;
}
static
bool
virDomainNumatuneNodesEqual
(
virDomainNumatunePtr
n1
,
virDomainNumatunePtr
n2
)
{
size_t
i
=
0
;
if
(
n1
->
nmem_nodes
!=
n2
->
nmem_nodes
)
return
false
;
for
(
i
=
0
;
i
<
n1
->
nmem_nodes
;
i
++
)
{
virDomainNumatuneNodePtr
nd1
=
&
n1
->
mem_nodes
[
i
];
virDomainNumatuneNodePtr
nd2
=
&
n2
->
mem_nodes
[
i
];
if
(
!
nd1
->
nodeset
&&
!
nd2
->
nodeset
)
continue
;
if
(
!
nd1
->
nodeset
||
!
nd2
->
nodeset
)
return
false
;
if
(
nd1
->
mode
!=
nd2
->
mode
)
return
false
;
if
(
!
virBitmapEqual
(
nd1
->
nodeset
,
nd2
->
nodeset
))
return
false
;
}
return
true
;
}
bool
virDomainNumatuneEquals
(
virDomainNumatunePtr
n1
,
virDomainNumatunePtr
n2
)
...
...
@@ -486,7 +546,7 @@ virDomainNumatuneEquals(virDomainNumatunePtr n1,
return
false
;
if
(
!
n1
->
memory
.
specified
&&
!
n2
->
memory
.
specified
)
return
true
;
return
virDomainNumatuneNodesEqual
(
n1
,
n2
)
;
if
(
!
n1
->
memory
.
specified
||
!
n2
->
memory
.
specified
)
return
false
;
...
...
@@ -497,7 +557,10 @@ virDomainNumatuneEquals(virDomainNumatunePtr n1,
if
(
n1
->
memory
.
placement
!=
n2
->
memory
.
placement
)
return
false
;
return
virBitmapEqual
(
n1
->
memory
.
nodeset
,
n2
->
memory
.
nodeset
);
if
(
!
virBitmapEqual
(
n1
->
memory
.
nodeset
,
n2
->
memory
.
nodeset
))
return
false
;
return
virDomainNumatuneNodesEqual
(
n1
,
n2
);
}
bool
...
...
@@ -514,3 +577,19 @@ virDomainNumatuneHasPlacementAuto(virDomainNumatunePtr numatune)
return
false
;
}
bool
virDomainNumatuneHasPerNodeBinding
(
virDomainNumatunePtr
numatune
)
{
size_t
i
=
0
;
if
(
!
numatune
)
return
false
;
for
(
i
=
0
;
i
<
numatune
->
nmem_nodes
;
i
++
)
{
if
(
numatune
->
mem_nodes
[
i
].
nodeset
)
return
true
;
}
return
false
;
}
src/conf/numatune_conf.h
浏览文件 @
1a7be8c6
...
...
@@ -69,20 +69,24 @@ int virDomainNumatuneFormatXML(virBufferPtr buf, virDomainNumatunePtr numatune)
/*
* Getters
*/
virDomainNumatuneMemMode
virDomainNumatuneGetMode
(
virDomainNumatunePtr
numatune
);
virDomainNumatuneMemMode
virDomainNumatuneGetMode
(
virDomainNumatunePtr
numatune
,
int
cellid
);
virBitmapPtr
virDomainNumatuneGetNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
);
virBitmapPtr
auto_nodeset
,
int
cellid
);
/*
* Formatters
*/
char
*
virDomainNumatuneFormatNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
);
virBitmapPtr
auto_nodeset
,
int
cellid
);
int
virDomainNumatuneMaybeFormatNodeset
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
auto_nodeset
,
char
**
mask
);
char
**
mask
,
int
cellid
);
/*
* Setters
...
...
@@ -99,4 +103,6 @@ bool virDomainNumatuneEquals(virDomainNumatunePtr n1,
bool
virDomainNumatuneHasPlacementAuto
(
virDomainNumatunePtr
numatune
);
bool
virDomainNumatuneHasPerNodeBinding
(
virDomainNumatunePtr
numatune
);
#endif
/* __NUMATUNE_CONF_H__ */
src/libvirt_private.syms
浏览文件 @
1a7be8c6
...
...
@@ -614,6 +614,7 @@ virDomainNumatuneFormatXML;
virDomainNumatuneFree;
virDomainNumatuneGetMode;
virDomainNumatuneGetNodeset;
virDomainNumatuneHasPerNodeBinding;
virDomainNumatuneHasPlacementAuto;
virDomainNumatuneMaybeFormatNodeset;
virDomainNumatuneMemModeTypeFromString;
...
...
src/lxc/lxc_cgroup.c
浏览文件 @
1a7be8c6
...
...
@@ -79,7 +79,8 @@ static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
goto
cleanup
;
}
if
(
virDomainNumatuneMaybeFormatNodeset
(
def
->
numatune
,
nodemask
,
&
mask
)
<
0
)
if
(
virDomainNumatuneMaybeFormatNodeset
(
def
->
numatune
,
nodemask
,
&
mask
,
-
1
)
<
0
)
goto
cleanup
;
if
(
mask
&&
virCgroupSetCpusetMems
(
cgroup
,
mask
)
<
0
)
...
...
src/qemu/qemu_cgroup.c
浏览文件 @
1a7be8c6
...
...
@@ -603,7 +603,7 @@ qemuSetupCpusetCgroup(virDomainObjPtr vm,
if
(
virDomainNumatuneMaybeFormatNodeset
(
vm
->
def
->
numatune
,
nodemask
,
&
mem_mask
)
<
0
)
&
mem_mask
,
-
1
)
<
0
)
goto
cleanup
;
if
(
mem_mask
&&
...
...
src/qemu/qemu_driver.c
浏览文件 @
1a7be8c6
...
...
@@ -8637,7 +8637,7 @@ qemuDomainSetNumaParamsLive(virDomainObjPtr vm,
size_t i = 0;
int ret = -1;
if (virDomainNumatuneGetMode(vm->def->numatune) !=
if (virDomainNumatuneGetMode(vm->def->numatune
, -1
) !=
VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("change of nodeset for running domain "
...
...
@@ -8778,7 +8778,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
if (mode != -1 &&
virDomainNumatuneGetMode(vm->def->numatune) != mode) {
virDomainNumatuneGetMode(vm->def->numatune
, -1
) != mode) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("can't change numatune mode for running domain"));
goto cleanup;
...
...
@@ -8874,15 +8874,15 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
goto cleanup;
if (flags & VIR_DOMAIN_AFFECT_CONFIG)
param->value.i = virDomainNumatuneGetMode(persistentDef->numatune);
param->value.i = virDomainNumatuneGetMode(persistentDef->numatune
, -1
);
else
param->value.i = virDomainNumatuneGetMode(vm->def->numatune);
param->value.i = virDomainNumatuneGetMode(vm->def->numatune
, -1
);
break;
case 1: /* fill numa nodeset here */
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
nodeset = virDomainNumatuneFormatNodeset(persistentDef->numatune,
NULL);
NULL
, -1
);
if (!nodeset)
goto cleanup;
} else {
...
...
src/util/virnuma.c
浏览文件 @
1a7be8c6
...
...
@@ -98,7 +98,7 @@ virNumaSetupMemoryPolicy(virDomainNumatunePtr numatune,
int
maxnode
=
0
;
virBitmapPtr
tmp_nodemask
=
NULL
;
tmp_nodemask
=
virDomainNumatuneGetNodeset
(
numatune
,
nodemask
);
tmp_nodemask
=
virDomainNumatuneGetNodeset
(
numatune
,
nodemask
,
-
1
);
if
(
!
tmp_nodemask
)
return
0
;
...
...
@@ -123,7 +123,7 @@ virNumaSetupMemoryPolicy(virDomainNumatunePtr numatune,
nodemask_set
(
&
mask
,
bit
);
}
switch
(
virDomainNumatuneGetMode
(
numatune
))
{
switch
(
virDomainNumatuneGetMode
(
numatune
,
-
1
))
{
case
VIR_DOMAIN_NUMATUNE_MEM_STRICT
:
numa_set_bind_policy
(
1
);
numa_set_membind
(
&
mask
);
...
...
@@ -320,7 +320,7 @@ int
virNumaSetupMemoryPolicy
(
virDomainNumatunePtr
numatune
,
virBitmapPtr
nodemask
ATTRIBUTE_UNUSED
)
{
if
(
virDomainNumatuneGetNodeset
(
numatune
,
NULL
))
{
if
(
virDomainNumatuneGetNodeset
(
numatune
,
NULL
,
-
1
))
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"libvirt is compiled without NUMA tuning support"
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录