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 at 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