virtio: add the buffer allocation error

Type: improvement

Change-Id: I991e32d531719693c387db4ef93d04d4b562789d
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
diff --git a/src/vnet/devices/virtio/node.c b/src/vnet/devices/virtio/node.c
index 9611271..63e40da 100644
--- a/src/vnet/devices/virtio/node.c
+++ b/src/vnet/devices/virtio/node.c
@@ -35,6 +35,7 @@
 
 
 #define foreach_virtio_input_error \
+  _(BUFFER_ALLOC, "buffer alloc error") \
   _(UNKNOWN, "unknown")
 
 typedef enum
@@ -81,9 +82,9 @@
 static_always_inline void
 virtio_refill_vring (vlib_main_t * vm, virtio_if_t * vif,
 		     virtio_if_type_t type, virtio_vring_t * vring,
-		     const int hdr_sz)
+		     const int hdr_sz, u32 node_index)
 {
-  u16 used, next, avail, n_slots;
+  u16 used, next, avail, n_slots, n_refill;
   u16 sz = vring->size;
   u16 mask = sz - 1;
 
@@ -94,17 +95,22 @@
     return;
 
   /* deliver free buffers in chunks of 64 */
-  n_slots = clib_min (sz - used, 64);
+  n_refill = clib_min (sz - used, 64);
 
   next = vring->desc_next;
   avail = vring->avail->idx;
   n_slots =
     vlib_buffer_alloc_to_ring_from_pool (vm, vring->buffers, next,
-					 vring->size, n_slots,
+					 vring->size, n_refill,
 					 vring->buffer_pool_index);
 
-  if (n_slots == 0)
-    return;
+  if (PREDICT_FALSE (n_slots != n_refill))
+    {
+      vlib_error_count (vm, node_index,
+			VIRTIO_INPUT_ERROR_BUFFER_ALLOC, n_refill - n_slots);
+      if (n_slots == 0)
+	return;
+    }
 
   while (n_slots)
     {
@@ -413,7 +419,7 @@
 				   n_rx_bytes);
 
 refill:
-  virtio_refill_vring (vm, vif, type, vring, hdr_sz);
+  virtio_refill_vring (vm, vif, type, vring, hdr_sz, node->node_index);
 
   return n_rx_packets;
 }