[Mesa-dev] [PATCH] src: replace RTLD_NOW with RTLD_LAZY

Jan Vesely jan.vesely at rutgers.edu
Sat Aug 6 01:37:00 UTC 2016


On Sat, 2016-08-06 at 02:42 +0200, Jan Ziak wrote:
> Mesa source code prior to this patch uses both RTLD_NOW and
> RTLD_LAZY.
> This patch removes all RTLD_NOW in favor of RTLD_LAZY.
> 
> In comparison to early binding, lazy binding reduces CPU instruction
> count
> of small GL apps (e.g: glxinfo) by 6 million instructions.
> Larger apps won't notice the difference.
> 
> Signed-off-by: Jan Ziak (http://atom-symbol.net)
> <0xe2.0x9a.0x9b at gmail.com>
> ---
>  src/egl/drivers/dri2/egl_dri2.c |  6 +++---
>  src/gbm/backends/dri/gbm_dri.c  |  6 +++---
>  src/glx/apple/apple_cgl.c       |  2 +-
>  src/glx/dri_common.c            | 10 +++++-----
>  4 files changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/egl_dri2.c
> b/src/egl/drivers/dri2/egl_dri2.c
> index a5cab68..3c9f58e 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -449,12 +449,12 @@ dri2_open_driver(_EGLDisplay *disp)
>  #if GLX_USE_TLS
>        snprintf(path, sizeof path,
>  	       "%.*s/tls/%s_dri.so", len, p, dri2_dpy->driver_name);
> -      dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +      dri2_dpy->driver = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
>  #endif
>        if (dri2_dpy->driver == NULL) {
>  	 snprintf(path, sizeof path,
>  		  "%.*s/%s_dri.so", len, p, dri2_dpy->driver_name);
> -	 dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +	 dri2_dpy->driver = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
>  	 if (dri2_dpy->driver == NULL)
>  	    _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path,
> dlerror());
>        }
> @@ -464,7 +464,7 @@ dri2_open_driver(_EGLDisplay *disp)
>  
>  #ifdef ANDROID
>        snprintf(path, sizeof path, "%.*s/gallium_dri.so", len, p);
> -      dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +      dri2_dpy->driver = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
>        if (dri2_dpy->driver == NULL)
>           _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path,
> dlerror());
>        else
> diff --git a/src/gbm/backends/dri/gbm_dri.c
> b/src/gbm/backends/dri/gbm_dri.c
> index c3626e3..a1921b7 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -332,12 +332,12 @@ dri_open_driver(struct gbm_dri_device *dri)
>  #if GLX_USE_TLS
>        snprintf(path, sizeof path,
>                 "%.*s/tls/%s_dri.so", len, p, dri->base.driver_name);
> -      dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +      dri->driver = dlopen(path, RTLD_LAZY| RTLD_GLOBAL);
>  #endif
>        if (dri->driver == NULL) {
>           snprintf(path, sizeof path,
>                    "%.*s/%s_dri.so", len, p, dri->base.driver_name);
> -         dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +         dri->driver = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
>        }
>        /* not need continue to loop all paths once the driver is
> found */
>        if (dri->driver != NULL)
> @@ -345,7 +345,7 @@ dri_open_driver(struct gbm_dri_device *dri)
>  
>  #ifdef ANDROID
>        snprintf(path, sizeof path, "%.*s/gallium_dri.so", len, p);
> -      dri->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
> +      dri->driver = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
>        if (dri->driver == NULL)
>           sprintf("failed to open %s: %s\n", path, dlerror());
>        else
> diff --git a/src/glx/apple/apple_cgl.c b/src/glx/apple/apple_cgl.c
> index 648ed86..a458d34 100644
> --- a/src/glx/apple/apple_cgl.c
> +++ b/src/glx/apple/apple_cgl.c
> @@ -75,7 +75,7 @@ apple_cgl_init(void)
>     }
>  
>     (void) dlerror();            /*drain dlerror */
> -   h = dlopen(opengl_framework_path, RTLD_NOW);
> +   h = dlopen(opengl_framework_path, RTLD_LAZY);
>  
>     if (NULL == h) {
>        fprintf(stderr, "error: unable to dlopen %s : %s\n",
> diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
> index 6728d38..c7b7562 100644
> --- a/src/glx/dri_common.c
> +++ b/src/glx/dri_common.c
> @@ -42,8 +42,8 @@
>  #include "dri_common.h"
>  #include "loader.h"
>  
> -#ifndef RTLD_NOW
> -#define RTLD_NOW 0
> +#ifndef RTLD_LAZY
> +#define RTLD_LAZY 0
>  #endif
>  #ifndef RTLD_GLOBAL
>  #define RTLD_GLOBAL 0
> @@ -103,7 +103,7 @@ driOpenDriver(const char *driverName)
>     int len;
>  
>     /* Attempt to make sure libGL symbols will be visible to the
> driver */
> -   glhandle = dlopen(GL_LIB_NAME, RTLD_NOW | RTLD_GLOBAL);
> +   glhandle = dlopen(GL_LIB_NAME, RTLD_LAZY | RTLD_GLOBAL);
>  
>     libPaths = NULL;
>     if (geteuid() == getuid()) {
> @@ -131,14 +131,14 @@ driOpenDriver(const char *driverName)
>        snprintf(realDriverName, sizeof realDriverName,
>                 "%.*s/tls/%s_dri.so", len, p, driverName);
>        InfoMessageF("OpenDriver: trying %s\n", realDriverName);
> -      handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
> +      handle = dlopen(realDriverName, RTLD_LAZY | RTLD_GLOBAL);
>  #endif
>  
>        if (handle == NULL) {
>           snprintf(realDriverName, sizeof realDriverName,
>                    "%.*s/%s_dri.so", len, p, driverName);
>           InfoMessageF("OpenDriver: trying %s\n", realDriverName);
> -         handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
> +         handle = dlopen(realDriverName, RTLD_LAZY | RTLD_GLOBAL);
>        }

this is IMO micro-optimization in the wrong place. RTLD_NOW also
guarantees that symbols were successfully resolved. Changing it to lazy
may hide bugs by deferring failure to future point in the execution.

Jan

>  
>        if (handle != NULL)
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-- 
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160805/2353e03f/attachment-0001.sig>


More information about the mesa-dev mailing list