Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner: - The final conversion of timer wheel timers to timer_setup(). A few manual conversions and a large coccinelle assisted sweep and the removal of the old initialization mechanisms and the related code. - Remove the now unused VSYSCALL update code - Fix permissions of /proc/timer_list. I still need to get rid of that file completely - Rename a misnomed clocksource function and remove a stale declaration * 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (27 commits) m68k/macboing: Fix missed timer callback assignment treewide: Remove TIMER_FUNC_TYPE and TIMER_DATA_TYPE casts timer: Remove redundant __setup_timer*() macros timer: Pass function down to initialization routines timer: Remove unused data arguments from macros timer: Switch callback prototype to take struct timer_list * argument timer: Pass timer_list pointer to callbacks unconditionally Coccinelle: Remove setup_timer.cocci timer: Remove setup_*timer() interface timer: Remove init_timer() interface treewide: setup_timer() -> timer_setup() (2 field) treewide: setup_timer() -> timer_setup() treewide: init_timer() -> setup_timer() treewide: Switch DEFINE_TIMER callbacks to struct timer_list * s390: cmm: Convert timers to use timer_setup() lightnvm: Convert timers to use timer_setup() drivers/net: cris: Convert timers to use timer_setup() drm/vc4: Convert timers to use timer_setup() block/laptop_mode: Convert timers to use timer_setup() net/atm/mpc: Avoid open-coded assignment of timer callback function ...
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
static int irqfixup __read_mostly;
|
||||
|
||||
#define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10)
|
||||
static void poll_spurious_irqs(unsigned long dummy);
|
||||
static void poll_spurious_irqs(struct timer_list *unused);
|
||||
static DEFINE_TIMER(poll_spurious_irq_timer, poll_spurious_irqs);
|
||||
static int irq_poll_cpu;
|
||||
static atomic_t irq_poll_active;
|
||||
@@ -143,7 +143,7 @@ out:
|
||||
return ok;
|
||||
}
|
||||
|
||||
static void poll_spurious_irqs(unsigned long dummy)
|
||||
static void poll_spurious_irqs(struct timer_list *unused)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
int i;
|
||||
|
||||
+1
-1
@@ -843,7 +843,7 @@ void __kthread_queue_delayed_work(struct kthread_worker *worker,
|
||||
struct timer_list *timer = &dwork->timer;
|
||||
struct kthread_work *work = &dwork->work;
|
||||
|
||||
WARN_ON_ONCE(timer->function != (TIMER_FUNC_TYPE)kthread_delayed_work_timer_fn);
|
||||
WARN_ON_ONCE(timer->function != kthread_delayed_work_timer_fn);
|
||||
|
||||
/*
|
||||
* If @delay is 0, queue @dwork->work immediately. This is for
|
||||
|
||||
+3
-3
@@ -288,9 +288,9 @@ static void invoke_padata_reorder(struct work_struct *work)
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
static void padata_reorder_timer(unsigned long arg)
|
||||
static void padata_reorder_timer(struct timer_list *t)
|
||||
{
|
||||
struct parallel_data *pd = (struct parallel_data *)arg;
|
||||
struct parallel_data *pd = from_timer(pd, t, timer);
|
||||
unsigned int weight;
|
||||
int target_cpu, cpu;
|
||||
|
||||
@@ -485,7 +485,7 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst,
|
||||
|
||||
padata_init_pqueues(pd);
|
||||
padata_init_squeues(pd);
|
||||
setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd);
|
||||
timer_setup(&pd->timer, padata_reorder_timer, 0);
|
||||
atomic_set(&pd->seq_nr, -1);
|
||||
atomic_set(&pd->reorder_objects, 0);
|
||||
atomic_set(&pd->refcnt, 0);
|
||||
|
||||
@@ -21,10 +21,6 @@ config CLOCKSOURCE_VALIDATE_LAST_CYCLE
|
||||
config GENERIC_TIME_VSYSCALL
|
||||
bool
|
||||
|
||||
# Timekeeping vsyscall support
|
||||
config GENERIC_TIME_VSYSCALL_OLD
|
||||
bool
|
||||
|
||||
# Old style timekeeping
|
||||
config ARCH_USES_GETTIMEOFFSET
|
||||
bool
|
||||
|
||||
@@ -171,7 +171,7 @@ void clocksource_mark_unstable(struct clocksource *cs)
|
||||
spin_unlock_irqrestore(&watchdog_lock, flags);
|
||||
}
|
||||
|
||||
static void clocksource_watchdog(unsigned long data)
|
||||
static void clocksource_watchdog(struct timer_list *unused)
|
||||
{
|
||||
struct clocksource *cs;
|
||||
u64 csnow, wdnow, cslast, wdlast, delta;
|
||||
@@ -290,8 +290,7 @@ static inline void clocksource_start_watchdog(void)
|
||||
{
|
||||
if (watchdog_running || !watchdog || list_empty(&watchdog_list))
|
||||
return;
|
||||
init_timer(&watchdog_timer);
|
||||
watchdog_timer.function = clocksource_watchdog;
|
||||
timer_setup(&watchdog_timer, clocksource_watchdog, 0);
|
||||
watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
|
||||
add_timer_on(&watchdog_timer, cpumask_first(cpu_online_mask));
|
||||
watchdog_running = 1;
|
||||
|
||||
@@ -557,45 +557,6 @@ static void halt_fast_timekeeper(struct timekeeper *tk)
|
||||
update_fast_timekeeper(&tkr_dummy, &tk_fast_raw);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GENERIC_TIME_VSYSCALL_OLD
|
||||
#warning Please contact your maintainers, as GENERIC_TIME_VSYSCALL_OLD compatibity will disappear soon.
|
||||
|
||||
static inline void update_vsyscall(struct timekeeper *tk)
|
||||
{
|
||||
struct timespec xt, wm;
|
||||
|
||||
xt = timespec64_to_timespec(tk_xtime(tk));
|
||||
wm = timespec64_to_timespec(tk->wall_to_monotonic);
|
||||
update_vsyscall_old(&xt, &wm, tk->tkr_mono.clock, tk->tkr_mono.mult,
|
||||
tk->tkr_mono.cycle_last);
|
||||
}
|
||||
|
||||
static inline void old_vsyscall_fixup(struct timekeeper *tk)
|
||||
{
|
||||
s64 remainder;
|
||||
|
||||
/*
|
||||
* Store only full nanoseconds into xtime_nsec after rounding
|
||||
* it up and add the remainder to the error difference.
|
||||
* XXX - This is necessary to avoid small 1ns inconsistnecies caused
|
||||
* by truncating the remainder in vsyscalls. However, it causes
|
||||
* additional work to be done in timekeeping_adjust(). Once
|
||||
* the vsyscall implementations are converted to use xtime_nsec
|
||||
* (shifted nanoseconds), and CONFIG_GENERIC_TIME_VSYSCALL_OLD
|
||||
* users are removed, this can be killed.
|
||||
*/
|
||||
remainder = tk->tkr_mono.xtime_nsec & ((1ULL << tk->tkr_mono.shift) - 1);
|
||||
if (remainder != 0) {
|
||||
tk->tkr_mono.xtime_nsec -= remainder;
|
||||
tk->tkr_mono.xtime_nsec += 1ULL << tk->tkr_mono.shift;
|
||||
tk->ntp_error += remainder << tk->ntp_error_shift;
|
||||
tk->ntp_error -= (1ULL << tk->tkr_mono.shift) << tk->ntp_error_shift;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define old_vsyscall_fixup(tk)
|
||||
#endif
|
||||
|
||||
static RAW_NOTIFIER_HEAD(pvclock_gtod_chain);
|
||||
|
||||
static void update_pvclock_gtod(struct timekeeper *tk, bool was_set)
|
||||
@@ -2163,12 +2124,6 @@ void update_wall_time(void)
|
||||
/* correct the clock when NTP error is too big */
|
||||
timekeeping_adjust(tk, offset);
|
||||
|
||||
/*
|
||||
* XXX This can be killed once everyone converts
|
||||
* to the new update_vsyscall.
|
||||
*/
|
||||
old_vsyscall_fixup(tk);
|
||||
|
||||
/*
|
||||
* Finally, make sure that after the rounding
|
||||
* xtime_nsec isn't larger than NSEC_PER_SEC
|
||||
|
||||
+23
-17
@@ -707,14 +707,18 @@ static inline void debug_timer_assert_init(struct timer_list *timer)
|
||||
debug_object_assert_init(timer, &timer_debug_descr);
|
||||
}
|
||||
|
||||
static void do_init_timer(struct timer_list *timer, unsigned int flags,
|
||||
static void do_init_timer(struct timer_list *timer,
|
||||
void (*func)(struct timer_list *),
|
||||
unsigned int flags,
|
||||
const char *name, struct lock_class_key *key);
|
||||
|
||||
void init_timer_on_stack_key(struct timer_list *timer, unsigned int flags,
|
||||
void init_timer_on_stack_key(struct timer_list *timer,
|
||||
void (*func)(struct timer_list *),
|
||||
unsigned int flags,
|
||||
const char *name, struct lock_class_key *key)
|
||||
{
|
||||
debug_object_init_on_stack(timer, &timer_debug_descr);
|
||||
do_init_timer(timer, flags, name, key);
|
||||
do_init_timer(timer, func, flags, name, key);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(init_timer_on_stack_key);
|
||||
|
||||
@@ -755,10 +759,13 @@ static inline void debug_assert_init(struct timer_list *timer)
|
||||
debug_timer_assert_init(timer);
|
||||
}
|
||||
|
||||
static void do_init_timer(struct timer_list *timer, unsigned int flags,
|
||||
static void do_init_timer(struct timer_list *timer,
|
||||
void (*func)(struct timer_list *),
|
||||
unsigned int flags,
|
||||
const char *name, struct lock_class_key *key)
|
||||
{
|
||||
timer->entry.pprev = NULL;
|
||||
timer->function = func;
|
||||
timer->flags = flags | raw_smp_processor_id();
|
||||
lockdep_init_map(&timer->lockdep_map, name, key, 0);
|
||||
}
|
||||
@@ -766,6 +773,7 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags,
|
||||
/**
|
||||
* init_timer_key - initialize a timer
|
||||
* @timer: the timer to be initialized
|
||||
* @func: timer callback function
|
||||
* @flags: timer flags
|
||||
* @name: name of the timer
|
||||
* @key: lockdep class key of the fake lock used for tracking timer
|
||||
@@ -774,11 +782,12 @@ static void do_init_timer(struct timer_list *timer, unsigned int flags,
|
||||
* init_timer_key() must be done to a timer prior calling *any* of the
|
||||
* other timer functions.
|
||||
*/
|
||||
void init_timer_key(struct timer_list *timer, unsigned int flags,
|
||||
void init_timer_key(struct timer_list *timer,
|
||||
void (*func)(struct timer_list *), unsigned int flags,
|
||||
const char *name, struct lock_class_key *key)
|
||||
{
|
||||
debug_init(timer);
|
||||
do_init_timer(timer, flags, name, key);
|
||||
do_init_timer(timer, func, flags, name, key);
|
||||
}
|
||||
EXPORT_SYMBOL(init_timer_key);
|
||||
|
||||
@@ -1107,12 +1116,12 @@ EXPORT_SYMBOL(timer_reduce);
|
||||
* add_timer - start a timer
|
||||
* @timer: the timer to be added
|
||||
*
|
||||
* The kernel will do a ->function(->data) callback from the
|
||||
* The kernel will do a ->function(@timer) callback from the
|
||||
* timer interrupt at the ->expires point in the future. The
|
||||
* current time is 'jiffies'.
|
||||
*
|
||||
* The timer's ->expires, ->function (and if the handler uses it, ->data)
|
||||
* fields must be set prior calling this function.
|
||||
* The timer's ->expires, ->function fields must be set prior calling this
|
||||
* function.
|
||||
*
|
||||
* Timers with an ->expires field in the past will be executed in the next
|
||||
* timer tick.
|
||||
@@ -1284,8 +1293,7 @@ int del_timer_sync(struct timer_list *timer)
|
||||
EXPORT_SYMBOL(del_timer_sync);
|
||||
#endif
|
||||
|
||||
static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
|
||||
unsigned long data)
|
||||
static void call_timer_fn(struct timer_list *timer, void (*fn)(struct timer_list *))
|
||||
{
|
||||
int count = preempt_count();
|
||||
|
||||
@@ -1309,7 +1317,7 @@ static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
|
||||
lock_map_acquire(&lockdep_map);
|
||||
|
||||
trace_timer_expire_entry(timer);
|
||||
fn(data);
|
||||
fn(timer);
|
||||
trace_timer_expire_exit(timer);
|
||||
|
||||
lock_map_release(&lockdep_map);
|
||||
@@ -1331,8 +1339,7 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)
|
||||
{
|
||||
while (!hlist_empty(head)) {
|
||||
struct timer_list *timer;
|
||||
void (*fn)(unsigned long);
|
||||
unsigned long data;
|
||||
void (*fn)(struct timer_list *);
|
||||
|
||||
timer = hlist_entry(head->first, struct timer_list, entry);
|
||||
|
||||
@@ -1340,15 +1347,14 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head)
|
||||
detach_timer(timer, true);
|
||||
|
||||
fn = timer->function;
|
||||
data = timer->data;
|
||||
|
||||
if (timer->flags & TIMER_IRQSAFE) {
|
||||
raw_spin_unlock(&base->lock);
|
||||
call_timer_fn(timer, fn, data);
|
||||
call_timer_fn(timer, fn);
|
||||
raw_spin_lock(&base->lock);
|
||||
} else {
|
||||
raw_spin_unlock_irq(&base->lock);
|
||||
call_timer_fn(timer, fn, data);
|
||||
call_timer_fn(timer, fn);
|
||||
raw_spin_lock_irq(&base->lock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -389,7 +389,7 @@ static int __init init_timer_list_procfs(void)
|
||||
{
|
||||
struct proc_dir_entry *pe;
|
||||
|
||||
pe = proc_create("timer_list", 0444, NULL, &timer_list_fops);
|
||||
pe = proc_create("timer_list", 0400, NULL, &timer_list_fops);
|
||||
if (!pe)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
||||
+1
-1
@@ -1509,7 +1509,7 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
|
||||
struct work_struct *work = &dwork->work;
|
||||
|
||||
WARN_ON_ONCE(!wq);
|
||||
WARN_ON_ONCE(timer->function != (TIMER_FUNC_TYPE)delayed_work_timer_fn);
|
||||
WARN_ON_ONCE(timer->function != delayed_work_timer_fn);
|
||||
WARN_ON_ONCE(timer_pending(timer));
|
||||
WARN_ON_ONCE(!list_empty(&work->entry));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user