[PATCH libdrm 02/10] xf86drm: introduce drm_device_has_rdev() helper

Robert Foss robert.foss at collabora.com
Thu Jun 28 10:14:01 UTC 2018


Feel free to add my r-b to this patch.

On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> Currently we match the opened drmDevice fd with each drmDevice we
> process.
> 
> Move that after all the devices are processed and folded, via the
> drm_device_has_rdev(). This makes the code easier to follow and allows
> us to unify the massive process loop across drmGetDevice2 and
> drmGetDevices2. That in itself is coming with a later commit.
> 
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>   xf86drm.c | 34 +++++++++++++++++++++++++---------
>   1 file changed, 25 insertions(+), 9 deletions(-)
> 
> diff --git a/xf86drm.c b/xf86drm.c
> index e1bbbe99..cbc0a408 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -3705,6 +3705,21 @@ drm_device_validate_flags(uint32_t flags)
>           return (flags & ~DRM_DEVICE_GET_PCI_REVISION);
>   }
>   
> +static bool
> +drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
> +{
> +    struct stat sbuf;
> +
> +    for (int i = 0; i < DRM_NODE_MAX; i++) {
> +        if (device->available_nodes & 1 << i) {
> +            if (stat(device->nodes[i], &sbuf) == 0 &&
> +                sbuf.st_rdev == find_rdev)
> +                return true;
> +        }
> +    }
> +    return false;
> +}
> +
>   /**
>    * Get information about the opened drm device
>    *
> @@ -3889,21 +3904,22 @@ int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
>               local_devices = temp;
>           }
>   
> -        /* store target at local_devices[0] for ease to use below */
> -        if (find_rdev == sbuf.st_rdev && i) {
> -            local_devices[i] = local_devices[0];
> -            local_devices[0] = d;
> -        }
> -        else
> -            local_devices[i] = d;
> +        local_devices[i] = d;
>           i++;
>       }
>       node_count = i;
>   
>       drmFoldDuplicatedDevices(local_devices, node_count);
>   
> -    *device = local_devices[0];
> -    drmFreeDevices(&local_devices[1], node_count - 1);
> +    for (i = 0; i < node_count; i++) {
> +        if (!local_devices[i])
> +            continue;
> +
> +        if (drm_device_has_rdev(local_devices[i], find_rdev))
> +            *device = local_devices[i];
> +        else
> +            drmFreeDevice(&local_devices[i]);
> +    }
>   
>       closedir(sysdir);
>       free(local_devices);
> 


More information about the dri-devel mailing list