From patchwork Wed Nov 16 18:05:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 695739 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tJsfW3MF6z9t0v for ; Thu, 17 Nov 2016 05:07:15 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uqrGjYmP"; dkim-atps=neutral Received: from localhost ([::1]:53865 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c74c4-0007rD-OR for incoming@patchwork.ozlabs.org; Wed, 16 Nov 2016 13:07:12 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53813) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c74as-0006ux-VZ for qemu-devel@nongnu.org; Wed, 16 Nov 2016 13:06:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c74ar-0003hi-Ra for qemu-devel@nongnu.org; Wed, 16 Nov 2016 13:05:58 -0500 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:35237) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1c74ar-0003h8-Ka for qemu-devel@nongnu.org; Wed, 16 Nov 2016 13:05:57 -0500 Received: by mail-wm0-x244.google.com with SMTP id a20so13666135wme.2 for ; Wed, 16 Nov 2016 10:05:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Bt7qKzGgaGbWD/nT2P69ST6RM5BTig2Lt9tzJ7RUZbI=; b=uqrGjYmPy0o9UrY5TSmgJ7PBTXpltko2CuETr2Sy59y8rnM5R2a2SxrtPhS2qDu7xs nlQuTqezm+cDQqZEhDuv6MkpzmAGrS3bLTra+Sew/vx9+1wxUq2a/EhK69aGZeKqV+DQ YlXamZ1b1y2SjsJQ3tirfBBPhTfXBoEEqW3zOQCl+wyQy0ZRVJWIXhhWcpPwFLGp585v TE5rxz1ScwKMq/E5DtgNqQtTnrUqSmjrofhwYWaraHWIsFMe2eUtPQDES7iOiBNODCy9 FSNMJbbmfDX6caJ29mWmIkiWEcu4KVler+KDysxfqe77aWUMXqAPa4ac25k/RkhPJ1wK Z2Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Bt7qKzGgaGbWD/nT2P69ST6RM5BTig2Lt9tzJ7RUZbI=; b=ODHe52rBLiKxbjofoqfprdhxMHkIQDE92GPZGTJ8ccIep6xLZorKSdDgOYvebj8+Tm e6AsWFgXS/BrBoGnFLJe5lVn0GJcR4PvGjGA7DCUsQPxKnuKRVfaPApHRNHt0aGJqW08 8uthABBu0FNG0nF6Za7rj8F7fTKkaqK383pFBfQuxCs5YftU4+3J8EE2Nf936rnfgUWO OVqyzyv8zTpLQtzJYb7uaAzkienU/JUPCOUN6BkjNdBVptdxHE6ASH8KQyIbORxNyonG CZU3i0rvbvdymYkfsuT6DAzE+vgeyQU2QUwFXaG7Razyd51XdhuzBlwTqLU0gdk7FcXK NQDA== X-Gm-Message-State: ABUngvcC/k+A33lJVzkFC2ZU0bzK+93a2U6GvXZXR8uqiMSjxckfCPUH/koi7+m4OtxULw== X-Received: by 10.28.139.12 with SMTP id n12mr10705775wmd.79.1479319556469; Wed, 16 Nov 2016 10:05:56 -0800 (PST) Received: from donizetti.lan (94-39-155-114.adsl-ull.clienti.tiscali.it. [94.39.155.114]) by smtp.gmail.com with ESMTPSA id kq7sm27744415wjb.30.2016.11.16.10.05.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Nov 2016 10:05:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 16 Nov 2016 19:05:50 +0100 Message-Id: <20161116180551.9611-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20161116180551.9611-1-pbonzini@redhat.com> References: <20161116180551.9611-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically 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: borntraeger@de.ibm.com, alex.williamson@redhat.com, felipe@nutanix.com, mst@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This will be needed once dataplane will be able to set it outside the big QEMU lock. Signed-off-by: Paolo Bonzini --- v1->v2: squash syntax error fix from patch 3 [Christian] hw/virtio/virtio-mmio.c | 6 +++--- hw/virtio/virtio-pci.c | 9 +++------ hw/virtio/virtio.c | 18 +++++++++++++----- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c index a30270f..17412cb 100644 --- a/hw/virtio/virtio-mmio.c +++ b/hw/virtio/virtio-mmio.c @@ -191,7 +191,7 @@ static uint64_t virtio_mmio_read(void *opaque, hwaddr offset, unsigned size) return virtio_queue_get_addr(vdev, vdev->queue_sel) >> proxy->guest_page_shift; case VIRTIO_MMIO_INTERRUPTSTATUS: - return vdev->isr; + return atomic_read(&vdev->isr); case VIRTIO_MMIO_STATUS: return vdev->status; case VIRTIO_MMIO_HOSTFEATURESSEL: @@ -299,7 +299,7 @@ static void virtio_mmio_write(void *opaque, hwaddr offset, uint64_t value, } break; case VIRTIO_MMIO_INTERRUPTACK: - vdev->isr &= ~value; + atomic_and(&vdev->isr, ~value); virtio_update_irq(vdev); break; case VIRTIO_MMIO_STATUS: @@ -347,7 +347,7 @@ static void virtio_mmio_update_irq(DeviceState *opaque, uint16_t vector) if (!vdev) { return; } - level = (vdev->isr != 0); + level = (atomic_read(&vdev->isr) != 0); DPRINTF("virtio_mmio setting IRQ %d\n", level); qemu_set_irq(proxy->irq, level); } diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 97b32fe..521ba0b 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -73,7 +73,7 @@ static void virtio_pci_notify(DeviceState *d, uint16_t vector) msix_notify(&proxy->pci_dev, vector); else { VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); - pci_set_irq(&proxy->pci_dev, vdev->isr & 1); + pci_set_irq(&proxy->pci_dev, atomic_read(&vdev->isr) & 1); } } @@ -449,8 +449,7 @@ static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr) break; case VIRTIO_PCI_ISR: /* reading from the ISR also clears it. */ - ret = vdev->isr; - vdev->isr = 0; + ret = atomic_xchg(&vdev->isr, 0); pci_irq_deassert(&proxy->pci_dev); break; case VIRTIO_MSI_CONFIG_VECTOR: @@ -1379,9 +1378,7 @@ static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr, { VirtIOPCIProxy *proxy = opaque; VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); - uint64_t val = vdev->isr; - - vdev->isr = 0; + uint64_t val = atomic_xchg(&vdev->isr, 0); pci_irq_deassert(&proxy->pci_dev); return val; diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index b7d5828..ecf13bd 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -945,7 +945,7 @@ void virtio_reset(void *opaque) vdev->guest_features = 0; vdev->queue_sel = 0; vdev->status = 0; - vdev->isr = 0; + atomic_set(&vdev->isr, 0); vdev->config_vector = VIRTIO_NO_VECTOR; virtio_notify_vector(vdev, vdev->config_vector); @@ -1318,10 +1318,18 @@ void virtio_del_queue(VirtIODevice *vdev, int n) vdev->vq[n].vring.num_default = 0; } +static void virtio_set_isr(VirtIODevice *vdev, int value) +{ + uint8_t old = atomic_read(&vdev->isr); + if ((old & value) != value) { + atomic_or(&vdev->isr, value); + } +} + void virtio_irq(VirtQueue *vq) { trace_virtio_irq(vq); - vq->vdev->isr |= 0x01; + virtio_set_isr(vq->vdev, 0x1); virtio_notify_vector(vq->vdev, vq->vector); } @@ -1355,7 +1363,7 @@ void virtio_notify(VirtIODevice *vdev, VirtQueue *vq) } trace_virtio_notify(vdev, vq); - vdev->isr |= 0x01; + virtio_set_isr(vq->vdev, 0x1); virtio_notify_vector(vdev, vq->vector); } @@ -1364,7 +1372,7 @@ void virtio_notify_config(VirtIODevice *vdev) if (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) return; - vdev->isr |= 0x03; + virtio_set_isr(vdev, 0x3); vdev->generation++; virtio_notify_vector(vdev, vdev->config_vector); } @@ -1895,7 +1903,7 @@ void virtio_init(VirtIODevice *vdev, const char *name, vdev->device_id = device_id; vdev->status = 0; - vdev->isr = 0; + atomic_set(&vdev->isr, 0); vdev->queue_sel = 0; vdev->config_vector = VIRTIO_NO_VECTOR; vdev->vq = g_malloc0(sizeof(VirtQueue) * VIRTIO_QUEUE_MAX);