Add extended shared memory attach support

This provides an extended version of ‘create_pool’, called
‘create_pool2’, which allows the client to specify a 64-bit offset in
the file to map at.  As Wayland does not support 64-bit integers, the
offset is passed as two 32-bit numbers.

The intended use-case for this extension is when one needs to map a
surface from a character special device, but it can also be used with
regular files if one needs to map with a nonzero offset.  Qubes OS needs
the Wayland compositor to map the ‘/dev/xen/gntdev’ character device,
which represents memory shared by a different Xen virtual machine.
Currently, this can be accomplished by opening a separate instance of
‘/dev/xen/gntdev’ every time, but that is slightly wasteful.  Until
recently, it also on undocumented behavior in the kernel driver.

This also requires libwayland-server to be built with 64-bit off_t,
which should be supported on any reasonably modern system.  A
‘_Static_assert’ will trip if off_t is not large enough.

This also forbids resizing a pool of version 3 or later that is
currently in use.  On non-Linux systems, supporting pool resize requires
holding the file descriptor open, which can lead to file descriptor
exhaustion in the compositor.  This change allows libwayland-server to
close the file descriptor once the pool is first mapped.

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
This commit is contained in:
Demi Marie Obenour 2021-11-08 07:01:06 -05:00
parent aa2a6d560b
commit d5cf2f5fc7
4 changed files with 144 additions and 42 deletions

View file

@ -105,8 +105,10 @@ formats = {}
for ident, val in idents.items():
formats[drm_format_to_wl(ident)] = val.lower()
# Special case for ARGB8888 and XRGB8888
formats["argb8888"] = "0"
formats["xrgb8888"] = "1"
for (i, j) in enumerate(("argb8888", "xrgb8888")):
formats[j + "_new"] = formats[j]
descriptions[j + "_new"] = descriptions[j]
formats[j] = str(i)
print("Loaded {} formats from drm_fourcc.h".format(len(formats)), file=sys.stderr)