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

Emil Velikov emil.l.velikov at gmail.com
Wed Nov 30 16:16:55 UTC 2016


On 30 November 2016 at 00:15, Jonathan Gray <jsg at jsg.id.au> wrote:
> 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);
>
Far better, thanks !

>>
>>  - 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 ?
>>
... and to answer my question - the control/render node names are
already set/defined for OpenBSD.
Memory is failing :-\

-Emil


More information about the dri-devel mailing list