diff mbox

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

Message ID 20161126004034.53376-1-jsg@jsg.id.au (mailing list archive)
State New, archived
Headers show

Commit Message

Jonathan Gray Nov. 26, 2016, 12:40 a.m. UTC
Implement drmGetMinorNameForFD for systems without sysfs by
adapting drm_get_device_name_for_fd() from the Mesa loader.

Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
---
 xf86drm.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

Comments

Emil Velikov Nov. 29, 2016, 7:22 p.m. UTC | #1
On 26 November 2016 at 00:40, Jonathan Gray <jsg@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@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.

 - 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
Jonathan Gray Nov. 30, 2016, 12:15 a.m. UTC | #2
On Tue, Nov 29, 2016 at 07:22:34PM +0000, Emil Velikov wrote:
> On 26 November 2016 at 00:40, Jonathan Gray <jsg@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@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
Emil Velikov Nov. 30, 2016, 4:16 p.m. UTC | #3
On 30 November 2016 at 00:15, Jonathan Gray <jsg@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@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@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
diff mbox

Patch

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);
 #endif
     return NULL;
 }