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

net: bridge: fdb: br_fdb_update can take flags directly

If we modify br_fdb_update() to take flags directly we can get rid of
one test and one atomic bitop in the learning path.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Nikolay Aleksandrov and committed by
David S. Miller
be0c5677 52340b82

+15 -18
+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
+6 -9
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; ··· 592 592 } 593 593 if (now != fdb->updated) 594 594 fdb->updated = now; 595 - if (unlikely(added_by_user)) 595 + if (unlikely(test_bit(BR_FDB_ADDED_BY_USER, &flags))) 596 596 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); 597 597 if (unlikely(fdb_modified)) { 598 - trace_br_fdb_update(br, source, addr, vid, added_by_user); 598 + trace_br_fdb_update(br, source, addr, vid, flags); 599 599 fdb_notify(br, fdb, RTM_NEWNEIGH, true); 600 600 } 601 601 } 602 602 } else { 603 603 spin_lock(&br->hash_lock); 604 - fdb = fdb_create(br, source, addr, vid, 0); 604 + fdb = fdb_create(br, source, addr, vid, flags); 605 605 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); 606 + trace_br_fdb_update(br, source, addr, vid, flags); 610 607 fdb_notify(br, fdb, RTM_NEWNEIGH, true); 611 608 } 612 609 /* else we lose race and someone else inserts ··· 886 889 } 887 890 local_bh_disable(); 888 891 rcu_read_lock(); 889 - br_fdb_update(br, p, addr, vid, true); 892 + br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER)); 890 893 rcu_read_unlock(); 891 894 local_bh_enable(); 892 895 } else if (ndm->ndm_flags & NTF_EXT_LEARNED) {
+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);