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