On 10/28/2021 5:04 PM, Radu Nicolau wrote:
@@ -339,15 +340,35 @@ _clear_cmd(struct iavf_info *vf)
static inline int
_atomic_set_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
{
- int ret = rte_atomic32_cmpset((volatile uint32_t *)&vf->pend_cmd,
- VIRTCHNL_OP_UNKNOWN, ops);
+ enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN;
+ int ret = __atomic_compare_exchange((volatile uint32_t *)&vf->pend_cmd,
+ &op_unk, &ops,
+ 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
if (!ret)
PMD_DRV_LOG(ERR, "There is incomplete cmd %d", vf->pend_cmd);
+ __atomic_store_n(&vf->pend_cmd_count, 1, __ATOMIC_RELAXED);
+
return !ret;
}
+/* Check there is pending cmd in execution. If none, set new command. */
+static inline int
+_atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
+{
+ enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN;
+ int ret = __atomic_compare_exchange((volatile uint32_t *)&vf->pend_cmd,
+ &op_unk, &ops,
+ 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
+
+ if (!ret)
+ PMD_DRV_LOG(ERR, "There is incomplete cmd %d", vf->pend_cmd);
+
+ __atomic_store_n(&vf->pend_cmd_count, 2, __ATOMIC_RELAXED);
+
+ return !ret;
+}
David reported build error on Windows [1], fixing in next-net [2].
@Radu can you please confirm the latest code in the next-net?
[1]
../drivers/net/iavf/iavf_rxtx_vec_avx512.c
In file included from ../drivers/net/iavf/iavf_rxtx_vec_avx512.c:5:
In file included from ..\drivers\net\iavf/iavf_rxtx_vec_common.h:11:
..\drivers\net\iavf/iavf.h:376:4: error: passing 'enum virtchnl_ops *' to
parameter of type 'uint32_t *' (aka 'unsigned int *') converts between pointers
to integer types with different sign [-Werror,-Wpointer-sign]
&op_unk, &ops,
^~~~~~~
..\drivers\net\iavf/iavf.h:376:13: error: passing 'enum virtchnl_ops *' to
parameter of type 'volatile uint32_t *' (aka 'volatile unsigned int *')
converts between pointers to integer types with different sign
[-Werror,-Wpointer-sign]
&op_unk, &ops,
^~~~
..\drivers\net\iavf/iavf.h:393:4: error: passing 'enum virtchnl_ops *' to
parameter of type 'uint32_t *' (aka 'unsigned int *') converts between pointers
to integer types with different sign [-Werror,-Wpointer-sign]
&op_unk, &ops,
^~~~~~~
..\drivers\net\iavf/iavf.h:393:13: error: passing 'enum virtchnl_ops *' to
parameter of type 'volatile uint32_t *' (aka 'volatile unsigned int *')
converts between pointers to integer types with different sign
[-Werror,-Wpointer-sign]
&op_unk, &ops,
^~~~
4 errors generated.
[2]
diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 42fb66d71193..f413dbed833a 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -372,8 +372,7 @@ static inline int
_atomic_set_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
{
enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN;
- int ret = __atomic_compare_exchange((volatile uint32_t *)&vf->pend_cmd,
- &op_unk, &ops,
+ int ret = __atomic_compare_exchange(&vf->pend_cmd, &op_unk, &ops,
0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
if (!ret)
@@ -389,8 +388,7 @@ static inline int
_atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
{
enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN;
- int ret = __atomic_compare_exchange((volatile uint32_t *)&vf->pend_cmd,
- &op_unk, &ops,
+ int ret = __atomic_compare_exchange(&vf->pend_cmd, &op_unk, &ops,
0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
if (!ret)