• Sebastian Andrzej Siewior's avatar
    Revert "net: hsr: use hlist_head instead of list_head for mac addresses" · e012764c
    Sebastian Andrzej Siewior authored
    The hlist optimisation (which not only uses hlist_head instead of
    list_head but also splits hsr_priv::node_db into an array of 256 slots)
    does not consider the "node merge":
    Upon starting the hsr network (with three nodes) a packet that is
    sent from node1 to node3 will also be sent from node1 to node2 and then
    forwarded to node3.
    As a result node3 will receive 2 packets because it is not able
    to filter out the duplicate. Each packet received will create a new
    struct hsr_node with macaddress_A only set the MAC address it received
    from (the two MAC addesses from node1).
    At some point (early in the process) two supervision frames will be
    received from node1. They will be processed by hsr_handle_sup_frame()
    and one frame will leave early ("Node has already been merged") and does
    nothing. The other frame will be merged as portB and have its MAC
    address written to macaddress_B and the hsr_node (that was created for
    it as macaddress_A) will be removed.
    From now on HSR is able to identify a duplicate because both packets
    sent from one node will result in the same struct hsr_node because
    hsr_get_node() will find the MAC address either on macaddress_A or
    macaddress_B.
    
    Things get tricky with the optimisation: If sender's MAC address is
    saved as macaddress_A then the lookup will work as usual. If the MAC
    address has been merged into macaddress_B of another hsr_node then the
    lookup won't work because it is likely that the data structure is in
    another bucket. This results in creating a new struct hsr_node and not
    recognising a possible duplicate.
    
    A way around it would be to add another hsr_node::mac_list_B and attach
    it to the other bucket to ensure that this hsr_node will be looked up
    either via macaddress_A _or_ macaddress_B.
    
    I however prefer to revert it because it sounds like an academic problem
    rather than real life workload plus it adds complexity. I'm not an HSR
    expert with what is usual size of a network but I would guess 40 to 60
    nodes. With 10.000 nodes and assuming 60us for pass-through (from node
    to node) then it would take almost 600ms for a packet to almost wrap
    around which sounds a lot.
    
    Revert the hash MAC addresses optimisation.
    
    Fixes: 4acc45db ("net: hsr: use hlist_head instead of list_head for mac addresses")
    Cc: Juhee Kang <claudiajkang@gmail.com>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    e012764c
hsr_debugfs.c 3.3 KB