Skip to content

Commit e1cedae

Browse files
dsaherndavem330
authored andcommitted
ipmr: Refactor mr_rtm_dumproute
Move per-table loops from mr_rtm_dumproute to mr_table_dump and export mr_table_dump for dumps by specific table id. Signed-off-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bae9a78 commit e1cedae

File tree

2 files changed

+61
-33
lines changed

2 files changed

+61
-33
lines changed

include/linux/mroute_base.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,12 @@ void *mr_mfc_find_any(struct mr_table *mrt, int vifi, void *hasharg);
283283

284284
int mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
285285
struct mr_mfc *c, struct rtmsg *rtm);
286+
int mr_table_dump(struct mr_table *mrt, struct sk_buff *skb,
287+
struct netlink_callback *cb,
288+
int (*fill)(struct mr_table *mrt, struct sk_buff *skb,
289+
u32 portid, u32 seq, struct mr_mfc *c,
290+
int cmd, int flags),
291+
spinlock_t *lock);
286292
int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
287293
struct mr_table *(*iter)(struct net *net,
288294
struct mr_table *mrt),

net/ipv4/ipmr_base.c

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,55 @@ int mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
268268
}
269269
EXPORT_SYMBOL(mr_fill_mroute);
270270

271+
int mr_table_dump(struct mr_table *mrt, struct sk_buff *skb,
272+
struct netlink_callback *cb,
273+
int (*fill)(struct mr_table *mrt, struct sk_buff *skb,
274+
u32 portid, u32 seq, struct mr_mfc *c,
275+
int cmd, int flags),
276+
spinlock_t *lock)
277+
{
278+
unsigned int e = 0, s_e = cb->args[1];
279+
unsigned int flags = NLM_F_MULTI;
280+
struct mr_mfc *mfc;
281+
int err;
282+
283+
list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) {
284+
if (e < s_e)
285+
goto next_entry;
286+
287+
err = fill(mrt, skb, NETLINK_CB(cb->skb).portid,
288+
cb->nlh->nlmsg_seq, mfc, RTM_NEWROUTE, flags);
289+
if (err < 0)
290+
goto out;
291+
next_entry:
292+
e++;
293+
}
294+
e = 0;
295+
s_e = 0;
296+
297+
spin_lock_bh(lock);
298+
list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) {
299+
if (e < s_e)
300+
goto next_entry2;
301+
302+
err = fill(mrt, skb, NETLINK_CB(cb->skb).portid,
303+
cb->nlh->nlmsg_seq, mfc, RTM_NEWROUTE, flags);
304+
if (err < 0) {
305+
spin_unlock_bh(lock);
306+
goto out;
307+
}
308+
next_entry2:
309+
e++;
310+
}
311+
spin_unlock_bh(lock);
312+
err = 0;
313+
e = 0;
314+
315+
out:
316+
cb->args[1] = e;
317+
return err;
318+
}
319+
271320
int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
272321
struct mr_table *(*iter)(struct net *net,
273322
struct mr_table *mrt),
@@ -277,51 +326,24 @@ int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
277326
int cmd, int flags),
278327
spinlock_t *lock)
279328
{
280-
unsigned int t = 0, e = 0, s_t = cb->args[0], s_e = cb->args[1];
329+
unsigned int t = 0, s_t = cb->args[0];
281330
struct net *net = sock_net(skb->sk);
282331
struct mr_table *mrt;
283-
struct mr_mfc *mfc;
332+
int err;
284333

285334
rcu_read_lock();
286335
for (mrt = iter(net, NULL); mrt; mrt = iter(net, mrt)) {
287336
if (t < s_t)
288337
goto next_table;
289-
list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) {
290-
if (e < s_e)
291-
goto next_entry;
292-
if (fill(mrt, skb, NETLINK_CB(cb->skb).portid,
293-
cb->nlh->nlmsg_seq, mfc,
294-
RTM_NEWROUTE, NLM_F_MULTI) < 0)
295-
goto done;
296-
next_entry:
297-
e++;
298-
}
299-
e = 0;
300-
s_e = 0;
301-
302-
spin_lock_bh(lock);
303-
list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) {
304-
if (e < s_e)
305-
goto next_entry2;
306-
if (fill(mrt, skb, NETLINK_CB(cb->skb).portid,
307-
cb->nlh->nlmsg_seq, mfc,
308-
RTM_NEWROUTE, NLM_F_MULTI) < 0) {
309-
spin_unlock_bh(lock);
310-
goto done;
311-
}
312-
next_entry2:
313-
e++;
314-
}
315-
spin_unlock_bh(lock);
316-
e = 0;
317-
s_e = 0;
338+
339+
err = mr_table_dump(mrt, skb, cb, fill, lock);
340+
if (err < 0)
341+
break;
318342
next_table:
319343
t++;
320344
}
321-
done:
322345
rcu_read_unlock();
323346

324-
cb->args[1] = e;
325347
cb->args[0] = t;
326348

327349
return skb->len;

0 commit comments

Comments
 (0)