[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