Received: by 10.223.176.46 with SMTP id f43csp721614wra; Fri, 26 Jan 2018 05:59:39 -0800 (PST) X-Google-Smtp-Source: AH8x2249iNG//nKT2Gzuhk9pugqfuoqTl89PwF0HOI2V2ubDmJ7p9bB4ZsR74fk9xR30B4apoNOS X-Received: by 2002:a17:902:7595:: with SMTP id j21-v6mr14228404pll.371.1516975178923; Fri, 26 Jan 2018 05:59:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516975178; cv=none; d=google.com; s=arc-20160816; b=XO+h6u0xLocZmNdTrELSZZnhuvoDylg1zoxLYaaXdulZ+UvIkuFAzwObfgwRgwolS5 XSD6W4sXOaRUrzCjAJklIU/bvoe8VH0WzFDsqeBn/uW5BX0df04EZrLm4iZuncMDbOTj TlNG20n5/zPyw8pfZKkAB5z93nRaUQicyc3qtwxiY/R8L6nKfa+TepVsSrF/yn986XQx nsnBrjWShNQWIut7i3V6KG2i03dMqzYSC9wV1NRVJ6ecsjf/PdxOJQGfENm2Lz8A6TEd oP34xWDq+ZAFgLPMVgvk8FKugs69i6sIbTqAKwN7FU1dlITThnhiKl09T8fbdRjz/enH N4fQ== 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 j65si3044897pgc.323.2018.01.26.05.59.25; Fri, 26 Jan 2018 05:59:38 -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 S1753034AbeAZN6e (ORCPT + 99 others); Fri, 26 Jan 2018 08:58:34 -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(+) 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; -- 2.14.3