浏览代码

bridge: fdb: write to used and updated at most once per jiffy

Writing once per jiffy is enough to limit the bridge's false sharing.
After this change the bridge doesn't show up in the local load HitM stats.

Suggested-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Nikolay Aleksandrov 8 年之前
父节点
当前提交
83a718d629
共有 2 个文件被更改,包括 4 次插入2 次删除
  1. 2 1
      net/bridge/br_fdb.c
  2. 2 1
      net/bridge/br_input.c

+ 2 - 1
net/bridge/br_fdb.c

@@ -597,7 +597,8 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
 				fdb->dst = source;
 				fdb->dst = source;
 				fdb_modified = true;
 				fdb_modified = true;
 			}
 			}
-			fdb->updated = jiffies;
+			if (jiffies != fdb->updated)
+				fdb->updated = jiffies;
 			if (unlikely(added_by_user))
 			if (unlikely(added_by_user))
 				fdb->added_by_user = 1;
 				fdb->added_by_user = 1;
 			if (unlikely(fdb_modified))
 			if (unlikely(fdb_modified))

+ 2 - 1
net/bridge/br_input.c

@@ -198,7 +198,8 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
 		if (dst->is_local)
 		if (dst->is_local)
 			return br_pass_frame_up(skb);
 			return br_pass_frame_up(skb);
 
 
-		dst->used = jiffies;
+		if (jiffies != dst->used)
+			dst->used = jiffies;
 		br_forward(dst->dst, skb, local_rcv, false);
 		br_forward(dst->dst, skb, local_rcv, false);
 	} else {
 	} else {
 		if (!mcast_hit)
 		if (!mcast_hit)