On Tue, Aug 29, 2017 at 08:15:56AM +0000, Darrell Ball wrote:
>
>
> On 8/22/17, 11:24 PM, "Yuanhan Liu" <[email protected]> wrote:
>
> From: Finn Christensen <[email protected]>
>
> AFAIK, both Mellanox and Intel's NIC do not support a pure MARK
> action.
> They both require to use it together with some other actions, like
> QUEUE.
>
> To workaround it, retry with a queue action when first try failed.
>
> Moreover, some Intel's NIC (say XL710) needs the QUEUE action set
> before
> the MARK action.
>
> Signed-off-by: Finn Christensen <[email protected]>
> Signed-off-by: Yuanhan Liu <[email protected]>
> ---
> lib/netdev-dpdk.c | 22 +++++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 8089da8..230d506 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -3629,9 +3629,29 @@ netdev_dpdk_add_rte_flow_offload(struct netdev
> *netdev,
> }
> ADD_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_END, NULL);
>
> + int tried = 0;
>
> bool ?
Okay.
>
> + struct rte_flow_action_queue queue;
> +again:
>
> Maybe replace with loop semantics ?
If such "goto" is forbidden in OVS, for sure I could replace it. If not,
I actually would like to keep it: it saves an indentation. Also, the loop
doesn't seem to make sense to me. How do you specify the loop?
for (tried = 0; tried < xxx; tried++) {
flow = rte_flow_create(...);
if (flow)
break;
if (tried == 0) {
...
} else if (tried == 1) {
...
} else if (tried == ..) {
}
}
>
>
> flow = rte_flow_create(dev->port_id, &flow_attr, patterns.items,
> actions.actions, &error);
> - if (!flow) {
> + if (!flow && !tried && actions_len) {
> + /*
> + * create flow failed, try again with QUEUE ACTION
> + * FIXME: to not fix with queue id.
>
>
> Could we add commit comments here and elaborate a bit if possible ?
Yep, good suggestion. Will do in next version.
--yliu
> + */
> + queue.index = 0;
> +
> + /* re-build the action */
> + actions.cnt = 0;
> + ADD_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_QUEUE, &queue);
> + ADD_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_MARK, &mark);
> + ADD_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_END, NULL);
> +
> + VLOG_INFO("rte flow create failed, try again with adding
> QUEUE action\n");
> + tried = 1;
> +
> + goto again;
> + } else if (!flow) {
> VLOG_ERR("rte flow creat error: %u : message : %s\n",
> error.type, error.message);
> goto err;
> --
> 2.7.4
>
>
>
>
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev