nexthop: Restart nexthop dump based on last dumped nexthop identifier
Currently, a multi-part nexthop dump is restarted based on the number of nexthops that have been dumped so far. This can result in a lot of nexthops not being dumped when nexthops are simultaneously deleted: # ip nexthop | wc -l 65536 # ip nexthop flush Dump was interrupted and may be inconsistent. Flushed 36040 nexthops # ip nexthop | wc -l 29496 Instead, restart the dump based on the nexthop identifier (fixed number) of the last successfully dumped nexthop: # ip nexthop | wc -l 65536 # ip nexthop flush Dump was interrupted and may be inconsistent. Flushed 65536 nexthops # ip nexthop | wc -l 0 Reported-by: Maksym Yaremchuk <maksymy@nvidia.com> Tested-by: Maksym Yaremchuk <maksymy@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
56aa7b21a5
commit
9e46fb656f
|
@ -3140,26 +3140,24 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
struct rb_node *node;
|
struct rb_node *node;
|
||||||
int idx = 0, s_idx;
|
int s_idx;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
s_idx = ctx->idx;
|
s_idx = ctx->idx;
|
||||||
for (node = rb_first(root); node; node = rb_next(node)) {
|
for (node = rb_first(root); node; node = rb_next(node)) {
|
||||||
struct nexthop *nh;
|
struct nexthop *nh;
|
||||||
|
|
||||||
if (idx < s_idx)
|
|
||||||
goto cont;
|
|
||||||
|
|
||||||
nh = rb_entry(node, struct nexthop, rb_node);
|
nh = rb_entry(node, struct nexthop, rb_node);
|
||||||
ctx->idx = idx;
|
if (nh->id < s_idx)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ctx->idx = nh->id;
|
||||||
err = nh_cb(skb, cb, nh, data);
|
err = nh_cb(skb, cb, nh, data);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
cont:
|
|
||||||
idx++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->idx = idx;
|
ctx->idx++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue