• Amit Cohen's avatar
    netdevsim: fib: Perform the route programming in a non-atomic context · 0ae3eb7b
    Amit Cohen authored
    Currently, netdevsim implements dummy FIB offload and marks notified
    routes with RTM_F_TRAP flag. netdevsim does not defer route notifications
    to a work queue because it does not need to program any hardware.
    
    Given that netdevsim's purpose is to both give an example implementation
    and allow developers to test their code, align netdevsim to a "real"
    hardware device driver like mlxsw and have it also perform the route
    "programming" in a non-atomic context.
    
    It will be used to test route flags notifications which will be added in
    the next patches.
    
    The following changes are needed when route handling is performed in WQ:
    - Handle the accounting in the main context, to be able to return an
      error for adding route when all the routes are used.
      For FIB_EVENT_ENTRY_REPLACE increase the counter before scheduling
      the delayed work, and in case that this event replaces an existing route,
      decrease the counter as part of the delayed work.
    
    - For IPv6, cannot use fen6_info->rt->fib6_siblings list because it
      might be changed during handling the delayed work.
      Save an array with the nexthops as part of fib6_event struct, and take
      a reference for each nexthop to prevent them from being freed while
      event is queued.
    
    - Change GFP_ATOMIC allocations to GFP_KERNEL.
    
    - Use single work item that is handling a list of ordered routes.
      Handling routes must be processed in the order they were submitted to
      avoid logical errors that could lead to unexpected failures.
    Signed-off-by: default avatarAmit Cohen <amcohen@nvidia.com>
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Acked-by: default avatarDavid Ahern <dsahern@kernel.org>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    0ae3eb7b
fib.c 33.1 KB