nfp: serialize access for hardware reconfiguration
Some apps calling some functions from different threads at the same time could lead to reconfig problems. Reconfig mechanism is based on a hardware queue where incrementing a counter signals the firmware to do the reconfig. If there is a second increment before the first one has been processed the firmware will stop and a device reset is necessary. Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
This commit is contained in:
parent
aace9d0bcf
commit
ceccc5e78b
@ -54,6 +54,7 @@
|
||||
#include <rte_version.h>
|
||||
#include <rte_string_fns.h>
|
||||
#include <rte_alarm.h>
|
||||
#include <rte_spinlock.h>
|
||||
|
||||
#include "nfp_net_pmd.h"
|
||||
#include "nfp_net_logs.h"
|
||||
@ -407,6 +408,8 @@ nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update)
|
||||
PMD_DRV_LOG(DEBUG, "nfp_net_reconfig: ctrl=%08x update=%08x\n",
|
||||
ctrl, update);
|
||||
|
||||
rte_spinlock_lock(&hw->reconfig_lock);
|
||||
|
||||
nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl);
|
||||
nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update);
|
||||
|
||||
@ -414,6 +417,8 @@ nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update)
|
||||
|
||||
err = __nfp_net_reconfig(hw, update);
|
||||
|
||||
rte_spinlock_unlock(&hw->reconfig_lock);
|
||||
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
@ -2399,6 +2404,9 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
|
||||
PMD_INIT_LOG(INFO, "max_rx_queues: %u, max_tx_queues: %u\n",
|
||||
hw->max_rx_queues, hw->max_tx_queues);
|
||||
|
||||
/* Initializing spinlock for reconfigs */
|
||||
rte_spinlock_init(&hw->reconfig_lock);
|
||||
|
||||
/* Allocating memory for mac addr */
|
||||
eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", ETHER_ADDR_LEN, 0);
|
||||
if (eth_dev->data->mac_addrs == NULL) {
|
||||
|
@ -406,6 +406,7 @@ struct nfp_net_hw {
|
||||
int stride_tx;
|
||||
|
||||
uint8_t *qcp_cfg;
|
||||
rte_spinlock_t reconfig_lock;
|
||||
|
||||
uint32_t max_tx_queues;
|
||||
uint32_t max_rx_queues;
|
||||
|
Loading…
x
Reference in New Issue
Block a user