From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59828) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xx9ks-0004bQ-Vj for qemu-devel@nongnu.org; Sat, 06 Dec 2014 02:26:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xx9ko-0007FM-56 for qemu-devel@nongnu.org; Sat, 06 Dec 2014 02:26:14 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:49822) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xx9kn-0007Bw-Fc for qemu-devel@nongnu.org; Sat, 06 Dec 2014 02:26:10 -0500 From: zhanghailiang Date: Sat, 6 Dec 2014 14:59:18 +0800 Message-ID: <1417849159-6568-6-git-send-email-zhang.zhanghailiang@huawei.com> In-Reply-To: <1417849159-6568-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1417849159-6568-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH RFC for-2.3 5/6] qga: implement qmp_guest_get_memory_block_size() for Linux with sysfs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: zhanghailiang , mdroth@linux.vnet.ibm.com, peter.huangpeng@huawei.com The size of a memory block is architecture dependent, For example, power uses 16MiB, ia64 uses 1GiB, x86 uses 128M. It represents the logical unit upon which memory online/offline operations are to be performed. This function will return the value to host user. Signed-off-by: zhanghailiang --- qga/commands-posix.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 1010e86..02c6b44 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -2087,6 +2087,37 @@ int64_t qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, return processed; } +int64_t qmp_guest_get_memory_block_size(Error **errp) +{ + Error *local_err = NULL; + char *dirpath; + int dirfd; + char *buf; + int64_t block_size; + + dirpath = g_strdup_printf("/sys/devices/system/memory/"); + dirfd = open(dirpath, O_RDONLY | O_DIRECTORY); + if (dirfd == -1) { + error_setg_errno(errp, errno, "open(\"%s\")", dirpath); + g_free(dirpath); + return -1; + } + g_free(dirpath); + + buf = g_malloc0(20); + ga_read_sysfs_file(dirfd, "block_size_bytes", buf, 20, &local_err); + if (local_err) { + g_free(buf); + error_propagate(errp, local_err); + return -1; + } + + block_size = strtol(buf, NULL, 16); /* the unit is bytes */ + g_free(buf); + + return block_size; +} + #else /* defined(__linux__) */ void qmp_guest_suspend_disk(Error **errp) @@ -2135,6 +2166,12 @@ int64_t qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, return -1; } +int64_t qmp_guest_get_memory_block_size(Error **errp) +{ + error_set(errp, QERR_UNSUPPORTED); + return -1; +} + #endif #if !defined(CONFIG_FSFREEZE) @@ -2221,12 +2258,6 @@ GList *ga_command_blacklist_init(GList *blacklist) return blacklist; } -int64_t qmp_guest_get_memory_block_size(Error **errp) -{ - error_set(errp, QERR_UNSUPPORTED); - return -1; -} - /* register init/cleanup routines for stateful command groups */ void ga_command_state_init(GAState *s, GACommandState *cs) { -- 1.7.12.4