Hi Eric,

On 24 August 2018 at 14:11, Emil Velikov <emil.l.veli...@gmail.com> wrote:
> From: Emil Velikov <emil.veli...@collabora.com>
>
> As the comment above globalDriverAPI (in dri_util.c) says, if the loader
> is unaware of createNewScreen2 there is a race condition.
>
> In which globalDriverAPI, will be set in the driver driDriverGetExtensions*
> function and used in createNewScreen(). If we call another drivers'
> driDriverGetExtensions, the createNewScreen will use the latter's API
> instead of the former.
>
> To make it more convoluting, the driver _must_ also expose
> __DRI_DRIVER_VTABLE, as that one exposes the correct API.
>
> The race also occurs, for loaders which use the pre megadrivers
> driDriverGetExtensions entrypoint.
>
> Cc: mesa-sta...@lists.freedesktop.org
> Signed-off-by: Emil Velikov <emil.veli...@collabora.com>
> ---
>  src/gallium/state_trackers/dri/dri2.c       | 21 +++++++++++++++++++++
>  src/gallium/state_trackers/dri/dri_screen.h |  1 +
>  src/gallium/state_trackers/dri/drisw.c      |  6 ++++++
>  src/gallium/targets/dri/target.c            |  2 +-
>  4 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/state_trackers/dri/dri2.c 
> b/src/gallium/state_trackers/dri/dri2.c
> index 3cbca4e5dc3..b21e6815796 100644
> --- a/src/gallium/state_trackers/dri/dri2.c
> +++ b/src/gallium/state_trackers/dri/dri2.c
> @@ -2318,11 +2318,32 @@ const struct __DriverAPIRec dri_kms_driver_api = {
>     .ReleaseBuffer  = dri2_release_buffer,
>  };
>
> +static const struct __DRIDriverVtableExtensionRec gallium_drm_vtable = {
> +   .base = { __DRI_DRIVER_VTABLE, 1 },
> +   .vtable = &galliumdrm_driver_api,
> +};
> +
> +static const struct __DRIDriverVtableExtensionRec dri_kms_vtable = {
> +   .base = { __DRI_DRIVER_VTABLE, 1 },
> +   .vtable = &dri_kms_driver_api,
> +};
> +
>  /* This is the table of extensions that the loader will dlsym() for. */
>  const __DRIextension *galliumdrm_driver_extensions[] = {
>      &driCoreExtension.base,
>      &driImageDriverExtension.base,
>      &driDRI2Extension.base,
> +    &gallium_drm_vtable.base,
> +    &gallium_config_options.base,
> +    NULL
> +};
> +
> +/* This is the table of extensions that the loader will dlsym() for. */
> +const __DRIextension *dri_kms_driver_extensions[] = {
> +    &driCoreExtension.base,
> +    &driImageDriverExtension.base,
> +    &driDRI2Extension.base,
> +    &dri_kms_vtable.base,
>      &gallium_config_options.base,
>      NULL
>  };
> diff --git a/src/gallium/state_trackers/dri/dri_screen.h 
> b/src/gallium/state_trackers/dri/dri_screen.h
> index 8d2d9c02892..fde3b4088a7 100644
> --- a/src/gallium/state_trackers/dri/dri_screen.h
> +++ b/src/gallium/state_trackers/dri/dri_screen.h
> @@ -147,6 +147,7 @@ void
>  dri_destroy_screen(__DRIscreen * sPriv);
>
>  extern const struct __DriverAPIRec dri_kms_driver_api;
> +extern const __DRIextension *dri_kms_driver_extensions[];
>
>  extern const struct __DriverAPIRec galliumdrm_driver_api;
>  extern const __DRIextension *galliumdrm_driver_extensions[];
> diff --git a/src/gallium/state_trackers/dri/drisw.c 
> b/src/gallium/state_trackers/dri/drisw.c
> index 1fba71bdd97..76a06b36664 100644
> --- a/src/gallium/state_trackers/dri/drisw.c
> +++ b/src/gallium/state_trackers/dri/drisw.c
> @@ -513,11 +513,17 @@ const struct __DriverAPIRec galliumsw_driver_api = {
>     .CopySubBuffer = drisw_copy_sub_buffer,
>  };
>
> +static const struct __DRIDriverVtableExtensionRec galliumsw_vtable = {
> +   .base = { __DRI_DRIVER_VTABLE, 1 },
> +   .vtable = &galliumsw_driver_api,
> +};
> +
>  /* This is the table of extensions that the loader will dlsym() for. */
>  const __DRIextension *galliumsw_driver_extensions[] = {
>      &driCoreExtension.base,
>      &driSWRastExtension.base,
>      &driCopySubBufferExtension.base,
> +    &galliumsw_vtable.base,
>      &gallium_config_options.base,
>      NULL
>  };
> diff --git a/src/gallium/targets/dri/target.c 
> b/src/gallium/targets/dri/target.c
> index 835d125f21e..e943cae6a16 100644
> --- a/src/gallium/targets/dri/target.c
> +++ b/src/gallium/targets/dri/target.c
> @@ -28,7 +28,7 @@ const __DRIextension 
> **__driDriverGetExtensions_kms_swrast(void);
>  PUBLIC const __DRIextension **__driDriverGetExtensions_kms_swrast(void)
>  {
>     globalDriverAPI = &dri_kms_driver_api;
> -   return galliumdrm_driver_extensions;
> +   return dri_kms_driver_extensions;
>  }
>
Can you please skim through the above?

Seems like I forgot to implement this while making the gallium mega-drivers.
I did not notice any issues in practise, but with EGLDevice this will
become more likely to hit.

Thanks
Emil
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to