From patchwork Fri Jan 26 13:58:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 125984 Delivered-To: patch@linaro.org Received: by 10.46.84.92 with SMTP id y28csp352954ljd; Fri, 26 Jan 2018 05:58:51 -0800 (PST) X-Google-Smtp-Source: AH8x224ylHjsBhHOyTa6Rx4QkGq/Cw0HheFV1DtJqK316enFj63d3NmIdp4tvRuvlng4fJpLJfl3 X-Received: by 2002:a17:902:9683:: with SMTP id n3-v6mr14084697plp.177.1516975131555; Fri, 26 Jan 2018 05:58:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516975131; cv=none; d=google.com; s=arc-20160816; b=tXh4BvOAGDCDhYK3dBQbvvIJlaet/VS5KTuhbvXd9WPu6OpvCHdIYEGxArKyQcM6hw qS/sLjE4bX4kqX2wjYKf2+CzggRKKAcicI0g4QqtlYfswx99JwreU9OPLCC011L9mWFE EFGXRAil8Psg+OOkdxo4XSo+ZV0pJShpzflk5RuCfHhCZiPLrEwL2qHnOiLhyvFQkfsR Ym5MR0WetSHDjDwREVL40mYaJG9riPofFSITOm8SIhCEg7nUYkclI9K1wgJQoVfDMB5R nidc+nLsypoDuf+I0imUjUhbj+oBN74xV8+BgkzIZ9PrKaNaA96QDtrMAPccIZNh1XAd G5cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=EK/Hg/YN7WzYLMliKDElUmSFxLjQPmm4IiBK5bRf1yk=; b=Ps1ImPUCzufkcd1RSL4/EJHrtKFkAzC5R/ab0nIP4+Vj68DCm/W30ZIYCGU/dpn19F 5EkX6Nn6yuxUuuzymNj+4in25TcjDW7p8UwJXOU5eFMDuSlhL6MQrvHlODsFxIhavZjP JLlAg9339lS3vX8SWdQy/iK4bNqGX2eGrE3wnlU0vbIG2DOgqLB4kCJLOdl64Z2hbFQT ad+YE/JsWjCGbi3rgwtC/j2q2ppTfsgU5wqqkBUeT6NL64X9FohuXs3h7piCFmujDGJK y4g3v2YtXzm74OP+5elqKZu2QVm8HNQgrOnCX/lBVdLAL+v2Fmo/esx4NB3cZWc64Gq9 JLlw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=RzGGTHJ9; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s6si3050975pgr.221.2018.01.26.05.58.51; Fri, 26 Jan 2018 05:58:51 -0800 (PST) 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=fail header.i=@gmail.com header.s=20161025 header.b=RzGGTHJ9; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753066AbeAZN6f (ORCPT + 28 others); Fri, 26 Jan 2018 08:58:35 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:34856 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752842AbeAZN6R (ORCPT ); Fri, 26 Jan 2018 08:58:17 -0500 Received: by mail-wm0-f68.google.com with SMTP id r78so21437348wme.0 for ; Fri, 26 Jan 2018 05:58:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=EK/Hg/YN7WzYLMliKDElUmSFxLjQPmm4IiBK5bRf1yk=; b=RzGGTHJ9pFvZ0XZ3P6ZuWFW9HZS4XNtwys95zeMy9iNvVF5Wrw+zSb171EUw6njt8V hIMW8BarMHhtjsHhLpLMtDY4G8SZCbowh3RE9c4bYEIeMY/z/jwMQlVeJsVcicTD2cV9 9wJXoZl3EQWpGSXDuzZXIi4qmG2CkwwIdM3UaCNEf/YwtXpwjHp1UjbVPFcJy59VrcX8 I06wEG8RVIYHfjEJ7kuGHCq3/ZHXRmuSosIPKzjQaLfnbau+ubWgpBNhjzn9eY9dVqm3 Nbyhh+bKAyv1r4LeGcU+L1E/jXLyDwCVkZznWnwdGfo+hsf523CdjbNeFUgIs+r+ffBr Ajaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=EK/Hg/YN7WzYLMliKDElUmSFxLjQPmm4IiBK5bRf1yk=; b=Y4yo12/O9eR+4NhVXcp06Bc5jBpBfXH5r1FXxoSKcu1ZyHDBybht0PYAejMRHd+YZ4 vm8n5BneUk4dJQqYxjb3mJpqAaHhdbGSlG4E7SIAdk0y/FGRauLlSgFOYBTM+pQXBaQp Hb8W0m2n/4j8Dlf+Oo0Oodx6oburaP4PMxHli/AFWKbQJ0c1+qKWjruBf8NKE+nH22tg nw+w6WnZK48XHS3+CPa2GzXckDS69iwfdWuyeSqQ5kPD2gXbbvQbQ+iKdku6PotlRIop BjOLj7KWzDlwSJKqBvqkZXOnNrXiAK6PLOO4RUWQgzQoZgqaSK8StDGVUovoJ4ecqB38 yMyg== X-Gm-Message-State: AKwxytfWSkZp0nDYXJ8bXD7Lhbx9/ue3V4nDYW3Oxm8e5Ri1c6a0TLpl jPENUQBPv4krCjK399bzhba5Kc6M X-Received: by 10.28.20.8 with SMTP id 8mr10395743wmu.106.1516975096315; Fri, 26 Jan 2018 05:58:16 -0800 (PST) Received: from cizrna.lan ([109.72.12.188]) by smtp.gmail.com with ESMTPSA id c19sm3674481wmd.5.2018.01.26.05.58.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 26 Jan 2018 05:58:15 -0800 (PST) From: Tomeu Vizoso To: linux-kernel@vger.kernel.org Cc: Zach Reizner , kernel@collabora.com, Tomeu Vizoso , David Airlie , Gerd Hoffmann , dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org Subject: [PATCH v3 2/2] drm/virtio: Handle buffers from the compositor Date: Fri, 26 Jan 2018 14:58:02 +0100 Message-Id: <20180126135803.29781-3-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180126135803.29781-1-tomeu.vizoso@collabora.com> References: <20180126135803.29781-1-tomeu.vizoso@collabora.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When retrieving queued messages from the compositor in the host for clients in the guest, handle buffers that may be passed. These buffers should have been mapped to the guest's address space, for example via the KVM_SET_USER_MEMORY_REGION ioctl. Signed-off-by: Tomeu Vizoso --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) -- 2.14.3 diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index d4230b1fa91d..57b1ad51d251 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -545,14 +545,58 @@ static unsigned int winsrv_poll(struct file *filp, return mask; } +struct virtio_gpu_winsrv_region { + uint64_t pfn; + size_t size; +}; + +static int winsrv_fd_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct virtio_gpu_winsrv_region *region = filp->private_data; + unsigned long vm_size = vma->vm_end - vma->vm_start; + int ret = 0; + + if (vm_size + + (vma->vm_pgoff << PAGE_SHIFT) > PAGE_ALIGN(region->size)) + return -EINVAL; + + ret = io_remap_pfn_range(vma, vma->vm_start, region->pfn, vm_size, + vma->vm_page_prot); + if (ret) + return ret; + + vma->vm_flags |= VM_PFNMAP | VM_IO | VM_DONTEXPAND | VM_DONTDUMP; + + return ret; +} + +static int winsrv_fd_release(struct inode *inodep, struct file *filp) +{ + struct virtio_gpu_winsrv_region *region = filp->private_data; + + kfree(region); + + return 0; +} + +static const struct file_operations winsrv_fd_fops = { + .mmap = winsrv_fd_mmap, + .release = winsrv_fd_release, +}; + static int winsrv_ioctl_rx(struct virtio_gpu_device *vgdev, struct virtio_gpu_winsrv_conn *conn, struct drm_virtgpu_winsrv *cmd) { struct virtio_gpu_winsrv_rx_qentry *qentry, *tmp; struct virtio_gpu_winsrv_rx *virtio_cmd; + struct virtio_gpu_winsrv_region *region; int available_len = cmd->len; int read_count = 0; + int i; + + for (i = 0; i < VIRTGPU_WINSRV_MAX_ALLOCS; i++) + cmd->fds[i] = -1; list_for_each_entry_safe(qentry, tmp, &conn->cmdq, next) { virtio_cmd = qentry->cmd; @@ -567,6 +611,16 @@ static int winsrv_ioctl_rx(struct virtio_gpu_device *vgdev, return -EFAULT; } + for (i = 0; virtio_cmd->pfns[i]; i++) { + region = kmalloc(sizeof(*region), GFP_KERNEL); + region->pfn = virtio_cmd->pfns[i]; + region->size = virtio_cmd->lens[i]; + cmd->fds[i] = anon_inode_getfd("[winsrv_fd]", + &winsrv_fd_fops, + region, + O_CLOEXEC | O_RDWR); + } + available_len -= virtio_cmd->len; read_count += virtio_cmd->len;