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

net: fix rcu access on phonet_routes

-Add __rcu annotation on table to fix sparse warnings:
net/phonet/pn_dev.c:279:25: warning: incorrect type in assignment (different address spaces)
net/phonet/pn_dev.c:279:25: expected struct net_device *<noident>
net/phonet/pn_dev.c:279:25: got void [noderef] <asn:4>*<noident>
net/phonet/pn_dev.c:376:17: warning: incorrect type in assignment (different address spaces)
net/phonet/pn_dev.c:376:17: expected struct net_device *volatile <noident>
net/phonet/pn_dev.c:376:17: got struct net_device [noderef] <asn:4>*<noident>
net/phonet/pn_dev.c:392:17: warning: incorrect type in assignment (different address spaces)
net/phonet/pn_dev.c:392:17: expected struct net_device *<noident>
net/phonet/pn_dev.c:392:17: got void [noderef] <asn:4>*<noident>

-Access table with rcu_access_pointer (fixes the following sparse errors):
net/phonet/pn_dev.c:278:25: error: incompatible types in comparison expression (different address spaces)
net/phonet/pn_dev.c:391:17: error: incompatible types in comparison expression (different address spaces)

Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Fabian Frederick <fabf@skynet.be>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Fabian Frederick and committed by
David S. Miller
79952bca e91a159e

+3 -3
+3 -3
net/phonet/pn_dev.c
··· 36 36 37 37 struct phonet_routes { 38 38 struct mutex lock; 39 - struct net_device *table[64]; 39 + struct net_device __rcu *table[64]; 40 40 }; 41 41 42 42 struct phonet_net { ··· 275 275 bitmap_zero(deleted, 64); 276 276 mutex_lock(&pnn->routes.lock); 277 277 for (i = 0; i < 64; i++) 278 - if (dev == pnn->routes.table[i]) { 278 + if (rcu_access_pointer(pnn->routes.table[i]) == dev) { 279 279 RCU_INIT_POINTER(pnn->routes.table[i], NULL); 280 280 set_bit(i, deleted); 281 281 } ··· 388 388 389 389 daddr = daddr >> 2; 390 390 mutex_lock(&routes->lock); 391 - if (dev == routes->table[daddr]) 391 + if (rcu_access_pointer(routes->table[daddr]) == dev) 392 392 RCU_INIT_POINTER(routes->table[daddr], NULL); 393 393 else 394 394 dev = NULL;