app/testpmd: fix parsing RSS queue rule
authorHaiyue Wang <haiyue.wang@intel.com>
Tue, 25 Jun 2019 10:38:03 +0000 (18:38 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 4 Jul 2019 23:52:02 +0000 (01:52 +0200)
Declare a local variable 'arg' to hold the pointer to ARGS_ENTRY_ARB,
otherwise, the pop 'arg' in 'parse_int' holds wrong data like 'arg->
offset = 5912737, arg->size = 0', this caused the parse failure.

If calling like 'push_args(ctx, ARGS_ENTRY_ARB..)', the below code for
assigning 'offset & size' will be missed for some gcc optimization.

parse_vc_action_rss_queue
    29c5: c5 f9 ef c0           vpxor  %xmm0,%xmm0,%xmm0
    29c9: 43 8d 44 24 68        lea    0x68(%r12,%r12,1),%eax
    29ce: 48 c7 44 24 20 00 00  movq   $0x0,0x20(%rsp)
    29d5: 00 00
    29d7: c5 f8 29 44 24 10     vmovaps %xmm0,0x10(%rsp)
    29dd: 89 44 24 18           mov    %eax,0x18(%rsp)
    29e1: 48 63 83 0c 01 00 00  movslq 0x10c(%rbx),%rax
    29e8: c7 44 24 1c 02 00 00  movl   $0x2,0x1c(%rsp)
    29ef: 00
    29f0: c5 f8 29 04 24        vmovaps %xmm0,(%rsp)

The above assembly code is from this modification with:
    gcc version 9.1.1 20190503 (Red Hat 9.1.1-1) (GCC)
    Fedora release 30 (Thirty)
    5.1.11-300.fc30.x86_64

Fixes: d0ad8648b1c5 ("app/testpmd: fix RSS flow action configuration")
Cc: stable@dpdk.org
Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Reviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>
Acked-by: Bernard Iremonger <bernard.iremonger@intel.com>
app/test-pmd/cmdline_flow.c

index 4e5fa7a..e3e8448 100644 (file)
@@ -3478,6 +3478,7 @@ parse_vc_action_rss_queue(struct context *ctx, const struct token *token,
 {
        static const enum index next[] = NEXT_ENTRY(ACTION_RSS_QUEUE);
        struct action_rss_data *action_rss_data;
+       const struct arg *arg;
        int ret;
        int i;
 
@@ -3493,10 +3494,10 @@ parse_vc_action_rss_queue(struct context *ctx, const struct token *token,
        }
        if (i >= ACTION_RSS_QUEUE_NUM)
                return -1;
-       if (push_args(ctx,
-                     ARGS_ENTRY_ARB(offsetof(struct action_rss_data, queue) +
-                                    i * sizeof(action_rss_data->queue[i]),
-                                    sizeof(action_rss_data->queue[i]))))
+       arg = ARGS_ENTRY_ARB(offsetof(struct action_rss_data, queue) +
+                            i * sizeof(action_rss_data->queue[i]),
+                            sizeof(action_rss_data->queue[i]));
+       if (push_args(ctx, arg))
                return -1;
        ret = parse_int(ctx, token, str, len, NULL, 0);
        if (ret < 0) {