From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0040.outbound.protection.outlook.com [104.47.41.40]) by dpdk.org (Postfix) with ESMTP id B26DD1D24A for ; Fri, 6 Apr 2018 17:13:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=u1tnhdquMqUxAbyftlM6sjTNrS+zjQ73xwEjzqO7vxo=; b=AjWDi1w7NU5sZR2eV5N/Xdz/lyp08r910diSPUi1UBZN96ZBAQYSO9OkjgEXvWb/XbhusYt4NNBbA1pkRwPvk2YDQr9ualqElWfp8WVBopADvu13/CwMZpgNx3U4BWJx7HAZxJF8G1byCiyNuxrULJaopjCGgqylLFoAtEDBviM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from ltp-pvn.caveonetworks.com (111.93.218.67) by BN6PR07MB3457.namprd07.prod.outlook.com (2603:10b6:405:64::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.653.12; Fri, 6 Apr 2018 15:13:53 +0000 From: Pavan Nikhilesh To: jerin.jacob@caviumnetworks.com, santosh.shukla@caviumnetworks.com, erik.g.carrillo@intel.com Cc: dev@dpdk.org, Pavan Nikhilesh Date: Fri, 6 Apr 2018 20:43:21 +0530 Message-Id: <20180406151324.9135-1-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180318131216.11699-1-pbhagavatula@caviumnetworks.com> References: <20180318131216.11699-1-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: PN1PR0101CA0007.INDPRD01.PROD.OUTLOOK.COM (2603:1096:c00:e::17) To BN6PR07MB3457.namprd07.prod.outlook.com (2603:10b6:405:64::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8b3914d5-20b4-4e24-e50a-08d59bd1038b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603328)(7153060)(7193020); SRVR:BN6PR07MB3457; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3457; 3:oKJBrSHSuQ844kz1yy7u//pH4PTyrbzlrmfg8EKS17P9gydrX7sfGetoYIDowf1xyqdDXS0Mh6fK+Uu5+KlvRE1UnVPV4xaxruFKjJABfxt+Udxb/3ahrlsB4zQImUH7JhRnxgUcFQnG06TuQDCRxVcJ4slFCJ7YGIvtM3MWzTYjO64ebLfDKuLe1GhCfZ8U0hpjp4VdZYKeQ2/A29bmxYzsyp7+KKn1BnUJwVngCe3pBjQXq9BR5vsN0NbWfMw+; 25:ky4TQOEc7mFyUbH+GXlip2gLkhCHuRiT4+D5Cjw5oXwzfhMdX+TdhWlfMdgiGRji9oIZyWmaePmp+FgWwQWLmoVENex0wn1GudYCca9crHhvbCpFPFeuTwQLX1i6Z6/mSCJCBGcq0SVBRhqmjtd0PZe/lJMLg+vX4B0DHMCs0/7LMzVuc9+ECaQEz6UkIGmmumK+cLmYsAunolvNwVSJJYaQhl1UztS0MoFxDGAFn3scxsk7GMRBwB76hEAG0lxpqTRgE3QwiGRwIQVVCpFbzlRQXSLvhELdurww5OFKWvwo5WC3D7SFrXRTfBFXvdfuPJ+4hIOlx51MFaf7PKJIiA==; 31:gnuXx1nZh6ii7jDBRdTdPdLwU+V31q68CZg8QEnN2xfzXfy11rcs4kU1VJPHnaJV7JFlNUE8stFQ4JhPeQBxLE82DarCc25Ayybax8zeD0LOhwsHOCBf2GEMWxnBNOGchMpgjGuu7g0G/6PwhcSAtYCaD3J+szltYCBux71iO8RcsWHRWl32gsFqthcrJUpgq9JQcxJgtvXIkzilby46ifx8tHqsSYDi5vOBH+VL8dI= X-MS-TrafficTypeDiagnostic: BN6PR07MB3457: X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3457; 20:EujO07XiimexEsxmvCIcsVEnSiPAOBj3VSQJzPo22KBq7Slia6zCofvgeqvZoYnBUbJBbO26fyf0jrlWC2myP9oErkyksGqJIX124kXxmYQRo764CluPl8IIpXc3l0z/E2XF+dzB+tTidgMGr2rQPJc14CBiNP+qOue36Hxk8eHi8uQTz4wT1amxCEOXIir3ZEJ8Bbd/Jl1mGssYq9bbj0oXw6QOkSHceQQtvGPthllR5BgCR0h1anuQ+iVdHxEL/C6dUQEfWt82BskTzEzDHPAWNlO6cHwMa+KtdOtOVCVQ/OfXqtrRlV/aP2uMHE7ud/Bhai56+NFybCaFkO/im1Bsm5Fz4n5ytYGB72b6IW/F6QChQaGsv4/uKZ+DQNKHUnwlp/GEZZ3FD9HPJQ/2PK+i/Ebe+wVycKtS7LTEm0lM5DYDrPXwckh4aGmya88McrgKHxIlad9c7bGYxvvU94kPGcXujEfZUSo9GaWS9pzINfoDXc/q/Gg8FkZnppo//wpfheRtI2t7hw7XmzX/aw5H32NyD4s0s83VggCcNR9JueCIHa2dL4oKgfZMpR6si5JVuwaBXU8aJKj/Toz+qv879Gwstvpr6y/5BaurEQo= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(131327999870524)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(3231221)(944501327)(52105095)(10201501046)(93006095)(6041310)(20161123562045)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:BN6PR07MB3457; BCL:0; PCL:0; RULEID:; SRVR:BN6PR07MB3457; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3457; 4:WtWUGO+2jkiugdIczBT5Q8LDva9RJHZR7ixsy3vnDRPF+qWQLwRjeEIMxxQBX1CLBtuGxIbBLiDDwFtpDEL3tuYnW7ZxJn9lO5Vh/zOQTejYWeGqmlRs8EbJK0iJ+i2QRWpqQfsCdhG4EP2vdl+zDmn+p3kTUTEdcRcPEhjZ1HqNQskucjTDbJh8QAxY4Y9IJ2CsdPMjyvqkq+yPNnl9MXkvYfGuMRvfyJWPR5UUqPW8+2OoNqQ86KIkWkNLzj12Ott2P39F9g6o3FTULReAmCRylScAXeuo9dcZoh2nPJzVzhIgHswi8WmgF0H6sESDCXJF6p/YCeZLDef2DLdt7wD81sYaQbBw1p3itjsGyKM= X-Forefront-PRVS: 0634F37BFF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39380400002)(346002)(376002)(366004)(396003)(39850400004)(189003)(199004)(51416003)(446003)(47776003)(81166006)(2616005)(16526019)(5660300001)(305945005)(11346002)(956004)(16586007)(8936002)(1076002)(72206003)(69596002)(107886003)(81156014)(106356001)(3846002)(476003)(486006)(6512007)(7736002)(4326008)(8676002)(76176011)(1857600001)(48376002)(68736007)(66066001)(97736004)(53416004)(6666003)(52116002)(105586002)(59450400001)(50466002)(316002)(26005)(6506007)(50226002)(53936002)(42882007)(25786009)(5009440100003)(575784001)(478600001)(36756003)(6486002)(6116002)(386003)(2906002)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR07MB3457; H:ltp-pvn.caveonetworks.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR07MB3457; 23:SQB/ZEmGaP/KazqK9Pr/F1I+kYtFgSPMCUQsqjMf0?= =?us-ascii?Q?OLTxWAG9fF0tP9MHktzqpCTRt3SsM7FWabJ0R5YtPG8GgQclL35gjI4T7fUm?= =?us-ascii?Q?X+r/OLpIyW1nuTbvLJnw17Or1NqZoIWWTiGBqSpBsoSofBKE1hF5Tgg7ibsJ?= =?us-ascii?Q?5V9VYVkz7zNPSuJxkvp7wldomL6TRo4BF+keuLAEvqVn17gtV0B7zA2WoJYp?= =?us-ascii?Q?MoS+X/M/8hrwIVlSc0g1RKD/cIYgGwbcoD2AU7F5gkk1ltPTEOGuNbKGqcHk?= =?us-ascii?Q?s1cxvp0JE1Tg8Vm31Pp/urbDpc0Oxybc5iPooSfJRkKMrKeXJGlUNbsaIhpY?= =?us-ascii?Q?wQ2M2sdl6aOgxJgJyIajf5vxlvH701gZd+0GFfxL2FXc3GgjO3HhD6gLGXB6?= =?us-ascii?Q?DMWYnGiGvNfirT3I1zSt3uk3lml/AOmiAGq3r1vQC+cUdZhD7g5HlQNAj30F?= =?us-ascii?Q?DpuSYZQLMk3YeUqkDtsNbpxa7/932qJozzJAJ7TDtzg/gWQf1uqKIQzEt0Rk?= =?us-ascii?Q?KtZz2PLyOKBF9dFDZP8Vc0Z5fYaviSCgo0NswPBwRytAU921r9osIZiIbHFl?= =?us-ascii?Q?7LPu67YmGw9jB4JqtNgw4maSJOryLwL8AsR0HNoaKIKm46JnUOj+NaICsQrY?= =?us-ascii?Q?zfFNhBM2P2F27gOh+j+Gf3DAcotlmjX0jgE6OZUzWA9OT59oZ07zbsdrkzw+?= =?us-ascii?Q?WLcSMwMNQeDl4j9EqihWhcveqVNb0rkjLaxsGg1pYTidJI+1+XIwUOuGuomi?= =?us-ascii?Q?0sY44atBYABSiEizqobts9fytiJyGs65VRLcElFOGL2ALoqGeeF6SXGLBFJI?= =?us-ascii?Q?Tv29dkwtjCBeVOAUXzuJL387P3P6iEW5qDC4BpnlegXLJtzvuOJ08xi9+Vy+?= =?us-ascii?Q?+e0KeY3KZqlFftDdq5FLt7cYJiJF+rjXCY+Q/MlpmgeLV/IlHtWAg5UqzMiN?= =?us-ascii?Q?0x1BKT1w7geAUMtNP5zDz9xezSCxKtvyONynDklhzLWIYJCEtk4GnNLbIZPb?= =?us-ascii?Q?DxQoEYlS9hiXQ/pXOsajkgo96kKmgU3DV27S0HgNQ9li5vV+oxxaykyNp0D8?= =?us-ascii?Q?kaTCX7FxfCxJH2sIv7IGykgw7rmBXXnjd3qw6p2TKcj+z79qPoHsug/qE+Qj?= =?us-ascii?Q?QBkx3PhmruemOreuUCic8VrVxy4u/JjQ7SFzN2C+p/jFVuk5Em1zbABYgfy5?= =?us-ascii?Q?3sUh4S/F1JjGsgy62WTWT0iR0l7Mdk50ji/2/qJZ/uWTarwhMVfHVMRE/JlE?= =?us-ascii?Q?UpQHi8BRnLk5GiROWBxZKdzFuFOasfcy367P+dlAa0ylAmbXYNCxrQLg5xml?= =?us-ascii?Q?+z1qbdqcBlPjD2w5JWWtR5IrTfL6BXsW9baQTljuzr2YCPZplQ4YAnCaYilm?= =?us-ascii?Q?V61WaP/lHZud5MBdvVR1Yh6QMY=3D?= X-Microsoft-Antispam-Message-Info: kfX6/McElGAi+S8F02LM7m7ab2bU6kFwR3qVuBfKZ+70OwTCD2aku6dP8zVtWrGMs+fk1pLIis/cqC+3I5JGRgbBR1b7C2DhsxckeCz6UafOgVLNFNFc0F+31tZyWi3lyoV1pYbjzQ5MrIfeXsyRxHtWqKtH8CDI2q0x1sB+/38jNmYZ+hWv8eID8MBe1mYg X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3457; 6:EmjHdJk/ukRTvr2Epho7Jk1rGr86kFCFeFO7IGL8vkxDZz3tGXAbA6rUy23G4WAlcFHdKoJnQRz5RYlULJEbt6RBBRR7ip7VnkykeY4hUpUnH0107Tit0BFnK7MvOTVjEyr9U9k9y/JXnom509+27r4RY08Fna1pBhkD7uqsQJ7drro+GHtTZgqH02ZSycJVeTfQoO6gKK3HrFe/DduRj7/b9SWpJB1xgRcOmpY+vc8FDZoWAmHzQzWjEkpAsDugxuL5KsWJIV8sfYer9GLHXztFKZp91O79OAVpKF2orrtGw24eX1xoDYr13aOVi5A0PfSMiUNchA95ejnL/Ot4qLWSXYEAw86+1jACPTgRiKoGidt6UJlTanKyRiqDx0U1W00hC6lYAGt4NHf2wGC+L/4col8QvWGRxQPqhCrvg1hR4nlrG0m9+CDQEhYwoptHKWPg1aKj03HecslV0+0LnA==; 5:1GFwBrYkJz2tXR35K0QbJpaJv43hLvLUC5jL8W0hKKrBolnPM4Xr+7qLs33nkNVWuU/UQ0sTjjRkyMBi6MgmuFpatkX9YBya3L48P1AMCufpV/sIjHPf0g7AeoJg6hBSukcKlTLQyvIW7gLpxpz6rV0xIK9jZyEcVHXdRkeExMI=; 24:s9kAzl/tzxqinv2RIi+e5Ju/476kJ62HG0orlIJbFAIBEKZLMMGRxAPCDedKiyA6UL+mKdY/oshn2ZSRBUgnsENMvsUwcevLEKvo2JJO3PY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB3457; 7:qnfIZlPOkJGPDrDhjEw9ofU/dJY2buZRTWNKZEo/Cb6grhS6L7ffh+Wmm2ZxiJr6q1aUhRWqgSa/ndxr98AINu8fJfFwzNy8MiGQ6aLE1G05AJggu5HaH9v0Vs8zsxR+ht575SXEXHzuKRdJKe2WWuGQhvpctBfpJE2mPbQQBXyuLIqBdA9lRq2sUedVCAXRJITtTvB6Yr4D+QbGOTss6cmWGXTzp98GypqatAnpjTBe2RiS+yWJblCB+uvbBgSm X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2018 15:13:53.6669 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8b3914d5-20b4-4e24-e50a-08d59bd1038b X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB3457 Subject: [dpdk-dev] [PATCH v5 1/4] app/eventdev: add event timer adapter as a producer X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Apr 2018 15:13:57 -0000 Add event timer adapter as producer option that can be selected by passing --prod_type_timerdev. Signed-off-by: Pavan Nikhilesh Acked-by: Erik Gabriel Carrillo Acked-by: Jerin Jacob --- v5 Changes: - Resending cause missing Acked-by. v4 Changes: - reuse struct rte_event_timer's unused data portion to store timestamp instead of spilling timestamp into a new cacheline. - change bkt_tck_nsec to timer_tick_nsec - change nb_bkt_tcks to expiry_nsec v3 Changes: - Add detailed options dump. - Fix few typos. v2 Changes: - set timer to NOT_ARMED before trying to arm it. - prevent edge cases for timeout_ticks being set to 0. app/test-eventdev/evt_options.c | 54 ++++++--- app/test-eventdev/evt_options.h | 24 ++++ app/test-eventdev/test_perf_atq.c | 10 +- app/test-eventdev/test_perf_common.c | 171 +++++++++++++++++++++++++-- app/test-eventdev/test_perf_common.h | 14 ++- app/test-eventdev/test_perf_queue.c | 7 +- 6 files changed, 243 insertions(+), 37 deletions(-) diff --git a/app/test-eventdev/evt_options.c b/app/test-eventdev/evt_options.c index 9683b2224..47e37bc9b 100644 --- a/app/test-eventdev/evt_options.c +++ b/app/test-eventdev/evt_options.c @@ -27,6 +27,11 @@ evt_options_default(struct evt_options *opt) opt->pool_sz = 16 * 1024; opt->wkr_deq_dep = 16; opt->nb_pkts = (1ULL << 26); /* do ~64M packets */ + opt->nb_timers = 1E8; + opt->nb_timer_adptrs = 1; + opt->timer_tick_nsec = 1E3; /* 1000ns ~ 1us */ + opt->max_tmo_nsec = 1E5; /* 100000ns ~100us */ + opt->expiry_nsec = 1E4; /* 10000ns ~10us */ opt->prod_type = EVT_PROD_TYPE_SYNT; } @@ -86,6 +91,13 @@ evt_parse_eth_prod_type(struct evt_options *opt, const char *arg __rte_unused) return 0; } +static int +evt_parse_timer_prod_type(struct evt_options *opt, const char *arg __rte_unused) +{ + opt->prod_type = EVT_PROD_TYPE_EVENT_TIMER_ADPTR; + return 0; +} + static int evt_parse_test_name(struct evt_options *opt, const char *arg) { @@ -169,7 +181,10 @@ usage(char *program) "\t--worker_deq_depth : dequeue depth of the worker\n" "\t--fwd_latency : perform fwd_latency measurement\n" "\t--queue_priority : enable queue priority\n" - "\t--prod_type_ethdev : use ethernet device as producer\n." + "\t--prod_type_ethdev : use ethernet device as producer.\n" + "\t--prod_type_timerdev : use event timer device as producer.\n" + "\t expity_nsec would be the timeout\n" + "\t in ns.\n" ); printf("available tests:\n"); evt_test_dump_names(); @@ -217,22 +232,23 @@ evt_parse_sched_type_list(struct evt_options *opt, const char *arg) } static struct option lgopts[] = { - { EVT_NB_FLOWS, 1, 0, 0 }, - { EVT_DEVICE, 1, 0, 0 }, - { EVT_VERBOSE, 1, 0, 0 }, - { EVT_TEST, 1, 0, 0 }, - { EVT_PROD_LCORES, 1, 0, 0 }, - { EVT_WORK_LCORES, 1, 0, 0 }, - { EVT_SOCKET_ID, 1, 0, 0 }, - { EVT_POOL_SZ, 1, 0, 0 }, - { EVT_NB_PKTS, 1, 0, 0 }, - { EVT_WKR_DEQ_DEP, 1, 0, 0 }, - { EVT_SCHED_TYPE_LIST, 1, 0, 0 }, - { EVT_FWD_LATENCY, 0, 0, 0 }, - { EVT_QUEUE_PRIORITY, 0, 0, 0 }, - { EVT_PROD_ETHDEV, 0, 0, 0 }, - { EVT_HELP, 0, 0, 0 }, - { NULL, 0, 0, 0 } + { EVT_NB_FLOWS, 1, 0, 0 }, + { EVT_DEVICE, 1, 0, 0 }, + { EVT_VERBOSE, 1, 0, 0 }, + { EVT_TEST, 1, 0, 0 }, + { EVT_PROD_LCORES, 1, 0, 0 }, + { EVT_WORK_LCORES, 1, 0, 0 }, + { EVT_SOCKET_ID, 1, 0, 0 }, + { EVT_POOL_SZ, 1, 0, 0 }, + { EVT_NB_PKTS, 1, 0, 0 }, + { EVT_WKR_DEQ_DEP, 1, 0, 0 }, + { EVT_SCHED_TYPE_LIST, 1, 0, 0 }, + { EVT_FWD_LATENCY, 0, 0, 0 }, + { EVT_QUEUE_PRIORITY, 0, 0, 0 }, + { EVT_PROD_ETHDEV, 0, 0, 0 }, + { EVT_PROD_TIMERDEV, 0, 0, 0 }, + { EVT_HELP, 0, 0, 0 }, + { NULL, 0, 0, 0 } }; static int @@ -255,11 +271,12 @@ evt_opts_parse_long(int opt_idx, struct evt_options *opt) { EVT_FWD_LATENCY, evt_parse_fwd_latency}, { EVT_QUEUE_PRIORITY, evt_parse_queue_priority}, { EVT_PROD_ETHDEV, evt_parse_eth_prod_type}, + { EVT_PROD_TIMERDEV, evt_parse_timer_prod_type}, }; for (i = 0; i < RTE_DIM(parsermap); i++) { if (strncmp(lgopts[opt_idx].name, parsermap[i].lgopt_name, - strlen(parsermap[i].lgopt_name)) == 0) + strlen(lgopts[opt_idx].name)) == 0) return parsermap[i].parser_fn(opt, optarg); } @@ -305,6 +322,7 @@ evt_options_dump(struct evt_options *opt) evt_dump("pool_sz", "%d", opt->pool_sz); evt_dump("master lcore", "%d", rte_get_master_lcore()); evt_dump("nb_pkts", "%"PRIu64, opt->nb_pkts); + evt_dump("nb_timers", "%"PRIu64, opt->nb_timers); evt_dump_begin("available lcores"); RTE_LCORE_FOREACH(lcore_id) printf("%d ", lcore_id); diff --git a/app/test-eventdev/evt_options.h b/app/test-eventdev/evt_options.h index 46d122229..b51d8d5b3 100644 --- a/app/test-eventdev/evt_options.h +++ b/app/test-eventdev/evt_options.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -31,12 +32,14 @@ #define EVT_FWD_LATENCY ("fwd_latency") #define EVT_QUEUE_PRIORITY ("queue_priority") #define EVT_PROD_ETHDEV ("prod_type_ethdev") +#define EVT_PROD_TIMERDEV ("prod_type_timerdev") #define EVT_HELP ("help") enum evt_prod_type { EVT_PROD_TYPE_NONE, EVT_PROD_TYPE_SYNT, /* Producer type Synthetic i.e. CPU. */ EVT_PROD_TYPE_ETH_RX_ADPTR, /* Producer type Eth Rx Adapter. */ + EVT_PROD_TYPE_EVENT_TIMER_ADPTR, /* Producer type Timer Adapter. */ EVT_PROD_TYPE_MAX, }; @@ -52,11 +55,18 @@ struct evt_options { int nb_stages; int verbose_level; uint64_t nb_pkts; + uint8_t nb_timer_adptrs; + uint64_t nb_timers; + uint64_t timer_tick_nsec; + uint64_t optm_timer_tick_nsec; + uint64_t max_tmo_nsec; + uint64_t expiry_nsec; uint16_t wkr_deq_dep; uint8_t dev_id; uint32_t fwd_latency:1; uint32_t q_priority:1; enum evt_prod_type prod_type; + uint8_t timdev_cnt; }; void evt_options_default(struct evt_options *opt); @@ -262,6 +272,20 @@ evt_dump_producer_type(struct evt_options *opt) case EVT_PROD_TYPE_ETH_RX_ADPTR: snprintf(name, EVT_PROD_MAX_NAME_LEN, "Ethdev Rx Adapter producers"); + evt_dump("nb_ethdev", "%d", rte_eth_dev_count()); + break; + case EVT_PROD_TYPE_EVENT_TIMER_ADPTR: + snprintf(name, EVT_PROD_MAX_NAME_LEN, + "Event timer adapter producer"); + evt_dump("nb_timer_adapters", "%d", opt->nb_timer_adptrs); + evt_dump("max_tmo_nsec", "%"PRIu64"", opt->max_tmo_nsec); + evt_dump("expiry_nsec", "%"PRIu64"", opt->expiry_nsec); + if (opt->optm_timer_tick_nsec) + evt_dump("optm_timer_tick_ns", "%"PRIu64"", + opt->optm_timer_tick_nsec); + else + evt_dump("timer_tick_ns", "%"PRIu64"", + opt->timer_tick_nsec); break; } evt_dump("prod_type", "%s", name); diff --git a/app/test-eventdev/test_perf_atq.c b/app/test-eventdev/test_perf_atq.c index b36b22a77..b3a312722 100644 --- a/app/test-eventdev/test_perf_atq.c +++ b/app/test-eventdev/test_perf_atq.c @@ -43,15 +43,12 @@ perf_atq_worker(void *arg, const int enable_fwd_latency) while (t->done == false) { uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0); - if (enable_fwd_latency) - rte_prefetch0(ev.event_ptr); - if (!event) { rte_pause(); continue; } - if (enable_fwd_latency) + if (enable_fwd_latency && !prod_timer_type) /* first stage in pipeline, mark ts to compute fwd latency */ atq_mark_fwd_latency(&ev); @@ -90,7 +87,7 @@ perf_atq_worker_burst(void *arg, const int enable_fwd_latency) } for (i = 0; i < nb_rx; i++) { - if (enable_fwd_latency) { + if (enable_fwd_latency && !prod_timer_type) { rte_prefetch0(ev[i+1].event_ptr); /* first stage in pipeline. * mark time stamp to compute fwd latency @@ -163,7 +160,8 @@ perf_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt) struct rte_event_dev_info dev_info; nb_ports = evt_nr_active_lcores(opt->wlcores); - nb_ports += opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR ? 0 : + nb_ports += (opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR || + opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) ? 0 : evt_nr_active_lcores(opt->plcores); nb_queues = atq_nb_event_queues(opt); diff --git a/app/test-eventdev/test_perf_common.c b/app/test-eventdev/test_perf_common.c index 59fa0a49e..b6cc00e60 100644 --- a/app/test-eventdev/test_perf_common.c +++ b/app/test-eventdev/test_perf_common.c @@ -72,6 +72,67 @@ perf_producer(void *arg) return 0; } +static inline int +perf_event_timer_producer(void *arg) +{ + struct prod_data *p = arg; + struct test_perf *t = p->t; + struct evt_options *opt = t->opt; + uint32_t flow_counter = 0; + uint64_t count = 0; + uint64_t arm_latency = 0; + const uint8_t nb_timer_adptrs = opt->nb_timer_adptrs; + const uint32_t nb_flows = t->nb_flows; + const uint64_t nb_timers = opt->nb_timers; + struct rte_mempool *pool = t->pool; + struct perf_elt *m; + struct rte_event_timer_adapter **adptr = t->timer_adptr; + uint64_t timeout_ticks = opt->expiry_nsec / opt->timer_tick_nsec; + + timeout_ticks = opt->optm_timer_tick_nsec ? + (timeout_ticks * opt->timer_tick_nsec) + / opt->optm_timer_tick_nsec : timeout_ticks; + timeout_ticks += timeout_ticks ? 0 : 1; + const struct rte_event_timer tim = { + .ev.op = RTE_EVENT_OP_NEW, + .ev.queue_id = p->queue_id, + .ev.sched_type = t->opt->sched_type_list[0], + .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL, + .ev.event_type = RTE_EVENT_TYPE_TIMER, + .state = RTE_EVENT_TIMER_NOT_ARMED, + .timeout_ticks = timeout_ticks, + }; + + if (opt->verbose_level > 1) + printf("%s(): lcore %d\n", __func__, rte_lcore_id()); + + while (count < nb_timers && t->done == false) { + if (rte_mempool_get(pool, (void **)&m) < 0) + continue; + + m->tim = tim; + m->tim.ev.flow_id = flow_counter++ % nb_flows; + m->tim.ev.event_ptr = m; + m->timestamp = rte_get_timer_cycles(); + while (rte_event_timer_arm_burst( + adptr[flow_counter % nb_timer_adptrs], + (struct rte_event_timer **)&m, 1) != 1) { + if (t->done) + break; + rte_pause(); + m->timestamp = rte_get_timer_cycles(); + } + arm_latency += rte_get_timer_cycles() - m->timestamp; + count++; + } + fflush(stdout); + rte_delay_ms(1000); + printf("%s(): lcore %d Average event timer arm latency = %.3f us\n", + __func__, rte_lcore_id(), (float)(arm_latency / count) / + (rte_get_timer_hz() / 1000000)); + return 0; +} + static int perf_producer_wrapper(void *arg) { @@ -80,6 +141,8 @@ perf_producer_wrapper(void *arg) /* Launch the producer function only in case of synthetic producer. */ if (t->opt->prod_type == EVT_PROD_TYPE_SYNT) return perf_producer(arg); + else if (t->opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) + return perf_event_timer_producer(arg); return 0; } @@ -146,8 +209,7 @@ perf_launch_lcores(struct evt_test *test, struct evt_options *opt, port_idx++; } - const uint64_t total_pkts = opt->nb_pkts * - evt_nr_active_lcores(opt->plcores); + const uint64_t total_pkts = t->outstand_pkts; uint64_t dead_lock_cycles = rte_get_timer_cycles(); int64_t dead_lock_remaining = total_pkts; @@ -189,7 +251,9 @@ perf_launch_lcores(struct evt_test *test, struct evt_options *opt, if (remaining <= 0) { t->result = EVT_TEST_SUCCESS; - if (opt->prod_type == EVT_PROD_TYPE_SYNT) { + if (opt->prod_type == EVT_PROD_TYPE_SYNT || + opt->prod_type == + EVT_PROD_TYPE_EVENT_TIMER_ADPTR) { t->done = true; rte_smp_wmb(); break; @@ -283,6 +347,65 @@ perf_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride, return ret; } +static int +perf_event_timer_adapter_setup(struct test_perf *t) +{ + int i; + int ret; + struct rte_event_timer_adapter_info adapter_info; + struct rte_event_timer_adapter *wl; + uint8_t nb_producers = evt_nr_active_lcores(t->opt->plcores); + uint8_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + + if (nb_producers == 1) + flags |= RTE_EVENT_TIMER_ADAPTER_F_SP_PUT; + + for (i = 0; i < t->opt->nb_timer_adptrs; i++) { + struct rte_event_timer_adapter_conf config = { + .event_dev_id = t->opt->dev_id, + .timer_adapter_id = i, + .timer_tick_ns = t->opt->timer_tick_nsec, + .max_tmo_ns = t->opt->max_tmo_nsec, + .nb_timers = 2 * 1024 * 1024, + .flags = flags, + }; + + wl = rte_event_timer_adapter_create(&config); + if (wl == NULL) { + evt_err("failed to create event timer ring %d", i); + return rte_errno; + } + + memset(&adapter_info, 0, + sizeof(struct rte_event_timer_adapter_info)); + rte_event_timer_adapter_get_info(wl, &adapter_info); + t->opt->optm_timer_tick_nsec = adapter_info.min_resolution_ns; + + if (!(adapter_info.caps & + RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) { + uint32_t service_id; + + rte_event_timer_adapter_service_id_get(wl, + &service_id); + ret = evt_service_setup(service_id); + if (ret) { + evt_err("Failed to setup service core" + " for timer adapter\n"); + return ret; + } + rte_service_runstate_set(service_id, 1); + } + + ret = rte_event_timer_adapter_start(wl); + if (ret) { + evt_err("failed to Start event timer adapter %d", i); + return ret; + } + t->timer_adptr[i] = wl; + } + return 0; +} + int perf_event_dev_port_setup(struct evt_test *test, struct evt_options *opt, uint8_t stride, uint8_t nb_queues, @@ -326,6 +449,18 @@ perf_event_dev_port_setup(struct evt_test *test, struct evt_options *opt, ret = perf_event_rx_adapter_setup(opt, stride, *port_conf); if (ret) return ret; + } else if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) { + prod = 0; + for ( ; port < perf_nb_event_ports(opt); port++) { + struct prod_data *p = &t->prod[port]; + p->queue_id = prod * stride; + p->t = t; + prod++; + } + + ret = perf_event_timer_adapter_setup(t); + if (ret) + return ret; } else { prod = 0; for ( ; port < perf_nb_event_ports(opt); port++) { @@ -415,10 +550,13 @@ perf_opt_check(struct evt_options *opt, uint64_t nb_queues) } /* Fixups */ - if (opt->nb_stages == 1 && opt->fwd_latency) { + if ((opt->nb_stages == 1 && + opt->prod_type != EVT_PROD_TYPE_EVENT_TIMER_ADPTR) && + opt->fwd_latency) { evt_info("fwd_latency is valid when nb_stages > 1, disabling"); opt->fwd_latency = 0; } + if (opt->fwd_latency && !opt->q_priority) { evt_info("enabled queue priority for latency measurement"); opt->q_priority = 1; @@ -447,8 +585,13 @@ perf_opt_dump(struct evt_options *opt, uint8_t nb_queues) void perf_eventdev_destroy(struct evt_test *test, struct evt_options *opt) { - RTE_SET_USED(test); + int i; + struct test_perf *t = evt_test_priv(test); + if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) { + for (i = 0; i < opt->nb_timer_adptrs; i++) + rte_event_timer_adapter_stop(t->timer_adptr[i]); + } rte_event_dev_stop(opt->dev_id); rte_event_dev_close(opt->dev_id); } @@ -488,7 +631,8 @@ perf_ethdev_setup(struct evt_test *test, struct evt_options *opt) }, }; - if (opt->prod_type == EVT_PROD_TYPE_SYNT) + if (opt->prod_type == EVT_PROD_TYPE_SYNT || + opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) return 0; if (!rte_eth_dev_count()) { @@ -544,7 +688,8 @@ perf_mempool_setup(struct evt_test *test, struct evt_options *opt) { struct test_perf *t = evt_test_priv(test); - if (opt->prod_type == EVT_PROD_TYPE_SYNT) { + if (opt->prod_type == EVT_PROD_TYPE_SYNT || + opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) { t->pool = rte_mempool_create(test->name, /* mempool name */ opt->pool_sz, /* number of elements*/ sizeof(struct perf_elt), /* element size*/ @@ -594,10 +739,18 @@ perf_test_setup(struct evt_test *test, struct evt_options *opt) struct test_perf *t = evt_test_priv(test); - t->outstand_pkts = opt->nb_pkts * evt_nr_active_lcores(opt->plcores); + if (opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR) { + t->outstand_pkts = opt->nb_timers * + evt_nr_active_lcores(opt->plcores); + t->nb_pkts = opt->nb_timers; + } else { + t->outstand_pkts = opt->nb_pkts * + evt_nr_active_lcores(opt->plcores); + t->nb_pkts = opt->nb_pkts; + } + t->nb_workers = evt_nr_active_lcores(opt->wlcores); t->done = false; - t->nb_pkts = opt->nb_pkts; t->nb_flows = opt->nb_flows; t->result = EVT_TEST_FAILED; t->opt = opt; diff --git a/app/test-eventdev/test_perf_common.h b/app/test-eventdev/test_perf_common.h index 9ad99733b..d8fbee6d8 100644 --- a/app/test-eventdev/test_perf_common.h +++ b/app/test-eventdev/test_perf_common.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,7 @@ struct prod_data { struct test_perf *t; } __rte_cache_aligned; + struct test_perf { /* Don't change the offset of "done". Signal handler use this memory * to terminate all lcores work. @@ -54,10 +56,18 @@ struct test_perf { struct worker_data worker[EVT_MAX_PORTS]; struct evt_options *opt; uint8_t sched_type_list[EVT_MAX_STAGES] __rte_cache_aligned; + struct rte_event_timer_adapter *timer_adptr[ + RTE_EVENT_TIMER_ADAPTER_NUM_MAX] __rte_cache_aligned; } __rte_cache_aligned; struct perf_elt { - uint64_t timestamp; + union { + struct rte_event_timer tim; + struct { + char pad[offsetof(struct rte_event_timer, user_meta)]; + uint64_t timestamp; + }; + }; } __rte_cache_aligned; #define BURST_SIZE 16 @@ -68,6 +78,8 @@ struct perf_elt { struct evt_options *opt = t->opt;\ const uint8_t dev = w->dev_id;\ const uint8_t port = w->port_id;\ + const uint8_t prod_timer_type = \ + opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR;\ uint8_t *const sched_type_list = &t->sched_type_list[0];\ struct rte_mempool *const pool = t->pool;\ const uint8_t nb_stages = t->opt->nb_stages;\ diff --git a/app/test-eventdev/test_perf_queue.c b/app/test-eventdev/test_perf_queue.c index db8f2f3e5..74469a5ee 100644 --- a/app/test-eventdev/test_perf_queue.c +++ b/app/test-eventdev/test_perf_queue.c @@ -49,7 +49,7 @@ perf_queue_worker(void *arg, const int enable_fwd_latency) rte_pause(); continue; } - if (enable_fwd_latency) + if (enable_fwd_latency && !prod_timer_type) /* first q in pipeline, mark timestamp to compute fwd latency */ mark_fwd_latency(&ev, nb_stages); @@ -88,7 +88,7 @@ perf_queue_worker_burst(void *arg, const int enable_fwd_latency) } for (i = 0; i < nb_rx; i++) { - if (enable_fwd_latency) { + if (enable_fwd_latency && !prod_timer_type) { rte_prefetch0(ev[i+1].event_ptr); /* first queue in pipeline. * mark time stamp to compute fwd latency @@ -161,7 +161,8 @@ perf_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) struct rte_event_dev_info dev_info; nb_ports = evt_nr_active_lcores(opt->wlcores); - nb_ports += opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR ? 0 : + nb_ports += opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR || + opt->prod_type == EVT_PROD_TYPE_EVENT_TIMER_ADPTR ? 0 : evt_nr_active_lcores(opt->plcores); nb_queues = perf_queue_nb_event_queues(opt); -- 2.17.0