From: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com> Same as PMD, there is a race condition between host and guest in the guest MEMNIC kernel driver.
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 Signed-off-by: Hiroshi Shimamoto <h-shimamoto at ct.jp.nec.com> --- linux/memnic_net.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/linux/memnic_net.c b/linux/memnic_net.c index 9019258..fadece6 100644 --- a/linux/memnic_net.c +++ b/linux/memnic_net.c @@ -209,6 +209,15 @@ retry: goto retry; } + if (idx != ACCESS_ONCE(memnic->down)) { + /* + * 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; memnic->down = idx; -- 1.8.4