• Rafał Miłecki's avatar
    net: broadcom: bcm4908_enet: use build_skb() · 3a1cc23a
    Rafał Miłecki authored
    RX code can be more efficient with the build_skb(). Allocating actual
    SKB around eth packet buffer - right before passing it up - results in
    a better cache usage.
    
    Without RPS (echo 0 > rps_cpus) BCM4908 NAT masq performance "jumps"
    between two speeds: ~900 Mbps and 940 Mbps (it's a 4 CPUs SoC). This
    change bumps the lower speed from 905 Mb/s to 918 Mb/s (tested using
    single stream iperf 2.0.5 traffic).
    
    There are more optimizations to consider. One obvious to try is GRO
    however as BCM4908 doesn't do hw csum is may actually lower performance.
    Sometimes. Some early testing:
    
    ┌─────────────────────────────────┬─────────────────────┬────────────────────┐
    │                                 │ netif_receive_skb() │ napi_gro_receive() │
    ├─────────────────────────────────┼─────────────────────┼────────────────────┤
    │ netdev_alloc_skb()              │            905 Mb/s │           892 Mb/s │
    │ napi_alloc_frag() + build_skb() │            918 Mb/s │           917 Mb/s │
    └─────────────────────────────────┴─────────────────────┴────────────────────┘
    
    Another ideas:
    1. napi_build_skb()
    2. skb_copy_from_linear_data() for small packets
    
    Those need proper testing first though. That can be done later.
    Signed-off-by: default avatarRafał Miłecki <rafal@milecki.pl>
    Link: https://lore.kernel.org/r/20221025132245.22871-1-zajec5@gmail.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    3a1cc23a
bcm4908_enet.c 21.2 KB