On Tue May 12 02:56:31 2026 +0300, Laurent Pinchart wrote:
> Replace manual spinlock locking and unlocking with guards. This
> simplifies error paths and reduces the amount of code. Limit the changes
> to locations where the guard covers until the end of the function to
> ease review. Scoped guards will be introduced separately.
>
> Reviewed-by: Niklas Söderlund <[email protected]>
> Link:
> https://patch.msgid.link/20260511235637.3468558-8-laurent.pinchart+rene...@ideasonboard.com
> Signed-off-by: Laurent Pinchart <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
Patch committed.
Thanks,
Hans Verkuil
drivers/media/platform/renesas/vsp1/vsp1_dl.c | 49 +++++++-----------------
drivers/media/platform/renesas/vsp1/vsp1_histo.c | 20 ++++------
drivers/media/platform/renesas/vsp1/vsp1_pipe.c | 9 +----
drivers/media/platform/renesas/vsp1/vsp1_video.c | 14 +++----
drivers/media/platform/renesas/vsp1/vsp1_wpf.c | 4 +-
5 files changed, 31 insertions(+), 65 deletions(-)
---
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_dl.c
b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
index 6c5578d9d2de..4a19ff1437b0 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_dl.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_dl.c
@@ -336,9 +336,8 @@ void vsp1_dl_body_pool_destroy(struct vsp1_dl_body_pool
*pool)
struct vsp1_dl_body *vsp1_dl_body_get(struct vsp1_dl_body_pool *pool)
{
struct vsp1_dl_body *dlb = NULL;
- unsigned long flags;
- spin_lock_irqsave(&pool->lock, flags);
+ guard(spinlock_irqsave)(&pool->lock);
if (!list_empty(&pool->free)) {
dlb = list_first_entry(&pool->free, struct vsp1_dl_body, free);
@@ -346,8 +345,6 @@ struct vsp1_dl_body *vsp1_dl_body_get(struct
vsp1_dl_body_pool *pool)
refcount_set(&dlb->refcnt, 1);
}
- spin_unlock_irqrestore(&pool->lock, flags);
-
return dlb;
}
@@ -359,8 +356,6 @@ struct vsp1_dl_body *vsp1_dl_body_get(struct
vsp1_dl_body_pool *pool)
*/
void vsp1_dl_body_put(struct vsp1_dl_body *dlb)
{
- unsigned long flags;
-
if (!dlb)
return;
@@ -369,9 +364,9 @@ void vsp1_dl_body_put(struct vsp1_dl_body *dlb)
dlb->num_entries = 0;
- spin_lock_irqsave(&dlb->pool->lock, flags);
+ guard(spinlock_irqsave)(&dlb->pool->lock);
+
list_add_tail(&dlb->free, &dlb->pool->free);
- spin_unlock_irqrestore(&dlb->pool->lock, flags);
}
/**
@@ -493,9 +488,8 @@ static
struct vsp1_dl_ext_cmd *vsp1_dl_ext_cmd_get(struct vsp1_dl_cmd_pool *pool)
{
struct vsp1_dl_ext_cmd *cmd = NULL;
- unsigned long flags;
- spin_lock_irqsave(&pool->lock, flags);
+ guard(spinlock_irqsave)(&pool->lock);
if (!list_empty(&pool->free)) {
cmd = list_first_entry(&pool->free, struct vsp1_dl_ext_cmd,
@@ -503,24 +497,20 @@ struct vsp1_dl_ext_cmd *vsp1_dl_ext_cmd_get(struct
vsp1_dl_cmd_pool *pool)
list_del(&cmd->free);
}
- spin_unlock_irqrestore(&pool->lock, flags);
-
return cmd;
}
static void vsp1_dl_ext_cmd_put(struct vsp1_dl_ext_cmd *cmd)
{
- unsigned long flags;
-
if (!cmd)
return;
/* Reset flags, these mark data usage. */
cmd->flags = 0;
- spin_lock_irqsave(&cmd->pool->lock, flags);
+ guard(spinlock_irqsave)(&cmd->pool->lock);
+
list_add_tail(&cmd->free, &cmd->pool->free);
- spin_unlock_irqrestore(&cmd->pool->lock, flags);
}
static void vsp1_dl_ext_cmd_pool_destroy(struct vsp1_dl_cmd_pool *pool)
@@ -611,11 +601,10 @@ static void vsp1_dl_list_free(struct vsp1_dl_list *dl)
struct vsp1_dl_list *vsp1_dl_list_get(struct vsp1_dl_manager *dlm)
{
struct vsp1_dl_list *dl = NULL;
- unsigned long flags;
lockdep_assert_not_held(&dlm->lock);
- spin_lock_irqsave(&dlm->lock, flags);
+ guard(spinlock_irqsave)(&dlm->lock);
if (!list_empty(&dlm->free)) {
dl = list_first_entry(&dlm->free, struct vsp1_dl_list, list);
@@ -629,8 +618,6 @@ struct vsp1_dl_list *vsp1_dl_list_get(struct
vsp1_dl_manager *dlm)
dl->allocated = true;
}
- spin_unlock_irqrestore(&dlm->lock, flags);
-
return dl;
}
@@ -690,14 +677,12 @@ static void __vsp1_dl_list_put(struct vsp1_dl_list *dl)
*/
void vsp1_dl_list_put(struct vsp1_dl_list *dl)
{
- unsigned long flags;
-
if (!dl)
return;
- spin_lock_irqsave(&dl->dlm->lock, flags);
+ guard(spinlock_irqsave)(&dl->dlm->lock);
+
__vsp1_dl_list_put(dl);
- spin_unlock_irqrestore(&dl->dlm->lock, flags);
}
/**
@@ -937,7 +922,6 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl, unsigned
int dl_flags)
{
struct vsp1_dl_manager *dlm = dl->dlm;
struct vsp1_dl_list *dl_next;
- unsigned long flags;
/* Fill the header for the head and chained display lists. */
vsp1_dl_list_fill_header(dl, list_empty(&dl->chain));
@@ -950,14 +934,12 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl,
unsigned int dl_flags)
dl->flags = dl_flags & ~VSP1_DL_FRAME_END_COMPLETED;
- spin_lock_irqsave(&dlm->lock, flags);
+ guard(spinlock_irqsave)(&dlm->lock);
if (dlm->singleshot)
vsp1_dl_list_commit_singleshot(dl);
else
vsp1_dl_list_commit_continuous(dl);
-
- spin_unlock_irqrestore(&dlm->lock, flags);
}
/*
-----------------------------------------------------------------------------
@@ -991,7 +973,7 @@ unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager
*dlm)
u32 status = vsp1_read(vsp1, VI6_STATUS);
unsigned int flags = 0;
- spin_lock(&dlm->lock);
+ guard(spinlock)(&dlm->lock);
/*
* The mem-to-mem pipelines work in single-shot mode. No new display
@@ -1001,7 +983,7 @@ unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager
*dlm)
__vsp1_dl_list_put(dlm->active);
dlm->active = NULL;
flags |= VSP1_DL_FRAME_END_COMPLETED;
- goto done;
+ return flags;
}
/*
@@ -1011,7 +993,7 @@ unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager
*dlm)
* and retry.
*/
if (vsp1_dl_list_hw_update_pending(dlm))
- goto done;
+ return flags;
/*
* Progressive streams report only TOP fields. If we have a BOTTOM
@@ -1019,7 +1001,7 @@ unsigned int vsp1_dlm_irq_frame_end(struct
vsp1_dl_manager *dlm)
* next frame end interrupt.
*/
if (status & VI6_STATUS_FLD_STD(dlm->index))
- goto done;
+ return flags;
/*
* If the active display list has the writeback flag set, the frame
@@ -1058,9 +1040,6 @@ unsigned int vsp1_dlm_irq_frame_end(struct
vsp1_dl_manager *dlm)
dlm->pending = NULL;
}
-done:
- spin_unlock(&dlm->lock);
-
return flags;
}
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_histo.c
b/drivers/media/platform/renesas/vsp1/vsp1_histo.c
index 72f6ef2fdc4f..97dbfb93abe9 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_histo.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_histo.c
@@ -35,20 +35,18 @@ to_vsp1_histogram_buffer(struct vb2_v4l2_buffer *vbuf)
struct vsp1_histogram_buffer *
vsp1_histogram_buffer_get(struct vsp1_histogram *histo)
{
- struct vsp1_histogram_buffer *buf = NULL;
+ struct vsp1_histogram_buffer *buf;
- spin_lock(&histo->irqlock);
+ guard(spinlock)(&histo->irqlock);
if (list_empty(&histo->irqqueue))
- goto done;
+ return NULL;
buf = list_first_entry(&histo->irqqueue, struct vsp1_histogram_buffer,
queue);
list_del(&buf->queue);
histo->readout = true;
-done:
- spin_unlock(&histo->irqlock);
return buf;
}
@@ -68,10 +66,10 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram
*histo,
vb2_set_plane_payload(&buf->buf.vb2_buf, 0, size);
vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE);
- spin_lock(&histo->irqlock);
+ guard(spinlock)(&histo->irqlock);
+
histo->readout = false;
wake_up(&histo->wait_queue);
- spin_unlock(&histo->irqlock);
}
/*
-----------------------------------------------------------------------------
@@ -123,9 +121,9 @@ static void histo_buffer_queue(struct vb2_buffer *vb)
struct vsp1_histogram *histo = vb2_get_drv_priv(vb->vb2_queue);
struct vsp1_histogram_buffer *buf = to_vsp1_histogram_buffer(vbuf);
- spin_lock_irq(&histo->irqlock);
+ guard(spinlock_irq)(&histo->irqlock);
+
list_add_tail(&buf->queue, &histo->irqqueue);
- spin_unlock_irq(&histo->irqlock);
}
static int histo_start_streaming(struct vb2_queue *vq, unsigned int count)
@@ -138,7 +136,7 @@ static void histo_stop_streaming(struct vb2_queue *vq)
struct vsp1_histogram *histo = vb2_get_drv_priv(vq);
struct vsp1_histogram_buffer *buffer;
- spin_lock_irq(&histo->irqlock);
+ guard(spinlock_irq)(&histo->irqlock);
/* Remove all buffers from the IRQ queue. */
list_for_each_entry(buffer, &histo->irqqueue, queue)
@@ -147,8 +145,6 @@ static void histo_stop_streaming(struct vb2_queue *vq)
/* Wait for the buffer being read out (if any) to complete. */
wait_event_lock_irq(histo->wait_queue, !histo->readout, histo->irqlock);
-
- spin_unlock_irq(&histo->irqlock);
}
static const struct vb2_ops histo_video_queue_qops = {
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
index 5d769cc42fe1..9e2b9b15331a 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_pipe.c
@@ -487,14 +487,9 @@ void vsp1_pipeline_run(struct vsp1_pipeline *pipe)
bool vsp1_pipeline_stopped(struct vsp1_pipeline *pipe)
{
- unsigned long flags;
- bool stopped;
-
- spin_lock_irqsave(&pipe->irqlock, flags);
- stopped = pipe->state == VSP1_PIPELINE_STOPPED;
- spin_unlock_irqrestore(&pipe->irqlock, flags);
+ guard(spinlock_irqsave)(&pipe->irqlock);
- return stopped;
+ return pipe->state == VSP1_PIPELINE_STOPPED;
}
int vsp1_pipeline_stop(struct vsp1_pipeline *pipe)
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_video.c
b/drivers/media/platform/renesas/vsp1/vsp1_video.c
index b110f0309b26..b5b82e12fcb1 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_video.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_video.c
@@ -672,7 +672,7 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb)
if (!empty)
return;
- spin_lock_irqsave(&pipe->irqlock, flags);
+ guard(spinlock_irqsave)(&pipe->irqlock);
video->rwpf->mem = buf->mem;
pipe->buffers_ready |= 1 << video->pipe_index;
@@ -680,8 +680,6 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb)
if (vb2_start_streaming_called(&video->queue) &&
vsp1_pipeline_ready(pipe))
vsp1_video_pipeline_run(pipe);
-
- spin_unlock_irqrestore(&pipe->irqlock, flags);
}
static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
@@ -783,14 +781,13 @@ static int vsp1_video_setup_pipeline(struct vsp1_pipeline
*pipe)
static void vsp1_video_release_buffers(struct vsp1_video *video)
{
struct vsp1_vb2_buffer *buffer;
- unsigned long flags;
/* Remove all buffers from the IRQ queue. */
- spin_lock_irqsave(&video->irqlock, flags);
+ guard(spinlock_irqsave)(&video->irqlock);
+
list_for_each_entry(buffer, &video->irqqueue, queue)
vb2_buffer_done(&buffer->buf.vb2_buf, VB2_BUF_STATE_ERROR);
INIT_LIST_HEAD(&video->irqqueue);
- spin_unlock_irqrestore(&video->irqlock, flags);
}
static void vsp1_video_cleanup_pipeline(struct vsp1_pipeline *pipe)
@@ -812,7 +809,6 @@ static int vsp1_video_start_streaming(struct vb2_queue *vq,
unsigned int count)
struct vsp1_video *video = vb2_get_drv_priv(vq);
struct vsp1_pipeline *pipe = video->rwpf->entity.pipe;
bool start_pipeline = false;
- unsigned long flags;
int ret;
scoped_guard(mutex, &pipe->lock) {
@@ -840,10 +836,10 @@ static int vsp1_video_start_streaming(struct vb2_queue
*vq, unsigned int count)
if (!start_pipeline)
return 0;
- spin_lock_irqsave(&pipe->irqlock, flags);
+ guard(spinlock_irqsave)(&pipe->irqlock);
+
if (vsp1_pipeline_ready(pipe))
vsp1_video_pipeline_run(pipe);
- spin_unlock_irqrestore(&pipe->irqlock, flags);
return 0;
}
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
index e7ed3c8e9e90..327c7457126f 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_wpf.c
@@ -111,9 +111,9 @@ static int vsp1_wpf_s_ctrl(struct v4l2_ctrl *ctrl)
if (rotation == 180 || rotation == 270)
flip ^= BIT(WPF_CTRL_VFLIP) | BIT(WPF_CTRL_HFLIP);
- spin_lock_irq(&wpf->flip.lock);
+ guard(spinlock_irq)(&wpf->flip.lock);
+
wpf->flip.pending = flip;
- spin_unlock_irq(&wpf->flip.lock);
return 0;
}
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]