New upstream version 16.11.9
[deb_dpdk.git] / lib / librte_eal / linuxapp / kni / kni_fifo.h
index 3ea750e..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
  */
-static inline unsigned
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
+static inline uint32_t
+kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
 {
-       unsigned i = 0;
-       unsigned fifo_write = fifo->write;
-       unsigned fifo_read = fifo->read;
-       unsigned new_write = fifo_write;
+       uint32_t i = 0;
+       uint32_t fifo_write = fifo->write;
+       uint32_t fifo_read = smp_load_acquire(&fifo->read);
+       uint32_t new_write = fifo_write;
 
        for (i = 0; i < num; i++) {
                new_write = (new_write + 1) & (fifo->len - 1);
@@ -46,7 +54,7 @@ kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
                fifo->buffer[fifo_write] = data[i];
                fifo_write = new_write;
        }
-       fifo->write = fifo_write;
+       smp_store_release(&fifo->write, fifo_write);
 
        return i;
 }
@@ -54,12 +62,12 @@ kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
 /**
  * Get up to num elements from the fifo. Return the number actully read
  */
-static inline unsigned
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
+static inline uint32_t
+kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
 {
-       unsigned i = 0;
-       unsigned new_read = fifo->read;
-       unsigned fifo_write = fifo->write;
+       uint32_t i = 0;
+       uint32_t new_read = fifo->read;
+       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, unsigned 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;
 }
@@ -76,19 +84,23 @@ kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
 /**
  * Get the num of elements in the fifo
  */
-static inline unsigned
+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);
 }
 
 /**
  * Get the num of available elements in the fifo
  */
-static inline unsigned
+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
@@ -96,7 +108,7 @@ kni_fifo_free_count(struct rte_kni_fifo *fifo)
  * Initializes the kni fifo structure
  */
 static inline void
-kni_fifo_init(struct rte_kni_fifo *fifo, unsigned size)
+kni_fifo_init(struct rte_kni_fifo *fifo, uint32_t size)
 {
        fifo->write = 0;
        fifo->read = 0;