mirror of
https://github.com/openvswitch/ovs
synced 2025-08-30 22:05:19 +00:00
netdev-dpdk: Fix mempool segfault.
The dpdk_mp_get() function can return a NULL pointer which leads to a segfault when a mempool cannot be created. The lack of a return value check for the function netdev_dpdk_mempool_configure() when called in netdev_dpdk_reconfigure() can result in a segfault also as a NULL pointer for the mempool will be passed to rte_eth_rx_queue_setup(). Fix this by adding appropriate NULL pointer and return value checks to dpdk_mp_get(), netdev_dpdk_reconfigure() and dpdk_vhost_reconfigure_helper(). Signed-off-by: Ian Stokes <ian.stokes@intel.com> Fixes:2ae3d542
("netdev-dpdk: Refactor dpdk_mp_get().") Fixes:0072e931
("netdev-dpdk: add support for jumbo frames") CC: Daniele Di Proietto <diproiettod@vmware.com> CC: Mark Kavanagh <mark.b.kavanagh@intel.com> Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
This commit is contained in:
committed by
Daniele Di Proietto
parent
fc9a5ee104
commit
96e9b168e0
@@ -530,7 +530,9 @@ dpdk_mp_get(int socket_id, int mtu)
|
||||
}
|
||||
|
||||
dmp = dpdk_mp_create(socket_id, mtu);
|
||||
ovs_list_push_back(&dpdk_mp_list, &dmp->list_node);
|
||||
if (dmp) {
|
||||
ovs_list_push_back(&dpdk_mp_list, &dmp->list_node);
|
||||
}
|
||||
|
||||
out:
|
||||
ovs_mutex_unlock(&dpdk_mp_mutex);
|
||||
@@ -3131,7 +3133,10 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
|
||||
|
||||
if (dev->mtu != dev->requested_mtu
|
||||
|| dev->socket_id != dev->requested_socket_id) {
|
||||
netdev_dpdk_mempool_configure(dev);
|
||||
err = netdev_dpdk_mempool_configure(dev);
|
||||
if (err) {
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
netdev->n_txq = dev->requested_n_txq;
|
||||
@@ -3160,6 +3165,7 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
|
||||
{
|
||||
dev->up.n_txq = dev->requested_n_txq;
|
||||
dev->up.n_rxq = dev->requested_n_rxq;
|
||||
int err;
|
||||
|
||||
/* Enable TX queue 0 by default if it wasn't disabled. */
|
||||
if (dev->tx_q[0].map == OVS_VHOST_QUEUE_MAP_UNKNOWN) {
|
||||
@@ -3170,15 +3176,14 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
|
||||
|
||||
if (dev->requested_socket_id != dev->socket_id
|
||||
|| dev->requested_mtu != dev->mtu) {
|
||||
if (!netdev_dpdk_mempool_configure(dev)) {
|
||||
err = netdev_dpdk_mempool_configure(dev);
|
||||
if (err) {
|
||||
return err;
|
||||
} else {
|
||||
netdev_change_seq_changed(&dev->up);
|
||||
}
|
||||
}
|
||||
|
||||
if (!dev->dpdk_mp) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
if (netdev_dpdk_get_vid(dev) >= 0) {
|
||||
dev->vhost_reconfigured = true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user