From patchwork Thu Apr 19 02:39:02 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhiyong Wu X-Patchwork-Id: 153631 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)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 76F0DB6EEC for ; Thu, 19 Apr 2012 13:14:59 +1000 (EST) Received: from localhost ([::1]:48533 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKhJD-0005Ax-EW for incoming@patchwork.ozlabs.org; Wed, 18 Apr 2012 22:41:23 -0400 Received: from eggs.gnu.org ([208.118.235.92]:58407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKhIh-0004KA-KI for qemu-devel@nongnu.org; Wed, 18 Apr 2012 22:40:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SKhIf-0002QA-P5 for qemu-devel@nongnu.org; Wed, 18 Apr 2012 22:40:51 -0400 Received: from e35.co.us.ibm.com ([32.97.110.153]:40222) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SKhIf-0002Q3-J9 for qemu-devel@nongnu.org; Wed, 18 Apr 2012 22:40:49 -0400 Received: from /spool/local by e35.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 18 Apr 2012 20:40:47 -0600 Received: from d01dlp03.pok.ibm.com (9.56.224.17) by e35.co.us.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 18 Apr 2012 20:40:46 -0600 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id B8D2FC90050 for ; Wed, 18 Apr 2012 22:40:42 -0400 (EDT) Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q3J2e3jw193898 for ; Wed, 18 Apr 2012 22:40:12 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q3J8AtN1032500 for ; Thu, 19 Apr 2012 04:10:56 -0400 Received: from us.ibm.com (f15.cn.ibm.com [9.115.118.120] (may be forged)) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id q3J8Ao57032333; Thu, 19 Apr 2012 04:10:52 -0400 Received: by us.ibm.com (sSMTP sendmail emulation); Thu, 19 Apr 2012 10:39:57 +0800 From: zwu.kernel@gmail.com To: qemu-devel@nongnu.org Date: Thu, 19 Apr 2012 10:39:02 +0800 Message-Id: <1334803149-27379-10-git-send-email-zwu.kernel@gmail.com> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1334803149-27379-1-git-send-email-zwu.kernel@gmail.com> References: <1334803149-27379-1-git-send-email-zwu.kernel@gmail.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12041902-6148-0000-0000-00000526F2A3 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 32.97.110.153 Cc: stefanha@linux.vnet.ibm.com, linuxram@us.ibm.com, nab@linux-iscsi.org, zwu.kernel@gmail.com, luowenj@cn.ibm.com, pbonzini@redhat.com Subject: [Qemu-devel] [PATCH 09/16] virtio-pci: support host notifiers in TCG mode 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 From: Stefan Hajnoczi Normally host notifiers are only used together with vhost-net in KVM mode. It is occassionally useful to use vhost with TCG mode, mainly for testing and development. This isn't hard to achieve, simply fall back to notifying the host notifier manually from qemu if KVM mode is disabled. Signed-off-by: Stefan Hajnoczi --- hw/virtio-pci.c | 23 ++++++++++++++++++++--- hw/virtio.c | 7 +++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 4a4413d..dcd58d0 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -281,6 +281,25 @@ void virtio_pci_reset(DeviceState *d) proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG; } +static void virtio_pci_queue_notify(VirtIOPCIProxy *proxy, uint32_t n) +{ + VirtQueue *vq; + EventNotifier *notifier; + + if (n >= VIRTIO_PCI_QUEUE_MAX) { + return; + } + + vq = virtio_get_queue(proxy->vdev, n); + notifier = virtio_queue_get_host_notifier(vq); + if (event_notifier_valid(notifier)) { + printf("notifying vq %u host notifier from userspace\n", n); + event_notifier_notify(notifier); + } else { + virtio_queue_notify_vq(vq); + } +} + static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val) { VirtIOPCIProxy *proxy = opaque; @@ -310,9 +329,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val) vdev->queue_sel = val; break; case VIRTIO_PCI_QUEUE_NOTIFY: - if (val < VIRTIO_PCI_QUEUE_MAX) { - virtio_queue_notify(vdev, val); - } + virtio_pci_queue_notify(proxy, val); break; case VIRTIO_PCI_STATUS: if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) { diff --git a/hw/virtio.c b/hw/virtio.c index 064aecf..e491850 100644 --- a/hw/virtio.c +++ b/hw/virtio.c @@ -527,6 +527,11 @@ void virtio_reset(void *opaque) vdev->vq[i].signalled_used = 0; vdev->vq[i].signalled_used_valid = false; vdev->vq[i].notification = true; + + assert(!event_notifier_valid(&vdev->vq[i].guest_notifier)); + assert(!event_notifier_valid(&vdev->vq[i].host_notifier)); + vdev->vq[i].guest_notifier = EVENT_NOTIFIER_INITIALIZER; + vdev->vq[i].host_notifier = EVENT_NOTIFIER_INITIALIZER; } } @@ -887,6 +892,8 @@ VirtIODevice *virtio_common_init(const char *name, uint16_t device_id, for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) { vdev->vq[i].vector = VIRTIO_NO_VECTOR; vdev->vq[i].vdev = vdev; + vdev->vq[i].guest_notifier = EVENT_NOTIFIER_INITIALIZER; + vdev->vq[i].host_notifier = EVENT_NOTIFIER_INITIALIZER; } vdev->name = name;