aboutsummaryrefslogtreecommitdiffstats
path: root/examples/multi_process/l2fwd_fork/flib.h
blob: 711e3b6d0715583a2391c0c3555df13f145a7f31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*-
 *   BSD LICENSE
 *
 *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
 *   All rights reserved.
 *
 *   Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions
 *   are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided with the
 *       distribution.
 *     * Neither the name of Intel Corporation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#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 differnt 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  */