From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pavel Machek Subject: Re: pcim_enable_device BUGs for libata devices in 2.6.20-git6 Date: Mon, 12 Feb 2007 21:54:44 +0100 Message-ID: <20070212205444.GC18101@elf.ucw.cz> References: <45CFB87F.9060802@shaw.ca> <45D02F5B.801@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from gprs189-60.eurotel.cz ([160.218.189.60]:40827 "EHLO amd.ucw.cz" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965393AbXBLUy5 (ORCPT ); Mon, 12 Feb 2007 15:54:57 -0500 Content-Disposition: inline In-Reply-To: <45D02F5B.801@gmail.com> Sender: linux-ide-owner@vger.kernel.org List-Id: linux-ide@vger.kernel.org To: Tejun Heo Cc: Robert Hancock , linux-kernel , linux-ide@vger.kernel.org Hi! > >I'm seeing BUGs like these on all libata-driven controllers when > >suspending to disk on 2.6.20-git6: > > > >sata_nv 0000:00:07.0: resuming > >BUG: at drivers/pci/pci.c:817 pcim_enable_device() > > > >Call Trace: > > [] pcim_enable_device+0x8a/0xa5 > > [] :libata:ata_pci_device_do_resume+0x20/0x59 > > [] :sata_nv:nv_pci_device_resume+0x1d/0x100 > > [] resume_device+0xcb/0x12c > > [] dpm_resume+0x8c/0xec > > [] device_resume+0x4a/0x5d > > [] pm_suspend_disk+0x160/0x170 > > [] enter_state+0x52/0x1da > > [] state_store+0x5e/0x79 > > [] sysfs_write_file+0xe4/0x118 > > [] vfs_write+0xce/0x177 > > [] sys_write+0x45/0x6e > > [] system_call+0x7e/0x83 > > > >It looks like what's happening is that during the "freezing" stage, we > >suspend and then resume the controllers. ata_pci_device_do_suspend only > >calls pci_disable_device if the event is PM_EVENT_SUSPEND but > >ata_pci_device_do_resume calls pcim_enable_device unconditionally. If > >the event was something else, then pcim_enable_device complains because > >the device was previously enabled and never disabled. > > > >Not sure what the best way to fix this is? > > I think what should happen is either one of the followings. > > 1. Don't restore power state and re-enable PCI device on resume from > freeze just as we don't do the opposite when freezing. > > 2. Unconditionally disable and power down PCI device on suspend whether > it's freeze or not. > > #2 would be simpler but I'm a bit worried about it. There might be > controllers which choke after such sequence (save state, disable, power > down, no actual power removal, power on, restore state, re-enable). I'd just go for #2. > #1 can be easily done by taking a look at the current device power state > (gendev->power.power_state). The problem is that no one in > suspend/resume path seems to be setting that variable except for > runtime No, that variable is probably going to go away. If you want to remember that you are resuming from freeze, just store that info in private data structure. Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html