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.

Reply via email to