+static_always_inline uword
+rdma_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
+ vlib_frame_t * frame, rdma_device_t * rd, u16 qid)
+{
+ vnet_main_t *vnm = vnet_get_main ();
+ rdma_rxq_t *rxq = vec_elt_at_index (rd->rxqs, qid);
+ struct ibv_wc wc[VLIB_FRAME_SIZE];
+ u32 bufsz[VLIB_FRAME_SIZE];
+ vlib_buffer_t *bufs[VLIB_FRAME_SIZE];
+ u32 *to_next, n_left_to_next;
+ u32 n_rx_packets, n_rx_bytes;
+
+ n_rx_packets = ibv_poll_cq (rxq->cq, VLIB_FRAME_SIZE, wc);
+
+ if (PREDICT_FALSE (n_rx_packets <= 0))
+ {
+ rdma_device_input_refill (vm, rd, rxq);
+ return 0;
+ }
+
+ vlib_get_new_next_frame (vm, node, rd->per_interface_next_index, to_next,
+ n_left_to_next);
+ n_rx_bytes = rdma_device_input_load_wc (n_rx_packets, wc, to_next, bufsz);
+ vlib_get_buffers (vm, to_next, bufs, n_rx_packets);
+ rdma_device_input_bufs_init (n_rx_packets, bufs, bufsz, rd->sw_if_index);
+ rdma_device_input_trace (vm, node, rd, n_rx_packets, to_next);
+ rdma_device_input_ethernet (vm, node, rd);
+
+ vlib_put_next_frame (vm, node, rd->per_interface_next_index,
+ n_left_to_next - n_rx_packets);