Commit 513e6bde authored by Anthony Liguori's avatar Anthony Liguori
Browse files

Merge remote-tracking branch 'qmp/queue/qmp' into staging

* qmp/queue/qmp:
  qapi: Convert getfd and closefd
  qapi: input_type_enum(): fix error message
  qmp: dump-guest-memory: improve schema doc
parents 052bb77a 208c9d1b
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -1236,8 +1236,7 @@ ETEXI
        .args_type  = "fdname:s",
        .params     = "getfd name",
        .help       = "receive a file descriptor via SCM rights and assign it a name",
        .user_print = monitor_user_noop,
        .mhandler.cmd_new = do_getfd,
        .mhandler.cmd = hmp_getfd,
    },

STEXI
@@ -1253,8 +1252,7 @@ ETEXI
        .args_type  = "fdname:s",
        .params     = "closefd name",
        .help       = "close a file descriptor previously passed via SCM rights",
        .user_print = monitor_user_noop,
        .mhandler.cmd_new = do_closefd,
        .mhandler.cmd = hmp_closefd,
    },

STEXI
+18 −0
Original line number Diff line number Diff line
@@ -1002,3 +1002,21 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
    qmp_netdev_del(id, &err);
    hmp_handle_error(mon, &err);
}

void hmp_getfd(Monitor *mon, const QDict *qdict)
{
    const char *fdname = qdict_get_str(qdict, "fdname");
    Error *errp = NULL;

    qmp_getfd(fdname, &errp);
    hmp_handle_error(mon, &errp);
}

void hmp_closefd(Monitor *mon, const QDict *qdict)
{
    const char *fdname = qdict_get_str(qdict, "fdname");
    Error *errp = NULL;

    qmp_closefd(fdname, &errp);
    hmp_handle_error(mon, &errp);
}
+2 −0
Original line number Diff line number Diff line
@@ -64,5 +64,7 @@ void hmp_device_del(Monitor *mon, const QDict *qdict);
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
void hmp_netdev_add(Monitor *mon, const QDict *qdict);
void hmp_netdev_del(Monitor *mon, const QDict *qdict);
void hmp_getfd(Monitor *mon, const QDict *qdict);
void hmp_closefd(Monitor *mon, const QDict *qdict);

#endif
+14 −18
Original line number Diff line number Diff line
@@ -2307,48 +2307,45 @@ static void do_inject_mce(Monitor *mon, const QDict *qdict)
}
#endif

static int do_getfd(Monitor *mon, const QDict *qdict, QObject **ret_data)
void qmp_getfd(const char *fdname, Error **errp)
{
    const char *fdname = qdict_get_str(qdict, "fdname");
    mon_fd_t *monfd;
    int fd;

    fd = qemu_chr_fe_get_msgfd(mon->chr);
    fd = qemu_chr_fe_get_msgfd(cur_mon->chr);
    if (fd == -1) {
        qerror_report(QERR_FD_NOT_SUPPLIED);
        return -1;
        error_set(errp, QERR_FD_NOT_SUPPLIED);
        return;
    }

    if (qemu_isdigit(fdname[0])) {
        qerror_report(QERR_INVALID_PARAMETER_VALUE, "fdname",
        error_set(errp, QERR_INVALID_PARAMETER_VALUE, "fdname",
                  "a name not starting with a digit");
        return -1;
        return;
    }

    QLIST_FOREACH(monfd, &mon->fds, next) {
    QLIST_FOREACH(monfd, &cur_mon->fds, next) {
        if (strcmp(monfd->name, fdname) != 0) {
            continue;
        }

        close(monfd->fd);
        monfd->fd = fd;
        return 0;
        return;
    }

    monfd = g_malloc0(sizeof(mon_fd_t));
    monfd->name = g_strdup(fdname);
    monfd->fd = fd;

    QLIST_INSERT_HEAD(&mon->fds, monfd, next);
    return 0;
    QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
}

static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
void qmp_closefd(const char *fdname, Error **errp)
{
    const char *fdname = qdict_get_str(qdict, "fdname");
    mon_fd_t *monfd;

    QLIST_FOREACH(monfd, &mon->fds, next) {
    QLIST_FOREACH(monfd, &cur_mon->fds, next) {
        if (strcmp(monfd->name, fdname) != 0) {
            continue;
        }
@@ -2357,11 +2354,10 @@ static int do_closefd(Monitor *mon, const QDict *qdict, QObject **ret_data)
        close(monfd->fd);
        g_free(monfd->name);
        g_free(monfd);
        return 0;
        return;
    }

    qerror_report(QERR_FD_NOT_FOUND, fdname);
    return -1;
    error_set(errp, QERR_FD_NOT_FOUND, fdname);
}

static void do_loadvm(Monitor *mon, const QDict *qdict)
+52 −15
Original line number Diff line number Diff line
@@ -1789,27 +1789,29 @@
#
# Dump guest's memory to vmcore. It is a synchronous operation that can take
# very long depending on the amount of guest memory. This command is only
# supported only on i386 and x86_64
#
# @paging: if true, do paging to get guest's memory mapping. The @paging's
# default value of @paging is false, If you want to use gdb to process the
# core, please set @paging to true. The reason why the @paging's value is
# false:
#   1. guest machine in a catastrophic state can have corrupted memory,
#      which we cannot trust.
#   2. The guest machine can be in read-mode even if paging is enabled.
#      For example: the guest machine uses ACPI to sleep, and ACPI sleep
#      state goes in real-mode
# supported on i386 and x86_64.
#
# @paging: if true, do paging to get guest's memory mapping. This allows
# using gdb to process the core file. However, setting @paging to false
# may be desirable because of two reasons:
#
#   1. The guest may be in a catastrophic state or can have corrupted
#      memory, which cannot be trusted
#   2. The guest can be in real-mode even if paging is enabled. For example,
#      the guest uses ACPI to sleep, and ACPI sleep state goes in real-mode
#
# @protocol: the filename or file descriptor of the vmcore. The supported
# protocol can be file or fd:
# protocols are:
#
#   1. file: the protocol starts with "file:", and the following string is
#      the file's path.
#   2. fd: the protocol starts with "fd:", and the following string is the
#      fd's name.
#
# @begin: #optional if specified, the starting physical address.
#
# @length: #optional if specified, the memory size, in bytes. If you don't
# want to dump all guest's memory, please specify the start @begin and
# @length
# want to dump all guest's memory, please specify the start @begin and @length
#
# Returns: nothing on success
#          If @begin contains an invalid address, InvalidParameter
@@ -1868,3 +1870,38 @@
# Since: 0.14.0
##
{ 'command': 'netdev_del', 'data': {'id': 'str'} }

##
# @getfd:
#
# Receive a file descriptor via SCM rights and assign it a name
#
# @fdname: file descriptor name
#
# Returns: Nothing on success
#          If file descriptor was not received, FdNotSupplied
#          If @fdname is not valid, InvalidParameterType
#
# Since: 0.14.0
#
# Notes: If @fdname already exists, the file descriptor assigned to
#        it will be closed and replaced by the received file
#        descriptor.
#        The 'closefd' command can be used to explicitly close the
#        file descriptor when it is no longer needed.
##
{ 'command': 'getfd', 'data': {'fdname': 'str'} }

##
# @closefd:
#
# Close a file descriptor previously passed via SCM rights
#
# @fdname: file descriptor name
#
# Returns: Nothing on success
#          If @fdname is not found, FdNotFound
#
# Since: 0.14.0
##
{ 'command': 'closefd', 'data': {'fdname': 'str'} }
Loading