From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 37815CA9EAE for ; Tue, 29 Oct 2019 14:32:50 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 01FDA2087E for ; Tue, 29 Oct 2019 14:32:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=hostfission.com header.i=@hostfission.com header.b="xMEFJQmW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 01FDA2087E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=hostfission.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:57750 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iPSYD-0004Sj-5j for qemu-devel@archiver.kernel.org; Tue, 29 Oct 2019 10:32:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34443) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iPSXM-0003oX-4D for qemu-devel@nongnu.org; Tue, 29 Oct 2019 10:31:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iPSXI-0008KH-SS for qemu-devel@nongnu.org; Tue, 29 Oct 2019 10:31:55 -0400 Received: from mail1.hostfission.com ([139.99.139.48]:58716) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1iPSXF-0008Gi-JE for qemu-devel@nongnu.org; Tue, 29 Oct 2019 10:31:50 -0400 Received: from www1.hostfission.com (www1.hostfission.com [139.99.139.52]) by mail1.hostfission.com (Postfix) with ESMTP id 31C944BA08 for ; Wed, 30 Oct 2019 01:31:42 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hostfission.com; s=mail; t=1572359502; bh=GR2WUNdsqxs5OyiHgrm+E2Ii7l/sjRDk4Ictleq6Y/Y=; h=To:Subject:Date:From:From; b=xMEFJQmWKjarqY/FwDBcJeUtWCM6GiuM9JAK5Urxe5Q6P/PneEftv+nYZf68NTr7i OJ6OAw3l3LVi3O1IH5q3VtxvvLrWNsfgD6hF/eNSsaf0uS4TItVhCkyFO+VJ4kgKM5 4kdkfrpV77vx908qs2UWLYoS+wvrtM8ZpKfQzbDk= Received: by www1.hostfission.com (Postfix, from userid 1000) id 20CDC83472; Wed, 30 Oct 2019 01:31:42 +1100 (AEDT) To: qemu-devel@nongnu.org Subject: RFC: New device for zero-copy VM memory access X-PHP-Originating-Script: 0:rcube.php MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 30 Oct 2019 01:31:42 +1100 From: geoff@hostfission.com Message-ID: X-Sender: geoff@hostfission.com User-Agent: Roundcube Webmail/1.2.3 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 139.99.139.48 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Hi All, Over the past week, I have been working to come up with a solution to the memory transfer performance issues that hinder the Looking Glass Project. Currently Looking Glass works by using the IVSHMEM shared memory device which is fed by an application that captures the guest's video output. While this works it is sub-optimal because we first have to perform a CPU copy of the captured frame into shared RAM, and then back out again for display. Because the destination buffers are allocated by closed proprietary code (DirectX, or NVidia NvFBC) there is no way to have the frame placed directly into the IVSHMEM shared ram. This new device, currently named `introspection` (which needs a more suitable name, porthole perhaps?), provides a means of translating guest physical addresses to host virtual addresses, and finally to the host offsets in RAM for file-backed memory guests. It does this by means of a simple protocol over a unix socket (chardev) which is supplied the appropriate fd for the VM's system RAM. The guest (in this case, Windows), when presented with the address of a userspace buffer and size, will mlock the appropriate pages into RAM and pass guest physical addresses to the virtual device. This device and the windows driver have been designed in such a way that it's a utility device for any project and/or application that could make use of it. The PCI subsystem vendor and device ID are used to provide a means of device identification in cases where multiple devices may be in use for differing applications. This also allows one common driver to be used for any other projects wishing to build on this device. My ultimate goal is to get this to a state where it could be accepted upstream into Qemu at which point Looking Glass would be modified to use it instead of the IVSHMEM device. My git repository with the new device can be found at: https://github.com/gnif/qemu The new device is: https://github.com/gnif/qemu/blob/master/hw/misc/introspection.c Looking Glass: https://looking-glass.hostfission.com/ The windows driver, while working, needs some cleanup before the source is published. I intend to maintain both this device and the windows driver including producing a signed Windows 10 driver if Redhat are unwilling or unable. Kind Regards, Geoffrey McRae HostFission https://hostfission.com