All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alon Levy <alevy@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC] hw/qxl: inject interrupts in any state
Date: Thu, 1 Nov 2012 07:48:00 -0400 (EDT)	[thread overview]
Message-ID: <1786113489.25327079.1351770480060.JavaMail.root@redhat.com> (raw)
In-Reply-To: <5092500D.6000907@redhat.com>

> Hi,
> 
> >     This prevents a known abort on set_client_capabilities, that
> >     should be
> >     fixed in upstream, but it should also be checked against in
> >     qxl. Checks
> >     every other location that qxl_send_events is eventually
> >     possibly called
> 
> Why check in all callers instead of qxl_send_events directly?

To point to the faulty function without resorting to the stack. But I guess we can always get that from systemtap if I add a trace event there.

commit 02250067a5c7537dd4a22015d9c3fdabeba6404d
Author: Alon Levy <alevy@redhat.com>
Date:   Tue Oct 30 18:00:33 2012 +0200

    hw/qxl: qxl_send_events: nop if stopped
    
    Added a trace point for easy logging.
    
    RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=870972
    
    Signed-off-by: Alon Levy <alevy@redhat.com>

diff --git a/hw/qxl.c b/hw/qxl.c
index 7b88a1e..e86e70c 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1739,7 +1739,11 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
     uint32_t le_events = cpu_to_le32(events);
 
     trace_qxl_send_events(d->id, events);
-    assert(qemu_spice_display_is_running(&d->ssd));
+    if (!qemu_spice_display_is_running(&d->ssd)) {
+        fprintf(stderr, "%s: guest stopped, ignoring\n", __func__);
+        trace_qxl_send_events_vm_stopped(d->id, events);
+        return;
+    }
     old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events);
     if ((old_pending & le_events) == le_events) {
         return;
diff --git a/trace-events b/trace-events
index 7ee21e5..d308533 100644
--- a/trace-events
+++ b/trace-events
@@ -994,6 +994,7 @@ qxl_spice_update_area(int qid, uint32_t surface_id, uint32_t left, uint32_t righ
 qxl_spice_update_area_rest(int qid, uint32_t num_dirty_rects, uint32_t clear_dirty_region) "%d #d=%d clear=%d"
 qxl_surfaces_dirty(int qid, int surface, int offset, int size) "%d surface=%d offset=%d size=%d"
 qxl_send_events(int qid, uint32_t events) "%d %d"
+qxl_send_events_vm_stopped(int qid, uint32_t events) "%d %d"
 qxl_set_guest_bug(int qid) "%d"
 qxl_interrupt_client_monitors_config(int qid, int num_heads, void *heads) "%d %d %p"
 qxl_client_monitors_config_unsupported_by_guest(int qid, uint32_t int_mask, void *client_monitors_config) "%d %X %p"


> 
> Just print the warning about the spice server bug & possibly lost
> events
> and go on.  With luck the event arrives nevertheless.  And if not we
> at
> least sayed before it can happen ;)
> 
> > +static void spice_server_bug(PCIQXLDevice *qxl, const char *msg,
> > ...)
> > +{
> > +    va_list ap;
> > +    va_start(ap, msg);
> > +    fprintf(stderr, "qxl-%d: spice-server bug: ", qxl->id);
> > +    vfprintf(stderr, msg, ap);
> > +    fprintf(stderr, "\n");
> > +    va_end(ap);
> > +}
> > +
> > +#define SPICE_SERVER_BUG_ONCE(qxl, msg, ...) {      \
> > +    static int called;                              \
> > +    if (!called) {                                  \
> > +        called = 1;                                 \
> > +        spice_server_bug(qxl, msg, __VA_ARGS__);    \
> > +    }                                               \
> > +}
> 
> That feels a bit like overkill too.
> 
> cheers,
>   Gerd
> 
> 
> 

  reply	other threads:[~2012-11-01 11:48 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-31 12:53 [Qemu-devel] [RFC] hw/qxl: inject interrupts in any state Alon Levy
2012-11-01  9:19 ` Gerd Hoffmann
2012-11-01  9:45   ` Alon Levy
2012-11-01  9:55     ` Gerd Hoffmann
2012-11-01 10:22       ` Alon Levy
2012-11-01 10:33         ` Gerd Hoffmann
2012-11-01 11:48           ` Alon Levy [this message]
2012-11-01 12:32             ` Gerd Hoffmann
2012-11-01 12:44               ` Alon Levy
2012-11-01 12:47                 ` Gerd Hoffmann

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=1786113489.25327079.1351770480060.JavaMail.root@redhat.com \
    --to=alevy@redhat.com \
    --cc=kraxel@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.