* test
@ 2009-11-04 20:27 Simon Kirby
2009-11-05 9:26 ` test Julian Anastasov
0 siblings, 1 reply; 9+ messages in thread
From: Simon Kirby @ 2009-11-04 20:27 UTC (permalink / raw)
To: netdev, Wensong Zhang, Julian Anastasov
[-- Attachment #1: Type: text/plain, Size: 1191 bytes --]
Hello!
I was noticing a significant amount of what seems/seemed to be
destination lists with multiple entries with the lblcr LVS algorithm.
While tracking it down, I think I stumbled over a mistake. In
ip_vs_lblcr_full_check(), it appears the time check logic is reversed:
for (i=0, j=tbl->rover; i<IP_VS_LBLCR_TAB_SIZE; i++) {
j = (j + 1) & IP_VS_LBLCR_TAB_MASK;
write_lock(&svc->sched_lock);
list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) {
if (time_after(en->lastuse+sysctl_ip_vs_lblcr_expiration,
now))
continue;
ip_vs_lblcr_free(en);
atomic_dec(&tbl->entries);
}
write_unlock(&svc->sched_lock);
}
Shouldn't this be "time_before"? It seems that it currently nukes all
recently-used entries every time this function is called, which seems to
be every 30 minutes, rather than removing the not-recently-used ones.
If my reading is correct, this patch should fix it. Am I missing
something?
Cheers,
Simon-
[-- Attachment #2: lblcr+full_check_time_fix.patch --]
[-- Type: text/x-diff, Size: 535 bytes --]
diff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c
index 715b57f..937743f 100644
--- a/net/netfilter/ipvs/ip_vs_lblcr.c
+++ b/net/netfilter/ipvs/ip_vs_lblcr.c
@@ -432,7 +432,7 @@ static inline void ip_vs_lblcr_full_check(struct ip_vs_service *svc)
write_lock(&svc->sched_lock);
list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) {
- if (time_after(en->lastuse+sysctl_ip_vs_lblcr_expiration,
+ if (time_before(en->lastuse+sysctl_ip_vs_lblcr_expiration,
now))
continue;
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: test
2009-11-04 20:27 test Simon Kirby
@ 2009-11-05 9:26 ` Julian Anastasov
2009-11-05 10:11 ` test Simon Kirby
0 siblings, 1 reply; 9+ messages in thread
From: Julian Anastasov @ 2009-11-05 9:26 UTC (permalink / raw)
To: Simon Kirby; +Cc: netdev, Wensong Zhang
Hello,
On Wed, 4 Nov 2009, Simon Kirby wrote:
> Hello!
>
> I was noticing a significant amount of what seems/seemed to be
> destination lists with multiple entries with the lblcr LVS algorithm.
> While tracking it down, I think I stumbled over a mistake. In
> ip_vs_lblcr_full_check(), it appears the time check logic is reversed:
>
> for (i=0, j=tbl->rover; i<IP_VS_LBLCR_TAB_SIZE; i++) {
> j = (j + 1) & IP_VS_LBLCR_TAB_MASK;
>
> write_lock(&svc->sched_lock);
> list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) {
If 'time to expire' is after current time then continue,
i.e. current time didn't reached the limit, seems correct,
no need to patch. For better reading and to match
ip_vs_lblcr_check_expire() it can be converted to:
if (time_before(now, en->lastuse+sysctl_ip_vs_lblcr_expiration))
continue;
> if (time_after(en->lastuse+sysctl_ip_vs_lblcr_expiration,
> now))
> continue;
>
> ip_vs_lblcr_free(en);
> atomic_dec(&tbl->entries);
> }
> write_unlock(&svc->sched_lock);
> }
>
> Shouldn't this be "time_before"? It seems that it currently nukes all
> recently-used entries every time this function is called, which seems to
> be every 30 minutes, rather than removing the not-recently-used ones.
>
> If my reading is correct, this patch should fix it. Am I missing
> something?
include/linux/jiffies.h:
time_after(a,b) returns true if the time a is after time b.
#define time_before(a,b) time_after(b,a)
Regards
--
Julian Anastasov <ja@ssi.bg>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: test
2009-11-05 9:26 ` test Julian Anastasov
@ 2009-11-05 10:11 ` Simon Kirby
0 siblings, 0 replies; 9+ messages in thread
From: Simon Kirby @ 2009-11-05 10:11 UTC (permalink / raw)
To: Julian Anastasov; +Cc: netdev, lvs-devel
On Thu, Nov 05, 2009 at 11:26:27AM +0200, Julian Anastasov wrote:
> If 'time to expire' is after current time then continue,
> i.e. current time didn't reached the limit, seems correct,
> no need to patch. For better reading and to match
> ip_vs_lblcr_check_expire() it can be converted to:
>
> if (time_before(now, en->lastuse+sysctl_ip_vs_lblcr_expiration))
> continue;
D'oh. I noticed the use of time_before() further down in
ip_vs_lblcr_check_expire(), but not the reversed arguments, hence my
confusion.
I still suspect there may be something not quite right, or which could
perhaps do with some tuning. It's difficult to see exactly how it's
working internally, since there's currently nothing to get a summary of
the dest_sets to userspace. I'll follow up if I find anything.
Simon-
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] taprio: Set the value of picos_per_byte before fill sched_entry
@ 2022-09-28 6:58 jianghaoran
2022-09-30 2:18 ` Jakub Kicinski
0 siblings, 1 reply; 9+ messages in thread
From: jianghaoran @ 2022-09-28 6:58 UTC (permalink / raw)
To: vinicius.gomes
Cc: jhs, xiyou.wangcong, jiri, davem, edumazet, kuba, pabeni, netdev,
linux-kernel
If the value of picos_per_byte is set after fill sched_entry,
as a result, the min_duration calculated by length_to_duration is 0,
and the validity of the input interval cannot be judged,
too small intervals couldn't allow any packet to be transmitted.
It will appear like commit b5b73b26b3ca ("taprio:
Fix allowing too small intervals") described problem.
Here is a further modification of this problem.
example:
tc qdisc replace dev enp5s0f0 parent root handle 100 taprio \
num_tc 3 \
map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
queues 1@0 1@1 2@2 \
base-time 1528743495910289987 \
sched-entry S 01 9 \
sched-entry S 02 9 \
sched-entry S 04 9 \
clockid CLOCK_TAI
Signed-off-by: jianghaoran <jianghaoran@kylinos.cn>
---
net/sched/sch_taprio.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
index 86675a79da1e..d95ec2250f24 100644
--- a/net/sched/sch_taprio.c
+++ b/net/sched/sch_taprio.c
@@ -1507,6 +1507,8 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
goto free_sched;
}
+ taprio_set_picos_per_byte(dev, q);
+
err = parse_taprio_schedule(q, tb, new_admin, extack);
if (err < 0)
goto free_sched;
@@ -1521,8 +1523,6 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
if (err < 0)
goto free_sched;
- taprio_set_picos_per_byte(dev, q);
-
if (mqprio) {
err = netdev_set_num_tc(dev, mqprio->num_tc);
if (err)
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] taprio: Set the value of picos_per_byte before fill sched_entry
2022-09-28 6:58 [PATCH] taprio: Set the value of picos_per_byte before fill sched_entry jianghaoran
@ 2022-09-30 2:18 ` Jakub Kicinski
2022-09-30 13:58 ` test jianghaoran
0 siblings, 1 reply; 9+ messages in thread
From: Jakub Kicinski @ 2022-09-30 2:18 UTC (permalink / raw)
To: jianghaoran
Cc: vinicius.gomes, jhs, xiyou.wangcong, jiri, davem, edumazet,
pabeni, netdev, linux-kernel
On Wed, 28 Sep 2022 14:58:30 +0800 jianghaoran wrote:
> If the value of picos_per_byte is set after fill sched_entry,
> as a result, the min_duration calculated by length_to_duration is 0,
> and the validity of the input interval cannot be judged,
> too small intervals couldn't allow any packet to be transmitted.
Meaning an invalid configuration is accepted but no packets
can ever be transmitted? Could you make the user-visible
issue clearer?
> It will appear like commit b5b73b26b3ca ("taprio:
> Fix allowing too small intervals") described problem.
> Here is a further modification of this problem.
>
> example:
Here as well it seems worthwhile to mention what this is an example of.
e.g. "example configuration which will not be able to transmit packets"
> tc qdisc replace dev enp5s0f0 parent root handle 100 taprio \
> num_tc 3 \
> map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
> queues 1@0 1@1 2@2 \
> base-time 1528743495910289987 \
> sched-entry S 01 9 \
> sched-entry S 02 9 \
> sched-entry S 04 9 \
> clockid CLOCK_TAI
Please add a Fixes tag pointing to the first commit where the issue was
present, and CC Vladimir Oltean <vladimir.oltean@nxp.com> on the next
version.
^ permalink raw reply [flat|nested] 9+ messages in thread
* test
@ 2019-09-07 5:01 Rain River
0 siblings, 0 replies; 9+ messages in thread
From: Rain River @ 2019-09-07 5:01 UTC (permalink / raw)
To: netdev
Please ignore it.
^ permalink raw reply [flat|nested] 9+ messages in thread
* test
@ 2013-06-04 6:04 Ding Tianhong
0 siblings, 0 replies; 9+ messages in thread
From: Ding Tianhong @ 2013-06-04 6:04 UTC (permalink / raw)
To: Netdev
test
^ permalink raw reply [flat|nested] 9+ messages in thread
* test
@ 2010-11-27 3:01 lkernmnet
0 siblings, 0 replies; 9+ messages in thread
From: lkernmnet @ 2010-11-27 3:01 UTC (permalink / raw)
To: netdev
tttttttttttttttttt
^ permalink raw reply [flat|nested] 9+ messages in thread
* test
@ 2005-05-05 18:30 Vlad Yasevich
0 siblings, 0 replies; 9+ messages in thread
From: Vlad Yasevich @ 2005-05-05 18:30 UTC (permalink / raw)
To: netdev
^ permalink raw reply [flat|nested] 9+ messages in thread
* test
@ 2002-11-07 13:54 Jacky Hsiao
0 siblings, 0 replies; 9+ messages in thread
From: Jacky Hsiao @ 2002-11-07 13:54 UTC (permalink / raw)
To: netdev
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-09-30 14:03 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-04 20:27 test Simon Kirby
2009-11-05 9:26 ` test Julian Anastasov
2009-11-05 10:11 ` test Simon Kirby
-- strict thread matches above, loose matches on Subject: below --
2022-09-28 6:58 [PATCH] taprio: Set the value of picos_per_byte before fill sched_entry jianghaoran
2022-09-30 2:18 ` Jakub Kicinski
2022-09-30 13:58 ` test jianghaoran
2019-09-07 5:01 test Rain River
2013-06-04 6:04 test Ding Tianhong
2010-11-27 3:01 test lkernmnet
2005-05-05 18:30 test Vlad Yasevich
2002-11-07 13:54 test Jacky Hsiao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).