Received: by 2002:a05:7412:a9a2:b0:e2:908c:2ebd with SMTP id o34csp2430252rdh; Sun, 29 Oct 2023 16:20:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEnAWvTP94dMOR0Hg7T/695zs4iv0uObH/A3oC/tCL7pA5RtdZMIMWupkEQNOwYBr1qojii X-Received: by 2002:a05:6602:2cc1:b0:79f:cdb4:9532 with SMTP id j1-20020a0566022cc100b0079fcdb49532mr12138790iow.18.1698621604352; Sun, 29 Oct 2023 16:20:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698621604; cv=none; d=google.com; s=arc-20160816; b=rPum1sYSlZwdXeSM30cKuz731kIv4bv0hPYxwXtXZ1D/cc4vptyC42Wr/F8WD9V5En x3eZXsihXRwFNZ1J9rYXEmDAJsNyHdUeFprwZzTDzlnx0mg0bI03qeoEeI9tIq4YaNYT 4zoKdZLmQnKdAjoAtC9Hf0WuO8H1FikHsjMYOJG1yOnr54zW5Qrz1QzfTt8IjyCSxHNb KUS4q+K/ySvsKQk0uZ3NEHFgdU7F7fGfOsBuqyx0IBcBBzptZsH23YC6oKHg12AgcDff 9eNrz3vZ3Rvck7eW1eQxshhXy33m/GM00+bHrMuOL5u7aGkbwCCrKzpJSi3CHqozbxzd WxmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=pX9YJHWwt9IrG8YquQg6qCMY5AMxsqg139t1AypZoU8=; fh=5cel2jD5h+yPMXVwxbomyVhwojHUqATy6nFjd4aOh4o=; b=N4p9BSU1iWLh0FHLd/MNtOSSe6bvssQlVXtnx8OXil2aJ8vKAo9sEhboSfYACF9nKA SCw4CTuahWXbMV0cBHbp0iWfvZPNOwr9jNGvQq2Y2iaEo3RHfff3gyVWesRji9pGxPTB LBIT0RBSfzcfTRLBa/sEUs+M6rsp7wkW7h28y/FUeoeVAZWliiPICFefniYKFyT2vGh+ V0bhb5kBolBwE5BXFVaYQPXpbGK//5tr39GCYZaAKIlYkkWQxlfGZMOn1PZc2W38IdUZ T64ThJMw/KlppxkABQ8riooPLXtrXBqVnuuFO/q7Y6qGY7jr/Kgf8KRRIaypyF+8sZeO rBuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b="bhh/+dHt"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id bq7-20020a056a02044700b005a9fb6bf73esi1829121pgb.293.2023.10.29.16.20.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Oct 2023 16:20:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b="bhh/+dHt"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id C0A6980756EB; Sun, 29 Oct 2023 16:20:01 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231614AbjJ2XTw (ORCPT + 99 others); Sun, 29 Oct 2023 19:19:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231363AbjJ2XTg (ORCPT ); Sun, 29 Oct 2023 19:19:36 -0400 Received: from madras.collabora.co.uk (madras.collabora.co.uk [46.235.227.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 290257AAA for ; Sun, 29 Oct 2023 16:04:29 -0700 (PDT) Received: from workpc.. (109-252-153-31.dynamic.spd-mgts.ru [109.252.153.31]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dmitry.osipenko) by madras.collabora.co.uk (Postfix) with ESMTPSA id C9B4D66073B5; Sun, 29 Oct 2023 23:02:59 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1698620581; bh=9VDunboaNrQ0+alNzN87bJVPZTdu5GVJOSm1S5JwyL8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bhh/+dHtFNOZ+FbvkdBKZRTxqXNMGYB7HkZwXtTbvcOiloCDHK7FbKeKTYwRCJC5S DQfQ6yHaC9lXwa6bGT4FhqyI+LQWsa/O+PeOu/rbg1E3HdbDE8J8yafWKuXulU0kWV lX6AMEVMrKRxlXq9yfrIL3l7PN4T7kmFILpa8zRxz4Zq10QI1+v1jhWYOv75Vzq9Zd a0jrgWPsBfFpb8HeBjnl/JUhcssreG88iBdoAfi7WZalN1kVkdNi2HjdEAFEadTAXn J6TnaCgG+AR2jrUVVoF4lQkvcx/uRJ9M4ZH31cipraN5MwmtG+wwvXknrCeY6sZr7w YSqW/hqKf40kQ== From: Dmitry Osipenko To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , =?UTF-8?q?Christian=20K=C3=B6nig?= , Qiang Yu , Steven Price , Boris Brezillon , Emma Anholt , Melissa Wen Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, virtualization@lists.linux-foundation.org Subject: [PATCH v18 23/26] drm/virtio: Pin display framebuffer BO Date: Mon, 30 Oct 2023 02:02:02 +0300 Message-ID: <20231029230205.93277-24-dmitry.osipenko@collabora.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231029230205.93277-1-dmitry.osipenko@collabora.com> References: <20231029230205.93277-1-dmitry.osipenko@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Sun, 29 Oct 2023 16:20:01 -0700 (PDT) Prepare to addition of memory shrinker support by pinning display framebuffer BO pages in memory while they are in use by display on host. Shrinker is free to relocate framebuffer BO pages if it doesn't know that pages are in use, thus pin the pages to disallow shrinker to move them. Acked-by: Gerd Hoffmann Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/virtio/virtgpu_drv.h | 2 ++ drivers/gpu/drm/virtio/virtgpu_gem.c | 19 +++++++++++++++++++ drivers/gpu/drm/virtio/virtgpu_plane.c | 17 +++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 96365a772f77..56269814fb6d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -313,6 +313,8 @@ void virtio_gpu_array_put_free(struct virtio_gpu_object_array *objs); void virtio_gpu_array_put_free_delayed(struct virtio_gpu_device *vgdev, struct virtio_gpu_object_array *objs); void virtio_gpu_array_put_free_work(struct work_struct *work); +int virtio_gpu_gem_pin(struct virtio_gpu_object *bo); +void virtio_gpu_gem_unpin(struct virtio_gpu_object *bo); /* virtgpu_vq.c */ int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev); diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c index 7db48d17ee3a..625c05d625bf 100644 --- a/drivers/gpu/drm/virtio/virtgpu_gem.c +++ b/drivers/gpu/drm/virtio/virtgpu_gem.c @@ -294,3 +294,22 @@ void virtio_gpu_array_put_free_work(struct work_struct *work) } spin_unlock(&vgdev->obj_free_lock); } + +int virtio_gpu_gem_pin(struct virtio_gpu_object *bo) +{ + int err; + + if (virtio_gpu_is_shmem(bo)) { + err = drm_gem_shmem_pin(&bo->base); + if (err) + return err; + } + + return 0; +} + +void virtio_gpu_gem_unpin(struct virtio_gpu_object *bo) +{ + if (virtio_gpu_is_shmem(bo)) + drm_gem_shmem_unpin(&bo->base); +} diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index a2e045f3a000..def57b01a826 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c @@ -238,20 +238,28 @@ static int virtio_gpu_plane_prepare_fb(struct drm_plane *plane, struct virtio_gpu_device *vgdev = dev->dev_private; struct virtio_gpu_framebuffer *vgfb; struct virtio_gpu_object *bo; + int err; if (!new_state->fb) return 0; vgfb = to_virtio_gpu_framebuffer(new_state->fb); bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]); - if (!bo || (plane->type == DRM_PLANE_TYPE_PRIMARY && !bo->guest_blob)) + + err = virtio_gpu_gem_pin(bo); + if (err) + return err; + + if (plane->type == DRM_PLANE_TYPE_PRIMARY && !bo->guest_blob) return 0; if (bo->dumb && (plane->state->fb != new_state->fb)) { vgfb->fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 0); - if (!vgfb->fence) + if (!vgfb->fence) { + virtio_gpu_gem_unpin(bo); return -ENOMEM; + } } return 0; @@ -261,15 +269,20 @@ static void virtio_gpu_plane_cleanup_fb(struct drm_plane *plane, struct drm_plane_state *state) { struct virtio_gpu_framebuffer *vgfb; + struct virtio_gpu_object *bo; if (!state->fb) return; vgfb = to_virtio_gpu_framebuffer(state->fb); + bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]); + if (vgfb->fence) { dma_fence_put(&vgfb->fence->f); vgfb->fence = NULL; } + + virtio_gpu_gem_unpin(bo); } static void virtio_gpu_cursor_plane_update(struct drm_plane *plane, -- 2.41.0