rtnetlink: RCU-annotate both dimensions of rtnl_msg_handlers
We use rcu_assign_pointer to assign both the table and the entries, but the entries are not marked as __rcu. This generates sparse warnings. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
1d608d2e0d
Коммит
51e13685bd
|
@ -139,7 +139,7 @@ bool lockdep_rtnl_is_held(void)
|
||||||
EXPORT_SYMBOL(lockdep_rtnl_is_held);
|
EXPORT_SYMBOL(lockdep_rtnl_is_held);
|
||||||
#endif /* #ifdef CONFIG_PROVE_LOCKING */
|
#endif /* #ifdef CONFIG_PROVE_LOCKING */
|
||||||
|
|
||||||
static struct rtnl_link *__rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
|
static struct rtnl_link __rcu *__rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
|
||||||
|
|
||||||
static inline int rtm_msgindex(int msgtype)
|
static inline int rtm_msgindex(int msgtype)
|
||||||
{
|
{
|
||||||
|
@ -157,7 +157,7 @@ static inline int rtm_msgindex(int msgtype)
|
||||||
|
|
||||||
static struct rtnl_link *rtnl_get_link(int protocol, int msgtype)
|
static struct rtnl_link *rtnl_get_link(int protocol, int msgtype)
|
||||||
{
|
{
|
||||||
struct rtnl_link **tab;
|
struct rtnl_link __rcu **tab;
|
||||||
|
|
||||||
if (protocol >= ARRAY_SIZE(rtnl_msg_handlers))
|
if (protocol >= ARRAY_SIZE(rtnl_msg_handlers))
|
||||||
protocol = PF_UNSPEC;
|
protocol = PF_UNSPEC;
|
||||||
|
@ -166,7 +166,7 @@ static struct rtnl_link *rtnl_get_link(int protocol, int msgtype)
|
||||||
if (!tab)
|
if (!tab)
|
||||||
tab = rcu_dereference_rtnl(rtnl_msg_handlers[PF_UNSPEC]);
|
tab = rcu_dereference_rtnl(rtnl_msg_handlers[PF_UNSPEC]);
|
||||||
|
|
||||||
return tab[msgtype];
|
return rcu_dereference_rtnl(tab[msgtype]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtnl_register_internal(struct module *owner,
|
static int rtnl_register_internal(struct module *owner,
|
||||||
|
@ -183,7 +183,7 @@ static int rtnl_register_internal(struct module *owner,
|
||||||
msgindex = rtm_msgindex(msgtype);
|
msgindex = rtm_msgindex(msgtype);
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
tab = rtnl_msg_handlers[protocol];
|
tab = rtnl_dereference(rtnl_msg_handlers[protocol]);
|
||||||
if (tab == NULL) {
|
if (tab == NULL) {
|
||||||
tab = kcalloc(RTM_NR_MSGTYPES, sizeof(void *), GFP_KERNEL);
|
tab = kcalloc(RTM_NR_MSGTYPES, sizeof(void *), GFP_KERNEL);
|
||||||
if (!tab)
|
if (!tab)
|
||||||
|
@ -286,7 +286,8 @@ void rtnl_register(int protocol, int msgtype,
|
||||||
*/
|
*/
|
||||||
int rtnl_unregister(int protocol, int msgtype)
|
int rtnl_unregister(int protocol, int msgtype)
|
||||||
{
|
{
|
||||||
struct rtnl_link **tab, *link;
|
struct rtnl_link __rcu **tab;
|
||||||
|
struct rtnl_link *link;
|
||||||
int msgindex;
|
int msgindex;
|
||||||
|
|
||||||
BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
|
BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
|
||||||
|
@ -299,7 +300,7 @@ int rtnl_unregister(int protocol, int msgtype)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
link = tab[msgindex];
|
link = rtnl_dereference(tab[msgindex]);
|
||||||
rcu_assign_pointer(tab[msgindex], NULL);
|
rcu_assign_pointer(tab[msgindex], NULL);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
||||||
|
@ -318,20 +319,21 @@ EXPORT_SYMBOL_GPL(rtnl_unregister);
|
||||||
*/
|
*/
|
||||||
void rtnl_unregister_all(int protocol)
|
void rtnl_unregister_all(int protocol)
|
||||||
{
|
{
|
||||||
struct rtnl_link **tab, *link;
|
struct rtnl_link __rcu **tab;
|
||||||
|
struct rtnl_link *link;
|
||||||
int msgindex;
|
int msgindex;
|
||||||
|
|
||||||
BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
|
BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
tab = rtnl_msg_handlers[protocol];
|
tab = rtnl_dereference(rtnl_msg_handlers[protocol]);
|
||||||
if (!tab) {
|
if (!tab) {
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RCU_INIT_POINTER(rtnl_msg_handlers[protocol], NULL);
|
RCU_INIT_POINTER(rtnl_msg_handlers[protocol], NULL);
|
||||||
for (msgindex = 0; msgindex < RTM_NR_MSGTYPES; msgindex++) {
|
for (msgindex = 0; msgindex < RTM_NR_MSGTYPES; msgindex++) {
|
||||||
link = tab[msgindex];
|
link = rtnl_dereference(tab[msgindex]);
|
||||||
if (!link)
|
if (!link)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -3754,7 +3756,7 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
|
||||||
s_idx = 1;
|
s_idx = 1;
|
||||||
|
|
||||||
for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
|
for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
|
||||||
struct rtnl_link **tab;
|
struct rtnl_link __rcu **tab;
|
||||||
struct rtnl_link *link;
|
struct rtnl_link *link;
|
||||||
rtnl_dumpit_func dumpit;
|
rtnl_dumpit_func dumpit;
|
||||||
|
|
||||||
|
@ -3768,7 +3770,7 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
|
||||||
if (!tab)
|
if (!tab)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
link = tab[type];
|
link = rcu_dereference_rtnl(tab[type]);
|
||||||
if (!link)
|
if (!link)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче