From: Konstantin Kostiuk <kkostiuk@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Thomas Huth" <thuth@redhat.com>,
"Michael Roth" <michael.roth@amd.com>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: Re: [PATCH v2 06/22] qga: move linux memory block command impls to commands-linux.c
Date: Fri, 12 Jul 2024 11:34:13 +0300 [thread overview]
Message-ID: <CAPMcbCoD1-TiB-3chq7ZqPFcTeKe33U_TyGK-_5Hgm4Vb=Ws7w@mail.gmail.com> (raw)
In-Reply-To: <20240613154406.1365469-1-berrange@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 22043 bytes --]
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com>
On Thu, Jun 13, 2024 at 6:44 PM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> The qmp_guest_{set,get}_{memory_blocks,block_info} command impls in
> commands-posix.c are surrounded by '#ifdef __linux__' so should
> instead live in commands-linux.c
>
> This also removes a "#ifdef CONFIG_LINUX" that was nested inside
> a "#ifdef __linux__".
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> qga/commands-linux.c | 308 ++++++++++++++++++++++++++++++++++++++++++
> qga/commands-posix.c | 311 +------------------------------------------
> 2 files changed, 309 insertions(+), 310 deletions(-)
>
> diff --git a/qga/commands-linux.c b/qga/commands-linux.c
> index c0e8bd4062..73b13fbaf6 100644
> --- a/qga/commands-linux.c
> +++ b/qga/commands-linux.c
> @@ -1595,6 +1595,314 @@ int64_t
> qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
> return processed;
> }
>
> +
> +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);
> + }
> + close(fd);
> +}
> +
> +static void ga_write_sysfs_file(int dirfd, const char *pathname,
> + const char *buf, int size, Error **errp)
> +{
> + int fd;
> +
> + 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);
> + }
> +
> + close(fd);
> +}
> +
> +/* 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,
> + GuestMemoryBlockResponse *result,
> + Error **errp)
> +{
> + char *dirpath;
> + int dirfd;
> + char *status;
> + Error *local_err = NULL;
> +
> + if (!sys2memblk) {
> + DIR *dp;
> +
> + if (!result) {
> + error_setg(errp, "Internal error, 'result' should not be
> NULL");
> + return;
> + }
> + errno = 0;
> + dp = opendir("/sys/devices/system/memory/");
> + /* if there is no 'memory' directory in sysfs,
> + * we think this VM does not support online/offline memory block,
> + * any other solution?
> + */
> + if (!dp) {
> + if (errno == ENOENT) {
> + result->response =
> +
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_NOT_SUPPORTED;
> + }
> + goto out1;
> + }
> + closedir(dp);
> + }
> +
> + dirpath = g_strdup_printf("/sys/devices/system/memory/memory%" PRId64
> "/",
> + mem_blk->phys_index);
> + dirfd = open(dirpath, O_RDONLY | O_DIRECTORY);
> + if (dirfd == -1) {
> + if (sys2memblk) {
> + error_setg_errno(errp, errno, "open(\"%s\")", dirpath);
> + } else {
> + if (errno == ENOENT) {
> + result->response =
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_NOT_FOUND;
> + } else {
> + result->response =
> + GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> + }
> + }
> + g_free(dirpath);
> + goto out1;
> + }
> + 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) {
> + result->response =
> +
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_NOT_SUPPORTED;
> + }
> + } else {
> + if (sys2memblk) {
> + error_propagate(errp, local_err);
> + } else {
> + error_free(local_err);
> + result->response =
> + GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> + }
> + }
> + goto out2;
> + }
> +
> + 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 doesn'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)) {
> + const char *new_state = mem_blk->online ? "online" :
> "offline";
> +
> + ga_write_sysfs_file(dirfd, "state", new_state,
> strlen(new_state),
> + &local_err);
> + if (local_err) {
> + error_free(local_err);
> + result->response =
> + GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> + goto out2;
> + }
> +
> + result->response = GUEST_MEMORY_BLOCK_RESPONSE_TYPE_SUCCESS;
> + result->has_error_code = false;
> + } /* otherwise pretend successful re-(on|off)-lining */
> + }
> + g_free(status);
> + close(dirfd);
> + return;
> +
> +out2:
> + g_free(status);
> + close(dirfd);
> +out1:
> + if (!sys2memblk) {
> + result->has_error_code = true;
> + result->error_code = errno;
> + }
> +}
> +
> +GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
> +{
> + GuestMemoryBlockList *head, **tail;
> + Error *local_err = NULL;
> + struct dirent *de;
> + DIR *dp;
> +
> + head = NULL;
> + tail = &head;
> +
> + dp = opendir("/sys/devices/system/memory/");
> + if (!dp) {
> + /* it's ok if this happens to be a system that doesn't expose
> + * memory blocks via sysfs, but otherwise we should report
> + * an error
> + */
> + if (errno != ENOENT) {
> + error_setg_errno(errp, errno, "Can't open directory"
> + "\"/sys/devices/system/memory/\"");
> + }
> + return NULL;
> + }
> +
> + /* Note: the phys_index of memory block may be discontinuous,
> + * this is because a memblk is the unit of the Sparse Memory design,
> which
> + * allows discontinuous memory ranges (ex. NUMA), so here we should
> + * traverse the memory block directory.
> + */
> + while ((de = readdir(dp)) != NULL) {
> + GuestMemoryBlock *mem_blk;
> +
> + if ((strncmp(de->d_name, "memory", 6) != 0) ||
> + !(de->d_type & DT_DIR)) {
> + continue;
> + }
> +
> + mem_blk = g_malloc0(sizeof *mem_blk);
> + /* The d_name is "memoryXXX", phys_index is block id, same as
> XXX */
> + mem_blk->phys_index = strtoul(&de->d_name[6], NULL, 10);
> + mem_blk->has_can_offline = true; /* lolspeak ftw */
> + transfer_memory_block(mem_blk, true, NULL, &local_err);
> + if (local_err) {
> + break;
> + }
> +
> + QAPI_LIST_APPEND(tail, mem_blk);
> + }
> +
> + closedir(dp);
> + if (local_err == NULL) {
> + /* there's no guest with zero memory blocks */
> + if (head == NULL) {
> + error_setg(errp, "guest reported zero memory blocks!");
> + }
> + return head;
> + }
> +
> + qapi_free_GuestMemoryBlockList(head);
> + error_propagate(errp, local_err);
> + return NULL;
> +}
> +
> +GuestMemoryBlockResponseList *
> +qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
> +{
> + GuestMemoryBlockResponseList *head, **tail;
> + Error *local_err = NULL;
> +
> + head = NULL;
> + tail = &head;
> +
> + while (mem_blks != NULL) {
> + GuestMemoryBlockResponse *result;
> + GuestMemoryBlock *current_mem_blk = mem_blks->value;
> +
> + result = g_malloc0(sizeof(*result));
> + result->phys_index = current_mem_blk->phys_index;
> + transfer_memory_block(current_mem_blk, false, result, &local_err);
> + if (local_err) { /* should never happen */
> + goto err;
> + }
> +
> + QAPI_LIST_APPEND(tail, result);
> + mem_blks = mem_blks->next;
> + }
> +
> + return head;
> +err:
> + qapi_free_GuestMemoryBlockResponseList(head);
> + error_propagate(errp, local_err);
> + return NULL;
> +}
> +
> +GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
> +{
> + Error *local_err = NULL;
> + char *dirpath;
> + int dirfd;
> + char *buf;
> + GuestMemoryBlockInfo *info;
> +
> + 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 NULL;
> + }
> + g_free(dirpath);
> +
> + buf = g_malloc0(20);
> + ga_read_sysfs_file(dirfd, "block_size_bytes", buf, 20, &local_err);
> + close(dirfd);
> + if (local_err) {
> + g_free(buf);
> + error_propagate(errp, local_err);
> + return NULL;
> + }
> +
> + info = g_new0(GuestMemoryBlockInfo, 1);
> + info->size = strtol(buf, NULL, 16); /* the unit is bytes */
> +
> + g_free(buf);
> +
> + return info;
> +}
> +
> #define MAX_NAME_LEN 128
> static GuestDiskStatsInfoList *guest_get_diskstats(Error **errp)
> {
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 5da60e65ab..2a3bef7445 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -887,316 +887,7 @@ void qmp_guest_set_user_password(const char
> *username,
> }
> #endif /* __linux__ || __FreeBSD__ */
>
> -#ifdef __linux__
> -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);
> - }
> - close(fd);
> -}
> -
> -static void ga_write_sysfs_file(int dirfd, const char *pathname,
> - const char *buf, int size, Error **errp)
> -{
> - int fd;
> -
> - 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);
> - }
> -
> - close(fd);
> -}
> -
> -/* 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,
> - GuestMemoryBlockResponse *result,
> - Error **errp)
> -{
> - char *dirpath;
> - int dirfd;
> - char *status;
> - Error *local_err = NULL;
> -
> - if (!sys2memblk) {
> - DIR *dp;
> -
> - if (!result) {
> - error_setg(errp, "Internal error, 'result' should not be
> NULL");
> - return;
> - }
> - errno = 0;
> - dp = opendir("/sys/devices/system/memory/");
> - /* if there is no 'memory' directory in sysfs,
> - * we think this VM does not support online/offline memory block,
> - * any other solution?
> - */
> - if (!dp) {
> - if (errno == ENOENT) {
> - result->response =
> -
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_NOT_SUPPORTED;
> - }
> - goto out1;
> - }
> - closedir(dp);
> - }
> -
> - dirpath = g_strdup_printf("/sys/devices/system/memory/memory%" PRId64
> "/",
> - mem_blk->phys_index);
> - dirfd = open(dirpath, O_RDONLY | O_DIRECTORY);
> - if (dirfd == -1) {
> - if (sys2memblk) {
> - error_setg_errno(errp, errno, "open(\"%s\")", dirpath);
> - } else {
> - if (errno == ENOENT) {
> - result->response =
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_NOT_FOUND;
> - } else {
> - result->response =
> - GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> - }
> - }
> - g_free(dirpath);
> - goto out1;
> - }
> - 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) {
> - result->response =
> -
> GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_NOT_SUPPORTED;
> - }
> - } else {
> - if (sys2memblk) {
> - error_propagate(errp, local_err);
> - } else {
> - error_free(local_err);
> - result->response =
> - GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> - }
> - }
> - goto out2;
> - }
> -
> - 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 doesn'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)) {
> - const char *new_state = mem_blk->online ? "online" :
> "offline";
> -
> - ga_write_sysfs_file(dirfd, "state", new_state,
> strlen(new_state),
> - &local_err);
> - if (local_err) {
> - error_free(local_err);
> - result->response =
> - GUEST_MEMORY_BLOCK_RESPONSE_TYPE_OPERATION_FAILED;
> - goto out2;
> - }
> -
> - result->response = GUEST_MEMORY_BLOCK_RESPONSE_TYPE_SUCCESS;
> - result->has_error_code = false;
> - } /* otherwise pretend successful re-(on|off)-lining */
> - }
> - g_free(status);
> - close(dirfd);
> - return;
> -
> -out2:
> - g_free(status);
> - close(dirfd);
> -out1:
> - if (!sys2memblk) {
> - result->has_error_code = true;
> - result->error_code = errno;
> - }
> -}
> -
> -GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
> -{
> - GuestMemoryBlockList *head, **tail;
> - Error *local_err = NULL;
> - struct dirent *de;
> - DIR *dp;
> -
> - head = NULL;
> - tail = &head;
> -
> - dp = opendir("/sys/devices/system/memory/");
> - if (!dp) {
> - /* it's ok if this happens to be a system that doesn't expose
> - * memory blocks via sysfs, but otherwise we should report
> - * an error
> - */
> - if (errno != ENOENT) {
> - error_setg_errno(errp, errno, "Can't open directory"
> - "\"/sys/devices/system/memory/\"");
> - }
> - return NULL;
> - }
> -
> - /* Note: the phys_index of memory block may be discontinuous,
> - * this is because a memblk is the unit of the Sparse Memory design,
> which
> - * allows discontinuous memory ranges (ex. NUMA), so here we should
> - * traverse the memory block directory.
> - */
> - while ((de = readdir(dp)) != NULL) {
> - GuestMemoryBlock *mem_blk;
> -
> - if ((strncmp(de->d_name, "memory", 6) != 0) ||
> - !(de->d_type & DT_DIR)) {
> - continue;
> - }
> -
> - mem_blk = g_malloc0(sizeof *mem_blk);
> - /* The d_name is "memoryXXX", phys_index is block id, same as
> XXX */
> - mem_blk->phys_index = strtoul(&de->d_name[6], NULL, 10);
> - mem_blk->has_can_offline = true; /* lolspeak ftw */
> - transfer_memory_block(mem_blk, true, NULL, &local_err);
> - if (local_err) {
> - break;
> - }
> -
> - QAPI_LIST_APPEND(tail, mem_blk);
> - }
> -
> - closedir(dp);
> - if (local_err == NULL) {
> - /* there's no guest with zero memory blocks */
> - if (head == NULL) {
> - error_setg(errp, "guest reported zero memory blocks!");
> - }
> - return head;
> - }
> -
> - qapi_free_GuestMemoryBlockList(head);
> - error_propagate(errp, local_err);
> - return NULL;
> -}
> -
> -GuestMemoryBlockResponseList *
> -qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
> -{
> - GuestMemoryBlockResponseList *head, **tail;
> - Error *local_err = NULL;
> -
> - head = NULL;
> - tail = &head;
> -
> - while (mem_blks != NULL) {
> - GuestMemoryBlockResponse *result;
> - GuestMemoryBlock *current_mem_blk = mem_blks->value;
> -
> - result = g_malloc0(sizeof(*result));
> - result->phys_index = current_mem_blk->phys_index;
> - transfer_memory_block(current_mem_blk, false, result, &local_err);
> - if (local_err) { /* should never happen */
> - goto err;
> - }
> -
> - QAPI_LIST_APPEND(tail, result);
> - mem_blks = mem_blks->next;
> - }
> -
> - return head;
> -err:
> - qapi_free_GuestMemoryBlockResponseList(head);
> - error_propagate(errp, local_err);
> - return NULL;
> -}
> -
> -GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
> -{
> - Error *local_err = NULL;
> - char *dirpath;
> - int dirfd;
> - char *buf;
> - GuestMemoryBlockInfo *info;
> -
> - 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 NULL;
> - }
> - g_free(dirpath);
> -
> - buf = g_malloc0(20);
> - ga_read_sysfs_file(dirfd, "block_size_bytes", buf, 20, &local_err);
> - close(dirfd);
> - if (local_err) {
> - g_free(buf);
> - error_propagate(errp, local_err);
> - return NULL;
> - }
> -
> - info = g_new0(GuestMemoryBlockInfo, 1);
> - info->size = strtol(buf, NULL, 16); /* the unit is bytes */
> -
> - g_free(buf);
> -
> - return info;
> -}
> -
> -
> -#else /* defined(__linux__) */
> +#ifndef __linux__
>
> void qmp_guest_suspend_disk(Error **errp)
> {
> --
> 2.45.1
>
>
[-- Attachment #2: Type: text/html, Size: 26834 bytes --]
next prev parent reply other threads:[~2024-07-12 8:34 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-13 15:01 [PATCH v2 00/22] qga: clean up command source locations and conditionals Daniel P. Berrangé
2024-06-13 15:01 ` [PATCH v2 01/22] qga: drop blocking of guest-get-memory-block-size command Daniel P. Berrangé
2024-07-12 9:33 ` Konstantin Kostiuk
2024-06-13 15:01 ` [PATCH v2 02/22] qga: move linux vcpu command impls to commands-linux.c Daniel P. Berrangé
2024-07-03 8:45 ` Philippe Mathieu-Daudé
2024-07-12 8:30 ` Konstantin Kostiuk
2024-06-13 15:01 ` [PATCH v2 03/22] qga: move linux suspend " Daniel P. Berrangé
2024-07-03 8:45 ` Philippe Mathieu-Daudé
2024-07-12 8:29 ` Konstantin Kostiuk
2024-06-13 15:01 ` [PATCH v2 04/22] qga: move linux fs/disk " Daniel P. Berrangé
2024-07-03 8:46 ` Philippe Mathieu-Daudé
2024-07-12 8:29 ` Konstantin Kostiuk
2024-06-13 15:01 ` [PATCH v2 05/22] qga: move linux disk/cpu stats " Daniel P. Berrangé
2024-07-03 8:25 ` Philippe Mathieu-Daudé
2024-07-12 8:33 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 06/22] qga: move linux memory block " Daniel P. Berrangé
2024-06-13 15:43 ` [PATCH v2 07/22] qga: move CONFIG_FSFREEZE/TRIM to be meson defined options Daniel P. Berrangé
2024-06-13 15:43 ` [PATCH v2 08/22] qga: conditionalize schema for commands unsupported on Windows Daniel P. Berrangé
2024-07-03 8:30 ` Philippe Mathieu-Daudé
2024-07-12 8:34 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 09/22] qga: conditionalize schema for commands unsupported on non-Linux POSIX Daniel P. Berrangé
2024-07-03 8:31 ` Philippe Mathieu-Daudé
2024-07-12 8:35 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 10/22] qga: conditionalize schema for commands requiring getifaddrs Daniel P. Berrangé
2024-07-03 8:32 ` Philippe Mathieu-Daudé
2024-07-12 8:35 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 11/22] qga: conditionalize schema for commands requiring linux/win32 Daniel P. Berrangé
2024-06-13 15:43 ` [PATCH v2 12/22] qga: conditionalize schema for commands only supported on Windows Daniel P. Berrangé
2024-07-03 8:35 ` Philippe Mathieu-Daudé
2024-07-12 8:37 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 13/22] qga: conditionalize schema for commands requiring fsfreeze Daniel P. Berrangé
2024-07-03 8:37 ` Philippe Mathieu-Daudé
2024-07-12 8:37 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 14/22] qga: conditionalize schema for commands requiring fstrim Daniel P. Berrangé
2024-07-03 8:36 ` Philippe Mathieu-Daudé
2024-07-12 8:38 ` Konstantin Kostiuk
2024-06-13 15:43 ` [PATCH v2 15/22] qga: conditionalize schema for commands requiring libudev Daniel P. Berrangé
2024-07-03 8:37 ` Philippe Mathieu-Daudé
2024-07-12 8:40 ` Konstantin Kostiuk
2024-06-13 15:44 ` [PATCH v2 16/22] qga: conditionalize schema for commands requiring utmpx Daniel P. Berrangé
2024-07-03 8:38 ` Philippe Mathieu-Daudé
2024-07-12 8:43 ` Konstantin Kostiuk
2024-06-13 15:44 ` [PATCH v2 17/22] qga: conditionalize schema for commands not supported on other UNIX Daniel P. Berrangé
2024-07-03 8:39 ` Philippe Mathieu-Daudé
2024-07-12 8:43 ` Konstantin Kostiuk
2024-06-13 15:44 ` [PATCH v2 18/22] qga: don't disable fsfreeze commands if vss_init fails Daniel P. Berrangé
2024-07-03 10:21 ` Manos Pitsidianakis
2024-07-12 12:45 ` Daniel P. Berrangé
2024-06-13 15:44 ` [PATCH v2 19/22] qga: move declare of QGAConfig struct to top of file Daniel P. Berrangé
2024-07-03 8:40 ` Philippe Mathieu-Daudé
2024-07-12 8:44 ` Konstantin Kostiuk
2024-06-13 15:44 ` [PATCH v2 20/22] qga: remove pointless 'blockrpcs_key' variable Daniel P. Berrangé
2024-07-03 8:41 ` Philippe Mathieu-Daudé
2024-07-12 8:46 ` Konstantin Kostiuk
2024-06-13 15:44 ` [PATCH v2 21/22] qga: allow configuration file path via the cli Daniel P. Berrangé
2024-07-03 8:44 ` Philippe Mathieu-Daudé
2024-07-12 9:05 ` Konstantin Kostiuk
2024-07-12 9:18 ` Daniel P. Berrangé
2024-06-13 15:44 ` [PATCH v2 22/22] qga: centralize logic for disabling/enabling commands Daniel P. Berrangé
2024-07-03 10:01 ` Manos Pitsidianakis
2024-07-03 12:09 ` Philippe Mathieu-Daudé
2024-07-12 13:01 ` Daniel P. Berrangé
2024-07-03 8:26 ` [PATCH v2 06/22] qga: move linux memory block command impls to commands-linux.c Philippe Mathieu-Daudé
2024-07-12 8:34 ` Konstantin Kostiuk [this message]
2024-06-14 8:34 ` [PATCH v2 00/22] qga: clean up command source locations and conditionals Marc-André Lureau
2024-06-14 9:19 ` Daniel P. Berrangé
2024-07-02 18:00 ` Daniel P. Berrangé
2024-07-03 6:15 ` Marc-André Lureau
2024-07-03 8:06 ` Daniel P. Berrangé
2024-07-03 8:17 ` Marc-André Lureau
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='CAPMcbCoD1-TiB-3chq7ZqPFcTeKe33U_TyGK-_5Hgm4Vb=Ws7w@mail.gmail.com' \
--to=kkostiuk@redhat.com \
--cc=berrange@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=michael.roth@amd.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.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 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).