From patchwork Thu Jun 1 15:45:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Van Haaren, Harry" X-Patchwork-Id: 24984 X-Patchwork-Delegate: jerinj@marvell.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 4B6B07CBF; Thu, 1 Jun 2017 17:45:38 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id C2BE77CBB for ; Thu, 1 Jun 2017 17:45:35 +0200 (CEST) Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Jun 2017 08:45:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,280,1493708400"; d="scan'208";a="109234231" Received: from silpixa00398672.ir.intel.com ([10.237.223.128]) by fmsmga005.fm.intel.com with ESMTP; 01 Jun 2017 08:45:32 -0700 From: Harry van Haaren To: dev@dpdk.org Cc: jerin.jacob@caviumnetworks.com, gage.eads@intel.com, Harry van Haaren Date: Thu, 1 Jun 2017 16:45:54 +0100 Message-Id: <1496331954-93915-1-git-send-email-harry.van.haaren@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <9184057F7FC11744A2107296B6B8EB1E01EC4180@FMSMSX108.amr.corp.intel.com> References: <9184057F7FC11744A2107296B6B8EB1E01EC4180@FMSMSX108.amr.corp.intel.com> Subject: [dpdk-dev] [PATCH v2] event/sw: fix credit tracking in port dequeue 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Single-link optimized ports previously did not correctly track credits when dequeued, and re-enqueued as a FORWARD type. This could "inflate" the number of credits in the system. A unit test is added to reproduce and verify the issue, and the fixed implementation counts FORWARD packets, and reduces the number of credits the port has if it is of single-link type. Fixes: 656af9180014 ("event/sw: add worker core functions") Signed-off-by: Harry van Haaren Acked-by: Gage Eads --- v2: - Remove useless stats retrieving code - Remove commented code - Added Ack --- drivers/event/sw/sw_evdev_worker.c | 5 ++++ test/test/test_eventdev_sw.c | 51 +++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/drivers/event/sw/sw_evdev_worker.c b/drivers/event/sw/sw_evdev_worker.c index 9cb6bef..b738506 100644 --- a/drivers/event/sw/sw_evdev_worker.c +++ b/drivers/event/sw/sw_evdev_worker.c @@ -87,6 +87,7 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num) return 0; } + uint32_t forwards = 0; for (i = 0; i < num; i++) { int op = ev[i].op; int outstanding = p->outstanding_releases > 0; @@ -95,6 +96,7 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num) p->inflight_credits -= (op == RTE_EVENT_OP_NEW); p->inflight_credits += (op == RTE_EVENT_OP_RELEASE) * outstanding; + forwards += (op == RTE_EVENT_OP_FORWARD); new_ops[i] = sw_qe_flag_map[op]; new_ops[i] &= ~(invalid_qid << QE_FLAG_VALID_SHIFT); @@ -113,6 +115,9 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num) } } + /* handle directed port forward credits */ + p->inflight_credits -= forwards * p->is_directed; + /* returns number of events actually enqueued */ uint32_t enq = qe_ring_enqueue_burst_with_ops(p->rx_worker_ring, ev, i, new_ops); diff --git a/test/test/test_eventdev_sw.c b/test/test/test_eventdev_sw.c index b187d02..2cb9f59 100644 --- a/test/test/test_eventdev_sw.c +++ b/test/test/test_eventdev_sw.c @@ -548,6 +548,50 @@ test_single_directed_packet(struct test *t) return 0; } +static int +test_directed_forward_credits(struct test *t) +{ + uint32_t i; + int32_t err; + + if (init(t, 1, 1) < 0 || + create_ports(t, 1) < 0 || + create_directed_qids(t, 1, t->port) < 0) + return -1; + + if (rte_event_dev_start(evdev) < 0) { + printf("%d: Error with start call\n", __LINE__); + return -1; + } + + struct rte_event ev = { + .op = RTE_EVENT_OP_NEW, + .queue_id = 0, + }; + + for (i = 0; i < 1000; i++) { + err = rte_event_enqueue_burst(evdev, 0, &ev, 1); + if (err < 0) { + printf("%d: error failed to enqueue\n", __LINE__); + return -1; + } + rte_event_schedule(evdev); + + uint32_t deq_pkts; + deq_pkts = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); + if (deq_pkts != 1) { + printf("%d: error failed to deq\n", __LINE__); + return -1; + } + + /* re-write event to be a forward, and continue looping it */ + ev.op = RTE_EVENT_OP_FORWARD; + } + + cleanup(t); + return 0; +} + static int test_priority_directed(struct test *t) @@ -3025,13 +3069,18 @@ test_sw_eventdev(void) } } t->mbuf_pool = eventdev_func_mempool; - printf("*** Running Single Directed Packet test...\n"); ret = test_single_directed_packet(t); if (ret != 0) { printf("ERROR - Single Directed Packet test FAILED.\n"); return ret; } + printf("*** Running Directed Forward Credit test...\n"); + ret = test_directed_forward_credits(t); + if (ret != 0) { + printf("ERROR - Directed Forward Credit test FAILED.\n"); + return ret; + } printf("*** Running Single Load Balanced Packet test...\n"); ret = single_packet(t); if (ret != 0) {