net/iavf: fix virtual channel return
authorYahui Cao <yahui.cao@intel.com>
Tue, 24 Dec 2019 04:13:13 +0000 (12:13 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 17 Jan 2020 18:46:01 +0000 (19:46 +0100)
In iavf_handle_virtchnl_msg(), it is not appropriate for _clear_cmd()
to be used as a notification to foreground thread. So introduce
_notify_cmd() to fix this error. In addition, since _notify_cmd()
contains rte_wmb(), rte_compiler_barrier() is not necessary.

Sending msg from VF to PF is mainly by calling iavf_execute_vf_cmd(),
the whole virtchnl msg process is like,

iavf_execute_vf_cmd() will call iavf_aq_send_msg_to_pf() to send
msg and then polling the cmd done flag as "if (vf->pend_cmd ==
VIRTCHNL_OP_UNKNOWN)"

When reply msg is returned by pf, iavf_handle_virtchnl_msg() in
isr will read msg return value by "vf->cmd_retval = msg_ret" and
immediately set the cmd done flag by calling _clear_cmd() to
notify the iavf_execute_vf_cmd().

iavf_execute_vf_cmd() find the cmd done flag is set and then
check whether command return value vf->cmd_retval is success or
not.

However _clear_cmd() also resets the vf->cmd_retval to success,
overwriting the actual return value which is used for diagnosis.
So iavf_execute_vf_cmd() will always find vf->cmd_retval is
success and then return success.

Fixes: 22b123a36d07 ("net/avf: initialize PMD")
Cc: stable@dpdk.org
Signed-off-by: Yahui Cao <yahui.cao@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>
drivers/net/iavf/iavf.h
drivers/net/iavf/iavf_vchnl.c

index 77b7068..9466808 100644 (file)
@@ -174,6 +174,17 @@ struct iavf_cmd_info {
        uint32_t out_size;      /* buffer size for response */
 };
 
+/* notify current command done. Only call in case execute
+ * _atomic_set_cmd successfully.
+ */
+static inline void
+_notify_cmd(struct iavf_info *vf, uint32_t msg_ret)
+{
+       vf->cmd_retval = msg_ret;
+       rte_wmb();
+       vf->pend_cmd = VIRTCHNL_OP_UNKNOWN;
+}
+
 /* clear current command. Only call in case execute
  * _atomic_set_cmd successfully.
  */
index bf87ab6..303b515 100644 (file)
@@ -210,12 +210,9 @@ iavf_handle_virtchnl_msg(struct rte_eth_dev *dev)
                                                        info.msg_len);
                        } else {
                                /* read message and it's expected one */
-                               if (msg_opc == vf->pend_cmd) {
-                                       vf->cmd_retval = msg_ret;
-                                       /* prevent compiler reordering */
-                                       rte_compiler_barrier();
-                                       _clear_cmd(vf);
-                               } else
+                               if (msg_opc == vf->pend_cmd)
+                                       _notify_cmd(vf, msg_ret);
+                               else
                                        PMD_DRV_LOG(ERR, "command mismatch,"
                                                    "expect %u, get %u",
                                                    vf->pend_cmd, msg_opc);