xref: /illumos-gate/usr/src/compat/bhyve/sys/callout.h (revision e0994bd2)
1d0b3c59bSPatrick Mooney /*
2d0b3c59bSPatrick Mooney  * This file and its contents are supplied under the terms of the
3d0b3c59bSPatrick Mooney  * Common Development and Distribution License ("CDDL"), version 1.0.
4d0b3c59bSPatrick Mooney  * You may only use this file in accordance with the terms of version
5d0b3c59bSPatrick Mooney  * 1.0 of the CDDL.
6d0b3c59bSPatrick Mooney  *
7d0b3c59bSPatrick Mooney  * A full copy of the text of the CDDL should have accompanied this
8d0b3c59bSPatrick Mooney  * source.  A copy of the CDDL is also available via the Internet at
9d0b3c59bSPatrick Mooney  * http://www.illumos.org/license/CDDL.
10d0b3c59bSPatrick Mooney  */
11d0b3c59bSPatrick Mooney 
12d0b3c59bSPatrick Mooney /*
13d0b3c59bSPatrick Mooney  * Copyright 2014 Pluribus Networks Inc.
14d0b3c59bSPatrick Mooney  * Copyright 2018 Joyent, Inc.
15d0b3c59bSPatrick Mooney  * Copyright 2020 Oxide Computer Company
16d0b3c59bSPatrick Mooney  */
17d0b3c59bSPatrick Mooney 
18d0b3c59bSPatrick Mooney #ifndef _COMPAT_FREEBSD_SYS_CALLOUT_H_
19d0b3c59bSPatrick Mooney #define	_COMPAT_FREEBSD_SYS_CALLOUT_H_
20d0b3c59bSPatrick Mooney 
21d0b3c59bSPatrick Mooney #include <sys/cyclic.h>
22d0b3c59bSPatrick Mooney 
23d0b3c59bSPatrick Mooney struct callout {
24d0b3c59bSPatrick Mooney 	cyclic_id_t	c_cyc_id;
25d0b3c59bSPatrick Mooney 	hrtime_t	c_target;
26d0b3c59bSPatrick Mooney 	hrtime_t	c_fired;
27d0b3c59bSPatrick Mooney 	void		(*c_func)(void *);
28d0b3c59bSPatrick Mooney 	void		*c_arg;
29d0b3c59bSPatrick Mooney };
30d0b3c59bSPatrick Mooney 
31d0b3c59bSPatrick Mooney #define	C_ABSOLUTE		0x0200	/* event time is absolute. */
32d0b3c59bSPatrick Mooney 
33d0b3c59bSPatrick Mooney /* Callout considered active if t_target has not been zeroed */
34d0b3c59bSPatrick Mooney #define	callout_active(c)	((c)->c_target != 0)
35d0b3c59bSPatrick Mooney #define	callout_deactivate(c)	((c)->c_target = 0)
36d0b3c59bSPatrick Mooney 
37d0b3c59bSPatrick Mooney /*
38d0b3c59bSPatrick Mooney  * If a callout is rescheduled (into the future) while its handler is running,
39d0b3c59bSPatrick Mooney  * it will be able to detect the pending invocation by the target time being
40d0b3c59bSPatrick Mooney  * greater than the time at which the handler was fired.
41d0b3c59bSPatrick Mooney  *
42d0b3c59bSPatrick Mooney  * This is only valid when checked from the callout handler, which is the only
43d0b3c59bSPatrick Mooney  * place where it is used by bhyve today.
44d0b3c59bSPatrick Mooney  */
45d0b3c59bSPatrick Mooney #define	callout_pending(c)	((c)->c_target > (c)->c_fired)
46d0b3c59bSPatrick Mooney 
47d0b3c59bSPatrick Mooney void vmm_glue_callout_init(struct callout *c, int mpsafe);
48*e0994bd2SPatrick Mooney void vmm_glue_callout_stop(struct callout *c);
49*e0994bd2SPatrick Mooney void vmm_glue_callout_drain(struct callout *c);
50d0b3c59bSPatrick Mooney 
51d0b3c59bSPatrick Mooney /* illumos-custom function for resource locality optimization */
52d0b3c59bSPatrick Mooney void	vmm_glue_callout_localize(struct callout *c);
53d0b3c59bSPatrick Mooney 
54d0b3c59bSPatrick Mooney static __inline void
callout_init(struct callout * c,int mpsafe)55d0b3c59bSPatrick Mooney callout_init(struct callout *c, int mpsafe)
56d0b3c59bSPatrick Mooney {
57d0b3c59bSPatrick Mooney 	vmm_glue_callout_init(c, mpsafe);
58d0b3c59bSPatrick Mooney }
59d0b3c59bSPatrick Mooney 
60*e0994bd2SPatrick Mooney static __inline void
callout_stop(struct callout * c)61d0b3c59bSPatrick Mooney callout_stop(struct callout *c)
62d0b3c59bSPatrick Mooney {
63*e0994bd2SPatrick Mooney 	vmm_glue_callout_stop(c);
64d0b3c59bSPatrick Mooney }
65d0b3c59bSPatrick Mooney 
66*e0994bd2SPatrick Mooney static __inline void
callout_drain(struct callout * c)67d0b3c59bSPatrick Mooney callout_drain(struct callout *c)
68d0b3c59bSPatrick Mooney {
69*e0994bd2SPatrick Mooney 	vmm_glue_callout_drain(c);
70d0b3c59bSPatrick Mooney }
71d0b3c59bSPatrick Mooney 
725103e761SPatrick Mooney void callout_reset_hrtime(struct callout *c, hrtime_t target,
735103e761SPatrick Mooney     void (*func)(void *), void *arg, int flags);
74d0b3c59bSPatrick Mooney 
755103e761SPatrick Mooney uint64_t hrt_freq_count(hrtime_t interval, uint32_t freq);
765103e761SPatrick Mooney hrtime_t hrt_freq_interval(uint32_t freq, uint64_t count);
77d0b3c59bSPatrick Mooney 
78d0b3c59bSPatrick Mooney #endif	/* _COMPAT_FREEBSD_SYS_CALLOUT_H_ */
79