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

Commit cf778b00 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: reintroduce missing rcu_assign_pointer() calls



commit a9b3cd7f (rcu: convert uses of rcu_assign_pointer(x, NULL) to
RCU_INIT_POINTER) did a lot of incorrect changes, since it did a
complete conversion of rcu_assign_pointer(x, y) to RCU_INIT_POINTER(x,
y).

We miss needed barriers, even on x86, when y is not NULL.

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
CC: Stephen Hemminger <shemminger@vyatta.com>
CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9ee6045f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1177,9 +1177,9 @@ static ssize_t store_xps_map(struct netdev_queue *queue,
			nonempty = 1;
	}

	if (nonempty)
		RCU_INIT_POINTER(dev->xps_maps, new_dev_maps);
	else {
	if (nonempty) {
		rcu_assign_pointer(dev->xps_maps, new_dev_maps);
	} else {
		kfree(new_dev_maps);
		RCU_INIT_POINTER(dev->xps_maps, NULL);
	}
+1 −1
Original line number Diff line number Diff line
@@ -765,7 +765,7 @@ int __netpoll_setup(struct netpoll *np)
	}

	/* last thing to do is link it to the net device structure */
	RCU_INIT_POINTER(ndev->npinfo, npinfo);
	rcu_assign_pointer(ndev->npinfo, npinfo);

	return 0;

+2 −2
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa)
	}

	ifa->ifa_next = dn_db->ifa_list;
	RCU_INIT_POINTER(dn_db->ifa_list, ifa);
	rcu_assign_pointer(dn_db->ifa_list, ifa);

	dn_ifaddr_notify(RTM_NEWADDR, ifa);
	blocking_notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa);
@@ -1093,7 +1093,7 @@ static struct dn_dev *dn_dev_create(struct net_device *dev, int *err)

	memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms));

	RCU_INIT_POINTER(dev->dn_ptr, dn_db);
	rcu_assign_pointer(dev->dn_ptr, dn_db);
	dn_db->dev = dev;
	init_timer(&dn_db->timer);

+1 −1
Original line number Diff line number Diff line
@@ -258,7 +258,7 @@ static struct in_device *inetdev_init(struct net_device *dev)
		ip_mc_up(in_dev);

	/* we can receive as soon as ip_ptr is set -- do this last */
	RCU_INIT_POINTER(dev->ip_ptr, in_dev);
	rcu_assign_pointer(dev->ip_ptr, in_dev);
out:
	return in_dev;
out_kfree:
+5 −5
Original line number Diff line number Diff line
@@ -205,7 +205,7 @@ static inline struct tnode *node_parent_rcu(const struct rt_trie_node *node)
	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
}

/* Same as RCU_INIT_POINTER
/* Same as rcu_assign_pointer
 * but that macro() assumes that value is a pointer.
 */
static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
@@ -529,7 +529,7 @@ static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *
	if (n)
		node_set_parent(n, tn);

	RCU_INIT_POINTER(tn->child[i], n);
	rcu_assign_pointer(tn->child[i], n);
}

#define MAX_WORK 10
@@ -1015,7 +1015,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn)

		tp = node_parent((struct rt_trie_node *) tn);
		if (!tp)
			RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);

		tnode_free_flush();
		if (!tp)
@@ -1027,7 +1027,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn)
	if (IS_TNODE(tn))
		tn = (struct tnode *)resize(t, (struct tnode *)tn);

	RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
	rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
	tnode_free_flush();
}

@@ -1164,7 +1164,7 @@ static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
			put_child(t, (struct tnode *)tp, cindex,
				  (struct rt_trie_node *)tn);
		} else {
			RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn);
			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
			tp = tn;
		}
	}
Loading