/* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2014 Intel Corporation */ #ifndef __FLIB_H #define __FLIB_H /* callback function pointer when specific slave leaves */ typedef void (slave_exit_notify)(unsigned slaveid, int stat); enum slave_stat{ ST_FREEZE = 1, ST_IDLE, ST_RUN, ST_ZOMBIE, /* Not implemented yet */ }; /** * Initialize the fork lib. * * @return * - 0 : fork lib initialized successfully * - -1 : fork lib initialized failed */ int flib_init(void); /** * Check that every SLAVE lcores are in WAIT state, then call * flib_remote_launch() for all of them. If call_master is true * (set to CALL_MASTER), also call the function on the master lcore. * * @param f: * function pointer need to run * @param arg: * argument for f to carry * @param call_master * - SKIP_MASTER : only launch function on slave lcores * - CALL_MASTER : launch function on master and slave lcores * @return * - 0 : function execute successfully * - -1 : function execute failed */ int flib_mp_remote_launch(lcore_function_t *f, void *arg, enum rte_rmt_call_master_t call_master); /** * Send a message to a slave lcore identified by slave_id to call a * function f with argument arg. * * @param f: * function pointer need to run * @param arg: * argument for f to carry * @param slave_id * slave lcore id to run on * @return * - 0 : function execute successfully * - -1 : function execute failed */ int flib_remote_launch(lcore_function_t *f, void *arg, unsigned slave_id); /** * Query the running stat for specific slave, wont' work in with master id * * @param slave_id: * lcore id which should not be master id * @return * - ST_FREEZE : lcore is not in enabled core mask * - ST_IDLE : lcore is idle * - ST_RUN : lcore is running something */ enum slave_stat flib_query_slave_status(unsigned slave_id); /** * Register a callback function to be notified in case specific slave exit. * * @param slave_id: * lcore id which should not be master id * @param cb: * callback pointer to register * @return * - 0 : function execute successfully * - -EFAULT : argument error * - -ENOENT : slave_id not correct */ int flib_register_slave_exit_notify(unsigned slave_id, slave_exit_notify *cb); /** * Assign a lcore ID to non-slave thread. Non-slave thread refers to thread that * not created by function rte_eal_remote_launch or rte_eal_mp_remote_launch. * These threads can either bind lcore or float among different lcores. * This lcore ID will be unique in multi-thread or multi-process DPDK running * environment, then it can benefit from using the cache mechanism provided in * mempool library. * After calling successfully, use rte_lcore_id() to get the assigned lcore ID, but * other lcore funtions can't guarantee to work correctly. * * @return * - -1 : can't assign a lcore id with 3 possibilities. * - it's not non-slave thread. * - it had assign a lcore id previously * - the lcore id is running out. * - > 0 : the assigned lcore id. */ int flib_assign_lcore_id(void); /** * Free the lcore_id that assigned in flib_assign_lcore_id(). * call it in case non-slave thread is leaving or left. * * @param lcore_id * The identifier of the lcore, which MUST be between 1 and * RTE_MAX_LCORE-1. */ void flib_free_lcore_id(unsigned lcore_id); #endif /* __FLIB_H */