[dpdk-dev] [PATCH v4 10/13] app/eventdev: add pipeline queue worker functions
Van Haaren, Harry
harry.van.haaren at intel.com
Tue Jan 16 13:05:48 CET 2018
> From: Pavan Nikhilesh [mailto:pbhagavatula at caviumnetworks.com]
> Sent: Friday, January 12, 2018 4:44 PM
> To: jerin.jacob at caviumnetworks.com; santosh.shukla at caviumnetworks.com; Van
> Haaren, Harry <harry.van.haaren at intel.com>; Eads, Gage
> <gage.eads at intel.com>; hemant.agrawal at nxp.com; nipun.gupta at nxp.com; Ma,
> Liang J <liang.j.ma at intel.com>
> Cc: dev at dpdk.org; Pavan Nikhilesh <pbhagavatula at caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v4 10/13] app/eventdev: add pipeline queue worker
> functions
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula at caviumnetworks.com>
Some of the code feels like duplication - but there are differences in each implementation as far as I can see. The common initialization parts are "macro-ed" to ensure minimal duplication. In short, I'm not aware of a better solution/implementation.
Please see note on branch-optimization in the code below.
Acked-by: Harry van Haaren <harry.van.haaren at intel.com>
> static int
> worker_wrapper(void *arg)
> {
> - RTE_SET_USED(arg);
> + struct worker_data *w = arg;
> + struct evt_options *opt = w->t->opt;
> + const bool burst = evt_has_burst_mode(w->dev_id);
> + const bool mt_safe = !w->t->mt_unsafe;
> + const uint8_t nb_stages = opt->nb_stages;
> + RTE_SET_USED(opt);
> +
> + /* allow compiler to optimize */
> + if (nb_stages == 1) {
> + if (!burst && mt_safe)
> + return pipeline_queue_worker_single_stage_tx(arg);
> + else if (!burst && !mt_safe)
> + return pipeline_queue_worker_single_stage_fwd(arg);
> + else if (burst && mt_safe)
> + return pipeline_queue_worker_single_stage_burst_tx(arg);
> + else if (burst && !mt_safe)
> + return pipeline_queue_worker_single_stage_burst_fwd(
> + arg);
> + } else {
> + if (!burst && mt_safe)
> + return pipeline_queue_worker_multi_stage_tx(arg);
> + else if (!burst && !mt_safe)
> + return pipeline_queue_worker_multi_stage_fwd(arg);
> + else if (burst && mt_safe)
> + return pipeline_queue_worker_multi_stage_burst_tx(arg);
> + else if (burst && !mt_safe)
> + return pipeline_queue_worker_multi_stage_burst_fwd(arg);
> +
> + }
I don't think the compiler will optimize the below, as the nb_stages value comes from opt, which is a uint8 originating from a pointer-dereference...
As far as I know, an optimizing compiler will do "constant propagation" through function calls, but I would be amazed if it found a pointer initialized to a specific value, and optimized the branches away here based on the contents of that pointer deref.
So I see 2 options;
1) accept as is - I'll ack this patch here
2) Rework so that the worker_wrapper() accepts nb_stages, burst and mt_safe as function arguments, allowing constant propagation for optimizing away the branches.
@Pavan, I'll leave that choice up to you!
More information about the dev
mailing list