[ovs-dev] [PATCH V5 2/2] netdev-dpdk: add jumbo frame support
Daniele Di Proietto
diproiettod at vmware.com
Sun Feb 28 20:33:43 UTC 2016
Hi Mark,
I thought about how to make this dynamically reconfigurable and I've come
up with a series that generalizes the mechanism used for rx/tx queues
reconfiguration:
http://openvswitch.org/pipermail/dev/2016-February/066927.html
I also think that it should be better to introduce 'mtu_request' as a
separate
column in the Interface table, instead of putting it in 'options'. This
way
'mtu_request' won't be netdev specific, but could be used for every netdev
type.
In this scenario vswitch/bridge.c would call netdev_set_mtu() when it
detects a
change in 'mtu_request' and netdev_dpdk_set_mtu() could be implemented
using
netdev_request_reconfigure() from the series that I posted.
What do you think?
Thanks,
Daniele
On 23/02/2016 06:56, "Kavanagh, Mark B" <mark.b.kavanagh at intel.com> wrote:
>>
>>On Fri, 19 Feb 2016 11:25:12 +0000
>>Mark Kavanagh <mark.b.kavanagh at intel.com> wrote:
>>
>>> Add support for Jumbo Frames to DPDK-enabled port types,
>>> using single-segment-mbufs.
>>>
>>> Using this approach, the amount of memory allocated for each mbuf
>>> to store frame data is increased to a value greater than 1518B
>>> (typical Ethernet maximum frame length). The increased space
>>> available in the mbuf means that an entire Jumbo Frame can be carried
>>> in a single mbuf, as opposed to partitioning it across multiple mbuf
>>> segments.
>>>
>>> The amount of space allocated to each mbuf to hold frame data is
>>> defined dynamically by the user when adding a DPDK port to a bridge.
>>> If an MTU value is not supplied, or the user-supplied value is invalid,
>>> the MTU for the port defaults to standard Ethernet MTU (i.e. 1500B).
>>>
>>> Signed-off-by: Mark Kavanagh <mark.b.kavanagh at intel.com>
>>> ---
>>> INSTALL.DPDK.md | 60 ++++++++++++-
>>> NEWS | 3 +-
>>> lib/netdev-dpdk.c | 248
>>>+++++++++++++++++++++++++++++++++++++-----------------
>>> 3 files changed, 233 insertions(+), 78 deletions(-)
>>>
>>> diff --git a/INSTALL.DPDK.md b/INSTALL.DPDK.md
>>> index d892788..4ca98cb 100644
>>> --- a/INSTALL.DPDK.md
>>> +++ b/INSTALL.DPDK.md
>>> @@ -878,10 +878,63 @@ by adding the following string:
>>> to <interface> sections of all network devices used by DPDK.
>>>Parameter 'N'
>>> determines how many queues can be used by the guest.
>>>
>>> +Jumbo Frames
>>> +------------
>>> +
>>> +Support for Jumbo Frames may be enabled at run-time for DPDK-type
>>>ports.
>>> +
>>> +To avail of Jumbo Frame support, add the 'mtu_request' option to the
>>>ovs-vsctl
>>> +'add-port' command-line, along with the required MTU for the port.
>>> +e.g.
>>> +
>>> + ```
>>> + ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
>>options:mtu_request=9000
>>> + ```
>>> +
>>> +When Jumbo Frames are enabled, the size of a DPDK port's mbuf
>>>segments are
>>> +increased, such that a full Jumbo Frame may be accommodated inside a
>>>single
>>> +mbuf segment. Once set, the MTU for a DPDK port is immutable.
>>> +
>>> +Note that from an OVSDB perspective, the `mtu_request` option for a
>>>specific
>>> +port may be disregarded once initially set, as subsequent
>>>modifications to this
>>> +field are disregarded by the DPDK port. As with non-DPDK ports, the
>>>MTU of DPDK
>>> +ports is reported by the `Interface` table's 'mtu' field.
>>> +
>>> +Jumbo frame support has been validated against 13312B frames, using
>>>the
>>> +DPDK `igb_uio` driver, but larger frames and other DPDK NIC drivers
>>>may
>>> +theoretically be supported. Supported port types excludes vHost-Cuse
>>>ports, as
>>> +that feature is pending deprecation.
>>> +
>>> +vHost Ports and Jumbo Frames
>>> +----------------------------
>>> +Jumbo frame support is available for DPDK vHost-User ports only. Some
>>>additional
>>> +configuration is needed to take advantage of this feature:
>>> +
>>> + 1. `mergeable buffers` must be enabled for vHost ports, as
>>>demonstrated in
>>> + the QEMU command line snippet below:
>>> +
>>> + ```
>>> + '-netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \'
>>> + '-device
>>>virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=on'
>>> + ```
>>> +
>>> + 2. Where virtio devices are bound to the Linux kernel driver in a
>>>guest
>>> + environment (i.e. interfaces are not bound to an in-guest DPDK
>>>driver), the
>>> + MTU of those logical network interfaces must also be increased.
>>>This
>>> + avoids segmentation of Jumbo Frames in the guest. Note that
>>>'MTU' refers
>>> + to the length of the IP packet only, and not that of the entire
>>>frame.
>>> +
>>> + e.g. To calculate the exact MTU of a standard IPv4 frame,
>>>subtract the L2
>>> + header and CRC lengths (i.e. 18B) from the max supported frame
>>>size.
>>> + So, to set the MTU for a 13312B Jumbo Frame:
>>> +
>>> + ```
>>> + ifconfig eth1 mtu 13294
>>> + ```
>>> +
>>> Restrictions:
>>> -------------
>>>
>>> - - Work with 1500 MTU, needs few changes in DPDK lib to fix this
>>>issue.
>>> - Currently DPDK port does not make use any offload functionality.
>>> - DPDK-vHost support works with 1G huge pages.
>>>
>>> @@ -922,6 +975,11 @@ Restrictions:
>>> the next release of DPDK (which includes the above patch) is
>>>available and
>>> integrated into OVS.
>>>
>>> + Jumbo Frames:
>>> + - `virtio-pmd`: DPDK apps in the guest do not exit gracefully. This
>>>is a DPDK
>>> + issue that is currently being investigated.
>>> + - vHost-Cuse: Jumbo Frame support is not available for vHost Cuse
>>>ports.
>>> +
>>> Bug Reporting:
>>> --------------
>>>
>>> diff --git a/NEWS b/NEWS
>>> index 3e33871..43127f9 100644
>>> --- a/NEWS
>>> +++ b/NEWS
>>> @@ -10,10 +10,11 @@ Post-v2.5.0
>>> - DPDK:
>>> * New option "n_rxq" for PMD interfaces.
>>> Old 'other_config:n-dpdk-rxqs' is no longer supported.
>>> + * Support Jumbo Frames
>>> +
>>> - ovs-benchmark: This utility has been removed due to lack of use
>>>and
>>> bitrot.
>>>
>>> -
>>> v2.5.0 - xx xxx xxxx
>>> ---------------------
>>> - Dropped support for Python older than version 2.7. As a
>>>consequence,
>>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>>> index 2a06bb5..ac89ee6 100644
>>> --- a/lib/netdev-dpdk.c
>>> +++ b/lib/netdev-dpdk.c
>>> @@ -77,6 +77,8 @@ static struct vlog_rate_limit rl =
>>>VLOG_RATE_LIMIT_INIT(5, 20);
>>> + sizeof(struct dp_packet) \
>>> + RTE_PKTMBUF_HEADROOM)
>>> #define NETDEV_DPDK_MBUF_ALIGN 1024
>>> +#define NETDEV_DPDK_MAX_FRAME_LEN 13312
>>> +#define MTU_NOT_SET 0
>>>
>>> /* Max and min number of packets in the mempool. OVS tries to
>>>allocate a
>>> * mempool with MAX_NB_MBUF: if this fails (because the system
>>>doesn't have
>>> @@ -422,6 +424,7 @@ dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev,
>>>int n_rxq, int n_txq)
>>> {
>>> int diag = 0;
>>> int i;
>>> + struct rte_eth_conf conf = port_conf;
>>>
>>> /* A device may report more queues than it makes available (this
>>>has
>>> * been observed for Intel xl710, which reserves some of them for
>>> @@ -433,7 +436,15 @@ dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev,
>>>int n_rxq, int
>>n_txq)
>>> VLOG_INFO("Retrying setup with (rxq:%d txq:%d)", n_rxq,
>>>n_txq);
>>> }
>>>
>>> - diag = rte_eth_dev_configure(dev->port_id, n_rxq, n_txq,
>>>&port_conf);
>>> + if (dev->mtu > ETHER_MTU) {
>>> + conf.rxmode.jumbo_frame = 1;
>>> + conf.rxmode.max_rx_pkt_len = dev->max_packet_len;
>>> + } else {
>>> + conf.rxmode.jumbo_frame = 0;
>>> + conf.rxmode.max_rx_pkt_len = 0;
>>> + }
>>> +
>>> + diag = rte_eth_dev_configure(dev->port_id, n_rxq, n_txq,
>>>&conf);
>>> if (diag) {
>>> break;
>>> }
>>> @@ -574,8 +585,6 @@ netdev_dpdk_init(struct netdev *netdev_, unsigned
>>>int port_no,
>>> {
>>> struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
>>> int sid;
>>> - int err = 0;
>>> - uint32_t buf_size;
>>>
>>> ovs_mutex_init(&netdev->mutex);
>>> ovs_mutex_lock(&netdev->mutex);
>>> @@ -595,15 +604,7 @@ netdev_dpdk_init(struct netdev *netdev_, unsigned
>>>int port_no,
>>> netdev->port_id = port_no;
>>> netdev->type = type;
>>> netdev->flags = 0;
>>> - netdev->mtu = ETHER_MTU;
>>> - netdev->max_packet_len = MTU_TO_FRAME_LEN(netdev->mtu);
>>> -
>>> - buf_size = dpdk_buf_size(netdev->mtu);
>>> - netdev->dpdk_mp = dpdk_mp_get(netdev->socket_id,
>>>FRAME_LEN_TO_MTU(buf_size));
>>> - if (!netdev->dpdk_mp) {
>>> - err = ENOMEM;
>>> - goto unlock;
>>> - }
>>> + netdev->mtu = MTU_NOT_SET;
>>>
>>> netdev_->n_txq = NR_QUEUE;
>>> netdev_->n_rxq = NR_QUEUE;
>>> @@ -612,20 +613,12 @@ netdev_dpdk_init(struct netdev *netdev_,
>>>unsigned int port_no,
>>>
>>> if (type == DPDK_DEV_ETH) {
>>> netdev_dpdk_alloc_txq(netdev, NR_QUEUE);
>>> - err = dpdk_eth_dev_init(netdev);
>>> - if (err) {
>>> - goto unlock;
>>> - }
>>> }
>>>
>>> list_push_back(&dpdk_list, &netdev->list_node);
>>>
>>> -unlock:
>>> - if (err) {
>>> - rte_free(netdev->tx_q);
>>> - }
>>> ovs_mutex_unlock(&netdev->mutex);
>>> - return err;
>>> + return 0;
>>> }
>>>
>>> static int
>>> @@ -643,6 +636,31 @@ dpdk_dev_parse_name(const char dev_name[], const
>>>char prefix[],
>>> return 0;
>>> }
>>>
>>> +static void
>>> +dpdk_dev_parse_mtu(const struct smap *args, int *mtu)
>>> +{
>>> + const char *mtu_str = smap_get(args, "mtu_request");
>>> + char *end_ptr = NULL;
>>> + int local_mtu;
>>> +
>>> + if (!mtu_str) {
>>> + local_mtu = ETHER_MTU;
>>> + } else {
>>> + local_mtu = strtoul(mtu_str, &end_ptr, 0);
>>> + if (local_mtu < ETHER_MTU ||
>>> + local_mtu > FRAME_LEN_TO_MTU(NETDEV_DPDK_MAX_FRAME_LEN) ||
>>> + *end_ptr != '\0') {
>>> + local_mtu = ETHER_MTU;
>>> + VLOG_WARN("Invalid mtu_request parameter - defaulting to
>>>%d.\n",
>>> + local_mtu);
>>> + } else {
>>> + VLOG_INFO("mtu_request parameter %d detected.\n",
>>>local_mtu);
>>
>>That message could be VLOG_DBG because it only tells about a parameter
>>being
>>detected and not if the mtu request succeed. Other than that the patch
>>looks
>>good to me.
>
>Great!
>
>>
>>If no one else has comments to address, maybe a commiter can fix the
>>message
>>level to avoid re-spinning the patchset.
>
>Daniele - are you happy with this, or would you prefer that I spin a new
>version?
>
>>
>>Thanks for the patch!
>
>Thanks for the feedback! :)
>
>>
>>Acked-by: Flavio Leitner <fbl at sysclose.org>
>>
>>--
>>fbl
>>
>>
>>
>>> + }
>>> + }
>>> +
>>> + *mtu = local_mtu;
>>> +}
>>> +
>>> static int
>>> vhost_construct_helper(struct netdev *netdev_)
>>>OVS_REQUIRES(dpdk_mutex)
>>> {
>>> @@ -773,15 +791,72 @@ netdev_dpdk_get_config(const struct netdev
>>>*netdev, struct smap
>>*args)
>>> smap_add_format(args, "configured_rx_queues", "%d",
>>>netdev->n_rxq);
>>> smap_add_format(args, "requested_tx_queues", "%d", netdev->n_txq);
>>> smap_add_format(args, "configured_tx_queues", "%d",
>>>dev->real_n_txq);
>>> + smap_add_format(args, "mtu", "%d", dev->mtu);
>>> ovs_mutex_unlock(&dev->mutex);
>>>
>>> return 0;
>>> }
>>>
>>> +/* Set the mtu of DPDK_DEV_ETH ports */
>>> +static int
>>> +netdev_dpdk_set_mtu(const struct netdev *netdev, int mtu)
>>> +{
>>> + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>>> + int err, dpdk_mtu;
>>> + uint32_t buf_size;
>>> + struct dpdk_mp *mp;
>>> +
>>> + ovs_mutex_lock(&dpdk_mutex);
>>> + ovs_mutex_lock(&dev->mutex);
>>> + if (dev->mtu == mtu) {
>>> + err = 0;
>>> + goto out;
>>> + }
>>> +
>>> + buf_size = dpdk_buf_size(mtu);
>>> + dpdk_mtu = FRAME_LEN_TO_MTU(buf_size);
>>> +
>>> + mp = dpdk_mp_get(dev->socket_id, dpdk_mtu);
>>> + if (!mp) {
>>> + err = ENOMEM;
>>> + goto out;
>>> + }
>>> +
>>> + rte_eth_dev_stop(dev->port_id);
>>> +
>>> + dev->dpdk_mp = mp;
>>> + dev->mtu = mtu;
>>> + dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
>>> +
>>> + err = dpdk_eth_dev_init(dev);
>>> + if (err) {
>>> + VLOG_WARN("Unable to set MTU '%d' for '%s'; falling back to
>>>default "
>>> + "MTU '%d'\n", mtu, dev->up.name, ETHER_MTU);
>>> + dpdk_mp_put(mp);
>>> + dev->mtu = ETHER_MTU;
>>> + mp = dpdk_mp_get(dev->socket_id, dev->mtu);
>>> + if (!mp) {
>>> + err = ENOMEM;
>>> + goto out;
>>> + }
>>> + dev->dpdk_mp = mp;
>>> + dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
>>> + dpdk_eth_dev_init(dev);
>>> + goto out;
>>> + } else {
>>> + netdev_change_seq_changed(netdev);
>>> + }
>>> +out:
>>> + ovs_mutex_unlock(&dev->mutex);
>>> + ovs_mutex_unlock(&dpdk_mutex);
>>> + return err;
>>> +}
>>> +
>>> static int
>>> netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args)
>>> {
>>> struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>>> + int mtu;
>>>
>>> ovs_mutex_lock(&dev->mutex);
>>> netdev->requested_n_rxq = MAX(smap_get_int(args, "n_rxq",
>>> @@ -789,6 +864,14 @@ netdev_dpdk_set_config(struct netdev *netdev,
>>>const struct smap *args)
>>> netdev_change_seq_changed(netdev);
>>> ovs_mutex_unlock(&dev->mutex);
>>>
>>> + dpdk_dev_parse_mtu(args, &mtu);
>>> +
>>> + if (!dev->mtu) {
>>> + return netdev_dpdk_set_mtu(netdev, mtu);
>>> + } else if (mtu != dev->mtu) {
>>> + VLOG_WARN("Unable to set MTU %d for port %d; this port has
>>>immutable MTU "
>>> + "%d\n", mtu, dev->port_id, dev->mtu);
>>> + }
>>> return 0;
>>> }
>>>
>>> @@ -1407,57 +1490,6 @@ netdev_dpdk_get_mtu(const struct netdev
>>>*netdev, int *mtup)
>>> }
>>>
>>> static int
>>> -netdev_dpdk_set_mtu(const struct netdev *netdev, int mtu)
>>> -{
>>> - struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>>> - int old_mtu, err, dpdk_mtu;
>>> - struct dpdk_mp *old_mp;
>>> - struct dpdk_mp *mp;
>>> - uint32_t buf_size;
>>> -
>>> - ovs_mutex_lock(&dpdk_mutex);
>>> - ovs_mutex_lock(&dev->mutex);
>>> - if (dev->mtu == mtu) {
>>> - err = 0;
>>> - goto out;
>>> - }
>>> -
>>> - buf_size = dpdk_buf_size(mtu);
>>> - dpdk_mtu = FRAME_LEN_TO_MTU(buf_size);
>>> -
>>> - mp = dpdk_mp_get(dev->socket_id, dpdk_mtu);
>>> - if (!mp) {
>>> - err = ENOMEM;
>>> - goto out;
>>> - }
>>> -
>>> - rte_eth_dev_stop(dev->port_id);
>>> -
>>> - old_mtu = dev->mtu;
>>> - old_mp = dev->dpdk_mp;
>>> - dev->dpdk_mp = mp;
>>> - dev->mtu = mtu;
>>> - dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
>>> -
>>> - err = dpdk_eth_dev_init(dev);
>>> - if (err) {
>>> - dpdk_mp_put(mp);
>>> - dev->mtu = old_mtu;
>>> - dev->dpdk_mp = old_mp;
>>> - dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
>>> - dpdk_eth_dev_init(dev);
>>> - goto out;
>>> - }
>>> -
>>> - dpdk_mp_put(old_mp);
>>> - netdev_change_seq_changed(netdev);
>>> -out:
>>> - ovs_mutex_unlock(&dev->mutex);
>>> - ovs_mutex_unlock(&dpdk_mutex);
>>> - return err;
>>> -}
>>> -
>>> -static int
>>> netdev_dpdk_get_carrier(const struct netdev *netdev_, bool *carrier);
>>>
>>> static int
>>> @@ -2000,6 +2032,61 @@ dpdk_vhost_user_class_init(void)
>>> return 0;
>>> }
>>>
>>> +/* Set the mtu of DPDK_DEV_VHOST ports */
>>> +static int
>>> +netdev_dpdk_vhost_set_mtu(const struct netdev *netdev, int mtu)
>>> +{
>>> + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>>> + int err = 0;
>>> + struct dpdk_mp *mp;
>>> +
>>> + ovs_mutex_lock(&dpdk_mutex);
>>> + ovs_mutex_lock(&dev->mutex);
>>> + if (dev->mtu == mtu) {
>>> + err = 0;
>>> + goto out;
>>> + }
>>> +
>>> + mp = dpdk_mp_get(dev->socket_id, mtu);
>>> + if (!mp) {
>>> + err = ENOMEM;
>>> + goto out;
>>> + }
>>> +
>>> + dev->dpdk_mp = mp;
>>> + dev->mtu = mtu;
>>> + dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
>>> +
>>> + netdev_change_seq_changed(netdev);
>>> +out:
>>> + ovs_mutex_unlock(&dev->mutex);
>>> + ovs_mutex_unlock(&dpdk_mutex);
>>> + return err;
>>> +}
>>> +
>>> +static int
>>> +netdev_dpdk_vhost_set_config(struct netdev *netdev, const struct smap
>>>*args)
>>> +{
>>> + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
>>> + int mtu;
>>> +
>>> + ovs_mutex_lock(&dev->mutex);
>>> + netdev->requested_n_rxq = MAX(smap_get_int(args, "n_rxq",
>>> +
>>>netdev->requested_n_rxq), 1);
>>> + netdev_change_seq_changed(netdev);
>>> + ovs_mutex_unlock(&dev->mutex);
>>> +
>>> + dpdk_dev_parse_mtu(args, &mtu);
>>> +
>>> + if (!dev->mtu) {
>>> + return netdev_dpdk_vhost_set_mtu(netdev, mtu);
>>> + } else if (mtu != dev->mtu) {
>>> + VLOG_WARN("Unable to set MTU %d for vhost port; this port has
>>>immutable MTU "
>>> + "%d\n", mtu, dev->mtu);
>>> + }
>>> + return 0;
>>> +}
>>> +
>>> static void
>>> dpdk_common_init(void)
>>> {
>>> @@ -2136,8 +2223,9 @@ unlock_dpdk:
>>> return err;
>>> }
>>>
>>> -#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT, MULTIQ,
>>>SEND, \
>>> - GET_CARRIER, GET_STATS, GET_FEATURES, GET_STATUS, RXQ_RECV)
>>> \
>>> +#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT,
>>>SET_CONFIG, \
>>> + MULTIQ, SEND, SET_MTU, GET_CARRIER, GET_STATS, GET_FEATURES,
>>> \
>>> + GET_STATUS, RXQ_RECV)
>>> \
>>> { \
>>> NAME, \
>>> INIT, /* init */ \
>>> @@ -2149,7 +2237,7 @@ unlock_dpdk:
>>> DESTRUCT, \
>>> netdev_dpdk_dealloc, \
>>> netdev_dpdk_get_config, \
>>> - netdev_dpdk_set_config, \
>>> + SET_CONFIG , \
>>> NULL, /* get_tunnel_config */ \
>>> NULL, /* build header */ \
>>> NULL, /* push header */ \
>>> @@ -2163,7 +2251,7 @@ unlock_dpdk:
>>> netdev_dpdk_set_etheraddr, \
>>> netdev_dpdk_get_etheraddr, \
>>> netdev_dpdk_get_mtu, \
>>> - netdev_dpdk_set_mtu, \
>>> + SET_MTU, \
>>> netdev_dpdk_get_ifindex, \
>>> GET_CARRIER, \
>>> netdev_dpdk_get_carrier_resets, \
>>> @@ -2309,8 +2397,10 @@ static const struct netdev_class dpdk_class =
>>> NULL,
>>> netdev_dpdk_construct,
>>> netdev_dpdk_destruct,
>>> + netdev_dpdk_set_config,
>>> netdev_dpdk_set_multiq,
>>> netdev_dpdk_eth_send,
>>> + netdev_dpdk_set_mtu,
>>> netdev_dpdk_get_carrier,
>>> netdev_dpdk_get_stats,
>>> netdev_dpdk_get_features,
>>> @@ -2323,8 +2413,10 @@ static const struct netdev_class
>>>dpdk_ring_class =
>>> NULL,
>>> netdev_dpdk_ring_construct,
>>> netdev_dpdk_destruct,
>>> + netdev_dpdk_set_config,
>>> netdev_dpdk_set_multiq,
>>> netdev_dpdk_ring_send,
>>> + netdev_dpdk_set_mtu,
>>> netdev_dpdk_get_carrier,
>>> netdev_dpdk_get_stats,
>>> netdev_dpdk_get_features,
>>> @@ -2337,8 +2429,10 @@ static const struct netdev_class OVS_UNUSED
>>>dpdk_vhost_cuse_class =
>>> dpdk_vhost_cuse_class_init,
>>> netdev_dpdk_vhost_cuse_construct,
>>> netdev_dpdk_vhost_destruct,
>>> + netdev_dpdk_set_config,
>>> netdev_dpdk_vhost_cuse_set_multiq,
>>> netdev_dpdk_vhost_send,
>>> + NULL,
>>> netdev_dpdk_vhost_get_carrier,
>>> netdev_dpdk_vhost_get_stats,
>>> NULL,
>>> @@ -2351,8 +2445,10 @@ static const struct netdev_class OVS_UNUSED
>>>dpdk_vhost_user_class =
>>> dpdk_vhost_user_class_init,
>>> netdev_dpdk_vhost_user_construct,
>>> netdev_dpdk_vhost_destruct,
>>> + netdev_dpdk_vhost_set_config,
>>> netdev_dpdk_vhost_set_multiq,
>>> netdev_dpdk_vhost_send,
>>> + netdev_dpdk_vhost_set_mtu,
>>> netdev_dpdk_vhost_get_carrier,
>>> netdev_dpdk_vhost_get_stats,
>>> NULL,
>
More information about the dev
mailing list