In some cases (for instance with kernel threads) it may be desireable to use on-stack deferrable timers to get their power saving benefits. Add interfaces to support this for the IPS driver.
Unified · Split
| @@ -100,6 +100,13 @@ void init_timer_deferrable_key(struct timer_list *timer, · 99 unmodified lines | |||
| 100 | setup_timer_on_stack_key((timer), #timer, &__key, \ | 100 | setup_timer_on_stack_key((timer), #timer, &__key, \ |
| 101 | (fn), (data)); \ | 101 | (fn), (data)); \ |
| 102 | } while (0) | 102 | } while (0) |
| 103 | #define setup_deferrable_timer_on_stack(timer, fn, data) \ | ||
| 104 | do { \ | ||
| 105 | static struct lock_class_key __key; \ | ||
| 106 | setup_deferrable_timer_on_stack_key((timer), #timer, \ | ||
| 107 | &__key, (fn), \ | ||
| 108 | (data)); \ | ||
| 109 | } while (0) | ||
| 103 | #else | 110 | #else |
| 104 | #define init_timer(timer)\ | 111 | #define init_timer(timer)\ |
| 105 | init_timer_key((timer), NULL, NULL) | 112 | init_timer_key((timer), NULL, NULL) |
| @@ -111,6 +118,8 @@ void init_timer_deferrable_key(struct timer_list *timer, · 5 unmodified lines | |||
| 111 | setup_timer_key((timer), NULL, NULL, (fn), (data)) | 118 | setup_timer_key((timer), NULL, NULL, (fn), (data)) |
| 112 | #define setup_timer_on_stack(timer, fn, data)\ | 119 | #define setup_timer_on_stack(timer, fn, data)\ |
| 113 | setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | 120 | setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) |
| 121 | #define setup_deferrable_timer_on_stack(timer, fn, data)\ | ||
| 122 | setup_deferrable_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | ||
| 114 | #endif | 123 | #endif |
| 115 | 124 | ||
| 116 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS | 125 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
| @@ -150,6 +159,12 @@ static inline void setup_timer_on_stack_key(struct timer_list *timer, · 33 unmodified lines | |||
| 150 | init_timer_on_stack_key(timer, name, key); | 159 | init_timer_on_stack_key(timer, name, key); |
| 151 | } | 160 | } |
| 152 | 161 | ||
| 162 | extern void setup_deferrable_timer_on_stack_key(struct timer_list *timer, | ||
| 163 | const char *name, | ||
| 164 | struct lock_class_key *key, | ||
| 165 | void (*function)(unsigned long), | ||
| 166 | unsigned long data); | ||
| 167 | |||
| 153 | /** | 168 | /** |
| 154 | * timer_pending - is a timer pending? | 169 | * timer_pending - is a timer pending? |
| 155 | * @timer: the timer in question | 170 | * @timer: the timer in question |
| @@ -577,6 +577,19 @@ static void __init_timer(struct timer_list *timer, · 576 unmodified lines | |||
| 577 | lockdep_init_map(&timer->lockdep_map, name, key, 0); | 577 | lockdep_init_map(&timer->lockdep_map, name, key, 0); |
| 578 | } | 578 | } |
| 579 | 579 | ||
| 580 | void setup_deferrable_timer_on_stack_key(struct timer_list *timer, | ||
| 581 | const char *name, | ||
| 582 | struct lock_class_key *key, | ||
| 583 | void (*function)(unsigned long), | ||
| 584 | unsigned long data) | ||
| 585 | { | ||
| 586 | timer->function = function; | ||
| 587 | timer->data = data; | ||
| 588 | init_timer_on_stack_key(timer, name, key); | ||
| 589 | timer_set_deferrable(timer); | ||
| 590 | } | ||
| 591 | EXPORT_SYMBOL_GPL(setup_deferrable_timer_on_stack_key); | ||
| 592 | |||
| 580 | /** | 593 | /** |
| 581 | * init_timer_key - initialize a timer | 594 | * init_timer_key - initialize a timer |
| 582 | * @timer: the timer to be initialized | 595 | * @timer: the timer to be initialized |