Code Review
/
deb_dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
New upstream version 16.11.9
[deb_dpdk.git]
/
lib
/
librte_eal
/
linuxapp
/
kni
/
kni_fifo.h
diff --git
a/lib/librte_eal/linuxapp/kni/kni_fifo.h
b/lib/librte_eal/linuxapp/kni/kni_fifo.h
index
025ec1c
..
208d34b
100644
(file)
--- a/
lib/librte_eal/linuxapp/kni/kni_fifo.h
+++ b/
lib/librte_eal/linuxapp/kni/kni_fifo.h
@@
-27,6
+27,14
@@
#include <exec-env/rte_kni_common.h>
#include <exec-env/rte_kni_common.h>
+/* Skip some memory barriers on Linux < 3.14 */
+#ifndef smp_load_acquire
+#define smp_load_acquire(a) (*(a))
+#endif
+#ifndef smp_store_release
+#define smp_store_release(a, b) *(a) = (b)
+#endif
+
/**
* Adds num elements into the fifo. Return the number actually written
*/
/**
* Adds num elements into the fifo. Return the number actually written
*/
@@
-35,7
+43,7
@@
kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
{
uint32_t i = 0;
uint32_t fifo_write = fifo->write;
{
uint32_t i = 0;
uint32_t fifo_write = fifo->write;
- uint32_t fifo_read =
fifo->read
;
+ uint32_t fifo_read =
smp_load_acquire(&fifo->read)
;
uint32_t new_write = fifo_write;
for (i = 0; i < num; i++) {
uint32_t new_write = fifo_write;
for (i = 0; i < num; i++) {
@@
-46,7
+54,7
@@
kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
fifo->buffer[fifo_write] = data[i];
fifo_write = new_write;
}
fifo->buffer[fifo_write] = data[i];
fifo_write = new_write;
}
-
fifo->write = fifo_write
;
+
smp_store_release(&fifo->write, fifo_write)
;
return i;
}
return i;
}
@@
-59,7
+67,7
@@
kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
{
uint32_t i = 0;
uint32_t new_read = fifo->read;
{
uint32_t i = 0;
uint32_t new_read = fifo->read;
- uint32_t fifo_write =
fifo->write
;
+ uint32_t fifo_write =
smp_load_acquire(&fifo->write)
;
for (i = 0; i < num; i++) {
if (new_read == fifo_write)
for (i = 0; i < num; i++) {
if (new_read == fifo_write)
@@
-68,7
+76,7
@@
kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
data[i] = fifo->buffer[new_read];
new_read = (new_read + 1) & (fifo->len - 1);
}
data[i] = fifo->buffer[new_read];
new_read = (new_read + 1) & (fifo->len - 1);
}
-
fifo->read = new_read
;
+
smp_store_release(&fifo->read, new_read)
;
return i;
}
return i;
}
@@
-79,7
+87,9
@@
kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
static inline uint32_t
kni_fifo_count(struct rte_kni_fifo *fifo)
{
static inline uint32_t
kni_fifo_count(struct rte_kni_fifo *fifo)
{
- return (fifo->len + fifo->write - fifo->read) & (fifo->len - 1);
+ uint32_t fifo_write = smp_load_acquire(&fifo->write);
+ uint32_t fifo_read = smp_load_acquire(&fifo->read);
+ return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
}
/**
}
/**
@@
-88,7
+98,9
@@
kni_fifo_count(struct rte_kni_fifo *fifo)
static inline uint32_t
kni_fifo_free_count(struct rte_kni_fifo *fifo)
{
static inline uint32_t
kni_fifo_free_count(struct rte_kni_fifo *fifo)
{
- return (fifo->read - fifo->write - 1) & (fifo->len - 1);
+ uint32_t fifo_write = smp_load_acquire(&fifo->write);
+ uint32_t fifo_read = smp_load_acquire(&fifo->read);
+ return (fifo_read - fifo_write - 1) & (fifo->len - 1);
}
#ifdef RTE_KNI_VHOST
}
#ifdef RTE_KNI_VHOST