Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp5798135ybl; Tue, 27 Aug 2019 09:46:48 -0700 (PDT) X-Google-Smtp-Source: APXvYqyvbeR03Qw+rX/hhTOwfag94+nHrc8aWOQT8EJGJ08krNTx3abkg+BRFh+sqoL0KkHYEpsI X-Received: by 2002:a63:e54:: with SMTP id 20mr21650784pgo.244.1566924408271; Tue, 27 Aug 2019 09:46:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1566924408; cv=none; d=google.com; s=arc-20160816; b=cLcgb2m0R2/Q9Zne9pm1OHPtyZ01GcBAkVAgjwRbOVDdhmF5pom85UkQumSH47xqgt xDdmVozMmHnUD8Ojw8cOKH0u9m8puA77W40N0YY6+E7IGXxqLYhYX/nqDYVP0IOTx4Rv J5z228d7FHW9lx6KE6An8TbpSs5kpafYT7HZKVkS4aLbZG5RRmDruVn2sFgavR5hE+tU ij1D8hO4c33eyL4/92ePHxN39NccNoPRAhZdU2VqeLGQ7bTU91mfP/kPpIzpe9eoFNau pZ107GCGYK1kp6UVGGQeSCypG8DicWSiaQh0p17+5SNyjxm6sHM1fTmgKMJV9Uhl1Y2j 5OtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=bgEZL7FHXVC38tkVb8BiSRS9kzc42h1C+rKp2AsOFAo=; b=il4J2MzwpZAaPgmSkPvvdEXE236WZXMC18G8uUwJc31DsXM2I6vPlu/yH6nooV65hE 67l9WwBEEUMefZO8NTmimNP6jP3N56hyduclAmKoTlSCkmWClItx2wemmJp3TCEWQUEK O4DjCS5sYmyF9RH/QpqoQoAwqeRV+A4fN2Rr1gzK5ZEYMcBPaUNpIM0XBIotWhAV6EXg yVKE8Krwz/HC4cDUEXioKXas3O5NRIil7yVL1HKLowdlgox4K6+k4vpTyhLJveSL680Y nfT1+HcI6eWMODjO3BFNoxlrmK0iW17ILez2blFGC3WswNzTJYeAkApZrE+xkpx3gF6l R6yA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=T6sitAXX; 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 k3si12764898pgs.223.2019.08.27.09.46.32; Tue, 27 Aug 2019 09:46:48 -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=T6sitAXX; 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 S1728584AbfH0Qpk (ORCPT + 99 others); Tue, 27 Aug 2019 12:45:40 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:34377 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726610AbfH0Qpj (ORCPT ); Tue, 27 Aug 2019 12:45:39 -0400 Received: by mail-io1-f67.google.com with SMTP id s21so47921651ioa.1 for ; Tue, 27 Aug 2019 09:45:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=bgEZL7FHXVC38tkVb8BiSRS9kzc42h1C+rKp2AsOFAo=; b=T6sitAXXsulHPQdxWkBxQoQ5ma3ksEOLb1V/hrE/6RubIs6kJkFPQSGzCSYd/uGPXe rgQU8z5g7+cFRG1QF7yW25qsZURMuJMXmyb9xujtNB8s3WQe1gVLdlRtRfNRyOCg75iu Rti4wabkh6aPySTaup/hsr7t4vvn0h5ZHCRepu/NOuHzMVwVRuJ25j0lSKQevAVXEoJ7 ewe34JV3U7tris/s7XI2ZwwfYV3drOlobjk0Kf86c0BDwMmsN1akmTeeUjv8ZMLks6re 8SWY68KxAnL5hZADc6L82KxM9iSsdCaIIsTFwC+bvxjIhnzKtigG2D/6woMhYUs7FAl8 KHPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=bgEZL7FHXVC38tkVb8BiSRS9kzc42h1C+rKp2AsOFAo=; b=mjnN1K5g0sHA+kk5HyyoijPa5i3c63Zy4bapx5aB7SrivfvxeP4JpGlxu2d7lxn4FX ssLRw9K4mgWZoWt8lQqFXr+mZ4LT2eomxI5K2MgPKWqvnowY+bxc1q5y0ZXgWKSSTXcY 4pvOpvop6e3YQn1GcBYXd8tLLPIRqfbkRTMoERHJPFOMUJMUqPuL59kaSu4Zbzv7XFef fLA07O+e1F5YSKmUktNx5J9EzKA8HIfBKCo20atNDhKaQoivg4BJ8c94YjarlotxIiTL TGbKUJVTo8kWPbUJG2U1PB3BNw0K2FxO8gd4PX6bBXm7lpfVRb7eZ2/R8ecaanwC5W/5 QuOA== X-Gm-Message-State: APjAAAVhEe18xXjlr47NAU0JIwAzlNSYjnhZaNSsqZ+n+7i7bPfd0CTQ MCS65zGq+2rGis6IjujmUskAPPTbiCISeWPFWog= X-Received: by 2002:a6b:6f06:: with SMTP id k6mr33986129ioc.232.1566924338329; Tue, 27 Aug 2019 09:45:38 -0700 (PDT) MIME-Version: 1.0 References: <20190813082509.29324-1-kraxel@redhat.com> <20190813082509.29324-3-kraxel@redhat.com> In-Reply-To: <20190813082509.29324-3-kraxel@redhat.com> From: Chia-I Wu Date: Tue, 27 Aug 2019 09:45:27 -0700 Message-ID: Subject: Re: [PATCH 2/2] drm/virtio: notify virtqueues without holding spinlock To: Gerd Hoffmann Cc: ML dri-devel , David Airlie , Daniel Vetter , "open list:VIRTIO GPU DRIVER" , open list Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Aug 13, 2019 at 1:25 AM Gerd Hoffmann wrote: > > Split virtqueue_kick() call into virtqueue_kick_prepare(), which > requires serialization, and virtqueue_notify(), which does not. Move > the virtqueue_notify() call out of the critical section protected by the > queue lock. This avoids triggering a vmexit while holding the lock and > thereby fixes a rather bad spinlock contention. > > Suggested-by: Chia-I Wu > Signed-off-by: Gerd Hoffmann Series is Reviewed-by: Chia-I Wu > --- > drivers/gpu/drm/virtio/virtgpu_vq.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c > index ca91e83ffaef..e41c96143342 100644 > --- a/drivers/gpu/drm/virtio/virtgpu_vq.c > +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c > @@ -252,7 +252,7 @@ void virtio_gpu_dequeue_cursor_func(struct work_struct *work) > wake_up(&vgdev->cursorq.ack_queue); > } > > -static void virtio_gpu_queue_ctrl_buffer_locked(struct virtio_gpu_device *vgdev, > +static bool virtio_gpu_queue_ctrl_buffer_locked(struct virtio_gpu_device *vgdev, > struct virtio_gpu_vbuffer *vbuf) > __releases(&vgdev->ctrlq.qlock) > __acquires(&vgdev->ctrlq.qlock) > @@ -260,10 +260,11 @@ static void virtio_gpu_queue_ctrl_buffer_locked(struct virtio_gpu_device *vgdev, > struct virtqueue *vq = vgdev->ctrlq.vq; > struct scatterlist *sgs[3], vcmd, vout, vresp; > int outcnt = 0, incnt = 0; > + bool notify = false; > int ret; > > if (!vgdev->vqs_ready) > - return; > + return notify; > > sg_init_one(&vcmd, vbuf->buf, vbuf->size); > sgs[outcnt + incnt] = &vcmd; > @@ -292,16 +293,21 @@ static void 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); > + notify = virtqueue_kick_prepare(vq); > } > + return notify; > } > > static void virtio_gpu_queue_ctrl_buffer(struct virtio_gpu_device *vgdev, > struct virtio_gpu_vbuffer *vbuf) > { > + bool notify; > + > spin_lock(&vgdev->ctrlq.qlock); > - virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); > + notify = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); > spin_unlock(&vgdev->ctrlq.qlock); > + if (notify) > + virtqueue_notify(vgdev->ctrlq.vq); > } > > static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev, > @@ -310,6 +316,7 @@ static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev, > struct virtio_gpu_fence *fence) > { > struct virtqueue *vq = vgdev->ctrlq.vq; > + bool notify; > > again: > spin_lock(&vgdev->ctrlq.qlock); > @@ -330,8 +337,10 @@ static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev, > > if (fence) > virtio_gpu_fence_emit(vgdev, hdr, fence); > - virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); > + notify = virtio_gpu_queue_ctrl_buffer_locked(vgdev, vbuf); > spin_unlock(&vgdev->ctrlq.qlock); > + if (notify) > + virtqueue_notify(vgdev->ctrlq.vq); > } > > static void virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev, > @@ -339,6 +348,7 @@ static void virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev, > { > struct virtqueue *vq = vgdev->cursorq.vq; > struct scatterlist *sgs[1], ccmd; > + bool notify; > int ret; > int outcnt; > > @@ -361,10 +371,13 @@ static void 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); > + notify = virtqueue_kick_prepare(vq); > } > > spin_unlock(&vgdev->cursorq.qlock); > + > + if (notify) > + virtqueue_notify(vq); > } > > /* just create gem objects for userspace and long lived objects, > -- > 2.18.1 >