loader: use a maximum of 64 drmDevices
authorEmil Velikov <emil.velikov@collabora.com>
Tue, 19 Feb 2019 15:30:38 +0000 (15:30 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Wed, 1 Apr 2020 15:57:22 +0000 (16:57 +0100)
Currently that's the hard-coded maximum in the kernel, even though the
libdrm API allows for more. Latter is done with extendability in mind.

Allocate 64 pointers^Wdevices on stack for now. Making for shorter and
ever-so-slightly faster code.

v2: Use single MAX_DRM_DEVICES #define (Eric)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com> (v1)
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4084>

src/loader/loader.c

index a6ad2ee075bb6d1a51b073e9e252780934009baf..96c1d4c0e6ca682925d4f4fdb174d4ffd5ed8c23 100644 (file)
@@ -50,6 +50,7 @@
 
 #ifdef HAVE_LIBDRM
 #include <xf86drm.h>
+#define MAX_DRM_DEVICES 64
 #ifdef USE_DRICONF
 #include "util/xmlconfig.h"
 #include "util/xmlpool.h"
@@ -132,27 +133,14 @@ is_kernel_i915(int fd)
 int
 loader_open_render_node(const char *name)
 {
-   drmDevicePtr *devices, device;
-   int err, render = -ENOENT, fd;
-   unsigned int num, i;
+   drmDevicePtr devices[MAX_DRM_DEVICES], device;
+   int i, num_devices, fd = -1;
 
-   err = drmGetDevices2(0, NULL, 0);
-   if (err < 0)
-      return err;
-
-   num = err;
-
-   devices = calloc(num, sizeof(*devices));
-   if (!devices)
-      return -ENOMEM;
-
-   err = drmGetDevices2(0, devices, num);
-   if (err < 0) {
-      render = err;
-      goto free;
-   }
+   num_devices = drmGetDevices2(0, devices, MAX_DRM_DEVICES);
+   if (num_devices <= 0)
+      return -ENOENT;
 
-   for (i = 0; i < num; i++) {
+   for (i = 0; i < num_devices; i++) {
       device = devices[i];
 
       if ((device->available_nodes & (1 << DRM_NODE_RENDER)) &&
@@ -176,16 +164,15 @@ loader_open_render_node(const char *name)
          }
 
          drmFreeVersion(version);
-         render = fd;
          break;
       }
    }
+   drmFreeDevices(devices, num_devices);
 
-   drmFreeDevices(devices, num);
+   if (i == num_devices)
+      return -ENOENT;
 
-free:
-   free(devices);
-   return render;
+   return fd;
 }
 
 #ifdef USE_DRICONF
@@ -310,8 +297,6 @@ static char *drm_get_id_path_tag_for_fd(int fd)
 
 int loader_get_user_preferred_fd(int default_fd, bool *different_device)
 {
-/* Arbitrary "maximum" value of drm devices. */
-#define MAX_DRM_DEVICES 32
    const char *dri_prime = getenv("DRI_PRIME");
    char *default_tag, *prime = NULL;
    drmDevicePtr devices[MAX_DRM_DEVICES];