eal: check if running in interrupt context
[dpdk.git] / lib / librte_vhost / vhost.h
index c76d401..686ce42 100644 (file)
 
 #define VHOST_LOG_CACHE_NR 32
 
+#define PACKED_DESC_ENQUEUE_USED_FLAG(w)       \
+       ((w) ? (VRING_DESC_F_AVAIL | VRING_DESC_F_USED | VRING_DESC_F_WRITE) : \
+               VRING_DESC_F_WRITE)
+#define PACKED_DESC_DEQUEUE_USED_FLAG(w)       \
+       ((w) ? (VRING_DESC_F_AVAIL | VRING_DESC_F_USED) : 0x0)
+#define PACKED_DESC_SINGLE_DEQUEUE_FLAG (VRING_DESC_F_NEXT | \
+                                        VRING_DESC_F_INDIRECT)
+
+#define PACKED_BATCH_SIZE (RTE_CACHE_LINE_SIZE / \
+                           sizeof(struct vring_packed_desc))
+#define PACKED_BATCH_MASK (PACKED_BATCH_SIZE - 1)
+
+#ifdef VHOST_GCC_UNROLL_PRAGMA
+#define vhost_for_each_try_unroll(iter, val, size) _Pragma("GCC unroll 4") \
+       for (iter = val; iter < size; iter++)
+#endif
+
+#ifdef VHOST_CLANG_UNROLL_PRAGMA
+#define vhost_for_each_try_unroll(iter, val, size) _Pragma("unroll 4") \
+       for (iter = val; iter < size; iter++)
+#endif
+
+#ifdef VHOST_ICC_UNROLL_PRAGMA
+#define vhost_for_each_try_unroll(iter, val, size) _Pragma("unroll (4)") \
+       for (iter = val; iter < size; iter++)
+#endif
+
+#ifndef vhost_for_each_try_unroll
+#define vhost_for_each_try_unroll(iter, val, num) \
+       for (iter = val; iter < num; iter++)
+#endif
+
 /**
  * Structure contains buffer address, length and descriptor index
  * from vring to do scatter RX.
@@ -84,6 +116,7 @@ struct log_cache_entry {
 
 struct vring_used_elem_packed {
        uint16_t id;
+       uint16_t flags;
        uint32_t len;
        uint32_t count;
 };
@@ -147,6 +180,10 @@ struct vhost_virtqueue {
                struct vring_used_elem_packed *shadow_used_packed;
        };
        uint16_t                shadow_used_idx;
+       /* Record packed ring enqueue latest desc cache aligned index */
+       uint16_t                shadow_aligned_idx;
+       /* Record packed ring first dequeue desc index */
+       uint16_t                shadow_last_used_idx;
        struct vhost_vring_addr ring_addrs;
 
        struct batch_copy_elem  *batch_copy_elems;
@@ -367,6 +404,26 @@ desc_is_avail(struct vring_packed_desc *desc, bool wrap_counter)
                wrap_counter != !!(flags & VRING_DESC_F_USED);
 }
 
+static inline void
+vq_inc_last_used_packed(struct vhost_virtqueue *vq, uint16_t num)
+{
+       vq->last_used_idx += num;
+       if (vq->last_used_idx >= vq->size) {
+               vq->used_wrap_counter ^= 1;
+               vq->last_used_idx -= vq->size;
+       }
+}
+
+static inline void
+vq_inc_last_avail_packed(struct vhost_virtqueue *vq, uint16_t num)
+{
+       vq->last_avail_idx += num;
+       if (vq->last_avail_idx >= vq->size) {
+               vq->avail_wrap_counter ^= 1;
+               vq->last_avail_idx -= vq->size;
+       }
+}
+
 void __vhost_log_cache_write(struct virtio_net *dev,
                struct vhost_virtqueue *vq,
                uint64_t addr, uint64_t len);
@@ -441,14 +498,21 @@ vhost_log_write_iova(struct virtio_net *dev, struct vhost_virtqueue *vq,
                __vhost_log_write(dev, iova, len);
 }
 
-/* Macros for printing using RTE_LOG */
-#define RTE_LOGTYPE_VHOST_CONFIG RTE_LOGTYPE_USER1
-#define RTE_LOGTYPE_VHOST_DATA   RTE_LOGTYPE_USER1
+extern int vhost_config_log_level;
+extern int vhost_data_log_level;
+
+#define VHOST_LOG_CONFIG(level, fmt, args...)                  \
+       rte_log(RTE_LOG_ ## level, vhost_config_log_level,      \
+               "VHOST_CONFIG: " fmt, ##args)
+
+#define VHOST_LOG_DATA(level, fmt, args...) \
+       (void)((RTE_LOG_ ## level <= RTE_LOG_DP_LEVEL) ?        \
+        rte_log(RTE_LOG_ ## level,  vhost_data_log_level,      \
+               "VHOST_DATA : " fmt, ##args) :                  \
+        0)
 
 #ifdef RTE_LIBRTE_VHOST_DEBUG
 #define VHOST_MAX_PRINT_BUFF 6072
-#define VHOST_LOG_DEBUG(log_type, fmt, args...) \
-       RTE_LOG(DEBUG, log_type, fmt, ##args)
 #define PRINT_PACKET(device, addr, size, header) do { \
        char *pkt_addr = (char *)(addr); \
        unsigned int index; \
@@ -464,10 +528,9 @@ vhost_log_write_iova(struct virtio_net *dev, struct vhost_virtqueue *vq,
        } \
        snprintf(packet + strnlen(packet, VHOST_MAX_PRINT_BUFF), VHOST_MAX_PRINT_BUFF - strnlen(packet, VHOST_MAX_PRINT_BUFF), "\n"); \
        \
-       VHOST_LOG_DEBUG(VHOST_DATA, "%s", packet); \
+       VHOST_LOG_DATA(DEBUG, "%s", packet); \
 } while (0)
 #else
-#define VHOST_LOG_DEBUG(log_type, fmt, args...) do {} while (0)
 #define PRINT_PACKET(device, addr, size, header) do {} while (0)
 #endif
 
@@ -521,7 +584,7 @@ get_device(int vid)
        struct virtio_net *dev = vhost_devices[vid];
 
        if (unlikely(!dev)) {
-               RTE_LOG(ERR, VHOST_CONFIG,
+               VHOST_LOG_CONFIG(ERR,
                        "(%d) device not found.\n", vid);
        }
 
@@ -607,7 +670,7 @@ vhost_vring_call_split(struct virtio_net *dev, struct vhost_virtqueue *vq)
                vq->signalled_used = new;
                vq->signalled_used_valid = true;
 
-               VHOST_LOG_DEBUG(VHOST_DATA, "%s: used_event_idx=%d, old=%d, new=%d\n",
+               VHOST_LOG_DATA(DEBUG, "%s: used_event_idx=%d, old=%d, new=%d\n",
                        __func__,
                        vhost_used_event(vq),
                        old, new);