mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 09:43:59 +08:00
nexthop: __nh_notifier_single_info_init(): Make nh_info an argument
The cited function currently uses rtnl_dereference() to get nh_info from a handed-in nexthop. However, under the resilient hashing scheme, this function will not always be called under RTNL, sometimes the mutual exclusion will be achieved differently. Therefore move the nh_info extraction from the function to its callers to make it possible to use a different synchronization guarantee. 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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
597f48e46b
commit
96a856256a
@ -52,10 +52,8 @@ static bool nexthop_notifiers_is_empty(struct net *net)
|
||||
|
||||
static void
|
||||
__nh_notifier_single_info_init(struct nh_notifier_single_info *nh_info,
|
||||
const struct nexthop *nh)
|
||||
const struct nh_info *nhi)
|
||||
{
|
||||
struct nh_info *nhi = rtnl_dereference(nh->nh_info);
|
||||
|
||||
nh_info->dev = nhi->fib_nhc.nhc_dev;
|
||||
nh_info->gw_family = nhi->fib_nhc.nhc_gw_family;
|
||||
if (nh_info->gw_family == AF_INET)
|
||||
@ -71,12 +69,14 @@ __nh_notifier_single_info_init(struct nh_notifier_single_info *nh_info,
|
||||
static int nh_notifier_single_info_init(struct nh_notifier_info *info,
|
||||
const struct nexthop *nh)
|
||||
{
|
||||
struct nh_info *nhi = rtnl_dereference(nh->nh_info);
|
||||
|
||||
info->type = NH_NOTIFIER_INFO_TYPE_SINGLE;
|
||||
info->nh = kzalloc(sizeof(*info->nh), GFP_KERNEL);
|
||||
if (!info->nh)
|
||||
return -ENOMEM;
|
||||
|
||||
__nh_notifier_single_info_init(info->nh, nh);
|
||||
__nh_notifier_single_info_init(info->nh, nhi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -103,11 +103,13 @@ static int nh_notifier_mp_info_init(struct nh_notifier_info *info,
|
||||
|
||||
for (i = 0; i < num_nh; i++) {
|
||||
struct nh_grp_entry *nhge = &nhg->nh_entries[i];
|
||||
struct nh_info *nhi;
|
||||
|
||||
nhi = rtnl_dereference(nhge->nh->nh_info);
|
||||
info->nh_grp->nh_entries[i].id = nhge->nh->id;
|
||||
info->nh_grp->nh_entries[i].weight = nhge->weight;
|
||||
__nh_notifier_single_info_init(&info->nh_grp->nh_entries[i].nh,
|
||||
nhge->nh);
|
||||
nhi);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user