This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: cec: core: avoid recursive cec_claim_log_addrs
Author:  Hans Verkuil <hverkuil-ci...@xs4all.nl>
Date:    Thu Feb 22 16:17:33 2024 +0000

Keep track if cec_claim_log_addrs() is running, and return -EBUSY
if it is when calling CEC_ADAP_S_LOG_ADDRS.

This prevents a case where cec_claim_log_addrs() could be called
while it was still in progress.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
Reported-by: Yang, Chenyuan <c...@illinois.edu>
Closes: 
https://lore.kernel.org/linux-media/ph7pr11mb57688e64ade4fe82e658d86da0...@ph7pr11mb5768.namprd11.prod.outlook.com/
Fixes: ca684386e6e2 ("[media] cec: add HDMI CEC framework (api)")
Signed-off-by: Mauro Carvalho Chehab <mche...@kernel.org>

 drivers/media/cec/core/cec-adap.c | 6 +++++-
 drivers/media/cec/core/cec-api.c  | 2 +-
 include/media/cec.h               | 1 +
 3 files changed, 7 insertions(+), 2 deletions(-)

---

diff --git a/drivers/media/cec/core/cec-adap.c 
b/drivers/media/cec/core/cec-adap.c
index 6fc7de744ee9..a493cbce2456 100644
--- a/drivers/media/cec/core/cec-adap.c
+++ b/drivers/media/cec/core/cec-adap.c
@@ -1574,9 +1574,12 @@ unconfigure:
  */
 static void cec_claim_log_addrs(struct cec_adapter *adap, bool block)
 {
-       if (WARN_ON(adap->is_configuring || adap->is_configured))
+       if (WARN_ON(adap->is_claiming_log_addrs ||
+                   adap->is_configuring || adap->is_configured))
                return;
 
+       adap->is_claiming_log_addrs = true;
+
        init_completion(&adap->config_completion);
 
        /* Ready to kick off the thread */
@@ -1591,6 +1594,7 @@ static void cec_claim_log_addrs(struct cec_adapter *adap, 
bool block)
                wait_for_completion(&adap->config_completion);
                mutex_lock(&adap->lock);
        }
+       adap->is_claiming_log_addrs = false;
 }
 
 /*
diff --git a/drivers/media/cec/core/cec-api.c b/drivers/media/cec/core/cec-api.c
index d64bb716f9c6..3ef915344304 100644
--- a/drivers/media/cec/core/cec-api.c
+++ b/drivers/media/cec/core/cec-api.c
@@ -178,7 +178,7 @@ static long cec_adap_s_log_addrs(struct cec_adapter *adap, 
struct cec_fh *fh,
                           CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU |
                           CEC_LOG_ADDRS_FL_CDC_ONLY;
        mutex_lock(&adap->lock);
-       if (!adap->is_configuring &&
+       if (!adap->is_claiming_log_addrs && !adap->is_configuring &&
            (!log_addrs.num_log_addrs || !adap->is_configured) &&
            !cec_is_busy(adap, fh)) {
                err = __cec_s_log_addrs(adap, &log_addrs, block);
diff --git a/include/media/cec.h b/include/media/cec.h
index c8350258f10a..d3abe84c9c9e 100644
--- a/include/media/cec.h
+++ b/include/media/cec.h
@@ -258,6 +258,7 @@ struct cec_adapter {
        u16 phys_addr;
        bool needs_hpd;
        bool is_enabled;
+       bool is_claiming_log_addrs;
        bool is_configuring;
        bool must_reconfigure;
        bool is_configured;

Reply via email to