From: Hiroshi Shimamoto
There is a race condition, on transmit to host.
Guest PMD Host
Thread-A Thread-B vSwitch
|idx=0 |idx=0 |p[0] st!=2
|cmpxchg ||
|p[0] st->1 ||
|idx=1 ||
|fill data ||
|p[0] st->2 ||p[0] st==2
|||receive data
|||p[0] st->0
||cmpxchg |
||success |p[1] st!=2
||p[0] st->1 |
This is BAD
That causes traffic stop.
We have to take care about that race condition with checking
whether current index is correct.
Signed-off-by: Hiroshi Shimamoto
Reviewed-by: Hayato Momma
---
pmd/pmd_memnic.c | 9 +
1 file changed, 9 insertions(+)
diff --git a/pmd/pmd_memnic.c b/pmd/pmd_memnic.c
index d833130..4a1c1e4 100644
--- a/pmd/pmd_memnic.c
+++ b/pmd/pmd_memnic.c
@@ -345,6 +345,15 @@ retry:
goto retry;
}
+ if (idx != ACCESS_ONCE(adapter->down_idx)) {
+ /*
+* host freed this and got false positive,
+* need to recover the status and retry.
+*/
+ p->status = MEMNIC_PKT_ST_FREE;
+ goto retry;
+ }
+
if (++idx >= MEMNIC_NR_PACKET)
idx = 0;
adapter->down_idx = idx;
--
1.8.4