On Tue, Jun 25, 2024 at 9:05 AM Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> wrote: > > 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. If you want to add printk_deferred_enter() it probably should be in should_fail_ex(). Not here. We will not be wrapping all bpf progs this way. pw-bot: cr