[RFC PATCH v2] net/bonding: restrict secondary control operations

Stephen Hemminger stephen at networkplumber.org
Mon Aug 24 18:15:19 CEST 2026


On Sun, 23 Aug 2026 10:16:25 -0500
Weijun Pan <wpan3636 at gmail.com> wrote:

> The bonding PMD currently supports secondary attach with safe fallback
> burst functions, but bonding configuration and LACP state are owned by
> the primary process.
> 
> Use a secondary-specific dev_ops table so unsupported operations are
> rejected by ethdev before PMD callbacks can mutate shared device state.
> Also reject bonding-specific control APIs from non-primary processes,
> while keeping secondary detach and query paths available.
> 
> This keeps secondary process behavior safe while leaving room for future
> limited datapath support.
> 
> Bugzilla ID: 1900
> 
> Signed-off-by: Weijun Pan <wpan3636 at gmail.com>
> ---

More indepth AI review with Fable saw some possible issues.

Review: [RFC PATCH v2] net/bonding: restrict secondary control operations

Applies cleanly to main, builds with -Dwerror=true. The secondary
dev_ops table is a good approach; everything left in it is read-only
against shared memory, and bond_ethdev_close() already returns early
for non-primary so dev_close stays safe.

Warning: prog guide describes a secondary datapath that does not exist

  "Secondary process datapath support is limited and bonding mode
  specific ... unless support for the selected mode is explicitly
  documented."

  bond_probe() installs bond_ethdev_rx_secondary() (returns 0) and
  bond_ethdev_tx_secondary() (frees and returns nb_pkts) for every
  mode. There is no mode with datapath support. Say that plainly:

  Rx and Tx are not supported on a bonding device in a secondary
  process; receive returns no packets and transmit drops them.

Warning: LACP query paths return zeroed state in a secondary process

  bond_mode_8023ad_ports[] is a plain global array, populated only in
  the primary. rte_eth_bond_8023ad_member_info(), _ext_collect_get()
  and _ext_distrib_get() validate against shared internals (which
  pass), then read actor/partner state from the secondary's untouched
  copy and return all zeros with rc 0. bond_ethdev_priv_dump(), kept
  in secondary_dev_ops, prints the same zeros through dump_lacp().

  Since the patch's premise is that query paths are safe in a
  secondary, either give these three the same bond_8023ad_check_primary()
  guard (and drop eth_dev_priv_dump from secondary_dev_ops or make
  dump_lacp() skip in secondary), or document that LACP per-member
  state is only visible to the primary.

Warning: rte_eth_bond_api.c: two blank lines after
  bond_api_check_primary(). checkpatch will flag it.

Info: three spellings of the same test

  rte_eth_bond_pmd.c already open-codes rte_eal_process_type() in
  bond_ethdev_mode_set(), bond_ethdev_close(), bond_probe() and
  bond_remove(). This patch adds bond_process_is_primary() plus two
  near-identical logging wrappers with different return values (-1
  and -ENOTSUP). The return values match each file's conventions, so
  not wrong, but one helper in eth_bond_private.h taking the error
  code would remove the duplication.

Info: link_update writes shared state from the secondary

  bond_ethdev_link_update() assigns ethdev->data->dev_link fields
  directly. Keeping it in secondary_dev_ops means a secondary calling
  rte_eth_link_get() races the primary on that shared struct.
  Pre-existing behaviour, but worth a thought given the patch's
  "must not change device state" rule.

----------------------------------------------------------------------
Suggested commit message (the Bugzilla entry has the background;
no need to restate it):

net/bonding: restrict secondary control operations

Bonding configuration and LACP state are owned by the primary
process. Install a reduced dev_ops table in secondary processes so
ethdev rejects control operations, and reject the bonding control
API when called from a non-primary process. Query and detach remain
available.

Bugzilla ID: 1900

----------------------------------------------------------------------
Suggested release note:

* **Restricted bonding device control to the primary process.**

  Secondary processes can query and detach a bonding device but can no
  longer change its configuration.



More information about the dev mailing list