On 2024/06/26 0:47, John Ogness wrote: > On 2024-06-26, Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> wrote: >> On 2024/06/25 23:17, John Ogness wrote: >>> On 2024-06-25, Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> wrote: >>>> syzbot is reporting circular locking dependency inside __bpf_prog_run(), >>>> for fault injection calls printk() despite rq lock is already held. >>>> >>>> Guard __bpf_prog_run() using printk_deferred_{enter,exit}() (and >>>> preempt_{disable,enable}() if CONFIG_PREEMPT_RT=n) in order to defer any >>>> printk() messages. >>> >>> Why is the reason for disabling preemption? >> >> Because since kernel/printk/printk_safe.c uses a percpu counter for deferring >> printk(), printk_safe_enter() and printk_safe_exit() have to be called from >> the same CPU. preempt_disable() before printk_safe_enter() and preempt_enable() >> after printk_safe_exit() guarantees that printk_safe_enter() and >> printk_safe_exit() are called from the same CPU. > > Yes, but we already have cant_migrate(). Are you suggesting there are > configurations where cant_migrate() is true but the context can be > migrated anyway? No, I'm not aware of such configuration. Does migrate_disable() imply preempt_disable() ? If yes, we don't need to also call preempt_disable(). My understanding is that migration is about "on which CPU a process runs" and preemption is about "whether a different process runs on this CPU". That is, disabling migration and disabling preemption are independent. Is migrate_disable() alone sufficient for managing a percpu counter? If yes, we don't need to also call preempt_disable() in order to manage a percpu counter.