From patchwork Mon Mar 31 09:46:27 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alessandro Zummo X-Patchwork-Id: 335235 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ee0-x23e.google.com (mail-ee0-x23e.google.com [IPv6:2a00:1450:4013:c00::23e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 889D9140098 for ; Mon, 31 Mar 2014 20:46:33 +1100 (EST) Received: by mail-ee0-f62.google.com with SMTP id d49sf438878eek.7 for ; Mon, 31 Mar 2014 02:46:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=date:from:to:cc:subject:message-id:in-reply-to:references :organization:mime-version:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:list-post:list-help:list-archive:sender:list-subscribe :list-unsubscribe:content-type; bh=epr2/5cVKNFPm3QT5kgkxV9zX/wbrJ8eQVbCfgxDyTY=; b=RQvcRwsyuB6VbLfYCEBTe/SMJ1H0x2mdQyHV4JFXAdta3f0FtbvRyHIxGv9SQc0KiV borY0qkEM6LR2hBXbU+MiE2U8nPKqlP1E1IppkFNX63rTEPterLCXfR8kEoaNhc3NOBL c/J5HlBIIFPHD8CXqzWsuehRyT+takBZueJJESqyvJflY4Kku6pCeIVP3f43DmX5kOv0 JpiwbDHGXoDIvU+st1DPu01D/Tvema+Fv01OLX17JUi5FyUc+cAP9I8jCrK+de7SmOHf VPYPPoh+we9zF62y646bA/o5bOc99szyilY9hMww3LoN2MRFu6gzXpGq5pZGtIoyLV7R seMw== X-Received: by 10.180.92.4 with SMTP id ci4mr27940wib.12.1396259189334; Mon, 31 Mar 2014 02:46:29 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.180.103.97 with SMTP id fv1ls415210wib.52.gmail; Mon, 31 Mar 2014 02:46:28 -0700 (PDT) X-Received: by 10.14.219.194 with SMTP id m42mr756667eep.7.1396259188755; Mon, 31 Mar 2014 02:46:28 -0700 (PDT) Received: from zabrina.hetzner-de.towertech.it (zabrina.hetzner-de.towertech.it. [178.63.16.19]) by gmr-mx.google.com with ESMTP id u49si3803663eeo.1.2014.03.31.02.46.28 for ; Mon, 31 Mar 2014 02:46:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of a.zummo@towertech.it designates 178.63.16.19 as permitted sender) client-ip=178.63.16.19; Received: from linux.lan.towertech.it (93-50-192-40.ip153.fastwebnet.it [93.50.192.40]) by smtp.towertech.it (Postfix) with ESMTPSA id 3fy82D1kb9z37SX; Mon, 31 Mar 2014 11:46:28 +0200 (CEST) Date: Mon, 31 Mar 2014 11:46:27 +0200 From: Alessandro Zummo To: Sasha Levin Cc: Tejun Heo , Greg KH , rtc-linux@googlegroups.com, LKML Subject: [rtc-linux] Re: kernfs/rtc: circular dependency between kernfs and ops_lock Message-ID: <20140331114627.5e1a4609@linux.lan.towertech.it> In-Reply-To: <53384080.9020502@oracle.com> References: <5308E3AE.3040405@oracle.com> <20140222205217.GC16272@mtj.dyndns.org> <20140224120427.6394d5dd@linux.lan.towertech.it> <5331FA9E.20506@oracle.com> <20140325233936.655a798e@linux.lan.towertech.it> <53321D04.2040102@oracle.com> <5337653D.6020002@oracle.com> <53384080.9020502@oracle.com> Organization: Tower Technologies MIME-Version: 1.0 X-Original-Sender: a.zummo@towertech.it X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of a.zummo@towertech.it designates 178.63.16.19 as permitted sender) smtp.mail=a.zummo@towertech.it 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: , On Sun, 30 Mar 2014 12:04:16 -0400 Sasha Levin wrote: > > Look good, thanks! > > Or not... > > Hit it again during overnight fuzzing: > I think this is a different bug, please try this. diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index cae212f..2c77d8e 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -712,6 +712,20 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) } } + spin_lock_irq(&rtc_lock); + rtc_control = CMOS_READ(RTC_CONTROL); + spin_unlock_irq(&rtc_lock); + + /* FIXME: + * doesn't know 12-hour mode either. + */ + if (is_valid_irq(rtc_irq) && !(rtc_control & RTC_24H)) { + dev_warn(dev, "only 24-hr supported\n"); + retval = -ENXIO; + goto cleanup0; + } + + cmos_rtc.dev = dev; dev_set_drvdata(dev, &cmos_rtc); @@ -739,49 +753,49 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) /* disable irqs */ cmos_irq_disable(&cmos_rtc, RTC_PIE | RTC_AIE | RTC_UIE); - rtc_control = CMOS_READ(RTC_CONTROL); - spin_unlock_irq(&rtc_lock); - /* FIXME: - * doesn't know 12-hour mode either. - */ - if (is_valid_irq(rtc_irq) && !(rtc_control & RTC_24H)) { - dev_warn(dev, "only 24-hr supported\n"); - retval = -ENXIO; - goto cleanup1; - } - if (is_valid_irq(rtc_irq)) { - irq_handler_t rtc_cmos_int_handler; + + irq_handler_t rtc_cmos_int_handler = NULL; if (is_hpet_enabled()) { - rtc_cmos_int_handler = hpet_rtc_interrupt; + retval = hpet_register_irq_handler(cmos_interrupt); if (retval) { dev_warn(dev, "hpet_register_irq_handler " " failed in rtc_init()."); - goto cleanup1; + } else { + rtc_cmos_int_handler = hpet_rtc_interrupt; } - } else + } else { rtc_cmos_int_handler = cmos_interrupt; + } - retval = request_irq(rtc_irq, rtc_cmos_int_handler, - 0, dev_name(&cmos_rtc.rtc->dev), - cmos_rtc.rtc); - if (retval < 0) { - dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); - goto cleanup1; + if (rtc_cmos_int_handler) { + retval = request_irq(rtc_irq, rtc_cmos_int_handler, + 0, dev_name(&cmos_rtc.rtc->dev), + cmos_rtc.rtc); + if (retval < 0) { + + dev_err(dev, "IRQ %d is already in use\n", rtc_irq); + + cmos_rtc.irq = -1; + + if (is_hpet_enabled()) { + hpet_unregister_irq_handler(cmos_interrupt); + } + } } } + hpet_rtc_timer_init(); /* export at least the first block of NVRAM */ nvram.size = address_space - NVRAM_OFFSET; retval = sysfs_create_bin_file(&dev->kobj, &nvram); if (retval < 0) { - dev_dbg(dev, "can't create nvram file? %d\n", retval); - goto cleanup2; + dev_err(dev, "can't create nvram file? %d\n", retval); } dev_info(dev, "%s%s, %zd bytes nvram%s\n", @@ -795,12 +809,6 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) return 0; -cleanup2: - if (is_valid_irq(rtc_irq)) - free_irq(rtc_irq, cmos_rtc.rtc); -cleanup1: - cmos_rtc.dev = NULL; - rtc_device_unregister(cmos_rtc.rtc); cleanup0: release_region(ports->start, resource_size(ports)); return retval; @@ -823,8 +831,12 @@ static void __exit cmos_do_remove(struct device *dev) sysfs_remove_bin_file(&dev->kobj, &nvram); if (is_valid_irq(cmos->irq)) { + free_irq(cmos->irq, cmos->rtc); - hpet_unregister_irq_handler(cmos_interrupt); + + if (is_hpet_enabled()) { + hpet_unregister_irq_handler(cmos_interrupt); + } } rtc_device_unregister(cmos->rtc);