MTU change is currently only allowed when device is stopped. Current code in master branch already sets MTU in shared data correctly when starting the device:
static int vmxnet3_setup_driver_shared(struct rte_eth_dev *dev) { struct rte_eth_conf port_conf = dev->data->dev_conf; struct vmxnet3_hw *hw = dev->data->dev_private; uint32_t mtu = dev->data->mtu; ... devRead->misc.mtu = rte_le_to_cpu_32(mtu); ... } However current code in master branch does not implement a mtu_set() function so MTU in the dev->data is never changed from default of 1500: int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu) { int ret; struct rte_eth_dev_info dev_info; struct rte_eth_dev *dev; RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); dev = &rte_eth_devices[port_id]; RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mtu_set, -ENOTSUP); /* * Check if the device supports dev_infos_get, if it does not * skip min_mtu/max_mtu validation here as this requires values * that are populated within the call to rte_eth_dev_info_get() * which relies on dev->dev_ops->dev_infos_get. */ if (*dev->dev_ops->dev_infos_get != NULL) { rte_eth_dev_info_get(port_id, &dev_info); if (mtu < dev_info.min_mtu || mtu > dev_info.max_mtu) return -EINVAL; } ret = (*dev->dev_ops->mtu_set)(dev, mtu); if (!ret) dev->data->mtu = mtu; return eth_err(port_id, ret); } The vmxnet3 driver just needs to implement mtu_set() so that rte_eth_dev_set_mtu() allows changing the MTU and puts the value in dev->data->mtu . -----Original Message----- From: Stephen Hemminger <step...@networkplumber.org> Sent: Tuesday, August 20, 2019 6:43 PM To: Myers, Charles <charles.my...@spirent.com> Cc: Yong Wang <yongw...@vmware.com>; dev@dpdk.org Subject: Re: [PATCH v3] net/vmxnet3: Added mtu_set() function to allow setting MTU. On Wed, 21 Aug 2019 02:16:58 +0000 "Myers, Charles" <charles.my...@spirent.com> wrote: > > static int > +vmxnet3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { > + if (dev->data->dev_started) { > + PMD_DRV_LOG(ERR, "Port %d must be stopped to configure MTU", > + dev->data->port_id); > + return -EBUSY; > + } > + > + return 0; > +} > + Don't you need to reset the rx ring to change mtu on the fly? At a minimum you need to communicate this value to host through the shared driver page.