• Jakub Kicinski's avatar
    inet: bring NLM_DONE out to a separate recv() again · 460b0d33
    Jakub Kicinski authored
    Commit under Fixes optimized the number of recv() calls
    needed during RTM_GETROUTE dumps, but we got multiple
    reports of applications hanging on recv() calls.
    Applications expect that a route dump will be terminated
    with a recv() reading an individual NLM_DONE message.
    
    Coalescing NLM_DONE is perfectly legal in netlink,
    but even tho reporters fixed the code in respective
    projects, chances are it will take time for those
    applications to get updated. So revert to old behavior
    (for now)?
    
    Old kernel (5.19):
    
     $ ./cli.py --dbg-small-recv 4096 --spec netlink/specs/rt_route.yaml \
                --dump getroute --json '{"rtm-family": 2}'
     Recv: read 692 bytes, 11 messages
       nl_len = 68 (52) nl_flags = 0x22 nl_type = 24
     ...
       nl_len = 60 (44) nl_flags = 0x22 nl_type = 24
     Recv: read 20 bytes, 1 messages
       nl_len = 20 (4) nl_flags = 0x2 nl_type = 3
    
    Before (6.9-rc2):
    
     $ ./cli.py --dbg-small-recv 4096 --spec netlink/specs/rt_route.yaml \
                --dump getroute --json '{"rtm-family": 2}'
     Recv: read 712 bytes, 12 messages
       nl_len = 68 (52) nl_flags = 0x22 nl_type = 24
     ...
       nl_len = 60 (44) nl_flags = 0x22 nl_type = 24
       nl_len = 20 (4) nl_flags = 0x2 nl_type = 3
    
    After:
    
     $ ./cli.py --dbg-small-recv 4096 --spec netlink/specs/rt_route.yaml \
                --dump getroute --json '{"rtm-family": 2}'
     Recv: read 692 bytes, 11 messages
       nl_len = 68 (52) nl_flags = 0x22 nl_type = 24
     ...
       nl_len = 60 (44) nl_flags = 0x22 nl_type = 24
     Recv: read 20 bytes, 1 messages
       nl_len = 20 (4) nl_flags = 0x2 nl_type = 3
    Reported-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Link: https://lore.kernel.org/all/20240315124808.033ff58d@elisabethReported-by: default avatarIlya Maximets <i.maximets@ovn.org>
    Link: https://lore.kernel.org/all/02b50aae-f0e9-47a4-8365-a977a85975d3@ovn.org
    Fixes: 4ce5dc93 ("inet: switch inet_dump_fib() to RCU protection")
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    Tested-by: default avatarIlya Maximets <i.maximets@ovn.org>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    460b0d33
fib_frontend.c 39.6 KB