Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68003903 authored by Linus Lüssing's avatar Linus Lüssing Committed by Sven Eckelmann
Browse files

batman-adv: Protect global TQ window with a spinlock

parent e1a5382f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ struct neigh_node *create_neighbor(struct orig_node *orig_node,

	INIT_HLIST_NODE(&neigh_node->list);
	INIT_LIST_HEAD(&neigh_node->bonding_list);
	spin_lock_init(&neigh_node->tq_lock);

	memcpy(neigh_node->addr, neigh, ETH_ALEN);
	neigh_node->orig_node = orig_neigh_node;
+4 −0
Original line number Diff line number Diff line
@@ -415,10 +415,12 @@ static void update_orig(struct bat_priv *bat_priv,
		if (is_duplicate)
			continue;

		spin_lock_bh(&tmp_neigh_node->tq_lock);
		ring_buffer_set(tmp_neigh_node->tq_recv,
				&tmp_neigh_node->tq_index, 0);
		tmp_neigh_node->tq_avg =
			ring_buffer_avg(tmp_neigh_node->tq_recv);
		spin_unlock_bh(&tmp_neigh_node->tq_lock);
	}

	if (!neigh_node) {
@@ -443,10 +445,12 @@ static void update_orig(struct bat_priv *bat_priv,
	orig_node->flags = batman_packet->flags;
	neigh_node->last_valid = jiffies;

	spin_lock_bh(&neigh_node->tq_lock);
	ring_buffer_set(neigh_node->tq_recv,
			&neigh_node->tq_index,
			batman_packet->tq);
	neigh_node->tq_avg = ring_buffer_avg(neigh_node->tq_recv);
	spin_unlock_bh(&neigh_node->tq_lock);

	if (!is_duplicate) {
		orig_node->last_ttl = batman_packet->ttl;
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct neigh_node {
	struct rcu_head rcu;
	struct orig_node *orig_node;
	struct hard_iface *if_incoming;
	spinlock_t tq_lock;	/* protects: tq_recv, tq_index */
};