X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-acl%2Fmain.c;h=06e3847ab93879e8cbd615feb24478dc57508ba3;hb=23f7ec1d9b7ccfcfb9b9f67d33cf6cbf7f5034d3;hp=4bc00272f43da3c25419d64edf05b8fe37c199d4;hpb=f2fc83b40f06da6a6b2476005279ba52d4ce3c44;p=dpdk.git diff --git a/app/test-acl/main.c b/app/test-acl/main.c index 4bc00272f4..06e3847ab9 100644 --- a/app/test-acl/main.c +++ b/app/test-acl/main.c @@ -12,7 +12,7 @@ #include #include -#define PRINT_USAGE_START "%s [EAL options]\n" +#define PRINT_USAGE_START "%s [EAL options] --\n" #define RTE_LOGTYPE_TESTACL RTE_LOGTYPE_USER1 @@ -48,6 +48,8 @@ #define RULE_NUM 0x10000 +#define COMMENT_LEAD_CHAR '#' + enum { DUMP_NONE, DUMP_SEARCH, @@ -81,6 +83,14 @@ static const struct acl_alg acl_alg[] = { .name = "altivec", .alg = RTE_ACL_CLASSIFY_ALTIVEC, }, + { + .name = "avx512x16", + .alg = RTE_ACL_CLASSIFY_AVX512X16, + }, + { + .name = "avx512x32", + .alg = RTE_ACL_CLASSIFY_AVX512X32, + }, }; static struct { @@ -376,8 +386,8 @@ parse_cb_ipv4_trace(char *str, struct ipv4_5tuple *v) } /* - * Parses IPV6 address, exepcts the following format: - * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X - is a hexedecimal digit). + * Parse IPv6 address, expects the following format: + * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X is a hexadecimal digit). */ static int parse_ipv6_addr(const char *in, const char **end, uint32_t v[IPV6_ADDR_U32], @@ -464,13 +474,28 @@ parse_cb_ipv6_trace(char *str, struct ipv6_5tuple *v) return 0; } +/* Bypass comment and empty lines */ +static int +skip_line(const char *buf) +{ + uint32_t i; + + for (i = 0; isspace(buf[i]) != 0; i++) + ; + + if (buf[i] == 0 || buf[i] == COMMENT_LEAD_CHAR) + return 1; + + return 0; +} + static void tracef_init(void) { static const char name[] = APP_NAME; FILE *f; size_t sz; - uint32_t n; + uint32_t i, k, n; struct ipv4_5tuple *v; struct ipv6_5tuple *w; @@ -489,27 +514,36 @@ tracef_init(void) v = config.traces; w = config.traces; - for (n = 0; n != config.nb_traces; n++) { + k = 0; + n = 0; + for (i = 0; n != config.nb_traces; i++) { if (fgets(line, sizeof(line), f) == NULL) break; + if (skip_line(line) != 0) { + k++; + continue; + } + + n = i - k; + if (config.ipv6) { if (parse_cb_ipv6_trace(line, w + n) != 0) rte_exit(EXIT_FAILURE, "%s: failed to parse ipv6 trace " "record at line %u\n", - config.trace_file, n + 1); + config.trace_file, i + 1); } else { if (parse_cb_ipv4_trace(line, v + n) != 0) rte_exit(EXIT_FAILURE, "%s: failed to parse ipv4 trace " "record at line %u\n", - config.trace_file, n + 1); + config.trace_file, i + 1); } } - config.used_traces = n; + config.used_traces = i - k; fclose(f); } @@ -719,20 +753,27 @@ static int add_cb_rules(FILE *f, struct rte_acl_ctx *ctx) { int rc; - uint32_t n; + uint32_t i, k, n; struct acl_rule v; parse_5tuple parser; memset(&v, 0, sizeof(v)); parser = (config.ipv6 != 0) ? parse_cb_ipv6_rule : parse_cb_ipv4_rule; - for (n = 1; fgets(line, sizeof(line), f) != NULL; n++) { + k = 0; + for (i = 1; fgets(line, sizeof(line), f) != NULL; i++) { + if (skip_line(line) != 0) { + k++; + continue; + } + + n = i - k; rc = parser(line, &v); if (rc != 0) { RTE_LOG(ERR, TESTACL, "line %u: parse_cb_ipv4vlan_rule" " failed, error code: %d (%s)\n", - n, rc, strerror(-rc)); + i, rc, strerror(-rc)); return rc; } @@ -745,7 +786,7 @@ add_cb_rules(FILE *f, struct rte_acl_ctx *ctx) if (rc != 0) { RTE_LOG(ERR, TESTACL, "line %u: failed to add rules " "into ACL context, error code: %d (%s)\n", - n, rc, strerror(-rc)); + i, rc, strerror(-rc)); return rc; } } @@ -862,9 +903,10 @@ search_ip5tuples(__rte_unused void *arg) { uint64_t pkt, start, tm; uint32_t i, lcore; + long double st; lcore = rte_lcore_id(); - start = rte_rdtsc(); + start = rte_rdtsc_precise(); pkt = 0; for (i = 0; i != config.iter_num; i++) { @@ -872,12 +914,16 @@ search_ip5tuples(__rte_unused void *arg) config.trace_step, config.alg.name); } - tm = rte_rdtsc() - start; + tm = rte_rdtsc_precise() - start; + + st = (long double)tm / rte_get_timer_hz(); dump_verbose(DUMP_NONE, stdout, "%s @lcore %u: %" PRIu32 " iterations, %" PRIu64 " pkts, %" - PRIu32 " categories, %" PRIu64 " cycles, %#Lf cycles/pkt\n", - __func__, lcore, i, pkt, config.run_categories, - tm, (pkt == 0) ? 0 : (long double)tm / pkt); + PRIu32 " categories, %" PRIu64 " cycles (%.2Lf sec), " + "%.2Lf cycles/pkt, %.2Lf pkt/sec\n", + __func__, lcore, i, pkt, + config.run_categories, tm, st, + (pkt == 0) ? 0 : (long double)tm / pkt, pkt / st); return 0; } @@ -948,7 +994,7 @@ print_usage(const char *prgname) "should be either 1 or multiple of %zu, " "but not greater then %u]\n" "[--" OPT_MAX_SIZE - "= " + "= " "leave 0 for default behaviour]\n" "[--" OPT_ITER_NUM "=]\n" "[--" OPT_VERBOSE "=]\n" @@ -1085,7 +1131,7 @@ main(int argc, char **argv) if (config.trace_file != NULL) tracef_init(); - RTE_LCORE_FOREACH_SLAVE(lcore) + RTE_LCORE_FOREACH_WORKER(lcore) rte_eal_remote_launch(search_ip5tuples, NULL, lcore); search_ip5tuples(NULL);