Commit 63a2de8d authored by David S. Miller's avatar David S. Miller

Merge branch 'sparx5-leaks'

Jinjie Ruan says:

====================
net: microchip: sparx5: Fix some memory leaks in vcap_api_kunit

There are some memory leaks in vcap_api_kunit, this patchset
fixes them.

Changes in v3:
- Fix the typo in patch 3, from "export" to "vcap enabled port".
- Fix the typo in patch 4, from "vcap_dup_rule" to "vcap_alloc_rule".

Changes in v2:
- Adhere to the 80 character limit in vcap_free_caf()
- Fix kernel test robot reported warnings in test_vcap_xn_rule_creator()
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9fdfb15a 2a2dffd9
...@@ -243,10 +243,9 @@ static void vcap_test_api_init(struct vcap_admin *admin) ...@@ -243,10 +243,9 @@ static void vcap_test_api_init(struct vcap_admin *admin)
} }
/* Helper function to create a rule of a specific size */ /* Helper function to create a rule of a specific size */
static struct vcap_rule * static void test_vcap_xn_rule_creator(struct kunit *test, int cid,
test_vcap_xn_rule_creator(struct kunit *test, int cid, enum vcap_user user, enum vcap_user user, u16 priority,
u16 priority, int id, int size, int expected_addr)
int id, int size, int expected_addr)
{ {
struct vcap_rule *rule; struct vcap_rule *rule;
struct vcap_rule_internal *ri; struct vcap_rule_internal *ri;
...@@ -311,7 +310,7 @@ test_vcap_xn_rule_creator(struct kunit *test, int cid, enum vcap_user user, ...@@ -311,7 +310,7 @@ test_vcap_xn_rule_creator(struct kunit *test, int cid, enum vcap_user user,
ret = vcap_add_rule(rule); ret = vcap_add_rule(rule);
KUNIT_EXPECT_EQ(test, 0, ret); KUNIT_EXPECT_EQ(test, 0, ret);
KUNIT_EXPECT_EQ(test, expected_addr, ri->addr); KUNIT_EXPECT_EQ(test, expected_addr, ri->addr);
return rule; vcap_free_rule(rule);
} }
/* Prepare testing rule deletion */ /* Prepare testing rule deletion */
...@@ -995,6 +994,16 @@ static void vcap_api_encode_rule_actionset_test(struct kunit *test) ...@@ -995,6 +994,16 @@ static void vcap_api_encode_rule_actionset_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[11]); KUNIT_EXPECT_EQ(test, (u32)0x00000000, actwords[11]);
} }
static void vcap_free_ckf(struct vcap_rule *rule)
{
struct vcap_client_keyfield *ckf, *next_ckf;
list_for_each_entry_safe(ckf, next_ckf, &rule->keyfields, ctrl.list) {
list_del(&ckf->ctrl.list);
kfree(ckf);
}
}
static void vcap_api_rule_add_keyvalue_test(struct kunit *test) static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
{ {
struct vcap_admin admin = { struct vcap_admin admin = {
...@@ -1027,6 +1036,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test) ...@@ -1027,6 +1036,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value); KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask); KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
vcap_free_ckf(rule);
INIT_LIST_HEAD(&rule->keyfields); INIT_LIST_HEAD(&rule->keyfields);
ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1); ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, VCAP_BIT_1);
...@@ -1039,6 +1049,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test) ...@@ -1039,6 +1049,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.value); KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.value);
KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask); KUNIT_EXPECT_EQ(test, 0x1, kf->data.u1.mask);
vcap_free_ckf(rule);
INIT_LIST_HEAD(&rule->keyfields); INIT_LIST_HEAD(&rule->keyfields);
ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS, ret = vcap_rule_add_key_bit(rule, VCAP_KF_LOOKUP_FIRST_IS,
...@@ -1052,6 +1063,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test) ...@@ -1052,6 +1063,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, kf->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value); KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.value);
KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.mask); KUNIT_EXPECT_EQ(test, 0x0, kf->data.u1.mask);
vcap_free_ckf(rule);
INIT_LIST_HEAD(&rule->keyfields); INIT_LIST_HEAD(&rule->keyfields);
ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 0x98765432, 0xff00ffab); ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 0x98765432, 0xff00ffab);
...@@ -1064,6 +1076,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test) ...@@ -1064,6 +1076,7 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, kf->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, kf->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x98765432, kf->data.u32.value); KUNIT_EXPECT_EQ(test, 0x98765432, kf->data.u32.value);
KUNIT_EXPECT_EQ(test, 0xff00ffab, kf->data.u32.mask); KUNIT_EXPECT_EQ(test, 0xff00ffab, kf->data.u32.mask);
vcap_free_ckf(rule);
INIT_LIST_HEAD(&rule->keyfields); INIT_LIST_HEAD(&rule->keyfields);
ret = vcap_rule_add_key_u128(rule, VCAP_KF_L3_IP6_SIP, &dip); ret = vcap_rule_add_key_u128(rule, VCAP_KF_L3_IP6_SIP, &dip);
...@@ -1078,6 +1091,18 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test) ...@@ -1078,6 +1091,18 @@ static void vcap_api_rule_add_keyvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, dip.value[idx], kf->data.u128.value[idx]); KUNIT_EXPECT_EQ(test, dip.value[idx], kf->data.u128.value[idx]);
for (idx = 0; idx < ARRAY_SIZE(dip.mask); ++idx) for (idx = 0; idx < ARRAY_SIZE(dip.mask); ++idx)
KUNIT_EXPECT_EQ(test, dip.mask[idx], kf->data.u128.mask[idx]); KUNIT_EXPECT_EQ(test, dip.mask[idx], kf->data.u128.mask[idx]);
vcap_free_ckf(rule);
}
static void vcap_free_caf(struct vcap_rule *rule)
{
struct vcap_client_actionfield *caf, *next_caf;
list_for_each_entry_safe(caf, next_caf,
&rule->actionfields, ctrl.list) {
list_del(&caf->ctrl.list);
kfree(caf);
}
} }
static void vcap_api_rule_add_actionvalue_test(struct kunit *test) static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
...@@ -1105,6 +1130,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test) ...@@ -1105,6 +1130,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action); KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value); KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
vcap_free_caf(rule);
INIT_LIST_HEAD(&rule->actionfields); INIT_LIST_HEAD(&rule->actionfields);
ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1); ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_1);
...@@ -1116,6 +1142,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test) ...@@ -1116,6 +1142,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action); KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x1, af->data.u1.value); KUNIT_EXPECT_EQ(test, 0x1, af->data.u1.value);
vcap_free_caf(rule);
INIT_LIST_HEAD(&rule->actionfields); INIT_LIST_HEAD(&rule->actionfields);
ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_ANY); ret = vcap_rule_add_action_bit(rule, VCAP_AF_POLICE_ENA, VCAP_BIT_ANY);
...@@ -1127,6 +1154,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test) ...@@ -1127,6 +1154,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action); KUNIT_EXPECT_EQ(test, VCAP_AF_POLICE_ENA, af->ctrl.action);
KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_BIT, af->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value); KUNIT_EXPECT_EQ(test, 0x0, af->data.u1.value);
vcap_free_caf(rule);
INIT_LIST_HEAD(&rule->actionfields); INIT_LIST_HEAD(&rule->actionfields);
ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 0x98765432); ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 0x98765432);
...@@ -1138,6 +1166,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test) ...@@ -1138,6 +1166,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_AF_TYPE, af->ctrl.action); KUNIT_EXPECT_EQ(test, VCAP_AF_TYPE, af->ctrl.action);
KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
KUNIT_EXPECT_EQ(test, 0x98765432, af->data.u32.value); KUNIT_EXPECT_EQ(test, 0x98765432, af->data.u32.value);
vcap_free_caf(rule);
INIT_LIST_HEAD(&rule->actionfields); INIT_LIST_HEAD(&rule->actionfields);
ret = vcap_rule_add_action_u32(rule, VCAP_AF_MASK_MODE, 0xaabbccdd); ret = vcap_rule_add_action_u32(rule, VCAP_AF_MASK_MODE, 0xaabbccdd);
...@@ -1149,6 +1178,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test) ...@@ -1149,6 +1178,7 @@ static void vcap_api_rule_add_actionvalue_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, VCAP_AF_MASK_MODE, af->ctrl.action); KUNIT_EXPECT_EQ(test, VCAP_AF_MASK_MODE, af->ctrl.action);
KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type); KUNIT_EXPECT_EQ(test, VCAP_FIELD_U32, af->ctrl.type);
KUNIT_EXPECT_EQ(test, 0xaabbccdd, af->data.u32.value); KUNIT_EXPECT_EQ(test, 0xaabbccdd, af->data.u32.value);
vcap_free_caf(rule);
} }
static void vcap_api_rule_find_keyset_basic_test(struct kunit *test) static void vcap_api_rule_find_keyset_basic_test(struct kunit *test)
...@@ -1408,6 +1438,10 @@ static void vcap_api_encode_rule_test(struct kunit *test) ...@@ -1408,6 +1438,10 @@ static void vcap_api_encode_rule_test(struct kunit *test)
ret = list_empty(&is2_admin.rules); ret = list_empty(&is2_admin.rules);
KUNIT_EXPECT_EQ(test, false, ret); KUNIT_EXPECT_EQ(test, false, ret);
KUNIT_EXPECT_EQ(test, 0, ret); KUNIT_EXPECT_EQ(test, 0, ret);
vcap_enable_lookups(&test_vctrl, &test_netdev, 0, 0,
rule->cookie, false);
vcap_free_rule(rule); vcap_free_rule(rule);
/* Check that the rule has been freed: tricky to access since this /* Check that the rule has been freed: tricky to access since this
...@@ -1418,6 +1452,8 @@ static void vcap_api_encode_rule_test(struct kunit *test) ...@@ -1418,6 +1452,8 @@ static void vcap_api_encode_rule_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, true, ret); KUNIT_EXPECT_EQ(test, true, ret);
ret = list_empty(&rule->actionfields); ret = list_empty(&rule->actionfields);
KUNIT_EXPECT_EQ(test, true, ret); KUNIT_EXPECT_EQ(test, true, ret);
vcap_del_rule(&test_vctrl, &test_netdev, id);
} }
static void vcap_api_set_rule_counter_test(struct kunit *test) static void vcap_api_set_rule_counter_test(struct kunit *test)
...@@ -1561,6 +1597,11 @@ static void vcap_api_rule_insert_in_order_test(struct kunit *test) ...@@ -1561,6 +1597,11 @@ static void vcap_api_rule_insert_in_order_test(struct kunit *test)
test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774); test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 20, 400, 6, 774);
test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771); test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 30, 300, 3, 771);
test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768); test_vcap_xn_rule_creator(test, 10000, VCAP_USER_QOS, 40, 200, 2, 768);
vcap_del_rule(&test_vctrl, &test_netdev, 200);
vcap_del_rule(&test_vctrl, &test_netdev, 300);
vcap_del_rule(&test_vctrl, &test_netdev, 400);
vcap_del_rule(&test_vctrl, &test_netdev, 500);
} }
static void vcap_api_rule_insert_reverse_order_test(struct kunit *test) static void vcap_api_rule_insert_reverse_order_test(struct kunit *test)
...@@ -1619,6 +1660,11 @@ static void vcap_api_rule_insert_reverse_order_test(struct kunit *test) ...@@ -1619,6 +1660,11 @@ static void vcap_api_rule_insert_reverse_order_test(struct kunit *test)
++idx; ++idx;
} }
KUNIT_EXPECT_EQ(test, 768, admin.last_used_addr); KUNIT_EXPECT_EQ(test, 768, admin.last_used_addr);
vcap_del_rule(&test_vctrl, &test_netdev, 500);
vcap_del_rule(&test_vctrl, &test_netdev, 400);
vcap_del_rule(&test_vctrl, &test_netdev, 300);
vcap_del_rule(&test_vctrl, &test_netdev, 200);
} }
static void vcap_api_rule_remove_at_end_test(struct kunit *test) static void vcap_api_rule_remove_at_end_test(struct kunit *test)
...@@ -1819,6 +1865,9 @@ static void vcap_api_rule_remove_in_front_test(struct kunit *test) ...@@ -1819,6 +1865,9 @@ static void vcap_api_rule_remove_in_front_test(struct kunit *test)
KUNIT_EXPECT_EQ(test, 786, test_init_start); KUNIT_EXPECT_EQ(test, 786, test_init_start);
KUNIT_EXPECT_EQ(test, 8, test_init_count); KUNIT_EXPECT_EQ(test, 8, test_init_count);
KUNIT_EXPECT_EQ(test, 794, admin.last_used_addr); KUNIT_EXPECT_EQ(test, 794, admin.last_used_addr);
vcap_del_rule(&test_vctrl, &test_netdev, 200);
vcap_del_rule(&test_vctrl, &test_netdev, 300);
} }
static struct kunit_case vcap_api_rule_remove_test_cases[] = { static struct kunit_case vcap_api_rule_remove_test_cases[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment