From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by dpdk.org (Postfix) with ESMTP id 97BC0B0A3 for ; Fri, 16 May 2014 00:18:15 +0200 (CEST) Received: by mail-wi0-f177.google.com with SMTP id f8so38293wiw.10 for ; Thu, 15 May 2014 15:18:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=t0TJyBIPy9Ev5VLIehgg30BJBeWKATt/rflluhBae50=; b=YDGYQNrS7i45AhR7uwntkxCssQYOB6MUn+BKb1m66aBMbtccARB7d6xCpp1sodNVrS feu6RiMLGETFxRyGElxjfbj0buxC9re+Beouol95AuK9KWHHVPN5gvcmAbQKEMcVfDE1 CEFzYrfS92dF0yM6Gi02UXDis8aSjHa4gBzQDNWi2IibB5Pds0tltp6vUZyklQV6dC1a Wa4z29DN9xDg0y+Mblyw7Norh0FShHLdl3DIwzkUC3sbhP93UE4fa1x7EGjZAHIyTVC1 Z5bAa5MUk4h6RH50Hq6VQob6LXhtXN7Uv5OG2BtG/yS2VU+agvcz/8gnFNfNt/anCQU1 lwYw== X-Received: by 10.180.39.178 with SMTP id q18mr10702052wik.56.1400192303655; Thu, 15 May 2014 15:18:23 -0700 (PDT) Received: from ubuntu.ubuntu-domain (bzq-79-181-48-4.red.bezeqint.net. [79.181.48.4]) by mx.google.com with ESMTPSA id fu10sm35871317wib.11.2014.05.15.15.18.22 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 15 May 2014 15:18:23 -0700 (PDT) From: Vadim Suraev To: dev@dpdk.org Date: Fri, 16 May 2014 13:15:54 +0300 Message-Id: <1400235354-14810-3-git-send-email-vadim.suraev@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1400235354-14810-1-git-send-email-vadim.suraev@gmail.com> References: <1400235354-14810-1-git-send-email-vadim.suraev@gmail.com> Subject: [dpdk-dev] [PATCH 2/2] timer bug fix X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 May 2014 22:18:16 -0000 Description: while running a periodic timer's callback, if another timer is manipulated, the updated flag is raised preventing the periodic timer to reload. Fix: move updated flag from priv_timer to rte_timer stucture (one per core) Signed-off-by: Vadim Suraev --- lib/librte_timer/rte_timer.c | 17 ++++++++--------- lib/librte_timer/rte_timer.h | 7 ++++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c index f98e904..0cc5fa9 100755 --- a/lib/librte_timer/rte_timer.c +++ b/lib/librte_timer/rte_timer.c @@ -58,11 +58,6 @@ LIST_HEAD(rte_timer_list, rte_timer); struct priv_timer { struct rte_timer pending_head; /**< dummy timer instance to head up list */ rte_spinlock_t list_lock; /**< lock to protect list access */ - - /** per-core variable that true if a timer was updated on this - * core since last reset of the variable */ - int updated; - /** track the current depth of the skiplist */ unsigned curr_skiplist_depth; @@ -107,10 +102,14 @@ void rte_timer_init(struct rte_timer *tim) { union rte_timer_status status; + unsigned lcore_id; status.state = RTE_TIMER_STOP; status.owner = RTE_TIMER_NO_OWNER; tim->status.u32 = status.u32; + for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++) { + tim->updated[lcore_id] = 0; + } } /* @@ -378,7 +377,7 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t expire, return -1; __TIMER_STAT_ADD(reset, 1); - priv_timer[lcore_id].updated = 1; + tim->updated[lcore_id] = 1; /* remove it from list */ if (prev_status.state == RTE_TIMER_PENDING) { @@ -453,7 +452,7 @@ rte_timer_stop(struct rte_timer *tim) return -1; __TIMER_STAT_ADD(stop, 1); - priv_timer[lcore_id].updated = 1; + tim->updated[lcore_id] = 1; /* remove it from list */ if (prev_status.state == RTE_TIMER_PENDING) { @@ -541,7 +540,7 @@ void rte_timer_manage(void) rte_spinlock_unlock(&priv_timer[lcore_id].list_lock); - priv_timer[lcore_id].updated = 0; + tim->updated[lcore_id] = 0; /* execute callback function with list unlocked */ tim->f(tim, tim->arg); @@ -550,7 +549,7 @@ void rte_timer_manage(void) /* the timer was stopped or reloaded by the callback * function, we have nothing to do here */ - if (priv_timer[lcore_id].updated == 1) + if (tim->updated[lcore_id] == 1) continue; if (tim->period == 0) { diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h index c5f936b..235dfd6 100755 --- a/lib/librte_timer/rte_timer.h +++ b/lib/librte_timer/rte_timer.h @@ -129,6 +129,10 @@ struct rte_timer uint64_t period; /**< Period of timer (0 if not periodic). */ rte_timer_cb_t *f; /**< Callback function. */ void *arg; /**< Argument to callback function. */ + /** per-core variable that true if a timer was updated on this + * core since last reset of the variable */ + int updated[RTE_MAX_LCORE]; + }; @@ -142,7 +146,8 @@ struct rte_timer {{RTE_TIMER_STOP, RTE_TIMER_NO_OWNER}}, \ 0, \ NULL, \ - NULL, \ + NULL, \ + {0}, \ } #else /** -- 1.7.9.5