Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net/sched: sch_hfsc: fix divide-by-zero in rtsc_min()

m2sm() converts a u32 slope to a u64 scaled value. For large inputs
(e.g. m1=4000000000), the result can reach 2^32. rtsc_min() stores
the difference of two such u64 values in a u32 variable `dsm` and
uses it as a divisor. When the difference is exactly 2^32 the
truncation yields zero, causing a divide-by-zero oops in the
concave-curve intersection path:

Oops: divide error: 0000
RIP: 0010:rtsc_min (net/sched/sch_hfsc.c:601)
Call Trace:
init_ed (net/sched/sch_hfsc.c:629)
hfsc_enqueue (net/sched/sch_hfsc.c:1569)
[...]

Widen `dsm` to u64 and replace do_div() with div64_u64() so the full
difference is preserved.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Reported-by: Weiming Shi <bestswngs@gmail.com>
Signed-off-by: Xiang Mei <xmei5@asu.edu>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://patch.msgid.link/20260326204310.1549327-1-xmei5@asu.edu
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Xiang Mei and committed by
Jakub Kicinski
4576100b 1a6fdb35

+2 -2
+2 -2
net/sched/sch_hfsc.c
··· 555 555 rtsc_min(struct runtime_sc *rtsc, struct internal_sc *isc, u64 x, u64 y) 556 556 { 557 557 u64 y1, y2, dx, dy; 558 - u32 dsm; 558 + u64 dsm; 559 559 560 560 if (isc->sm1 <= isc->sm2) { 561 561 /* service curve is convex */ ··· 598 598 */ 599 599 dx = (y1 - y) << SM_SHIFT; 600 600 dsm = isc->sm1 - isc->sm2; 601 - do_div(dx, dsm); 601 + dx = div64_u64(dx, dsm); 602 602 /* 603 603 * check if (x, y1) belongs to the 1st segment of rtsc. 604 604 * if so, add the offset.