From: Tomi Valkeinen tomi.valkeinen@ideasonboard.com
[ Upstream commit a5b18fd769b7dc2e77a9e6a390844cbf50626ae8 ]
If pm_runtime_resume_and_get() fails, we should unprepare the context, but currently we skip that as we goto to a later line.
Reviewed-by: Kieran Bingham kieran.bingham@ideasonboard.com Signed-off-by: Tomi Valkeinen tomi.valkeinen@ideasonboard.com Signed-off-by: Sakari Ailus sakari.ailus@linux.intel.com Signed-off-by: Hans Verkuil hverkuil@xs4all.nl Signed-off-by: Sasha Levin sashal@kernel.org ---
**YES** This commit should be backported to stable kernel trees. Here's my detailed analysis: ## Bug Analysis The commit fixes a **resource leak bug** in the error handling path of the CAL (Camera Abstraction Layer) media driver. The specific issue is: 1. **What happens**: In `cal_start_streaming()`, if `pm_runtime_resume_and_get()` fails after `cal_ctx_prepare()` has been successfully called, the code incorrectly jumps to `error_pipeline` instead of `error_unprepare`. 2. **The resource leak**: This means `cal_ctx_unprepare()` is never called, which fails to: - Release any reserved pixel processor units (via `cal_release_pix_proc()`) - Properly clean up context resources that were allocated in `cal_ctx_prepare()` 3. **Impact**: This creates a **hardware resource leak** where pixel processor units become permanently unavailable, potentially preventing future camera operations from working properly. ## Code Change Analysis The fix is **minimal and surgical**: - **Before**: `goto error_pipeline;` (line 761) - skips cal_ctx_unprepare() - **After**: `goto error_unprepare;` (line 761) - properly calls cal_ctx_unprepare() first The fix adds a new label `error_unprepare:` that ensures: 1. `cal_ctx_unprepare(ctx)` is called to release resources 2. Control then flows to `error_pipeline:` for remaining cleanup 3. The error handling sequence becomes: unprepare → pipeline cleanup → buffer release ## Stable Tree Criteria Assessment **✅ Fixes important bug**: Resource leaks in hardware drivers can cause system instability and prevent devices from working correctly. **✅ Small and contained**: Single line change plus one new label - extremely minimal modification. **✅ Low regression risk**: The fix only changes the error path to properly clean up resources that were already being cleaned up in the success path. **✅ Clear side effects**: No architectural changes, just proper resource cleanup ordering. **✅ Critical subsystem**: Media drivers are important for many embedded systems and devices. **✅ Clear benefit**: Prevents hardware resource exhaustion that could break camera functionality. ## Historical Context Looking at the similar commits provided: - **Similar Commit #5**: Also a CAL driver fix that was marked "Backport Status: YES" for fixing initial buffer handling - The pattern shows CAL driver bug fixes are considered appropriate for backporting when they fix real functional issues ## Conclusion This is a textbook stable tree candidate: it fixes a real resource leak bug with a minimal, safe change that has clear benefits and virtually no regression risk. The fix ensures proper cleanup of hardware resources (pixel processors) that are limited in number and critical for camera operation.
drivers/media/platform/ti/cal/cal-video.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/ti/cal/cal-video.c b/drivers/media/platform/ti/cal/cal-video.c index e29743ae61e27..c16754c136ca0 100644 --- a/drivers/media/platform/ti/cal/cal-video.c +++ b/drivers/media/platform/ti/cal/cal-video.c @@ -758,7 +758,7 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count)
ret = pm_runtime_resume_and_get(ctx->cal->dev); if (ret < 0) - goto error_pipeline; + goto error_unprepare;
cal_ctx_set_dma_addr(ctx, addr); cal_ctx_start(ctx); @@ -775,8 +775,8 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count) error_stop: cal_ctx_stop(ctx); pm_runtime_put_sync(ctx->cal->dev); +error_unprepare: cal_ctx_unprepare(ctx); - error_pipeline: video_device_pipeline_stop(&ctx->vdev); error_release_buffers: