В ядре Linux устранена следующая уязвимость:
perf/core: исправлен недопустимый контекст ожидания в ctx_sched_in(). Lockdep обнаружил ошибку в планировании событий, когда закрепленное событие было
не удалось и пробуждает потоки в кольцевом буфере, как показано ниже. Кажется, он не должен захватывать блокировку очереди ожидания при блокировке перф-контекста.
Давайте сделаем это с помощью irq_work.
[ 39.913691] =============================
[39.914157] [ОШИБКА: Неверный контекст ожидания]
[ 39.914623] 6.15.0-next-20250530-next-2025053 #1 Не испорчено
[ 39.915271] -----------------------------
[ 39.915731] repro/837 пытается заблокировать:
[ 39.916191] ffff88801acfabd8 (&event->waitq){....}-{3:3}, по адресу: __wake_up+0x26/0x60
[ 39.917182] другая информация, которая может помочь нам отладить это:
[ 39.917761] контекст-{5:5}
[ 39.918079] 4 замка, удерживаемые repro/837:
[ 39.918530] #0: ffffffff8725cd00 (rcu_read_lock){....}-{1:3}, по адресу: __perf_event_task_sched_in+0xd1/0xbc0
[ 39.919612] #1: ffff88806ca3c6f8 (&cpuctx_lock){....}-{2:2}, по адресу: __perf_event_task_sched_in+0x1a7/0xbc0
[ 39.920748] #2: ffff88800d91fc18 (&ctx->lock){....}-{2:2}, по адресу: __perf_event_task_sched_in+0x1f9/0xbc0
[ 39.921819] #3: ffffffff8725cd00 (rcu_read_lock){....}-{1:3}, по адресу: perf_event_wakeup+0x6c/0x470
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: perf/core: Fix invalid wait context in ctx_sched_in() Lockdep found a bug in the event scheduling when a pinned event was failed and wakes up the threads in the ring buffer like below. It seems it should not grab a wait-queue lock under perf-context lock. Let's do it with irq_work. [ 39.913691] ============================= [ 39.914157] [ BUG: Invalid wait context ] [ 39.914623] 6.15.0-next-20250530-next-2025053 #1 Not tainted [ 39.915271] ----------------------------- [ 39.915731] repro/837 is trying to lock: [ 39.916191] ffff88801acfabd8 (&event->waitq){....}-{3:3}, at: __wake_up+0x26/0x60 [ 39.917182] other info that might help us debug this: [ 39.917761] context-{5:5} [ 39.918079] 4 locks held by repro/837: [ 39.918530] #0: ffffffff8725cd00 (rcu_read_lock){....}-{1:3}, at: __perf_event_task_sched_in+0xd1/0xbc0 [ 39.919612] #1: ffff88806ca3c6f8 (&cpuctx_lock){....}-{2:2}, at: __perf_event_task_sched_in+0x1a7/0xbc0 [ 39.920748] #2: ffff88800d91fc18 (&ctx->lock){....}-{2:2}, at: __perf_event_task_sched_in+0x1f9/0xbc0 [ 39.921819] #3: ffffffff8725cd00 (rcu_read_lock){....}-{1:3}, at: perf_event_wakeup+0x6c/0x470