From: Ruifeng Wang <ruifeng.wang@arm.com>
To: tomasz.kantecki@intel.com
Cc: dev@dpdk.org, gavin.hu@arm.com, honnappa.nagarahalli@arm.com,
nd@arm.com, Ruifeng Wang <ruifeng.wang@arm.com>
Subject: [dpdk-dev] [PATCH 1/2] examples/l3fwd: add lock-free option for l3fwd
Date: Fri, 6 Sep 2019 18:26:14 +0800 [thread overview]
Message-ID: <20190906102615.36942-2-ruifeng.wang@arm.com> (raw)
In-Reply-To: <20190906102615.36942-1-ruifeng.wang@arm.com>
The new option is provided for lock-free read / write concurrency.
For EM mode, lock-free APIs will be used when this option is enabled.
Signed-off-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Gavin Hu <gavin.hu@arm.com>
---
doc/guides/sample_app_ug/l3_forward.rst | 3 +++
examples/l3fwd/l3fwd.h | 4 ++--
examples/l3fwd/l3fwd_em.c | 10 +++++++++-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 24 +++++++++++++++++++++---
5 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/doc/guides/sample_app_ug/l3_forward.rst b/doc/guides/sample_app_ug/l3_forward.rst
index 4cb4b18da..a40beeeb0 100644
--- a/doc/guides/sample_app_ug/l3_forward.rst
+++ b/doc/guides/sample_app_ug/l3_forward.rst
@@ -56,6 +56,7 @@ The application has a number of command line options::
[--ipv6]
[--parse-ptype]
[--per-port-pool]
+ [--lock-free]
Where,
@@ -86,6 +87,8 @@ Where,
* ``--per-port-pool:`` Optional, set to use independent buffer pools per port. Without this option, single buffer pool is used for all ports.
+* ``--lock-free:`` Optional, set to enable lock-free table read-write concurrency.
+
For example, consider a dual processor socket platform with 8 physical cores, where cores 0-7 and 16-23 appear on socket 0,
while cores 8-15 and 24-31 appear on socket 1.
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 293fb1fa2..eaf71d429 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -171,10 +171,10 @@ is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len)
/* Function pointers for LPM or EM functionality. */
void
-setup_lpm(const int socketid);
+setup_lpm(const int socketid, const unsigned int flags);
void
-setup_hash(const int socketid);
+setup_hash(const int socketid, const unsigned int flags);
int
em_check_ptype(int portid);
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 74a7c8fa4..7263ede04 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -703,7 +703,7 @@ em_main_loop(__attribute__((unused)) void *dummy)
* Initialize exact match (hash) parameters.
*/
void
-setup_hash(const int socketid)
+setup_hash(const int socketid, const unsigned int flags)
{
struct rte_hash_parameters ipv4_l3fwd_hash_params = {
.name = NULL,
@@ -727,6 +727,10 @@ setup_hash(const int socketid)
snprintf(s, sizeof(s), "ipv4_l3fwd_hash_%d", socketid);
ipv4_l3fwd_hash_params.name = s;
ipv4_l3fwd_hash_params.socket_id = socketid;
+ /* enable lock free hash algorithm for ipv4 forward*/
+ if (flags & RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF)
+ ipv4_l3fwd_hash_params.extra_flag |=
+ RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF;
ipv4_l3fwd_em_lookup_struct[socketid] =
rte_hash_create(&ipv4_l3fwd_hash_params);
if (ipv4_l3fwd_em_lookup_struct[socketid] == NULL)
@@ -738,6 +742,10 @@ setup_hash(const int socketid)
snprintf(s, sizeof(s), "ipv6_l3fwd_hash_%d", socketid);
ipv6_l3fwd_hash_params.name = s;
ipv6_l3fwd_hash_params.socket_id = socketid;
+ /* enable lock free hash algorithm for ipv6 forward*/
+ if (flags & RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF)
+ ipv6_l3fwd_hash_params.extra_flag |=
+ RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF;
ipv6_l3fwd_em_lookup_struct[socketid] =
rte_hash_create(&ipv6_l3fwd_hash_params);
if (ipv6_l3fwd_em_lookup_struct[socketid] == NULL)
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index 4143683cb..1435a5711 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -255,7 +255,7 @@ lpm_main_loop(__attribute__((unused)) void *dummy)
}
void
-setup_lpm(const int socketid)
+setup_lpm(const int socketid, __rte_unused const unsigned int flags)
{
struct rte_lpm6_config config;
struct rte_lpm_config config_ipv4;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 3800bad19..1b435e9eb 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -41,6 +41,7 @@
#include <rte_udp.h>
#include <rte_string_fns.h>
#include <rte_cpuflags.h>
+#include <rte_hash.h>
#include <cmdline_parse.h>
#include <cmdline_parse_etheraddr.h>
@@ -76,6 +77,10 @@ static int parse_ptype; /**< Parse packet type using rx callback, and */
/**< disabled by default */
static int per_port_pool; /**< Use separate buffer pools per port; disabled */
/**< by default */
+static int rw_lf; /**< Enable lock-free read-write concurrency, */
+ /**< disabled by default */
+
+/* Global variables. */
volatile bool force_quit;
@@ -139,7 +144,7 @@ static struct rte_mempool *pktmbuf_pool[RTE_MAX_ETHPORTS][NB_SOCKETS];
static uint8_t lkp_per_socket[NB_SOCKETS];
struct l3fwd_lkp_mode {
- void (*setup)(int);
+ void (*setup)(int, unsigned int);
int (*check_ptype)(int);
rte_rx_callback_fn cb_parse_ptype;
int (*main_loop)(void *);
@@ -290,6 +295,7 @@ print_usage(const char *prgname)
" [--ipv6]"
" [--parse-ptype]"
" [--per-port-pool]\n\n"
+ " [--lock-free]\n\n"
" -p PORTMASK: Hexadecimal bitmask of ports to configure\n"
" -P : Enable promiscuous mode\n"
@@ -304,7 +310,8 @@ print_usage(const char *prgname)
" --hash-entry-num: Specify the hash entry number in hexadecimal to be setup\n"
" --ipv6: Set if running ipv6 packets\n"
" --parse-ptype: Set to use software to analyze packet type\n"
- " --per-port-pool: Use separate buffer pool per port\n\n",
+ " --per-port-pool: Use separate buffer pool per port\n\n"
+ " --lock-free: Set to enable lock-free table read-write concurrency\n\n",
prgname);
}
@@ -458,6 +465,8 @@ static const char short_options[] =
#define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
#define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
#define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
+#define CMD_LINE_OPT_LOCK_FREE "lock-free"
+
enum {
/* long options mapped to a short option */
@@ -472,6 +481,7 @@ enum {
CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
CMD_LINE_OPT_PARSE_PTYPE_NUM,
CMD_LINE_OPT_PARSE_PER_PORT_POOL,
+ CMD_LINE_OPT_LOCK_FREE_NUM,
};
static const struct option lgopts[] = {
@@ -483,6 +493,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
{CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL},
+ {CMD_LINE_OPT_LOCK_FREE, 0, 0, CMD_LINE_OPT_LOCK_FREE_NUM},
{NULL, 0, 0, 0}
};
@@ -607,6 +618,10 @@ parse_args(int argc, char **argv)
per_port_pool = 1;
break;
+ case CMD_LINE_OPT_LOCK_FREE_NUM:
+ rw_lf = 1;
+ break;
+
default:
print_usage(prgname);
return -1;
@@ -661,6 +676,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
int socketid;
unsigned lcore_id;
char s[64];
+ unsigned int flags = 0;
for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
if (rte_lcore_is_enabled(lcore_id) == 0)
@@ -695,8 +711,10 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
/* Setup either LPM or EM(f.e Hash). But, only once per
* available socket.
*/
+ if (rw_lf)
+ flags |= RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF;
if (!lkp_per_socket[socketid]) {
- l3fwd_lkp.setup(socketid);
+ l3fwd_lkp.setup(socketid, flags);
lkp_per_socket[socketid] = 1;
}
}
--
2.17.1
next prev parent reply other threads:[~2019-09-06 10:26 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-06 10:26 [dpdk-dev] [PATCH 0/2] add lock-free mode " Ruifeng Wang
2019-09-06 10:26 ` Ruifeng Wang [this message]
2019-09-06 10:26 ` [dpdk-dev] [PATCH 2/2] examples/l3fwd: integrate RCU QSBR for LPM mode Ruifeng Wang
2019-09-06 10:35 ` [dpdk-dev] [PATCH 0/2] add lock-free mode for l3fwd Ananyev, Konstantin
2019-09-09 1:52 ` Ruifeng Wang (Arm Technology China)
2019-09-09 22:45 ` Honnappa Nagarahalli
2019-09-10 6:25 ` Ruifeng Wang (Arm Technology China)
2019-09-11 5:32 ` Honnappa Nagarahalli
2019-09-11 6:18 ` Ruifeng Wang (Arm Technology China)
2019-09-10 9:06 ` Ananyev, Konstantin
2019-09-10 9:56 ` Ruifeng Wang (Arm Technology China)
2019-09-11 5:38 ` Honnappa Nagarahalli
2019-09-11 6:58 ` Ruifeng Wang (Arm Technology China)
2019-09-11 8:35 ` Ananyev, Konstantin
2019-09-16 2:30 ` Ruifeng Wang (Arm Technology China)
2019-11-06 14:03 ` David Marchand
2019-11-11 5:19 ` Ruifeng Wang (Arm Technology China)
2019-09-06 17:28 ` Stephen Hemminger
2019-09-09 2:38 ` Ruifeng Wang (Arm Technology China)
2019-09-10 16:27 ` Honnappa Nagarahalli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190906102615.36942-2-ruifeng.wang@arm.com \
--to=ruifeng.wang@arm.com \
--cc=dev@dpdk.org \
--cc=gavin.hu@arm.com \
--cc=honnappa.nagarahalli@arm.com \
--cc=nd@arm.com \
--cc=tomasz.kantecki@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).