From patchwork Thu Jun 30 11:52:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Cornelia Huck X-Patchwork-Id: 9207293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5CFC76075F for ; Thu, 30 Jun 2016 11:53:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4C1EC284DD for ; Thu, 30 Jun 2016 11:53:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3DD9928558; Thu, 30 Jun 2016 11:53:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 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 mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B1D88284DD for ; Thu, 30 Jun 2016 11:53:20 +0000 (UTC) Received: from localhost ([::1]:48633 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIaX1-00020Q-43 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 30 Jun 2016 07:53:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52942) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIaWl-0001zz-1V for qemu-devel@nongnu.org; Thu, 30 Jun 2016 07:53:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bIaWg-0006RO-15 for qemu-devel@nongnu.org; Thu, 30 Jun 2016 07:53:02 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:43508 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIaWf-0006Pz-Sc for qemu-devel@nongnu.org; Thu, 30 Jun 2016 07:52:57 -0400 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u5UBnSw7059445 for ; Thu, 30 Jun 2016 07:52:55 -0400 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0b-001b2d01.pphosted.com with ESMTP id 23utca9j8g-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Thu, 30 Jun 2016 07:52:55 -0400 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 30 Jun 2016 12:52:53 +0100 Received: from d06dlp01.portsmouth.uk.ibm.com (9.149.20.13) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 30 Jun 2016 12:52:52 +0100 X-IBM-Helo: d06dlp01.portsmouth.uk.ibm.com X-IBM-MailFrom: cornelia.huck@de.ibm.com X-IBM-RcptTo: qemu-devel@nongnu.org Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 71EDA17D8056 for ; Thu, 30 Jun 2016 12:54:12 +0100 (BST) Received: from d06av09.portsmouth.uk.ibm.com (d06av09.portsmouth.uk.ibm.com [9.149.37.250]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u5UBqpTo5505304 for ; Thu, 30 Jun 2016 11:52:51 GMT Received: from d06av09.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u5UBqpOE009438 for ; Thu, 30 Jun 2016 05:52:51 -0600 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u5UBqoTL009379 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA256 bits=256 verify=NO); Thu, 30 Jun 2016 05:52:50 -0600 From: Cornelia Huck To: qemu-devel@nongnu.org Date: Thu, 30 Jun 2016 13:52:47 +0200 X-Mailer: git-send-email 2.6.6 MIME-Version: 1.0 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16063011-0016-0000-0000-0000020289B3 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16063011-0017-0000-0000-0000221AB5EB Message-Id: <1467287567-2632-1-git-send-email-cornelia.huck@de.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-06-30_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1606300112 X-MIME-Autoconverted: from 8bit to quoted-printable by mx0b-001b2d01.pphosted.com id u5UBnSw7059445 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v2] virtio: Fix setting up host notifiers for vhost X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: famz@redhat.com, mst@redhat.com, jasowang@redhat.com, pl@kamp.de, marcandre.lureau@gmail.com, stefanha@redhat.com, Cornelia Huck , pbonzini@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP When setting up host notifiers, virtio_bus_set_host_notifier() simply switches the handler. This will only work, however, if the ioeventfd has already been setup; this is true for dataplane, but not for vhost, and will completely break things if the ioeventfd is disabled for the device. Fix this by starting the ioeventfd on assign if that has not happened before, and only switch the handler if the ioeventfd has really been started. While we're at it, also fixup the unsetting path of set_host_notifier_internal(). Fixes: 6798e245a3 ("virtio-bus: common ioeventfd infrastructure") Reported-by: Jason Wang Reported-by: Marc-André Lureau Signed-off-by: Cornelia Huck --- Changes v1->v2: - don't switch the handler if the eventfd has not been setup - this fixes the failure of vhost-user-test for me - add more comments --- hw/virtio/virtio-bus.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c index 1313760..dfe24fc 100644 --- a/hw/virtio/virtio-bus.c +++ b/hw/virtio/virtio-bus.c @@ -176,8 +176,8 @@ static int set_host_notifier_internal(DeviceState *proxy, VirtioBusState *bus, return r; } } else { - virtio_queue_set_host_notifier_fd_handler(vq, false, false); k->ioeventfd_assign(proxy, notifier, n, assign); + virtio_queue_set_host_notifier_fd_handler(vq, false, false); event_notifier_cleanup(notifier); } return r; @@ -246,6 +246,9 @@ void virtio_bus_stop_ioeventfd(VirtioBusState *bus) /* * This function switches from/to the generic ioeventfd handler. * assign==false means 'use generic ioeventfd handler'. + * It is only considered an error if the binding does not support + * host notifiers at all, not when they are not available for the + * individual device. */ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign) { @@ -259,6 +262,13 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign) } if (assign) { /* + * Not yet started? assign==true implies we want to use an + * eventfd, so let's do the requisite setup. + */ + if (!k->ioeventfd_started(proxy)) { + virtio_bus_start_ioeventfd(bus); + } + /* * Stop using the generic ioeventfd, we are doing eventfd handling * ourselves below */ @@ -269,8 +279,13 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign) * Otherwise, there's a window where we don't have an * ioeventfd and we may end up with a notification where * we don't expect one. + * + * Also note that we should only do something with the eventfd + * handler if the eventfd has actually been setup. */ - virtio_queue_set_host_notifier_fd_handler(vq, assign, !assign); + if (k->ioeventfd_started(proxy)) { + virtio_queue_set_host_notifier_fd_handler(vq, assign, !assign); + } if (!assign) { /* Use generic ioeventfd handler again. */ k->ioeventfd_set_disabled(proxy, false);