• Ido Schimmel's avatar
    nexthop: Make nexthop bucket dump more efficient · f10d3d9d
    Ido Schimmel authored
    rtm_dump_nexthop_bucket_nh() is used to dump nexthop buckets belonging
    to a specific resilient nexthop group. The function returns a positive
    return code (the skb length) upon both success and failure.
    
    The above behavior is problematic. When a complete nexthop bucket dump
    is requested, the function that walks the different nexthops treats the
    non-zero return code as an error. This causes buckets belonging to
    different resilient nexthop groups to be dumped using different buffers
    even if they can all fit in the same buffer:
    
     # ip link add name dummy1 up type dummy
     # ip nexthop add id 1 dev dummy1
     # ip nexthop add id 10 group 1 type resilient buckets 1
     # ip nexthop add id 20 group 1 type resilient buckets 1
     # strace -e recvmsg -s 0 ip nexthop bucket
     [...]
     recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[...], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 64
     id 10 index 0 idle_time 10.27 nhid 1
     [...]
     recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[...], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 64
     id 20 index 0 idle_time 6.44 nhid 1
     [...]
    
    Fix by only returning a non-zero return code when an error occurred and
    restarting the dump from the bucket index we failed to fill in. This
    allows buckets belonging to different resilient nexthop groups to be
    dumped using the same buffer:
    
     # ip link add name dummy1 up type dummy
     # ip nexthop add id 1 dev dummy1
     # ip nexthop add id 10 group 1 type resilient buckets 1
     # ip nexthop add id 20 group 1 type resilient buckets 1
     # strace -e recvmsg -s 0 ip nexthop bucket
     [...]
     recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[...], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 128
     id 10 index 0 idle_time 30.21 nhid 1
     id 20 index 0 idle_time 26.7 nhid 1
     [...]
    
    While this change is more of a performance improvement change than an
    actual bug fix, it is a prerequisite for a subsequent patch that does
    fix a bug.
    
    Fixes: 8a1bbabb ("nexthop: Add netlink handlers for bucket dump")
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Link: https://lore.kernel.org/r/20230808075233.3337922-3-idosch@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    f10d3d9d
nexthop.c 90.8 KB