net/enic: fix multi-process operation
- Use rte_malloc() instead of malloc() for the per device 'vdev' structure so that it can be shared across processes. - Only initialize the device if the process type is RTE_PROC_PRIMARY - Only allow the primary process to do queue setup, start/stop, promisc allmulticast, mac add/del, mtu. Fixes: fefed3d1e62c ("enic: new driver") Cc: stable@dpdk.org Signed-off-by: John Daley <johndale@cisco.com> Reviewed-by: Aaron Conole <aconole@redhat.com>
This commit is contained in:
parent
e8c1642a3c
commit
0e804034dc
@ -25,6 +25,7 @@ L3 checksum offload = Y
|
||||
L4 checksum offload = Y
|
||||
Packet type parsing = Y
|
||||
Basic stats = Y
|
||||
Multiprocess aware = Y
|
||||
BSD nic_uio = Y
|
||||
Linux UIO = Y
|
||||
Linux VFIO = Y
|
||||
|
@ -1063,7 +1063,7 @@ void vnic_dev_unregister(struct vnic_dev *vdev)
|
||||
vdev->free_consistent(vdev->priv,
|
||||
sizeof(struct vnic_devcmd_fw_info),
|
||||
vdev->fw_info, vdev->fw_info_pa);
|
||||
kfree(vdev);
|
||||
rte_free(vdev);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1072,7 +1072,13 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev,
|
||||
unsigned int num_bars)
|
||||
{
|
||||
if (!vdev) {
|
||||
vdev = kzalloc(sizeof(struct vnic_dev), GFP_ATOMIC);
|
||||
char name[NAME_MAX];
|
||||
snprintf((char *)name, sizeof(name), "%s-vnic",
|
||||
pdev->device.name);
|
||||
vdev = (struct vnic_dev *)rte_zmalloc_socket(name,
|
||||
sizeof(struct vnic_dev),
|
||||
RTE_CACHE_LINE_SIZE,
|
||||
pdev->device.numa_node);
|
||||
if (!vdev)
|
||||
return NULL;
|
||||
}
|
||||
|
@ -142,6 +142,10 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
|
||||
static void enicpmd_dev_tx_queue_release(void *txq)
|
||||
{
|
||||
ENICPMD_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
enic_free_wq(txq);
|
||||
}
|
||||
|
||||
@ -196,6 +200,9 @@ static int enicpmd_dev_tx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
int ret;
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
if (queue_idx >= ENIC_WQ_MAX) {
|
||||
dev_err(enic,
|
||||
@ -272,6 +279,10 @@ static int enicpmd_dev_rx_queue_stop(struct rte_eth_dev *eth_dev,
|
||||
static void enicpmd_dev_rx_queue_release(void *rxq)
|
||||
{
|
||||
ENICPMD_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
enic_free_rq(rxq);
|
||||
}
|
||||
|
||||
@ -310,6 +321,10 @@ static int enicpmd_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
/* With Rx scatter support, two RQs are now used on VIC per RQ used
|
||||
* by the application.
|
||||
*/
|
||||
@ -378,6 +393,9 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
|
||||
int ret;
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
ret = enic_set_vnic_res(enic);
|
||||
if (ret) {
|
||||
@ -404,6 +422,9 @@ static int enicpmd_dev_start(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
return enic_enable(enic);
|
||||
}
|
||||
@ -416,6 +437,9 @@ static void enicpmd_dev_stop(struct rte_eth_dev *eth_dev)
|
||||
struct rte_eth_link link;
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic_disable(enic);
|
||||
memset(&link, 0, sizeof(link));
|
||||
@ -513,7 +537,11 @@ static void enicpmd_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
|
||||
enic->promisc = 1;
|
||||
enic_add_packet_filter(enic);
|
||||
}
|
||||
@ -522,6 +550,9 @@ static void enicpmd_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic->promisc = 0;
|
||||
enic_add_packet_filter(enic);
|
||||
@ -531,6 +562,9 @@ static void enicpmd_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic->allmulti = 1;
|
||||
enic_add_packet_filter(enic);
|
||||
@ -540,6 +574,9 @@ static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic->allmulti = 0;
|
||||
enic_add_packet_filter(enic);
|
||||
@ -551,6 +588,9 @@ static int enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
return enic_set_mac_address(enic, mac_addr->addr_bytes);
|
||||
}
|
||||
@ -559,6 +599,9 @@ static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)
|
||||
{
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return;
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
enic_del_mac_address(enic, index);
|
||||
}
|
||||
|
@ -1181,6 +1181,9 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
|
||||
old_mtu = eth_dev->data->mtu;
|
||||
config_mtu = enic->config.mtu;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return -E_RTE_SECONDARY;
|
||||
|
||||
if (new_mtu > enic->max_mtu) {
|
||||
dev_err(enic,
|
||||
"MTU not updated: requested (%u) greater than max (%u)\n",
|
||||
@ -1332,6 +1335,10 @@ int enic_probe(struct enic *enic)
|
||||
|
||||
dev_debug(enic, " Initializing ENIC PMD\n");
|
||||
|
||||
/* if this is a secondary process the hardware is already initialized */
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
enic->bar0.vaddr = (void *)pdev->mem_resource[0].addr;
|
||||
enic->bar0.len = pdev->mem_resource[0].len;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user