From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754666AbcFGJIc (ORCPT ); Tue, 7 Jun 2016 05:08:32 -0400 Received: from devils.ext.ti.com ([198.47.26.153]:48596 "EHLO devils.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752221AbcFGJI3 (ORCPT ); Tue, 7 Jun 2016 05:08:29 -0400 Subject: Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties To: Eduardo Valentin , Rui Zhang References: <1464676296-5610-1-git-send-email-edubezval@gmail.com> <1464676296-5610-3-git-send-email-edubezval@gmail.com> CC: Linux PM , LKML From: Keerthy Message-ID: <57568F08.2070307@ti.com> Date: Tue, 7 Jun 2016 14:38:24 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <1464676296-5610-3-git-send-email-edubezval@gmail.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Eduardo, On Tuesday 31 May 2016 12:01 PM, Eduardo Valentin wrote: > Serialized calls to tz.ops in user facing > sysfs handler mode_show() and mode_store(). This seems to be causing a deadlock at boot time during the ending stages of boot: http://pastebin.ubuntu.com/17085291/ It took a while to git bisect on linux-next. Seems like you introduced new locking at the sysfs layer which causes this deadlock as the underlying code again tries to acquire the same tz->lock. Regards, Keerthy > > Cc: Zhang Rui > Cc: linux-pm@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Eduardo Valentin > --- > drivers/thermal/thermal_sysfs.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c > index ee983ca..1db2406 100644 > --- a/drivers/thermal/thermal_sysfs.c > +++ b/drivers/thermal/thermal_sysfs.c > @@ -62,7 +62,9 @@ mode_show(struct device *dev, struct device_attribute *attr, char *buf) > if (!tz->ops->get_mode) > return -EPERM; > > + mutex_lock(&tz->lock); > result = tz->ops->get_mode(tz, &mode); > + mutex_unlock(&tz->lock); > if (result) > return result; > > @@ -75,17 +77,22 @@ mode_store(struct device *dev, struct device_attribute *attr, > const char *buf, size_t count) > { > struct thermal_zone_device *tz = to_thermal_zone(dev); > + enum thermal_device_mode mode = THERMAL_DEVICE_DISABLED; > int result; > > if (!tz->ops->set_mode) > return -EPERM; > > if (!strncmp(buf, "enabled", sizeof("enabled") - 1)) > - result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED); > + mode = THERMAL_DEVICE_ENABLED; > else if (!strncmp(buf, "disabled", sizeof("disabled") - 1)) > - result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED); > + mode = THERMAL_DEVICE_DISABLED; > else > - result = -EINVAL; > + return -EINVAL; > + > + mutex_lock(&tz->lock); > + result = tz->ops->set_mode(tz, mode); > + mutex_unlock(&tz->lock); > > if (result) > return result; >