New upstream version 16.11.9
[deb_dpdk.git] / lib / librte_eal / linuxapp / kni / kni_fifo.h
index 025ec1c..208d34b 100644 (file)
 
 #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
  */
@@ -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 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++) {
@@ -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->write = fifo_write;
+       smp_store_release(&fifo->write, fifo_write);
 
        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 fifo_write = fifo->write;
+       uint32_t fifo_write = smp_load_acquire(&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);
        }
-       fifo->read = new_read;
+       smp_store_release(&fifo->read, new_read);
 
        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)
 {
-       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)
 {
-       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