From: zhanghailiang <zhang.zhanghailiang@huawei.com>
To: Michael Roth <mdroth@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: hangaohuai@huawei.com, 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: Mon, 22 Dec 2014 18:12:04 +0800 [thread overview]
Message-ID: <5497EE74.6020108@huawei.com> (raw)
In-Reply-To: <20141221205816.15420.70063@loki>
On 2014/12/22 4:58, Michael Roth wrote:
> 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.
>
OK, will squash patch into patch 3.
>>
>> +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.
>
Yes, you are right. I noted that, in most cases, we ignore the return value of close() in qemu codes,
so i will choose to ignore here too, is it OK?
>> +}
>> +
>> +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.
>
Good catch, will fix it in next version, thanks.
>> + }
>> +
>> + 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-22 10:12 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
2014-12-22 10:12 ` zhanghailiang [this message]
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=5497EE74.6020108@huawei.com \
--to=zhang.zhanghailiang@huawei.com \
--cc=hangaohuai@huawei.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).