percpu: add __percpu sparse annotations to net
Subsystems (6)
PATCH 1/2 percpu: add __percpu sparse annotations to net
Add __percpu sparse annotations to net.
These annotations are to make sparse consider percpu variables to be in a different address space and warn if accessed without going through percpu accessors. This patch doesn't affect normal builds.
The macro and type tricks around snmp stats make things a bit interesting. DEFINE/DECLARE_SNMP_STAT() macros mark the target field as __percpu and SNMP_UPD_PO_STATS() macro is updated accordingly. All snmp_mib_*() users which used to cast the argument to (void **) are updated to cast it to (void __percpu **).
---
David, these two patches require the following commit from mainline to define dummy __percpu.
2938429501b73f6aeb312236eac7ed0416a07cd5
Thank you.
include/net/ip.h | 6 ++--- include/net/ipcomp.h | 2 - include/net/neighbour.h | 2 - include/net/netns/conntrack.h | 2 - include/net/netns/core.h | 2 - include/net/route.h | 2 - include/net/snmp.h | 12 +++++++--- include/net/tcp.h | 2 - net/8021q/vlan.h | 2 - net/dccp/proto.c | 5 ++-- net/ipv4/af_inet.c | 46 +++++++++++++++++++++--------------------- net/ipv4/proc.c | 28 ++++++++++++------------- net/ipv4/route.c | 2 - net/ipv4/tcp.c | 21 ++++++++++--------- net/ipv6/addrconf.c | 24 ++++++++++----------- net/ipv6/af_inet6.c | 28 ++++++++++++------------- net/ipv6/proc.c | 23 +++++++++++---------- net/sctp/proc.c | 2 - net/sctp/protocol.c | 5 ++-- net/xfrm/xfrm_ipcomp.c | 16 +++++++------- net/xfrm/xfrm_policy.c | 6 ++--- net/xfrm/xfrm_proc.c | 3 +- 22 files changed, 127 insertions(+), 114 deletions(-)
include/net/ip.h +3 -3
@@ -174,9 +174,9 @@ extern struct ipv4_config ipv4_config;#define NET_ADD_STATS_BH (net, field, adnd) SNMP_ADD_STATS_BH((net)->mib.net_statistics, field, adnd)#define NET_ADD_STATS_USER (net, field, adnd) SNMP_ADD_STATS_USER((net)->mib.net_statistics, field, adnd) -extern unsigned long snmp_fold_field (void *mib[],int offt); -extern int snmp_mib_init (void *ptr[2 ],size_t mibsize); -extern void snmp_mib_free (void *ptr[2 ]); +extern unsigned long snmp_fold_field (void __percpu *mib[],int offt); +extern int snmp_mib_init (void __percpu *ptr[2 ],size_t mibsize); +extern void snmp_mib_free (void __percpu *ptr[2 ]); extern struct local_ports { seqlock_t lock;
include/net/ipcomp.h +1 -1
@@ -9,7 +9,7 @@ struct crypto_comp;struct ipcomp_data {u16 threshold; -struct crypto_comp **tfms; +struct crypto_comp *__percpu *tfms; };struct ip_comp_hdr ;
include/net/neighbour.h +1 -1
@@ -164,7 +164,7 @@ struct neigh_table {rwlock_t lock;unsigned long last_rand;struct kmem_cache *kmem_cachep; -struct neigh_statistics *stats; +struct neigh_statistics __percpu *stats;struct neighbour **hash_buckets;unsigned int hash_mask;__u32 hash_rnd;
include/net/netns/conntrack.h +1 -1
@@ -17,7 +17,7 @@ struct netns_ct {struct hlist_head *expect_hash;struct hlist_nulls_head unconfirmed;struct hlist_nulls_head dying; -struct ip_conntrack_stat *stat; +struct ip_conntrack_stat __percpu *stat;int sysctl_events;unsigned int sysctl_events_retry_timeout;int sysctl_acct;
include/net/netns/core.h +1 -1
@@ -10,7 +10,7 @@ struct netns_core {int sysctl_somaxconn; - struct prot_inuse *inuse; + struct prot_inuse __percpu *inuse; };#endif
include/net/route.h +1 -1
@@ -101,7 +101,7 @@ struct rt_cache_stat {unsigned int out_hlist_search; }; -extern struct ip_rt_acct *ip_rt_acct; +extern struct ip_rt_acct __percpu *ip_rt_acct;struct in_device ;extern int ip_rt_init (void );
include/net/snmp.h +8 -4
@@ -129,9 +129,9 @@ struct linux_xfrm_mib {* nonlocked_atomic_inc() primitives -AK */ #define DEFINE_SNMP_STAT (type, name) \ - __typeof__(type) *name[2] + __typeof__(type) __percpu *name[2]#define DECLARE_SNMP_STAT (type, name) \ - extern __typeof__(type) *name[2] + extern __typeof__(type) __percpu *name[2]#define SNMP_STAT_BHPTR (name) (name[0])#define SNMP_STAT_USRPTR (name) (name[1])
@@ -148,9 +148,13 @@ struct linux_xfrm_mib { __this_cpu_add(mib[0]->mibs[field], addend)#define SNMP_ADD_STATS_USER (mib, field, addend) \ this_cpu_add(mib[1]->mibs[field], addend) +/* +* Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" +* to make @ptr a non-percpu pointer. +*/ #define SNMP_UPD_PO_STATS (mib, basefield, addend) \ do { \ - __typeof__(mib[0]) ptr; \ + __typeof__(*mib[0]) *ptr; \ preempt_disable(); \ ptr = this_cpu_ptr((mib)[!in_softirq()]); \ ptr->mibs[basefield##PKTS]++; \
@@ -159,7 +163,7 @@ struct linux_xfrm_mib { } while (0)#define SNMP_UPD_PO_STATS_BH (mib, basefield, addend) \ do { \ - __typeof__(mib[0]) ptr = \ + __typeof__(*mib[0]) *ptr = \ __this_cpu_ptr((mib)[!in_softirq()]); \ ptr->mibs[basefield##PKTS]++; \ ptr->mibs[basefield##OCTETS] += addend;\
include/net/tcp.h +1 -1
@@ -1189,7 +1189,7 @@ extern int tcp_v4_md5_do_del(struct so#define tcp_twsk_md5_key (twsk) NULL#endif -extern struct tcp_md5sig_pool **tcp_alloc_md5sig_pool (struct sock *); +extern struct tcp_md5sig_pool *__percpu *tcp_alloc_md5sig_pool (struct sock *);extern void tcp_free_md5sig_pool (void );extern struct tcp_md5sig_pool *__tcp_get_md5sig_pool (int cpu);
net/8021q/vlan.h +1 -1
@@ -61,7 +61,7 @@ struct vlan_dev_info {struct proc_dir_entry *dent;unsigned long cnt_inc_headroom_on_tx;unsigned long cnt_encap_on_xmit; -struct vlan_rx_stats *vlan_rx_stats; +struct vlan_rx_stats __percpu *vlan_rx_stats; };static inline struct vlan_dev_info *vlan_dev_info (const struct net_device *dev)
net/dccp/proto.c +3 -2
@@ -1005,12 +1005,13 @@ EXPORT_SYMBOL_GPL(dccp_shutdown);static inline int dccp_mib_init (void ) { -return snmp_mib_init ((void **)dccp_statistics,sizeof (struct dccp_mib )); +return snmp_mib_init ((void __percpu **)dccp_statistics, +sizeof (struct dccp_mib )); }static inline void dccp_mib_exit (void ) { -snmp_mib_free ((void **)dccp_statistics); +snmp_mib_free ((void __percpu **)dccp_statistics); }static int thash_entries;
net/ipv4/af_inet.c +23 -23
99 lines not on this page · raw message
net/ipv4/proc.c +14 -14
@@ -280,7 +280,7 @@ static void icmpmsg_put(struct seq_file count =0 ;for (i =0 ; i <ICMPMSG_MIB_MAX ; i++) { - val =snmp_fold_field ((void **) net->mib.icmpmsg_statistics, i); + val =snmp_fold_field ((void __percpu **) net->mib.icmpmsg_statistics, i);if (val) { type[count] = i; vals[count++] = val;
@@ -307,18 +307,18 @@ static void icmp_put(struct seq_file *sefor (i=0 ; icmpmibmap[i].name !=NULL ; i++)seq_printf (seq," Out%s" , icmpmibmap[i].name);seq_printf (seq,"\nIcmp: %lu %lu" , -snmp_fold_field ((void **) net->mib.icmp_statistics,ICMP_MIB_INMSGS ), -snmp_fold_field ((void **) net->mib.icmp_statistics,ICMP_MIB_INERRORS )); +snmp_fold_field ((void __percpu **) net->mib.icmp_statistics,ICMP_MIB_INMSGS ), +snmp_fold_field ((void __percpu **) net->mib.icmp_statistics,ICMP_MIB_INERRORS ));for (i=0 ; icmpmibmap[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **) net->mib.icmpmsg_statistics, +snmp_fold_field ((void __percpu **) net->mib.icmpmsg_statistics, icmpmibmap[i].index));seq_printf (seq," %lu %lu" , -snmp_fold_field ((void **) net->mib.icmp_statistics,ICMP_MIB_OUTMSGS ), -snmp_fold_field ((void **) net->mib.icmp_statistics,ICMP_MIB_OUTERRORS )); +snmp_fold_field ((void __percpu **) net->mib.icmp_statistics,ICMP_MIB_OUTMSGS ), +snmp_fold_field ((void __percpu **) net->mib.icmp_statistics,ICMP_MIB_OUTERRORS ));for (i=0 ; icmpmibmap[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **) net->mib.icmpmsg_statistics, +snmp_fold_field ((void __percpu **) net->mib.icmpmsg_statistics, icmpmibmap[i].index |0x100 )); }
@@ -341,7 +341,7 @@ static int snmp_seq_show(struct seq_filefor (i =0 ; snmp4_ipstats_list[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.ip_statistics, +snmp_fold_field ((void __percpu **)net->mib.ip_statistics, snmp4_ipstats_list[i].entry));icmp_put (seq);/* RFC 2011 compatibility */
@@ -356,11 +356,11 @@ static int snmp_seq_show(struct seq_file/* MaxConn field is signed, RFC 2012 */ if (snmp4_tcp_list[i].entry ==TCP_MIB_MAXCONN )seq_printf (seq," %ld" , -snmp_fold_field ((void **)net->mib.tcp_statistics, +snmp_fold_field ((void __percpu **)net->mib.tcp_statistics, snmp4_tcp_list[i].entry));else seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.tcp_statistics, +snmp_fold_field ((void __percpu **)net->mib.tcp_statistics, snmp4_tcp_list[i].entry)); }
@@ -371,7 +371,7 @@ static int snmp_seq_show(struct seq_fileseq_puts (seq,"\nUdp:" );for (i =0 ; snmp4_udp_list[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.udp_statistics, +snmp_fold_field ((void __percpu **)net->mib.udp_statistics, snmp4_udp_list[i].entry));/* the UDP and UDP-Lite MIBs are the same */
@@ -382,7 +382,7 @@ static int snmp_seq_show(struct seq_fileseq_puts (seq,"\nUdpLite:" );for (i =0 ; snmp4_udp_list[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.udplite_statistics, +snmp_fold_field ((void __percpu **)net->mib.udplite_statistics, snmp4_udp_list[i].entry));seq_putc (seq,'\n' );
@@ -419,7 +419,7 @@ static int netstat_seq_show(struct seq_fseq_puts (seq,"\nTcpExt:" );for (i =0 ; snmp4_net_list[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.net_statistics, +snmp_fold_field ((void __percpu **)net->mib.net_statistics, snmp4_net_list[i].entry));seq_puts (seq,"\nIpExt:" );
@@ -429,7 +429,7 @@ static int netstat_seq_show(struct seq_fseq_puts (seq,"\nIpExt:" );for (i =0 ; snmp4_ipextstats_list[i].name !=NULL ; i++)seq_printf (seq," %lu" , -snmp_fold_field ((void **)net->mib.ip_statistics, +snmp_fold_field ((void __percpu **)net->mib.ip_statistics, snmp4_ipextstats_list[i].entry));seq_putc (seq,'\n' );
net/ipv4/route.c +1 -1
@@ -3334,7 +3334,7 @@ static __net_initdata struct pernet_oper#ifdef CONFIG_NET_CLS_ROUTE -struct ip_rt_acct *ip_rt_acct__read_mostly ; +struct ip_rt_acct __percpu *ip_rt_acct__read_mostly ;#endif /* CONFIG_NET_CLS_ROUTE */ static __initdata unsigned long rhash_entries;
net/ipv4/tcp.c +12 -9
@@ -2788,10 +2788,10 @@ EXPORT_SYMBOL(tcp_gro_complete);#ifdef CONFIG_TCP_MD5SIG static unsigned long tcp_md5sig_users; -static struct tcp_md5sig_pool **tcp_md5sig_pool; +static struct tcp_md5sig_pool *__percpu *tcp_md5sig_pool;static DEFINE_SPINLOCK (tcp_md5sig_pool_lock); -static void __tcp_free_md5sig_pool (struct tcp_md5sig_pool **pool) +static void __tcp_free_md5sig_pool (struct tcp_md5sig_pool *__percpu *pool) {int cpu;for_each_possible_cpu (cpu) {
@@ -2808,7 +2808,7 @@ static void __tcp_free_md5sig_pool(strucvoid tcp_free_md5sig_pool (void ) { -struct tcp_md5sig_pool **pool =NULL ; +struct tcp_md5sig_pool *__percpu *pool =NULL ;spin_lock_bh (&tcp_md5sig_pool_lock);if (--tcp_md5sig_users ==0 ) {
@@ -2822,10 +2822,11 @@ void tcp_free_md5sig_pool(void)EXPORT_SYMBOL (tcp_free_md5sig_pool); -static struct tcp_md5sig_pool **__tcp_alloc_md5sig_pool (struct sock *sk) +static struct tcp_md5sig_pool *__percpu * +__tcp_alloc_md5sig_pool (struct sock *sk) {int cpu; -struct tcp_md5sig_pool **pool; +struct tcp_md5sig_pool *__percpu *pool; pool = alloc_percpu(struct tcp_md5sig_pool *);if (!pool)
@@ -2852,9 +2853,9 @@ out_free:return NULL ; } -struct tcp_md5sig_pool **tcp_alloc_md5sig_pool (struct sock *sk) +struct tcp_md5sig_pool *__percpu *tcp_alloc_md5sig_pool (struct sock *sk) { -struct tcp_md5sig_pool **pool; +struct tcp_md5sig_pool *__percpu *pool;int alloc =0 ; retry:
@@ -2873,7 +2874,9 @@ retry:if (alloc) {/* we cannot hold spinlock here because this may sleep. */ -struct tcp_md5sig_pool **p =__tcp_alloc_md5sig_pool (sk); +struct tcp_md5sig_pool *__percpu *p; + + p =__tcp_alloc_md5sig_pool (sk);spin_lock_bh (&tcp_md5sig_pool_lock);if (!p) { tcp_md5sig_users--;
@@ -2897,7 +2900,7 @@ EXPORT_SYMBOL(tcp_alloc_md5sig_pool);struct tcp_md5sig_pool *__tcp_get_md5sig_pool (int cpu) { -struct tcp_md5sig_pool **p; +struct tcp_md5sig_pool *__percpu *p;spin_lock_bh (&tcp_md5sig_pool_lock); p = tcp_md5sig_pool;if (p)
net/ipv6/addrconf.c +12 -12
@@ -278,31 +278,31 @@ static void addrconf_mod_timer(struct instatic int snmp6_alloc_dev (struct inet6_dev *idev) { -if (snmp_mib_init ((void **)idev->stats.ipv6, +if (snmp_mib_init ((void __percpu **)idev->stats.ipv6,sizeof (struct ipstats_mib )) <0 ) goto err_ip; -if (snmp_mib_init ((void **)idev->stats.icmpv6, +if (snmp_mib_init ((void __percpu **)idev->stats.icmpv6,sizeof (struct icmpv6_mib )) <0 ) goto err_icmp; -if (snmp_mib_init ((void **)idev->stats.icmpv6msg, +if (snmp_mib_init ((void __percpu **)idev->stats.icmpv6msg,sizeof (struct icmpv6msg_mib )) <0 ) goto err_icmpmsg;return 0 ; err_icmpmsg: -snmp_mib_free ((void **)idev->stats.icmpv6); +snmp_mib_free ((void __percpu **)idev->stats.icmpv6); err_icmp: -snmp_mib_free ((void **)idev->stats.ipv6); +snmp_mib_free ((void __percpu **)idev->stats.ipv6); err_ip:return -ENOMEM ; }static void snmp6_free_dev (struct inet6_dev *idev) { -snmp_mib_free ((void **)idev->stats.icmpv6msg); -snmp_mib_free ((void **)idev->stats.icmpv6); -snmp_mib_free ((void **)idev->stats.ipv6); +snmp_mib_free ((void __percpu **)idev->stats.icmpv6msg); +snmp_mib_free ((void __percpu **)idev->stats.icmpv6); +snmp_mib_free ((void __percpu **)idev->stats.ipv6); }/* Nobody refers to this device, we may destroy it. */
@@ -3766,8 +3766,8 @@ static inline size_t inet6_if_nlmsg_size ); } -static inline void __snmp6_fill_stats (u64 *stats,void **mib,int items, -int bytes) +static inline void __snmp6_fill_stats (u64 *stats,void __percpu **mib, +int items,int bytes) {int i;int pad = bytes -sizeof (u64) * items;
@@ -3786,10 +3786,10 @@ static void snmp6_fill_stats(u64 *stats, {switch (attrtype) {case IFLA_INET6_STATS : -__snmp6_fill_stats (stats, (void **)idev->stats.ipv6,IPSTATS_MIB_MAX , bytes); +__snmp6_fill_stats (stats, (void __percpu **)idev->stats.ipv6,IPSTATS_MIB_MAX , bytes);break ;case IFLA_INET6_ICMP6STATS : -__snmp6_fill_stats (stats, (void **)idev->stats.icmpv6,ICMP6_MIB_MAX , bytes); +__snmp6_fill_stats (stats, (void __percpu **)idev->stats.icmpv6,ICMP6_MIB_MAX , bytes);break ; } }
net/ipv6/af_inet6.c +14 -14
@@ -971,41 +971,41 @@ static void ipv6_packet_cleanup(void)static int __net_init ipv6_init_mibs (struct net *net) { -if (snmp_mib_init ((void **)net->mib.udp_stats_in6, +if (snmp_mib_init ((void __percpu **)net->mib.udp_stats_in6,sizeof (struct udp_mib )) <0 )return -ENOMEM ; -if (snmp_mib_init ((void **)net->mib.udplite_stats_in6, +if (snmp_mib_init ((void __percpu **)net->mib.udplite_stats_in6,sizeof (struct udp_mib )) <0 ) goto err_udplite_mib; -if (snmp_mib_init ((void **)net->mib.ipv6_statistics, +if (snmp_mib_init ((void __percpu **)net->mib.ipv6_statistics,sizeof (struct ipstats_mib )) <0 ) goto err_ip_mib; -if (snmp_mib_init ((void **)net->mib.icmpv6_statistics, +if (snmp_mib_init ((void __percpu **)net->mib.icmpv6_statistics,sizeof (struct icmpv6_mib )) <0 ) goto err_icmp_mib; -if (snmp_mib_init ((void **)net->mib.icmpv6msg_statistics, +if (snmp_mib_init ((void __percpu **)net->mib.icmpv6msg_statistics,sizeof (struct icmpv6msg_mib )) <0 ) goto err_icmpmsg_mib;return 0 ; err_icmpmsg_mib: -snmp_mib_free ((void **)net->mib.icmpv6_statistics); +snmp_mib_free ((void __percpu **)net->mib.icmpv6_statistics); err_icmp_mib: -snmp_mib_free ((void **)net->mib.ipv6_statistics); +snmp_mib_free ((void __percpu **)net->mib.ipv6_statistics); err_ip_mib: -snmp_mib_free ((void **)net->mib.udplite_stats_in6); +snmp_mib_free ((void __percpu **)net->mib.udplite_stats_in6); err_udplite_mib: -snmp_mib_free ((void **)net->mib.udp_stats_in6); +snmp_mib_free ((void __percpu **)net->mib.udp_stats_in6);return -ENOMEM ; }static void ipv6_cleanup_mibs (struct net *net) { -snmp_mib_free ((void **)net->mib.udp_stats_in6); -snmp_mib_free ((void **)net->mib.udplite_stats_in6); -snmp_mib_free ((void **)net->mib.ipv6_statistics); -snmp_mib_free ((void **)net->mib.icmpv6_statistics); -snmp_mib_free ((void **)net->mib.icmpv6msg_statistics); +snmp_mib_free ((void __percpu **)net->mib.udp_stats_in6); +snmp_mib_free ((void __percpu **)net->mib.udplite_stats_in6); +snmp_mib_free ((void __percpu **)net->mib.ipv6_statistics); +snmp_mib_free ((void __percpu **)net->mib.icmpv6_statistics); +snmp_mib_free ((void __percpu **)net->mib.icmpv6msg_statistics); }static int __net_init inet6_net_init (struct net *net)
net/ipv6/proc.c +13 -10
@@ -136,7 +136,7 @@ static const struct snmp_mib snmp6_udpli SNMP_MIB_SENTINEL }; -static void snmp6_seq_show_icmpv6msg (struct seq_file *seq,void **mib) +static void snmp6_seq_show_icmpv6msg (struct seq_file *seq,void __percpu **mib) {char name[32 ];int i;
@@ -170,7 +170,7 @@ static void snmp6_seq_show_icmpv6msg(strreturn ; } -static void snmp6_seq_show_item (struct seq_file *seq,void **mib, +static void snmp6_seq_show_item (struct seq_file *seq,void __percpu **mib,const struct snmp_mib *itemlist) {int i;
@@ -183,14 +183,15 @@ static int snmp6_seq_show(struct seq_fil {struct net *net = (struct net *)seq->private; -snmp6_seq_show_item (seq, (void **)net->mib.ipv6_statistics, +snmp6_seq_show_item (seq, (void __percpu **)net->mib.ipv6_statistics, snmp6_ipstats_list); -snmp6_seq_show_item (seq, (void **)net->mib.icmpv6_statistics, +snmp6_seq_show_item (seq, (void __percpu **)net->mib.icmpv6_statistics, snmp6_icmp6_list); -snmp6_seq_show_icmpv6msg (seq, (void **)net->mib.icmpv6msg_statistics); -snmp6_seq_show_item (seq, (void **)net->mib.udp_stats_in6, +snmp6_seq_show_icmpv6msg (seq, + (void __percpu **)net->mib.icmpv6msg_statistics); +snmp6_seq_show_item (seq, (void __percpu **)net->mib.udp_stats_in6, snmp6_udp6_list); -snmp6_seq_show_item (seq, (void **)net->mib.udplite_stats_in6, +snmp6_seq_show_item (seq, (void __percpu **)net->mib.udplite_stats_in6, snmp6_udplite6_list);return 0 ; }
@@ -213,9 +214,11 @@ static int snmp6_dev_seq_show(struct seqstruct inet6_dev *idev = (struct inet6_dev *)seq->private;seq_printf (seq,"%-32s\t%u\n" ,"ifIndex" , idev->dev->ifindex); -snmp6_seq_show_item (seq, (void **)idev->stats.ipv6, snmp6_ipstats_list); -snmp6_seq_show_item (seq, (void **)idev->stats.icmpv6, snmp6_icmp6_list); -snmp6_seq_show_icmpv6msg (seq, (void **)idev->stats.icmpv6msg); +snmp6_seq_show_item (seq, (void __percpu **)idev->stats.ipv6, + snmp6_ipstats_list); +snmp6_seq_show_item (seq, (void __percpu **)idev->stats.icmpv6, + snmp6_icmp6_list); +snmp6_seq_show_icmpv6msg (seq, (void __percpu **)idev->stats.icmpv6msg);return 0 ; }
net/sctp/proc.c +1 -1
@@ -83,7 +83,7 @@ static int sctp_snmp_seq_show(struct seqfor (i =0 ; sctp_snmp_list[i].name !=NULL ; i++)seq_printf (seq,"%-32s\t%ld\n" , sctp_snmp_list[i].name, -snmp_fold_field ((void **)sctp_statistics, +snmp_fold_field ((void __percpu **)sctp_statistics, sctp_snmp_list[i].entry));return 0 ;
net/sctp/protocol.c +3 -2
@@ -996,12 +996,13 @@ int sctp_register_pf(struct sctp_pf *pf,static inline int init_sctp_mibs (void ) { -return snmp_mib_init ((void **)sctp_statistics,sizeof (struct sctp_mib )); +return snmp_mib_init ((void __percpu **)sctp_statistics, +sizeof (struct sctp_mib )); }static inline void cleanup_sctp_mibs (void ) { -snmp_mib_free ((void **)sctp_statistics); +snmp_mib_free ((void __percpu **)sctp_statistics); }static void sctp_v4_pf_init (void )
net/xfrm/xfrm_ipcomp.c +8 -8
@@ -30,12 +30,12 @@struct ipcomp_tfms {struct list_head list; -struct crypto_comp **tfms; +struct crypto_comp *__percpu *tfms;int users; };static DEFINE_MUTEX (ipcomp_resource_mutex); -static void **ipcomp_scratches; +static void *__percpu *ipcomp_scratches;static int ipcomp_scratch_users;static LIST_HEAD (ipcomp_tfms_list);
@@ -200,7 +200,7 @@ EXPORT_SYMBOL_GPL(ipcomp_output);static void ipcomp_free_scratches (void ) {int i; -void **scratches; +void *__percpu *scratches;if (--ipcomp_scratch_users)return ;
@@ -215,10 +215,10 @@ static void ipcomp_free_scratches(void)free_percpu (scratches); } -static void **ipcomp_alloc_scratches (void ) +static void *__percpu *ipcomp_alloc_scratches (void ) {int i; -void **scratches; +void *__percpu *scratches;if (ipcomp_scratch_users++)return ipcomp_scratches;
@@ -239,7 +239,7 @@ static void **ipcomp_alloc_scratches(voireturn scratches; } -static void ipcomp_free_tfms (struct crypto_comp **tfms) +static void ipcomp_free_tfms (struct crypto_comp *__percpu *tfms) {struct ipcomp_tfms *pos;int cpu;
@@ -267,10 +267,10 @@ static void ipcomp_free_tfms(struct crypfree_percpu (tfms); } -static struct crypto_comp **ipcomp_alloc_tfms (const char *alg_name) +static struct crypto_comp *__percpu *ipcomp_alloc_tfms (const char *alg_name) {struct ipcomp_tfms *pos; -struct crypto_comp **tfms; +struct crypto_comp *__percpu *tfms;int cpu;/* This can be any valid CPU ID so we don't need locking. */
net/xfrm/xfrm_policy.c +3 -3
@@ -2428,19 +2428,19 @@ static int __net_init xfrm_statistics_in {int rv; -if (snmp_mib_init ((void **)net->mib.xfrm_statistics, +if (snmp_mib_init ((void __percpu **)net->mib.xfrm_statistics,sizeof (struct linux_xfrm_mib )) <0 )return -ENOMEM ; rv =xfrm_proc_init (net);if (rv <0 ) -snmp_mib_free ((void **)net->mib.xfrm_statistics); +snmp_mib_free ((void __percpu **)net->mib.xfrm_statistics);return rv; }static void xfrm_statistics_fini (struct net *net) {xfrm_proc_fini (net); -snmp_mib_free ((void **)net->mib.xfrm_statistics); +snmp_mib_free ((void __percpu **)net->mib.xfrm_statistics); }#else static int __net_init xfrm_statistics_init (struct net *net)
net/xfrm/xfrm_proc.c +2 -1
@@ -50,7 +50,8 @@ static int xfrm_statistics_seq_show(struint i;for (i=0 ; xfrm_mib_list[i].name; i++)seq_printf (seq,"%-24s\t%lu\n" , xfrm_mib_list[i].name, -snmp_fold_field ((void **)net->mib.xfrm_statistics, +snmp_fold_field ((void __percpu **) + net->mib.xfrm_statistics, xfrm_mib_list[i].entry));return 0 ; }
PATCH 2/2 percpu: add __percpu sparse annotations to net drivers
Add __percpu sparse annotations to net drivers.
These annotations are to make sparse consider percpu variables to be in a different address space and warn if accessed without going through percpu accessors. This patch doesn't affect normal builds.
--- drivers/net/chelsio/sge.c | 2 +- drivers/net/loopback.c | 16 +++++++++------- drivers/net/veth.c | 4 ++-- include/linux/if_macvlan.h | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-)
drivers/net/chelsio/sge.c +1 -1
@@ -267,7 +267,7 @@ struct sge {struct sk_buff *espibug_skb[MAX_NPORTS ];u32 sge_control;/* shadow value of sge control reg */ struct sge_intr_counts stats; -struct sge_port_stats *port_stats[MAX_NPORTS ]; +struct sge_port_stats __percpu *port_stats[MAX_NPORTS ];struct sched *tx_sched;struct cmdQ cmdQ[SGE_CMDQ_N ]____cacheline_aligned_in_smp ; };
drivers/net/loopback.c +9 -7
@@ -72,7 +72,8 @@ struct pcpu_lstats {static netdev_tx_t loopback_xmit (struct sk_buff *skb,struct net_device *dev) { -struct pcpu_lstats *pcpu_lstats, *lb_stats; +struct pcpu_lstats __percpu *pcpu_lstats; +struct pcpu_lstats *lb_stats;int len;skb_orphan (skb);
@@ -80,7 +81,7 @@ static netdev_tx_t loopback_xmit(struct skb->protocol =eth_type_trans (skb, dev);/* it's OK to use per_cpu_ptr() because BHs are off */ - pcpu_lstats = dev->ml_priv; + pcpu_lstats = (void __percpu __force *)dev->ml_priv; lb_stats =this_cpu_ptr (pcpu_lstats); len = skb->len;
@@ -95,14 +96,14 @@ static netdev_tx_t loopback_xmit(structstatic struct net_device_stats *loopback_get_stats (struct net_device *dev) { -const struct pcpu_lstats *pcpu_lstats; +const struct pcpu_lstats __percpu *pcpu_lstats;struct net_device_stats *stats = &dev->stats;unsigned long bytes =0 ;unsigned long packets =0 ;unsigned long drops =0 ;int i; - pcpu_lstats = dev->ml_priv; + pcpu_lstats = (void __percpu __force *)dev->ml_priv;for_each_possible_cpu (i) {const struct pcpu_lstats *lb_stats;
@@ -135,19 +136,20 @@ static const struct ethtool_ops loopbackstatic int loopback_dev_init (struct net_device *dev) { -struct pcpu_lstats *lstats; +struct pcpu_lstats __percpu *lstats; lstats = alloc_percpu(struct pcpu_lstats);if (!lstats)return -ENOMEM ; - dev->ml_priv = lstats; + dev->ml_priv = (void __force *)lstats;return 0 ; }static void loopback_dev_free (struct net_device *dev) { -struct pcpu_lstats *lstats = dev->ml_priv; +struct pcpu_lstats __percpu *lstats = + (void __percpu __force *)dev->ml_priv;free_percpu (lstats);free_netdev (dev);
drivers/net/veth.c +2 -2
@@ -34,7 +34,7 @@ struct veth_net_stats {struct veth_priv {struct net_device *peer; -struct veth_net_stats *stats; +struct veth_net_stats __percpu *stats;unsigned ip_summed; };
@@ -263,7 +263,7 @@ static int veth_change_mtu(struct net_destatic int veth_dev_init (struct net_device *dev) { -struct veth_net_stats *stats; +struct veth_net_stats __percpu *stats;struct veth_priv *priv; stats = alloc_percpu(struct veth_net_stats);
include/linux/if_macvlan.h +1 -1
@@ -30,7 +30,7 @@ struct macvlan_dev {struct hlist_node hlist;struct macvlan_port *port;struct net_device *lowerdev; -struct macvlan_rx_stats *rx_stats; +struct macvlan_rx_stats __percpu *rx_stats;enum macvlan_mode mode;int (*receive)(struct sk_buff *skb);int (*forward)(struct net_device *dev,struct sk_buff *skb);
Re: [PATCH net-next 2/2] percpu: add __percpu sparse annotations to net drivers
From: Tejun Heo <[email protected]>
Date: Wed, 17 Feb 2010 10:21:08 +0900
Quoted 8 lines
Add
__percpusparse annotations to net drivers.These annotations are to make sparse consider percpu variables to be in a different address space and warn if accessed without going through percpu accessors. This patch doesn't affect normal builds.
Signed-off-by Tejun Heo <[email protected]>Acked-by David S. Miller <[email protected]>
Applied.
From: Tejun Heo <[email protected]>
Date: Wed, 17 Feb 2010 10:20:26 +0900
Quoted 6 lines
Add
__percpusparse annotations to net.These annotations are to make sparse consider percpu variables to be in a different address space and warn if accessed without going through percpu accessors. This patch doesn't affect normal builds.
Quoted 8 lines
The macro and type tricks around snmp stats make things a bit interesting. DEFINE/DECLARE_SNMP_STAT() macros mark the target field as
__percpuandSNMP_UPD_PO_STATS()macro is updated accordingly. All snmp_mib_*() users which used to cast the argument to (void **) are updated to cast it to (void__percpu**).Signed-off-by Tejun Heo <[email protected]>Acked-by David S. Miller <[email protected]>
Applied.