nexthop: Dispatch notifier init()/fini() by group type

After there are several next-hop group types, initialization and
finalization of notifier type needs to reflect the actual type. Transform
nh_notifier_grp_info_init() and _fini() to make extending them easier.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Petr Machata 2021-01-28 13:49:18 +01:00 коммит произвёл Jakub Kicinski
Родитель 09ad6becf5
Коммит da230501f2
1 изменённых файлов: 19 добавлений и 6 удалений

Просмотреть файл

@ -86,10 +86,9 @@ static void nh_notifier_single_info_fini(struct nh_notifier_info *info)
kfree(info->nh); kfree(info->nh);
} }
static int nh_notifier_grp_info_init(struct nh_notifier_info *info, static int nh_notifier_mp_info_init(struct nh_notifier_info *info,
const struct nexthop *nh) struct nh_group *nhg)
{ {
struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
u16 num_nh = nhg->num_nh; u16 num_nh = nhg->num_nh;
int i; int i;
@ -114,9 +113,23 @@ static int nh_notifier_grp_info_init(struct nh_notifier_info *info,
return 0; return 0;
} }
static void nh_notifier_grp_info_fini(struct nh_notifier_info *info) static int nh_notifier_grp_info_init(struct nh_notifier_info *info,
const struct nexthop *nh)
{ {
kfree(info->nh_grp); struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
if (nhg->mpath)
return nh_notifier_mp_info_init(info, nhg);
return -EINVAL;
}
static void nh_notifier_grp_info_fini(struct nh_notifier_info *info,
const struct nexthop *nh)
{
struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
if (nhg->mpath)
kfree(info->nh_grp);
} }
static int nh_notifier_info_init(struct nh_notifier_info *info, static int nh_notifier_info_init(struct nh_notifier_info *info,
@ -134,7 +147,7 @@ static void nh_notifier_info_fini(struct nh_notifier_info *info,
const struct nexthop *nh) const struct nexthop *nh)
{ {
if (nh->is_group) if (nh->is_group)
nh_notifier_grp_info_fini(info); nh_notifier_grp_info_fini(info, nh);
else else
nh_notifier_single_info_fini(info); nh_notifier_single_info_fini(info);
} }