net: bridge: fdb: convert is_static to bitops
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Tue, 29 Oct 2019 11:45:54 +0000 (13:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Oct 2019 01:12:49 +0000 (18:12 -0700)
Convert the is_static to bitops, make use of the combined
test_and_set/clear_bit to simplify expressions in fdb_add_entry.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_fdb.c
net/bridge/br_private.h

index e67d5eb..1c890e2 100644 (file)
@@ -75,8 +75,9 @@ static inline unsigned long hold_time(const struct net_bridge *br)
 static inline int has_expired(const struct net_bridge *br,
                                  const struct net_bridge_fdb_entry *fdb)
 {
-       return !fdb->is_static && !fdb->added_by_external_learn &&
-               time_before_eq(fdb->updated + hold_time(br), jiffies);
+       return !test_bit(BR_FDB_STATIC, &fdb->flags) &&
+              !fdb->added_by_external_learn &&
+              time_before_eq(fdb->updated + hold_time(br), jiffies);
 }
 
 static void fdb_rcu_free(struct rcu_head *head)
@@ -197,7 +198,7 @@ static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f,
 {
        trace_fdb_delete(br, f);
 
-       if (f->is_static)
+       if (test_bit(BR_FDB_STATIC, &f->flags))
                fdb_del_hw_addr(br, f->key.addr.addr);
 
        hlist_del_init_rcu(&f->fdb_node);
@@ -350,7 +351,8 @@ void br_fdb_cleanup(struct work_struct *work)
        hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
                unsigned long this_timer;
 
-               if (f->is_static || f->added_by_external_learn)
+               if (test_bit(BR_FDB_STATIC, &f->flags) ||
+                   f->added_by_external_learn)
                        continue;
                this_timer = f->updated + delay;
                if (time_after(this_timer, now)) {
@@ -377,7 +379,7 @@ void br_fdb_flush(struct net_bridge *br)
 
        spin_lock_bh(&br->hash_lock);
        hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) {
-               if (!f->is_static)
+               if (!test_bit(BR_FDB_STATIC, &f->flags))
                        fdb_delete(br, f, true);
        }
        spin_unlock_bh(&br->hash_lock);
@@ -401,7 +403,8 @@ void br_fdb_delete_by_port(struct net_bridge *br,
                        continue;
 
                if (!do_all)
-                       if (f->is_static || (vid && f->key.vlan_id != vid))
+                       if (test_bit(BR_FDB_STATIC, &f->flags) ||
+                           (vid && f->key.vlan_id != vid))
                                continue;
 
                if (test_bit(BR_FDB_LOCAL, &f->flags))
@@ -474,7 +477,7 @@ int br_fdb_fillbuf(struct net_bridge *br, void *buf,
                fe->port_hi = f->dst->port_no >> 8;
 
                fe->is_local = test_bit(BR_FDB_LOCAL, &f->flags);
-               if (!f->is_static)
+               if (!test_bit(BR_FDB_STATIC, &f->flags))
                        fe->ageing_timer_value = jiffies_delta_to_clock_t(jiffies - f->updated);
                ++fe;
                ++num;
@@ -501,7 +504,8 @@ static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br,
                fdb->flags = 0;
                if (is_local)
                        set_bit(BR_FDB_LOCAL, &fdb->flags);
-               fdb->is_static = is_static;
+               if (is_static)
+                       set_bit(BR_FDB_STATIC, &fdb->flags);
                fdb->added_by_user = 0;
                fdb->added_by_external_learn = 0;
                fdb->offloaded = 0;
@@ -624,7 +628,7 @@ static int fdb_to_nud(const struct net_bridge *br,
 {
        if (test_bit(BR_FDB_LOCAL, &fdb->flags))
                return NUD_PERMANENT;
-       else if (fdb->is_static)
+       else if (test_bit(BR_FDB_STATIC, &fdb->flags))
                return NUD_NOARP;
        else if (has_expired(br, fdb))
                return NUD_STALE;
@@ -847,22 +851,16 @@ static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source,
        if (fdb_to_nud(br, fdb) != state) {
                if (state & NUD_PERMANENT) {
                        set_bit(BR_FDB_LOCAL, &fdb->flags);
-                       if (!fdb->is_static) {
-                               fdb->is_static = 1;
+                       if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
                                fdb_add_hw_addr(br, addr);
-                       }
                } else if (state & NUD_NOARP) {
                        clear_bit(BR_FDB_LOCAL, &fdb->flags);
-                       if (!fdb->is_static) {
-                               fdb->is_static = 1;
+                       if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
                                fdb_add_hw_addr(br, addr);
-                       }
                } else {
                        clear_bit(BR_FDB_LOCAL, &fdb->flags);
-                       if (fdb->is_static) {
-                               fdb->is_static = 0;
+                       if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags))
                                fdb_del_hw_addr(br, addr);
-                       }
                }
 
                modified = true;
@@ -1070,7 +1068,7 @@ int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p)
        rcu_read_lock();
        hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
                /* We only care for static entries */
-               if (!f->is_static)
+               if (!test_bit(BR_FDB_STATIC, &f->flags))
                        continue;
                err = dev_uc_add(p->dev, f->key.addr.addr);
                if (err)
@@ -1084,7 +1082,7 @@ done:
 rollback:
        hlist_for_each_entry_rcu(tmp, &br->fdb_list, fdb_node) {
                /* We only care for static entries */
-               if (!tmp->is_static)
+               if (!test_bit(BR_FDB_STATIC, &tmp->flags))
                        continue;
                if (tmp == f)
                        break;
@@ -1103,7 +1101,7 @@ void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
        rcu_read_lock();
        hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
                /* We only care for static entries */
-               if (!f->is_static)
+               if (!test_bit(BR_FDB_STATIC, &f->flags))
                        continue;
 
                dev_uc_del(p->dev, f->key.addr.addr);
index 888cbe9..c5258fa 100644 (file)
@@ -175,6 +175,7 @@ struct net_bridge_vlan_group {
 /* bridge fdb flags */
 enum {
        BR_FDB_LOCAL,
+       BR_FDB_STATIC,
 };
 
 struct net_bridge_fdb_key {
@@ -189,8 +190,7 @@ struct net_bridge_fdb_entry {
        struct net_bridge_fdb_key       key;
        struct hlist_node               fdb_node;
        unsigned long                   flags;
-       unsigned char                   is_static:1,
-                                       is_sticky:1,
+       unsigned char                   is_sticky:1,
                                        added_by_user:1,
                                        added_by_external_learn:1,
                                        offloaded:1;