From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id D503537A6 for ; Tue, 16 Feb 2016 14:19:27 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 16 Feb 2016 05:19:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,455,1449561600"; d="scan'208";a="913350066" Received: from fanzhan2-mobl.ger.corp.intel.com (HELO [10.237.220.138]) ([10.237.220.138]) by orsmga002.jf.intel.com with ESMTP; 16 Feb 2016 05:19:26 -0800 From: "Zhang, Roy Fan" To: Marcin Kerlin References: <1454081497-13015-1-git-send-email-marcinx.kerlin@intel.com> <1455293081-13094-1-git-send-email-marcinx.kerlin@intel.com> Message-ID: <56C321DD.6080906@intel.com> Date: Tue, 16 Feb 2016 13:19:25 +0000 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1455293081-13094-1-git-send-email-marcinx.kerlin@intel.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH v3 1/1] jobstats: added function abort for job 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: Tue, 16 Feb 2016 13:19:28 -0000 On 12/02/2016 16:04, Marcin Kerlin wrote: > This patch adds new function rte_jobstats_abort. It marks *job* as finished and > time of this work will be add to management time instead of execution time. This > function should be used instead of rte_jobstats_finish if condition occurs, > condition is defined by the application for example when receiving n>0 packets. > Example of usage is added to the example l2fwd-jobstats. At maximum load do-while > loop inside Idle job will be execute once because one or more jobs waiting to be > executed, so this time should not be include as the execution time by calling > rte_jobstats_abort(). > > v2: > * removed redundant field > v3: > * added an example of using > > Signed-off-by: Marcin Kerlin > --- > examples/l2fwd-jobstats/main.c | 9 ++++++++- > lib/librte_jobstats/rte_jobstats.c | 20 ++++++++++++++++++++ > lib/librte_jobstats/rte_jobstats.h | 14 ++++++++++++++ > lib/librte_jobstats/rte_jobstats_version.map | 7 +++++++ > 4 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/examples/l2fwd-jobstats/main.c b/examples/l2fwd-jobstats/main.c > index 7b59f4e..bd64e74 100644 > --- a/examples/l2fwd-jobstats/main.c > +++ b/examples/l2fwd-jobstats/main.c > @@ -577,10 +577,13 @@ l2fwd_main_loop(void) > */ > rte_jobstats_start(&qconf->jobs_context, &qconf->idle_job); > > + uint64_t repeats = 0; > + > do { > uint8_t i; > uint64_t now = rte_get_timer_cycles(); > > + repeats++; > need_manage = qconf->flush_timer.expire < now; > /* Check if we was esked to give a stats. */ > stats_read_pending = > @@ -591,7 +594,11 @@ l2fwd_main_loop(void) > need_manage = qconf->rx_timers[i].expire < now; > > } while (!need_manage); > - rte_jobstats_finish(&qconf->idle_job, qconf->idle_job.target); > + > + if (likely(repeats != 1)) > + rte_jobstats_finish(&qconf->idle_job, qconf->idle_job.target); > + else > + rte_jobstats_abort(&qconf->idle_job); > > rte_timer_manage(); > rte_jobstats_context_finish(&qconf->jobs_context); > diff --git a/lib/librte_jobstats/rte_jobstats.c b/lib/librte_jobstats/rte_jobstats.c > index 2eaac0c..2b42050 100644 > --- a/lib/librte_jobstats/rte_jobstats.c > +++ b/lib/librte_jobstats/rte_jobstats.c > @@ -170,6 +170,26 @@ rte_jobstats_start(struct rte_jobstats_context *ctx, struct rte_jobstats *job) > } > > int > +rte_jobstats_abort(struct rte_jobstats *job) > +{ > + struct rte_jobstats_context *ctx; > + uint64_t now, exec_time; > + > + /* Some sanity check. */ > + if (unlikely(job == NULL || job->context == NULL)) > + return -EINVAL; > + > + ctx = job->context; > + now = get_time(); > + exec_time = now - ctx->state_time; > + ADD_TIME_MIN_MAX(ctx, management, exec_time); > + ctx->state_time = now; > + job->context = NULL; > + > + return 0; > +} > + > +int > rte_jobstats_finish(struct rte_jobstats *job, int64_t job_value) > { > struct rte_jobstats_context *ctx; > diff --git a/lib/librte_jobstats/rte_jobstats.h b/lib/librte_jobstats/rte_jobstats.h > index de6a89a..c2b285f 100644 > --- a/lib/librte_jobstats/rte_jobstats.h > +++ b/lib/librte_jobstats/rte_jobstats.h > @@ -237,6 +237,20 @@ int > rte_jobstats_start(struct rte_jobstats_context *ctx, struct rte_jobstats *job); > > /** > + * Mark that *job* finished its execution, but time of this work will be skipped > + * and added to management time. > + * > + * @param job > + * Job object. > + * > + * @return > + * 0 on success > + * -EINVAL if job is NULL or job was not started (it have no context). > + */ > +int > +rte_jobstats_abort(struct rte_jobstats *job); > + > +/** > * Mark that *job* finished its execution. Context in which it was executing > * will receive stat update. After this function call *job* object is ready to > * be executed in other context. > diff --git a/lib/librte_jobstats/rte_jobstats_version.map b/lib/librte_jobstats/rte_jobstats_version.map > index cb01bfd..e3b21ca 100644 > --- a/lib/librte_jobstats/rte_jobstats_version.map > +++ b/lib/librte_jobstats/rte_jobstats_version.map > @@ -17,3 +17,10 @@ DPDK_2.0 { > > local: *; > }; > + > +DPDK_2.3 { > + global: > + > + rte_jobstats_abort; > + > +} DPDK_2.0; Acked-by : Fan Zhang