[PATCH libdrm] libdrm: Allow dynamic drm majors on linux

Eric Engestrom eric.engestrom at intel.com
Fri Aug 31 12:15:56 UTC 2018


On Friday, 2018-08-31 13:54:19 +0200, Thomas Hellstrom wrote:
> To determine whether a device node is a drm device node or not, the code
> currently compares the node's major number to the static drm major device
> number.
> 
> This breaks the standalone vmwgfx driver on XWayland dri clients,
> https://cgit.freedesktop.org/mesa/vmwgfx
> and any future attempt to introduce dynamic device numbers for drm.
> 
> So instead of checking for the device major, instead check for the presence
> of the /sys/dev/char/<major>:<minor>/device/drm directory.

Just FYI, this means it now matches /dev/fb0 too.

I don't think this will be an issue, but just pointing it out so people notice.

> 
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
>  xf86drm.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/xf86drm.c b/xf86drm.c
> index 7807dce9..4cfc5d3e 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2761,6 +2761,21 @@ char *drmGetDeviceNameFromFd(int fd)
>      return strdup(name);
>  }
>  
> +static bool
> +drmNodeIsDRM(int maj, int min)
> +{
> +#ifdef __linux__
> +  char path[64];
> +  struct stat sbuf;
> +
> +  snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device/drm",
> +	   maj, min);

Nit: mixing tabs and space on this line.

With that fixed:
Reviewed-by: Eric Engestrom <eric.engestrom at intel.com>

> +  return stat(path, &sbuf) == 0;
> +#else
> +  return maj == DRM_MAJOR;
> +#endif
> +}
> +
>  int drmGetNodeTypeFromFd(int fd)
>  {
>      struct stat sbuf;
> @@ -2772,7 +2787,7 @@ int drmGetNodeTypeFromFd(int fd)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode)) {
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode)) {
>          errno = EINVAL;
>          return -1;
>      }
> @@ -2837,7 +2852,7 @@ static char *drmGetMinorNameForFD(int fd, int type)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return NULL;
>  
>      snprintf(buf, sizeof(buf), "/sys/dev/char/%d:%d/device/drm", maj, min);
> @@ -2871,7 +2886,7 @@ static char *drmGetMinorNameForFD(int fd, int type)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return NULL;
>  
>      switch (type) {
> @@ -3731,7 +3746,7 @@ process_device(drmDevicePtr *device, const char *d_name,
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return -1;
>  
>      subsystem_type = drmParseSubsystemType(maj, min);
> @@ -3845,7 +3860,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return -EINVAL;
>  
>      node_type = drmGetMinorType(min);
> @@ -3911,7 +3926,7 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return -EINVAL;
>  
>      subsystem_type = drmParseSubsystemType(maj, min);
> @@ -4071,7 +4086,7 @@ char *drmGetDeviceNameFromFd2(int fd)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return NULL;
>  
>      snprintf(path, sizeof(path), "/sys/dev/char/%d:%d", maj, min);
> @@ -4097,7 +4112,7 @@ char *drmGetDeviceNameFromFd2(int fd)
>      maj = major(sbuf.st_rdev);
>      min = minor(sbuf.st_rdev);
>  
> -    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> +    if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
>          return NULL;
>  
>      node_type = drmGetMinorType(min);
> -- 
> 2.18.0.rc1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list