Hi all,

Today's linux-next merge of the tip tree got a conflict in
kernel/sched/idle.c between commit 52c324f8a87b ("cpuidle: Combine
cpuidle_enabled() with cpuidle_select()") from the pm tree and commit
37352273ad48 ("sched/idle: Reflow cpuidle_idle_call()") from the tip
tree.

I fixed it up (I hope - see below) and can carry the fix as necessary
(no action is required).

-- 
Cheers,
Stephen Rothwell                    [email protected]

diff --cc kernel/sched/idle.c
index a8f12247ce7c,34083c9ac976..000000000000
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@@ -101,77 -98,74 +98,69 @@@ static void cpuidle_idle_call(void
        rcu_idle_enter();
  
        /*
 -       * Check if the cpuidle framework is ready, otherwise fallback
 -       * to the default arch specific idle method
 +       * Ask the cpuidle framework to choose a convenient idle state.
 +       * Fall back to the default arch specific idle method on errors.
         */
 -      if (cpuidle_enabled(drv, dev)) {
 +      next_state = cpuidle_select(drv, dev);
 +
-       ret = next_state;
-       if (ret >= 0) {
++      if (next_state < 0) {
+ use_default:
                /*
-                * The idle task must be scheduled, it is pointless to
-                * go to idle, just update no idle residency and get
-                * out of this function
+                * We can't use the cpuidle framework, let's use the default
+                * idle routine.
                 */
-               if (current_clr_polling_and_test()) {
-                       dev->last_residency = 0;
-                       entered_state = next_state;
+               if (current_clr_polling_and_test())
                        local_irq_enable();
-               } else {
-                       broadcast = !!(drv->states[next_state].flags &
-                                      CPUIDLE_FLAG_TIMER_STOP);
- 
-                       if (broadcast)
-                               /*
-                                * Tell the time framework to switch
-                                * to a broadcast timer because our
-                                * local timer will be shutdown. If a
-                                * local timer is used from another
-                                * cpu as a broadcast timer, this call
-                                * may fail if it is not available
-                                */
-                               ret = clockevents_notify(
-                                       CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
-                                       &dev->cpu);
- 
-                       if (ret >= 0) {
-                               trace_cpu_idle_rcuidle(next_state, dev->cpu);
- 
-                               /*
-                                * Enter the idle state previously
-                                * returned by the governor
-                                * decision. This function will block
-                                * until an interrupt occurs and will
-                                * take care of re-enabling the local
-                                * interrupts
-                                */
-                               entered_state = cpuidle_enter(drv, dev,
-                                                             next_state);
- 
-                               trace_cpu_idle_rcuidle(PWR_EVENT_EXIT,
-                                                      dev->cpu);
- 
-                               if (broadcast)
-                                       clockevents_notify(
-                                               CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
-                                               &dev->cpu);
- 
-                               /*
-                                * Give the governor an opportunity to reflect 
on the
-                                * outcome
-                                */
-                               cpuidle_reflect(dev, entered_state);
-                       }
-               }
+               else
+                       arch_cpu_idle();
+ 
+               goto exit_idle;
+       }
+ 
+       /*
 -       * Ask the governor to choose an idle state it thinks
 -       * it is convenient to go to. There is *always* a
 -       * convenient idle state
 -       */
 -      next_state = cpuidle_select(drv, dev);
 -
 -      /*
+        * The idle task must be scheduled, it is pointless to
+        * go to idle, just update no idle residency and get
+        * out of this function
+        */
+       if (current_clr_polling_and_test()) {
+               dev->last_residency = 0;
+               entered_state = next_state;
+               local_irq_enable();
+               goto exit_idle;
        }
  
+       broadcast = !!(drv->states[next_state].flags & CPUIDLE_FLAG_TIMER_STOP);
+ 
        /*
-        * We can't use the cpuidle framework, let's use the default
-        * idle routine
+        * Tell the time framework to switch to a broadcast timer
+        * because our local timer will be shutdown. If a local timer
+        * is used from another cpu as a broadcast timer, this call may
+        * fail if it is not available
         */
-       if (ret < 0)
-               arch_cpu_idle();
+       if (broadcast &&
 -          clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu))
++          clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu) < 0)
+               goto use_default;
  
+       trace_cpu_idle_rcuidle(next_state, dev->cpu);
+ 
+       /*
+        * Enter the idle state previously returned by the governor decision.
+        * This function will block until an interrupt occurs and will take
+        * care of re-enabling the local interrupts
+        */
+       entered_state = cpuidle_enter(drv, dev, next_state);
+ 
+       trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
+ 
+       if (broadcast)
+               clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
+ 
+       /*
+        * Give the governor an opportunity to reflect on the outcome
+        */
+       cpuidle_reflect(dev, entered_state);
+ 
+ exit_idle:
        __current_set_polling();
  
        /*

Attachment: signature.asc
Description: PGP signature

Reply via email to