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 | 100 | setup_timer_on_stack_key((timer), #timer, &__key, \ |
| 101 | 101 | (fn), (data)); \ |
| 102 | 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 | 110 | #else |
| 104 | 111 | #define init_timer(timer)\ |
| 105 | 112 | init_timer_key((timer), NULL, NULL) |
| @@ -111,6 +118,8 @@ void init_timer_deferrable_key(struct timer_list *timer, · 5 unmodified lines | ||
| 111 | 118 | setup_timer_key((timer), NULL, NULL, (fn), (data)) |
| 112 | 119 | #define setup_timer_on_stack(timer, fn, data)\ |
| 113 | 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 | 123 | #endif |
| 115 | 124 | |
| 116 | 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 | 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 | 169 | * timer_pending - is a timer pending? |
| 155 | 170 | * @timer: the timer in question |
| @@ -577,6 +577,19 @@ static void __init_timer(struct timer_list *timer, · 576 unmodified lines | ||
| 577 | 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 | 594 | * init_timer_key - initialize a timer |
| 582 | 595 | * @timer: the timer to be initialized |