[Mesa-dev] [PATCH 1/2] st/nine: Fix issue with surface and volume dtors and csmt

James Harvey lothmordor at gmail.com
Thu Mar 23 00:28:36 UTC 2017


Hi Axel,

EVE Online is no longer crashing for me with these patches.
Thanks!

Tested-by: James Harvey <lothmordor at gmail.com>

On 03/15/2017 02:56 PM, Axel Davy wrote:
> Surfaces and Volumes can be freed in the worker thread.
> 
> This fixes these dtor.
> Especially if they were freed by nine_context_box_upload,
> the counter was decremented after the destructions, which
> lead to deadlock.
> 
> Fixes bugzilla 99246.
> 
> CC: "17.0" <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Axel Davy <axel.davy at ens.fr>
> ---
>  src/gallium/state_trackers/nine/nine_csmt_helper.h |  2 +-
>  src/gallium/state_trackers/nine/surface9.c         | 10 ++++++++--
>  src/gallium/state_trackers/nine/volume9.c          | 10 ++++++++--
>  3 files changed, 17 insertions(+), 5 deletions(-)
> 
> diff --git a/src/gallium/state_trackers/nine/nine_csmt_helper.h b/src/gallium/state_trackers/nine/nine_csmt_helper.h
> index b0bbc054fc..dc46bbd3a2 100644
> --- a/src/gallium/state_trackers/nine/nine_csmt_helper.h
> +++ b/src/gallium/state_trackers/nine/nine_csmt_helper.h
> @@ -233,8 +233,8 @@ name##_rx( struct NineDevice9 *device, struct csmt_instruction *instr ) \
>      name##_priv( \
>          device ARGS_FOR_CALL( __VA_ARGS__ ) \
>      ); \
> -    ARGS_FOR_UNBIND( __VA_ARGS__ ) \
>      p_atomic_dec(args->counter); \
> +    ARGS_FOR_UNBIND( __VA_ARGS__ ) \
>      return 0; \
>  } \
>  \
> diff --git a/src/gallium/state_trackers/nine/surface9.c b/src/gallium/state_trackers/nine/surface9.c
> index 836369cafd..d917fa1f86 100644
> --- a/src/gallium/state_trackers/nine/surface9.c
> +++ b/src/gallium/state_trackers/nine/surface9.c
> @@ -204,9 +204,15 @@ NineSurface9_dtor( struct NineSurface9 *This )
>  {
>      DBG("This=%p\n", This);
>  
> -    if (This->transfer)
> -        NineSurface9_UnlockRect(This);
> +    if (This->transfer) {
> +        struct pipe_context *pipe = nine_context_get_pipe_multithread(This->base.base.device);
> +        pipe->transfer_unmap(pipe, This->transfer);
> +        This->transfer = NULL;
> +    }
>  
> +    /* Note: Following condition cannot happen currently, since we
> +     * refcount the surface in the functions increasing
> +     * pending_uploads_counter. */
>      if (p_atomic_read(&This->pending_uploads_counter))
>          nine_csmt_process(This->base.base.device);
>  
> diff --git a/src/gallium/state_trackers/nine/volume9.c b/src/gallium/state_trackers/nine/volume9.c
> index 11236a02e7..62af3e6225 100644
> --- a/src/gallium/state_trackers/nine/volume9.c
> +++ b/src/gallium/state_trackers/nine/volume9.c
> @@ -142,9 +142,15 @@ NineVolume9_dtor( struct NineVolume9 *This )
>  {
>      DBG("This=%p\n", This);
>  
> -    if (This->transfer)
> -        NineVolume9_UnlockBox(This);
> +    if (This->transfer) {
> +        struct pipe_context *pipe = nine_context_get_pipe_multithread(This->base.device);
> +        pipe->transfer_unmap(pipe, This->transfer);
> +        This->transfer = NULL;
> +    }
>  
> +    /* Note: Following condition cannot happen currently, since we
> +     * refcount the volume in the functions increasing
> +     * pending_uploads_counter. */
>      if (p_atomic_read(&This->pending_uploads_counter))
>          nine_csmt_process(This->base.device);
>  
> 


More information about the mesa-dev mailing list