Skip to content
  • Paul Blakey's avatar
    89e39467
    net/mlx5e: Fix CT rule + encap slow path offload and deletion · 89e39467
    Paul Blakey authored
    Currently, if a neighbour isn't valid when offloading tunnel encap rules,
    we offload the original match and replace the original action with
    "goto slow path" action. For this we use a temporary flow attribute based
    on the original flow attribute and then change the action. Flow flags,
    which among those is the CT flag, are still shared for the slow path rule
    offload, so we end up parsing this flow as a CT + goto slow path rule.
    
    Besides being unnecessary, CT action offload saves extra information in
    the passed flow attribute, such as created ct_flow and mod_hdr, which
    is lost onces the temporary flow attribute is freed.
    
    When a neigh is updated and is valid, we offload the original CT rule
    with original CT action, which again creates a ct_flow and mod_hdr
    and saves it in the flow's original attribute. Then we delete the slow
    path rule with a temporary flow attribute based on original updated
    flow attribute, and we free the relevant ct_flow and mod_hdr.
    
    Then when tc deletes this flow, we try to free the ct_flow and mod_hdr
    on the flow's attribute again.
    
    To fix the issue, skip all furture proccesing (CT/Sample/Split rules)
    in offload/unoffload of slow path rules.
    
    Call trace:
    [  758.850525] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000218
    [  758.952987] Internal error: Oops: 96000005 [#1] PREEMPT SMP
    [  758.964170] Modules linked in: act_csum(E) act_pedit(E) act_tunnel_key(E) act_ct(E) nf_flow_table(E) xt_nat(E) ip6table_filter(E) ip6table_nat(E) xt_comment(E) ip6_tables(E) xt_conntrack(E) xt_MASQUERADE(E) nf_conntrack_netlink(E) xt_addrtype(E) iptable_filter(E) iptable_nat(E) bpfilter(E) br_netfilter(E) bridge(E) stp(E) llc(E) xfrm_user(E) overlay(E) act_mirred(E) act_skbedit(E) rdma_ucm(OE) rdma_cm(OE) iw_cm(OE) ib_ipoib(OE) ib_cm(OE) ib_umad(OE) esp6_offload(E) esp6(E) esp4_offload(E) esp4(E) xfrm_algo(E) mlx5_ib(OE) ib_uverbs(OE) geneve(E) ip6_udp_tunnel(E) udp_tunnel(E) nfnetlink_cttimeout(E) nfnetlink(E) mlx5_core(OE) act_gact(E) cls_flower(E) sch_ingress(E) openvswitch(E) nsh(E) nf_conncount(E) nf_nat(E) mlxfw(OE) psample(E) nf_conntrack(E) nf_defrag_ipv4(E) vfio_mdev(E) mdev(E) ib_core(OE) mlx_compat(OE) crct10dif_ce(E) uio_pdrv_genirq(E) uio(E) i2c_mlx(E) mlxbf_pmc(E) sbsa_gwdt(E) mlxbf_gige(E) gpio_mlxbf2(E) mlxbf_pka(E) mlx_trio(E) mlx_bootctl(E) bluefield_edac(E) knem(O)
    [  758.964225]  ip_tables(E) mlxbf_tmfifo(E) ipv6(E) crc_ccitt(E) nf_defrag_ipv6(E)
    [  759.154186] CPU: 5 PID: 122 Comm: kworker/u16:1 Tainted: G           OE     5.4.60-mlnx.52.gde81e85 #1
    [  759.172870] Hardware name: https://www.mellanox.com
    
     BlueField SoC/BlueField SoC, BIOS BlueField:3.5.0-2-gc1b5d64 Jan  4 2021
    [  759.195466] Workqueue: mlx5e mlx5e_rep_neigh_update [mlx5_core]
    [  759.207344] pstate: a0000005 (NzCv daif -PAN -UAO)
    [  759.217003] pc : mlx5_del_flow_rules+0x5c/0x160 [mlx5_core]
    [  759.228229] lr : mlx5_del_flow_rules+0x34/0x160 [mlx5_core]
    [  759.405858] Call trace:
    [  759.410804]  mlx5_del_flow_rules+0x5c/0x160 [mlx5_core]
    [  759.421337]  __mlx5_eswitch_del_rule.isra.43+0x5c/0x1c8 [mlx5_core]
    [  759.433963]  mlx5_eswitch_del_offloaded_rule_ct+0x34/0x40 [mlx5_core]
    [  759.446942]  mlx5_tc_rule_delete_ct+0x68/0x74 [mlx5_core]
    [  759.457821]  mlx5_tc_ct_delete_flow+0x160/0x21c [mlx5_core]
    [  759.469051]  mlx5e_tc_unoffload_fdb_rules+0x158/0x168 [mlx5_core]
    [  759.481325]  mlx5e_tc_encap_flows_del+0x140/0x26c [mlx5_core]
    [  759.492901]  mlx5e_rep_update_flows+0x11c/0x1ec [mlx5_core]
    [  759.504127]  mlx5e_rep_neigh_update+0x160/0x200 [mlx5_core]
    [  759.515314]  process_one_work+0x178/0x400
    [  759.523350]  worker_thread+0x58/0x3e8
    [  759.530685]  kthread+0x100/0x12c
    [  759.537152]  ret_from_fork+0x10/0x18
    [  759.544320] Code: 97ffef55 51000673 3100067f 54ffff41 (b9421ab3)
    [  759.556548] ---[ end trace fab818bb1085832d ]---
    
    Fixes: 4c3844d9 ("net/mlx5e: CT: Introduce connection tracking")
    Signed-off-by: default avatarPaul Blakey <paulb@nvidia.com>
    Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
    Reviewed-by: default avatarVlad Buslov <vladbu@nvidia.com>
    Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
    89e39467
    net/mlx5e: Fix CT rule + encap slow path offload and deletion
    Paul Blakey authored
    Currently, if a neighbour isn't valid when offloading tunnel encap rules,
    we offload the original match and replace the original action with
    "goto slow path" action. For this we use a temporary flow attribute based
    on the original flow attribute and then change the action. Flow flags,
    which among those is the CT flag, are still shared for the slow path rule
    offload, so we end up parsing this flow as a CT + goto slow path rule.
    
    Besides being unnecessary, CT action offload saves extra information in
    the passed flow attribute, such as created ct_flow and mod_hdr, which
    is lost onces the temporary flow attribute is freed.
    
    When a neigh is updated and is valid, we offload the original CT rule
    with original CT action, which again creates a ct_flow and mod_hdr
    and saves it in the flow's original attribute. Then we delete the slow
    path rule with a temporary flow attribute based on original updated
    flow attribute, and we free the relevant ct_flow and mod_hdr.
    
    Then when tc deletes this flow, we try to free the ct_flow and mod_hdr
    on the flow's attribute again.
    
    To fix the issue, skip all furture proccesing (CT/Sample/Split rules)
    in offload/unoffload of slow path rules.
    
    Call trace:
    [  758.850525] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000218
    [  758.952987] Internal error: Oops: 96000005 [#1] PREEMPT SMP
    [  758.964170] Modules linked in: act_csum(E) act_pedit(E) act_tunnel_key(E) act_ct(E) nf_flow_table(E) xt_nat(E) ip6table_filter(E) ip6table_nat(E) xt_comment(E) ip6_tables(E) xt_conntrack(E) xt_MASQUERADE(E) nf_conntrack_netlink(E) xt_addrtype(E) iptable_filter(E) iptable_nat(E) bpfilter(E) br_netfilter(E) bridge(E) stp(E) llc(E) xfrm_user(E) overlay(E) act_mirred(E) act_skbedit(E) rdma_ucm(OE) rdma_cm(OE) iw_cm(OE) ib_ipoib(OE) ib_cm(OE) ib_umad(OE) esp6_offload(E) esp6(E) esp4_offload(E) esp4(E) xfrm_algo(E) mlx5_ib(OE) ib_uverbs(OE) geneve(E) ip6_udp_tunnel(E) udp_tunnel(E) nfnetlink_cttimeout(E) nfnetlink(E) mlx5_core(OE) act_gact(E) cls_flower(E) sch_ingress(E) openvswitch(E) nsh(E) nf_conncount(E) nf_nat(E) mlxfw(OE) psample(E) nf_conntrack(E) nf_defrag_ipv4(E) vfio_mdev(E) mdev(E) ib_core(OE) mlx_compat(OE) crct10dif_ce(E) uio_pdrv_genirq(E) uio(E) i2c_mlx(E) mlxbf_pmc(E) sbsa_gwdt(E) mlxbf_gige(E) gpio_mlxbf2(E) mlxbf_pka(E) mlx_trio(E) mlx_bootctl(E) bluefield_edac(E) knem(O)
    [  758.964225]  ip_tables(E) mlxbf_tmfifo(E) ipv6(E) crc_ccitt(E) nf_defrag_ipv6(E)
    [  759.154186] CPU: 5 PID: 122 Comm: kworker/u16:1 Tainted: G           OE     5.4.60-mlnx.52.gde81e85 #1
    [  759.172870] Hardware name: https://www.mellanox.com
    
     BlueField SoC/BlueField SoC, BIOS BlueField:3.5.0-2-gc1b5d64 Jan  4 2021
    [  759.195466] Workqueue: mlx5e mlx5e_rep_neigh_update [mlx5_core]
    [  759.207344] pstate: a0000005 (NzCv daif -PAN -UAO)
    [  759.217003] pc : mlx5_del_flow_rules+0x5c/0x160 [mlx5_core]
    [  759.228229] lr : mlx5_del_flow_rules+0x34/0x160 [mlx5_core]
    [  759.405858] Call trace:
    [  759.410804]  mlx5_del_flow_rules+0x5c/0x160 [mlx5_core]
    [  759.421337]  __mlx5_eswitch_del_rule.isra.43+0x5c/0x1c8 [mlx5_core]
    [  759.433963]  mlx5_eswitch_del_offloaded_rule_ct+0x34/0x40 [mlx5_core]
    [  759.446942]  mlx5_tc_rule_delete_ct+0x68/0x74 [mlx5_core]
    [  759.457821]  mlx5_tc_ct_delete_flow+0x160/0x21c [mlx5_core]
    [  759.469051]  mlx5e_tc_unoffload_fdb_rules+0x158/0x168 [mlx5_core]
    [  759.481325]  mlx5e_tc_encap_flows_del+0x140/0x26c [mlx5_core]
    [  759.492901]  mlx5e_rep_update_flows+0x11c/0x1ec [mlx5_core]
    [  759.504127]  mlx5e_rep_neigh_update+0x160/0x200 [mlx5_core]
    [  759.515314]  process_one_work+0x178/0x400
    [  759.523350]  worker_thread+0x58/0x3e8
    [  759.530685]  kthread+0x100/0x12c
    [  759.537152]  ret_from_fork+0x10/0x18
    [  759.544320] Code: 97ffef55 51000673 3100067f 54ffff41 (b9421ab3)
    [  759.556548] ---[ end trace fab818bb1085832d ]---
    
    Fixes: 4c3844d9 ("net/mlx5e: CT: Introduce connection tracking")
    Signed-off-by: default avatarPaul Blakey <paulb@nvidia.com>
    Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
    Reviewed-by: default avatarVlad Buslov <vladbu@nvidia.com>
    Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
Loading