Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f15f4138 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents dbe3ed1c c27da339
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ static void snapshot_tb_and_purr(void *data)
	struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data);

	local_irq_save(flags);
	p->tb = mftb();
	p->tb = get_tb_or_rtc();
	p->purr = mfspr(SPRN_PURR);
	wmb();
	p->initialized = 1;
@@ -317,7 +317,7 @@ static void snapshot_purr(void)
 */
void snapshot_timebase(void)
{
	__get_cpu_var(last_jiffy) = get_tb();
	__get_cpu_var(last_jiffy) = get_tb_or_rtc();
	snapshot_purr();
}

@@ -684,6 +684,8 @@ void timer_interrupt(struct pt_regs * regs)

		write_seqlock(&xtime_lock);
		tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy;
		if (__USE_RTC() && tb_next_jiffy >= 1000000000)
			tb_next_jiffy -= 1000000000;
		if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) {
			tb_last_jiffy = tb_next_jiffy;
			do_timer(1);
@@ -977,7 +979,7 @@ void __init time_init(void)
	tb_to_ns_scale = scale;
	tb_to_ns_shift = shift;
	/* Save the current timebase to pretty up CONFIG_PRINTK_TIME */
	boot_tb = get_tb();
	boot_tb = get_tb_or_rtc();

	tm = get_boot_time();

+12 −0
Original line number Diff line number Diff line
@@ -98,6 +98,18 @@ static struct vdso_patch_def vdso_patches[] = {
		CPU_FTR_USE_TB, 0,
		"__kernel_gettimeofday", NULL
	},
	{
		CPU_FTR_USE_TB, 0,
		"__kernel_clock_gettime", NULL
	},
	{
		CPU_FTR_USE_TB, 0,
		"__kernel_clock_getres", NULL
	},
	{
		CPU_FTR_USE_TB, 0,
		"__kernel_get_tbfreq", NULL
	},
};

/*
+2 −2
Original line number Diff line number Diff line
@@ -579,7 +579,7 @@ static struct spu *find_victim(struct spu_context *ctx)
		list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) {
			struct spu_context *tmp = spu->ctx;

			if (tmp->prio > ctx->prio &&
			if (tmp && tmp->prio > ctx->prio &&
			    (!victim || tmp->prio > victim->prio))
				victim = spu->ctx;
		}
@@ -611,9 +611,9 @@ static struct spu *find_victim(struct spu_context *ctx)

			mutex_lock(&cbe_spu_info[node].list_mutex);
			cbe_spu_info[node].nr_active--;
			spu_unbind_context(spu, victim);
			mutex_unlock(&cbe_spu_info[node].list_mutex);

			spu_unbind_context(spu, victim);
			victim->stats.invol_ctx_switch++;
			spu->stats.invol_ctx_switch++;
			mutex_unlock(&victim->state_mutex);
+5 −0
Original line number Diff line number Diff line
@@ -149,6 +149,11 @@ static inline u64 get_tb(void)
}
#endif /* !CONFIG_PPC64 */

static inline u64 get_tb_or_rtc(void)
{
	return __USE_RTC() ? get_rtc() : get_tb();
}

static inline void set_tb(unsigned int upper, unsigned int lower)
{
	mtspr(SPRN_TBWL, 0);