[NET]: Add some acquires/releases sparse annotations.

Add __acquires() and __releases() annotations to suppress some sparse
warnings.

example of warnings :

net/ipv4/udp.c:1555:14: warning: context imbalance in 'udp_seq_start' - wrong
count at exit
net/ipv4/udp.c:1571:13: warning: context imbalance in 'udp_seq_stop' -
unexpected unlock

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet 2008-01-01 21:58:02 -08:00 коммит произвёл David S. Miller
Родитель b950dfcf50
Коммит 9a429c4983
16 изменённых файлов: 36 добавлений и 0 удалений

Просмотреть файл

@ -2368,6 +2368,7 @@ static int dev_ifconf(struct net *net, char __user *arg)
* in detail. * in detail.
*/ */
void *dev_seq_start(struct seq_file *seq, loff_t *pos) void *dev_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(dev_base_lock)
{ {
struct net *net = seq_file_net(seq); struct net *net = seq_file_net(seq);
loff_t off; loff_t off;
@ -2394,6 +2395,7 @@ void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
void dev_seq_stop(struct seq_file *seq, void *v) void dev_seq_stop(struct seq_file *seq, void *v)
__releases(dev_base_lock)
{ {
read_unlock(&dev_base_lock); read_unlock(&dev_base_lock);
} }

Просмотреть файл

@ -186,6 +186,7 @@ EXPORT_SYMBOL(dev_mc_unsync);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos) static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(dev_base_lock)
{ {
struct net *net = seq_file_net(seq); struct net *net = seq_file_net(seq);
struct net_device *dev; struct net_device *dev;
@ -206,6 +207,7 @@ static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void dev_mc_seq_stop(struct seq_file *seq, void *v) static void dev_mc_seq_stop(struct seq_file *seq, void *v)
__releases(dev_base_lock)
{ {
read_unlock(&dev_base_lock); read_unlock(&dev_base_lock);
} }

Просмотреть файл

@ -55,6 +55,7 @@ rtattr_failure:
int int
gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type, gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type,
int xstats_type, spinlock_t *lock, struct gnet_dump *d) int xstats_type, spinlock_t *lock, struct gnet_dump *d)
__acquires(lock)
{ {
memset(d, 0, sizeof(*d)); memset(d, 0, sizeof(*d));

Просмотреть файл

@ -2313,6 +2313,7 @@ static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos)
} }
void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags) void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
__acquires(tbl->lock)
{ {
struct neigh_seq_state *state = seq->private; struct neigh_seq_state *state = seq->private;
loff_t pos_minus_one; loff_t pos_minus_one;
@ -2356,6 +2357,7 @@ out:
EXPORT_SYMBOL(neigh_seq_next); EXPORT_SYMBOL(neigh_seq_next);
void neigh_seq_stop(struct seq_file *seq, void *v) void neigh_seq_stop(struct seq_file *seq, void *v)
__releases(tbl->lock)
{ {
struct neigh_seq_state *state = seq->private; struct neigh_seq_state *state = seq->private;
struct neigh_table *tbl = state->tbl; struct neigh_table *tbl = state->tbl;

Просмотреть файл

@ -2025,6 +2025,7 @@ EXPORT_SYMBOL(proto_unregister);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static void *proto_seq_start(struct seq_file *seq, loff_t *pos) static void *proto_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(proto_list_lock)
{ {
read_lock(&proto_list_lock); read_lock(&proto_list_lock);
return seq_list_start_head(&proto_list, *pos); return seq_list_start_head(&proto_list, *pos);
@ -2036,6 +2037,7 @@ static void *proto_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void proto_seq_stop(struct seq_file *seq, void *v) static void proto_seq_stop(struct seq_file *seq, void *v)
__releases(proto_list_lock)
{ {
read_unlock(&proto_list_lock); read_unlock(&proto_list_lock);
} }

Просмотреть файл

@ -936,6 +936,7 @@ static struct fib_alias *fib_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *fib_seq_start(struct seq_file *seq, loff_t *pos) static void *fib_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(fib_hash_lock)
{ {
void *v = NULL; void *v = NULL;
@ -952,6 +953,7 @@ static void *fib_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void fib_seq_stop(struct seq_file *seq, void *v) static void fib_seq_stop(struct seq_file *seq, void *v)
__releases(fib_hash_lock)
{ {
read_unlock(&fib_hash_lock); read_unlock(&fib_hash_lock);
} }

Просмотреть файл

@ -96,6 +96,7 @@ EXPORT_SYMBOL(inet_put_port);
* exclusive lock release). It should be ifdefed really. * exclusive lock release). It should be ifdefed really.
*/ */
void inet_listen_wlock(struct inet_hashinfo *hashinfo) void inet_listen_wlock(struct inet_hashinfo *hashinfo)
__acquires(hashinfo->lhash_lock)
{ {
write_lock(&hashinfo->lhash_lock); write_lock(&hashinfo->lhash_lock);

Просмотреть файл

@ -1550,6 +1550,7 @@ static struct sock *udp_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *udp_seq_start(struct seq_file *seq, loff_t *pos) static void *udp_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(udp_hash_lock)
{ {
read_lock(&udp_hash_lock); read_lock(&udp_hash_lock);
return *pos ? udp_get_idx(seq, *pos-1) : (void *)1; return *pos ? udp_get_idx(seq, *pos-1) : (void *)1;
@ -1569,6 +1570,7 @@ static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void udp_seq_stop(struct seq_file *seq, void *v) static void udp_seq_stop(struct seq_file *seq, void *v)
__releases(udp_hash_lock)
{ {
read_unlock(&udp_hash_lock); read_unlock(&udp_hash_lock);
} }

Просмотреть файл

@ -504,6 +504,7 @@ static struct ifacaddr6 *ac6_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *ac6_seq_start(struct seq_file *seq, loff_t *pos) static void *ac6_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(dev_base_lock)
{ {
read_lock(&dev_base_lock); read_lock(&dev_base_lock);
return ac6_get_idx(seq, *pos); return ac6_get_idx(seq, *pos);
@ -518,6 +519,7 @@ static void *ac6_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void ac6_seq_stop(struct seq_file *seq, void *v) static void ac6_seq_stop(struct seq_file *seq, void *v)
__releases(dev_base_lock)
{ {
struct ac6_iter_state *state = ac6_seq_private(seq); struct ac6_iter_state *state = ac6_seq_private(seq);
if (likely(state->idev != NULL)) { if (likely(state->idev != NULL)) {

Просмотреть файл

@ -629,6 +629,7 @@ static struct ip6_flowlabel *ip6fl_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *ip6fl_seq_start(struct seq_file *seq, loff_t *pos) static void *ip6fl_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(ip6_fl_lock)
{ {
read_lock_bh(&ip6_fl_lock); read_lock_bh(&ip6_fl_lock);
return *pos ? ip6fl_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; return *pos ? ip6fl_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
@ -647,6 +648,7 @@ static void *ip6fl_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void ip6fl_seq_stop(struct seq_file *seq, void *v) static void ip6fl_seq_stop(struct seq_file *seq, void *v)
__releases(ip6_fl_lock)
{ {
read_unlock_bh(&ip6_fl_lock); read_unlock_bh(&ip6_fl_lock);
} }

Просмотреть файл

@ -2373,6 +2373,7 @@ static struct ifmcaddr6 *igmp6_mc_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *igmp6_mc_seq_start(struct seq_file *seq, loff_t *pos) static void *igmp6_mc_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(dev_base_lock)
{ {
read_lock(&dev_base_lock); read_lock(&dev_base_lock);
return igmp6_mc_get_idx(seq, *pos); return igmp6_mc_get_idx(seq, *pos);
@ -2387,6 +2388,7 @@ static void *igmp6_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void igmp6_mc_seq_stop(struct seq_file *seq, void *v) static void igmp6_mc_seq_stop(struct seq_file *seq, void *v)
__releases(dev_base_lock)
{ {
struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
if (likely(state->idev != NULL)) { if (likely(state->idev != NULL)) {
@ -2516,6 +2518,7 @@ static struct ip6_sf_list *igmp6_mcf_get_idx(struct seq_file *seq, loff_t pos)
} }
static void *igmp6_mcf_seq_start(struct seq_file *seq, loff_t *pos) static void *igmp6_mcf_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(dev_base_lock)
{ {
read_lock(&dev_base_lock); read_lock(&dev_base_lock);
return *pos ? igmp6_mcf_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; return *pos ? igmp6_mcf_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
@ -2533,6 +2536,7 @@ static void *igmp6_mcf_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void igmp6_mcf_seq_stop(struct seq_file *seq, void *v) static void igmp6_mcf_seq_stop(struct seq_file *seq, void *v)
__releases(dev_base_lock)
{ {
struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq); struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
if (likely(state->im != NULL)) { if (likely(state->im != NULL)) {

Просмотреть файл

@ -171,6 +171,7 @@ static void netlink_sock_destruct(struct sock *sk)
*/ */
static void netlink_table_grab(void) static void netlink_table_grab(void)
__acquires(nl_table_lock)
{ {
write_lock_irq(&nl_table_lock); write_lock_irq(&nl_table_lock);
@ -193,6 +194,7 @@ static void netlink_table_grab(void)
} }
static inline void netlink_table_ungrab(void) static inline void netlink_table_ungrab(void)
__releases(nl_table_lock)
{ {
write_unlock_irq(&nl_table_lock); write_unlock_irq(&nl_table_lock);
wake_up(&nl_table_wait); wake_up(&nl_table_wait);
@ -1728,6 +1730,7 @@ static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
} }
static void *netlink_seq_start(struct seq_file *seq, loff_t *pos) static void *netlink_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(nl_table_lock)
{ {
read_lock(&nl_table_lock); read_lock(&nl_table_lock);
return *pos ? netlink_seq_socket_idx(seq, *pos - 1) : SEQ_START_TOKEN; return *pos ? netlink_seq_socket_idx(seq, *pos - 1) : SEQ_START_TOKEN;
@ -1776,6 +1779,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void netlink_seq_stop(struct seq_file *seq, void *v) static void netlink_seq_stop(struct seq_file *seq, void *v)
__releases(nl_table_lock)
{ {
read_unlock(&nl_table_lock); read_unlock(&nl_table_lock);
} }

Просмотреть файл

@ -40,12 +40,16 @@
*/ */
void qdisc_lock_tree(struct net_device *dev) void qdisc_lock_tree(struct net_device *dev)
__acquires(dev->queue_lock)
__acquires(dev->ingress_lock)
{ {
spin_lock_bh(&dev->queue_lock); spin_lock_bh(&dev->queue_lock);
spin_lock(&dev->ingress_lock); spin_lock(&dev->ingress_lock);
} }
void qdisc_unlock_tree(struct net_device *dev) void qdisc_unlock_tree(struct net_device *dev)
__releases(dev->ingress_lock)
__releases(dev->queue_lock)
{ {
spin_unlock(&dev->ingress_lock); spin_unlock(&dev->ingress_lock);
spin_unlock_bh(&dev->queue_lock); spin_unlock_bh(&dev->queue_lock);

Просмотреть файл

@ -1127,6 +1127,7 @@ struct handle {
}; };
static void *c_start(struct seq_file *m, loff_t *pos) static void *c_start(struct seq_file *m, loff_t *pos)
__acquires(cd->hash_lock)
{ {
loff_t n = *pos; loff_t n = *pos;
unsigned hash, entry; unsigned hash, entry;
@ -1183,6 +1184,7 @@ static void *c_next(struct seq_file *m, void *p, loff_t *pos)
} }
static void c_stop(struct seq_file *m, void *p) static void c_stop(struct seq_file *m, void *p)
__releases(cd->hash_lock)
{ {
struct cache_detail *cd = ((struct handle*)m->private)->cd; struct cache_detail *cd = ((struct handle*)m->private)->cd;
read_unlock(&cd->hash_lock); read_unlock(&cd->hash_lock);

Просмотреть файл

@ -2033,6 +2033,7 @@ static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
static void *unix_seq_start(struct seq_file *seq, loff_t *pos) static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
__acquires(unix_table_lock)
{ {
struct unix_iter_state *iter = seq->private; struct unix_iter_state *iter = seq->private;
spin_lock(&unix_table_lock); spin_lock(&unix_table_lock);
@ -2055,6 +2056,7 @@ static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
} }
static void unix_seq_stop(struct seq_file *seq, void *v) static void unix_seq_stop(struct seq_file *seq, void *v)
__releases(unix_table_lock)
{ {
spin_unlock(&unix_table_lock); spin_unlock(&unix_table_lock);
} }

Просмотреть файл

@ -211,6 +211,7 @@ static struct xfrm_state_afinfo *xfrm_state_lock_afinfo(unsigned int family)
} }
static void xfrm_state_unlock_afinfo(struct xfrm_state_afinfo *afinfo) static void xfrm_state_unlock_afinfo(struct xfrm_state_afinfo *afinfo)
__releases(xfrm_state_afinfo_lock)
{ {
write_unlock_bh(&xfrm_state_afinfo_lock); write_unlock_bh(&xfrm_state_afinfo_lock);
} }
@ -1909,6 +1910,7 @@ static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family)
} }
static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo) static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
__releases(xfrm_state_afinfo_lock)
{ {
read_unlock(&xfrm_state_afinfo_lock); read_unlock(&xfrm_state_afinfo_lock);
} }