From patchwork Fri May 6 09:57:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 94354 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ww0-f56.google.com (mail-ww0-f56.google.com [74.125.82.56]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 9233FB6FD5 for ; Fri, 6 May 2011 20:00:00 +1000 (EST) Received: by wwb22 with SMTP id 22sf4414988wwb.11 for ; Fri, 06 May 2011 02:59:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=beta; h=domainkey-signature:x-beenthere:received-spf:date:from:to:cc :subject:message-id:references:mime-version:in-reply-to:user-agent :x-sa-exim-connect-ip:x-sa-exim-mail-from:x-sa-exim-scanned :x-ptx-original-recipient:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-google-group-id:list-post:list-help:list-archive:sender :list-subscribe:list-unsubscribe:content-type:content-disposition :content-transfer-encoding; bh=1FM3C0Aeif8TTZWqhX1i5Rn/riZxrjLbDb9UCSIFuDo=; b=LLgrEHQqT0JNsOU8EWvx+0yn/UtcVWKGrArORTLEA86oFbC52mRklsgZ+JZsLBqYZr lsW9agbMlwdkj2jJV3+1nBSDL6X6XrZV9iuXg98XY+hV+c+YevdshggEeCpN7Jes/hlp JRpzlokGJPBiupJJ7JFhWn6ZAIQxfRx+mJMzs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-beenthere:received-spf:date:from:to:cc:subject:message-id :references:mime-version:in-reply-to:user-agent:x-sa-exim-connect-ip :x-sa-exim-mail-from:x-sa-exim-scanned:x-ptx-original-recipient :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:x-google-group-id:list-post :list-help:list-archive:sender:list-subscribe:list-unsubscribe :content-type:content-disposition:content-transfer-encoding; b=xHEtZ5DPZCbIXDNcNzuRIVqkNZnQ4drTd7otbThUSjlWz539JNFfFOx/Bcq6A7GrCN ZUiLsMmTai3Q8hpxVKnxVtC5a7InQrX13EcviAn4xmi2h54DVArozrAqJXNSmUAGLrsx 8FKDKKIfM7Uq/SF7ORQn6OUTm8OFZVkwkc+IQ= Received: by 10.216.141.79 with SMTP id f57mr2296090wej.21.1304675872150; Fri, 06 May 2011 02:57:52 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.216.219.80 with SMTP id l58ls675297wep.0.gmail; Fri, 06 May 2011 02:57:51 -0700 (PDT) Received: by 10.216.63.15 with SMTP id z15mr439038wec.11.1304675871217; Fri, 06 May 2011 02:57:51 -0700 (PDT) Received: by 10.216.63.15 with SMTP id z15mr439037wec.11.1304675871132; Fri, 06 May 2011 02:57:51 -0700 (PDT) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [92.198.50.35]) by gmr-mx.google.com with ESMTPS id h59si473663wes.14.2011.05.06.02.57.49 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 06 May 2011 02:57:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of ukl@pengutronix.de designates 92.198.50.35 as permitted sender) client-ip=92.198.50.35; Received: from octopus.hi.pengutronix.de ([2001:6f8:1178:2:215:17ff:fe12:23b0]) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1QIHnB-000300-LO; Fri, 06 May 2011 11:57:49 +0200 Received: from ukl by octopus.hi.pengutronix.de with local (Exim 4.75) (envelope-from ) id 1QIHn9-0004xQ-FW; Fri, 06 May 2011 11:57:47 +0200 Date: Fri, 6 May 2011 11:57:47 +0200 From: Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= To: Arnaud Patard Cc: rtc-linux@googlegroups.com, Thomas Gleixner , Alessandro Zummo , Mark Brown , John Stultz , 625804@bugs.debian.org, Vagrant Cascadian Subject: [rtc-linux] rtc/mc13xxx: don't call rtc_device_register with the lock held Message-ID: <20110506095747.GA23071@pengutronix.de> References: <20110404145306.000134775@rtp-net.org> MIME-Version: 1.0 In-Reply-To: <20110404145306.000134775@rtp-net.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: 2001:6f8:1178:2:215:17ff:fe12:23b0 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: rtc-linux@googlegroups.com X-Original-Sender: u.kleine-koenig@pengutronix.de X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of ukl@pengutronix.de designates 92.198.50.35 as permitted sender) smtp.mail=ukl@pengutronix.de Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , Content-Disposition: inline Since commit f44f7f9 (RTC: Initialize kernel state from RTC) rtc_device_register reads the programmed alarm. As reading the alarm needs to take the lock, release it before calling rtc_device_register. This fixes a deadlock during boot: INFO: task swapper:1 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. swapper D c02b175c 0 1 0 0x00000000 [] (schedule+0x304/0x4f4) from [] (__mutex_lock_slowpath+0x7c/0x110) [] (__mutex_lock_slowpath+0x7c/0x110) from [] (mc13xxx_rtc_read_time+0x1c/0x118) [] (mc13xxx_rtc_read_time+0x1c/0x118) from [] (__rtc_read_time+0x58/0x5c) [] (__rtc_read_time+0x58/0x5c) from [] (rtc_read_time+0x30/0x48) [] (rtc_read_time+0x30/0x48) from [] (__rtc_read_alarm+0x1c/0x290) [] (__rtc_read_alarm+0x1c/0x290) from [] (rtc_device_register+0x150/0x27c) [] (rtc_device_register+0x150/0x27c) from [] (mc13xxx_rtc_probe+0x128/0x17c) [] (mc13xxx_rtc_probe+0x128/0x17c) from [] (platform_drv_probe+0x1c/0x24) [] (platform_drv_probe+0x1c/0x24) from [] (driver_probe_device+0x80/0x1a8) [] (driver_probe_device+0x80/0x1a8) from [] (__driver_attach+0x8c/0x90) [] (__driver_attach+0x8c/0x90) from [] (bus_for_each_dev+0x60/0x8c) [] (bus_for_each_dev+0x60/0x8c) from [] (bus_add_driver+0x180/0x248) [] (bus_add_driver+0x180/0x248) from [] (driver_register+0x70/0x15c) [] (driver_register+0x70/0x15c) from [] (platform_driver_probe+0x18/0x98) [] (platform_driver_probe+0x18/0x98) from [] (do_one_initcall+0x2c/0x168) [] (do_one_initcall+0x2c/0x168) from [] (kernel_init+0xa0/0x150) [] (kernel_init+0xa0/0x150) from [] (kernel_thread_exit+0x0/0x8) Reported-by: Vagrant Cascadian Signed-off-by: Uwe Kleine-König Closes: http://bugs.debian.org/625804 --- Hello Arnaud, On Mon, Apr 04, 2011 at 04:52:54AM -0000, Arnaud Patard wrote: > Index: imx-test/drivers/rtc/rtc-mc13xxx.c > =================================================================== > --- imx-test.orig/drivers/rtc/rtc-mc13xxx.c > +++ imx-test/drivers/rtc/rtc-mc13xxx.c > @@ -349,8 +349,13 @@ static int __devinit mc13xxx_rtc_probe(s > if (ret) > goto err_alarm_irq_request; > > + mc13xxx_unlock(mc13xxx); > + > priv->rtc = rtc_device_register(pdev->name, > &pdev->dev, &mc13xxx_rtc_ops, THIS_MODULE); > + > + mc13xxx_lock(mc13xxx); > + > if (IS_ERR(priv->rtc)) { > ret = PTR_ERR(priv->rtc); the patch below is a bit better as it doesn't take the lock in the likely case that rtc_device_register succeeds. Best regards Uwe diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index c5ac037..a1a278b 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c @@ -349,11 +349,15 @@ static int __devinit mc13xxx_rtc_probe(struct platform_device *pdev) if (ret) goto err_alarm_irq_request; + mc13xxx_unlock(mc13xxx); + priv->rtc = rtc_device_register(pdev->name, &pdev->dev, &mc13xxx_rtc_ops, THIS_MODULE); if (IS_ERR(priv->rtc)) { ret = PTR_ERR(priv->rtc); + mc13xxx_lock(mc13xxx); + mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); err_alarm_irq_request: @@ -365,12 +369,12 @@ err_reset_irq_status: mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); err_reset_irq_request: + mc13xxx_unlock(mc13xxx); + platform_set_drvdata(pdev, NULL); kfree(priv); } - mc13xxx_unlock(mc13xxx); - return ret; }