From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: zhanghailiang <zhang.zhanghailiang@huawei.com>, qemu-devel@nongnu.org
Cc: peter.huangpeng@huawei.com
Subject: Re: [Qemu-devel] [PATCH RFC for-2.3 2/6] qga: introduce three help functions for memory block functions
Date: Sun, 21 Dec 2014 14:58:16 -0600 [thread overview]
Message-ID: <20141221205816.15420.70063@loki> (raw)
In-Reply-To: <1417849159-6568-3-git-send-email-zhang.zhanghailiang@huawei.com>
Quoting zhanghailiang (2014-12-06 00:59:15)
> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> ---
> qga/commands-posix.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 130 insertions(+)
>
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index b0d6a5d..8917dca 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -1875,6 +1875,136 @@ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
> return processed;
> }
I think these would break build bisectability. Please move these into the
patches which introduce the first users.
>
> +static void ga_read_sysfs_file(int dirfd, const char *pathname, char *buf,
> + int size, Error **errp)
> +{
> + int fd;
> + int res;
> +
> + errno = 0;
> + fd = openat(dirfd, pathname, O_RDONLY);
> + if (fd == -1) {
> + error_setg_errno(errp, errno, "open sysfs file \"%s\"", pathname);
> + return;
> + }
> +
> + res = pread(fd, buf, size, 0);
> + if (res == -1) {
> + error_setg_errno(errp, errno, "pread sysfs file \"%s\"", pathname);
> + } else if (res == 0) {
> + error_setg(errp, "pread sysfs file \"%s\": unexpected EOF", pathname);
> + }
> + res = close(fd);
> + g_assert(res == 0);
This should also be propagated up as an error, killing the guest agent should be
avoided when possible.
> +}
> +
> +static void ga_write_sysfs_file(int dirfd, const char *pathname,
> + const char *buf, int size, Error **errp)
> +{
> + int fd;
> + int res;
> +
> + errno = 0;
> + fd = openat(dirfd, pathname, O_WRONLY);
> + if (fd == -1) {
> + error_setg_errno(errp, errno, "open sysfs file \"%s\"", pathname);
> + return;
> + }
> +
> + if (pwrite(fd, buf, size, 0) == -1) {
> + error_setg_errno(errp, errno, "pwrite sysfs file \"%s\"", pathname);
> + }
> +
> + res = close(fd);
> + g_assert(res == 0);
> +}
> +
> +/* Transfer online/offline status between @mem_blk and the guest system.
> + *
> + * On input either @errp or *@errp must be NULL.
> + *
> + * In system-to-@mem_blk direction, the following @mem_blk fields are accessed:
> + * - R: mem_blk->phys_index
> + * - W: mem_blk->online
> + * - W: mem_blk->can_offline
> + *
> + * In @mem_blk-to-system direction, the following @mem_blk fields are accessed:
> + * - R: mem_blk->phys_index
> + * - R: mem_blk->online
> + *- R: mem_blk->can_offline
> + * Written members remain unmodified on error.
> + */
> +static void transfer_memory_block(GuestMemoryBlock *mem_blk, bool sys2memblk,
> + Error **errp)
> +{
> + char *dirpath;
> + int dirfd;
> + int res;
> + char *status;
> + Error *local_err = NULL;
> +
> + dirpath = g_strdup_printf("/sys/devices/system/memory/memory%" PRId64 "/",
> + mem_blk->phys_index);
> + dirfd = open(dirpath, O_RDONLY | O_DIRECTORY);
> + if (dirfd == -1) {
> + error_setg_errno(errp, errno, "open(\"%s\")", dirpath);
> + g_free(dirpath);
> + return;
> + }
> + g_free(dirpath);
> +
> + status = g_malloc0(10);
> + ga_read_sysfs_file(dirfd, "state", status, 10, &local_err);
> + if (local_err) {
> + /* treat with sysfs file that not exist in old kernel */
> + if (errno == ENOENT) {
> + error_free(local_err);
> + if (sys2memblk) {
> + mem_blk->online = true;
> + mem_blk->can_offline = false;
> + } else if (!mem_blk->online) {
> + error_setg(errp, "memory block #%" PRId64 " can't be "
> + "offlined", mem_blk->phys_index);
> + }
> + } else {
> + error_propagate(errp, local_err);
> + }
> + return;
Need to free 'status' here, and close 'dirfd'. perhaps just a goto
to the end of the function since you already have common cleanup there.
And, if you use 'local_err' in place of 'err' for error_set, you can
maybe move all your error_propagate calls there as well.
> + }
> +
> + if (sys2memblk) {
> + char removable = '0';
> +
> + mem_blk->online = (strncmp(status, "online", 6) == 0);
> +
> + ga_read_sysfs_file(dirfd, "removable", &removable, 1, &local_err);
> + if (local_err) {
> + /* if no 'removable' file, it does't support offline mem blk */
> + if (errno == ENOENT) {
> + error_free(local_err);
> + mem_blk->can_offline = false;
> + } else {
> + error_propagate(errp, local_err);
> + }
> + } else {
> + mem_blk->can_offline = (removable != '0');
> + }
> + } else {
> + if (mem_blk->online != (strncmp(status, "online", 6) == 0)) {
> + char *new_state = mem_blk->online ? g_strdup("online") :
> + g_strdup("offline");
> +
> + ga_write_sysfs_file(dirfd, "state", new_state, strlen(new_state),
> + errp);
> + g_free(new_state);
> + } /* otherwise pretend successful re-(on|off)-lining */
> + }
> +
> + g_free(status);
> + res = close(dirfd);
> + g_assert(res == 0);
> +}
> +
> #else /* defined(__linux__) */
>
> void qmp_guest_suspend_disk(Error **errp)
> --
> 1.7.12.4
next prev parent reply other threads:[~2014-12-21 20:58 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-06 6:59 [Qemu-devel] [PATCH RFC for-2.3 0/6] qga: add three logical memory hotplug related commands zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 1/6] qga: introduce three guest memory block commands with stubs zhanghailiang
2014-12-21 20:10 ` Michael Roth
2014-12-22 10:02 ` zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 2/6] qga: introduce three help functions for memory block functions zhanghailiang
2014-12-21 20:58 ` Michael Roth [this message]
2014-12-22 10:12 ` zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 3/6] qga: implement qmp_guest_get_memory_blocks() for Linux with sysfs zhanghailiang
2014-12-21 21:17 ` Michael Roth
2014-12-22 10:13 ` zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 4/6] qga: implement qmp_guest_set_memory_blocks() " zhanghailiang
2014-12-21 21:23 ` Michael Roth
2014-12-22 10:20 ` zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 5/6] qga: implement qmp_guest_get_memory_block_size() " zhanghailiang
2014-12-21 21:41 ` Michael Roth
2014-12-22 10:21 ` zhanghailiang
2014-12-06 6:59 ` [Qemu-devel] [PATCH RFC for-2.3 6/6] qga: add memory block command that unsupported to blacklist zhanghailiang
2014-12-21 21:45 ` Michael Roth
2014-12-11 10:16 ` [Qemu-devel] [PATCH RFC for-2.3 0/6] qga: add three logical memory hotplug related commands zhanghailiang
2014-12-17 9:22 ` zhanghailiang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141221205816.15420.70063@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=zhang.zhanghailiang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.