1c369667eSFrançois Tigeot /* 277343d59SFrançois Tigeot * Copyright (c) 2010 Isilon Systems, Inc. 377343d59SFrançois Tigeot * Copyright (c) 2010 iX Systems, Inc. 477343d59SFrançois Tigeot * Copyright (c) 2010 Panasas, Inc. 5*23b649bfSFrançois Tigeot * Copyright (c) 2014-2020 François Tigeot <ftigeot@wolfpond.org> 677343d59SFrançois Tigeot * All rights reserved. 777343d59SFrançois Tigeot * 877343d59SFrançois Tigeot * Redistribution and use in source and binary forms, with or without 977343d59SFrançois Tigeot * modification, are permitted provided that the following conditions 1077343d59SFrançois Tigeot * are met: 1177343d59SFrançois Tigeot * 1. Redistributions of source code must retain the above copyright 1277343d59SFrançois Tigeot * notice unmodified, this list of conditions, and the following 1377343d59SFrançois Tigeot * disclaimer. 1477343d59SFrançois Tigeot * 2. Redistributions in binary form must reproduce the above copyright 1577343d59SFrançois Tigeot * notice, this list of conditions and the following disclaimer in the 1677343d59SFrançois Tigeot * documentation and/or other materials provided with the distribution. 1777343d59SFrançois Tigeot * 1877343d59SFrançois Tigeot * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1977343d59SFrançois Tigeot * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2077343d59SFrançois Tigeot * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2177343d59SFrançois Tigeot * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2277343d59SFrançois Tigeot * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2377343d59SFrançois Tigeot * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2477343d59SFrançois Tigeot * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2577343d59SFrançois Tigeot * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2677343d59SFrançois Tigeot * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2777343d59SFrançois Tigeot * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2877343d59SFrançois Tigeot */ 2977343d59SFrançois Tigeot #ifndef _LINUX_TIMER_H_ 3077343d59SFrançois Tigeot #define _LINUX_TIMER_H_ 3177343d59SFrançois Tigeot 32c369667eSFrançois Tigeot #include <linux/list.h> 3301c621f3SFrançois Tigeot #include <linux/ktime.h> 34c369667eSFrançois Tigeot #include <linux/stddef.h> 35c369667eSFrançois Tigeot #include <linux/stringify.h> 36c369667eSFrançois Tigeot 37c369667eSFrançois Tigeot #include <sys/callout.h> 3801c621f3SFrançois Tigeot 3977343d59SFrançois Tigeot struct timer_list { 4077343d59SFrançois Tigeot struct callout timer_callout; 4177343d59SFrançois Tigeot void (*function)(unsigned long); 4277343d59SFrançois Tigeot unsigned long data; 4377343d59SFrançois Tigeot unsigned long expires; 4477343d59SFrançois Tigeot }; 4577343d59SFrançois Tigeot 4677343d59SFrançois Tigeot static inline void 4777343d59SFrançois Tigeot _timer_fn(void *context) 4877343d59SFrançois Tigeot { 4977343d59SFrançois Tigeot struct timer_list *timer; 5077343d59SFrançois Tigeot 5177343d59SFrançois Tigeot timer = context; 5277343d59SFrançois Tigeot timer->function(timer->data); 5377343d59SFrançois Tigeot } 5477343d59SFrançois Tigeot 5577343d59SFrançois Tigeot #define setup_timer(timer, func, dat) \ 5677343d59SFrançois Tigeot do { \ 5777343d59SFrançois Tigeot (timer)->function = (func); \ 5877343d59SFrançois Tigeot (timer)->data = (dat); \ 59fe87864cSFrançois Tigeot callout_init_mp(&(timer)->timer_callout); \ 6077343d59SFrançois Tigeot } while (0) 6177343d59SFrançois Tigeot 62d9b1635cSFrançois Tigeot #define setup_timer_on_stack(t, f,d) setup_timer(t, f, d) 63d9b1635cSFrançois Tigeot 64*23b649bfSFrançois Tigeot #define __setup_timer(timer, func, data, flags) \ 65*23b649bfSFrançois Tigeot do { \ 66*23b649bfSFrançois Tigeot setup_timer(timer, func, data); \ 67*23b649bfSFrançois Tigeot } while (0) 68*23b649bfSFrançois Tigeot 6977343d59SFrançois Tigeot #define init_timer(timer) \ 7077343d59SFrançois Tigeot do { \ 7177343d59SFrançois Tigeot (timer)->function = NULL; \ 7277343d59SFrançois Tigeot (timer)->data = 0; \ 73fe87864cSFrançois Tigeot callout_init_mp(&(timer)->timer_callout); \ 7477343d59SFrançois Tigeot } while (0) 7577343d59SFrançois Tigeot 7677343d59SFrançois Tigeot #define mod_timer(timer, exp) \ 7777343d59SFrançois Tigeot do { \ 7877343d59SFrançois Tigeot (timer)->expires = (exp); \ 7977343d59SFrançois Tigeot callout_reset(&(timer)->timer_callout, (exp) - jiffies, \ 8077343d59SFrançois Tigeot _timer_fn, (timer)); \ 8177343d59SFrançois Tigeot } while (0) 8277343d59SFrançois Tigeot 83203d5d51SFrançois Tigeot #define mod_timer_pinned(timer, exp) mod_timer(timer, exp) 84203d5d51SFrançois Tigeot 8577343d59SFrançois Tigeot #define add_timer(timer) \ 8677343d59SFrançois Tigeot callout_reset(&(timer)->timer_callout, \ 87fe87864cSFrançois Tigeot (timer)->expires - jiffies, _timer_fn, (timer)); \ 8877343d59SFrançois Tigeot 89fe87864cSFrançois Tigeot static inline void 90fe87864cSFrançois Tigeot del_timer(struct timer_list *timer) 91fe87864cSFrançois Tigeot { 92fe87864cSFrançois Tigeot callout_stop(&(timer)->timer_callout); 93fe87864cSFrançois Tigeot } 94fe87864cSFrançois Tigeot 955abb6f61SImre Vadász static inline int 965abb6f61SImre Vadász del_timer_sync(struct timer_list *timer) 975abb6f61SImre Vadász { 985abb6f61SImre Vadász return callout_drain(&(timer)->timer_callout) == 0; 995abb6f61SImre Vadász } 1005abb6f61SImre Vadász 101d9b1635cSFrançois Tigeot #define del_singleshot_timer_sync(timer) del_timer_sync(timer) 10277343d59SFrançois Tigeot 10377343d59SFrançois Tigeot #define timer_pending(timer) callout_pending(&(timer)->timer_callout) 10477343d59SFrançois Tigeot 10577343d59SFrançois Tigeot static inline unsigned long 10677343d59SFrançois Tigeot round_jiffies(unsigned long j) 10777343d59SFrançois Tigeot { 10877343d59SFrançois Tigeot return roundup(j, hz); 10977343d59SFrançois Tigeot } 11077343d59SFrançois Tigeot 111fe87864cSFrançois Tigeot static inline unsigned long 112fe87864cSFrançois Tigeot round_jiffies_up(unsigned long j) 113fe87864cSFrançois Tigeot { 114fe87864cSFrançois Tigeot return roundup(j, hz); 115fe87864cSFrançois Tigeot } 116fe87864cSFrançois Tigeot 1177f070b26SFrançois Tigeot static inline unsigned long 1187f070b26SFrançois Tigeot round_jiffies_up_relative(unsigned long j) 1197f070b26SFrançois Tigeot { 1207f070b26SFrançois Tigeot return roundup(j, hz); 1217f070b26SFrançois Tigeot } 1227f070b26SFrançois Tigeot 1234c816622SFrançois Tigeot #define destroy_timer_on_stack(timer) 1244c816622SFrançois Tigeot 125*23b649bfSFrançois Tigeot #define TIMER_IRQSAFE 0x00200000 126*23b649bfSFrançois Tigeot 12777343d59SFrançois Tigeot #endif /* _LINUX_TIMER_H_ */ 128