HomeFreeBSD

if_epair: fix race condition on multi-core systems

Description

if_epair: fix race condition on multi-core systems

As an unwanted side effect of the performance improvements in
24f0bfbad57b9, epair interfaces stop forwarding traffic on higher
load levels when running on multi-core systems.

This happens due to a race condition in the logic that decides when to
place work in the task queue(s) responsible for processing the content
of ring buffers.

In order to fix this, a field named state is added to the epair_queue
structure. This field is used by the affected functions to signal each
other that something happened in the underlying ring buffers that might
require work to be scheduled in task queue(s), replacing the existing
logic, which relied on checking if ring buffers are empty or not.

epair_menq() does:

  • set BIT_MBUF_QUEUED
  • queue mbuf
  • if testandset BIT_QUEUE_TASK: enqueue task

epair_tx_start_deferred() does:

  • swap ring buffers
  • process mbufs
  • clear BIT_QUEUE_TASK
  • if testandclear BIT_MBUF_QUEUED enqueue task

PR: 262571
Reported by: Johan Hendriks <joh.hendriks@gmail.com>
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D34569

(cherry picked from commit 66acf7685bcd8cf23b6c658a991637238a01859e)

Details

Provenance
gremboAuthored on Mar 16 2022, 10:08 PM
kpCommitted on Mar 20 2022, 12:24 AM
Differential Revision
D34569: if_epair: fix race condition on multi-core systems
Parents
rG6fa8af618475: netmap: Fix TOCTOU vulnerability in nmreq_copyin
Branches
Unknown
Tags
Unknown
Reverted By
rG56dc95b249dc: Revert "if_epair: rework"