Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 279508
b: refs/heads/master
c: 7df1027
h: refs/heads/master
v: v3
  • Loading branch information
Anton Blanchard authored and Benjamin Herrenschmidt committed Nov 25, 2011
1 parent ee821f5 commit 7ceb328
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 621692cb7efb6d0e38c62e41844a6360c6719b20
refs/heads/master: 7df1027542c9353bef4d027cb4ab8e99f69017b7
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/include/asm/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array);
extern void secondary_cpu_time_init(void);
extern void iSeries_time_init_early(void);

extern void decrementer_check_overflow(void);
DECLARE_PER_CPU(u64, decrementers_next_tb);

#endif /* __KERNEL__ */
#endif /* __POWERPC_TIME_H */
9 changes: 9 additions & 0 deletions trunk/arch/powerpc/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,15 @@ static inline notrace void set_soft_enabled(unsigned long enable)
: : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled)));
}

static inline notrace void decrementer_check_overflow(void)
{
u64 now = get_tb_or_rtc();
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);

if (now >= *next_tb)
set_dec(1);
}

notrace void arch_local_irq_restore(unsigned long en)
{
/*
Expand Down
27 changes: 7 additions & 20 deletions trunk/arch/powerpc/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,8 @@ static struct clock_event_device decrementer_clockevent = {
.features = CLOCK_EVT_FEAT_ONESHOT,
};

struct decrementer_clock {
struct clock_event_device event;
u64 next_tb;
};

static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
DEFINE_PER_CPU(u64, decrementers_next_tb);
static DEFINE_PER_CPU(struct clock_event_device, decrementers);

#ifdef CONFIG_PPC_ISERIES
static unsigned long __initdata iSeries_recal_titan;
Expand Down Expand Up @@ -570,8 +566,8 @@ void arch_irq_work_raise(void)
void timer_interrupt(struct pt_regs * regs)
{
struct pt_regs *old_regs;
struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
struct clock_event_device *evt = &decrementer->event;
u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
struct clock_event_device *evt = &__get_cpu_var(decrementers);

/* Ensure a positive value is written to the decrementer, or else
* some CPUs will continue to take decrementer exceptions.
Expand Down Expand Up @@ -606,7 +602,7 @@ void timer_interrupt(struct pt_regs * regs)
get_lppaca()->int_dword.fields.decr_int = 0;
#endif

decrementer->next_tb = ~(u64)0;
*next_tb = ~(u64)0;
if (evt->event_handler)
evt->event_handler(evt);

Expand Down Expand Up @@ -872,19 +868,10 @@ static void __init clocksource_init(void)
clock->name, clock->mult, clock->shift);
}

void decrementer_check_overflow(void)
{
u64 now = get_tb_or_rtc();
struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);

if (now >= decrementer->next_tb)
set_dec(1);
}

static int decrementer_set_next_event(unsigned long evt,
struct clock_event_device *dev)
{
__get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
__get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;
set_dec(evt);
return 0;
}
Expand All @@ -898,7 +885,7 @@ static void decrementer_set_mode(enum clock_event_mode mode,

static void register_decrementer_clockevent(int cpu)
{
struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
struct clock_event_device *dec = &per_cpu(decrementers, cpu);

*dec = decrementer_clockevent;
dec->cpumask = cpumask_of(cpu);
Expand Down

0 comments on commit 7ceb328

Please sign in to comment.