Trace event monitor_protocol_event_queue argument @rate is the rate
event's limit.  It's 1000000000 for BLOCK_IO_ERROR with
BLOCK_ERROR_ACTION_STOP, but the actual rate limit is 0,
i.e. unlimited.  Fix that.

Fixes: 544ddbb6373d (block: Never drop BLOCK_IO_ERROR with action=stop for rate 
limiting)
Signed-off-by: Markus Armbruster <[email protected]>
---
 monitor/monitor.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/monitor/monitor.c b/monitor/monitor.c
index 00b93ed612..8277f41a9d 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -330,12 +330,11 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, 
QDict *qdict)
 {
     MonitorQAPIEventConf *evconf;
     MonitorQAPIEventState *evstate;
-    bool throttled;
+    int64_t rate_limit;
 
     assert(event < QAPI_EVENT__MAX);
     evconf = &monitor_qapi_event_conf[event];
-    trace_monitor_protocol_event_queue(event, qdict, evconf->rate);
-    throttled = evconf->rate;
+    rate_limit = evconf->rate;
 
     /*
      * Rate limit BLOCK_IO_ERROR only for action != "stop".
@@ -350,13 +349,15 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, 
QDict *qdict)
         QDict *data = qobject_to(QDict, qdict_get(qdict, "data"));
         const char *action = qdict_get_str(data, "action");
         if (!strcmp(action, "stop")) {
-            throttled = false;
+            rate_limit = 0;
         }
     }
 
+    trace_monitor_protocol_event_queue(event, qdict, rate_limit);
+
     QEMU_LOCK_GUARD(&monitor_lock);
 
-    if (!throttled) {
+    if (!rate_limit) {
         /* Unthrottled event */
         monitor_qapi_event_emit(event, qdict);
     } else {
@@ -368,7 +369,7 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict 
*qdict)
 
         if (evstate) {
             /*
-             * Timer is pending for (at least) evconf->rate ns after
+             * Timer is pending for (at least) @rate_limit ns after
              * last send.  Store event for sending when timer fires,
              * replacing a prior stored event if any.
              */
@@ -376,9 +377,9 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict 
*qdict)
             evstate->qdict = qobject_ref(qdict);
         } else {
             /*
-             * Last send was (at least) evconf->rate ns ago.
+             * Last send was (at least) @rate_limit ns ago.
              * Send immediately, and arm the timer to call
-             * monitor_qapi_event_handler() in evconf->rate ns.  Any
+             * monitor_qapi_event_handler() in @rate_limit ns.  Any
              * events arriving before then will be delayed until then.
              */
             int64_t now = qemu_clock_get_ns(monitor_get_event_clock());
@@ -393,7 +394,7 @@ monitor_qapi_event_queue_no_reenter(QAPIEvent event, QDict 
*qdict)
                                           monitor_qapi_event_handler,
                                           evstate);
             g_hash_table_add(monitor_qapi_event_state, evstate);
-            timer_mod_ns(evstate->timer, now + evconf->rate);
+            timer_mod_ns(evstate->timer, now + rate_limit);
         }
     }
 }
-- 
2.53.0


Reply via email to