@@ -109,7 +109,7 @@ struct netdev_dpdk_common {
uint16_t port_id;
bool attached;
bool is_representor;
- bool started;
+ atomic_bool started;
struct eth_addr hwaddr;
int mtu;
int socket_id;
@@ -170,4 +170,13 @@ netdev_dpdk_common_cast(const struct netdev *netdev)
return CONTAINER_OF(netdev, struct netdev_dpdk_common, up);
}
+static inline bool
+dpdk_dev_is_started(struct netdev_dpdk_common *common)
+{
+ bool started;
+
+ atomic_read(&common->started, &started);
+ return started;
+}
+
#endif /* NETDEV_DPDK_PRIVATE_H */
@@ -1311,7 +1311,6 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
rte_strerror(-diag));
return -diag;
}
- dev->common.started = true;
netdev_dpdk_configure_xstats(&dev->common);
@@ -1331,6 +1330,9 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
mbp_priv = rte_mempool_get_priv(dev->common.dpdk_mp->mp);
dev->buf_size = mbp_priv->mbuf_data_room_size - RTE_PKTMBUF_HEADROOM;
+
+ atomic_store(&dev->common.started, true);
+
return 0;
}
@@ -1399,7 +1401,7 @@ common_construct(struct netdev *netdev, dpdk_port_t port_no,
dev->vhost_reconfigured = false;
dev->virtio_features_state = OVS_VIRTIO_F_CLEAN;
dev->common.attached = false;
- dev->common.started = false;
+ atomic_init(&dev->common.started, false);
ovsrcu_init(&dev->qos_conf, NULL);
@@ -1610,7 +1612,7 @@ netdev_dpdk_destruct(struct netdev *netdev)
dpdk_rx_steer_unconfigure(dev);
rte_eth_dev_stop(dev->common.port_id);
- dev->common.started = false;
+ atomic_store(&dev->common.started, false);
if (dev->common.attached) {
bool dpdk_resources_still_used = false;
@@ -6113,7 +6115,7 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
&& dev->common.txq_size == dev->common.requested_txq_size
&& eth_addr_equals(dev->common.hwaddr, dev->common.requested_hwaddr)
&& dev->common.socket_id == dev->common.requested_socket_id
- && dev->common.started && !pending_reset) {
+ && dpdk_dev_is_started(&dev->common) && !pending_reset) {
/* Reconfiguration is unnecessary */
goto out;
@@ -6135,7 +6137,7 @@ retry:
rte_eth_dev_stop(dev->common.port_id);
}
- dev->common.started = false;
+ atomic_store(&dev->common.started, false);
err = netdev_dpdk_mempool_configure(dev);
if (err && err != EEXIST) {
The started field is currently 'bool', accessed in netdev-dpdk only under a mutex lock. In netdev-doca it will be used not under a lock. Move it to be atomic as a pre-step towards it. Signed-off-by: Eli Britstein <elibr@nvidia.com> --- lib/netdev-dpdk-private.h | 11 ++++++++++- lib/netdev-dpdk.c | 12 +++++++----- 2 files changed, 17 insertions(+), 6 deletions(-)