* [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API
@ 2014-11-10 0:29 Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 1/2] " Huawei Xie
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Huawei Xie @ 2014-11-10 0:29 UTC (permalink / raw)
To: dev
This patch supports new VMDQ API in vmdq example.
v2 changes:
* code rebase
* allow app to specify num_pools different with max_nb_pools
* fix serious cs issues
Huawei Xie (2):
support new VMDQ API in vmdq example
fix cs issues in vmdq example
examples/vmdq/main.c | 233 ++++++++++++++++++++++++++++++---------------------
1 file changed, 139 insertions(+), 94 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2 1/2] examples/vmdq: support new VMDQ API
2014-11-10 0:29 [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Huawei Xie
@ 2014-11-10 0:29 ` Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 2/2] examples/vmdq: fix cs issues in vmdq example Huawei Xie
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Huawei Xie @ 2014-11-10 0:29 UTC (permalink / raw)
To: dev
This patch supports new VMDQ API in vmdq example.
Besides, it allows users to specify num_pools different with
max_nb_poos, thus the polling thread needn't to poll queues
of all pools.
Due to i40e implmentation issue, there is no default mac for
VMDQ pool, so app needs to specify mac address for each pool
explicitly.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
---
examples/vmdq/main.c | 169 +++++++++++++++++++++++++++++++--------------------
1 file changed, 103 insertions(+), 66 deletions(-)
diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c
index c51e2fb..5a2305f 100644
--- a/examples/vmdq/main.c
+++ b/examples/vmdq/main.c
@@ -144,6 +144,13 @@ const uint16_t vlan_tags[] = {
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63,
};
+const uint16_t num_vlans = RTE_DIM(vlan_tags);
+static uint16_t num_pf_queues, num_vmdq_queues;
+static uint16_t vmdq_pool_base, vmdq_queue_base;
+/* pool mac addr template, pool mac addr is like: 52 54 00 12 port# pool# */
+static struct ether_addr pool_addr_template = {
+ .addr_bytes = {0x52, 0x54, 0x00, 0x12, 0x00, 0x00}
+};
/* ethernet addresses of ports */
static struct ether_addr vmdq_ports_eth_addr[RTE_MAX_ETHPORTS];
@@ -163,22 +170,9 @@ get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_pools)
unsigned i;
conf.nb_queue_pools = (enum rte_eth_nb_pools)num_pools;
+ conf.nb_pool_maps = num_pools;
conf.enable_default_pool = 0;
conf.default_pool = 0; /* set explicit value, even if not used */
- switch (num_pools) {
- /* For 10G NIC like 82599, 128 is valid for queue number */
- case MAX_POOL_NUM_10G:
- num_queues = MAX_QUEUE_NUM_10G;
- conf.nb_pool_maps = MAX_POOL_MAP_NUM_10G;
- break;
- /* For 1G NIC like i350, 82580 and 82576, 8 is valid for queue number */
- case MAX_POOL_NUM_1G:
- num_queues = MAX_QUEUE_NUM_1G;
- conf.nb_pool_maps = MAX_POOL_MAP_NUM_1G;
- break;
- default:
- return -1;
- }
for (i = 0; i < conf.nb_pool_maps; i++){
conf.pool_map[i].vlan_id = vlan_tags[ i ];
@@ -192,40 +186,6 @@ get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_pools)
}
/*
- * Validate the pool number accrording to the max pool number gotten form dev_info
- * If the pool number is invalid, give the error message and return -1
- */
-static inline int
-validate_num_pools(uint32_t max_nb_pools)
-{
- if (num_pools > max_nb_pools) {
- printf("invalid number of pools\n");
- return -1;
- }
-
- switch (max_nb_pools) {
- /* For 10G NIC like 82599, 64 is valid for pool number */
- case MAX_POOL_NUM_10G:
- if (num_pools != MAX_POOL_NUM_10G) {
- printf("invalid number of pools\n");
- return -1;
- }
- break;
- /* For 1G NIC like i350, 82580 and 82576, 8 is valid for pool number */
- case MAX_POOL_NUM_1G:
- if (num_pools != MAX_POOL_NUM_1G) {
- printf("invalid number of pools\n");
- return -1;
- }
- break;
- default:
- return -1;
- }
-
- return 0;
-}
-
-/*
* Initialises a given port using global settings and with the rx buffers
* coming from the mbuf_pool passed as parameter
*/
@@ -235,26 +195,57 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
struct rte_eth_dev_info dev_info;
struct rte_eth_rxconf *rxconf;
struct rte_eth_conf port_conf;
- uint16_t rxRings, txRings = (uint16_t)rte_lcore_count();
+ uint16_t rxRings, txRings;
const uint16_t rxRingSize = RTE_TEST_RX_DESC_DEFAULT, txRingSize = RTE_TEST_TX_DESC_DEFAULT;
int retval;
uint16_t q;
+ uint16_t queues_per_pool;
uint32_t max_nb_pools;
/* The max pool number from dev_info will be used to validate the pool number specified in cmd line */
rte_eth_dev_info_get (port, &dev_info);
max_nb_pools = (uint32_t)dev_info.max_vmdq_pools;
- retval = validate_num_pools(max_nb_pools);
- if (retval < 0)
- return retval;
-
- retval = get_eth_conf(&port_conf, num_pools);
+ /*
+ * We allow to process part of VMDQ pools specified by num_pools in
+ * command line.
+ */
+ if (num_pools > max_nb_pools) {
+ printf("num_pools %d >max_nb_pools %d\n",
+ num_pools, max_nb_pools);
+ return -1;
+ }
+ retval = get_eth_conf(&port_conf, max_nb_pools);
if (retval < 0)
return retval;
+ /*
+ * NIC queues are divided into pf queues and vmdq queues.
+ */
+ /* There is assumption here all ports have the same configuration! */
+ 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_pools * 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_pools, queues_per_pool);
+ printf("vmdq queue base: %d pool base %d\n",
+ vmdq_queue_base, vmdq_pool_base);
if (port >= rte_eth_dev_count()) return -1;
- rxRings = (uint16_t)num_queues,
+ /*
+ * Though in this example, we only receive packets from the first queue
+ * of each pool and send packets through first rte_lcore_count() tx
+ * queues of vmdq queues, all queues including pf queues are setup.
+ * This is because VMDQ queues doesn't always start from zero, and the
+ * PMD layer doesn't support selectively initialising part of rx/tx
+ * queues.
+ */
+ rxRings = (uint16_t)dev_info.max_rx_queues;
+ txRings = (uint16_t)dev_info.max_tx_queues;
retval = rte_eth_dev_configure(port, rxRings, txRings, &port_conf);
if (retval != 0)
return retval;
@@ -267,21 +258,27 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
rte_eth_dev_socket_id(port),
rxconf,
mbuf_pool);
- if (retval < 0)
+ if (retval < 0) {
+ printf("initialise rx queue %d failed\n", q);
return retval;
+ }
}
for (q = 0; q < txRings; q ++) {
retval = rte_eth_tx_queue_setup(port, q, txRingSize,
rte_eth_dev_socket_id(port),
NULL);
- if (retval < 0)
+ if (retval < 0) {
+ printf("initialise tx queue %d failed\n", q);
return retval;
+ }
}
retval = rte_eth_dev_start(port);
- if (retval < 0)
+ if (retval < 0) {
+ printf("port %d start failed\n", port);
return retval;
+ }
rte_eth_macaddr_get(port, &vmdq_ports_eth_addr[port]);
printf("Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8
@@ -294,6 +291,29 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
vmdq_ports_eth_addr[port].addr_bytes[4],
vmdq_ports_eth_addr[port].addr_bytes[5]);
+ /*
+ * Set mac for each pool.
+ * There is no default mac for the pools in i40.
+ * Removes this after i40e fixes this issue.
+ */
+ for (q = 0; q < num_pools; q++) {
+ struct ether_addr mac;
+ mac = pool_addr_template;
+ mac.addr_bytes[4] = port;
+ mac.addr_bytes[5] = q;
+ printf("Port %u vmdq pool %u set mac %02x:%02x:%02x:%02x:%02x:%02x\n",
+ port, q,
+ mac.addr_bytes[0], mac.addr_bytes[1],
+ mac.addr_bytes[2], mac.addr_bytes[3],
+ mac.addr_bytes[4], mac.addr_bytes[5]);
+ retval = rte_eth_dev_mac_addr_add(port, &mac,
+ q + vmdq_pool_base);
+ if (retval) {
+ printf("mac addr add failed at pool %d\n", q);
+ return retval;
+ }
+ }
+
return 0;
}
@@ -309,6 +329,11 @@ vmdq_parse_num_pools(const char *q_arg)
if ((q_arg[0] == '\0') || (end == NULL) || (*end != '\0'))
return -1;
+ if (num_pools > num_vlans) {
+ printf("num_pools %d > num_vlans %d\n", num_pools, num_vlans);
+ return -1;
+ }
+
num_pools = n;
return 0;
@@ -437,7 +462,7 @@ lcore_main(__attribute__((__unused__)) void* dummy)
uint16_t core_id = 0;
uint16_t startQueue, endQueue;
uint16_t q, i, p;
- const uint16_t remainder = (uint16_t)(num_queues % num_cores);
+ const uint16_t remainder = (uint16_t)(num_vmdq_queues % num_cores);
for (i = 0; i < num_cores; i ++)
if (lcore_ids[i] == lcore_id) {
@@ -447,17 +472,27 @@ lcore_main(__attribute__((__unused__)) void* dummy)
if (remainder != 0) {
if (core_id < remainder) {
- startQueue = (uint16_t)(core_id * (num_queues/num_cores + 1));
- endQueue = (uint16_t)(startQueue + (num_queues/num_cores) + 1);
+ startQueue = (uint16_t)(core_id *
+ (num_vmdq_queues / num_cores + 1));
+ endQueue = (uint16_t)(startQueue +
+ (num_vmdq_queues / num_cores) + 1);
} else {
- startQueue = (uint16_t)(core_id * (num_queues/num_cores) + remainder);
- endQueue = (uint16_t)(startQueue + (num_queues/num_cores));
+ startQueue = (uint16_t)(core_id *
+ (num_vmdq_queues / num_cores) +
+ remainder);
+ endQueue = (uint16_t)(startQueue +
+ (num_vmdq_queues / num_cores));
}
} else {
- startQueue = (uint16_t)(core_id * (num_queues/num_cores));
- endQueue = (uint16_t)(startQueue + (num_queues/num_cores));
+ startQueue = (uint16_t)(core_id *
+ (num_vmdq_queues / num_cores));
+ endQueue = (uint16_t)(startQueue +
+ (num_vmdq_queues / num_cores));
}
+ /* vmdq queue idx doesn't always start from zero.*/
+ startQueue += vmdq_queue_base;
+ endQueue += vmdq_queue_base;
printf("core %u(lcore %u) reading queues %i-%i\n", (unsigned)core_id,
(unsigned)lcore_id, startQueue, endQueue - 1);
@@ -490,7 +525,9 @@ lcore_main(__attribute__((__unused__)) void* dummy)
update_mac_address(buf[i], dport);
const uint16_t txCount = rte_eth_tx_burst(dport,
- core_id, buf, rxCount);
+ vmdq_queue_base + core_id,
+ buf,
+ rxCount);
if (txCount != rxCount) {
for (i = txCount; i < rxCount; i++)
--
1.8.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v2 2/2] examples/vmdq: fix cs issues in vmdq example
2014-11-10 0:29 [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 1/2] " Huawei Xie
@ 2014-11-10 0:29 ` Huawei Xie
2014-11-10 3:41 ` [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Chen, Jing D
2014-12-11 6:01 ` Cao, Min
3 siblings, 0 replies; 6+ messages in thread
From: Huawei Xie @ 2014-11-10 0:29 UTC (permalink / raw)
To: dev
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
---
examples/vmdq/main.c | 64 +++++++++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 28 deletions(-)
diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c
index 5a2305f..e60b671 100644
--- a/examples/vmdq/main.c
+++ b/examples/vmdq/main.c
@@ -92,7 +92,7 @@
#define INVALID_PORT_ID 0xFF
/* mask of enabled ports */
-static uint32_t enabled_port_mask = 0;
+static uint32_t enabled_port_mask;
/* number of pools (if user does not specify any, 8 by default */
static uint32_t num_queues = 8;
@@ -129,10 +129,10 @@ static const 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 unsigned num_ports; /**< The number of ports specified in command line */
/* array used for printing out statistics */
-volatile unsigned long rxPackets[ MAX_QUEUES ] = {0};
+volatile unsigned long rxPackets[MAX_QUEUES] = {0};
const uint16_t vlan_tags[] = {
0, 1, 2, 3, 4, 5, 6, 7,
@@ -161,8 +161,11 @@ static struct ether_addr vmdq_ports_eth_addr[RTE_MAX_ETHPORTS];
#define MAX_POOL_MAP_NUM_1G 32
#define MAX_POOL_NUM_10G 64
#define MAX_POOL_NUM_1G 8
-/* Builds up the correct configuration for vmdq based on the vlan tags array
- * given above, and determine the queue number and pool map number according to valid pool number */
+/*
+ * Builds up the correct configuration for vmdq based on the vlan tags array
+ * given above, and determine the queue number and pool map number according to
+ * valid pool number
+ */
static inline int
get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_pools)
{
@@ -174,8 +177,8 @@ get_eth_conf(struct rte_eth_conf *eth_conf, uint32_t num_pools)
conf.enable_default_pool = 0;
conf.default_pool = 0; /* set explicit value, even if not used */
- for (i = 0; i < conf.nb_pool_maps; i++){
- conf.pool_map[i].vlan_id = vlan_tags[ i ];
+ for (i = 0; i < conf.nb_pool_maps; i++) {
+ conf.pool_map[i].vlan_id = vlan_tags[i];
conf.pool_map[i].pools = (1UL << (i % num_pools));
}
@@ -202,8 +205,11 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
uint16_t queues_per_pool;
uint32_t max_nb_pools;
- /* The max pool number from dev_info will be used to validate the pool number specified in cmd line */
- rte_eth_dev_info_get (port, &dev_info);
+ /*
+ * The max pool number from dev_info will be used to validate the pool
+ * number specified in cmd line
+ */
+ rte_eth_dev_info_get(port, &dev_info);
max_nb_pools = (uint32_t)dev_info.max_vmdq_pools;
/*
* We allow to process part of VMDQ pools specified by num_pools in
@@ -234,7 +240,8 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
num_pf_queues, num_pools, queues_per_pool);
printf("vmdq queue base: %d pool base %d\n",
vmdq_queue_base, vmdq_pool_base);
- if (port >= rte_eth_dev_count()) return -1;
+ if (port >= rte_eth_dev_count())
+ return -1;
/*
* Though in this example, we only receive packets from the first queue
@@ -253,7 +260,7 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
rte_eth_dev_info_get(port, &dev_info);
rxconf = &dev_info.default_rxconf;
rxconf->rx_drop_en = 1;
- for (q = 0; q < rxRings; q ++) {
+ for (q = 0; q < rxRings; q++) {
retval = rte_eth_rx_queue_setup(port, q, rxRingSize,
rte_eth_dev_socket_id(port),
rxconf,
@@ -264,7 +271,7 @@ port_init(uint8_t port, struct rte_mempool *mbuf_pool)
}
}
- for (q = 0; q < txRings; q ++) {
+ for (q = 0; q < txRings; q++) {
retval = rte_eth_tx_queue_setup(port, q, txRingSize,
rte_eth_dev_socket_id(port),
NULL);
@@ -380,7 +387,8 @@ vmdq_parse_args(int argc, char **argv)
};
/* Parse command line */
- while ((opt = getopt_long(argc, argv, "p:",long_option,&option_index)) != EOF) {
+ while ((opt = getopt_long(argc, argv, "p:", long_option,
+ &option_index)) != EOF) {
switch (opt) {
/* portmask */
case 'p':
@@ -392,7 +400,7 @@ vmdq_parse_args(int argc, char **argv)
}
break;
case 0:
- if (vmdq_parse_num_pools(optarg) == -1){
+ if (vmdq_parse_num_pools(optarg) == -1) {
printf("invalid number of pools\n");
vmdq_usage(prgname);
return -1;
@@ -405,14 +413,14 @@ vmdq_parse_args(int argc, char **argv)
}
}
- for(i = 0; i < RTE_MAX_ETHPORTS; i++) {
+ for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
if (enabled_port_mask & (1 << i))
ports[num_ports++] = (uint8_t)i;
}
if (num_ports < 2 || num_ports % 2) {
printf("Current enabled port number is %u,"
- "but it should be even and at least 2\n",num_ports);
+ "but it should be even and at least 2\n", num_ports);
return -1;
}
@@ -441,10 +449,10 @@ static void
sighup_handler(int signum)
{
unsigned q;
- for (q = 0; q < num_queues; q ++) {
+ for (q = 0; q < num_queues; q++) {
if (q % (num_queues/num_pools) == 0)
printf("\nPool %u: ", q/(num_queues/num_pools));
- printf("%lu ", rxPackets[ q ]);
+ printf("%lu ", rxPackets[q]);
}
printf("\nFinished handling signal %d\n", signum);
}
@@ -455,7 +463,7 @@ sighup_handler(int signum)
* and writing to OUTPUT_PORT
*/
static int
-lcore_main(__attribute__((__unused__)) void* dummy)
+lcore_main(__attribute__((__unused__)) void *dummy)
{
const uint16_t lcore_id = (uint16_t)rte_lcore_id();
const uint16_t num_cores = (uint16_t)rte_lcore_count();
@@ -464,7 +472,7 @@ lcore_main(__attribute__((__unused__)) void* dummy)
uint16_t q, i, p;
const uint16_t remainder = (uint16_t)(num_vmdq_queues % num_cores);
- for (i = 0; i < num_cores; i ++)
+ for (i = 0; i < num_cores; i++)
if (lcore_ids[i] == lcore_id) {
core_id = i;
break;
@@ -498,7 +506,7 @@ lcore_main(__attribute__((__unused__)) void* dummy)
if (startQueue == endQueue) {
printf("lcore %u has nothing to do\n", lcore_id);
- return (0);
+ return 0;
}
for (;;) {
@@ -507,8 +515,8 @@ lcore_main(__attribute__((__unused__)) void* dummy)
for (p = 0; p < num_ports; p++) {
const uint8_t sport = ports[p];
- const uint8_t dport = ports[p ^ 1]; /* 0 <-> 1, 2 <-> 3 etc */
-
+ /* 0 <-> 1, 2 <-> 3 etc */
+ const uint8_t dport = ports[p ^ 1];
if ((sport == INVALID_PORT_ID) || (dport == INVALID_PORT_ID))
continue;
@@ -553,12 +561,12 @@ static unsigned check_ports_num(unsigned nb_ports)
num_ports = nb_ports;
}
- for (portid = 0; portid < num_ports; portid ++) {
+ for (portid = 0; portid < num_ports; portid++) {
if (ports[portid] >= nb_ports) {
printf("\nSpecified port ID(%u) exceeds max system port ID(%u)\n",
ports[portid], (nb_ports - 1));
ports[portid] = INVALID_PORT_ID;
- valid_num_ports --;
+ valid_num_ports--;
}
}
return valid_num_ports;
@@ -590,12 +598,12 @@ MAIN(int argc, char *argv[])
if (ret < 0)
rte_exit(EXIT_FAILURE, "Invalid VMDQ argument\n");
- for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
+ for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++)
if (rte_lcore_is_enabled(lcore_id))
- lcore_ids[core_id ++] = lcore_id;
+ lcore_ids[core_id++] = lcore_id;
if (rte_lcore_count() > RTE_MAX_LCORE)
- rte_exit(EXIT_FAILURE,"Not enough cores\n");
+ rte_exit(EXIT_FAILURE, "Not enough cores\n");
nb_ports = rte_eth_dev_count();
if (nb_ports > RTE_MAX_ETHPORTS)
--
1.8.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API
2014-11-10 0:29 [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 1/2] " Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 2/2] examples/vmdq: fix cs issues in vmdq example Huawei Xie
@ 2014-11-10 3:41 ` Chen, Jing D
2014-11-11 22:49 ` Thomas Monjalon
2014-12-11 6:01 ` Cao, Min
3 siblings, 1 reply; 6+ messages in thread
From: Chen, Jing D @ 2014-11-10 3:41 UTC (permalink / raw)
To: Xie, Huawei, dev
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Huawei Xie
> Sent: Monday, November 10, 2014 8:30 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ
> API
>
> This patch supports new VMDQ API in vmdq example.
>
> v2 changes:
> * code rebase
> * allow app to specify num_pools different with max_nb_pools
> * fix serious cs issues
>
>
> Huawei Xie (2):
> support new VMDQ API in vmdq example
> fix cs issues in vmdq example
>
> examples/vmdq/main.c | 233 ++++++++++++++++++++++++++++++--------
> -------------
> 1 file changed, 139 insertions(+), 94 deletions(-)
>
> --
> 1.8.1.4
Acked-by : Jing Chen <jing.d.chen@intel.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API
2014-11-10 3:41 ` [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Chen, Jing D
@ 2014-11-11 22:49 ` Thomas Monjalon
0 siblings, 0 replies; 6+ messages in thread
From: Thomas Monjalon @ 2014-11-11 22:49 UTC (permalink / raw)
To: Xie, Huawei; +Cc: dev
> > This patch supports new VMDQ API in vmdq example.
> >
> > v2 changes:
> > * code rebase
> > * allow app to specify num_pools different with max_nb_pools
> > * fix serious cs issues
> >
> > Huawei Xie (2):
> > support new VMDQ API in vmdq example
> > fix cs issues in vmdq example
>
> Acked-by : Jing Chen <jing.d.chen@intel.com>
Applied
Thanks
--
Thomas
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API
2014-11-10 0:29 [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Huawei Xie
` (2 preceding siblings ...)
2014-11-10 3:41 ` [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Chen, Jing D
@ 2014-12-11 6:01 ` Cao, Min
3 siblings, 0 replies; 6+ messages in thread
From: Cao, Min @ 2014-12-11 6:01 UTC (permalink / raw)
To: dev
Tested-by: Min Cao <min.cao@intel.com>
Patch name: examples/vmdq: support new VMDQ API
Brief description:
Test Flag: Tested-by
Tester name: min.cao@intel.com
Result summary: total 1 cases, 1 passed, 0 failed
Test Case 1:
Name: perf_vmdq_performance
Environment: OS: Fedora20 3.11.10-301.fc20.x86_64
gcc (GCC) 4.8.2
CPU: Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
NIC: Fortville eagle
Test result: PASSED
-----Original Message-----
From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Huawei Xie
Sent: Monday, November 10, 2014 8:30 AM
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API
This patch supports new VMDQ API in vmdq example.
v2 changes:
* code rebase
* allow app to specify num_pools different with max_nb_pools
* fix serious cs issues
Huawei Xie (2):
support new VMDQ API in vmdq example
fix cs issues in vmdq example
examples/vmdq/main.c | 233 ++++++++++++++++++++++++++++++---------------------
1 file changed, 139 insertions(+), 94 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-12-11 6:02 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-10 0:29 [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 1/2] " Huawei Xie
2014-11-10 0:29 ` [dpdk-dev] [PATCH v2 2/2] examples/vmdq: fix cs issues in vmdq example Huawei Xie
2014-11-10 3:41 ` [dpdk-dev] [PATCH v2 0/2] examples/vmdq: support new VMDQ API Chen, Jing D
2014-11-11 22:49 ` Thomas Monjalon
2014-12-11 6:01 ` Cao, Min
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).