* Re: [syzbot] [mm?] INFO: rcu detected stall in exit_to_user_mode_loop [not found] <6856d355.a00a0220.137b3.007d.GAE@google.com> @ 2025-07-28 21:30 ` syzbot 2026-08-17 7:21 ` Junjie Cao 0 siblings, 1 reply; 3+ messages in thread From: syzbot @ 2025-07-28 21:30 UTC (permalink / raw) To: akpm, cgroups, hannes, jackmanb, linux-kernel, linux-mm, mhocko, mhocko, muchun.song, netdev, roman.gushchin, shakeel.butt, surenb, syzkaller-bugs, vbabka, ziy syzbot has found a reproducer for the following issue on: HEAD commit: afd8c2c9e2e2 Merge branch 'ipv6-f6i-fib6_siblings-and-rt-f.. git tree: net console output: https://syzkaller.appspot.com/x/log.txt?x=13c71034580000 kernel config: https://syzkaller.appspot.com/x/.config?x=a4bcc0a11b3192be dashboard link: https://syzkaller.appspot.com/bug?extid=2642f347f7309b4880dc compiler: Debian clang version 20.1.7 (++20250616065708+6146a88f6049-1~exp1~20250616065826.132), Debian LLD 20.1.7 syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17b284a2580000 C reproducer: https://syzkaller.appspot.com/x/repro.c?x=17c71034580000 Downloadable assets: disk image: https://storage.googleapis.com/syzbot-assets/6f29edec8e85/disk-afd8c2c9.raw.xz vmlinux: https://storage.googleapis.com/syzbot-assets/8490ef85f5cd/vmlinux-afd8c2c9.xz kernel image: https://storage.googleapis.com/syzbot-assets/1357e17669cb/bzImage-afd8c2c9.xz IMPORTANT: if you fix the issue, please add the following tag to the commit: Reported-by: syzbot+2642f347f7309b4880dc@syzkaller.appspotmail.com rcu: INFO: rcu_preempt detected stalls on CPUs/tasks: rcu: 0-...!: (3 ticks this GP) idle=8da4/1/0x4000000000000000 softirq=18768/18768 fqs=0 rcu: (detected by 1, t=10502 jiffies, g=13833, q=887 ncpus=2) Sending NMI from CPU 1 to CPUs 0: NMI backtrace for cpu 0 CPU: 0 UID: 0 PID: 5983 Comm: syz-executor Not tainted 6.16.0-rc7-syzkaller-00100-gafd8c2c9e2e2 #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/12/2025 RIP: 0010:__lock_acquire+0x316/0xd20 kernel/locking/lockdep.c:5188 Code: 8b 54 24 0c 83 e2 01 c1 e2 12 44 09 e2 41 c1 e6 14 41 09 d6 8b 54 24 10 c1 e2 13 c1 e5 15 09 d5 09 cd 44 09 f5 41 89 6c c7 20 <45> 89 44 c7 24 4c 89 7c 24 10 4d 8d 34 c7 81 e5 ff 1f 00 00 48 0f RSP: 0018:ffffc90000007b40 EFLAGS: 00000002 RAX: 000000000000000a RBX: ffffffff8e13f0e0 RCX: 0000000000000007 RDX: 0000000000080000 RSI: 0000000000004000 RDI: ffff88802c368000 RBP: 00000000000a4007 R08: 0000000000000000 R09: ffffffff898d70e8 R10: dffffc0000000000 R11: ffffed100fc2785e R12: 0000000000024000 R13: 0000000000000000 R14: 0000000000024000 R15: ffff88802c368af0 FS: 0000000000000000(0000) GS:ffff888125c23000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055556e2015c8 CR3: 000000000df38000 CR4: 00000000003526f0 Call Trace: <IRQ> lock_acquire+0x120/0x360 kernel/locking/lockdep.c:5871 rcu_lock_acquire include/linux/rcupdate.h:331 [inline] rcu_read_lock include/linux/rcupdate.h:841 [inline] advance_sched+0xa14/0xc90 net/sched/sch_taprio.c:985 __run_hrtimer kernel/time/hrtimer.c:1761 [inline] __hrtimer_run_queues+0x52c/0xc60 kernel/time/hrtimer.c:1825 hrtimer_interrupt+0x45b/0xaa0 kernel/time/hrtimer.c:1887 local_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1039 [inline] __sysvec_apic_timer_interrupt+0x108/0x410 arch/x86/kernel/apic/apic.c:1056 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1050 [inline] sysvec_apic_timer_interrupt+0xa1/0xc0 arch/x86/kernel/apic/apic.c:1050 </IRQ> <TASK> asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:702 RIP: 0010:debug_lockdep_rcu_enabled+0xf/0x40 kernel/rcu/update.c:320 Code: cc cc cc cc cc cc cc cc cc cc cc 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 0f 1e fa 31 c0 83 3d 17 30 34 04 00 74 1e <83> 3d 3a 60 34 04 00 74 15 65 48 8b 0c 25 08 d0 9f 92 31 c0 83 b9 RSP: 0018:ffffc90003f0ef70 EFLAGS: 00000202 RAX: 0000000000000000 RBX: ffffffff90d8d001 RCX: ffffc90003f0ff60 RDX: ffffc90003f0f001 RSI: dffffc0000000000 RDI: ffffc90003f0f050 RBP: dffffc0000000000 R08: ffffc90003f0ff48 R09: 0000000000000000 R10: ffffc90003f0f098 R11: fffff520007e1e15 R12: ffffc90003f0ff58 R13: ffffc90003f08000 R14: ffffc90003f0f048 R15: ffffffff8172aae5 rcu_read_unlock include/linux/rcupdate.h:869 [inline] class_rcu_destructor include/linux/rcupdate.h:1155 [inline] unwind_next_frame+0x195c/0x2390 arch/x86/kernel/unwind_orc.c:680 arch_stack_walk+0x11c/0x150 arch/x86/kernel/stacktrace.c:25 stack_trace_save+0x9c/0xe0 kernel/stacktrace.c:122 save_stack+0xf5/0x1f0 mm/page_owner.c:156 __reset_page_owner+0x71/0x1f0 mm/page_owner.c:308 reset_page_owner include/linux/page_owner.h:25 [inline] free_pages_prepare mm/page_alloc.c:1248 [inline] free_unref_folios+0xc66/0x14d0 mm/page_alloc.c:2763 folios_put_refs+0x559/0x640 mm/swap.c:992 free_pages_and_swap_cache+0x277/0x520 mm/swap_state.c:264 __tlb_batch_free_encoded_pages mm/mmu_gather.c:136 [inline] tlb_batch_pages_flush mm/mmu_gather.c:149 [inline] tlb_flush_mmu_free mm/mmu_gather.c:397 [inline] tlb_flush_mmu+0x3a0/0x680 mm/mmu_gather.c:404 tlb_finish_mmu+0xc3/0x1d0 mm/mmu_gather.c:497 exit_mmap+0x44c/0xb50 mm/mmap.c:1297 __mmput+0x118/0x420 kernel/fork.c:1121 exit_mm+0x1da/0x2c0 kernel/exit.c:581 do_exit+0x648/0x22e0 kernel/exit.c:952 do_group_exit+0x21c/0x2d0 kernel/exit.c:1105 get_signal+0x1286/0x1340 kernel/signal.c:3034 arch_do_signal_or_restart+0x9a/0x750 arch/x86/kernel/signal.c:337 exit_to_user_mode_loop+0x75/0x110 kernel/entry/common.c:111 exit_to_user_mode_prepare include/linux/entry-common.h:330 [inline] syscall_exit_to_user_mode_work include/linux/entry-common.h:414 [inline] syscall_exit_to_user_mode include/linux/entry-common.h:449 [inline] do_syscall_64+0x2bd/0x3b0 arch/x86/entry/syscall_64.c:100 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f730c585213 Code: Unable to access opcode bytes at 0x7f730c5851e9. RSP: 002b:00007ffe0103af48 EFLAGS: 00000246 ORIG_RAX: 0000000000000038 RAX: fffffffffffffffc RBX: 0000000000000000 RCX: 00007f730c585213 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000001200011 RBP: 0000000000000001 R08: 0000000000000000 R09: 0000000000000000 R10: 000055556e1e67d0 R11: 0000000000000246 R12: 0000000000000000 R13: 00000000000927c0 R14: 000000000003604b R15: 00007ffe0103b0e0 </TASK> rcu: rcu_preempt kthread timer wakeup didn't happen for 10501 jiffies! g13833 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x402 rcu: Possible timer handling issue on cpu=0 timer-softirq=10563 rcu: rcu_preempt kthread starved for 10502 jiffies! g13833 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x402 ->cpu=0 rcu: Unless rcu_preempt kthread gets sufficient CPU time, OOM is now expected behavior. rcu: RCU grace-period kthread stack dump: task:rcu_preempt state:I stack:26792 pid:16 tgid:16 ppid:2 task_flags:0x208040 flags:0x00004000 Call Trace: <TASK> context_switch kernel/sched/core.c:5397 [inline] __schedule+0x16fd/0x4cf0 kernel/sched/core.c:6786 __schedule_loop kernel/sched/core.c:6864 [inline] schedule+0x165/0x360 kernel/sched/core.c:6879 schedule_timeout+0x12b/0x270 kernel/time/sleep_timeout.c:99 rcu_gp_fqs_loop+0x301/0x1540 kernel/rcu/tree.c:2054 rcu_gp_kthread+0x99/0x390 kernel/rcu/tree.c:2256 kthread+0x70e/0x8a0 kernel/kthread.c:464 ret_from_fork+0x3fc/0x770 arch/x86/kernel/process.c:148 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 </TASK> --- If you want syzbot to run the reproducer, reply with: #syz test: git://repo/address.git branch-or-commit-hash If you attach or paste a git patch, syzbot will apply it before testing. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [syzbot] [mm?] INFO: rcu detected stall in exit_to_user_mode_loop 2025-07-28 21:30 ` [syzbot] [mm?] INFO: rcu detected stall in exit_to_user_mode_loop syzbot @ 2026-08-17 7:21 ` Junjie Cao 2026-08-17 6:02 ` syzbot 0 siblings, 1 reply; 3+ messages in thread From: Junjie Cao @ 2026-08-17 7:21 UTC (permalink / raw) To: syzbot+2642f347f7309b4880dc; +Cc: linux-kernel, netdev, hdanton #syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git 24ef02f934eeb48830cff6b739abc3c62b1d107b diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c index 299234a5f0fe..7519bc5c1aff 100644 --- a/net/sched/sch_taprio.c +++ b/net/sched/sch_taprio.c @@ -259,6 +259,26 @@ static int length_to_duration(struct taprio_sched *q, int len) return div_u64(len * atomic64_read(&q->picos_per_byte), PSEC_PER_NSEC); } +/* Software schedules service one hrtimer expiry per entry; intervals + * shorter than the expiry service cost rearm the timer with an expiry + * already in the past and storm the CPU. 100us leaves margin above the + * measured cost on debug configurations. + */ +#define TAPRIO_MIN_SW_INTERVAL_NS (100 * NSEC_PER_USEC) + +static s64 taprio_min_interval(struct taprio_sched *q) +{ + s64 min_interval = length_to_duration(q, ETH_ZLEN); + + /* Only pure software schedules arm the per-entry hrtimer. */ + if (!FULL_OFFLOAD_IS_ENABLED(q->flags) && + !TXTIME_ASSIST_IS_ENABLED(q->flags)) + min_interval = max_t(s64, min_interval, + TAPRIO_MIN_SW_INTERVAL_NS); + + return min_interval; +} + static int duration_to_length(struct taprio_sched *q, u64 duration) { return div_u64(duration * PSEC_PER_NSEC, atomic64_read(&q->picos_per_byte)); @@ -915,6 +935,51 @@ static bool should_change_schedules(const struct sched_gate_list *admin, return false; } +/* The operational schedule fell behind, e.g. because the timer was delayed + * or the reference clock stepped forward. Advancing one entry per timer + * expiry would replay the whole backlog from hrtimer context, so skip + * complete cycles arithmetically and walk the remaining entries to land on + * the entry covering the current time. + */ +static void taprio_catch_up(struct sched_gate_list *oper, + struct sched_entry **next, ktime_t *next_start, + ktime_t *end_time, ktime_t now) +{ + int budget = 2 * oper->num_entries + 1; + struct sched_entry *entry = *next; + ktime_t start = *next_start; + ktime_t end = *end_time; + s64 behind = ktime_sub(now, end); + + if (oper->cycle_time > 0 && behind >= oper->cycle_time) { + s64 jump = div64_s64(behind, oper->cycle_time) * oper->cycle_time; + + start = ktime_add_ns(start, jump); + end = ktime_add_ns(end, jump); + oper->cycle_end_time = ktime_add_ns(oper->cycle_end_time, jump); + } + + while (ktime_before(end, now) && --budget) { + if (list_is_last(&entry->list, &oper->entries) || + ktime_compare(end, oper->cycle_end_time) == 0) { + entry = list_first_entry(&oper->entries, + struct sched_entry, list); + oper->cycle_end_time = ktime_add_ns(oper->cycle_end_time, + oper->cycle_time); + } else { + entry = list_next_entry(entry, list); + } + + start = end; + end = ktime_add_ns(end, entry->interval); + end = min_t(ktime_t, end, oper->cycle_end_time); + } + + *next = entry; + *next_start = start; + *end_time = end; +} + static enum hrtimer_restart advance_sched(struct hrtimer *timer) { struct taprio_sched *q = container_of(timer, struct taprio_sched, @@ -924,7 +989,7 @@ static enum hrtimer_restart advance_sched(struct hrtimer *timer) int num_tc = netdev_get_num_tc(dev); struct sched_entry *entry, *next; struct Qdisc *sch = q->root; - ktime_t end_time; + ktime_t end_time, next_start, now; int tc; spin_lock(&q->current_entry_lock); @@ -960,14 +1025,19 @@ static enum hrtimer_restart advance_sched(struct hrtimer *timer) next = list_next_entry(entry, list); } - end_time = ktime_add_ns(entry->end_time, next->interval); + next_start = entry->end_time; + end_time = ktime_add_ns(next_start, next->interval); end_time = min_t(ktime_t, end_time, oper->cycle_end_time); + now = taprio_get_time(q); + if (unlikely(ktime_before(end_time, now))) + taprio_catch_up(oper, &next, &next_start, &end_time, now); + for (tc = 0; tc < num_tc; tc++) { if (next->gate_duration[tc] == oper->cycle_time) next->gate_close_time[tc] = KTIME_MAX; else - next->gate_close_time[tc] = ktime_add_ns(entry->end_time, + next->gate_close_time[tc] = ktime_add_ns(next_start, next->gate_duration[tc]); } @@ -1038,7 +1108,7 @@ static int fill_sched_entry(struct taprio_sched *q, struct nlattr **tb, struct sched_entry *entry, struct netlink_ext_ack *extack) { - int min_duration = length_to_duration(q, ETH_ZLEN); + s64 min_duration = taprio_min_interval(q); u32 interval = 0; if (tb[TCA_TAPRIO_SCHED_ENTRY_CMD]) @@ -1166,7 +1236,7 @@ static int parse_taprio_schedule(struct taprio_sched *q, struct nlattr **tb, new->cycle_time = cycle; } - if (new->cycle_time < new->num_entries * length_to_duration(q, ETH_ZLEN)) { + if (new->cycle_time < (s64)new->num_entries * taprio_min_interval(q)) { NL_SET_ERR_MSG(extack, "'cycle_time' is too small"); return -EINVAL; } ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [syzbot] [mm?] INFO: rcu detected stall in exit_to_user_mode_loop 2026-08-17 7:21 ` Junjie Cao @ 2026-08-17 6:02 ` syzbot 0 siblings, 0 replies; 3+ messages in thread From: syzbot @ 2026-08-17 6:02 UTC (permalink / raw) To: hdanton, junjie.cao, linux-kernel, netdev, syzkaller-bugs Hello, syzbot has tested the proposed patch and the reproducer did not trigger any issue: Reported-by: syzbot+2642f347f7309b4880dc@syzkaller.appspotmail.com Tested-by: syzbot+2642f347f7309b4880dc@syzkaller.appspotmail.com Tested on: commit: 24ef02f9 net: page_pool: fix UAF in __page_pool_releas.. git tree: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git console output: https://syzkaller.appspot.com/x/log.txt?x=15742679580000 kernel config: https://syzkaller.appspot.com/x/.config?x=d07fbc6821d72a61 dashboard link: https://syzkaller.appspot.com/bug?extid=2642f347f7309b4880dc compiler: gcc (Debian 14.2.0-19) 14.2.0, GNU ld (GNU Binutils for Debian) 2.44 patch: https://syzkaller.appspot.com/x/patch.diff?x=16b1ea25580000 Note: testing is done by a robot and is best-effort only. ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-17 6:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <6856d355.a00a0220.137b3.007d.GAE@google.com>
2025-07-28 21:30 ` [syzbot] [mm?] INFO: rcu detected stall in exit_to_user_mode_loop syzbot
2026-08-17 7:21 ` Junjie Cao
2026-08-17 6:02 ` syzbot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox