powerpc/kexec: Wait for online/possible CPUs only.
kexec_perpare_cpus_wait() iterates i through NR_CPUS to check paca[i].kexec_state of each to make sure they have quiesced. However now we have dynamic PACA allocation, paca[NR_CPUS] is not necessarily valid and we overrun the array; spurious "cpu is not possible, ignoring" errors result. This patch iterates for_each_online_cpu so stays within the bounds of paca[] -- and every CPU is now 'possible'. Signed-off-by: Matt Evans <matt@ozlabs.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
65cf840ff4
Коммит
b636f1379e
|
@ -182,28 +182,12 @@ static void kexec_prepare_cpus_wait(int wait_state)
|
||||||
|
|
||||||
my_cpu = get_cpu();
|
my_cpu = get_cpu();
|
||||||
/* Make sure each CPU has atleast made it to the state we need */
|
/* Make sure each CPU has atleast made it to the state we need */
|
||||||
for (i=0; i < NR_CPUS; i++) {
|
for_each_online_cpu(i) {
|
||||||
if (i == my_cpu)
|
if (i == my_cpu)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
while (paca[i].kexec_state < wait_state) {
|
while (paca[i].kexec_state < wait_state) {
|
||||||
barrier();
|
barrier();
|
||||||
if (!cpu_possible(i)) {
|
|
||||||
printk("kexec: cpu %d hw_cpu_id %d is not"
|
|
||||||
" possible, ignoring\n",
|
|
||||||
i, paca[i].hw_cpu_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!cpu_online(i)) {
|
|
||||||
/* Fixme: this can be spinning in
|
|
||||||
* pSeries_secondary_wait with a paca
|
|
||||||
* waiting for it to go online.
|
|
||||||
*/
|
|
||||||
printk("kexec: cpu %d hw_cpu_id %d is not"
|
|
||||||
" online, ignoring\n",
|
|
||||||
i, paca[i].hw_cpu_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i != notified) {
|
if (i != notified) {
|
||||||
printk( "kexec: waiting for cpu %d (physical"
|
printk( "kexec: waiting for cpu %d (physical"
|
||||||
" %d) to enter %i state\n",
|
" %d) to enter %i state\n",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче