[PATCH v2 4/5] media: iris: Wake up blocked clients when the driver is removed
From: Vishnu Reddy
Date: Tue Nov 10 2026 - 09:19:18 EST
iris_remove() does not wake up a client that is blocked in
VIDIOC_DQBUF or poll() on an open session. The client stays blocked and
keeps its file descriptor open.
Flag the vb2 queues of all open instances as errored after the core is
shut down. This wakes up the blocked clients, which fail with an error
and can close the file descriptor. Skip the instances that are already
closing, as iris_close() releases their queues.
Fixes: 38506cb7e8d2 ("media: iris: add platform driver for iris video device")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Vishnu Reddy <busanna.reddy@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/iris/iris_instance.h | 2 ++
drivers/media/platform/qcom/iris/iris_probe.c | 16 ++++++++++++++++
drivers/media/platform/qcom/iris/iris_vidc.c | 5 +++++
3 files changed, 23 insertions(+)
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index 771269e705d9..cb84753e4f91 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -50,6 +50,7 @@ struct iris_hfi_session_ops;
* @icc_data: structure of interconnect data
* @m2m_dev: a reference to m2m device structure
* @m2m_ctx: a reference to m2m context structure
+ * @closing: set on close, skips the queue error during removal
* @sequence_cap: a sequence counter for capture queue
* @sequence_out: a sequence counter for output queue
* @tss: timestamp metadata
@@ -98,6 +99,7 @@ struct iris_inst {
struct icc_vote_data icc_data;
struct v4l2_m2m_dev *m2m_dev;
struct v4l2_m2m_ctx *m2m_ctx;
+ bool closing;
u32 sequence_cap;
u32 sequence_out;
struct iris_ts_metadata tss[VIDEO_MAX_FRAME];
diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
index dc83daccea5f..51054862bc64 100644
--- a/drivers/media/platform/qcom/iris/iris_probe.c
+++ b/drivers/media/platform/qcom/iris/iris_probe.c
@@ -12,8 +12,10 @@
#include <linux/reset.h>
#include <linux/soc/qcom/ubwc.h>
+#include "iris_buffer.h"
#include "iris_core.h"
#include "iris_ctrls.h"
+#include "iris_instance.h"
#include "iris_vidc.h"
static int iris_init_icc(struct iris_core *core)
@@ -259,6 +261,18 @@ static void iris_core_put(void *data)
v4l2_device_put(&core->v4l2_dev);
}
+static void iris_instances_vb2_queue_error(struct iris_core *core)
+{
+ struct iris_inst *inst;
+
+ mutex_lock(&core->lock);
+ list_for_each_entry(inst, &core->instances, list) {
+ if (!inst->closing)
+ iris_vb2_queue_error(inst);
+ }
+ mutex_unlock(&core->lock);
+}
+
static void iris_remove(struct platform_device *pdev)
{
struct iris_core *core;
@@ -278,6 +292,8 @@ static void iris_remove(struct platform_device *pdev)
iris_core_deinit(core);
+ iris_instances_vb2_queue_error(core);
+
pm_runtime_dont_use_autosuspend(core->dev);
pm_runtime_disable(core->dev);
diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
index 04bd37b93445..bb3519eff3b1 100644
--- a/drivers/media/platform/qcom/iris/iris_vidc.c
+++ b/drivers/media/platform/qcom/iris/iris_vidc.c
@@ -312,6 +312,11 @@ static void iris_check_num_queued_internal_buffers(struct iris_inst *inst, u32 p
int iris_close(struct file *filp)
{
struct iris_inst *inst = iris_get_inst(filp);
+ struct iris_core *core = inst->core;
+
+ mutex_lock(&core->lock);
+ inst->closing = true;
+ mutex_unlock(&core->lock);
v4l2_ctrl_handler_free(&inst->ctrl_handler);
v4l2_m2m_ctx_release(inst->m2m_ctx);
--
2.34.1