Commit 8eb54a42 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net_sched: sch_cbs: implement lockless cbs_dump()



Instead of relying on RTNL, cbs_dump() can use READ_ONCE()
annotations, paired with WRITE_ONCE() ones in cbs_change().

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 92636501
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -389,11 +389,11 @@ static int cbs_change(struct Qdisc *sch, struct nlattr *opt,
	}

	/* Everything went OK, save the parameters used. */
	q->hicredit = qopt->hicredit;
	q->locredit = qopt->locredit;
	q->idleslope = qopt->idleslope * BYTES_PER_KBIT;
	q->sendslope = qopt->sendslope * BYTES_PER_KBIT;
	q->offload = qopt->offload;
	WRITE_ONCE(q->hicredit, qopt->hicredit);
	WRITE_ONCE(q->locredit, qopt->locredit);
	WRITE_ONCE(q->idleslope, qopt->idleslope * BYTES_PER_KBIT);
	WRITE_ONCE(q->sendslope, qopt->sendslope * BYTES_PER_KBIT);
	WRITE_ONCE(q->offload, qopt->offload);

	return 0;
}
@@ -459,11 +459,11 @@ static int cbs_dump(struct Qdisc *sch, struct sk_buff *skb)
	if (!nest)
		goto nla_put_failure;

	opt.hicredit = q->hicredit;
	opt.locredit = q->locredit;
	opt.sendslope = div64_s64(q->sendslope, BYTES_PER_KBIT);
	opt.idleslope = div64_s64(q->idleslope, BYTES_PER_KBIT);
	opt.offload = q->offload;
	opt.hicredit = READ_ONCE(q->hicredit);
	opt.locredit = READ_ONCE(q->locredit);
	opt.sendslope = div64_s64(READ_ONCE(q->sendslope), BYTES_PER_KBIT);
	opt.idleslope = div64_s64(READ_ONCE(q->idleslope), BYTES_PER_KBIT);
	opt.offload = READ_ONCE(q->offload);

	if (nla_put(skb, TCA_CBS_PARMS, sizeof(opt), &opt))
		goto nla_put_failure;