diff options
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 1ee66db003be..f5f79196721c 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -784,9 +784,13 @@ static void xics_set_cpu_priority(unsigned char cppr) | |||
784 | { | 784 | { |
785 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); | 785 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); |
786 | 786 | ||
787 | BUG_ON(os_cppr->index != 0); | 787 | /* |
788 | * we only really want to set the priority when there's | ||
789 | * just one cppr value on the stack | ||
790 | */ | ||
791 | WARN_ON(os_cppr->index != 0); | ||
788 | 792 | ||
789 | os_cppr->stack[os_cppr->index] = cppr; | 793 | os_cppr->stack[0] = cppr; |
790 | 794 | ||
791 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 795 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
792 | lpar_cppr_info(cppr); | 796 | lpar_cppr_info(cppr); |
@@ -821,8 +825,14 @@ void xics_setup_cpu(void) | |||
821 | 825 | ||
822 | void xics_teardown_cpu(void) | 826 | void xics_teardown_cpu(void) |
823 | { | 827 | { |
828 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); | ||
824 | int cpu = smp_processor_id(); | 829 | int cpu = smp_processor_id(); |
825 | 830 | ||
831 | /* | ||
832 | * we have to reset the cppr index to 0 because we're | ||
833 | * not going to return from the IPI | ||
834 | */ | ||
835 | os_cppr->index = 0; | ||
826 | xics_set_cpu_priority(0); | 836 | xics_set_cpu_priority(0); |
827 | 837 | ||
828 | /* Clear any pending IPI request */ | 838 | /* Clear any pending IPI request */ |