On 11/21/2016 3:00 PM, Andrew Rybchenko wrote: > The setup and configuration of the PMD is not performance sensitive, > but is not thread safe either. It is possible that the multiple > read/writes during PMD setup and configuration could be corrupted > in a multi-thread environment.
Right, this is not thread-safe, but this is valid for all PMDs, it is not expected to have initialization in multi-threaded environment, that said so, synchronization also won't hurt, as you said this is not fast path, just may not be necessary. > Since this is not performance > sensitive, the developer can choose to add their own layer to provide > thread-safe setup and configuration. It is expected that, in most > applications, the initial configuration of the network ports would be > done by a single thread at startup. > > Reviewed-by: Andy Moreton <amoreton at solarflare.com> > Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com> <...> > diff --git a/drivers/net/sfc/efx/sfc_ethdev.c > b/drivers/net/sfc/efx/sfc_ethdev.c > index 0deff07..e5b609c 100644 > --- a/drivers/net/sfc/efx/sfc_ethdev.c > +++ b/drivers/net/sfc/efx/sfc_ethdev.c > @@ -31,6 +31,8 @@ > #include <rte_ethdev.h> > #include <rte_pci.h> > > +#include "efx.h" > + > #include "sfc.h" > #include "sfc_debug.h" > #include "sfc_log.h" > @@ -55,6 +57,8 @@ sfc_eth_dev_init(struct rte_eth_dev *dev) > struct sfc_adapter *sa = dev->data->dev_private; > struct rte_pci_device *pci_dev = dev->pci_dev; > int rc; > + const efx_nic_cfg_t *encp; > + const struct ether_addr *from; > > /* Required for logging */ > sa->eth_dev = dev; > @@ -73,11 +77,43 @@ sfc_eth_dev_init(struct rte_eth_dev *dev) > > sfc_log_init(sa, "entry"); > > + dev->data->mac_addrs = rte_zmalloc("sfc", ETHER_ADDR_LEN, 0); > + if (dev->data->mac_addrs == NULL) { > + rc = ENOMEM; > + goto fail_mac_addrs; > + } > + > + sfc_adapter_lock_init(sa); > + sfc_adapter_lock(sa); > + > + sfc_log_init(sa, "attaching"); > + rc = sfc_attach(sa); > + if (rc != 0) > + goto fail_attach; > + > + encp = efx_nic_cfg_get(sa->nic); > + > + /* > + * The arguments are really reverse order in comparison to > + * Linux kernel. Copy from NIC config to Ethernet device data. > + */ Yes it is J, and agreed this is confusing. > + from = (const struct ether_addr *)(encp->enc_mac_addr); > + ether_addr_copy(from, &dev->data->mac_addrs[0]); > + <...>