X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fdevices%2Fdpdk%2Fdpdk_priv.h;h=fd4f2d7ed0b565d7cc9fbeccce62fe09afd6a253;hb=c631f2de6dd06b4cbb92bf8398839b882344fd25;hp=a0fa38a471227d4b5443dfc61925f49bc195515b;hpb=7a2a378d2dcdba900651b02859b686cafe6dfd22;p=vpp.git diff --git a/vnet/vnet/devices/dpdk/dpdk_priv.h b/vnet/vnet/devices/dpdk/dpdk_priv.h index a0fa38a4712..fd4f2d7ed0b 100644 --- a/vnet/vnet/devices/dpdk/dpdk_priv.h +++ b/vnet/vnet/devices/dpdk/dpdk_priv.h @@ -17,16 +17,25 @@ #define DPDK_NB_TX_DESC_DEFAULT 512 #define DPDK_NB_RX_DESC_VIRTIO 256 #define DPDK_NB_TX_DESC_VIRTIO 256 -#define DPDK_NB_RX_DESC_10GE 2048 -#define DPDK_NB_TX_DESC_10GE 2048 -#define DPDK_NB_RX_DESC_40GE (4096-128) -#define DPDK_NB_TX_DESC_40GE 2048 +#define DPDK_NB_RX_DESC_10GE 1024 +#define DPDK_NB_TX_DESC_10GE 1024 +#define DPDK_NB_RX_DESC_40GE 1024 +#define DPDK_NB_TX_DESC_40GE 1024 +#define DPDK_NB_RX_DESC_ENIC 1024 + +#if RTE_VERSION >= RTE_VERSION_NUM(16, 7, 0, 0) +#define I40E_DEV_ID_SFP_XL710 0x1572 +#define I40E_DEV_ID_QSFP_A 0x1583 +#define I40E_DEV_ID_QSFP_B 0x1584 +#define I40E_DEV_ID_QSFP_C 0x1585 +#define I40E_DEV_ID_10G_BASE_T 0x1586 +#define I40E_DEV_ID_VF 0x154C +#endif /* These args appear by themselves */ #define foreach_eal_double_hyphen_predicate_arg \ _(no-shconf) \ _(no-hpet) \ -_(no-pci) \ _(no-huge) \ _(vmware-tsc-map) \ _(virtio-vhost) @@ -47,171 +56,85 @@ _(proc-type) \ _(file-prefix) \ _(vdev) -static inline u32 -dpdk_rx_burst ( dpdk_main_t * dm, dpdk_device_t * xd, u16 queue_id) +static inline void +dpdk_get_xstats (dpdk_device_t * xd) { - u32 n_buffers; - u32 n_left; - u32 n_this_chunk; - - n_left = VLIB_FRAME_SIZE; - n_buffers = 0; - - if (PREDICT_TRUE(xd->dev_type == VNET_DPDK_DEV_ETH)) - { - while (n_left) - { - n_this_chunk = rte_eth_rx_burst (xd->device_index, queue_id, - xd->rx_vectors[queue_id] + n_buffers, n_left); - n_buffers += n_this_chunk; - n_left -= n_this_chunk; - - /* Empirically, DPDK r1.8 produces vectors w/ 32 or fewer elts */ - if (n_this_chunk < 32) - break; - } - } - else if (xd->dev_type == VNET_DPDK_DEV_VHOST_USER) + int len; + if ((len = rte_eth_xstats_get (xd->device_index, NULL, 0)) > 0) { - vlib_main_t * vm = vlib_get_main(); - vlib_buffer_main_t * bm = vm->buffer_main; - unsigned socket_id = rte_socket_id(); - u32 offset = 0; - -#if RTE_VERSION >= RTE_VERSION_NUM(2, 2, 0, 0) - offset = queue_id * VIRTIO_QNUM; - - struct vhost_virtqueue *vq = - xd->vu_vhost_dev.virtqueue[offset + VIRTIO_TXQ]; - - if (PREDICT_FALSE(!vq->enabled)) - return 0; -#else - if (PREDICT_FALSE(!xd->vu_is_running)) - return 0; -#endif + vec_validate (xd->xstats, len - 1); + vec_validate (xd->last_cleared_xstats, len - 1); - n_buffers = rte_vhost_dequeue_burst(&xd->vu_vhost_dev, offset + VIRTIO_TXQ, - bm->pktmbuf_pools[socket_id], - xd->rx_vectors[queue_id], VLIB_FRAME_SIZE); + len = + rte_eth_xstats_get (xd->device_index, xd->xstats, + vec_len (xd->xstats)); - int i; u32 bytes = 0; - struct rte_mbuf **pkts = xd->rx_vectors[queue_id]; - for (i = 0; i < n_buffers; i++) { - struct rte_mbuf *buff = pkts[i]; - bytes += rte_pktmbuf_data_len(buff); - } + ASSERT (vec_len (xd->xstats) == len); + ASSERT (vec_len (xd->last_cleared_xstats) == len); - f64 now = vlib_time_now (vm); + _vec_len (xd->xstats) = len; + _vec_len (xd->last_cleared_xstats) = len; - dpdk_vu_vring *vring = NULL; - /* send pending interrupts if needed */ - if (dpdk_vhost_user_want_interrupt(xd, offset + VIRTIO_TXQ)) { - vring = &(xd->vu_intf->vrings[offset + VIRTIO_TXQ]); - vring->n_since_last_int += n_buffers; - - if ((vring->n_since_last_int && (vring->int_deadline < now)) - || (vring->n_since_last_int > dm->vhost_coalesce_frames)) - dpdk_vhost_user_send_interrupt(vm, xd, offset + VIRTIO_TXQ); - } - - vring = &(xd->vu_intf->vrings[offset + VIRTIO_RXQ]); - vring->packets += n_buffers; - vring->bytes += bytes; - - if (dpdk_vhost_user_want_interrupt(xd, offset + VIRTIO_RXQ)) { - if (vring->n_since_last_int && (vring->int_deadline < now)) - dpdk_vhost_user_send_interrupt(vm, xd, offset + VIRTIO_RXQ); - } - - } -#ifdef RTE_LIBRTE_KNI - else if (xd->dev_type == VNET_DPDK_DEV_KNI) - { - n_buffers = rte_kni_rx_burst(xd->kni, xd->rx_vectors[queue_id], VLIB_FRAME_SIZE); - rte_kni_handle_request(xd->kni); - } -#endif - else - { - ASSERT(0); } - - return n_buffers; } static inline void dpdk_update_counters (dpdk_device_t * xd, f64 now) { - vlib_simple_counter_main_t * cm; - vnet_main_t * vnm = vnet_get_main(); - u32 my_cpu = os_get_cpu_number(); + vlib_simple_counter_main_t *cm; + vnet_main_t *vnm = vnet_get_main (); + u32 my_cpu = os_get_cpu_number (); u64 rxerrors, last_rxerrors; - int len; /* only update counters for PMD interfaces */ - if (xd->dev_type != VNET_DPDK_DEV_ETH) + if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0) return; - /* - * DAW-FIXME: VMXNET3 device stop/start doesn't work, - * therefore fake the stop in the dpdk driver by - * silently dropping all of the incoming pkts instead of - * stopping the driver / hardware. - */ - if (xd->admin_up != 0xff) + xd->time_last_stats_update = now ? now : xd->time_last_stats_update; + clib_memcpy (&xd->last_stats, &xd->stats, sizeof (xd->last_stats)); + rte_eth_stats_get (xd->device_index, &xd->stats); + + /* maybe bump interface rx no buffer counter */ + if (PREDICT_FALSE (xd->stats.rx_nombuf != xd->last_stats.rx_nombuf)) { - xd->time_last_stats_update = now ? now : xd->time_last_stats_update; - memcpy (&xd->last_stats, &xd->stats, sizeof (xd->last_stats)); - rte_eth_stats_get (xd->device_index, &xd->stats); - - /* maybe bump interface rx no buffer counter */ - if (PREDICT_FALSE (xd->stats.rx_nombuf != xd->last_stats.rx_nombuf)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_NO_BUF); - - vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, - xd->stats.rx_nombuf - - xd->last_stats.rx_nombuf); - } - - /* missed pkt counter */ - if (PREDICT_FALSE (xd->stats.imissed != xd->last_stats.imissed)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_MISS); - - vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, - xd->stats.imissed - - xd->last_stats.imissed); - } -#if RTE_VERSION >= RTE_VERSION_NUM(2, 2, 0, 0) - rxerrors = xd->stats.ierrors; - last_rxerrors = xd->last_stats.ierrors; -#else - rxerrors = xd->stats.ibadcrc - + xd->stats.ibadlen + xd->stats.ierrors; - last_rxerrors = xd->last_stats.ibadcrc - + xd->last_stats.ibadlen + xd->last_stats.ierrors; -#endif + cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, + VNET_INTERFACE_COUNTER_RX_NO_BUF); - if (PREDICT_FALSE (rxerrors != last_rxerrors)) - { - cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, - VNET_INTERFACE_COUNTER_RX_ERROR); + vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, + xd->stats.rx_nombuf - + xd->last_stats.rx_nombuf); + } - vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, - rxerrors - last_rxerrors); - } + /* missed pkt counter */ + if (PREDICT_FALSE (xd->stats.imissed != xd->last_stats.imissed)) + { + cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, + VNET_INTERFACE_COUNTER_RX_MISS); + + vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, + xd->stats.imissed - + xd->last_stats.imissed); } + rxerrors = xd->stats.ierrors; + last_rxerrors = xd->last_stats.ierrors; - if ((len = rte_eth_xstats_get(xd->device_index, NULL, 0)) > 0) + if (PREDICT_FALSE (rxerrors != last_rxerrors)) { - vec_validate(xd->xstats, len - 1); - len = rte_eth_xstats_get(xd->device_index, xd->xstats, vec_len(xd->xstats)); - ASSERT(vec_len(xd->xstats) == len); - _vec_len(xd->xstats) = len; + cm = vec_elt_at_index (vnm->interface_main.sw_if_counters, + VNET_INTERFACE_COUNTER_RX_ERROR); + + vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index, + rxerrors - last_rxerrors); } + + dpdk_get_xstats (xd); } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */