В ядре Linux устранена следующая уязвимость: veth: более надежная рукопись гонки, чтобы не txq застрять Совершить dc82a33297fc ("veth: прим…
В ядре Linux устранена следующая уязвимость: veth: более надежная рукопись гонки, чтобы не txq застрять Совершить dc82a33297fc ("veth: применить диск диска backpressure на fullpr_ring к уменьшить TX капли") ввели гоночный условный, который может привести к постоянному Застопорился TXQ. Это наблюдалось в производстве на системах ARM64 (Ampere Altra) Макс). Гонка происходит в veth_xmit(). Производитель наблюдает полный ptr_ring и останавливает очередь (netif_tx_stop_queue()). Последующая условная логика, предназначен для повторного пробуждения очереди, если потребитель только что очистил ее (если (__ptr_ring_empty(...)) netif_tx_wake_queue()), может потерпеть неудачу. Это приводит к "потерянное пробуждение", где остановлено TXQ (QUEUE_STATE_DRV_XOFF) и Движение останавливается. Этот сбой вызван неправильным использованием API __ptr_ring_empty() Со стороны производителя. Как отмечается в комментариях ядра, эта проверка не гарантированно правильно, если потребитель работает на другом процессоре. пустой тест основан на ptr_ring->consumer_head, что делает его надежным только для Потребитель. Использование этого чека со стороны производителя в корне является пикантным. Этот патч исправляет гонку, принимая более надежную логику из более раннего версия V4 патсета, которая всегда смывала сверток: (1) В veth_xmit(), логика условного пробуждения и ее барьер памяти Они удалены. Вместо этого, остановив очередь, мы безоговорочно звоним __veth_xdp_flush(rq). Это гарантирует, что потребитель NAPI будет запланирован, сделать его исключительно ответственным за повторное пробуждение TXQ. Это обрабатывает гонку, где veth_poll() потребляет все пакеты и завершает NAPI * раньше* veth_xmit() на стороне производителя называл netif_tx_stop_queue. На сайте __veth_xdp_flush(rq) будет наблюдать rx_notify_masked is false и расписание НАПИ. (2) С потребительской стороны, логика для пробуждения однорангового TXQ перемещается из veth_xdp_rcv() и размещен в конце функции veth_poll(). Это размещение является частью фиксации гонки, как проверка netif_tx_queue_stopped() должен произойти после rx_notify_masked потенциально установлен на ложный во время NAPI завершение. Это обрабатывает гонку, где veth_poll() потребляет все пакеты, но не законченный (rx_notify_masked по-прежнему верно). Производитель veth_xmit() останавливает TXQ и __veth_dp_xfsh(rq) будут наблюдать rx_notify_masked истинно, значение Не запускает NAPI. Затем veth_poll() изменить rx_notify_masked на false and останавливает NAPI. Перед выходом veth_poll() будет наблюдать, что TXQ остановлен и проснется Вверх.
| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux-allwinner-5.19 | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается |