diff options
| author | Toshi Kani <toshi.kani@hp.com> | 2012-03-31 23:37:02 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2012-04-06 15:01:25 -0400 |
| commit | ee01e663373343c63e0e3d364d09f6155378dbcc (patch) | |
| tree | 22448567769278f9af4f8bff9bfc7653be94885c /drivers/cpuidle | |
| parent | 54f70077768e9aba37d9c5030b43497b6d5084fb (diff) | |
cpuidle: Fix panic in CPU off-lining with no idle driver
Fix a NULL pointer dereference panic in cpuidle_play_dead() during
CPU off-lining when no cpuidle driver is registered. A cpuidle
driver may be registered at boot-time based on CPU type. This patch
allows an off-lined CPU to enter HLT-based idle in this condition.
Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Cc: Boris Ostrovsky <boris.ostrovsky@amd.com>
Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Tested-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/cpuidle')
| -rw-r--r-- | drivers/cpuidle/cpuidle.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 3e146b2ada4..a71376a45d8 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -74,7 +74,7 @@ static cpuidle_enter_t cpuidle_enter_ops; | |||
| 74 | /** | 74 | /** |
| 75 | * cpuidle_play_dead - cpu off-lining | 75 | * cpuidle_play_dead - cpu off-lining |
| 76 | * | 76 | * |
| 77 | * Only returns in case of an error | 77 | * Returns in case of an error or no driver |
| 78 | */ | 78 | */ |
| 79 | int cpuidle_play_dead(void) | 79 | int cpuidle_play_dead(void) |
| 80 | { | 80 | { |
| @@ -83,6 +83,9 @@ int cpuidle_play_dead(void) | |||
| 83 | int i, dead_state = -1; | 83 | int i, dead_state = -1; |
| 84 | int power_usage = -1; | 84 | int power_usage = -1; |
| 85 | 85 | ||
| 86 | if (!drv) | ||
| 87 | return -ENODEV; | ||
| 88 | |||
| 86 | /* Find lowest-power state that supports long-term idle */ | 89 | /* Find lowest-power state that supports long-term idle */ |
| 87 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { | 90 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { |
| 88 | struct cpuidle_state *s = &drv->states[i]; | 91 | struct cpuidle_state *s = &drv->states[i]; |
