Message ID | 1415831647-11139-2-git-send-email-huawei.xie@intel.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers |
Return-Path: <dev-bounces@dpdk.org> X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 332E77E9D; Wed, 12 Nov 2014 23:26:30 +0100 (CET) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 3F7807E75 for <dev@dpdk.org>; Wed, 12 Nov 2014 23:26:27 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP; 12 Nov 2014 14:28:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,371,1413270000"; d="scan'208";a="621474230" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 12 Nov 2014 14:34:47 -0800 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id sACMYjtO026648; Thu, 13 Nov 2014 06:34:45 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id sACMYh7o011180; Thu, 13 Nov 2014 06:34:45 +0800 Received: (from hxie5@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id sACMYhYo011176; Thu, 13 Nov 2014 06:34:43 +0800 From: Huawei Xie <huawei.xie@intel.com> To: dev@dpdk.org Date: Thu, 13 Nov 2014 06:34:06 +0800 Message-Id: <1415831647-11139-2-git-send-email-huawei.xie@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1415831647-11139-1-git-send-email-huawei.xie@intel.com> References: <1415831647-11139-1-git-send-email-huawei.xie@intel.com> Subject: [dpdk-dev] [PATCH 1/2] examples/vhost: support new VMDQ API and new nic i40e X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK <dev.dpdk.org> List-Unsubscribe: <http://dpdk.org/ml/options/dev>, <mailto:dev-request@dpdk.org?subject=unsubscribe> List-Archive: <http://dpdk.org/ml/archives/dev/> List-Post: <mailto:dev@dpdk.org> List-Help: <mailto:dev-request@dpdk.org?subject=help> List-Subscribe: <http://dpdk.org/ml/listinfo/dev>, <mailto:dev-request@dpdk.org?subject=subscribe> Errors-To: dev-bounces@dpdk.org Sender: "dev" <dev-bounces@dpdk.org> |
Commit Message
Huawei Xie
Nov. 12, 2014, 10:34 p.m. UTC
In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in DPDK.
In I40E, only configured part of continous queues are allocated to VMDQ.
The rte_eth_dev_info structure is extened to provide VMDQ queue base, queue number, and VMDQ pool base information.
This patch support the new VMDQ API in vhost example.
FIXME in PMD:
* added mac address will be flushed at rte_eth_dev_start.
* we don't support selectively setting up queues well.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
---
examples/vhost/main.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
Comments
> -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Huawei Xie > Sent: Thursday, November 13, 2014 6:34 AM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH 1/2] examples/vhost: support new VMDQ API > and new nic i40e > > In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in DPDK. > In I40E, only configured part of continous queues are allocated to VMDQ. > The rte_eth_dev_info structure is extened to provide VMDQ queue base, > queue number, and VMDQ pool base information. > This patch support the new VMDQ API in vhost example. > > FIXME in PMD: > * added mac address will be flushed at rte_eth_dev_start. > * we don't support selectively setting up queues well. > > Signed-off-by: Huawei Xie <huawei.xie@intel.com> > --- > examples/vhost/main.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c index > a93f7a0..2b1bf02 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -53,7 +53,7 @@ > > #include "main.h" > > -#define MAX_QUEUES 128 > +#define MAX_QUEUES 256 > > /* the maximum number of external ports supported */ #define > MAX_SUP_PORTS 1 @@ -282,6 +282,9 @@ static struct rte_eth_conf > vmdq_conf_default = { static unsigned lcore_ids[RTE_MAX_LCORE]; static > uint8_t ports[RTE_MAX_ETHPORTS]; static unsigned num_ports = 0; /**< > The number of ports specified in command line */ > +static uint16_t num_pf_queues, num_vmdq_queues; static uint16_t > +vmdq_pool_base, vmdq_queue_base; static uint16_t queues_per_pool; > > static const uint16_t external_pkt_default_vlan_tag = 2000; const uint16_t > vlan_tags[] = { @@ -417,7 +420,6 @@ port_init(uint8_t port) > > /*configure the number of supported virtio devices based on VMDQ > limits */ > num_devices = dev_info.max_vmdq_pools; > - num_queues = dev_info.max_rx_queues; > > if (zero_copy) { > rx_ring_size = num_rx_descriptor; > @@ -437,10 +439,19 @@ port_init(uint8_t port) > retval = get_eth_conf(&port_conf, num_devices); > if (retval < 0) > return retval; > + /* NIC queues are divided into pf queues and vmdq queues. */ > + num_pf_queues = dev_info.max_rx_queues - > dev_info.vmdq_queue_num; > + queues_per_pool = dev_info.vmdq_queue_num / > dev_info.max_vmdq_pools; > + num_vmdq_queues = num_devices * queues_per_pool; > + num_queues = num_pf_queues + num_vmdq_queues; > + vmdq_queue_base = dev_info.vmdq_queue_base; > + vmdq_pool_base = dev_info.vmdq_pool_base; > + printf("pf queue num: %u, configured vmdq pool num: %u, each > vmdq pool has %u queues\n", > + num_pf_queues, num_devices, queues_per_pool); > Better to use RTE_LOG to replace printf. > if (port >= rte_eth_dev_count()) return -1; > > - rx_rings = (uint16_t)num_queues, > + rx_rings = (uint16_t)dev_info.max_rx_queues; > /* Configure ethernet device. */ > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); > if (retval != 0) > @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct rte_mbuf > *m) > vdev->vlan_tag); > > /* Register the MAC address. */ > - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > (uint32_t)dev->device_fh); > + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > + (uint32_t)dev->device_fh + > vmdq_pool_base); > if (ret) > RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add > device MAC address to VMDQ\n", > dev->device_fh); > @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) > ll_dev->vdev = vdev; > add_data_ll_entry(&ll_root_used, ll_dev); > vdev->vmdq_rx_q > - = dev->device_fh * (num_queues / num_devices); > + = dev->device_fh * queues_per_pool + vmdq_queue_base; > > if (zero_copy) { > uint32_t index = vdev->vmdq_rx_q; > @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) > unsigned lcore_id, core_id = 0; > unsigned nb_ports, valid_num_ports; > int ret; > - uint8_t portid, queue_id = 0; > + uint8_t portid; > + uint16_t queue_id; If max queue is 256, and queue_id vary from 0 to 255, then uint8_t is enough to denote it. Any other consideration here to change it to uint16_t? > static pthread_t tid; > > /* init EAL */ > -- > 1.8.1.4
> -----Original Message----- > From: Ouyang, Changchun > Sent: Wednesday, November 12, 2014 5:50 PM > To: Xie, Huawei; dev@dpdk.org > Cc: Ouyang, Changchun > Subject: RE: [dpdk-dev] [PATCH 1/2] examples/vhost: support new VMDQ API > and new nic i40e > > > > > -----Original Message----- > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Huawei Xie > > Sent: Thursday, November 13, 2014 6:34 AM > > To: dev@dpdk.org > > Subject: [dpdk-dev] [PATCH 1/2] examples/vhost: support new VMDQ API > > and new nic i40e > > > > In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in DPDK. > > In I40E, only configured part of continous queues are allocated to VMDQ. > > The rte_eth_dev_info structure is extened to provide VMDQ queue base, > > queue number, and VMDQ pool base information. > > This patch support the new VMDQ API in vhost example. > > > > FIXME in PMD: > > * added mac address will be flushed at rte_eth_dev_start. > > * we don't support selectively setting up queues well. > > > > Signed-off-by: Huawei Xie <huawei.xie@intel.com> > > --- > > examples/vhost/main.c | 25 +++++++++++++++++++------ > > 1 file changed, 19 insertions(+), 6 deletions(-) > > > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c index > > a93f7a0..2b1bf02 100644 > > --- a/examples/vhost/main.c > > +++ b/examples/vhost/main.c > > @@ -53,7 +53,7 @@ > > > > #include "main.h" > > > > -#define MAX_QUEUES 128 > > +#define MAX_QUEUES 256 > > > > /* the maximum number of external ports supported */ #define > > MAX_SUP_PORTS 1 @@ -282,6 +282,9 @@ static struct rte_eth_conf > > vmdq_conf_default = { static unsigned lcore_ids[RTE_MAX_LCORE]; static > > uint8_t ports[RTE_MAX_ETHPORTS]; static unsigned num_ports = 0; /**< > > The number of ports specified in command line */ > > +static uint16_t num_pf_queues, num_vmdq_queues; static uint16_t > > +vmdq_pool_base, vmdq_queue_base; static uint16_t queues_per_pool; > > > > static const uint16_t external_pkt_default_vlan_tag = 2000; const uint16_t > > vlan_tags[] = { @@ -417,7 +420,6 @@ port_init(uint8_t port) > > > > /*configure the number of supported virtio devices based on VMDQ > > limits */ > > num_devices = dev_info.max_vmdq_pools; > > - num_queues = dev_info.max_rx_queues; > > > > if (zero_copy) { > > rx_ring_size = num_rx_descriptor; > > @@ -437,10 +439,19 @@ port_init(uint8_t port) > > retval = get_eth_conf(&port_conf, num_devices); > > if (retval < 0) > > return retval; > > + /* NIC queues are divided into pf queues and vmdq queues. */ > > + num_pf_queues = dev_info.max_rx_queues - > > dev_info.vmdq_queue_num; > > + queues_per_pool = dev_info.vmdq_queue_num / > > dev_info.max_vmdq_pools; > > + num_vmdq_queues = num_devices * queues_per_pool; > > + num_queues = num_pf_queues + num_vmdq_queues; > > + vmdq_queue_base = dev_info.vmdq_queue_base; > > + vmdq_pool_base = dev_info.vmdq_pool_base; > > + printf("pf queue num: %u, configured vmdq pool num: %u, each > > vmdq pool has %u queues\n", > > + num_pf_queues, num_devices, queues_per_pool); > > > > Better to use RTE_LOG to replace printf. > > > if (port >= rte_eth_dev_count()) return -1; > > > > - rx_rings = (uint16_t)num_queues, > > + rx_rings = (uint16_t)dev_info.max_rx_queues; > > /* Configure ethernet device. */ > > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); > > if (retval != 0) > > @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct rte_mbuf > > *m) > > vdev->vlan_tag); > > > > /* Register the MAC address. */ > > - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > (uint32_t)dev->device_fh); > > + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > + (uint32_t)dev->device_fh + > > vmdq_pool_base); > > if (ret) > > RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add > > device MAC address to VMDQ\n", > > dev->device_fh); > > @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) > > ll_dev->vdev = vdev; > > add_data_ll_entry(&ll_root_used, ll_dev); > > vdev->vmdq_rx_q > > - = dev->device_fh * (num_queues / num_devices); > > + = dev->device_fh * queues_per_pool + vmdq_queue_base; > > > > if (zero_copy) { > > uint32_t index = vdev->vmdq_rx_q; > > @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) > > unsigned lcore_id, core_id = 0; > > unsigned nb_ports, valid_num_ports; > > int ret; > > - uint8_t portid, queue_id = 0; > > + uint8_t portid; > > + uint16_t queue_id; > > If max queue is 256, and queue_id vary from 0 to 255, then uint8_t is enough to > denote it. > Any other consideration here to change it to uint16_t? queue_id is compared with MAX_QUEUE + 1 which will be always false. check the patch, I couldn't copy the code to here. > > > static pthread_t tid; > > > > /* init EAL */ > > -- > > 1.8.1.4
Hi, > -----Original Message----- > From: Xie, Huawei > Sent: Thursday, November 13, 2014 6:34 AM > To: dev@dpdk.org > Cc: Chen, Jing D; Xie, Huawei > Subject: [PATCH 1/2] examples/vhost: support new VMDQ API and new nic > i40e > > In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in DPDK. > In I40E, only configured part of continous queues are allocated to VMDQ. > The rte_eth_dev_info structure is extened to provide VMDQ queue base, > queue number, and VMDQ pool base information. > This patch support the new VMDQ API in vhost example. > > FIXME in PMD: > * added mac address will be flushed at rte_eth_dev_start. > * we don't support selectively setting up queues well. > > Signed-off-by: Huawei Xie <huawei.xie@intel.com> > --- > examples/vhost/main.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index a93f7a0..2b1bf02 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -53,7 +53,7 @@ > > #include "main.h" > > -#define MAX_QUEUES 128 > +#define MAX_QUEUES 256 > > /* the maximum number of external ports supported */ > #define MAX_SUP_PORTS 1 > @@ -282,6 +282,9 @@ static struct rte_eth_conf vmdq_conf_default = { > static unsigned lcore_ids[RTE_MAX_LCORE]; > static uint8_t ports[RTE_MAX_ETHPORTS]; > static unsigned num_ports = 0; /**< The number of ports specified in > command line */ > +static uint16_t num_pf_queues, num_vmdq_queues; > +static uint16_t vmdq_pool_base, vmdq_queue_base; > +static uint16_t queues_per_pool; > > static const uint16_t external_pkt_default_vlan_tag = 2000; > const uint16_t vlan_tags[] = { > @@ -417,7 +420,6 @@ port_init(uint8_t port) > > /*configure the number of supported virtio devices based on VMDQ > limits */ > num_devices = dev_info.max_vmdq_pools; > - num_queues = dev_info.max_rx_queues; > > if (zero_copy) { > rx_ring_size = num_rx_descriptor; > @@ -437,10 +439,19 @@ port_init(uint8_t port) > retval = get_eth_conf(&port_conf, num_devices); > if (retval < 0) > return retval; > + /* NIC queues are divided into pf queues and vmdq queues. */ > + num_pf_queues = dev_info.max_rx_queues - > dev_info.vmdq_queue_num; > + queues_per_pool = dev_info.vmdq_queue_num / > dev_info.max_vmdq_pools; > + num_vmdq_queues = num_devices * queues_per_pool; > + num_queues = num_pf_queues + num_vmdq_queues; > + vmdq_queue_base = dev_info.vmdq_queue_base; > + vmdq_pool_base = dev_info.vmdq_pool_base; > + printf("pf queue num: %u, configured vmdq pool num: %u, each > vmdq pool has %u queues\n", > + num_pf_queues, num_devices, queues_per_pool); > > if (port >= rte_eth_dev_count()) return -1; > > - rx_rings = (uint16_t)num_queues, > + rx_rings = (uint16_t)dev_info.max_rx_queues; You removed line 'num_queues = dev_info.max_rx_queues' and calculate 'num_queues' with another equation. I assume you thought it may not equals. So, why you assign dev_info.max_rx_queues to rx_rings again? Won't it better to use 'num_queues' > /* Configure ethernet device. */ > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); > if (retval != 0) > @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct rte_mbuf > *m) > vdev->vlan_tag); > > /* Register the MAC address. */ > - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > (uint32_t)dev->device_fh); > + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > + (uint32_t)dev->device_fh + > vmdq_pool_base); > if (ret) > RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add > device MAC address to VMDQ\n", > dev->device_fh); > @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) > ll_dev->vdev = vdev; > add_data_ll_entry(&ll_root_used, ll_dev); > vdev->vmdq_rx_q > - = dev->device_fh * (num_queues / num_devices); > + = dev->device_fh * queues_per_pool + vmdq_queue_base; > > if (zero_copy) { > uint32_t index = vdev->vmdq_rx_q; > @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) > unsigned lcore_id, core_id = 0; > unsigned nb_ports, valid_num_ports; > int ret; > - uint8_t portid, queue_id = 0; > + uint8_t portid; > + uint16_t queue_id; > static pthread_t tid; > > /* init EAL */ > -- > 1.8.1.4
> -----Original Message----- > From: Chen, Jing D > Sent: Wednesday, November 12, 2014 10:58 PM > To: Xie, Huawei; dev@dpdk.org > Subject: RE: [PATCH 1/2] examples/vhost: support new VMDQ API and new nic > i40e > > Hi, > > > -----Original Message----- > > From: Xie, Huawei > > Sent: Thursday, November 13, 2014 6:34 AM > > To: dev@dpdk.org > > Cc: Chen, Jing D; Xie, Huawei > > Subject: [PATCH 1/2] examples/vhost: support new VMDQ API and new nic > > i40e > > > > In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in DPDK. > > In I40E, only configured part of continous queues are allocated to VMDQ. > > The rte_eth_dev_info structure is extened to provide VMDQ queue base, > > queue number, and VMDQ pool base information. > > This patch support the new VMDQ API in vhost example. > > > > FIXME in PMD: > > * added mac address will be flushed at rte_eth_dev_start. > > * we don't support selectively setting up queues well. > > > > Signed-off-by: Huawei Xie <huawei.xie@intel.com> > > --- > > examples/vhost/main.c | 25 +++++++++++++++++++------ > > 1 file changed, 19 insertions(+), 6 deletions(-) > > > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > > index a93f7a0..2b1bf02 100644 > > --- a/examples/vhost/main.c > > +++ b/examples/vhost/main.c > > @@ -53,7 +53,7 @@ > > > > #include "main.h" > > > > -#define MAX_QUEUES 128 > > +#define MAX_QUEUES 256 > > > > /* the maximum number of external ports supported */ > > #define MAX_SUP_PORTS 1 > > @@ -282,6 +282,9 @@ static struct rte_eth_conf vmdq_conf_default = { > > static unsigned lcore_ids[RTE_MAX_LCORE]; > > static uint8_t ports[RTE_MAX_ETHPORTS]; > > static unsigned num_ports = 0; /**< The number of ports specified in > > command line */ > > +static uint16_t num_pf_queues, num_vmdq_queues; > > +static uint16_t vmdq_pool_base, vmdq_queue_base; > > +static uint16_t queues_per_pool; > > > > static const uint16_t external_pkt_default_vlan_tag = 2000; > > const uint16_t vlan_tags[] = { > > @@ -417,7 +420,6 @@ port_init(uint8_t port) > > > > /*configure the number of supported virtio devices based on VMDQ > > limits */ > > num_devices = dev_info.max_vmdq_pools; > > - num_queues = dev_info.max_rx_queues; > > > > if (zero_copy) { > > rx_ring_size = num_rx_descriptor; > > @@ -437,10 +439,19 @@ port_init(uint8_t port) > > retval = get_eth_conf(&port_conf, num_devices); > > if (retval < 0) > > return retval; > > + /* NIC queues are divided into pf queues and vmdq queues. */ > > + num_pf_queues = dev_info.max_rx_queues - > > dev_info.vmdq_queue_num; > > + queues_per_pool = dev_info.vmdq_queue_num / > > dev_info.max_vmdq_pools; > > + num_vmdq_queues = num_devices * queues_per_pool; > > + num_queues = num_pf_queues + num_vmdq_queues; > > + vmdq_queue_base = dev_info.vmdq_queue_base; > > + vmdq_pool_base = dev_info.vmdq_pool_base; > > + printf("pf queue num: %u, configured vmdq pool num: %u, each > > vmdq pool has %u queues\n", > > + num_pf_queues, num_devices, queues_per_pool); > > > > if (port >= rte_eth_dev_count()) return -1; > > > > - rx_rings = (uint16_t)num_queues, > > + rx_rings = (uint16_t)dev_info.max_rx_queues; > > You removed line 'num_queues = dev_info.max_rx_queues' and calculate > 'num_queues' > with another equation. I assume you thought it may not equals. > So, why you assign dev_info.max_rx_queues to rx_rings again? Won't it better to > use 'num_queues' Actually they are the same here. We use max_rx_queues just to say that we initialize all queues rather than part of queues. If all PMDs(1G,10G,i40e) supports selectively initializing queues, then we could only initialize num_device queues rather than total queues, even without initializing PF queues.. > > > /* Configure ethernet device. */ > > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); > > if (retval != 0) > > @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct rte_mbuf > > *m) > > vdev->vlan_tag); > > > > /* Register the MAC address. */ > > - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > (uint32_t)dev->device_fh); > > + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > + (uint32_t)dev->device_fh + > > vmdq_pool_base); > > if (ret) > > RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add > > device MAC address to VMDQ\n", > > dev->device_fh); > > @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) > > ll_dev->vdev = vdev; > > add_data_ll_entry(&ll_root_used, ll_dev); > > vdev->vmdq_rx_q > > - = dev->device_fh * (num_queues / num_devices); > > + = dev->device_fh * queues_per_pool + vmdq_queue_base; > > > > if (zero_copy) { > > uint32_t index = vdev->vmdq_rx_q; > > @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) > > unsigned lcore_id, core_id = 0; > > unsigned nb_ports, valid_num_ports; > > int ret; > > - uint8_t portid, queue_id = 0; > > + uint8_t portid; > > + uint16_t queue_id; > > static pthread_t tid; > > > > /* init EAL */ > > -- > > 1.8.1.4
> -----Original Message----- > From: Xie, Huawei > Sent: Friday, November 14, 2014 2:31 PM > To: Chen, Jing D; dev@dpdk.org > Subject: RE: [PATCH 1/2] examples/vhost: support new VMDQ API and new > nic i40e > > > > > -----Original Message----- > > From: Chen, Jing D > > Sent: Wednesday, November 12, 2014 10:58 PM > > To: Xie, Huawei; dev@dpdk.org > > Subject: RE: [PATCH 1/2] examples/vhost: support new VMDQ API and > new nic > > i40e > > > > Hi, > > > > > -----Original Message----- > > > From: Xie, Huawei > > > Sent: Thursday, November 13, 2014 6:34 AM > > > To: dev@dpdk.org > > > Cc: Chen, Jing D; Xie, Huawei > > > Subject: [PATCH 1/2] examples/vhost: support new VMDQ API and new > nic > > > i40e > > > > > > In Niantic, if VMDQ mode is set, all queues are allocated to VMDQ in > DPDK. > > > In I40E, only configured part of continous queues are allocated to VMDQ. > > > The rte_eth_dev_info structure is extened to provide VMDQ queue base, > > > queue number, and VMDQ pool base information. > > > This patch support the new VMDQ API in vhost example. > > > > > > FIXME in PMD: > > > * added mac address will be flushed at rte_eth_dev_start. > > > * we don't support selectively setting up queues well. > > > > > > Signed-off-by: Huawei Xie <huawei.xie@intel.com> > > > --- > > > examples/vhost/main.c | 25 +++++++++++++++++++------ > > > 1 file changed, 19 insertions(+), 6 deletions(-) > > > > > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > > > index a93f7a0..2b1bf02 100644 > > > --- a/examples/vhost/main.c > > > +++ b/examples/vhost/main.c > > > @@ -53,7 +53,7 @@ > > > > > > #include "main.h" > > > > > > -#define MAX_QUEUES 128 > > > +#define MAX_QUEUES 256 > > > > > > /* the maximum number of external ports supported */ > > > #define MAX_SUP_PORTS 1 > > > @@ -282,6 +282,9 @@ static struct rte_eth_conf vmdq_conf_default = { > > > static unsigned lcore_ids[RTE_MAX_LCORE]; > > > static uint8_t ports[RTE_MAX_ETHPORTS]; > > > static unsigned num_ports = 0; /**< The number of ports specified in > > > command line */ > > > +static uint16_t num_pf_queues, num_vmdq_queues; > > > +static uint16_t vmdq_pool_base, vmdq_queue_base; > > > +static uint16_t queues_per_pool; > > > > > > static const uint16_t external_pkt_default_vlan_tag = 2000; > > > const uint16_t vlan_tags[] = { > > > @@ -417,7 +420,6 @@ port_init(uint8_t port) > > > > > > /*configure the number of supported virtio devices based on VMDQ > > > limits */ > > > num_devices = dev_info.max_vmdq_pools; > > > - num_queues = dev_info.max_rx_queues; > > > > > > if (zero_copy) { > > > rx_ring_size = num_rx_descriptor; > > > @@ -437,10 +439,19 @@ port_init(uint8_t port) > > > retval = get_eth_conf(&port_conf, num_devices); > > > if (retval < 0) > > > return retval; > > > + /* NIC queues are divided into pf queues and vmdq queues. */ > > > + num_pf_queues = dev_info.max_rx_queues - > > > dev_info.vmdq_queue_num; > > > + queues_per_pool = dev_info.vmdq_queue_num / > > > dev_info.max_vmdq_pools; > > > + num_vmdq_queues = num_devices * queues_per_pool; > > > + num_queues = num_pf_queues + num_vmdq_queues; > > > + vmdq_queue_base = dev_info.vmdq_queue_base; > > > + vmdq_pool_base = dev_info.vmdq_pool_base; > > > + printf("pf queue num: %u, configured vmdq pool num: %u, each > > > vmdq pool has %u queues\n", > > > + num_pf_queues, num_devices, queues_per_pool); > > > > > > if (port >= rte_eth_dev_count()) return -1; > > > > > > - rx_rings = (uint16_t)num_queues, > > > + rx_rings = (uint16_t)dev_info.max_rx_queues; > > > > You removed line 'num_queues = dev_info.max_rx_queues' and calculate > > 'num_queues' > > with another equation. I assume you thought it may not equals. > > So, why you assign dev_info.max_rx_queues to rx_rings again? Won't it > better to > > use 'num_queues' > > Actually they are the same here. > We use max_rx_queues just to say that we initialize all queues rather than > part of > queues. > If all PMDs(1G,10G,i40e) supports selectively initializing queues, then we > could only initialize > num_device queues rather than total queues, even without initializing PF > queues.. > > > > > /* Configure ethernet device. */ > > > retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); > > > if (retval != 0) > > > @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct > rte_mbuf > > > *m) > > > vdev->vlan_tag); > > > > > > /* Register the MAC address. */ > > > - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > > (uint32_t)dev->device_fh); > > > + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, > > > + (uint32_t)dev->device_fh + > > > vmdq_pool_base); > > > if (ret) > > > RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add > > > device MAC address to VMDQ\n", > > > dev->device_fh); > > > @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) > > > ll_dev->vdev = vdev; > > > add_data_ll_entry(&ll_root_used, ll_dev); > > > vdev->vmdq_rx_q > > > - = dev->device_fh * (num_queues / num_devices); > > > + = dev->device_fh * queues_per_pool + vmdq_queue_base; > > > > > > if (zero_copy) { > > > uint32_t index = vdev->vmdq_rx_q; > > > @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) > > > unsigned lcore_id, core_id = 0; > > > unsigned nb_ports, valid_num_ports; > > > int ret; > > > - uint8_t portid, queue_id = 0; > > > + uint8_t portid; > > > + uint16_t queue_id; > > > static pthread_t tid; > > > > > > /* init EAL */ > > > -- > > > 1.8.1.4 Acked-by : Jing Chen <jing.d.chen@intel.com>
diff --git a/examples/vhost/main.c b/examples/vhost/main.c index a93f7a0..2b1bf02 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -53,7 +53,7 @@ #include "main.h" -#define MAX_QUEUES 128 +#define MAX_QUEUES 256 /* the maximum number of external ports supported */ #define MAX_SUP_PORTS 1 @@ -282,6 +282,9 @@ static struct rte_eth_conf vmdq_conf_default = { static unsigned lcore_ids[RTE_MAX_LCORE]; static uint8_t ports[RTE_MAX_ETHPORTS]; static unsigned num_ports = 0; /**< The number of ports specified in command line */ +static uint16_t num_pf_queues, num_vmdq_queues; +static uint16_t vmdq_pool_base, vmdq_queue_base; +static uint16_t queues_per_pool; static const uint16_t external_pkt_default_vlan_tag = 2000; const uint16_t vlan_tags[] = { @@ -417,7 +420,6 @@ port_init(uint8_t port) /*configure the number of supported virtio devices based on VMDQ limits */ num_devices = dev_info.max_vmdq_pools; - num_queues = dev_info.max_rx_queues; if (zero_copy) { rx_ring_size = num_rx_descriptor; @@ -437,10 +439,19 @@ port_init(uint8_t port) retval = get_eth_conf(&port_conf, num_devices); if (retval < 0) return retval; + /* NIC queues are divided into pf queues and vmdq queues. */ + num_pf_queues = dev_info.max_rx_queues - dev_info.vmdq_queue_num; + queues_per_pool = dev_info.vmdq_queue_num / dev_info.max_vmdq_pools; + num_vmdq_queues = num_devices * queues_per_pool; + num_queues = num_pf_queues + num_vmdq_queues; + vmdq_queue_base = dev_info.vmdq_queue_base; + vmdq_pool_base = dev_info.vmdq_pool_base; + printf("pf queue num: %u, configured vmdq pool num: %u, each vmdq pool has %u queues\n", + num_pf_queues, num_devices, queues_per_pool); if (port >= rte_eth_dev_count()) return -1; - rx_rings = (uint16_t)num_queues, + rx_rings = (uint16_t)dev_info.max_rx_queues; /* Configure ethernet device. */ retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); if (retval != 0) @@ -931,7 +942,8 @@ link_vmdq(struct vhost_dev *vdev, struct rte_mbuf *m) vdev->vlan_tag); /* Register the MAC address. */ - ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, (uint32_t)dev->device_fh); + ret = rte_eth_dev_mac_addr_add(ports[0], &vdev->mac_address, + (uint32_t)dev->device_fh + vmdq_pool_base); if (ret) RTE_LOG(ERR, VHOST_DATA, "(%"PRIu64") Failed to add device MAC address to VMDQ\n", dev->device_fh); @@ -2602,7 +2614,7 @@ new_device (struct virtio_net *dev) ll_dev->vdev = vdev; add_data_ll_entry(&ll_root_used, ll_dev); vdev->vmdq_rx_q - = dev->device_fh * (num_queues / num_devices); + = dev->device_fh * queues_per_pool + vmdq_queue_base; if (zero_copy) { uint32_t index = vdev->vmdq_rx_q; @@ -2837,7 +2849,8 @@ MAIN(int argc, char *argv[]) unsigned lcore_id, core_id = 0; unsigned nb_ports, valid_num_ports; int ret; - uint8_t portid, queue_id = 0; + uint8_t portid; + uint16_t queue_id; static pthread_t tid; /* init EAL */