net/hsr: Move to per-hsr device prune timer.
authorArvid Brodin <arvid.brodin@alten.se>
Fri, 4 Jul 2014 21:35:47 +0000 (23:35 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Jul 2014 18:35:30 +0000 (11:35 -0700)
Signed-off-by: Arvid Brodin <arvid.brodin@alten.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/hsr/hsr_device.c
net/hsr/hsr_framereg.c
net/hsr/hsr_framereg.h
net/hsr/hsr_main.c
net/hsr/hsr_main.h

index 4e5d92a8f0796d77fa13ef0930ca01c200a77183..f224067153e483717399bfbbf0bedccfd85de4b6 100644 (file)
@@ -429,7 +429,8 @@ static void hsr_dev_destroy(struct net_device *hsr_dev)
 
        hsr = netdev_priv(hsr_dev);
 
-       del_timer(&hsr->announce_timer);
+       del_timer_sync(&hsr->prune_timer);
+       del_timer_sync(&hsr->announce_timer);
        unregister_hsr_master(hsr);    /* calls list_del_rcu on hsr */
        restore_slaves(hsr_dev);
        call_rcu(&hsr->rcu_head, reclaim_hsr_dev);   /* reclaim hsr */
@@ -523,6 +524,10 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
        hsr->announce_timer.function = hsr_announce;
        hsr->announce_timer.data = (unsigned long) hsr;
 
+       init_timer(&hsr->prune_timer);
+       hsr->prune_timer.function = hsr_prune_nodes;
+       hsr->prune_timer.data = (unsigned long) hsr;
+
        ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
        hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
 
@@ -596,6 +601,9 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
        if (res)
                goto fail;
 
+       hsr->prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
+       add_timer(&hsr->prune_timer);
+
        register_hsr_master(hsr);
 
        return 0;
index b419edbd70122c5715c29490c854903a8182b457..79e3f7ff66540d35f4b812721ebccb8ceac46f06 100644 (file)
@@ -366,12 +366,15 @@ static bool is_late(struct hsr_node *node, enum hsr_dev_idx dev_idx)
 /* Remove stale sequence_nr records. Called by timer every
  * HSR_LIFE_CHECK_INTERVAL (two seconds or so).
  */
-void hsr_prune_nodes(struct hsr_priv *hsr)
+void hsr_prune_nodes(unsigned long data)
 {
+       struct hsr_priv *hsr;
        struct hsr_node *node;
        unsigned long timestamp;
        unsigned long time_a, time_b;
 
+       hsr = (struct hsr_priv *) data;
+
        rcu_read_lock();
        list_for_each_entry_rcu(node, &hsr->node_db, mac_list) {
                /* Shorthand */
index 3675139df379b61becf41d713586af94f8076936..ccb09cf4ec5b0f8c28dd79bf70630011789d7ccc 100644 (file)
@@ -32,7 +32,7 @@ void hsr_register_frame_in(struct hsr_node *node, enum hsr_dev_idx dev_idx);
 int hsr_register_frame_out(struct hsr_node *node, enum hsr_dev_idx dev_idx,
                           struct sk_buff *skb);
 
-void hsr_prune_nodes(struct hsr_priv *hsr);
+void hsr_prune_nodes(unsigned long data);
 
 int hsr_create_self_node(struct list_head *self_node_db,
                         unsigned char addr_a[ETH_ALEN],
index bcda901437bc952b15bdaef4e36b55a3cbc190e5..5f9cd7fdbd93dcda09311deed86fb878cbbcb7f3 100644 (file)
@@ -175,22 +175,6 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
 }
 
 
-static struct timer_list prune_timer;
-
-static void prune_nodes_all(unsigned long data)
-{
-       struct hsr_priv *hsr;
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(hsr, &hsr_list, hsr_list)
-               hsr_prune_nodes(hsr);
-       rcu_read_unlock();
-
-       prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
-       add_timer(&prune_timer);
-}
-
-
 static struct notifier_block hsr_nb = {
        .notifier_call = hsr_netdev_notify,     /* Slave event notifications */
 };
@@ -202,14 +186,7 @@ static int __init hsr_init(void)
 
        BUILD_BUG_ON(sizeof(struct hsr_tag) != HSR_HLEN);
 
-       init_timer(&prune_timer);
-       prune_timer.function = prune_nodes_all;
-       prune_timer.data = 0;
-       prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
-       add_timer(&prune_timer);
-
        register_netdevice_notifier(&hsr_nb);
-
        res = hsr_netlink_init();
 
        return res;
@@ -218,7 +195,6 @@ static int __init hsr_init(void)
 static void __exit hsr_exit(void)
 {
        unregister_netdevice_notifier(&hsr_nb);
-       del_timer_sync(&prune_timer);
        hsr_netlink_exit();
 }
 
index d919321b0bdbe1928eb936168b7c601b818d1aa0..43689a6d731f671d811c908e8a464a1b580f0d97 100644 (file)
@@ -153,6 +153,7 @@ struct hsr_priv {
        struct list_head        node_db;        /* Other HSR nodes */
        struct list_head        self_node_db;   /* MACs of slaves */
        struct timer_list       announce_timer; /* Supervision frame dispatch */
+       struct timer_list       prune_timer;
        int announce_count;
        u16 sequence_nr;
        spinlock_t seqnr_lock;                  /* locking for sequence_nr */