public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	pm list <linux-pm@lists.linux-foundation.org>,
	Len Brown <lenb@kernel.org>,
	Jesse Barnes <jbarnes@virtuousgeek.org>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [RFC][PATCH 2/2] PM: Rework handling of interrupts during suspend-resume
Date: Sun, 22 Feb 2009 23:42:07 +0100	[thread overview]
Message-ID: <200902222342.08285.rjw@sisk.pl> (raw)
In-Reply-To: <alpine.LFD.2.00.0902220946070.3111@localhost.localdomain>

On Sunday 22 February 2009, Linus Torvalds wrote:
> 
> On Sun, 22 Feb 2009, Rafael J. Wysocki wrote:
> > 
> > Use these functions to rework the handling of interrupts during
> > suspend (hibernation) and resume.  Namely, interrupts will only be
> > disabled on the CPU right before suspending sysdevs, while device
> > interrupts will be disabled (at the IO-APIC level), with the help of
> > the new helper function, before calling "late" suspend callbacks
> > provided by device drivers and analogously during resume.
> 
> I think this patch is actually a bit too complicated.
> 
> > +struct disabled_irq {
> > +	struct list_head list;
> > +	int irq;
> > +};
> > +
> > +static LIST_HEAD(resume_irqs_list);
> > +
> > +/**
> > + *	enable_device_irqs - enable interrupts disabled by disable_device_irqs()
> > + *
> > + *	Enable all interrupt lines previously disabled by disable_device_irqs()
> > + *	that are on resume_irqs_list.
> > + */
> > +void enable_device_irqs(void)
> > +{
> > +	struct disabled_irq *resume_irq, *tmp;
> > +
> > +	list_for_each_entry_safe(resume_irq, tmp, &resume_irqs_list, list) {
> > +		enable_irq(resume_irq->irq);
> > +		list_del(&resume_irq->list);
> > +		kfree(resume_irq);
> > +	}
> > +}
> 
> Don't do this whole separate list. Instead, just add a per-irq-descriptor 
> flag to the desc->status field that says "suspended". IOW, just do 
> something like

OK

> 	diff --git a/include/linux/irq.h b/include/linux/irq.h
> 	index f899b50..7bc2a31 100644
> 	--- a/include/linux/irq.h
> 	+++ b/include/linux/irq.h
> 	@@ -65,6 +65,7 @@ typedef	void (*irq_flow_handler_t)(unsigned int irq,
> 	 #define IRQ_SPURIOUS_DISABLED	0x00800000	/* IRQ was disabled by the spurious trap */
> 	 #define IRQ_MOVE_PCNTXT		0x01000000	/* IRQ migration from process context */
> 	 #define IRQ_AFFINITY_SET	0x02000000	/* IRQ affinity was set from userspace*/
> 	+#define IRQ_SUSPENDED		0x04000000	/* IRQ has gone through suspend sequence */
> 	 
> 	 #ifdef CONFIG_IRQ_PER_CPU
> 	 # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
> 
> and then just make the suspend sequence do
> 
> 	for_each_irq_desc(irq, desc) {
> 		.. check desc if we should disable it ..
> 		disable_irq(irq);
> 		desc->status |= IRQ_SUSPENDED;
> 	}
> 
> and the resume sequence do
> 
> 	for_each_irq_desc(irq, desc) {
> 		if (!(desc->status & IRQ_SUSPENDED))
> 			continue;
> 		desc->status &= ~IRQ_SUSPENDED;
> 		enabled_irq(irq);
> 	}
> 
> And that simplifcation then gets rid of
> 
> > +/**
> > + *	disable_device_irqs - disable all enabled interrupt lines
> > + *
> > + *	During system-wide suspend or hibernation device interrupts need to be
> > + *	disabled at the chip level and this function is provided for this
> > + *	purpose.  It disables all interrupt lines that are enabled at the
> > + *	moment and saves their numbers for enable_device_irqs().
> > + */
> > +int disable_device_irqs(void)
> > +{
> > +	struct irq_desc *desc;
> > +	int irq;
> > +
> > +	for_each_irq_desc(irq, desc) {
> > +		unsigned long flags;
> > +		struct disabled_irq *resume_irq;
> > +		struct irqaction *action;
> > +		bool is_timer_irq;
> > +
> > +		resume_irq = kzalloc(sizeof(*resume_irq), GFP_NOIO);
> > +		if (!resume_irq) {
> > +			enable_device_irqs();
> > +			return -ENOMEM;
> > +		}
> 
> this just goes away.
> 
> > +		is_timer_irq = false;
> > +		action = desc->action;
> > +		while (action) {
> > +			if (action->flags | IRQF_TIMER) {
> > +				is_timer_irq = true;
> > +				break;
> > +			}
> > +			action = action->next;
> > +		}
> 
> This is also pointless and wrong (and buggy). You should use '&' to 
> test that flag, not '|',

Ouch, sorry.

> but more importantly, if you share interrupts with a timer irq, there's
> nothing sane the irq layer can do ANYWAY, so just ignore the whole problem.
> Just look at the first one, don't try to be clever, because your clever code
> doesn't buy anything at all. 
> 
> So get rid of the loop, and just do
> 
> 	if (desc->action && !(desc->action->flags & IRQF_TIMER)) {
> 		desc->depth++;
> 		desc->status |= IRQ_DISABLED | IRQ_SUSPENDED;
> 		desc->chip->disable(irq);
> 	}
> 	spin_unlock_irqrestore(&desc->lock, flags);
> 
> and you're done.

OK

> Also, I'd actually suggest that the whole "synchronize_irq()" be handled 
> in a separate loop after the main one, so make that one just be
> 
> 	for_each_irq_desc(irq, desc) {
> 		if (desc->status & IRQ_SUSPENDED)
> 			serialize_irq(irq);
> 	}
> 
> at the end. No need for desc->lock, since the IRQ_SUSPENDED bit is stable.	

OK

> Finally:
> 
> > +extern int disable_device_irqs(void);
> > +extern void enable_device_irqs(void);
> 
> I think the naming is not great. It's not about disable/enable, it's very 
> much about suspend/resume. In your version, it had that global 
> "disabled_irq" list, and in mine it has that IRQ_SUSPENDED bit - and in 
> both cases you can't nest things, and you can't consider them in any way 
> "generic" enable/disable things, they are very specialized "shut up 
> everything but the timer irq".

OK, would 

extern void suspend_device_irqs(void);
extern void resume_device_irqs(void);

be better?

> I also don't think there is any reasonable error case, so just make the 
> "suspend" thing return 'void', and don't complicate the caller. We don't 
> error out on the simple "disable_irq()" either. It's a imperative 
> statement, not a "please can you try to do that" thing.

The error is there just because the memory allocation can fail.  With the
IRQ_SUSPENDED flag as per your suggestion it won't be necessary any more.

Thanks a lot for your comments, I'll send an updated patch shortly.

Rafael

  reply	other threads:[~2009-02-22 22:42 UTC|newest]

Thread overview: 187+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-22 17:37 [RFC][PATCH 0/2] Rework disabling of interrupts during suspend-resume Rafael J. Wysocki
2009-02-22 17:38 ` [RFC][PATCH 1/2] PM: Split up sysdev_[suspend|resume] from device_power_[down|up] Rafael J. Wysocki
2009-02-22 20:56   ` Adrian Bunk
2009-02-22 21:07     ` Linus Torvalds
2009-02-22 21:12       ` Ingo Molnar
2009-02-22 22:42       ` Adrian Bunk
2009-03-05 16:54   ` Pavel Machek
2009-02-22 17:39 ` [RFC][PATCH 2/2] PM: Rework handling of interrupts during suspend-resume Rafael J. Wysocki
2009-02-22 18:01   ` Linus Torvalds
2009-02-22 22:42     ` Rafael J. Wysocki [this message]
2009-02-22 23:48       ` Rafael J. Wysocki
2009-02-23  0:05         ` Linus Torvalds
2009-02-23  1:23           ` Linus Torvalds
2009-02-23 10:52             ` Rafael J. Wysocki
2009-02-23  3:04         ` Eric W. Biederman
2009-02-23  8:44           ` Ingo Molnar
2009-02-23  9:22             ` Eric W. Biederman
2009-02-23  9:44               ` Ingo Molnar
2009-02-23 10:42                 ` Eric W. Biederman
2009-02-23 11:03                   ` Rafael J. Wysocki
2009-02-23 15:28                     ` Eric W. Biederman
2009-02-23 21:39                       ` Rafael J. Wysocki
2009-02-24  3:30                         ` Eric W. Biederman
2009-02-24 22:42                           ` Rafael J. Wysocki
2009-02-24 22:51                             ` Linus Torvalds
2009-02-24 23:07                               ` Rafael J. Wysocki
2009-02-24 23:09                                 ` Ingo Molnar
2009-02-24 23:29                                   ` Rafael J. Wysocki
2009-02-25 13:23                                     ` Ingo Molnar
2009-02-26  1:17                                     ` Arve Hjønnevåg
2009-02-26  1:27                                       ` Linus Torvalds
2009-02-26  2:13                                         ` Arve Hjønnevåg
2009-02-26  2:51                                           ` Linus Torvalds
2009-02-26  3:00                                             ` Ingo Molnar
2009-02-26  3:31                                               ` Arve Hjønnevåg
2009-02-26  3:37                                                 ` Linus Torvalds
2009-02-26  3:50                                                   ` Arve Hjønnevåg
2009-02-26  3:57                                                     ` Linus Torvalds
2009-02-26  4:13                                                       ` Arve Hjønnevåg
2009-02-26  4:20                                                         ` Eric W. Biederman
2009-02-26  4:24                                                           ` Arve Hjønnevåg
2009-02-26  9:50                                       ` Rafael J. Wysocki
2009-02-26 20:34                                         ` Arve Hjønnevåg
2009-02-26 20:57                                           ` Benjamin Herrenschmidt
2009-02-26 21:20                                             ` Arve Hjønnevåg
2009-02-26 21:49                                               ` Benjamin Herrenschmidt
2009-02-26 21:58                                           ` Rafael J. Wysocki
2009-02-26 22:10                                             ` Linus Torvalds
2009-02-26 22:30                                               ` Arve Hjønnevåg
2009-02-26 23:10                                                 ` Rafael J. Wysocki
2009-02-27  0:00                                                   ` Arve Hjønnevåg
2009-02-27  0:27                                                     ` Linus Torvalds
2009-02-27  3:20                                                       ` [linux-pm] " Alan Stern
2009-02-27  4:43                                                         ` Linus Torvalds
2009-02-27 14:59                                                           ` Alan Stern
2009-02-27 20:30                                                             ` Linus Torvalds
2009-02-28  3:54                                                               ` Arve Hjønnevåg
2009-02-28 10:06                                                                 ` Rafael J. Wysocki
2009-02-28 17:03                                                                   ` Linus Torvalds
2009-02-28 22:15                                                                   ` Arve Hjønnevåg
2009-02-26 22:30                                               ` Rafael J. Wysocki
2009-02-25  4:16                               ` Eric W. Biederman
2009-02-25  4:26                                 ` Linus Torvalds
2009-02-25  4:59                                   ` Eric W. Biederman
2009-02-25 15:32                             ` [linux-pm] " Alan Stern
2009-02-25 16:19                               ` Linus Torvalds
2009-02-23 11:04                   ` Ingo Molnar
2009-02-23 14:45                     ` Rafael J. Wysocki
2009-02-23 15:06                       ` Ingo Molnar
2009-02-23 21:59                         ` Rafael J. Wysocki
2009-02-23 10:13               ` Benjamin Herrenschmidt
2009-02-23  8:36         ` Ingo Molnar
2009-02-23 11:29           ` Rafael J. Wysocki
2009-02-23 12:28             ` Ingo Molnar
2009-02-23 14:48               ` Rafael J. Wysocki
2009-02-23 20:49               ` Benjamin Herrenschmidt
2009-02-23 12:45             ` Ingo Molnar
2009-02-23 15:07               ` Rafael J. Wysocki
2009-02-23 15:52             ` Johannes Berg
2009-02-23 17:16             ` Ingo Molnar
2009-02-23 17:28               ` Linus Torvalds
2009-02-23 22:11                 ` Rafael J. Wysocki
2009-02-23 22:11   ` Arve Hjønnevåg
2009-02-23 22:23     ` Rafael J. Wysocki
2009-02-23 22:44       ` Arve Hjønnevåg
2009-02-22 18:13 ` [RFC][PATCH 0/2] Rework disabling " Linus Torvalds
2009-02-22 18:18   ` Ingo Molnar
2009-02-22 18:25     ` Linus Torvalds
2009-02-22 18:35       ` Linus Torvalds
2009-02-22 22:37 ` Eric W. Biederman
2009-02-22 22:56   ` Benjamin Herrenschmidt
2009-02-22 23:02   ` Linus Torvalds
2009-03-01 22:21 ` [RFC][PATCH 0/4] " Rafael J. Wysocki
2009-03-01 22:24   ` [RFC][PATCH 1/4] PM: Rework handling of interrupts during suspend-resume (rev. 4) Rafael J. Wysocki
2009-03-02 23:01     ` Arve Hjønnevåg
2009-03-02 23:13       ` Rafael J. Wysocki
2009-03-02 23:18         ` Arve Hjønnevåg
2009-03-02 23:27           ` Rafael J. Wysocki
2009-03-03 22:56             ` Arve Hjønnevåg
2009-03-04 22:03               ` [Update, rev. 5] " Rafael J. Wysocki
2009-03-05 10:35                 ` Ingo Molnar
2009-03-02 23:32           ` Linus Torvalds
2009-03-02 23:35             ` Linus Torvalds
2009-03-03  0:08               ` Arve Hjønnevåg
2009-03-03  8:41                 ` Arve Hjønnevåg
2009-03-01 22:25   ` [RFC][PATCH 2/4] PM: Change suspend code ordering Rafael J. Wysocki
2009-03-02 20:48     ` Linus Torvalds
2009-03-02 22:02       ` Rafael J. Wysocki
2009-03-01 22:26   ` [RFC][PATCH 3/4] PM: Change hibernation " Rafael J. Wysocki
2009-03-01 22:27   ` [RFC][PATCH 4/4] kexec: Change kexec jump " Rafael J. Wysocki
2009-03-05 23:44   ` [RFC][PATCH 0/4] Rework disabling of interrupts during suspend-resume Linus Torvalds
2009-03-06  6:47     ` Sitsofe Wheeler
2009-03-06 10:19     ` Rafael J. Wysocki
2009-03-07 10:19 ` [RFC][PATCH][0/8] PM: Rework suspend-resume ordering to avoid problems with shared interrupts Rafael J. Wysocki
2009-03-07 10:20   ` [RFC][PATCH][1/8] PM: Rework handling of interrupts during suspend-resume (rev. 5) Rafael J. Wysocki
2009-03-07 16:51     ` [linux-pm] " Alan Stern
2009-03-07 17:56       ` Rafael J. Wysocki
2009-03-08  3:53         ` Alan Stern
2009-03-08 10:00           ` Rafael J. Wysocki
2009-03-08 12:37             ` Alan Stern
2009-03-08 17:20           ` Linus Torvalds
2009-03-08 20:40             ` Alan Stern
2009-03-08 21:37               ` Rafael J. Wysocki
2009-03-09 14:59               ` Linus Torvalds
2009-03-09 15:13                 ` Alan Stern
2009-03-09 15:40                   ` Linus Torvalds
2009-03-07 10:21   ` [RFC][PATCH][2/8] PM: Change suspend code ordering Rafael J. Wysocki
2009-03-07 10:22   ` [RFC][PATCH][3/8] PM: Change hibernation " Rafael J. Wysocki
2009-03-07 10:23   ` [RFC][PATCH][4/8] kexec: Change kexec jump " Rafael J. Wysocki
2009-03-07 10:24   ` [RFC][PATCH][5/8] PCI PM: Consistently use variable name "error" for pm call return values Rafael J. Wysocki
2009-03-07 10:25   ` [RFC][PATCH][6/8] PCI PM: Use pci_set_power_state during early resume Rafael J. Wysocki
2009-03-07 10:26   ` [RFC][PATCH][7/8] PCI PM: Move pci_restore_standard_config to pci-driver.c Rafael J. Wysocki
2009-03-07 10:27   ` [RFC][PATCH][8/8] PCI PM: Put devices into low power states during late suspend Rafael J. Wysocki
2009-03-08 19:28   ` [RFC][PATCH][0/8] PM: Rework suspend-resume ordering to avoid problems with shared interrupts Frans Pop
2009-03-08 20:50     ` Rafael J. Wysocki
2009-03-14  8:44       ` Frans Pop
2009-03-14 11:59         ` Rafael J. Wysocki
2009-03-14 14:11           ` Frans Pop
2009-03-14 22:31             ` Rafael J. Wysocki
2009-03-11  9:30 ` [PATCH 0/10] PM: Rework suspend-resume ordering to avoid problems with shared interrupts (updated) Rafael J. Wysocki
2009-03-11  9:36   ` [PATCH 1/10] PM: Rework handling of interrupts during suspend-resume (rev. 5) Rafael J. Wysocki
2009-03-11 10:33     ` Thomas Gleixner
2009-03-11 20:59       ` Rafael J. Wysocki
2009-03-11 21:42         ` Thomas Gleixner
2009-03-11 22:01           ` Rafael J. Wysocki
2009-03-11 22:45           ` Thomas Gleixner
2009-03-12 13:36             ` Rafael J. Wysocki
2009-03-12 21:43               ` [update, rev. 6] " Rafael J. Wysocki
2009-03-13  0:39                 ` Ingo Molnar
2009-03-13 17:07                   ` Rafael J. Wysocki
2009-03-13  7:15                 ` Arve Hjønnevåg
2009-03-13 16:53                   ` Rafael J. Wysocki
2009-03-13 19:55                 ` Thomas Gleixner
2009-03-13 21:56                   ` Rafael J. Wysocki
2009-03-14  7:31                     ` Thomas Gleixner
2009-03-14 10:01                       ` Rafael J. Wysocki
2009-03-14  0:04                   ` Rafael J. Wysocki
2009-03-11 21:15       ` Rafael J. Wysocki
2009-03-11 21:35         ` Thomas Gleixner
2009-03-11 21:50           ` Rafael J. Wysocki
2009-03-11 21:53             ` Thomas Gleixner
2009-03-11 22:01               ` Linus Torvalds
2009-03-11 22:13                 ` Rafael J. Wysocki
2009-03-11 22:25                 ` Thomas Gleixner
2009-03-11 22:07               ` Rafael J. Wysocki
2009-03-11  9:37   ` [PATCH 2/10] PM: Change suspend code ordering Rafael J. Wysocki
2009-03-11  9:38   ` [PATCH 3/10] PM: Change hibernation " Rafael J. Wysocki
2009-03-11  9:39   ` [PATCH 4/10] kexec: Change kexec jump " Rafael J. Wysocki
2009-03-11  9:41   ` [PATCH 5/10] PCI PM: Consistently use variable name "error" for pm call return values Rafael J. Wysocki
2009-03-11  9:42   ` [PATCH 6/10] PCI PM: Use pci_set_power_state during early resume Rafael J. Wysocki
2009-03-11  9:47   ` [PATCH 7/10] PCI PM: Move pci_restore_standard_config to pci-driver.c Rafael J. Wysocki
2009-03-11  9:48   ` [PATCH 8/10] PCI PM: Put devices into low power states during late suspend (rev. 2) Rafael J. Wysocki
2009-03-11  9:55   ` [PATCH 9/10] PCI PM: Make pci_set_power_state() handle devices with no PM support Rafael J. Wysocki
2009-03-11  9:56   ` [PATCH 10/10] PCI PM: Restore config spaces of all devices during early resume Rafael J. Wysocki
2009-03-14 11:24 ` [PATCH 0/11] PM: Rework suspend-resume ordering to avoid problems with shared interrupts (updated 2x) Rafael J. Wysocki
2009-03-14 11:26   ` [PATCH 1/11] PM: Introduce functions for suspending and resuming device interrupts Rafael J. Wysocki
2009-03-14 11:27   ` [PATCH 2/11] PM: Rework handling of interrupts during suspend-resume Rafael J. Wysocki
2009-03-14 11:28   ` [PATCH 3/11] PM: Change suspend code ordering Rafael J. Wysocki
2009-03-14 11:28   ` [PATCH 4/11] PM: Change hibernation " Rafael J. Wysocki
2009-03-14 11:29   ` [PATCH 5/11] kexec: Change kexec jump " Rafael J. Wysocki
2009-03-14 11:30   ` [PATCH 6/11] PCI PM: Consistently use variable name "error" for pm call return values Rafael J. Wysocki
2009-03-14 11:31   ` [PATCH 7/11] PCI PM: Use pci_set_power_state during early resume Rafael J. Wysocki
2009-03-14 11:32   ` [PATCH 8/11] PCI PM: Move pci_restore_standard_config to pci-driver.c Rafael J. Wysocki
2009-03-14 11:32   ` [PATCH 9/11] PCI PM: Put devices into low power states during late suspend (rev. 2) Rafael J. Wysocki
2009-03-14 11:33   ` [PATCH 10/11] PCI PM: Make pci_set_power_state() handle devices with no PM support Rafael J. Wysocki
2009-03-14 11:34   ` [PATCH 11/11] PCI PM: Restore config spaces of all devices during early resume Rafael J. Wysocki
2009-03-14 11:43   ` [PATCH 0/11] PM: Rework suspend-resume ordering to avoid problems with shared interrupts (updated 2x) Ingo Molnar

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=200902222342.08285.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=benh@kernel.crashing.org \
    --cc=ebiederm@xmission.com \
    --cc=jbarnes@virtuousgeek.org \
    --cc=jeremy@goop.org \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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