linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Archit Taneja <architt@codeaurora.org>
To: dri-devel@lists.freedesktop.org, treding@nvidia.com,
	laurent.pinchart@ideasonboard.com, xinliang.liu@linaro.org
Cc: linux-arm-msm@vger.kernel.org, srinivas.kandagatla@linaro.org,
	lars@metafoo.de, amit.kucheria@linaro.org, robdclark@gmail.com,
	Archit Taneja <architt@codeaurora.org>
Subject: [PATCH v6 3/8] drm/bridge: adv7511: Fix mutex deadlock when interrupts are disabled
Date: Fri, 17 Jun 2016 13:23:30 +0530	[thread overview]
Message-ID: <1466150015-882-4-git-send-email-architt@codeaurora.org> (raw)
In-Reply-To: <1466150015-882-1-git-send-email-architt@codeaurora.org>

When the adv7511 i2c client doesn't have an interrupt line, we observe a
deadlock on caused by trying to lock drm device's mode_config.mutex twice
in the same context.

Here is the sequence that causes it:

ioctl DRM_IOCTL_MODE_GETCONNECTOR from userspace
  drm_mode_getconnector (acquires mode_config mutex)
    connector->fill_modes()
    drm_helper_probe_single_connector_modes
      connector_funcs->get_modes
	adv7511_encoder_get_modes
	  adv7511_get_edid_block
	    adv7511_irq_process
	      drm_helper_hpd_irq_event (acquires mode_config mutex again)

In adv7511_irq_process, don't call drm_helper_hpd_irq_event when not
called from the interrupt handler. It doesn't serve any purpose there
anyway.

Signed-off-by: Archit Taneja <architt@codeaurora.org>
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index c2642f9..1fff0ab 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -427,7 +427,7 @@ static bool adv7511_hpd(struct adv7511 *adv7511)
 	return false;
 }
 
-static int adv7511_irq_process(struct adv7511 *adv7511)
+static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
 {
 	unsigned int irq0, irq1;
 	int ret;
@@ -443,7 +443,7 @@ static int adv7511_irq_process(struct adv7511 *adv7511)
 	regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0);
 	regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
 
-	if (irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
+	if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
 		drm_helper_hpd_irq_event(adv7511->connector.dev);
 
 	if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) {
@@ -461,7 +461,7 @@ static irqreturn_t adv7511_irq_handler(int irq, void *devid)
 	struct adv7511 *adv7511 = devid;
 	int ret;
 
-	ret = adv7511_irq_process(adv7511);
+	ret = adv7511_irq_process(adv7511, true);
 	return ret < 0 ? IRQ_NONE : IRQ_HANDLED;
 }
 
@@ -478,7 +478,7 @@ static int adv7511_wait_for_edid(struct adv7511 *adv7511, int timeout)
 				adv7511->edid_read, msecs_to_jiffies(timeout));
 	} else {
 		for (; timeout > 0; timeout -= 25) {
-			ret = adv7511_irq_process(adv7511);
+			ret = adv7511_irq_process(adv7511, false);
 			if (ret < 0)
 				break;
 
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

  parent reply	other threads:[~2016-06-17  7:53 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-27  6:16 [PATCH 0/5] drm/i2c: adv7511: ADV7533 support Archit Taneja
2015-07-27  6:16 ` [PATCH 1/5] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2015-07-27  6:16 ` [PATCH 2/5] drm/i2c: adv7511: Initial support for adv7533 Archit Taneja
2015-07-28  3:27   ` Bjorn Andersson
2015-08-03  5:39     ` Archit Taneja
2015-07-27  6:16 ` [PATCH 3/5] drm/i2c: adv7511: Refactor encoder slave functions Archit Taneja
2015-07-27  8:59   ` Laurent Pinchart
2015-07-28  8:17     ` Archit Taneja
2015-07-28 14:38       ` Boris Brezillon
2015-07-31  5:26         ` Archit Taneja
2015-07-31  9:12           ` Boris Brezillon
2015-07-31 10:38             ` Archit Taneja
2015-07-31 12:13             ` Rob Clark
2015-07-31 12:58               ` Boris Brezillon
2015-07-31 14:48                 ` Rob Clark
2015-08-03 12:03                   ` Andrzej Hajda
2015-08-03 14:04                     ` Rob Clark
2015-08-04  5:16                       ` Andrzej Hajda
2015-08-04 12:24                         ` Rob Clark
2015-09-02  6:30                           ` Archit Taneja
2015-12-03 15:02     ` Rob Clark
2015-12-03 15:28       ` Laurent Pinchart
2015-12-03 15:55         ` Rob Clark
2015-12-03 16:06           ` Laurent Pinchart
2015-12-03 16:11           ` Archit Taneja
2016-01-09 17:03             ` Archit Taneja
2015-07-27  6:16 ` [PATCH 4/5] drm/i2c: adv7511: Add drm_bridge/connector for ADV7533 Archit Taneja
2015-07-27  6:16 ` [PATCH 5/5] drm/i2c: adv7511: Create mipi_dsi_device " Archit Taneja
2015-09-07 11:36 ` [PATCH v2 0/5] drm/i2c: adv7511: ADV7533 support Archit Taneja
2015-09-07 11:36   ` [PATCH v2 1/5] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2015-09-07 11:36   ` [PATCH v2 2/5] drm/i2c: adv7511: Initial support for adv7533 Archit Taneja
2015-09-07 11:36   ` [PATCH v2 3/5] drm/i2c: adv7511: Refactor encoder slave functions Archit Taneja
2015-09-07 11:36   ` [PATCH v2 4/5] drm/i2c: adv7511: Add drm_bridge/connector for ADV7533 Archit Taneja
2015-09-07 11:36   ` [PATCH v2 5/5] drm/i2c: adv7511: Add dsi driver for adv7533 Archit Taneja
2016-03-09 10:57   ` [PATCH v3 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-03-09 10:57     ` [PATCH v3 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-03-09 10:57     ` [PATCH v3 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-03-09 10:57     ` [PATCH v3 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-03-09 10:57     ` [PATCH v3 4/7] drm/i2c: adv7511: Create a MIPI DSI device Archit Taneja
2016-04-21 22:29       ` Laurent Pinchart
2016-04-22  5:10         ` Archit Taneja
2016-05-03  6:57           ` Archit Taneja
2016-05-09 20:38             ` Laurent Pinchart
2016-05-11 10:19               ` Archit Taneja
2016-03-09 10:57     ` [PATCH v3 5/7] drm/i2c: adv7511: Use internal timing generator Archit Taneja
2016-03-09 10:57     ` [PATCH v3 6/7] drm/i2c: adv7511: Change number of DSI lanes dynamically Archit Taneja
     [not found]     ` <1457521038-5906-1-git-send-email-architt-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-03-09 10:57       ` [PATCH v3 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-03-17 19:12         ` Rob Herring
2016-04-21 22:32         ` Laurent Pinchart
2016-04-22  5:40           ` Archit Taneja
     [not found]             ` <5719B942.8070907-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-05-16 12:01               ` Laurent Pinchart
2016-05-17  3:43                 ` Archit Taneja
2016-05-17  4:18                   ` Xinliang Liu
2016-05-24  5:15                     ` Archit Taneja
2016-04-14 14:56     ` [PATCH v3 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-04-21 22:33       ` Laurent Pinchart
2016-04-22  5:45         ` Archit Taneja
2016-04-17 11:31     ` Xinliang Liu
2016-04-18  9:48       ` Archit Taneja
2016-04-19  8:44         ` Xinliang Liu
2016-04-21 22:36         ` Laurent Pinchart
2016-04-22  5:44           ` Archit Taneja
2016-05-03  1:52     ` Xinliang Liu
2016-05-03  6:53       ` Archit Taneja
2016-05-16 10:41     ` [PATCH v4 " Archit Taneja
2016-05-16 10:41       ` [PATCH v4 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-05-16 10:41       ` [PATCH v4 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-05-16 10:41       ` [PATCH v4 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-05-16 10:41       ` [PATCH v4 4/7] drm/i2c: adv7533: Create a MIPI DSI device Archit Taneja
2016-05-16 10:41       ` [PATCH v4 5/7] drm/i2c: adv7533: Use internal timing generator Archit Taneja
2016-05-16 10:41       ` [PATCH v4 6/7] drm/i2c: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-05-16 10:41       ` [PATCH v4 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-06-08 10:27       ` [PATCH v5 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-06-08 10:27         ` [PATCH v5 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-06-08 10:27         ` [PATCH v5 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-06-08 10:27         ` [PATCH v5 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-06-08 10:27         ` [PATCH v5 4/7] drm/i2c: adv7533: Create a MIPI DSI device Archit Taneja
2016-06-08 10:27         ` [PATCH v5 5/7] drm/i2c: adv7533: Use internal timing generator Archit Taneja
2016-06-08 10:27         ` [PATCH v5 6/7] drm/i2c: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-06-08 10:27         ` [PATCH v5 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-06-17  7:53         ` [PATCH v6 0/8] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-06-17  7:53           ` [PATCH v6 1/8] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-06-17  7:53           ` [PATCH v6 2/8] drm/i2c: adv7511: Move to bridge folder Archit Taneja
2016-06-17  7:53           ` Archit Taneja [this message]
2016-06-17  7:53           ` [PATCH v6 4/8] drm/bridge: adv7533: Initial support for ADV7533 Archit Taneja
2016-06-17  7:53           ` [PATCH v6 5/8] drm/bridge: adv7533: Create a MIPI DSI device Archit Taneja
2016-06-17  7:53           ` [PATCH v6 6/8] drm/bridge: adv7533: Use internal timing generator Archit Taneja
2016-06-17  7:53           ` [PATCH v6 7/8] drm/bridge: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-06-17  7:53           ` [PATCH v6 8/8] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1466150015-882-4-git-send-email-architt@codeaurora.org \
    --to=architt@codeaurora.org \
    --cc=amit.kucheria@linaro.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=lars@metafoo.de \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=robdclark@gmail.com \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=treding@nvidia.com \
    --cc=xinliang.liu@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).