From: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com> There is a race condition, on transmit to vSwitch.
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 30d5a1b..805f0b2 100644 --- a/pmd/pmd_memnic.c +++ b/pmd/pmd_memnic.c @@ -278,6 +278,15 @@ retry: goto retry; } + if (idx != ACCESS_ONCE(adapter->down_idx)) { + /* + * vSwitch 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