Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-bridge-minor-followup-optimizations'

Nikolay Aleksandrov says:

====================
net: bridge: minor followup optimizations

After the converted flags to bitops we can take advantage of the flags
assignment and remove one test and three atomic bitops from the learning
paths (patch 01 and patch 02), patch 03 restores the unlikely() when taking
over HW learned entries.

v2: a clean export of the latest set version
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+24 -24
+6 -6
include/trace/events/bridge.h
··· 95 95 TRACE_EVENT(br_fdb_update, 96 96 97 97 TP_PROTO(struct net_bridge *br, struct net_bridge_port *source, 98 - const unsigned char *addr, u16 vid, bool added_by_user), 98 + const unsigned char *addr, u16 vid, unsigned long flags), 99 99 100 - TP_ARGS(br, source, addr, vid, added_by_user), 100 + TP_ARGS(br, source, addr, vid, flags), 101 101 102 102 TP_STRUCT__entry( 103 103 __string(br_dev, br->dev->name) 104 104 __string(dev, source->dev->name) 105 105 __array(unsigned char, addr, ETH_ALEN) 106 106 __field(u16, vid) 107 - __field(bool, added_by_user) 107 + __field(unsigned long, flags) 108 108 ), 109 109 110 110 TP_fast_assign( ··· 112 112 __assign_str(dev, source->dev->name); 113 113 memcpy(__entry->addr, addr, ETH_ALEN); 114 114 __entry->vid = vid; 115 - __entry->added_by_user = added_by_user; 115 + __entry->flags = flags; 116 116 ), 117 117 118 - TP_printk("br_dev %s source %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u added_by_user %d", 118 + TP_printk("br_dev %s source %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u flags 0x%lx", 119 119 __get_str(br_dev), __get_str(dev), __entry->addr[0], 120 120 __entry->addr[1], __entry->addr[2], __entry->addr[3], 121 121 __entry->addr[4], __entry->addr[5], __entry->vid, 122 - __entry->added_by_user) 122 + __entry->flags) 123 123 ); 124 124 125 125
+15 -15
net/bridge/br_fdb.c
··· 557 557 } 558 558 559 559 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, 560 - const unsigned char *addr, u16 vid, bool added_by_user) 560 + const unsigned char *addr, u16 vid, unsigned long flags) 561 561 { 562 562 struct net_bridge_fdb_entry *fdb; 563 563 bool fdb_modified = false; ··· 587 587 fdb->dst = source; 588 588 fdb_modified = true; 589 589 /* Take over HW learned entry */ 590 - test_and_clear_bit(BR_FDB_ADDED_BY_EXT_LEARN, 591 - &fdb->flags); 590 + if (unlikely(test_bit(BR_FDB_ADDED_BY_EXT_LEARN, 591 + &fdb->flags))) 592 + clear_bit(BR_FDB_ADDED_BY_EXT_LEARN, 593 + &fdb->flags); 592 594 } 593 595 if (now != fdb->updated) 594 596 fdb->updated = now; 595 - if (unlikely(added_by_user)) 597 + if (unlikely(test_bit(BR_FDB_ADDED_BY_USER, &flags))) 596 598 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 597 599 if (unlikely(fdb_modified)) { 598 - trace_br_fdb_update(br, source, addr, vid, added_by_user); 600 + trace_br_fdb_update(br, source, addr, vid, flags); 599 601 fdb_notify(br, fdb, RTM_NEWNEIGH, true); 600 602 } 601 603 } 602 604 } else { 603 605 spin_lock(&br->hash_lock); 604 - fdb = fdb_create(br, source, addr, vid, 0); 606 + fdb = fdb_create(br, source, addr, vid, flags); 605 607 if (fdb) { 606 - if (unlikely(added_by_user)) 607 - set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 608 - trace_br_fdb_update(br, source, addr, vid, 609 - added_by_user); 608 + trace_br_fdb_update(br, source, addr, vid, flags); 610 609 fdb_notify(br, fdb, RTM_NEWNEIGH, true); 611 610 } 612 611 /* else we lose race and someone else inserts ··· 888 889 } 889 890 local_bh_disable(); 890 891 rcu_read_lock(); 891 - br_fdb_update(br, p, addr, vid, true); 892 + br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER)); 892 893 rcu_read_unlock(); 893 894 local_bh_enable(); 894 895 } else if (ndm->ndm_flags & NTF_EXT_LEARNED) { ··· 1115 1116 1116 1117 fdb = br_fdb_find(br, addr, vid); 1117 1118 if (!fdb) { 1118 - fdb = fdb_create(br, p, addr, vid, 0); 1119 + unsigned long flags = BIT(BR_FDB_ADDED_BY_EXT_LEARN); 1120 + 1121 + if (swdev_notify) 1122 + flags |= BIT(BR_FDB_ADDED_BY_USER); 1123 + fdb = fdb_create(br, p, addr, vid, flags); 1119 1124 if (!fdb) { 1120 1125 err = -ENOMEM; 1121 1126 goto err_unlock; 1122 1127 } 1123 - if (swdev_notify) 1124 - set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 1125 - set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags); 1126 1128 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); 1127 1129 } else { 1128 1130 fdb->updated = jiffies;
+2 -2
net/bridge/br_input.c
··· 88 88 /* insert into forwarding database after filtering to avoid spoofing */ 89 89 br = p->br; 90 90 if (p->flags & BR_LEARNING) 91 - br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false); 91 + br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, 0); 92 92 93 93 local_rcv = !!(br->dev->flags & IFF_PROMISC); 94 94 if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) { ··· 184 184 if ((p->flags & BR_LEARNING) && 185 185 !br_opt_get(p->br, BROPT_NO_LL_LEARN) && 186 186 br_should_learn(p, skb, &vid)) 187 - br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false); 187 + br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, 0); 188 188 } 189 189 190 190 /* note: already called with rcu_read_lock */
+1 -1
net/bridge/br_private.h
··· 571 571 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, 572 572 const unsigned char *addr, u16 vid); 573 573 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, 574 - const unsigned char *addr, u16 vid, bool added_by_user); 574 + const unsigned char *addr, u16 vid, unsigned long flags); 575 575 576 576 int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], 577 577 struct net_device *dev, const unsigned char *addr, u16 vid);