[Mesa-dev] [PATCH 1/2] st/va: release held locks in error paths
Christian König
ckoenig.leichtzumerken at gmail.com
Tue Jan 16 08:15:15 UTC 2018
Reviewed-by: Christian König <christian.koenig at amd.com>
Do you have commit right by now or should Leo or I commit that for you?
Thanks for the help,
Christian.
Am 15.01.2018 um 23:03 schrieb Grazvydas Ignotas:
> Found with the help of following Coccinelle semantic patch:
> // <smpl>
> @@
> expression E;
> @@
>
> \(pthread_mutex_lock\|mtx_lock\|simple_mtx_lock\)(E)
> ...
> (
> \(pthread_mutex_unlock\|mtx_unlock\|simple_mtx_unlock\)(E);
> ...
> return ...;
> |
> + maybe need_unlock(E);
> return ...;
> )
> // </smpl>
>
> Signed-off-by: Grazvydas Ignotas <notasas at gmail.com>
> ---
> src/gallium/state_trackers/va/config.c | 4 +++-
> src/gallium/state_trackers/va/image.c | 4 +++-
> src/gallium/state_trackers/va/picture.c | 4 +++-
> 3 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/config.c b/src/gallium/state_trackers/va/config.c
> index 25043d6..7bc031a 100644
> --- a/src/gallium/state_trackers/va/config.c
> +++ b/src/gallium/state_trackers/va/config.c
> @@ -306,12 +306,14 @@ vlVaDestroyConfig(VADriverContextP ctx, VAConfigID config_id)
> return VA_STATUS_ERROR_INVALID_CONTEXT;
>
> mtx_lock(&drv->mutex);
> config = handle_table_get(drv->htab, config_id);
>
> - if (!config)
> + if (!config) {
> + mtx_unlock(&drv->mutex);
> return VA_STATUS_ERROR_INVALID_CONFIG;
> + }
>
> FREE(config);
> handle_table_remove(drv->htab, config_id);
> mtx_unlock(&drv->mutex);
>
> diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
> index 86ae868..3f892c9 100644
> --- a/src/gallium/state_trackers/va/image.c
> +++ b/src/gallium/state_trackers/va/image.c
> @@ -546,12 +546,14 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image,
> tex,
> 0,
> PIPE_TRANSFER_WRITE |
> PIPE_TRANSFER_DISCARD_RANGE,
> &dst_box, &transfer);
> - if (map == NULL)
> + if (map == NULL) {
> + mtx_unlock(&drv->mutex);
> return VA_STATUS_ERROR_OPERATION_FAILED;
> + }
>
> u_copy_nv12_from_yv12((const void * const*) data, pitches, i, j,
> transfer->stride, tex->array_size,
> map, dst_box.width, dst_box.height);
> pipe_transfer_unmap(drv->pipe, transfer);
> diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
> index 8951573..cfcf986 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -675,13 +675,15 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
> dst_rect.x1 = src_rect.x1 = surf->templat.width;
> dst_rect.y1 = src_rect.y1 = surf->templat.height;
> vl_compositor_yuv_deint_full(&drv->cstate, &drv->compositor,
> old_buf, surf->buffer,
> &src_rect, &dst_rect, VL_COMPOSITOR_WEAVE);
> - } else
> + } else {
> /* Can't convert from progressive to interlaced yet */
> + mtx_unlock(&drv->mutex);
> return VA_STATUS_ERROR_INVALID_SURFACE;
> + }
> }
>
> old_buf->destroy(old_buf);
> context->target = surf->buffer;
> }
More information about the mesa-dev
mailing list