From patchwork Thu May 1 04:26:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wenchao Xia X-Patchwork-Id: 344402 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 9C5E5140115 for ; Thu, 1 May 2014 14:30:07 +1000 (EST) Received: from localhost ([::1]:60311 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WfidJ-0004BY-Gm for incoming@patchwork.ozlabs.org; Thu, 01 May 2014 00:30:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49237) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wfib6-00005M-RW for qemu-devel@nongnu.org; Thu, 01 May 2014 00:27:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wfiax-0002GA-Ih for qemu-devel@nongnu.org; Thu, 01 May 2014 00:27:48 -0400 Received: from mail-ig0-x22d.google.com ([2607:f8b0:4001:c05::22d]:50845) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wfiax-0002G6-CW for qemu-devel@nongnu.org; Thu, 01 May 2014 00:27:39 -0400 Received: by mail-ig0-f173.google.com with SMTP id hn18so89097igb.6 for ; Wed, 30 Apr 2014 21:27:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5Lwm0Em2uyrg0Jj7W8bednjcteccbOddUaamFPc/LBU=; b=JnQygA2aRiqY+bL3G8HDMj69TmTzt4NqZAPCHPhIoviB+IMdcJyBBIAg5BfuwHyB2k pw9w2x7xLBGVbiC6edqybqM4MGazeweac5PtoVqLeNqPhKzm9nw0mxOURB2yzc1xSjWf 2tHuJTXJw0AuOBAV2UejhlzJ9eGwDTrCgD9kt9V8vd3+LuS5/Wa4PTC8f5V5cTKJeSqy 76QVpU9cNb3Fdv0C5uHkAQOsPDI4Firm0mEOq1y9BbloIyl587nrUVp+F26N957i/6LT zzvl2cselRYz6o9M5QJ96bBlGjtQtCiWJZd6QdGkWgxfo3k6EpamBEfqH5JGua7rrxmj HBBw== X-Received: by 10.42.50.3 with SMTP id y3mr7968145icf.12.1398918458898; Wed, 30 Apr 2014 21:27:38 -0700 (PDT) Received: from localhost.localdomain.localdomain ([118.250.93.201]) by mx.google.com with ESMTPSA id ii7sm4626797igb.17.2014.04.30.21.27.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Apr 2014 21:27:38 -0700 (PDT) From: Wenchao Xia To: qemu-devel@nongnu.org Date: Wed, 30 Apr 2014 21:26:40 -0700 Message-Id: <1398918422-3019-7-git-send-email-wenchaoqemu@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1398918422-3019-1-git-send-email-wenchaoqemu@gmail.com> References: <1398918422-3019-1-git-send-email-wenchaoqemu@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c05::22d Cc: mdroth@linux.vnet.ibm.com, armbru@redhat.com, Wenchao Xia , lcapitulino@redhat.com Subject: [Qemu-devel] [PATCH V5 06/28] monitor: change event functions as an implemention of new emit method X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Now monitor has been hooked on the new event mechanism, so the patches later can convert event callers one by one. qmp_query_events() is also switched to use new generated event defines. Note that old function monitor_protocol_event() is kept for existing caller to avoid code break, but rate limiting is bypassed to avoid too many duplicated code. After convertion, the function would be removed. Signed-off-by: Wenchao Xia --- monitor.c | 47 ++++++++++++++++++++++++++--------------------- 1 files changed, 26 insertions(+), 21 deletions(-) diff --git a/monitor.c b/monitor.c index 1266ba0..6482ebe 100644 --- a/monitor.c +++ b/monitor.c @@ -69,6 +69,8 @@ #include "qmp-commands.h" #include "hmp.h" #include "qemu/thread.h" +#include "qapi/qmp-event.h" +#include "qapi-event.h" /* for pic/irq_info */ #if defined(TARGET_SPARC) @@ -178,7 +180,7 @@ typedef struct MonitorControl { * instance. */ typedef struct MonitorEventState { - MonitorEvent event; /* Event being tracked */ + QAPIEvent event; /* Event being tracked */ int64_t rate; /* Period over which to throttle. 0 to disable */ int64_t last; /* Time at which event was last emitted */ QEMUTimer *timer; /* Timer for handling delayed events */ @@ -454,6 +456,7 @@ static void timestamp_put(QDict *qdict) } +/* Following is kept only for monitor_protocol_event() */ static const char *monitor_event_names[] = { [QEVENT_SHUTDOWN] = "SHUTDOWN", [QEVENT_RESET] = "RESET", @@ -488,13 +491,13 @@ static const char *monitor_event_names[] = { }; QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX) -MonitorEventState monitor_event_state[QEVENT_MAX]; +MonitorEventState monitor_event_state[QAPI_EVENT_MAX]; /* * Emits the event to every monitor instance */ static void -monitor_protocol_event_emit(MonitorEvent event, +monitor_protocol_event_emit(QAPIEvent event, QObject *data) { Monitor *mon; @@ -513,12 +516,12 @@ monitor_protocol_event_emit(MonitorEvent event, * applying any rate limiting if required. */ static void -monitor_protocol_event_queue(MonitorEvent event, - QObject *data) +monitor_protocol_event_queue(int event_kind, QDict *data, Error **errp) { MonitorEventState *evstate; + QAPIEvent event = (QAPIEvent)event_kind; int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); - assert(event < QEVENT_MAX); + assert(event < QAPI_EVENT_MAX); evstate = &(monitor_event_state[event]); trace_monitor_protocol_event_queue(event, @@ -529,7 +532,7 @@ monitor_protocol_event_queue(MonitorEvent event, /* Rate limit of 0 indicates no throttling */ if (!evstate->rate) { - monitor_protocol_event_emit(event, data); + monitor_protocol_event_emit(event, QOBJECT(data)); evstate->last = now; } else { int64_t delta = now - evstate->last; @@ -545,10 +548,10 @@ monitor_protocol_event_queue(MonitorEvent event, int64_t then = evstate->last + evstate->rate; timer_mod_ns(evstate->timer, then); } - evstate->data = data; + evstate->data = QOBJECT(data); qobject_incref(evstate->data); } else { - monitor_protocol_event_emit(event, data); + monitor_protocol_event_emit(event, QOBJECT(data)); evstate->last = now; } } @@ -587,11 +590,11 @@ static void monitor_protocol_event_handler(void *opaque) * milliseconds */ static void -monitor_protocol_event_throttle(MonitorEvent event, +monitor_protocol_event_throttle(QAPIEvent event, int64_t rate) { MonitorEventState *evstate; - assert(event < QEVENT_MAX); + assert(event < QAPI_EVENT_MAX); evstate = &(monitor_event_state[event]); @@ -606,18 +609,19 @@ monitor_protocol_event_throttle(MonitorEvent event, evstate->data = NULL; } - /* Global, one-time initializer to configure the rate limiting * and initialize state */ static void monitor_protocol_event_init(void) { /* Limit RTC & BALLOON events to 1 per second */ - monitor_protocol_event_throttle(QEVENT_RTC_CHANGE, 1000); - monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000); - monitor_protocol_event_throttle(QEVENT_WATCHDOG, 1000); + monitor_protocol_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000); + monitor_protocol_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000); + monitor_protocol_event_throttle(QAPI_EVENT_WATCHDOG, 1000); /* limit the rate of quorum events to avoid hammering the management */ - monitor_protocol_event_throttle(QEVENT_QUORUM_REPORT_BAD, 1000); - monitor_protocol_event_throttle(QEVENT_QUORUM_FAILURE, 1000); + monitor_protocol_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000); + monitor_protocol_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000); + + qmp_event_set_func_emit(monitor_protocol_event_queue); } /** @@ -644,7 +648,8 @@ void monitor_protocol_event(MonitorEvent event, QObject *data) } trace_monitor_protocol_event(event, event_name, qmp); - monitor_protocol_event_queue(event, QOBJECT(qmp)); + /* Bypass rate limiting for now */ + monitor_protocol_event_emit(event, QOBJECT(qmp)); QDECREF(qmp); } @@ -1042,10 +1047,10 @@ CommandInfoList *qmp_query_commands(Error **errp) EventInfoList *qmp_query_events(Error **errp) { EventInfoList *info, *ev_list = NULL; - MonitorEvent e; + QAPIEvent e; - for (e = 0 ; e < QEVENT_MAX ; e++) { - const char *event_name = monitor_event_names[e]; + for (e = 0 ; e < QAPI_EVENT_MAX ; e++) { + const char *event_name = QAPIEvent_lookup[e]; assert(event_name != NULL); info = g_malloc0(sizeof(*info)); info->value = g_malloc0(sizeof(*info->value));