From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <marcinx.kerlin@intel.com>
Received: from mga09.intel.com (mga09.intel.com [134.134.136.24])
 by dpdk.org (Postfix) with ESMTP id C1CE99252
 for <dev@dpdk.org>; Tue, 26 Jan 2016 17:12:59 +0100 (CET)
Received: from orsmga001.jf.intel.com ([10.7.209.18])
 by orsmga102.jf.intel.com with ESMTP; 26 Jan 2016 08:12:57 -0800
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.22,350,1449561600"; d="scan'208";a="869038285"
Received: from gklab-246-018.igk.intel.com (HELO stargo) ([10.217.246.18])
 by orsmga001.jf.intel.com with SMTP; 26 Jan 2016 08:12:56 -0800
Received: by stargo (sSMTP sendmail emulation); Tue, 26 Jan 2016 17:15:41 +0100
From: Marcin Kerlin <marcinx.kerlin@intel.com>
To: dev@dpdk.org
Date: Tue, 26 Jan 2016 17:15:34 +0100
Message-Id: <1453824934-10650-1-git-send-email-marcinx.kerlin@intel.com>
X-Mailer: git-send-email 1.9.1
Subject: [dpdk-dev] [PATCH V1 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 <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Tue, 26 Jan 2016 16:13:00 -0000

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 occure,
condition is defined by the application for example when receiving n>0 packets.

Signed-off-by: Marcin Kerlin <marcinx.kerlin@intel.com>
---
 lib/librte_jobstats/rte_jobstats.c           | 22 ++++++++++++++++++++++
 lib/librte_jobstats/rte_jobstats.h           | 17 +++++++++++++++++
 lib/librte_jobstats/rte_jobstats_version.map |  7 +++++++
 3 files changed, 46 insertions(+)

diff --git a/lib/librte_jobstats/rte_jobstats.c b/lib/librte_jobstats/rte_jobstats.c
index 2eaac0c..b603125 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;
@@ -191,6 +211,7 @@ rte_jobstats_finish(struct rte_jobstats *job, int64_t job_value)
 	 * executed. */
 	now = get_time();
 	exec_time = now - ctx->state_time;
+	job->last_job_time = exec_time;
 	ADD_TIME_MIN_MAX(job, exec, exec_time);
 	ADD_TIME_MIN_MAX(ctx, exec, exec_time);
 
@@ -269,5 +290,6 @@ void
 rte_jobstats_reset(struct rte_jobstats *job)
 {
 	RESET_TIME_MIN_MAX(job, exec);
+	job->last_job_time = 0;
 	job->exec_cnt = 0;
 }
diff --git a/lib/librte_jobstats/rte_jobstats.h b/lib/librte_jobstats/rte_jobstats.h
index de6a89a..9995319 100644
--- a/lib/librte_jobstats/rte_jobstats.h
+++ b/lib/librte_jobstats/rte_jobstats.h
@@ -90,6 +90,9 @@ struct rte_jobstats {
 	uint64_t exec_cnt;
 	/**< Execute count. */
 
+	uint64_t last_job_time;
+	/**< Last job time */
+
 	char name[RTE_JOBSTATS_NAMESIZE];
 	/**< Name of this job */
 
@@ -237,6 +240,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..0ec0650 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;
\ No newline at end of file
-- 1
1.9.1