Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
02d0ba14
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
02d0ba14
编写于
7月 06, 2010
作者:
A
Anthony Liguori
浏览文件
操作
浏览文件
下载
差异文件
Merge remote branch 'qmp/for-anthony' into staging
上级
9f5a1fae
a6c4d364
变更
14
展开全部
隐藏空白更改
内联
并排
Showing
14 changed file
with
418 addition
and
212 deletion
+418
-212
QMP/qmp-shell
QMP/qmp-shell
+1
-0
QMP/qmp.py
QMP/qmp.py
+5
-1
QMP/vm-info
QMP/vm-info
+1
-0
blockdev.c
blockdev.c
+1
-1
check-qdict.c
check-qdict.c
+32
-1
migration.c
migration.c
+7
-9
monitor.c
monitor.c
+255
-180
monitor.h
monitor.h
+4
-0
net.c
net.c
+4
-0
qdict.c
qdict.c
+91
-15
qdict.h
qdict.h
+8
-3
qemu-monitor.hx
qemu-monitor.hx
+1
-1
qerror.c
qerror.c
+5
-1
qerror.h
qerror.h
+3
-0
未找到文件。
QMP/qmp-shell
浏览文件 @
02d0ba14
...
...
@@ -42,6 +42,7 @@ def main():
qemu
=
qmp
.
QEMUMonitorProtocol
(
argv
[
1
])
qemu
.
connect
()
qemu
.
send
(
"qmp_capabilities"
)
print
'Connected!'
...
...
QMP/qmp.py
浏览文件 @
02d0ba14
...
...
@@ -63,10 +63,14 @@ class QEMUMonitorProtocol:
def
__json_read
(
self
):
try
:
return
json
.
loads
(
self
.
sock
.
recv
(
1024
))
while
True
:
line
=
json
.
loads
(
self
.
sockfile
.
readline
())
if
not
'event'
in
line
:
return
line
except
ValueError
:
return
def
__init__
(
self
,
filename
):
self
.
filename
=
filename
self
.
sock
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_STREAM
)
self
.
sockfile
=
self
.
sock
.
makefile
()
QMP/vm-info
浏览文件 @
02d0ba14
...
...
@@ -24,6 +24,7 @@ def main():
qemu
=
qmp
.
QEMUMonitorProtocol
(
argv
[
1
])
qemu
.
connect
()
qemu
.
send
(
"qmp_capabilities"
)
for
cmd
in
[
'version'
,
'kvm'
,
'status'
,
'uuid'
,
'balloon'
]:
print
cmd
+
': '
+
str
(
qemu
.
send
(
'query-'
+
cmd
))
...
...
blockdev.c
浏览文件 @
02d0ba14
...
...
@@ -521,7 +521,7 @@ static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
int
do_eject
(
Monitor
*
mon
,
const
QDict
*
qdict
,
QObject
**
ret_data
)
{
BlockDriverState
*
bs
;
int
force
=
qdict_get_
int
(
qdict
,
"force"
);
int
force
=
qdict_get_
try_bool
(
qdict
,
"force"
,
0
);
const
char
*
filename
=
qdict_get_str
(
qdict
,
"device"
);
bs
=
bdrv_find
(
filename
);
...
...
check-qdict.c
浏览文件 @
02d0ba14
...
...
@@ -50,7 +50,7 @@ START_TEST(qdict_put_obj_test)
qdict_put_obj
(
qdict
,
""
,
QOBJECT
(
qint_from_int
(
num
)));
fail_unless
(
qdict_size
(
qdict
)
==
1
);
ent
=
QLIST_FIRST
(
&
qdict
->
table
[
12345
%
QDICT_
HASH_SIZE
]);
ent
=
QLIST_FIRST
(
&
qdict
->
table
[
12345
%
QDICT_
BUCKET_MAX
]);
qi
=
qobject_to_qint
(
ent
->
value
);
fail_unless
(
qint_get_int
(
qi
)
==
num
);
...
...
@@ -194,6 +194,36 @@ START_TEST(qobject_to_qdict_test)
}
END_TEST
START_TEST
(
qdict_iterapi_test
)
{
int
count
;
const
QDictEntry
*
ent
;
fail_unless
(
qdict_first
(
tests_dict
)
==
NULL
);
qdict_put
(
tests_dict
,
"key1"
,
qint_from_int
(
1
));
qdict_put
(
tests_dict
,
"key2"
,
qint_from_int
(
2
));
qdict_put
(
tests_dict
,
"key3"
,
qint_from_int
(
3
));
count
=
0
;
for
(
ent
=
qdict_first
(
tests_dict
);
ent
;
ent
=
qdict_next
(
tests_dict
,
ent
)){
fail_unless
(
qdict_haskey
(
tests_dict
,
qdict_entry_key
(
ent
))
==
1
);
count
++
;
}
fail_unless
(
count
==
qdict_size
(
tests_dict
));
/* Do it again to test restarting */
count
=
0
;
for
(
ent
=
qdict_first
(
tests_dict
);
ent
;
ent
=
qdict_next
(
tests_dict
,
ent
)){
fail_unless
(
qdict_haskey
(
tests_dict
,
qdict_entry_key
(
ent
))
==
1
);
count
++
;
}
fail_unless
(
count
==
qdict_size
(
tests_dict
));
}
END_TEST
/*
* Errors test-cases
*/
...
...
@@ -338,6 +368,7 @@ static Suite *qdict_suite(void)
tcase_add_test
(
qdict_public2_tcase
,
qdict_haskey_test
);
tcase_add_test
(
qdict_public2_tcase
,
qdict_del_test
);
tcase_add_test
(
qdict_public2_tcase
,
qobject_to_qdict_test
);
tcase_add_test
(
qdict_public2_tcase
,
qdict_iterapi_test
);
qdict_errors_tcase
=
tcase_create
(
"Errors"
);
suite_add_tcase
(
s
,
qdict_errors_tcase
);
...
...
migration.c
浏览文件 @
02d0ba14
...
...
@@ -75,7 +75,9 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
{
MigrationState
*
s
=
NULL
;
const
char
*
p
;
int
detach
=
qdict_get_int
(
qdict
,
"detach"
);
int
detach
=
qdict_get_try_bool
(
qdict
,
"detach"
,
0
);
int
blk
=
qdict_get_try_bool
(
qdict
,
"blk"
,
0
);
int
inc
=
qdict_get_try_bool
(
qdict
,
"inc"
,
0
);
const
char
*
uri
=
qdict_get_str
(
qdict
,
"uri"
);
if
(
current_migration
&&
...
...
@@ -86,21 +88,17 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
if
(
strstart
(
uri
,
"tcp:"
,
&
p
))
{
s
=
tcp_start_outgoing_migration
(
mon
,
p
,
max_throttle
,
detach
,
(
int
)
qdict_get_int
(
qdict
,
"blk"
),
(
int
)
qdict_get_int
(
qdict
,
"inc"
));
blk
,
inc
);
#if !defined(WIN32)
}
else
if
(
strstart
(
uri
,
"exec:"
,
&
p
))
{
s
=
exec_start_outgoing_migration
(
mon
,
p
,
max_throttle
,
detach
,
(
int
)
qdict_get_int
(
qdict
,
"blk"
),
(
int
)
qdict_get_int
(
qdict
,
"inc"
));
blk
,
inc
);
}
else
if
(
strstart
(
uri
,
"unix:"
,
&
p
))
{
s
=
unix_start_outgoing_migration
(
mon
,
p
,
max_throttle
,
detach
,
(
int
)
qdict_get_int
(
qdict
,
"blk"
),
(
int
)
qdict_get_int
(
qdict
,
"inc"
));
blk
,
inc
);
}
else
if
(
strstart
(
uri
,
"fd:"
,
&
p
))
{
s
=
fd_start_outgoing_migration
(
mon
,
p
,
max_throttle
,
detach
,
(
int
)
qdict_get_int
(
qdict
,
"blk"
),
(
int
)
qdict_get_int
(
qdict
,
"inc"
));
blk
,
inc
);
#endif
}
else
{
monitor_printf
(
mon
,
"unknown migration protocol: %s
\n
"
,
uri
);
...
...
monitor.c
浏览文件 @
02d0ba14
此差异已折叠。
点击以展开。
monitor.h
浏览文件 @
02d0ba14
...
...
@@ -15,6 +15,10 @@ extern Monitor *default_mon;
#define MONITOR_USE_READLINE 0x02
#define MONITOR_USE_CONTROL 0x04
/* flags for monitor commands */
#define MONITOR_CMD_ASYNC 0x0001
#define MONITOR_CMD_USER_ONLY 0x0002
/* QMP events */
typedef
enum
MonitorEvent
{
QEVENT_SHUTDOWN
,
...
...
net.c
浏览文件 @
02d0ba14
...
...
@@ -1208,6 +1208,10 @@ int do_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
}
res
=
net_client_init
(
mon
,
opts
,
1
);
if
(
res
<
0
)
{
qemu_opts_del
(
opts
);
}
return
res
;
}
...
...
qdict.c
浏览文件 @
02d0ba14
...
...
@@ -82,15 +82,36 @@ static QDictEntry *alloc_entry(const char *key, QObject *value)
return
entry
;
}
/**
* qdict_entry_value(): Return qdict entry value
*
* Return weak reference.
*/
QObject
*
qdict_entry_value
(
const
QDictEntry
*
entry
)
{
return
entry
->
value
;
}
/**
* qdict_entry_key(): Return qdict entry key
*
* Return a *pointer* to the string, it has to be duplicated before being
* stored.
*/
const
char
*
qdict_entry_key
(
const
QDictEntry
*
entry
)
{
return
entry
->
key
;
}
/**
* qdict_find(): List lookup function
*/
static
QDictEntry
*
qdict_find
(
const
QDict
*
qdict
,
const
char
*
key
,
unsigned
int
hash
)
const
char
*
key
,
unsigned
int
bucket
)
{
QDictEntry
*
entry
;
QLIST_FOREACH
(
entry
,
&
qdict
->
table
[
hash
],
next
)
QLIST_FOREACH
(
entry
,
&
qdict
->
table
[
bucket
],
next
)
if
(
!
strcmp
(
entry
->
key
,
key
))
return
entry
;
...
...
@@ -110,11 +131,11 @@ static QDictEntry *qdict_find(const QDict *qdict,
*/
void
qdict_put_obj
(
QDict
*
qdict
,
const
char
*
key
,
QObject
*
value
)
{
unsigned
int
hash
;
unsigned
int
bucket
;
QDictEntry
*
entry
;
hash
=
tdb_hash
(
key
)
%
QDICT_HASH_SIZE
;
entry
=
qdict_find
(
qdict
,
key
,
hash
);
bucket
=
tdb_hash
(
key
)
%
QDICT_BUCKET_MAX
;
entry
=
qdict_find
(
qdict
,
key
,
bucket
);
if
(
entry
)
{
/* replace key's value */
qobject_decref
(
entry
->
value
);
...
...
@@ -122,7 +143,7 @@ void qdict_put_obj(QDict *qdict, const char *key, QObject *value)
}
else
{
/* allocate a new entry */
entry
=
alloc_entry
(
key
,
value
);
QLIST_INSERT_HEAD
(
&
qdict
->
table
[
hash
],
entry
,
next
);
QLIST_INSERT_HEAD
(
&
qdict
->
table
[
bucket
],
entry
,
next
);
qdict
->
size
++
;
}
}
...
...
@@ -137,7 +158,7 @@ QObject *qdict_get(const QDict *qdict, const char *key)
{
QDictEntry
*
entry
;
entry
=
qdict_find
(
qdict
,
key
,
tdb_hash
(
key
)
%
QDICT_
HASH_SIZE
);
entry
=
qdict_find
(
qdict
,
key
,
tdb_hash
(
key
)
%
QDICT_
BUCKET_MAX
);
return
(
entry
==
NULL
?
NULL
:
entry
->
value
);
}
...
...
@@ -148,8 +169,8 @@ QObject *qdict_get(const QDict *qdict, const char *key)
*/
int
qdict_haskey
(
const
QDict
*
qdict
,
const
char
*
key
)
{
unsigned
int
hash
=
tdb_hash
(
key
)
%
QDICT_HASH_SIZE
;
return
(
qdict_find
(
qdict
,
key
,
hash
)
==
NULL
?
0
:
1
);
unsigned
int
bucket
=
tdb_hash
(
key
)
%
QDICT_BUCKET_MAX
;
return
(
qdict_find
(
qdict
,
key
,
bucket
)
==
NULL
?
0
:
1
);
}
/**
...
...
@@ -272,20 +293,38 @@ const char *qdict_get_str(const QDict *qdict, const char *key)
*
* Return integer mapped by 'key', if it is not present in
* the dictionary or if the stored object is not of QInt type
* '
err
_value' will be returned.
* '
def
_value' will be returned.
*/
int64_t
qdict_get_try_int
(
const
QDict
*
qdict
,
const
char
*
key
,
int64_t
err
_value
)
int64_t
def
_value
)
{
QObject
*
obj
;
obj
=
qdict_get
(
qdict
,
key
);
if
(
!
obj
||
qobject_type
(
obj
)
!=
QTYPE_QINT
)
return
err
_value
;
return
def
_value
;
return
qint_get_int
(
qobject_to_qint
(
obj
));
}
/**
* qdict_get_try_bool(): Try to get a bool mapped by 'key'
*
* Return bool mapped by 'key', if it is not present in the
* dictionary or if the stored object is not of QBool type
* 'def_value' will be returned.
*/
int
qdict_get_try_bool
(
const
QDict
*
qdict
,
const
char
*
key
,
int
def_value
)
{
QObject
*
obj
;
obj
=
qdict_get
(
qdict
,
key
);
if
(
!
obj
||
qobject_type
(
obj
)
!=
QTYPE_QBOOL
)
return
def_value
;
return
qbool_get_int
(
qobject_to_qbool
(
obj
));
}
/**
* qdict_get_try_str(): Try to get a pointer to the stored string
* mapped by 'key'
...
...
@@ -318,12 +357,49 @@ void qdict_iter(const QDict *qdict,
int
i
;
QDictEntry
*
entry
;
for
(
i
=
0
;
i
<
QDICT_
HASH_SIZE
;
i
++
)
{
for
(
i
=
0
;
i
<
QDICT_
BUCKET_MAX
;
i
++
)
{
QLIST_FOREACH
(
entry
,
&
qdict
->
table
[
i
],
next
)
iter
(
entry
->
key
,
entry
->
value
,
opaque
);
}
}
static
QDictEntry
*
qdict_next_entry
(
const
QDict
*
qdict
,
int
first_bucket
)
{
int
i
;
for
(
i
=
first_bucket
;
i
<
QDICT_BUCKET_MAX
;
i
++
)
{
if
(
!
QLIST_EMPTY
(
&
qdict
->
table
[
i
]))
{
return
QLIST_FIRST
(
&
qdict
->
table
[
i
]);
}
}
return
NULL
;
}
/**
* qdict_first(): Return first qdict entry for iteration.
*/
const
QDictEntry
*
qdict_first
(
const
QDict
*
qdict
)
{
return
qdict_next_entry
(
qdict
,
0
);
}
/**
* qdict_next(): Return next qdict entry in an iteration.
*/
const
QDictEntry
*
qdict_next
(
const
QDict
*
qdict
,
const
QDictEntry
*
entry
)
{
QDictEntry
*
ret
;
ret
=
QLIST_NEXT
(
entry
,
next
);
if
(
!
ret
)
{
unsigned
int
bucket
=
tdb_hash
(
entry
->
key
)
%
QDICT_BUCKET_MAX
;
ret
=
qdict_next_entry
(
qdict
,
bucket
+
1
);
}
return
ret
;
}
/**
* qentry_destroy(): Free all the memory allocated by a QDictEntry
*/
...
...
@@ -347,7 +423,7 @@ void qdict_del(QDict *qdict, const char *key)
{
QDictEntry
*
entry
;
entry
=
qdict_find
(
qdict
,
key
,
tdb_hash
(
key
)
%
QDICT_
HASH_SIZE
);
entry
=
qdict_find
(
qdict
,
key
,
tdb_hash
(
key
)
%
QDICT_
BUCKET_MAX
);
if
(
entry
)
{
QLIST_REMOVE
(
entry
,
next
);
qentry_destroy
(
entry
);
...
...
@@ -366,7 +442,7 @@ static void qdict_destroy_obj(QObject *obj)
assert
(
obj
!=
NULL
);
qdict
=
qobject_to_qdict
(
obj
);
for
(
i
=
0
;
i
<
QDICT_
HASH_SIZE
;
i
++
)
{
for
(
i
=
0
;
i
<
QDICT_
BUCKET_MAX
;
i
++
)
{
QDictEntry
*
entry
=
QLIST_FIRST
(
&
qdict
->
table
[
i
]);
while
(
entry
)
{
QDictEntry
*
tmp
=
QLIST_NEXT
(
entry
,
next
);
...
...
qdict.h
浏览文件 @
02d0ba14
...
...
@@ -18,7 +18,7 @@
#include "qemu-queue.h"
#include <stdint.h>
#define QDICT_
HASH_SIZE
512
#define QDICT_
BUCKET_MAX
512
typedef
struct
QDictEntry
{
char
*
key
;
...
...
@@ -29,11 +29,13 @@ typedef struct QDictEntry {
typedef
struct
QDict
{
QObject_HEAD
;
size_t
size
;
QLIST_HEAD
(,
QDictEntry
)
table
[
QDICT_
HASH_SIZE
];
QLIST_HEAD
(,
QDictEntry
)
table
[
QDICT_
BUCKET_MAX
];
}
QDict
;
/* Object API */
QDict
*
qdict_new
(
void
);
const
char
*
qdict_entry_key
(
const
QDictEntry
*
entry
);
QObject
*
qdict_entry_value
(
const
QDictEntry
*
entry
);
size_t
qdict_size
(
const
QDict
*
qdict
);
void
qdict_put_obj
(
QDict
*
qdict
,
const
char
*
key
,
QObject
*
value
);
void
qdict_del
(
QDict
*
qdict
,
const
char
*
key
);
...
...
@@ -43,6 +45,8 @@ QDict *qobject_to_qdict(const QObject *obj);
void
qdict_iter
(
const
QDict
*
qdict
,
void
(
*
iter
)(
const
char
*
key
,
QObject
*
obj
,
void
*
opaque
),
void
*
opaque
);
const
QDictEntry
*
qdict_first
(
const
QDict
*
qdict
);
const
QDictEntry
*
qdict_next
(
const
QDict
*
qdict
,
const
QDictEntry
*
entry
);
/* Helper to qdict_put_obj(), accepts any object */
#define qdict_put(qdict, key, obj) \
...
...
@@ -56,7 +60,8 @@ QList *qdict_get_qlist(const QDict *qdict, const char *key);
QDict
*
qdict_get_qdict
(
const
QDict
*
qdict
,
const
char
*
key
);
const
char
*
qdict_get_str
(
const
QDict
*
qdict
,
const
char
*
key
);
int64_t
qdict_get_try_int
(
const
QDict
*
qdict
,
const
char
*
key
,
int64_t
err_value
);
int64_t
def_value
);
int
qdict_get_try_bool
(
const
QDict
*
qdict
,
const
char
*
key
,
int
def_value
);
const
char
*
qdict_get_try_str
(
const
QDict
*
qdict
,
const
char
*
key
);
#endif
/* QDICT_H */
qemu-monitor.hx
浏览文件 @
02d0ba14
...
...
@@ -1287,7 +1287,7 @@ ETEXI
.help = "request VM to change its memory allocation (in MB)",
.user_print = monitor_user_noop,
.mhandler.cmd_async = do_balloon,
.
async = 1
,
.
flags = MONITOR_CMD_ASYNC
,
},
STEXI
...
...
qerror.c
浏览文件 @
02d0ba14
...
...
@@ -82,7 +82,7 @@ static const QErrorStringTable qerror_table[] = {
},
{
.
error_fmt
=
QERR_DEVICE_NOT_ACTIVE
,
.
desc
=
"Device '%(device)' has not been activated
by the guest
"
,
.
desc
=
"Device '%(device)' has not been activated"
,
},
{
.
error_fmt
=
QERR_DEVICE_NOT_ENCRYPTED
,
...
...
@@ -176,6 +176,10 @@ static const QErrorStringTable qerror_table[] = {
.
error_fmt
=
QERR_QMP_BAD_INPUT_OBJECT_MEMBER
,
.
desc
=
"QMP input object member '%(member)' expects '%(expected)'"
,
},
{
.
error_fmt
=
QERR_QMP_EXTRA_MEMBER
,
.
desc
=
"QMP input object member '%(member)' is unexpected"
,
},
{
.
error_fmt
=
QERR_SET_PASSWD_FAILED
,
.
desc
=
"Could not set password"
,
...
...
qerror.h
浏览文件 @
02d0ba14
...
...
@@ -148,6 +148,9 @@ QError *qobject_to_qerror(const QObject *obj);
#define QERR_QMP_BAD_INPUT_OBJECT_MEMBER \
"{ 'class': 'QMPBadInputObjectMember', 'data': { 'member': %s, 'expected': %s } }"
#define QERR_QMP_EXTRA_MEMBER \
"{ 'class': 'QMPExtraInputObjectMember', 'data': { 'member': %s } }"
#define QERR_SET_PASSWD_FAILED \
"{ 'class': 'SetPasswdFailed', 'data': {} }"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录