From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4C72045713; Thu, 1 Aug 2024 18:03:22 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 39E22433F1; Thu, 1 Aug 2024 18:03:22 +0200 (CEST) Received: from dkmailrelay1.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id 3DB1E40E12 for ; Thu, 1 Aug 2024 18:03:20 +0200 (CEST) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesys.local [192.168.4.10]) by dkmailrelay1.smartsharesystems.com (Postfix) with ESMTP id 0E1692032B; Thu, 1 Aug 2024 18:03:20 +0200 (CEST) Received: from dkrd4.smartsharesys.local ([192.168.4.26]) by smartserver.smartsharesystems.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 1 Aug 2024 18:03:19 +0200 From: =?UTF-8?q?Morten=20Br=C3=B8rup?= To: maxime.coquelin@redhat.com, chenbox@nvidia.com Cc: stephen@networkplumber.org, dev@dpdk.org, =?UTF-8?q?Morten=20Br=C3=B8rup?= Subject: [PATCH v5] virtio: optimize stats counters performance Date: Thu, 1 Aug 2024 16:03:12 +0000 Message-ID: <20240801160312.205281-1-mb@smartsharesystems.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240731131744.36448-1-mb@smartsharesystems.com> References: <20240731131744.36448-1-mb@smartsharesystems.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 01 Aug 2024 16:03:19.0215 (UTC) FILETIME=[538ACBF0:01DAE42C] X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Optimized the performance of updating the virtio statistics counters by reducing the number of branches. Ordered the packet size comparisons according to the probability with typical internet traffic mix. Signed-off-by: Morten Brørup --- v5: * Do not inline the function. (Stephen) v4: * Consider multicast/broadcast packets unlikely. v3: * Eliminated a local variable. * Note: Substituted sizeof(uint32_t)*4 by 32UL, using unsigned long type to keep optimal offsetting in generated assembler output. * Removed unnecessary curly braces. v2: * Fixed checkpatch warning about line length. --- drivers/net/virtio/virtio_rxtx.c | 39 ++++++++++++-------------------- drivers/net/virtio/virtio_rxtx.h | 4 ++-- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index f69b9453a2..b67f063b31 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -82,37 +82,26 @@ vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) } void -virtio_update_packet_stats(struct virtnet_stats *stats, struct rte_mbuf *mbuf) +virtio_update_packet_stats(struct virtnet_stats *const stats, + const struct rte_mbuf *const mbuf) { uint32_t s = mbuf->pkt_len; - struct rte_ether_addr *ea; + const struct rte_ether_addr *const ea = + rte_pktmbuf_mtod(mbuf, const struct rte_ether_addr *); stats->bytes += s; - if (s == 64) { - stats->size_bins[1]++; - } else if (s > 64 && s < 1024) { - uint32_t bin; - - /* count zeros, and offset into correct bin */ - bin = (sizeof(s) * 8) - rte_clz32(s) - 5; - stats->size_bins[bin]++; - } else { - if (s < 64) - stats->size_bins[0]++; - else if (s < 1519) - stats->size_bins[6]++; - else - stats->size_bins[7]++; - } + if (s >= 1024) + stats->size_bins[6 + (s > 1518)]++; + else if (s <= 64) + stats->size_bins[s >> 6]++; + else + stats->size_bins[32UL - rte_clz32(s) - 5]++; - ea = rte_pktmbuf_mtod(mbuf, struct rte_ether_addr *); - if (rte_is_multicast_ether_addr(ea)) { - if (rte_is_broadcast_ether_addr(ea)) - stats->broadcast++; - else - stats->multicast++; - } + RTE_BUILD_BUG_ON(offsetof(struct virtnet_stats, broadcast) != + offsetof(struct virtnet_stats, multicast) + sizeof(uint64_t)); + if (unlikely(rte_is_multicast_ether_addr(ea))) + (&stats->multicast)[rte_is_broadcast_ether_addr(ea)]++; } static inline void diff --git a/drivers/net/virtio/virtio_rxtx.h b/drivers/net/virtio/virtio_rxtx.h index afc4b74534..68034c914b 100644 --- a/drivers/net/virtio/virtio_rxtx.h +++ b/drivers/net/virtio/virtio_rxtx.h @@ -35,7 +35,7 @@ struct virtnet_tx { }; int virtio_rxq_vec_setup(struct virtnet_rx *rxvq); -void virtio_update_packet_stats(struct virtnet_stats *stats, - struct rte_mbuf *mbuf); +void virtio_update_packet_stats(struct virtnet_stats *const stats, + const struct rte_mbuf *const mbuf); #endif /* _VIRTIO_RXTX_H_ */ -- 2.43.0