bridge: mrp: Use hlist_head instead of list_head for mrp
authorHoratiu Vultur <horatiu.vultur@microchip.com>
Fri, 6 Nov 2020 21:50:49 +0000 (22:50 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Nov 2020 00:42:12 +0000 (16:42 -0800)
Replace list_head with hlist_head for MRP list under the bridge.
There is no need for a circular list when a linear list will work.
This will also decrease the size of 'struct net_bridge'.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Link: https://lore.kernel.org/r/20201106215049.1448185-1-horatiu.vultur@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_device.c
net/bridge/br_mrp.c
net/bridge/br_mrp_netlink.c
net/bridge/br_private.h
net/bridge/br_private_mrp.h

index 2400a66fe76e8366ef0d30db51e3109d92c36f04..387403931a63f7471b38524bc13ac37d40a4b705 100644 (file)
@@ -456,7 +456,7 @@ void br_dev_setup(struct net_device *dev)
        INIT_HLIST_HEAD(&br->fdb_list);
        INIT_HLIST_HEAD(&br->frame_type_list);
 #if IS_ENABLED(CONFIG_BRIDGE_MRP)
-       INIT_LIST_HEAD(&br->mrp_list);
+       INIT_HLIST_HEAD(&br->mrp_list);
 #endif
 #if IS_ENABLED(CONFIG_BRIDGE_CFM)
        INIT_HLIST_HEAD(&br->mep_list);
index f94d72bb7c32a336a6fc85d20970ca4f4e84da95..bb12fbf9aaf2b1c472a7b72d2e9dac4c6a33e34a 100644 (file)
@@ -54,8 +54,8 @@ static struct br_mrp *br_mrp_find_id(struct net_bridge *br, u32 ring_id)
        struct br_mrp *res = NULL;
        struct br_mrp *mrp;
 
-       list_for_each_entry_rcu(mrp, &br->mrp_list, list,
-                               lockdep_rtnl_is_held()) {
+       hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
+                                lockdep_rtnl_is_held()) {
                if (mrp->ring_id == ring_id) {
                        res = mrp;
                        break;
@@ -70,8 +70,8 @@ static struct br_mrp *br_mrp_find_in_id(struct net_bridge *br, u32 in_id)
        struct br_mrp *res = NULL;
        struct br_mrp *mrp;
 
-       list_for_each_entry_rcu(mrp, &br->mrp_list, list,
-                               lockdep_rtnl_is_held()) {
+       hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
+                                lockdep_rtnl_is_held()) {
                if (mrp->in_id == in_id) {
                        res = mrp;
                        break;
@@ -85,8 +85,8 @@ static bool br_mrp_unique_ifindex(struct net_bridge *br, u32 ifindex)
 {
        struct br_mrp *mrp;
 
-       list_for_each_entry_rcu(mrp, &br->mrp_list, list,
-                               lockdep_rtnl_is_held()) {
+       hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
+                                lockdep_rtnl_is_held()) {
                struct net_bridge_port *p;
 
                p = rtnl_dereference(mrp->p_port);
@@ -111,8 +111,8 @@ static struct br_mrp *br_mrp_find_port(struct net_bridge *br,
        struct br_mrp *res = NULL;
        struct br_mrp *mrp;
 
-       list_for_each_entry_rcu(mrp, &br->mrp_list, list,
-                               lockdep_rtnl_is_held()) {
+       hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
+                                lockdep_rtnl_is_held()) {
                if (rcu_access_pointer(mrp->p_port) == p ||
                    rcu_access_pointer(mrp->s_port) == p ||
                    rcu_access_pointer(mrp->i_port) == p) {
@@ -450,10 +450,10 @@ static void br_mrp_del_impl(struct net_bridge *br, struct br_mrp *mrp)
                rcu_assign_pointer(mrp->i_port, NULL);
        }
 
-       list_del_rcu(&mrp->list);
+       hlist_del_rcu(&mrp->list);
        kfree_rcu(mrp, rcu);
 
-       if (list_empty(&br->mrp_list))
+       if (hlist_empty(&br->mrp_list))
                br_del_frame(br, &mrp_frame_type);
 }
 
@@ -503,12 +503,12 @@ int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance)
        spin_unlock_bh(&br->lock);
        rcu_assign_pointer(mrp->s_port, p);
 
-       if (list_empty(&br->mrp_list))
+       if (hlist_empty(&br->mrp_list))
                br_add_frame(br, &mrp_frame_type);
 
        INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired);
        INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_test_work_expired);
-       list_add_tail_rcu(&mrp->list, &br->mrp_list);
+       hlist_add_tail_rcu(&mrp->list, &br->mrp_list);
 
        err = br_mrp_switchdev_add(br, mrp);
        if (err)
@@ -1198,5 +1198,5 @@ out:
 
 bool br_mrp_enabled(struct net_bridge *br)
 {
-       return !list_empty(&br->mrp_list);
+       return !hlist_empty(&br->mrp_list);
 }
index 2a2fdf3500c5bae51d0e9a92dfa2d7bd7d1d5176..ce6f63c77cc0acb961518835656332c97a51f102 100644 (file)
@@ -453,7 +453,7 @@ int br_mrp_fill_info(struct sk_buff *skb, struct net_bridge *br)
        if (!mrp_tb)
                return -EMSGSIZE;
 
-       list_for_each_entry_rcu(mrp, &br->mrp_list, list) {
+       hlist_for_each_entry_rcu(mrp, &br->mrp_list, list) {
                struct net_bridge_port *p;
 
                tb = nla_nest_start_noflag(skb, IFLA_BRIDGE_MRP_INFO);
index 891f3b05ffa413b29ed1ec124178def5e49b0b39..6f2818cb2ac024db7a5e88c19ded6e365cde00a4 100644 (file)
@@ -482,7 +482,7 @@ struct net_bridge {
        struct hlist_head               fdb_list;
 
 #if IS_ENABLED(CONFIG_BRIDGE_MRP)
-       struct list_head                mrp_list;
+       struct hlist_head               mrp_list;
 #endif
 #if IS_ENABLED(CONFIG_BRIDGE_CFM)
        struct hlist_head               mep_list;
index af0e9eff65493d1262b9ff598ac5b29f62a8b178..1883118aae55b015e33b3702a3611bc5a60f8357 100644 (file)
@@ -8,7 +8,7 @@
 
 struct br_mrp {
        /* list of mrp instances */
-       struct list_head                list;
+       struct hlist_node               list;
 
        struct net_bridge_port __rcu    *p_port;
        struct net_bridge_port __rcu    *s_port;