[PATCH 2/2] net/sfc: provide cached dev info to use in secondary process
Stephen Hemminger
stephen at networkplumber.org
Fri Aug 21 21:10:18 CEST 2026
On Thu, 20 Aug 2026 17:03:14 +0400
Ivan Malov <ivan.malov at arknetworks.am> wrote:
> Secondary process support in the 'test-pmd' application now requires that
> the driver expose the 'dev_infos_get' method within that context. Use the
> cached dev info from the primary process in order to meet the requirement.
>
> Signed-off-by: Ivan Malov <ivan.malov at arknetworks.am>
> Reviewed-by: Viacheslav Galaktionov <viacheslav.galaktionov at arknetworks.am>
> ---
This patch has issues.
Patch 2/2: net/sfc: provide cached dev info to use in secondary process
Error: the cached snapshot is missing the defaults that
rte_eth_dev_info_get() fills in before it calls the driver callback,
so the secondary process reports zero for several fields.
rte_eth_dev_info_get() pre-populates the struct and then calls
.dev_infos_get(), so a PMD callback only has to set the fields it
actually knows about. Besides switch_info.domain_id and device
(both handled by this patch) it pre-sets:
rx_desc_lim.nb_seg_max = UINT16_MAX
rx_desc_lim.nb_mtu_seg_max = UINT16_MAX
tx_desc_lim.nb_seg_max = UINT16_MAX
tx_desc_lim.nb_mtu_seg_max = UINT16_MAX
rss_algo_capa = RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT)
max_rx_bufsize = UINT32_MAX
sfc_dev_infos_get() never writes any of these, and neither do the
datapath get_dev_info() helpers (sfc_ef100_rx_get_dev_info() and
sfc_ef100_get_dev_info() only touch nb_min and nb_align). In the
primary process that is fine because the ethdev layer supplied the
values. Here the cache is filled by calling sfc_dev_infos_get()
directly on a zeroed structure, so those fields stay zero, and
sfc_dev_infos_get_secondary() then overwrites the ethdev pre-fill
wholesale with
*dev_info = sfc_adapter_shared_by_eth_dev(dev)->dev_info_cache;
A secondary process therefore sees nb_seg_max = 0,
nb_mtu_seg_max = 0, max_rx_bufsize = 0 and rss_algo_capa = 0, which
differs from what the same call returns in the primary. Applications
that validate multi-segment Tx against tx_desc_lim.nb_seg_max, or
that check the RSS hash algorithm capability mask, will get wrong
answers.
Suggested fix: seed the cache with the same defaults before the
snapshot is taken, e.g.
static const struct rte_eth_desc_lim lim = {
.nb_max = UINT16_MAX,
.nb_min = 0,
.nb_align = 1,
.nb_seg_max = UINT16_MAX,
.nb_mtu_seg_max = UINT16_MAX,
};
sas->dev_info_cache.rx_desc_lim = lim;
sas->dev_info_cache.tx_desc_lim = lim;
sas->dev_info_cache.max_rx_bufsize = UINT32_MAX;
sas->dev_info_cache.rss_algo_capa =
RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT);
sas->dev_info_cache.switch_info.domain_id =
RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
(void)sfc_dev_infos_get(dev, &sas->dev_info_cache);
This duplicates ethdev knowledge in the driver and will drift when
new pre-filled fields are added. An alternative that avoids the
duplication is to have sfc_dev_infos_get_secondary() copy only the
fields the PMD owns, or to keep the caller's pre-filled struct and
merge the cached values into it.
Info: switch_info.name is left pointing at the primary process copy
of dev->device->driver->name. The comment in
sfc_dev_infos_get_secondary() only mentions the device pointer, but
this is the same class of problem; the string lives in the driver
image rather than in per-process heap, so it happens to work under
the usual multi-process assumptions, but it would be more consistent
to re-derive it next to the device pointer:
if (dev_info->switch_info.name != NULL)
dev_info->switch_info.name = dev->device->driver->name;
Info: the cache is a snapshot taken at the end of sfc_eth_dev_init().
Everything sfc_dev_infos_get() reports is fixed at attach time today
(NIC config, rxq_max/txq_max, offload capabilities, MAE status), so
the snapshot is accurate. Worth a note in the sfc.h comment that any
future dev_info field derived from post-attach state must not be
served from this cache.
More information about the dev
mailing list