Received: by 10.223.185.116 with SMTP id b49csp3700406wrg; Tue, 13 Feb 2018 06:29:00 -0800 (PST) X-Google-Smtp-Source: AH8x224Nas00kCfvZihPHhnrnUmT/GW9tiHxSrMIJ66t09EsxEiKFaANDa48P1BH7GPiKDXNGDpY X-Received: by 10.167.130.12 with SMTP id k12mr1428370pfi.73.1518532140823; Tue, 13 Feb 2018 06:29:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518532140; cv=none; d=google.com; s=arc-20160816; b=DvfFjebUGF3j1vUNRI4h2dFVn5t2xEQ2sRwa9GaqOYhtv/wHUfY1t0LYuGYWrD/lK5 B9f0pCae+EBocFbDQAm0DAW3EvhUHphp4MqO0527J7MgY5nfQL9QKVtbqF7B9CIY+Zz0 5ds3lz8P3ni9vkHKLxI2Ah44898puKcs+W24b+Kl2cIZ8vv3+2smmVQT3PfmTqEVLCFr Yo9InVYwuw2BuTdneDouzh+ponrufntQwzWVQu1ZaM57AA5qrgHkQ7EMtBK+VOHPoGdp LxfzqWYmeeTkeIQ4S/8FngMmSk4kN7WXIoYJF3QM48GVQ30IAbTLgFau11EoAzWbYcwQ BOEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=lI0ZzjyLlj014Qdrg+N3T0pEbh74gKLwRHUL2VSyOVw=; b=Dkkqm0q/FHW2Io+HAbmJB2qrP6Yy3IC1cl2H9lkBr8ca1BUKdCsHzJ/yhEizsrjPN3 CudFZ69Y0IzNurtr4L8LWAzteb+GZCbrRMcvd8MHlh4gcBzbpiK65f401KegygJPQjfv 5qJgjj5yw66U3g0uytQplYyxuOghtV1UJxCbpCh999rumDanqRGEFaLXqMzWgqlB/Hbz zBm3BMzuvqFhkOv1RGWJss7GAJY9cCHKC/qxrXXNg7xgcv1yIdX5JEm+oAEpz2ootULV H+LKvMa0U0FMTU9cxWAOJ5DqZZKU+YbllNRwf4X5KJK7Ne5MQXFPMxIm5TVZAJu5mmgy 5kwQ== ARC-Authentication-Results: i=1; mx.google.com; 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 e17si1169511pgo.189.2018.02.13.06.28.46; Tue, 13 Feb 2018 06:29:00 -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; 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 S935394AbeBMO2D (ORCPT + 99 others); Tue, 13 Feb 2018 09:28:03 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:45122 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933612AbeBMO2A (ORCPT ); Tue, 13 Feb 2018 09:28:00 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: tomeu) with ESMTPSA id 390C5264F74 Subject: Re: [PATCH v3 1/2] drm/virtio: Add window server support To: Gerd Hoffmann Cc: linux-kernel@vger.kernel.org, Zach Reizner , kernel@collabora.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, "Michael S. Tsirkin" , David Airlie , Jason Wang , Stefan Hajnoczi References: <20180126135803.29781-1-tomeu.vizoso@collabora.com> <20180126135803.29781-2-tomeu.vizoso@collabora.com> <20180201163623.5cs2ysykg5wgulf4@sirius.home.kraxel.org> <49785e0d-936a-c3b4-62dd-aafc7083a942@collabora.com> <20180205122017.4vb5nlpodkq2uhxa@sirius.home.kraxel.org> <20180205160322.sntv5uoqp5o7flnh@sirius.home.kraxel.org> <20180206142302.vdjyqmnoypydci4t@sirius.home.kraxel.org> <04687943-847b-25a7-42ef-a21b4c7ef0cf@collabora.com> <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> From: Tomeu Vizoso Message-ID: <37179029-8ccb-8eb2-0901-04b64cef3608@collabora.com> Date: Tue, 13 Feb 2018 15:27:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/12/2018 12:45 PM, Gerd Hoffmann wrote: > Hi, > >>> (a) software rendering: client allocates shared memory buffer, renders >>> into it, then passes a file handle for that shmem block together >>> with some meta data (size, format, ...) to the wayland server. >>> >>> (b) gpu rendering: client opens a render node, allocates a buffer, >>> asks the cpu to renders into it, exports the buffer as dma-buf >>> (DRM_IOCTL_PRIME_HANDLE_TO_FD), passes this to the wayland server >>> (again including meta data of course). >>> >>> Is that correct? >> >> Both are correct descriptions of typical behaviors. But it isn't spec'ed >> anywhere who has to do the buffer allocation. > > Well, according to Pekka's reply it is spec'ed that way, for the > existing buffer types. So for server allocated buffers you need > (a) a wayland protocol extension and (b) support for the extension > in the clients. > >> That's to say that if we cannot come up with a zero-copy solution for >> unmodified clients, we should at least support zero-copy for cooperative >> clients. > > "cooperative clients" == "client which has support for the wayland > protocol extension", correct? Guess it could be that, but I was rather thinking of clients that would allocate the buffer for wl_shm_pool with DRM_VIRTGPU_RESOURCE_CREATE or equivalent. Then that buffer would be exported and the fd passed using the standard wl_shm protocol. >>>> 4. QEMU maps that buffer to the guest's address space >>>> (KVM_SET_USER_MEMORY_REGION), passes the guest PFN to the virtio driver >>> >>> That part is problematic. The host can't simply allocate something in >>> the physical address space, because most physical address space >>> management is done by the guest. All pci bars are mapped by the guest >>> firmware for example (or by the guest OS in case of hotplug). >> >> How can KVM_SET_USER_MEMORY_REGION ever be safely used then? I would have >> expected that callers of that ioctl have enough knowledge to be able to >> choose a physical address that won't conflict with the guest's kernel. > > Depends on the kind of region. Guest RAM is allocated and mapped by > qemu, guest firmware can query qemu about RAM mappings using a special > interface, then create a e820 memory map for the guest os. PCI device > bars are mapped according to the pci config space registers, which in > turn are initialized by the guest firmware, so it is basically in the > guests hand where they show up. > >> I see that the ivshmem device in QEMU registers the memory region in BAR 2 >> of a PCI device instead. Would that be better in your opinion? > > Yes. Would it make sense for virtio-gpu to map buffers to the guest via PCI BARs? So we can use a single drm driver for both 2d and 3d. >>>> 4. QEMU pops data+buffers from the virtqueue, looks up shmem FD for each >>>> resource, sends data + FDs to the compositor with SCM_RIGHTS >>> >>> BTW: Is there a 1:1 relationship between buffers and shmem blocks? Or >>> does the wayland protocol allow for offsets in buffer meta data, so you >>> can place multiple buffers in a single shmem block? >> >> The latter: >> https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_shm_pool > > Ah, good, that makes it alot easier. > > So, yes, using ivshmem would be one option. Tricky part here is the > buffer management though. It's just a raw piece of memory. The guest > proxy could mmap the pci bar and manage it. But then it is again either > unmodified guest + copying the data, or modified client (which requests > buffers from guest proxy) for zero-copy. > > Another idea would be extending stdvga. Basically qemu would have to > use shmem as backing storage for vga memory instead of anonymous memory, > so it would be very simliar to ivshmem on the host side. But on the > guest side we have a drm driver for it (bochs-drm). So clients can > allocate dumb drm buffers for software rendering, and the buffer would > already be backed by a host shmem segment. Given that wayland already > supports drm buffers for 3d rendering that could work without extending > the wayland protocol. The client proxy would have to translate the drm > buffer into an pci bar offset and pass it to the host side. The host > proxy could register the pci bar as wl_shm_pool, then just pass through > the offset to reference the individual buffers. > > Drawback of both approaches would be that software rendering and gpu > rendering would use quite different code paths. Yeah, would be great if we could find a way to avoid that. > We also need a solution for the keymap shmem block. I guess the keymap > doesn't change all that often, so maybe it is easiest to just copy it > over (host proxy -> guest proxy) instead of trying to map the host shmem > into the guest? I think that should be fine for now. Something similar will have to happen for the clipboard, which currently uses pipes to exchange data. Thanks, Tomeu