lpm: don't use memzone for allocations

Signed-off-by: Intel
This commit is contained in:
Intel 2012-12-20 00:00:00 +01:00 committed by Thomas Monjalon
parent a76109c628
commit 4cdf471a06
6 changed files with 44 additions and 95 deletions

View File

@ -117,8 +117,6 @@ rte_lpm_test tests[] = {
#define PASS 0
/*
* TEST 0
*
* Check that rte_lpm_create fails gracefully for incorrect user input
* arguments
*/
@ -128,31 +126,22 @@ test0(void)
struct rte_lpm *lpm = NULL;
/* rte_lpm_create: lpm name == NULL */
lpm = rte_lpm_create(NULL, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(NULL, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm == NULL);
/* rte_lpm_create: max_rules = 0 */
/* Note: __func__ inserts the function name, in this case "test0". */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 0, RTE_LPM_HEAP);
TEST_LPM_ASSERT(lpm == NULL);
/* rte_lpm_create: mem_location is not RTE_LPM_HEAP or not MEMZONE */
/* Note: __func__ inserts the function name, in this case "test0". */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 2);
TEST_LPM_ASSERT(lpm == NULL);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, -1);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 0, 0);
TEST_LPM_ASSERT(lpm == NULL);
/* socket_id < -1 is invalid */
lpm = rte_lpm_create(__func__, -2, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, -2, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm == NULL);
return PASS;
}
/* TEST 1
*
/*
* Create lpm table then delete lpm table 100 times
* Use a slightly different rules size each time
* */
@ -164,8 +153,7 @@ test1(void)
/* rte_lpm_free: Free NULL */
for (i = 0; i < 100; i++) {
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES - i,
RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES - i, 0);
TEST_LPM_ASSERT(lpm != NULL);
rte_lpm_free(lpm);
@ -175,8 +163,7 @@ test1(void)
return PASS;
}
/* TEST 2
*
/*
* Call rte_lpm_free for NULL pointer user input. Note: free has no return and
* therefore it is impossible to check for failure but this test is added to
* increase function coverage metrics and to validate that freeing null does
@ -195,8 +182,7 @@ test2(void)
return PASS;
}
/* TEST 3
*
/*
* Check that rte_lpm_add fails gracefully for incorrect user input arguments
*/
int32_t
@ -212,7 +198,7 @@ test3(void)
TEST_LPM_ASSERT(status < 0);
/*Create vaild lpm to use in rest of test. */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
/* rte_lpm_add: depth < 1 */
@ -228,8 +214,7 @@ test3(void)
return PASS;
}
/* TEST 4
*
/*
* Check that rte_lpm_delete fails gracefully for incorrect user input
* arguments
*/
@ -246,7 +231,7 @@ test4(void)
TEST_LPM_ASSERT(status < 0);
/*Create vaild lpm to use in rest of test. */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
/* rte_lpm_delete: depth < 1 */
@ -262,8 +247,7 @@ test4(void)
return PASS;
}
/* TEST 5
*
/*
* Check that rte_lpm_lookup fails gracefully for incorrect user input
* arguments
*/
@ -281,7 +265,7 @@ test5(void)
TEST_LPM_ASSERT(status < 0);
/*Create vaild lpm to use in rest of test. */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
/* rte_lpm_lookup: depth < 1 */
@ -295,8 +279,7 @@ test5(void)
/* TEST 6
*
/*
* Call add, lookup and delete for a single rule with depth <= 24
*/
int32_t
@ -307,7 +290,7 @@ test6(void)
uint8_t depth = 24, next_hop_add = 100, next_hop_return = 0;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
status = rte_lpm_add(lpm, ip, depth, next_hop_add);
@ -327,8 +310,7 @@ test6(void)
return PASS;
}
/* TEST 7
*
/*
* Call add, lookup and delete for a single rule with depth > 24
*/
@ -340,7 +322,7 @@ test7(void)
uint8_t depth = 32, next_hop_add = 100, next_hop_return = 0;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
status = rte_lpm_add(lpm, ip, depth, next_hop_add);
@ -360,8 +342,7 @@ test7(void)
return PASS;
}
/* TEST 8
*
/*
* Use rte_lpm_add to add rules which effect only the second half of the lpm
* table. Use all possible depths ranging from 1..32. Set the next hop = to the
* depth. Check lookup hit for on every add and check for lookup miss on the
@ -378,7 +359,7 @@ test8(void)
uint8_t depth, next_hop_add, next_hop_return;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
/* Loop with rte_lpm_add. */
@ -424,8 +405,7 @@ test8(void)
return PASS;
}
/* TEST 9
*
/*
* - Add & lookup to hit invalid TBL24 entry
* - Add & lookup to hit valid TBL24 entry not extended
* - Add & lookup to hit valid extended TBL24 entry with invalid TBL8 entry
@ -446,7 +426,7 @@ test9(void)
depth = 24;
next_hop_add = 100;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
status = rte_lpm_add(lpm, ip, depth, next_hop_add);
@ -583,8 +563,7 @@ test9(void)
}
/* TEST 10
*
/*
* - Add rule that covers a TBL24 range previously invalid & lookup (& delete &
* lookup)
* - Add rule that extends a TBL24 invalid entry & lookup (& delete & lookup)
@ -778,8 +757,7 @@ test10(void)
return PASS;
}
/* TEST 11
*
/*
* Add two rules, lookup to hit the more specific one, lookup to hit the less
* specific one delete the less specific rule and lookup previous values again;
* add a more specific rule than the existing rule, lookup again
@ -794,7 +772,7 @@ test11(void)
uint8_t depth, next_hop_add, next_hop_return;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
ip = IPv4(128, 0, 0, 0);
@ -843,8 +821,7 @@ test11(void)
return PASS;
}
/* TEST 12
*
/*
* Add an extended rule (i.e. depth greater than 24, lookup (hit), delete,
* lookup (miss) in a for loop of 1000 times. This will check tbl8 extension
* and contraction.
@ -859,7 +836,7 @@ test12(void)
uint8_t depth, next_hop_add, next_hop_return;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
ip = IPv4(128, 0, 0, 0);
@ -886,8 +863,7 @@ test12(void)
return PASS;
}
/* TEST 13
*
/*
* Add a rule to tbl24, lookup (hit), then add a rule that will extend this
* tbl24 entry, lookup (hit). delete the rule that caused the tbl24 extension,
* lookup (miss) and repeat for loop of 1000 times. This will check tbl8
@ -903,7 +879,7 @@ test13(void)
uint8_t depth, next_hop_add_1, next_hop_add_2, next_hop_return;
int32_t status = 0;
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 0);
TEST_LPM_ASSERT(lpm != NULL);
ip = IPv4(128, 0, 0, 0);
@ -948,8 +924,7 @@ test13(void)
return PASS;
}
/* TEST 14
*
/*
* Fore TBL8 extension exhaustion. Add 256 rules that require a tbl8 extension.
* No more tbl8 extensions will be allowed. Now add one more rule that required
* a tbl8 extension and get fail.
@ -967,7 +942,7 @@ test14(void)
int32_t status = 0;
/* Add enough space for 256 rules for every depth */
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 256 * 32, RTE_LPM_HEAP);
lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 256 * 32, 0);
TEST_LPM_ASSERT(lpm != NULL);
ip = IPv4(0, 0, 0, 0);
@ -1210,7 +1185,7 @@ int32_t test16(void)
struct rte_lpm *lpm = NULL, *result = NULL;
/* Create lpm */
lpm = rte_lpm_create("lpm_find_existing", SOCKET_ID_ANY, 256 * 32, RTE_LPM_HEAP);
lpm = rte_lpm_create("lpm_find_existing", SOCKET_ID_ANY, 256 * 32, 0);
TEST_LPM_ASSERT(lpm != NULL);
/* Try to find existing lpm */

View File

@ -672,8 +672,7 @@ MAIN(int argc, char **argv)
}
/* create the LPM table */
l3fwd_lpm = rte_lpm_create("L3FWD_LPM", SOCKET0, L3FWD_LPM_MAX_RULES,
RTE_LPM_MEMZONE);
l3fwd_lpm = rte_lpm_create("L3FWD_LPM", SOCKET0, L3FWD_LPM_MAX_RULES, 0);
if (l3fwd_lpm == NULL)
rte_panic("Unable to create the l3fwd LPM table\n");

View File

@ -854,7 +854,7 @@ setup_lpm(int socketid)
/* create the LPM table */
rte_snprintf(s, sizeof(s), "L3FWD_LPM_%d", socketid);
l3fwd_lookup_struct[socketid] = rte_lpm_create(s, socketid,
L3FWD_LPM_MAX_RULES, RTE_LPM_MEMZONE);
L3FWD_LPM_MAX_RULES, 0);
if (l3fwd_lookup_struct[socketid] == NULL)
rte_exit(EXIT_FAILURE, "Unable to create the l3fwd LPM table"
" on socket %d\n", socketid);

View File

@ -191,7 +191,7 @@ app_init_lpm_tables(void)
name,
socket,
APP_MAX_LPM_RULES,
RTE_LPM_MEMZONE);
0);
if (app.lpm_tables[socket] == NULL) {
rte_panic("Unable to create LPM table on socket %u\n", socket);
}

View File

@ -142,7 +142,7 @@ rte_lpm_find_existing(const char *name)
*/
struct rte_lpm *
rte_lpm_create(const char *name, int socket_id, int max_rules,
int mem_location)
__rte_unused int flags)
{
char mem_name[RTE_LPM_NAMESIZE];
struct rte_lpm *lpm = NULL;
@ -160,9 +160,7 @@ rte_lpm_create(const char *name, int socket_id, int max_rules,
RTE_BUILD_BUG_ON(sizeof(struct rte_lpm_tbl8_entry) != 2);
/* Check user arguments. */
if ((name == NULL) || (socket_id < -1) || (max_rules == 0) ||
(mem_location != RTE_LPM_HEAP &&
mem_location != RTE_LPM_MEMZONE)){
if ((name == NULL) || (socket_id < -1) || (max_rules == 0)){
rte_errno = EINVAL;
return NULL;
}
@ -190,34 +188,16 @@ rte_lpm_create(const char *name, int socket_id, int max_rules,
return NULL;
/* Allocate memory to store the LPM data structures. */
if (mem_location == RTE_LPM_MEMZONE) {
const struct rte_memzone *mz;
uint32_t mz_flags = 0;
mz = rte_memzone_reserve(mem_name, mem_size, socket_id,
mz_flags);
if (mz == NULL) {
RTE_LOG(ERR, LPM, "LPM memzone creation failed\n");
return NULL;
}
memset(mz->addr, 0, mem_size);
lpm = (struct rte_lpm *) mz->addr;
}
else {
lpm = (struct rte_lpm *)rte_zmalloc(mem_name, mem_size,
lpm = (struct rte_lpm *)rte_zmalloc(mem_name, mem_size,
CACHE_LINE_SIZE);
if (lpm == NULL) {
RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
return NULL;
}
if (lpm == NULL) {
RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
return NULL;
}
/* Save user arguments. */
lpm->max_rules_per_depth = max_rules / RTE_LPM_MAX_DEPTH;
rte_snprintf(lpm->name, sizeof(lpm->name), "%s", name);
lpm->mem_location = mem_location;
TAILQ_INSERT_TAIL(lpm_list, lpm, next);
@ -234,11 +214,8 @@ rte_lpm_free(struct rte_lpm *lpm)
if (lpm == NULL)
return;
/* Note: Its is currently not possible to free a memzone. */
if (lpm->mem_location == RTE_LPM_HEAP){
RTE_EAL_TAILQ_REMOVE(RTE_TAILQ_LPM, rte_lpm_list, lpm);
rte_free(lpm);
}
RTE_EAL_TAILQ_REMOVE(RTE_TAILQ_LPM, rte_lpm_list, lpm);
rte_free(lpm);
}
/*

View File

@ -151,9 +151,8 @@ struct rte_lpm {
* NUMA socket ID for LPM table memory allocation
* @param max_rules
* Maximum number of LPM rules that can be added
* @param mem_location
* Location of memory to be allocated. Can only be RTE_LPM_HEAP or
* RTE_LPM_MEMZONE
* @param flags
* This parameter is currently unused
* @return
* Handle to LPM object on success, NULL otherwise with rte_errno set
* to an appropriate values. Possible rte_errno values include:
@ -166,8 +165,7 @@ struct rte_lpm {
* - ENOMEM - no appropriate memory area found in which to create memzone
*/
struct rte_lpm *
rte_lpm_create(const char *name, int socket_id, int max_rules,
int mem_location);
rte_lpm_create(const char *name, int socket_id, int max_rules, int flags);
/**
* Find an existing LPM object and return a pointer to it.