HomeFreeBSD

iflib_stop: drain rx tasks to prevent any data races

Description

iflib_stop: drain rx tasks to prevent any data races

iflib_stop modifies iflib data structures that are used by _task_fn_rx,
most prominently the free lists. So, iflib_stop has to ensure that the
rx task threads are not active.

This should help to fix a crash seen when iflib_if_ioctl (e.g.,
SIOCSIFCAP) is called while there is already traffic flowing.

The crash has been seen on VMWare guests with vmxnet3 driver.

My guess is that on physical hardware the couple of 1ms delays that
iflib_stop has after disabling interrupts are enough for the queued work
to be completed before any iflib state is touched.

But on busy hypervisors the guests might not get enough CPU time to
complete the work, thus there can be a race between the taskqueue
threads and the work done to handle an ioctl, specifically in iflib_stop
and iflib_init_locked.

PR: 259458
Reviewed by: markj
MFC after: 3 weeks
Differential Revision: https://reviews.freebsd.org/D32926

Details

Provenance
avgAuthored on Nov 19 2021, 7:56 AM
Reviewer
markj
Differential Revision
D32926: iflib_stop: drain rx tasks to prevent any data races
Parents
rG8502220db508: Revert "Bootstrap: Prune building from pre-FreeBSD 11 support"
Branches
Unknown
Tags
Unknown