net/netvsc: fix memory free on device close
The netvsc PMD was putting the mac address in private data but the
core rte_ethdev doesn't allow that it. It has to be in rte_malloc'd
memory or a message will be printed on shutdown/close.
EAL: Invalid memory
Fixes: f8279f47dd
("net/netvsc: fix crash in secondary process")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
cc02518132
commit
30408aab2d
@ -134,8 +134,6 @@ eth_dev_vmbus_allocate(struct rte_vmbus_device *dev, size_t private_data_size)
|
||||
static void
|
||||
eth_dev_vmbus_release(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
/* mac_addrs must not be freed alone because part of dev_private */
|
||||
eth_dev->data->mac_addrs = NULL;
|
||||
/* free ether device */
|
||||
rte_eth_dev_release_port(eth_dev);
|
||||
|
||||
@ -937,9 +935,6 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
|
||||
eth_dev->tx_pkt_burst = &hn_xmit_pkts;
|
||||
eth_dev->rx_pkt_burst = &hn_recv_pkts;
|
||||
|
||||
/* Since Hyper-V only supports one MAC address, just use local data */
|
||||
eth_dev->data->mac_addrs = &hv->mac_addr;
|
||||
|
||||
/*
|
||||
* for secondary processes, we don't initialize any further as primary
|
||||
* has already done this work.
|
||||
@ -947,6 +942,15 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
/* Since Hyper-V only supports one MAC address */
|
||||
eth_dev->data->mac_addrs = rte_calloc("hv_mac", HN_MAX_MAC_ADDRS,
|
||||
sizeof(struct rte_ether_addr), 0);
|
||||
if (eth_dev->data->mac_addrs == NULL) {
|
||||
PMD_INIT_LOG(ERR,
|
||||
"Failed to allocate memory store MAC addresses");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hv->vmbus = vmbus;
|
||||
hv->rxbuf_res = &vmbus->resource[HV_RECV_BUF_MAP];
|
||||
hv->chim_res = &vmbus->resource[HV_SEND_BUF_MAP];
|
||||
@ -989,7 +993,7 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
|
||||
if (err)
|
||||
goto failed;
|
||||
|
||||
err = hn_rndis_get_eaddr(hv, hv->mac_addr.addr_bytes);
|
||||
err = hn_rndis_get_eaddr(hv, eth_dev->data->mac_addrs->addr_bytes);
|
||||
if (err)
|
||||
goto failed;
|
||||
|
||||
|
@ -139,8 +139,6 @@ struct hn_data {
|
||||
uint8_t rss_key[40];
|
||||
uint16_t rss_ind[128];
|
||||
|
||||
struct rte_ether_addr mac_addr;
|
||||
|
||||
struct rte_eth_dev_owner owner;
|
||||
struct rte_intr_handle vf_intr;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user