[dpdk-dev] [memnic PATCH] linux: fix race condition
Hiroshi Shimamoto
h-shimamoto at ct.jp.nec.com
Thu Apr 3 09:35:50 CEST 2014
From: Hiroshi Shimamoto <h-shimamoto at 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
More information about the dev
mailing list