Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=11ab244c9faead91683a12e4cb10d26b279bb4aa
Commit:     11ab244c9faead91683a12e4cb10d26b279bb4aa
Parent:     057c5cb35ece6ae3a4c2cb849f3948c5ad6add32
Author:     Heiko Carstens <[EMAIL PROTECTED]>
AuthorDate: Tue Feb 19 15:29:26 2008 +0100
Committer:  Martin Schwidefsky <[EMAIL PROTECTED]>
CommitDate: Tue Feb 19 15:29:33 2008 +0100

    [S390] Make sure enabled wait psw is loaded in default_idle.
    
    If both NO_IDLE_HZ and VIRT_TIMER are disabled default_idle won't load
    an enabled wait psw and busy loop instead. This is because the
    idle_chain is empty and the return value of atomic_notifier_call_chain
    will be NOTIFY_DONE, which causes default_idle to return instead of
    loading an enabled wait psw.
    Fix this by calling __atomic_notifier_call_chain instead and add proper
    return value handling.
    
    Signed-off-by: Heiko Carstens <[EMAIL PROTECTED]>
    Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>
---
 arch/s390/kernel/process.c |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index a6a4729..1c59ec1 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -114,24 +114,27 @@ extern void s390_handle_mcck(void);
 static void default_idle(void)
 {
        int cpu, rc;
+       int nr_calls = 0;
+       void *hcpu;
 #ifdef CONFIG_SMP
        struct s390_idle_data *idle;
 #endif
 
        /* CPU is going idle. */
        cpu = smp_processor_id();
-
+       hcpu = (void *)(long)cpu;
        local_irq_disable();
        if (need_resched()) {
                local_irq_enable();
                return;
        }
 
-       rc = atomic_notifier_call_chain(&idle_chain,
-                                       S390_CPU_IDLE, (void *)(long) cpu);
-       if (rc != NOTIFY_OK && rc != NOTIFY_DONE)
-               BUG();
-       if (rc != NOTIFY_OK) {
+       rc = __atomic_notifier_call_chain(&idle_chain, S390_CPU_IDLE, hcpu, -1,
+                                         &nr_calls);
+       if (rc == NOTIFY_BAD) {
+               nr_calls--;
+               __atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE,
+                                            hcpu, nr_calls, NULL);
                local_irq_enable();
                return;
        }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to