From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ingo Molnar Subject: Re: [PATCH 4/4] kvm tools: Fix virtio console hangs by removing IRQ injection for tx path Date: Sun, 8 May 2011 08:22:47 +0200 Message-ID: <20110508062247.GA24456@elte.hu> References: <1304822300-14299-1-git-send-email-asias.hejun@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Pekka Enberg , Cyrill Gorcunov , Sasha Levin , Prasad Joshi , kvm@vger.kernel.org To: Asias He Return-path: Received: from mx3.mail.elte.hu ([157.181.1.138]:41466 "EHLO mx3.mail.elte.hu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751271Ab1EHGW5 (ORCPT ); Sun, 8 May 2011 02:22:57 -0400 Content-Disposition: inline In-Reply-To: <1304822300-14299-1-git-send-email-asias.hejun@gmail.com> Sender: kvm-owner@vger.kernel.org List-ID: * Asias He wrote: > As virtio spec says: > > """ > Because this is high importance and low bandwidth, the current Linux > implementation polls for the buffer to be used, rather than waiting > for an interrupt, simplifying the implementation signicantly. > """ > > drivers/char/virtio_console.c > send_buf() { > ... > /* Tell Host to go! */ > virtqueue_kick(out_vq); > ... > while (!virtqueue_get_buf(out_vq, &len)) > cpu_relax(); > ... > } > > The console hangs can simply be reproduced by yes command which > gives tremendous console IOs and IRQs. > > [ 16.786440] irq 4: nobody cared (try booting with the "irqpoll" option) > [ 16.786440] Pid: 1437, comm: yes Tainted: G W 2.6.39-rc6+ #56 > [ 16.786440] Call Trace: > [ 16.786440] [] __report_bad_irq+0x30/0x89 > [ 16.786440] [] note_interrupt+0x118/0x17a > [ 16.786440] [] handle_irq_event_percpu+0x168/0x179 > [ 16.786440] [] handle_irq_event+0x2c/0x46 > [ 16.786440] [] ? unmask_irq+0x1e/0x1e > [ 16.786440] [] handle_level_irq+0x50/0x6e > [ 16.786440] [] ? do_IRQ+0x35/0x7f > [ 16.786440] [] ? common_interrupt+0x29/0x30 > [ 16.786440] [] ? _raw_spin_unlock_irqrestore+0x7/0x28 > [ 16.786440] [] ? hvc_write+0x88/0x9e > [ 16.786440] [] ? do_output_char+0x88/0x18a > [ 16.786440] [] ? process_output+0x2f/0x42 > [ 16.786440] [] ? n_tty_write+0x211/0x2dc > [ 16.786440] [] ? try_to_wake_up+0x226/0x226 > [ 16.786440] [] ? tty_write+0x15e/0x1d1 > [ 16.786440] [] ? security_file_permission+0x22/0x26 > [ 16.786440] [] ? process_echoes+0x241/0x241 > [ 16.786440] [] ? vfs_write+0x84/0xd7 > [ 16.786440] [] ? tty_write_lock+0x3d/0x3d > [ 16.786440] [] ? sys_write+0x3b/0x5d > [ 16.786440] [] ? sysenter_do_call+0x12/0x22 > [ 16.786440] handlers: > [ 16.786440] [] (vp_interrupt+0x0/0x3a) > [ 16.786440] Disabling IRQ #4 Hm, why is irq #4 active if the guest-side virtio console driver does not handle it? > Signed-off-by: Asias He > --- > tools/kvm/virtio/console.c | 2 -- > 1 files changed, 0 insertions(+), 2 deletions(-) > > diff --git a/tools/kvm/virtio/console.c b/tools/kvm/virtio/console.c > index f5449ba..1fecf37 100644 > --- a/tools/kvm/virtio/console.c > +++ b/tools/kvm/virtio/console.c > @@ -171,8 +171,6 @@ static void virtio_console_handle_callback(struct kvm *self, void *param) > len = term_putc_iov(CONSOLE_VIRTIO, iov, out); > virt_queue__set_used_elem(vq, head, len); > } > - > - virt_queue__trigger_irq(vq, virtio_console_pci_device.irq_line, &cdev.isr, self); > } I think this at least requires a comment at that place, that we intentionally skip notifying the guest, because Linux guests do not use the console IRQ. Does the guest-side virtio driver *ever* use the irq? Thanks, Ingo