[PATCH 0/9] uapi: drm: fixes for userspace compilation

Emil Velikov emil.l.velikov at gmail.com
Tue Nov 17 14:00:43 PST 2015


On 17 November 2015 at 20:13, Dave Airlie <airlied at gmail.com> wrote:
>>
>> The kernel UAPI headers:
>>  - Used by the kernel modules and userspace(?)
>>  - Installed in /usr/include/drm
>>  - Many distributions do _not_ ship them
>>  - Broken for years (mostly fixed with Mikko's earlier patches)
>>  - For the above two reasons - most (all?) userspace uses the libdrm ones.
>
> No userspace uses them at all. Hence why we tend not to care less.
>
> Userspace has never used them, and I'm not sure why userspace would
> need to use them at this point.
>
>>
>> The libdrm headers:
>>  - Mostly preprocessed version of the above, used solely by userspace
>>  - Installed in /usr/include/libdrm
>>  - All distros ship them
>>  - Desperately out of sync wrt the above
>
> I don't think they are that out of sync, it would be impossible for userspace
> to use new kernel features if they were that out of sync.
>
I beg to differ. And the following diff stat seems to confirm it. Note
that we have a massive hunk of #ifndef-erry in mesa
(src/gallium/winsys/drm/radeon) and a fair bit in IGT (some of which
to keep libdrm requirement low). There is also a ton in the intel ddx,
but that's mostly because they don't like to zero initialise (use c99
initializers for) drm structs. Last time I've looked weston also had a
few.

 exynos/exynos_drm.h       | 236 ++++++++++++++--
 freedreno/msm/msm_drm.h   | 103 ++++---
 include/drm/amdgpu_drm.h  |   2 +-
 include/drm/drm.h         |  66 +++--
 include/drm/drm_fourcc.h  |  17 +-
 include/drm/drm_mode.h    | 165 +++++++-----
 include/drm/drm_sarea.h   |   6 +-
 include/drm/i915_drm.h    |  46 +++-
 include/drm/mga_drm.h     |   6 +-
 include/drm/nouveau_drm.h |  99 ++-----
 include/drm/qxl_drm.h     |   2 +-
 include/drm/r128_drm.h    |   2 +
 include/drm/radeon_drm.h  |  44 ++-
 include/drm/savage_drm.h  |  12 +-
 include/drm/sis_drm.h     |   8 +-
 include/drm/tegra_drm.h   |   5 +-
 include/drm/via_drm.h     |   6 +-
 include/drm/vmwgfx_drm.h  | 674 +++++++++++++++++++++++++++++++++++++++-------
 omap/omap_drm.h           |  46 ++--
 19 files changed, 1125 insertions(+), 420 deletions(-)

Not to mention the missing {armada,i810,virtgpu}_drm.h. Fwiw I'm the
one guilty for i810 one - there haven't been any users for it so I
nuked it. Can bring it back if people prefer. On the armada front I'm
leaning towards that we should nuke the header as it's for a DC only
device.

>> With the above said:
>>  - I was thinking about hiding the UAPI ones, although Dave suggested
>> against it.
>
> They are a legitimate kernel API, and show be exposed, probably
> should be made more useable outside the kernel, but for now
> using them inside the kernel is their primary use case.
>
I never suggested that there should be no way for userspace to get
access to them. libdrm seems like a good enough candidate imho. It
takes care of any specific that may or may not be needed, it's used
(almost?) everywhere and existing userspace just works :)

>>  - Doing s|drm/drm.h|drm.h| will break compilation:
>>    + for the kernel - as we don't add the foo/drm/ to the include directive,
>>    + for any hacked up userspace - very unlikely that they have the
>> include, considering that things work without it.
>>  - Differences wrt libdrm userspace - all of which can be handled with
>> simple sed
>>    + __KERNEL__ never defined so we can just ignore it
>>    + __user
>>    + drm/drm.h
>>    + others ?
>
> The kernel header geneartion script should strip a lot of stuff out,
> please look at the headers post kernel install not the ones in the
> kernel tree for comparison.
>
> or ones in usr/include/drm inside a built kernel tree.
>
People are like everything else in nature - seeking the path or least
resistance. If you ask them to do 2 steps they will either do them
once in a blue moon, or simply ignore the whole thing, sadly :-(

If we have/need anything fancy - sure lets use the said infra.
Otherwise let's add one line of sed script in libdrm and be done with
it :-P

Cheers,
Emil


More information about the dri-devel mailing list