Hi,

> -----Original Message-----
> From: Xie, Huawei
> Sent: Thursday, November 13, 2014 6:34 AM
> To: dev at 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 at 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

Reply via email to