New upstream version 17.11.1
[deb_dpdk.git] / lib / librte_eal / common / include / rte_keepalive.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright 2015-2016 Intel Shannon Ltd. All rights reserved.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  *       notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above copyright
13  *       notice, this list of conditions and the following disclaimer in
14  *       the documentation and/or other materials provided with the
15  *       distribution.
16  *     * Neither the name of Intel Corporation nor the names of its
17  *       contributors may be used to endorse or promote products derived
18  *       from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 /**
34  * @file rte_keepalive.h
35  * DPDK RTE LCore Keepalive Monitor.
36  *
37  **/
38
39 #ifndef _KEEPALIVE_H_
40 #define _KEEPALIVE_H_
41
42 #include <rte_config.h>
43 #include <rte_memory.h>
44
45 #ifndef RTE_KEEPALIVE_MAXCORES
46 /**
47  * Number of cores to track.
48  * @note Must be larger than the highest core id. */
49 #define RTE_KEEPALIVE_MAXCORES RTE_MAX_LCORE
50 #endif
51
52 enum rte_keepalive_state {
53         RTE_KA_STATE_UNUSED = 0,
54         RTE_KA_STATE_ALIVE = 1,
55         RTE_KA_STATE_MISSING = 4,
56         RTE_KA_STATE_DEAD = 2,
57         RTE_KA_STATE_GONE = 3,
58         RTE_KA_STATE_DOZING = 5,
59         RTE_KA_STATE_SLEEP = 6
60 };
61
62 /**
63  * Keepalive failure callback.
64  *
65  *  Receives a data pointer passed to rte_keepalive_create() and the id of the
66  *  failed core.
67  *  @param data Data pointer passed to rte_keepalive_create()
68  *  @param id_core ID of the core that has failed
69  */
70 typedef void (*rte_keepalive_failure_callback_t)(
71         void *data,
72         const int id_core);
73
74 /**
75  * Keepalive relay callback.
76  *
77  *  Receives a data pointer passed to rte_keepalive_register_relay_callback(),
78  *  the id of the core for which state is to be forwarded, and details of the
79  *  current core state.
80  *  @param data Data pointer passed to rte_keepalive_register_relay_callback()
81  *  @param id_core ID of the core for which state is being reported
82  *  @param core_state The current state of the core
83  *  @param Timestamp of when core was last seen alive
84  */
85 typedef void (*rte_keepalive_relay_callback_t)(
86         void *data,
87         const int id_core,
88         enum rte_keepalive_state core_state,
89         uint64_t last_seen
90         );
91
92 /**
93  * Keepalive state structure.
94  * @internal
95  */
96 struct rte_keepalive;
97
98 /**
99  * Initialise keepalive sub-system.
100  * @param callback
101  *   Function called upon detection of a dead core.
102  * @param data
103  *   Data pointer to be passed to function callback.
104  * @return
105  *   Keepalive structure success, NULL on failure.
106  */
107 struct rte_keepalive *rte_keepalive_create(
108         rte_keepalive_failure_callback_t callback,
109         void *data);
110
111 /**
112  * Checks & handles keepalive state of monitored cores.
113  * @param *ptr_timer Triggering timer (unused)
114  * @param *ptr_data  Data pointer (keepalive structure)
115  */
116 void rte_keepalive_dispatch_pings(void *ptr_timer, void *ptr_data);
117
118 /**
119  * Registers a core for keepalive checks.
120  * @param *keepcfg
121  *   Keepalive structure pointer
122  * @param id_core
123  *   ID number of core to register.
124  */
125 void rte_keepalive_register_core(struct rte_keepalive *keepcfg,
126         const int id_core);
127
128 /**
129  * Per-core keepalive check.
130  * @param *keepcfg
131  *   Keepalive structure pointer
132  *
133  * This function needs to be called from within the main process loop of
134  * the LCore to be checked.
135  */
136 void
137 rte_keepalive_mark_alive(struct rte_keepalive *keepcfg);
138
139 /**
140  * Per-core sleep-time indication.
141  * @param *keepcfg
142  *   Keepalive structure pointer
143  *
144  * If CPU idling is enabled, this function needs to be called from within
145  * the main process loop of the LCore going to sleep, in order to avoid
146  * the LCore being mis-detected as dead.
147  */
148 void
149 rte_keepalive_mark_sleep(struct rte_keepalive *keepcfg);
150
151 /**
152  * Registers a 'live core' callback.
153  *
154  * The complement of the 'dead core' callback. This is called when a
155  * core is known to be alive, and is intended for cases when an app
156  * needs to know 'liveness' beyond just knowing when a core has died.
157  *
158  * @param *keepcfg
159  *   Keepalive structure pointer
160  * @param callback
161  *   Function called upon detection of a dead core.
162  * @param data
163  *   Data pointer to be passed to function callback.
164  */
165 void
166 rte_keepalive_register_relay_callback(struct rte_keepalive *keepcfg,
167         rte_keepalive_relay_callback_t callback,
168         void *data);
169
170 #endif /* _KEEPALIVE_H_ */