> On Aug 2, 2024, at 00:03, Morten Brørup <m...@smartsharesystems.com> wrote: > > External email: Use caution opening links or attachments > > > 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 <m...@smartsharesystems.com> > --- > 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 >
Reviewed-by: Chenbo Xia <chen...@nvidia.com>