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