From: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com>

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 <h-shimamoto at ct.jp.nec.com>
Reviewed-by: Hayato Momma <h-momma at ce.jp.nec.com>
---
 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

Reply via email to