Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc:
[POWERPC] Fix timekeeping on PowerPC 601
[POWERPC] Don't expose clock vDSO functions when CPU has no timebase
[POWERPC] spusched: Fix null pointer dereference in find_victim

+24 -5
+5 -3
arch/powerpc/kernel/time.c
··· 239 239 struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); 240 240 241 241 local_irq_save(flags); 242 - p->tb = mftb(); 242 + p->tb = get_tb_or_rtc(); 243 243 p->purr = mfspr(SPRN_PURR); 244 244 wmb(); 245 245 p->initialized = 1; ··· 317 317 */ 318 318 void snapshot_timebase(void) 319 319 { 320 - __get_cpu_var(last_jiffy) = get_tb(); 320 + __get_cpu_var(last_jiffy) = get_tb_or_rtc(); 321 321 snapshot_purr(); 322 322 } 323 323 ··· 684 684 685 685 write_seqlock(&xtime_lock); 686 686 tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy; 687 + if (__USE_RTC() && tb_next_jiffy >= 1000000000) 688 + tb_next_jiffy -= 1000000000; 687 689 if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) { 688 690 tb_last_jiffy = tb_next_jiffy; 689 691 do_timer(1); ··· 979 977 tb_to_ns_scale = scale; 980 978 tb_to_ns_shift = shift; 981 979 /* Save the current timebase to pretty up CONFIG_PRINTK_TIME */ 982 - boot_tb = get_tb(); 980 + boot_tb = get_tb_or_rtc(); 983 981 984 982 tm = get_boot_time(); 985 983
+12
arch/powerpc/kernel/vdso.c
··· 98 98 CPU_FTR_USE_TB, 0, 99 99 "__kernel_gettimeofday", NULL 100 100 }, 101 + { 102 + CPU_FTR_USE_TB, 0, 103 + "__kernel_clock_gettime", NULL 104 + }, 105 + { 106 + CPU_FTR_USE_TB, 0, 107 + "__kernel_clock_getres", NULL 108 + }, 109 + { 110 + CPU_FTR_USE_TB, 0, 111 + "__kernel_get_tbfreq", NULL 112 + }, 101 113 }; 102 114 103 115 /*
+2 -2
arch/powerpc/platforms/cell/spufs/sched.c
··· 579 579 list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) { 580 580 struct spu_context *tmp = spu->ctx; 581 581 582 - if (tmp->prio > ctx->prio && 582 + if (tmp && tmp->prio > ctx->prio && 583 583 (!victim || tmp->prio > victim->prio)) 584 584 victim = spu->ctx; 585 585 } ··· 611 611 612 612 mutex_lock(&cbe_spu_info[node].list_mutex); 613 613 cbe_spu_info[node].nr_active--; 614 + spu_unbind_context(spu, victim); 614 615 mutex_unlock(&cbe_spu_info[node].list_mutex); 615 616 616 - spu_unbind_context(spu, victim); 617 617 victim->stats.invol_ctx_switch++; 618 618 spu->stats.invol_ctx_switch++; 619 619 mutex_unlock(&victim->state_mutex);
+5
include/asm-powerpc/time.h
··· 149 149 } 150 150 #endif /* !CONFIG_PPC64 */ 151 151 152 + static inline u64 get_tb_or_rtc(void) 153 + { 154 + return __USE_RTC() ? get_rtc() : get_tb(); 155 + } 156 + 152 157 static inline void set_tb(unsigned int upper, unsigned int lower) 153 158 { 154 159 mtspr(SPRN_TBWL, 0);