Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp9899835ybi; Wed, 10 Jul 2019 19:32:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqzAEwNOIfBfDJP0ecvJW4H2jjlvncf2c6mYPKwcFaE8Lgj925Vte5DyGqzkV/kGRAE1aUqi X-Received: by 2002:a17:902:403:: with SMTP id 3mr1748198ple.66.1562812327318; Wed, 10 Jul 2019 19:32:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562812327; cv=none; d=google.com; s=arc-20160816; b=yFXHJ+fZJmaR2ZO/Kb2vJgVj5Q+kufT/G0et7GC4uUZy71ywVFqM+hwjygxacKuOxK tF5temGE2AW9nfL4gGg/buu7HIbzqVUzCajSXqLDIdegXDk5d9CpSqiYXWKTOh+Xg2sU /hxLiIxuffGe08ZPQlXUxHp5ut5PhKxjNqVuw7V8N9AM8fRHS4+PspF9Ps+51jVu3Cp2 CUnFdDliMbg8ToNubll6isVDHPZ/Nj2IfIiUeinAwK7Am9mN3pOZeCa71Y2voBqRpDa3 /tWbkiRU7MIQIFCXeUlxLXuxWQME0izQPXIbJk/8L+1yF2ooMzHcNtHu6k8ABWp1YeJT ArLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=qPWrGW+mHyz/zxrmAaiQeG6b1c+y5yhmMgQ1hyiaZR0=; b=PcIqu9DgXicLZ1JNxRLQJJdK03c4UINMGqa+Rmj2+Rb51QGSIrd9JWkFXceE8s87yZ csjfhZujlFg04OeDDK1Ob+Tgq0wDXCFt3J9ZEluKQQm2LsDVX3h1qIJXTdWZywd6UnHg VkqMivxkeYUEdwtdd9eIbV3vedIlnotioWAXGNyQ3MS0XvLPUF5K6ZXK2bpLh4lAkeqJ Hwi1j8cymMCuvOgX+R3hSRXyyoQrLjHMJdEYEICNaw97zb4rnkJXbD/A8/RruwkLIkje Vw1Ik3/NW2zlDEed2l//vrKTnamrailRjsW2F/IRTkHE4uqvtcHSlUInCeTGsfLpFwMO gaGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qBE3eLC4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q12si3624279pgv.225.2019.07.10.19.31.51; Wed, 10 Jul 2019 19:32:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qBE3eLC4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727829AbfGKC3v (ORCPT + 99 others); Wed, 10 Jul 2019 22:29:51 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:45385 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727463AbfGKC3v (ORCPT ); Wed, 10 Jul 2019 22:29:51 -0400 Received: by mail-pl1-f196.google.com with SMTP id y8so2172194plr.12 for ; Wed, 10 Jul 2019 19:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qPWrGW+mHyz/zxrmAaiQeG6b1c+y5yhmMgQ1hyiaZR0=; b=qBE3eLC4RA4F+HzzOw79/Ge4/+ES1SdQUKnZaGPTDpEUF8lt0KVkrqVWOAH8gpMusV SG2+KBYLVfOn5pgk4W6rG1t7np0qKA+oz0CdjwjzL6gSCe9eQoYjvZZIVdVUNXG+OVVr D5wKYCee+xGjkEvfLuvpHpwo0W0H6JMlD2Xu1zRBuyaZOZV+gR0FFXFoSMXagudf/RdK uuZK4pJg5lx4taqE1//t+jWtdifCnAgF6B/cKysKRztKwrbLOjmXuxE5eZ4Ls7fV6ZIr GJ+N2Xakvkqq0zyfzswiAJvrKiGDfMQBsRjsuQmPA+Wk9uROukpiddb2+mkaWJHCkFKL 6PGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=qPWrGW+mHyz/zxrmAaiQeG6b1c+y5yhmMgQ1hyiaZR0=; b=tBVACcOswpmufRkSpSpN5XYEvwpC3N/vHdaF/RcYqMRXbAhE3xdKcBjwhUt7Rze0r6 OSve7XOEzc0t3U3pY84KTWTHXottfyRoF9yzY8Tb1haODB+QRyR1+OkiROV1UoZDi11R c71qM6yBV1HEOUTygvQQh9xs0xiv0YovLvz/wRJLtQIEpZLJZ0u+tQRoWeCL16iT4K0M 0O9KQbky92KSb1ff2hlXfo48ZARbucgerceW6tiH2lh18UF/qWA/rbcGP7YWnwsDPZ+t lyUgR5VTkmul4/Kia+8DmqSzsivkRXLAXAcywt1U7vDNbQm4AZVuVmRj5+qY+zbtg8Y3 wPaQ== X-Gm-Message-State: APjAAAVgpXsPC6qnsQFvg1x5hFlEuuZt2estZ8LxbS19EIMgMm4tEXbg 7UFIYDHpt8zSTh8ZSq23o1M= X-Received: by 2002:a17:902:2ec5:: with SMTP id r63mr1710517plb.21.1562812190534; Wed, 10 Jul 2019 19:29:50 -0700 (PDT) Received: from olv0.mtv.corp.google.com ([2620:15c:202:201:9649:82d6:f889:b307]) by smtp.gmail.com with ESMTPSA id x25sm1929986pfa.90.2019.07.10.19.29.49 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 10 Jul 2019 19:29:49 -0700 (PDT) From: Chia-I Wu To: dri-devel@lists.freedesktop.org Cc: David Airlie , Gerd Hoffmann , Daniel Vetter , virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/virtio: kick vq outside of the vq lock Date: Wed, 10 Jul 2019 19:29:37 -0700 Message-Id: <20190711022937.166015-1-olvaffe@gmail.com> X-Mailer: git-send-email 2.22.0.410.gd8fdbe21b5-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Replace virtqueue_kick by virtqueue_kick_prepare, which requires serialization, and virtqueue_notify, which does not. Repurpose the return values to indicate whether the vq should be notified. This fixes a lock contention with qemu host. When the guest calls vibad rtqueue_notify, the qemu vcpu thread exits the guest and waits for the qemu iothread to perform the MMIO. If the qemu iothread is still processing the prior buffer, and if the prior buffer is cheap to GPU, the iothread will go ahead and generate an IRQ for the guest. A worker thread in the guest will call virtio_gpu_dequeue_ctrl_func. If virtqueue_notify was called with the vq lock held, the worker thread would busy wait inside virtio_gpu_dequeue_ctrl_func. Signed-off-by: Chia-I Wu --- drivers/gpu/drm/virtio/virtgpu_vq.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index 6c1a90717535..e96f88fe5c83 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -291,11 +291,9 @@ static int virtio_gpu_queue_ctrl_buffer_locked(struct virtio_gpu_device *vgdev, trace_virtio_gpu_cmd_queue(vq, (struct virtio_gpu_ctrl_hdr *)vbuf->buf); - virtqueue_kick(vq); + ret = virtqueue_kick_prepare(vq); } - if (!ret) - ret = vq->num_free; return ret; } @@ -307,6 +305,10 @@ static int virtio_gpu_queue_ctrl_buffer(struct virtio_gpu_device *vgdev, spin_lock(&vgdev->ctrlq.qlock); rc = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); spin_unlock(&vgdev->ctrlq.qlock); + + if (rc > 0) + virtqueue_notify(vgdev->ctrlq.vq); + return rc; } @@ -339,6 +341,10 @@ static int virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev, virtio_gpu_fence_emit(vgdev, hdr, fence); rc = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); spin_unlock(&vgdev->ctrlq.qlock); + + if (rc > 0) + virtqueue_notify(vgdev->ctrlq.vq); + return rc; } @@ -369,13 +375,14 @@ static int virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev, trace_virtio_gpu_cmd_queue(vq, (struct virtio_gpu_ctrl_hdr *)vbuf->buf); - virtqueue_kick(vq); + ret = virtqueue_kick_prepare(vq); } spin_unlock(&vgdev->cursorq.qlock); - if (!ret) - ret = vq->num_free; + if (ret > 0) + virtqueue_notify(vq); + return ret; } -- 2.22.0.410.gd8fdbe21b5-goog