xref: /dpdk/lib/dispatcher/rte_dispatcher.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1ecca8a0bSMattias Rönnblom /* SPDX-License-Identifier: BSD-3-Clause
2ecca8a0bSMattias Rönnblom  * Copyright(c) 2023 Ericsson AB
3ecca8a0bSMattias Rönnblom  */
4ecca8a0bSMattias Rönnblom 
5ecca8a0bSMattias Rönnblom #ifndef RTE_DISPATCHER_H
6ecca8a0bSMattias Rönnblom #define RTE_DISPATCHER_H
7ecca8a0bSMattias Rönnblom 
8ecca8a0bSMattias Rönnblom /**
9ecca8a0bSMattias Rönnblom  * @file
10ecca8a0bSMattias Rönnblom  *
11ecca8a0bSMattias Rönnblom  * RTE Dispatcher
12ecca8a0bSMattias Rönnblom  *
13ecca8a0bSMattias Rönnblom  * @warning
14ecca8a0bSMattias Rönnblom  * @b EXPERIMENTAL:
15ecca8a0bSMattias Rönnblom  * All functions in this file may be changed or removed without prior notice.
16ecca8a0bSMattias Rönnblom  *
17ecca8a0bSMattias Rönnblom  * The purpose of the dispatcher is to help decouple different parts
18ecca8a0bSMattias Rönnblom  * of an application (e.g., modules), sharing the same underlying
19ecca8a0bSMattias Rönnblom  * event device.
20ecca8a0bSMattias Rönnblom  */
21ecca8a0bSMattias Rönnblom 
22ecca8a0bSMattias Rönnblom #include <stdbool.h>
23ecca8a0bSMattias Rönnblom #include <stdint.h>
24ecca8a0bSMattias Rönnblom 
25ecca8a0bSMattias Rönnblom #include <rte_compat.h>
26ecca8a0bSMattias Rönnblom #include <rte_eventdev.h>
27ecca8a0bSMattias Rönnblom 
28*719834a6SMattias Rönnblom #ifdef __cplusplus
29*719834a6SMattias Rönnblom extern "C" {
30*719834a6SMattias Rönnblom #endif
31*719834a6SMattias Rönnblom 
32ecca8a0bSMattias Rönnblom /**
33ecca8a0bSMattias Rönnblom  * Function prototype for match callbacks.
34ecca8a0bSMattias Rönnblom  *
35ecca8a0bSMattias Rönnblom  * Match callbacks are used by an application to decide how the
36ecca8a0bSMattias Rönnblom  * dispatcher distributes events to different parts of the
37ecca8a0bSMattias Rönnblom  * application.
38ecca8a0bSMattias Rönnblom  *
39ecca8a0bSMattias Rönnblom  * The application is not expected to process the event at the point
40ecca8a0bSMattias Rönnblom  * of the match call. Such matters should be deferred to the process
41ecca8a0bSMattias Rönnblom  * callback invocation.
42ecca8a0bSMattias Rönnblom  *
43ecca8a0bSMattias Rönnblom  * The match callback may be used as an opportunity to prefetch data.
44ecca8a0bSMattias Rönnblom  *
45ecca8a0bSMattias Rönnblom  * @param event
46ecca8a0bSMattias Rönnblom  *  Pointer to event
47ecca8a0bSMattias Rönnblom  *
48ecca8a0bSMattias Rönnblom  * @param cb_data
49ecca8a0bSMattias Rönnblom  *  The pointer supplied by the application in
50ecca8a0bSMattias Rönnblom  *  rte_dispatcher_register().
51ecca8a0bSMattias Rönnblom  *
52ecca8a0bSMattias Rönnblom  * @return
53ecca8a0bSMattias Rönnblom  *   Returns true in case this event should be delivered (via
54ecca8a0bSMattias Rönnblom  *   the process callback), and false otherwise.
55ecca8a0bSMattias Rönnblom  */
56ecca8a0bSMattias Rönnblom typedef bool (*rte_dispatcher_match_t)(const struct rte_event *event,
57ecca8a0bSMattias Rönnblom 	void *cb_data);
58ecca8a0bSMattias Rönnblom 
59ecca8a0bSMattias Rönnblom /**
60ecca8a0bSMattias Rönnblom  * Function prototype for process callbacks.
61ecca8a0bSMattias Rönnblom  *
62ecca8a0bSMattias Rönnblom  * The process callbacks are used by the dispatcher to deliver
63ecca8a0bSMattias Rönnblom  * events for processing.
64ecca8a0bSMattias Rönnblom  *
65ecca8a0bSMattias Rönnblom  * @param event_dev_id
66ecca8a0bSMattias Rönnblom  *  The originating event device id.
67ecca8a0bSMattias Rönnblom  *
68ecca8a0bSMattias Rönnblom  * @param event_port_id
69ecca8a0bSMattias Rönnblom  *  The originating event port.
70ecca8a0bSMattias Rönnblom  *
71ecca8a0bSMattias Rönnblom  * @param events
72ecca8a0bSMattias Rönnblom  *  Pointer to an array of events.
73ecca8a0bSMattias Rönnblom  *
74ecca8a0bSMattias Rönnblom  * @param num
75ecca8a0bSMattias Rönnblom  *  The number of events in the @p events array.
76ecca8a0bSMattias Rönnblom  *
77ecca8a0bSMattias Rönnblom  * @param cb_data
78ecca8a0bSMattias Rönnblom  *  The pointer supplied by the application in
79ecca8a0bSMattias Rönnblom  *  rte_dispatcher_register().
80ecca8a0bSMattias Rönnblom  */
81ecca8a0bSMattias Rönnblom typedef void (*rte_dispatcher_process_t)(uint8_t event_dev_id,
82ecca8a0bSMattias Rönnblom 	uint8_t event_port_id, struct rte_event *events, uint16_t num,
83ecca8a0bSMattias Rönnblom 	void *cb_data);
84ecca8a0bSMattias Rönnblom 
85ecca8a0bSMattias Rönnblom /**
86ecca8a0bSMattias Rönnblom  * Function prototype for finalize callbacks.
87ecca8a0bSMattias Rönnblom  *
88ecca8a0bSMattias Rönnblom  * The finalize callbacks are used by the dispatcher to notify the
89ecca8a0bSMattias Rönnblom  * application it has delivered all events from a particular batch
90ecca8a0bSMattias Rönnblom  * dequeued from the event device.
91ecca8a0bSMattias Rönnblom  *
92ecca8a0bSMattias Rönnblom  * @param event_dev_id
93ecca8a0bSMattias Rönnblom  *  The originating event device id.
94ecca8a0bSMattias Rönnblom  *
95ecca8a0bSMattias Rönnblom  * @param event_port_id
96ecca8a0bSMattias Rönnblom  *  The originating event port.
97ecca8a0bSMattias Rönnblom  *
98ecca8a0bSMattias Rönnblom  * @param cb_data
99ecca8a0bSMattias Rönnblom  *  The pointer supplied by the application in
100ecca8a0bSMattias Rönnblom  *  rte_dispatcher_finalize_register().
101ecca8a0bSMattias Rönnblom  */
102ecca8a0bSMattias Rönnblom typedef void (*rte_dispatcher_finalize_t)(uint8_t event_dev_id,
103ecca8a0bSMattias Rönnblom 	uint8_t event_port_id, void *cb_data);
104ecca8a0bSMattias Rönnblom 
105ecca8a0bSMattias Rönnblom /**
106ecca8a0bSMattias Rönnblom  * Dispatcher statistics
107ecca8a0bSMattias Rönnblom  */
108ecca8a0bSMattias Rönnblom struct rte_dispatcher_stats {
109ecca8a0bSMattias Rönnblom 	/** Number of event dequeue calls made toward the event device. */
110ecca8a0bSMattias Rönnblom 	uint64_t poll_count;
111ecca8a0bSMattias Rönnblom 	/** Number of non-empty event batches dequeued from event device.*/
112ecca8a0bSMattias Rönnblom 	uint64_t ev_batch_count;
113ecca8a0bSMattias Rönnblom 	/** Number of events dispatched to a handler.*/
114ecca8a0bSMattias Rönnblom 	uint64_t ev_dispatch_count;
115ecca8a0bSMattias Rönnblom 	/** Number of events dropped because no handler was found. */
116ecca8a0bSMattias Rönnblom 	uint64_t ev_drop_count;
117ecca8a0bSMattias Rönnblom };
118ecca8a0bSMattias Rönnblom 
119ecca8a0bSMattias Rönnblom /**
120ecca8a0bSMattias Rönnblom  * Create a dispatcher with the specified id.
121ecca8a0bSMattias Rönnblom  *
122ecca8a0bSMattias Rönnblom  * @param event_dev_id
123ecca8a0bSMattias Rönnblom  *  The identifier of the event device from which this dispatcher
124ecca8a0bSMattias Rönnblom  *  will dequeue events.
125ecca8a0bSMattias Rönnblom  *
126ecca8a0bSMattias Rönnblom  * @return
127ecca8a0bSMattias Rönnblom  *   A pointer to a new dispatcher instance, or NULL on failure, in which
128ecca8a0bSMattias Rönnblom  *   case rte_errno is set.
129ecca8a0bSMattias Rönnblom  */
130ecca8a0bSMattias Rönnblom __rte_experimental
131ecca8a0bSMattias Rönnblom struct rte_dispatcher *
132ecca8a0bSMattias Rönnblom rte_dispatcher_create(uint8_t event_dev_id);
133ecca8a0bSMattias Rönnblom 
134ecca8a0bSMattias Rönnblom /**
135ecca8a0bSMattias Rönnblom  * Free a dispatcher.
136ecca8a0bSMattias Rönnblom  *
137ecca8a0bSMattias Rönnblom  * @param dispatcher
138ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
139ecca8a0bSMattias Rönnblom  *
140ecca8a0bSMattias Rönnblom  * @return
141ecca8a0bSMattias Rönnblom  *  - 0: Success
142ecca8a0bSMattias Rönnblom  *  - <0: Error code on failure
143ecca8a0bSMattias Rönnblom  */
144ecca8a0bSMattias Rönnblom __rte_experimental
145ecca8a0bSMattias Rönnblom int
146ecca8a0bSMattias Rönnblom rte_dispatcher_free(struct rte_dispatcher *dispatcher);
147ecca8a0bSMattias Rönnblom 
148ecca8a0bSMattias Rönnblom /**
149ecca8a0bSMattias Rönnblom  * Retrieve the service identifier of a dispatcher.
150ecca8a0bSMattias Rönnblom  *
151ecca8a0bSMattias Rönnblom  * @param dispatcher
152ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
153ecca8a0bSMattias Rönnblom  *
154ecca8a0bSMattias Rönnblom  * @return
155ecca8a0bSMattias Rönnblom  *  The dispatcher service's id.
156ecca8a0bSMattias Rönnblom  */
157ecca8a0bSMattias Rönnblom __rte_experimental
158ecca8a0bSMattias Rönnblom uint32_t
159ecca8a0bSMattias Rönnblom rte_dispatcher_service_id_get(const struct rte_dispatcher *dispatcher);
160ecca8a0bSMattias Rönnblom 
161ecca8a0bSMattias Rönnblom /**
162ecca8a0bSMattias Rönnblom  * Binds an event device port to a specific lcore on the specified
163ecca8a0bSMattias Rönnblom  * dispatcher.
164ecca8a0bSMattias Rönnblom  *
165ecca8a0bSMattias Rönnblom  * This function configures the event port id to be used by the event
166ecca8a0bSMattias Rönnblom  * dispatcher service, if run on the specified lcore.
167ecca8a0bSMattias Rönnblom  *
168ecca8a0bSMattias Rönnblom  * Multiple event device ports may be bound to the same lcore. A
169ecca8a0bSMattias Rönnblom  * particular port must not be bound to more than one lcore.
170ecca8a0bSMattias Rönnblom  *
171ecca8a0bSMattias Rönnblom  * If the dispatcher service is mapped (with rte_service_map_lcore_set())
172ecca8a0bSMattias Rönnblom  * to a lcore to which no ports are bound, the service function will be a
173ecca8a0bSMattias Rönnblom  * no-operation.
174ecca8a0bSMattias Rönnblom  *
175ecca8a0bSMattias Rönnblom  * This function may be called by any thread (including unregistered
176ecca8a0bSMattias Rönnblom  * non-EAL threads), but not while the dispatcher is running on lcore
177ecca8a0bSMattias Rönnblom  * specified by @c lcore_id.
178ecca8a0bSMattias Rönnblom  *
179ecca8a0bSMattias Rönnblom  * @param dispatcher
180ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
181ecca8a0bSMattias Rönnblom  *
182ecca8a0bSMattias Rönnblom  * @param event_port_id
183ecca8a0bSMattias Rönnblom  *  The event device port identifier.
184ecca8a0bSMattias Rönnblom  *
185ecca8a0bSMattias Rönnblom  * @param batch_size
186ecca8a0bSMattias Rönnblom  *  The batch size to use in rte_event_dequeue_burst(), for the
187ecca8a0bSMattias Rönnblom  *  configured event device port and lcore.
188ecca8a0bSMattias Rönnblom  *
189ecca8a0bSMattias Rönnblom  * @param timeout
190ecca8a0bSMattias Rönnblom  *  The timeout parameter to use in rte_event_dequeue_burst(), for the
191ecca8a0bSMattias Rönnblom  *  configured event device port and lcore.
192ecca8a0bSMattias Rönnblom  *
193ecca8a0bSMattias Rönnblom  * @param lcore_id
194ecca8a0bSMattias Rönnblom  *  The lcore by which this event port will be used.
195ecca8a0bSMattias Rönnblom  *
196ecca8a0bSMattias Rönnblom  * @return
197ecca8a0bSMattias Rönnblom  *  - 0: Success
198ecca8a0bSMattias Rönnblom  *  - -ENOMEM: Unable to allocate sufficient resources.
199ecca8a0bSMattias Rönnblom  *  - -EEXISTS: Event port is already configured.
200ecca8a0bSMattias Rönnblom  *  - -EINVAL: Invalid arguments.
201ecca8a0bSMattias Rönnblom  */
202ecca8a0bSMattias Rönnblom __rte_experimental
203ecca8a0bSMattias Rönnblom int
204ecca8a0bSMattias Rönnblom rte_dispatcher_bind_port_to_lcore(struct rte_dispatcher *dispatcher,
205ecca8a0bSMattias Rönnblom 	uint8_t event_port_id, uint16_t batch_size, uint64_t timeout,
206ecca8a0bSMattias Rönnblom 	unsigned int lcore_id);
207ecca8a0bSMattias Rönnblom 
208ecca8a0bSMattias Rönnblom /**
209ecca8a0bSMattias Rönnblom  * Unbind an event device port from a specific lcore.
210ecca8a0bSMattias Rönnblom  *
211ecca8a0bSMattias Rönnblom  * This function may be called by any thread (including unregistered
212ecca8a0bSMattias Rönnblom  * non-EAL threads), but not while the dispatcher is running on
213ecca8a0bSMattias Rönnblom  * lcore specified by @c lcore_id.
214ecca8a0bSMattias Rönnblom  *
215ecca8a0bSMattias Rönnblom  * @param dispatcher
216ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
217ecca8a0bSMattias Rönnblom  *
218ecca8a0bSMattias Rönnblom  * @param event_port_id
219ecca8a0bSMattias Rönnblom  *  The event device port identifier.
220ecca8a0bSMattias Rönnblom  *
221ecca8a0bSMattias Rönnblom  * @param lcore_id
222ecca8a0bSMattias Rönnblom  *  The lcore which was using this event port.
223ecca8a0bSMattias Rönnblom  *
224ecca8a0bSMattias Rönnblom  * @return
225ecca8a0bSMattias Rönnblom  *  - 0: Success
226ecca8a0bSMattias Rönnblom  *  - -ENOENT: Event port id not bound to this @c lcore_id.
227ecca8a0bSMattias Rönnblom  */
228ecca8a0bSMattias Rönnblom __rte_experimental
229ecca8a0bSMattias Rönnblom int
230ecca8a0bSMattias Rönnblom rte_dispatcher_unbind_port_from_lcore(struct rte_dispatcher *dispatcher,
231ecca8a0bSMattias Rönnblom 	uint8_t event_port_id, unsigned int lcore_id);
232ecca8a0bSMattias Rönnblom 
233ecca8a0bSMattias Rönnblom /**
234ecca8a0bSMattias Rönnblom  * Register an event handler.
235ecca8a0bSMattias Rönnblom  *
236ecca8a0bSMattias Rönnblom  * The match callback function is used to select if a particular event
237ecca8a0bSMattias Rönnblom  * should be delivered, using the corresponding process callback
238ecca8a0bSMattias Rönnblom  * function.
239ecca8a0bSMattias Rönnblom  *
240ecca8a0bSMattias Rönnblom  * The reason for having two distinct steps is to allow the dispatcher
241ecca8a0bSMattias Rönnblom  * to deliver all events as a batch. This in turn will cause
242ecca8a0bSMattias Rönnblom  * processing of a particular kind of events to happen in a
243ecca8a0bSMattias Rönnblom  * back-to-back manner, improving cache locality.
244ecca8a0bSMattias Rönnblom  *
245ecca8a0bSMattias Rönnblom  * The list of handler callback functions is shared among all lcores,
246ecca8a0bSMattias Rönnblom  * but will only be executed on lcores which has an eventdev port
247ecca8a0bSMattias Rönnblom  * bound to them, and which are running the dispatcher service.
248ecca8a0bSMattias Rönnblom  *
249ecca8a0bSMattias Rönnblom  * An event is delivered to at most one handler. Events where no
250ecca8a0bSMattias Rönnblom  * handler is found are dropped.
251ecca8a0bSMattias Rönnblom  *
252ecca8a0bSMattias Rönnblom  * The application must not depend on the order of which the match
253ecca8a0bSMattias Rönnblom  * functions are invoked.
254ecca8a0bSMattias Rönnblom  *
255ecca8a0bSMattias Rönnblom  * Ordering of events is not guaranteed to be maintained between
256ecca8a0bSMattias Rönnblom  * different deliver callbacks. For example, suppose there are two
257ecca8a0bSMattias Rönnblom  * callbacks registered, matching different subsets of events arriving
258ecca8a0bSMattias Rönnblom  * on an atomic queue. A batch of events [ev0, ev1, ev2] are dequeued
259ecca8a0bSMattias Rönnblom  * on a particular port, all pertaining to the same flow. The match
260ecca8a0bSMattias Rönnblom  * callback for registration A returns true for ev0 and ev2, and the
261ecca8a0bSMattias Rönnblom  * matching function for registration B for ev1. In that scenario, the
262ecca8a0bSMattias Rönnblom  * dispatcher may choose to deliver first [ev0, ev2] using A's deliver
263ecca8a0bSMattias Rönnblom  * function, and then [ev1] to B - or vice versa.
264ecca8a0bSMattias Rönnblom  *
265ecca8a0bSMattias Rönnblom  * rte_dispatcher_register() may be called by any thread
266ecca8a0bSMattias Rönnblom  * (including unregistered non-EAL threads), but not while the event
267ecca8a0bSMattias Rönnblom  * dispatcher is running on any service lcore.
268ecca8a0bSMattias Rönnblom  *
269ecca8a0bSMattias Rönnblom  * @param dispatcher
270ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
271ecca8a0bSMattias Rönnblom  *
272ecca8a0bSMattias Rönnblom  * @param match_fun
273ecca8a0bSMattias Rönnblom  *  The match callback function.
274ecca8a0bSMattias Rönnblom  *
275ecca8a0bSMattias Rönnblom  * @param match_cb_data
276ecca8a0bSMattias Rönnblom  *  A pointer to some application-specific opaque data (or NULL),
277ecca8a0bSMattias Rönnblom  *  which is supplied back to the application when match_fun is
278ecca8a0bSMattias Rönnblom  *  called.
279ecca8a0bSMattias Rönnblom  *
280ecca8a0bSMattias Rönnblom  * @param process_fun
281ecca8a0bSMattias Rönnblom  *  The process callback function.
282ecca8a0bSMattias Rönnblom  *
283ecca8a0bSMattias Rönnblom  * @param process_cb_data
284ecca8a0bSMattias Rönnblom  *  A pointer to some application-specific opaque data (or NULL),
285ecca8a0bSMattias Rönnblom  *  which is supplied back to the application when process_fun is
286ecca8a0bSMattias Rönnblom  *  called.
287ecca8a0bSMattias Rönnblom  *
288ecca8a0bSMattias Rönnblom  * @return
289ecca8a0bSMattias Rönnblom  *  - >= 0: The identifier for this registration.
290ecca8a0bSMattias Rönnblom  *  - -ENOMEM: Unable to allocate sufficient resources.
291ecca8a0bSMattias Rönnblom  */
292ecca8a0bSMattias Rönnblom __rte_experimental
293ecca8a0bSMattias Rönnblom int
294ecca8a0bSMattias Rönnblom rte_dispatcher_register(struct rte_dispatcher *dispatcher,
295ecca8a0bSMattias Rönnblom 	rte_dispatcher_match_t match_fun, void *match_cb_data,
296ecca8a0bSMattias Rönnblom 	rte_dispatcher_process_t process_fun, void *process_cb_data);
297ecca8a0bSMattias Rönnblom 
298ecca8a0bSMattias Rönnblom /**
299ecca8a0bSMattias Rönnblom  * Unregister an event handler.
300ecca8a0bSMattias Rönnblom  *
301ecca8a0bSMattias Rönnblom  * This function may be called by any thread (including unregistered
302ecca8a0bSMattias Rönnblom  * non-EAL threads), but not while the dispatcher is running on
303ecca8a0bSMattias Rönnblom  * any service lcore.
304ecca8a0bSMattias Rönnblom  *
305ecca8a0bSMattias Rönnblom  * @param dispatcher
306ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
307ecca8a0bSMattias Rönnblom  *
308ecca8a0bSMattias Rönnblom  * @param handler_id
309ecca8a0bSMattias Rönnblom  *  The handler registration id returned by the original
310ecca8a0bSMattias Rönnblom  *  rte_dispatcher_register() call.
311ecca8a0bSMattias Rönnblom  *
312ecca8a0bSMattias Rönnblom  * @return
313ecca8a0bSMattias Rönnblom  *  - 0: Success
314ecca8a0bSMattias Rönnblom  *  - -EINVAL: The @c handler_id parameter was invalid.
315ecca8a0bSMattias Rönnblom  */
316ecca8a0bSMattias Rönnblom __rte_experimental
317ecca8a0bSMattias Rönnblom int
318ecca8a0bSMattias Rönnblom rte_dispatcher_unregister(struct rte_dispatcher *dispatcher, int handler_id);
319ecca8a0bSMattias Rönnblom 
320ecca8a0bSMattias Rönnblom /**
321ecca8a0bSMattias Rönnblom  * Register a finalize callback function.
322ecca8a0bSMattias Rönnblom  *
323ecca8a0bSMattias Rönnblom  * An application may optionally install one or more finalize
324ecca8a0bSMattias Rönnblom  * callbacks.
325ecca8a0bSMattias Rönnblom  *
326ecca8a0bSMattias Rönnblom  * All finalize callbacks are invoked by the dispatcher when a
327ecca8a0bSMattias Rönnblom  * complete batch of events (retrieve using rte_event_dequeue_burst())
328ecca8a0bSMattias Rönnblom  * have been delivered to the application (or have been dropped).
329ecca8a0bSMattias Rönnblom  *
330ecca8a0bSMattias Rönnblom  * The finalize callback is not tied to any particular handler.
331ecca8a0bSMattias Rönnblom  *
332ecca8a0bSMattias Rönnblom  * The finalize callback provides an opportunity for the application
333ecca8a0bSMattias Rönnblom  * to do per-batch processing. One case where this may be useful is if
334ecca8a0bSMattias Rönnblom  * an event output buffer is used, and is shared among several
335ecca8a0bSMattias Rönnblom  * handlers. In such a case, proper output buffer flushing may be
336ecca8a0bSMattias Rönnblom  * assured using a finalize callback.
337ecca8a0bSMattias Rönnblom  *
338ecca8a0bSMattias Rönnblom  * rte_dispatcher_finalize_register() may be called by any thread
339ecca8a0bSMattias Rönnblom  * (including unregistered non-EAL threads), but not while the
340ecca8a0bSMattias Rönnblom  * dispatcher is running on any service lcore.
341ecca8a0bSMattias Rönnblom  *
342ecca8a0bSMattias Rönnblom  * @param dispatcher
343ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
344ecca8a0bSMattias Rönnblom  *
345ecca8a0bSMattias Rönnblom  * @param finalize_fun
346ecca8a0bSMattias Rönnblom  *  The function called after completing the processing of a
347ecca8a0bSMattias Rönnblom  *  dequeue batch.
348ecca8a0bSMattias Rönnblom  *
349ecca8a0bSMattias Rönnblom  * @param finalize_data
350ecca8a0bSMattias Rönnblom  *  A pointer to some application-specific opaque data (or NULL),
351ecca8a0bSMattias Rönnblom  *  which is supplied back to the application when @c finalize_fun is
352ecca8a0bSMattias Rönnblom  *  called.
353ecca8a0bSMattias Rönnblom  *
354ecca8a0bSMattias Rönnblom  * @return
355ecca8a0bSMattias Rönnblom  *  - >= 0: The identifier for this registration.
356ecca8a0bSMattias Rönnblom  *  - -ENOMEM: Unable to allocate sufficient resources.
357ecca8a0bSMattias Rönnblom  */
358ecca8a0bSMattias Rönnblom __rte_experimental
359ecca8a0bSMattias Rönnblom int
360ecca8a0bSMattias Rönnblom rte_dispatcher_finalize_register(struct rte_dispatcher *dispatcher,
361ecca8a0bSMattias Rönnblom 	rte_dispatcher_finalize_t finalize_fun, void *finalize_data);
362ecca8a0bSMattias Rönnblom 
363ecca8a0bSMattias Rönnblom /**
364ecca8a0bSMattias Rönnblom  * Unregister a finalize callback.
365ecca8a0bSMattias Rönnblom  *
366ecca8a0bSMattias Rönnblom  * This function may be called by any thread (including unregistered
367ecca8a0bSMattias Rönnblom  * non-EAL threads), but not while the dispatcher is running on
368ecca8a0bSMattias Rönnblom  * any service lcore.
369ecca8a0bSMattias Rönnblom  *
370ecca8a0bSMattias Rönnblom  * @param dispatcher
371ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
372ecca8a0bSMattias Rönnblom  *
373ecca8a0bSMattias Rönnblom  * @param reg_id
374ecca8a0bSMattias Rönnblom  *  The finalize registration id returned by the original
375ecca8a0bSMattias Rönnblom  *  rte_dispatcher_finalize_register() call.
376ecca8a0bSMattias Rönnblom  *
377ecca8a0bSMattias Rönnblom  * @return
378ecca8a0bSMattias Rönnblom  *  - 0: Success
379ecca8a0bSMattias Rönnblom  *  - -EINVAL: The @c reg_id parameter was invalid.
380ecca8a0bSMattias Rönnblom  */
381ecca8a0bSMattias Rönnblom __rte_experimental
382ecca8a0bSMattias Rönnblom int
383ecca8a0bSMattias Rönnblom rte_dispatcher_finalize_unregister(struct rte_dispatcher *dispatcher, int reg_id);
384ecca8a0bSMattias Rönnblom 
385ecca8a0bSMattias Rönnblom /**
386ecca8a0bSMattias Rönnblom  * Start a dispatcher instance.
387ecca8a0bSMattias Rönnblom  *
388ecca8a0bSMattias Rönnblom  * Enables the dispatcher service.
389ecca8a0bSMattias Rönnblom  *
390ecca8a0bSMattias Rönnblom  * The underlying event device must have been started prior to calling
391ecca8a0bSMattias Rönnblom  * rte_dispatcher_start().
392ecca8a0bSMattias Rönnblom  *
393ecca8a0bSMattias Rönnblom  * For the dispatcher to actually perform work (i.e., dispatch
394ecca8a0bSMattias Rönnblom  * events), its service must have been mapped to one or more service
395ecca8a0bSMattias Rönnblom  * lcores, and its service run state set to '1'. A dispatcher's
396ecca8a0bSMattias Rönnblom  * service is retrieved using rte_dispatcher_service_id_get().
397ecca8a0bSMattias Rönnblom  *
398ecca8a0bSMattias Rönnblom  * Each service lcore to which the dispatcher is mapped should
399ecca8a0bSMattias Rönnblom  * have at least one event port configured. Such configuration is
400ecca8a0bSMattias Rönnblom  * performed by calling rte_dispatcher_bind_port_to_lcore(), prior to
401ecca8a0bSMattias Rönnblom  * starting the dispatcher.
402ecca8a0bSMattias Rönnblom  *
403ecca8a0bSMattias Rönnblom  * @param dispatcher
404ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
405ecca8a0bSMattias Rönnblom  */
406ecca8a0bSMattias Rönnblom __rte_experimental
407ecca8a0bSMattias Rönnblom void
408ecca8a0bSMattias Rönnblom rte_dispatcher_start(struct rte_dispatcher *dispatcher);
409ecca8a0bSMattias Rönnblom 
410ecca8a0bSMattias Rönnblom /**
411ecca8a0bSMattias Rönnblom  * Stop a running dispatcher instance.
412ecca8a0bSMattias Rönnblom  *
413ecca8a0bSMattias Rönnblom  * Disables the dispatcher service.
414ecca8a0bSMattias Rönnblom  *
415ecca8a0bSMattias Rönnblom  * @param dispatcher
416ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
417ecca8a0bSMattias Rönnblom  */
418ecca8a0bSMattias Rönnblom __rte_experimental
419ecca8a0bSMattias Rönnblom void
420ecca8a0bSMattias Rönnblom rte_dispatcher_stop(struct rte_dispatcher *dispatcher);
421ecca8a0bSMattias Rönnblom 
422ecca8a0bSMattias Rönnblom /**
423ecca8a0bSMattias Rönnblom  * Retrieve statistics for a dispatcher instance.
424ecca8a0bSMattias Rönnblom  *
425ecca8a0bSMattias Rönnblom  * This function is MT safe and may be called by any thread
426ecca8a0bSMattias Rönnblom  * (including unregistered non-EAL threads).
427ecca8a0bSMattias Rönnblom  *
428ecca8a0bSMattias Rönnblom  * @param dispatcher
429ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
430ecca8a0bSMattias Rönnblom  * @param[out] stats
431ecca8a0bSMattias Rönnblom  *   A pointer to a structure to fill with statistics.
432ecca8a0bSMattias Rönnblom  */
433ecca8a0bSMattias Rönnblom __rte_experimental
434ecca8a0bSMattias Rönnblom void
435ecca8a0bSMattias Rönnblom rte_dispatcher_stats_get(const struct rte_dispatcher *dispatcher,
436ecca8a0bSMattias Rönnblom 	struct rte_dispatcher_stats *stats);
437ecca8a0bSMattias Rönnblom 
438ecca8a0bSMattias Rönnblom /**
439ecca8a0bSMattias Rönnblom  * Reset statistics for a dispatcher instance.
440ecca8a0bSMattias Rönnblom  *
441ecca8a0bSMattias Rönnblom  * This function may be called by any thread (including unregistered
442ecca8a0bSMattias Rönnblom  * non-EAL threads), but may not produce the correct result if the
443ecca8a0bSMattias Rönnblom  * dispatcher is running on any service lcore.
444ecca8a0bSMattias Rönnblom  *
445ecca8a0bSMattias Rönnblom  * @param dispatcher
446ecca8a0bSMattias Rönnblom  *  The dispatcher instance.
447ecca8a0bSMattias Rönnblom  */
448ecca8a0bSMattias Rönnblom __rte_experimental
449ecca8a0bSMattias Rönnblom void
450ecca8a0bSMattias Rönnblom rte_dispatcher_stats_reset(struct rte_dispatcher *dispatcher);
451ecca8a0bSMattias Rönnblom 
452ecca8a0bSMattias Rönnblom #ifdef __cplusplus
453ecca8a0bSMattias Rönnblom }
454ecca8a0bSMattias Rönnblom #endif
455ecca8a0bSMattias Rönnblom 
456ecca8a0bSMattias Rönnblom #endif /* RTE_DISPATCHER_H */
457