[v3] net/kni: calc mbuf&mtu according to given mb_pool
Checks
Commit Message
From: Liron Himi <lironh@marvell.com>
- mbuf_size and mtu are now being calculated according
to the given mb-pool.
- max_mtu is now being set according to the given mtu
the above two changes provide the ability to work with jumbo frames
Signed-off-by: Liron Himi <lironh@marvell.com>
---
doc/guides/nics/kni.rst | 3 ++-
doc/guides/prog_guide/kernel_nic_interface.rst | 1 +
doc/guides/rel_notes/release_19_05.rst | 9 +++++++++
drivers/net/kni/rte_eth_kni.c | 10 +++++++---
examples/kni/main.c | 3 ++-
kernel/linux/kni/compat.h | 4 ++++
kernel/linux/kni/kni_misc.c | 3 +++
7 files changed, 28 insertions(+), 5 deletions(-)
Comments
<lironh@marvell.com>:
> From: Liron Himi <lironh@marvell.com>
>
> - mbuf_size and mtu are now being calculated according
> to the given mb-pool.
>
> - max_mtu is now being set according to the given mtu
>
> the above two changes provide the ability to work with jumbo frames
>
> Signed-off-by: Liron Himi <lironh@marvell.com>
Minors:
without it-> Without it
th given-> the given
if the bm-pool -> if the mb-pool
>
> +* **Updated KNI kernel module, KNI PMD driver.**
> +
> + Updated the KNI kernel module to set the max_mtu according to the given
> + initial mtu size. without it, the maximum mtu was 1500.
> +
> + Updated the KNI PMD driver to set the mbuf_size and mtu based on
> + th given mb-pool. This provide the ability to pass jumbo frames
> + if the bm-pool contains suitable buffers' size.
> +
>
Reviewd-by: Rami Rosen <ramirose@gmail.com>
Fixed. thanks
From: Rami Rosen <ramirose@gmail.com>
Sent: Saturday, March 23, 2019 23:49
To: Liron Himi <lironh@marvell.com>
Cc: ferruh.yigit@intel.com; dev@dpdk.org; Alan Winkowski <walan@marvell.com>
Subject: [EXT] Re: [dpdk-dev] [PATCH v3] net/kni: calc mbuf&mtu according to given mb_pool
External Email
@@ -55,7 +55,8 @@ configuration:
Interface name: kni#
force bind kernel thread to a core : NO
- mbuf size: MAX_PACKET_SZ
+ mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
+ mtu: (conf.mbuf_size - ETHER_HDR_LEN)
KNI control path is not supported with the PMD, since there is no physical
backend device by default.
@@ -187,6 +187,7 @@ The ``struct rte_kni_conf`` structure contains fields which allow the
user to specify the interface name, set the MTU size, set an explicit or
random MAC address and control the affinity of the kernel Rx thread(s)
(both single and multi-threaded modes).
+By default the mtu is derived from the mbuf buffer length.
The ``struct rte_kni_ops`` structure contains pointers to functions to
handle requests from the ``rte_kni`` kernel module. These functions
@@ -91,6 +91,15 @@ New Features
* Added promiscuous mode support.
+* **Updated KNI kernel module, KNI PMD driver.**
+
+ Updated the KNI kernel module to set the max_mtu according to the given
+ initial mtu size. without it, the maximum mtu was 1500.
+
+ Updated the KNI PMD driver to set the mbuf_size and mtu based on
+ th given mb-pool. This provide the ability to pass jumbo frames
+ if the bm-pool contains suitable buffers' size.
+
Removed Items
-------------
@@ -16,9 +16,11 @@
/* Only single queue supported */
#define KNI_MAX_QUEUE_PER_PORT 1
-#define MAX_PACKET_SZ 2048
#define MAX_KNI_PORTS 8
+#define KNI_ETHER_MTU(mbuf_size) \
+ ((mbuf_size) - ETHER_HDR_LEN) /**< Ethernet MTU. */
+
#define ETH_KNI_NO_REQUEST_THREAD_ARG "no_request_thread"
static const char * const valid_arguments[] = {
ETH_KNI_NO_REQUEST_THREAD_ARG,
@@ -123,11 +125,13 @@ eth_kni_start(struct rte_eth_dev *dev)
struct rte_kni_conf conf;
const char *name = dev->device->name + 4; /* remove net_ */
+ mb_pool = internals->rx_queues[0].mb_pool;
snprintf(conf.name, RTE_KNI_NAMESIZE, "%s", name);
conf.force_bind = 0;
conf.group_id = port_id;
- conf.mbuf_size = MAX_PACKET_SZ;
- mb_pool = internals->rx_queues[0].mb_pool;
+ conf.mbuf_size =
+ rte_pktmbuf_data_room_size(mb_pool) - RTE_PKTMBUF_HEADROOM;
+ conf.mtu = KNI_ETHER_MTU(conf.mbuf_size);
internals->kni = rte_kni_alloc(mb_pool, &conf, NULL);
if (internals->kni == NULL) {
@@ -888,7 +888,8 @@ kni_alloc(uint16_t port_id)
snprintf(conf.name, RTE_KNI_NAMESIZE,
"vEth%u", port_id);
conf.group_id = port_id;
- conf.mbuf_size = MAX_PACKET_SZ;
+ conf.mbuf_size = rte_pktmbuf_data_room_size(pktmbuf_pool) -
+ RTE_PKTMBUF_HEADROOM;
/*
* The first KNI device associated to a port
* is the master, for multiple kernel thread
@@ -117,3 +117,7 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+#define HAVE_MAX_MTU_PARAM
+#endif
@@ -459,6 +459,9 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num,
if (dev_info.mtu)
net_dev->mtu = dev_info.mtu;
+#ifdef HAVE_MAX_MTU_PARAM
+ net_dev->max_mtu = net_dev->mtu;
+#endif
ret = register_netdev(net_dev);
if (ret) {