Commit adde5565 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'Implement-stats_update-callback-for-pedit-and-skbedit'



Petr Machata says:

====================
Implement stats_update callback for pedit and skbedit

The stats_update callback is used for adding HW counters to the SW ones.
Both skbedit and pedit actions are actually recognized by flow_offload.h,
but do not implement these callbacks. As a consequence, the reported values
are only the SW ones, even where there is a HW counter available.

Patch #1 adds the callback to action skbedit, patch #2 adds it to action
pedit. Patch #3 tweaks an skbedit selftest with a check that would have
caught this problem.

The pedit test is not likewise tweaked, because the iproute2 pedit action
currently does not support JSON dumping. This will be addressed later.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 92b7e62e 2a0b1307
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -409,6 +409,16 @@ done:
	return p->tcf_action;
}

static void tcf_pedit_stats_update(struct tc_action *a, u64 bytes, u32 packets,
				   u64 lastuse, bool hw)
{
	struct tcf_pedit *d = to_pedit(a);
	struct tcf_t *tm = &d->tcf_tm;

	tcf_action_update_stats(a, bytes, packets, false, hw);
	tm->lastuse = max_t(u64, tm->lastuse, lastuse);
}

static int tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,
			  int bind, int ref)
{
@@ -485,6 +495,7 @@ static struct tc_action_ops act_pedit_ops = {
	.id		=	TCA_ID_PEDIT,
	.owner		=	THIS_MODULE,
	.act		=	tcf_pedit_act,
	.stats_update	=	tcf_pedit_stats_update,
	.dump		=	tcf_pedit_dump,
	.cleanup	=	tcf_pedit_cleanup,
	.init		=	tcf_pedit_init,
+11 −0
Original line number Diff line number Diff line
@@ -73,6 +73,16 @@ err:
	return TC_ACT_SHOT;
}

static void tcf_skbedit_stats_update(struct tc_action *a, u64 bytes,
				     u32 packets, u64 lastuse, bool hw)
{
	struct tcf_skbedit *d = to_skbedit(a);
	struct tcf_t *tm = &d->tcf_tm;

	tcf_action_update_stats(a, bytes, packets, false, hw);
	tm->lastuse = max_t(u64, tm->lastuse, lastuse);
}

static const struct nla_policy skbedit_policy[TCA_SKBEDIT_MAX + 1] = {
	[TCA_SKBEDIT_PARMS]		= { .len = sizeof(struct tc_skbedit) },
	[TCA_SKBEDIT_PRIORITY]		= { .len = sizeof(u32) },
@@ -323,6 +333,7 @@ static struct tc_action_ops act_skbedit_ops = {
	.id		=	TCA_ID_SKBEDIT,
	.owner		=	THIS_MODULE,
	.act		=	tcf_skbedit_act,
	.stats_update	=	tcf_skbedit_stats_update,
	.dump		=	tcf_skbedit_dump,
	.init		=	tcf_skbedit_init,
	.cleanup	=	tcf_skbedit_cleanup,
+7 −2
Original line number Diff line number Diff line
@@ -120,14 +120,19 @@ test_skbedit_priority_one()
	   flower action skbedit priority $prio

	local pkt0=$(qdisc_parent_stats_get $swp2 $classid .packets)
	local pkt2=$(tc_rule_handle_stats_get "$locus" 101)
	$MZ $h1 -t udp "sp=54321,dp=12345" -c 10 -d 20msec -p 100 \
	    -a own -b $h2mac -A 192.0.2.1 -B 192.0.2.2 -q

	local pkt1
	pkt1=$(busywait "$HIT_TIMEOUT" until_counter_is ">= $((pkt0 + 10))" \
			qdisc_parent_stats_get $swp2 $classid .packets)
	check_err $? "Expected to get 10 packets on class $classid, but got $((pkt1 - pkt0))."

	local pkt3=$(tc_rule_handle_stats_get "$locus" 101)
	((pkt3 >= pkt2 + 10))
	check_err $? "Expected to get 10 packets on skbedit rule but got $((pkt3 - pkt2))."

	check_err $? "Expected to get 10 packets on class $classid, but got
$((pkt1 - pkt0))."
	log_test "$locus skbedit priority $prio -> classid $classid"

	tc filter del $locus pref 1