Wayland intermediate sized data transfer
Simon Ser
contact at emersion.fr
Sat Dec 15 23:21:43 UTC 2018
On Monday, November 12, 2018 2:54 PM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> On Mon, 12 Nov 2018 14:48:19 +0200
> Pekka Paalanen ppaalanen at gmail.com wrote:
>
> > Quite likely we need to revisit this in any case. Using shared memory
> > feels complicated, but OTOH it is relatively lot of data. Even the
> > kernel UABI does not use a flat list of format+modifier but a fairly
> > "interesting" bitfield encoding. That's probably not appropriate for
> > Wayland though, so maybe we have to use shared memory for it.
>
> Hi,
>
> having thought about this, I have the feeling that Wayland handles well
> tiny bits of data as protocol messages and large chunks of data as
> shared memory file descriptors, but it seems we lack a good solution
> for intermediate sized bits of data in the range 1 kB - 8 kB, just to
> throw some random numbers up.
>
> It is too risky to put these through the protocol messages in line, but
> the trouble of setting up a shared memory file seems disproportionate
> to the amount of data. Yet, it seems that setting up a shared memory
> file is the only solution since the in line data is too risky.
>
> I started wondering if we should have a generic shared memory
> interface, something like the following sketch of a Wayland extension.
>
> interface shm_factory
> Is the global.
>
> - request: create_shm_file(new shm_file, fd, size, seals, direction)
> Creates a new shm_file object that refers to the memory backing
> the fd, of the given size, and being sealed with the mentioned
> seals. Direction means whether the server or the client will be
> the writer, so this will be a one-way street but a re-usable
> one.
>
> (This is a good chance to get memfd and seals properly used.)
>
> interface shm_file
> Represents a piece of shared memory. Comes in two mutually
> exclusive flavours:
> - server-writable
> - client-writable
> Has a fixed size.
>
> The usage pattern is that the writer signals the reader when it
> needs to copy the data out. This is done by a custom protocol
> message carrying a shm_file as an argument, which makes the
> shm_file read-locked. The reader copies the data out of the
> shared memory and sends client_read_done or server_read_done
> ASAP, releasing the read-lock. While the shm_file is
> read-locked, the writer may not write into it. While the
> shm_file is not read-locked, the reader may not read it.
>
> - request: client_read_done
> Sent by the client when it has copied the data out. Releases
> the read-lock.
>
> - event: server_read_done
> Sent by the server when it has copied the data out. Releases
> the read-lock.
>
> When e.g. zwp_linux_dmabuf would provide the list of pixel formats and
> modifiers, the server needs to first send the required shared memory
> size to the client, the client creates a server-writable shm_file, and
> sends it to the server. The server fills in the data and sends an event
> with the shm_file as an argument that tell the client to read it (sets
> the read-lock). The rest goes according to the the generic protocol
> above.
>
> Why all the roundtripping to get the shm_file created?
>
> Because I would prefer the memory allocation is always
> accounted to the client, not the server. We should try to keep
> server allocations on behalf of clients to a minimum so that
> OOM killer etc. can find the right culprit.
>
> Why so much copying?
>
> Because the amount of data should be small enough that copying
> it is insignificant. By assuming that readers maintain their
> own copy, the protocol is simpler. No need to juggle multiple
> shm_files like we do with wl_buffers.
>
> Why unidirectional?
>
> To keep it simple. Need bidirectional transfers? Make one
> shm_file for each direction.
>
> Isn't creating and tearing down shared memory relatively expensive?
>
> Yes, but shm_file is meant to be repeatedly re-used. After
> reader has read, the writer can write again. No need to tear it
> down, if you expect repeated transfers.
>
> While writing this, I have a strong feeling I am reinventing the wheel
> here...
>
> Just throwing this idea out there, not sure if it was a good one.
>
> Thanks,
> pq
>
Hi,
I've been thinking about this for a while, and I've been wondering: if we do
a copy, why not use a pipe directly?
Thanks,
Simon
More information about the wayland-devel
mailing list