[PATCH libdrm 1/5] xf86drm: implement drmGetMinorNameForFD for non-sysfs

Jonathan Gray jsg at jsg.id.au
Wed Nov 30 00:15:43 UTC 2016


On Tue, Nov 29, 2016 at 07:22:34PM +0000, Emil Velikov wrote:
> On 26 November 2016 at 00:40, Jonathan Gray <jsg at jsg.id.au> wrote:
> > Implement drmGetMinorNameForFD for systems without sysfs by
> > adapting drm_get_device_name_for_fd() from the Mesa loader.
> >
> > Signed-off-by: Jonathan Gray <jsg at jsg.id.au>
> > ---
> >  xf86drm.c | 20 +++++++++++++++++++-
> >  1 file changed, 19 insertions(+), 1 deletion(-)
> >
> > diff --git a/xf86drm.c b/xf86drm.c
> > index ed924a7..216220c 100644
> > --- a/xf86drm.c
> > +++ b/xf86drm.c
> > @@ -2818,7 +2818,25 @@ static char *drmGetMinorNameForFD(int fd, int type)
> >  out_close_dir:
> >      closedir(sysdir);
> >  #else
> > -#warning "Missing implementation of drmGetMinorNameForFD"
> > +    struct stat sbuf;
> > +    unsigned int maj, min;
> > +    char buf[PATH_MAX + 1];
> > +    int n;
> > +
> > +    if (fstat(fd, &sbuf))
> > +        return NULL;
> > +
> > +    maj = major(sbuf.st_rdev);
> > +    min = minor(sbuf.st_rdev);
> > +
> > +    if (maj != DRM_MAJOR || !S_ISCHR(sbuf.st_mode))
> > +        return NULL;
> > +
> > +    n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, min);
> > +    if (n == -1 || n >= sizeof(buf))
> > +        return NULL;
> > +
> > +    return strdup(buf);
> Doesn't look too good I'm afraid:
>  - you ignore the node type, making the whole helper and API that
> depends on it useless.
> Note: mesa wants to know the render node name for the given fd. We can
> replace with drmGetDevice but I'd like to check the double-auth [and
> related fun] trimming things down before changing things.

It could be changed to handle the type along the lines of

    base = drmGetMinorBase(type);

    if (min < base)
      return -EINVAL;

    switch (type) {
    case DRM_NODE_PRIMARY:
        dev_name = DRM_DEV_NAME;
        break;
    case DRM_NODE_CONTROL:
        dev_name = DRM_CONTROL_DEV_NAME;
        break;
    case DRM_NODE_RENDER:
        dev_name = DRM_RENDER_DEV_NAME;
        break;
    default:
        return -EINVAL;
    };

    n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min - base);

> 
>  - implementation seems identical to drmGetDeviceNameFromFd(). Barring
> a few trivial bits of course.
> Speaking of which there is drmGetDeviceNameFromFd2 which attributes
> for any node type(s) - the present primary, control and render plus
> any future ones.
> I'm leaning towards using it in the next (or one after) version in mesa.
> 
> Have you and fellow OpenBSD developers considered render nodes. Do you
> have any preliminary ideas how it will be exposed, such that you can
> build a comprehensive interface here ?
> 
> Thanks
> Emil


More information about the dri-devel mailing list