Commit 0169b820 authored by Horatiu Vultur's avatar Horatiu Vultur Committed by Jakub Kicinski

bridge: mrp: Use hlist_head instead of list_head for mrp

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: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Link: https://lore.kernel.org/r/20201106215049.1448185-1-horatiu.vultur@microchip.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 084d0c13
...@@ -456,7 +456,7 @@ void br_dev_setup(struct net_device *dev) ...@@ -456,7 +456,7 @@ void br_dev_setup(struct net_device *dev)
INIT_HLIST_HEAD(&br->fdb_list); INIT_HLIST_HEAD(&br->fdb_list);
INIT_HLIST_HEAD(&br->frame_type_list); INIT_HLIST_HEAD(&br->frame_type_list);
#if IS_ENABLED(CONFIG_BRIDGE_MRP) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
INIT_LIST_HEAD(&br->mrp_list); INIT_HLIST_HEAD(&br->mrp_list);
#endif #endif
#if IS_ENABLED(CONFIG_BRIDGE_CFM) #if IS_ENABLED(CONFIG_BRIDGE_CFM)
INIT_HLIST_HEAD(&br->mep_list); INIT_HLIST_HEAD(&br->mep_list);
......
...@@ -54,8 +54,8 @@ static struct br_mrp *br_mrp_find_id(struct net_bridge *br, u32 ring_id) ...@@ -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 *res = NULL;
struct br_mrp *mrp; struct br_mrp *mrp;
list_for_each_entry_rcu(mrp, &br->mrp_list, list, hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
lockdep_rtnl_is_held()) { lockdep_rtnl_is_held()) {
if (mrp->ring_id == ring_id) { if (mrp->ring_id == ring_id) {
res = mrp; res = mrp;
break; break;
...@@ -70,8 +70,8 @@ static struct br_mrp *br_mrp_find_in_id(struct net_bridge *br, u32 in_id) ...@@ -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 *res = NULL;
struct br_mrp *mrp; struct br_mrp *mrp;
list_for_each_entry_rcu(mrp, &br->mrp_list, list, hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
lockdep_rtnl_is_held()) { lockdep_rtnl_is_held()) {
if (mrp->in_id == in_id) { if (mrp->in_id == in_id) {
res = mrp; res = mrp;
break; break;
...@@ -85,8 +85,8 @@ static bool br_mrp_unique_ifindex(struct net_bridge *br, u32 ifindex) ...@@ -85,8 +85,8 @@ static bool br_mrp_unique_ifindex(struct net_bridge *br, u32 ifindex)
{ {
struct br_mrp *mrp; struct br_mrp *mrp;
list_for_each_entry_rcu(mrp, &br->mrp_list, list, hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
lockdep_rtnl_is_held()) { lockdep_rtnl_is_held()) {
struct net_bridge_port *p; struct net_bridge_port *p;
p = rtnl_dereference(mrp->p_port); p = rtnl_dereference(mrp->p_port);
...@@ -111,8 +111,8 @@ static struct br_mrp *br_mrp_find_port(struct net_bridge *br, ...@@ -111,8 +111,8 @@ static struct br_mrp *br_mrp_find_port(struct net_bridge *br,
struct br_mrp *res = NULL; struct br_mrp *res = NULL;
struct br_mrp *mrp; struct br_mrp *mrp;
list_for_each_entry_rcu(mrp, &br->mrp_list, list, hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
lockdep_rtnl_is_held()) { lockdep_rtnl_is_held()) {
if (rcu_access_pointer(mrp->p_port) == p || if (rcu_access_pointer(mrp->p_port) == p ||
rcu_access_pointer(mrp->s_port) == p || rcu_access_pointer(mrp->s_port) == p ||
rcu_access_pointer(mrp->i_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) ...@@ -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); rcu_assign_pointer(mrp->i_port, NULL);
} }
list_del_rcu(&mrp->list); hlist_del_rcu(&mrp->list);
kfree_rcu(mrp, rcu); kfree_rcu(mrp, rcu);
if (list_empty(&br->mrp_list)) if (hlist_empty(&br->mrp_list))
br_del_frame(br, &mrp_frame_type); br_del_frame(br, &mrp_frame_type);
} }
...@@ -503,12 +503,12 @@ int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance) ...@@ -503,12 +503,12 @@ int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance)
spin_unlock_bh(&br->lock); spin_unlock_bh(&br->lock);
rcu_assign_pointer(mrp->s_port, p); 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); br_add_frame(br, &mrp_frame_type);
INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired); INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired);
INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_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); err = br_mrp_switchdev_add(br, mrp);
if (err) if (err)
...@@ -1198,5 +1198,5 @@ static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb) ...@@ -1198,5 +1198,5 @@ static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb)
bool br_mrp_enabled(struct net_bridge *br) bool br_mrp_enabled(struct net_bridge *br)
{ {
return !list_empty(&br->mrp_list); return !hlist_empty(&br->mrp_list);
} }
...@@ -453,7 +453,7 @@ int br_mrp_fill_info(struct sk_buff *skb, struct net_bridge *br) ...@@ -453,7 +453,7 @@ int br_mrp_fill_info(struct sk_buff *skb, struct net_bridge *br)
if (!mrp_tb) if (!mrp_tb)
return -EMSGSIZE; 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; struct net_bridge_port *p;
tb = nla_nest_start_noflag(skb, IFLA_BRIDGE_MRP_INFO); tb = nla_nest_start_noflag(skb, IFLA_BRIDGE_MRP_INFO);
......
...@@ -482,7 +482,7 @@ struct net_bridge { ...@@ -482,7 +482,7 @@ struct net_bridge {
struct hlist_head fdb_list; struct hlist_head fdb_list;
#if IS_ENABLED(CONFIG_BRIDGE_MRP) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
struct list_head mrp_list; struct hlist_head mrp_list;
#endif #endif
#if IS_ENABLED(CONFIG_BRIDGE_CFM) #if IS_ENABLED(CONFIG_BRIDGE_CFM)
struct hlist_head mep_list; struct hlist_head mep_list;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
struct br_mrp { struct br_mrp {
/* list of mrp instances */ /* list of mrp instances */
struct list_head list; struct hlist_node list;
struct net_bridge_port __rcu *p_port; struct net_bridge_port __rcu *p_port;
struct net_bridge_port __rcu *s_port; struct net_bridge_port __rcu *s_port;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment