net: clean up snmp stats code
commit8f0ea0fe3a(snmp: reduce percpu needs by 50%) reduced snmp array size to 1, so technically it doesn't have to be an array any more. What's more, after the following commit: commit933393f58fDate: Thu Dec 22 11:58:51 2011 -0600 percpu: Remove irqsafe_cpu_xxx variants We simply say that regular this_cpu use must be safe regardless of preemption and interrupt state. That has no material change for x86 and s390 implementations of this_cpu operations. However, arches that do not provide their own implementation for this_cpu operations will now get code generated that disables interrupts instead of preemption. probably no arch wants to have SNMP_ARRAY_SZ == 2. At least after almost 3 years, no one complains. So, just convert the array to a single pointer and remove snmp_mib_init() and snmp_mib_free() as well. Cc: Christoph Lameter <cl@linux.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
d1f88a667c
commit
698365fa18
+3
-15
@@ -196,27 +196,15 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
#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)
|
||||
|
||||
unsigned long snmp_fold_field(void __percpu *mib[], int offt);
|
||||
unsigned long snmp_fold_field(void __percpu *mib, int offt);
|
||||
#if BITS_PER_LONG==32
|
||||
u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t sync_off);
|
||||
u64 snmp_fold_field64(void __percpu *mib, int offt, size_t sync_off);
|
||||
#else
|
||||
static inline u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t syncp_off)
|
||||
static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_off)
|
||||
{
|
||||
return snmp_fold_field(mib, offt);
|
||||
}
|
||||
#endif
|
||||
int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align);
|
||||
|
||||
static inline void snmp_mib_free(void __percpu *ptr[SNMP_ARRAY_SZ])
|
||||
{
|
||||
int i;
|
||||
|
||||
BUG_ON(ptr == NULL);
|
||||
for (i = 0; i < SNMP_ARRAY_SZ; i++) {
|
||||
free_percpu(ptr[i]);
|
||||
ptr[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void inet_get_local_port_range(struct net *net, int *low, int *high);
|
||||
|
||||
|
||||
+15
-17
@@ -116,51 +116,49 @@ struct linux_xfrm_mib {
|
||||
unsigned long mibs[LINUX_MIB_XFRMMAX];
|
||||
};
|
||||
|
||||
#define SNMP_ARRAY_SZ 1
|
||||
|
||||
#define DEFINE_SNMP_STAT(type, name) \
|
||||
__typeof__(type) __percpu *name[SNMP_ARRAY_SZ]
|
||||
__typeof__(type) __percpu *name
|
||||
#define DEFINE_SNMP_STAT_ATOMIC(type, name) \
|
||||
__typeof__(type) *name
|
||||
#define DECLARE_SNMP_STAT(type, name) \
|
||||
extern __typeof__(type) __percpu *name[SNMP_ARRAY_SZ]
|
||||
extern __typeof__(type) __percpu *name
|
||||
|
||||
#define SNMP_INC_STATS_BH(mib, field) \
|
||||
__this_cpu_inc(mib[0]->mibs[field])
|
||||
__this_cpu_inc(mib->mibs[field])
|
||||
|
||||
#define SNMP_INC_STATS_USER(mib, field) \
|
||||
this_cpu_inc(mib[0]->mibs[field])
|
||||
this_cpu_inc(mib->mibs[field])
|
||||
|
||||
#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) \
|
||||
atomic_long_inc(&mib->mibs[field])
|
||||
|
||||
#define SNMP_INC_STATS(mib, field) \
|
||||
this_cpu_inc(mib[0]->mibs[field])
|
||||
this_cpu_inc(mib->mibs[field])
|
||||
|
||||
#define SNMP_DEC_STATS(mib, field) \
|
||||
this_cpu_dec(mib[0]->mibs[field])
|
||||
this_cpu_dec(mib->mibs[field])
|
||||
|
||||
#define SNMP_ADD_STATS_BH(mib, field, addend) \
|
||||
__this_cpu_add(mib[0]->mibs[field], addend)
|
||||
__this_cpu_add(mib->mibs[field], addend)
|
||||
|
||||
#define SNMP_ADD_STATS_USER(mib, field, addend) \
|
||||
this_cpu_add(mib[0]->mibs[field], addend)
|
||||
this_cpu_add(mib->mibs[field], addend)
|
||||
|
||||
#define SNMP_ADD_STATS(mib, field, addend) \
|
||||
this_cpu_add(mib[0]->mibs[field], addend)
|
||||
this_cpu_add(mib->mibs[field], addend)
|
||||
/*
|
||||
* Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr"
|
||||
* Use "__typeof__(*mib) *ptr" instead of "__typeof__(mib) ptr"
|
||||
* to make @ptr a non-percpu pointer.
|
||||
*/
|
||||
#define SNMP_UPD_PO_STATS(mib, basefield, addend) \
|
||||
do { \
|
||||
__typeof__(*mib[0]->mibs) *ptr = mib[0]->mibs; \
|
||||
__typeof__(*mib->mibs) *ptr = mib->mibs; \
|
||||
this_cpu_inc(ptr[basefield##PKTS]); \
|
||||
this_cpu_add(ptr[basefield##OCTETS], addend); \
|
||||
} while (0)
|
||||
#define SNMP_UPD_PO_STATS_BH(mib, basefield, addend) \
|
||||
do { \
|
||||
__typeof__(*mib[0]->mibs) *ptr = mib[0]->mibs; \
|
||||
__typeof__(*mib->mibs) *ptr = mib->mibs; \
|
||||
__this_cpu_inc(ptr[basefield##PKTS]); \
|
||||
__this_cpu_add(ptr[basefield##OCTETS], addend); \
|
||||
} while (0)
|
||||
@@ -170,7 +168,7 @@ struct linux_xfrm_mib {
|
||||
|
||||
#define SNMP_ADD_STATS64_BH(mib, field, addend) \
|
||||
do { \
|
||||
__typeof__(*mib[0]) *ptr = __this_cpu_ptr((mib)[0]); \
|
||||
__typeof__(*mib) *ptr = __this_cpu_ptr(mib); \
|
||||
u64_stats_update_begin(&ptr->syncp); \
|
||||
ptr->mibs[field] += addend; \
|
||||
u64_stats_update_end(&ptr->syncp); \
|
||||
@@ -191,8 +189,8 @@ struct linux_xfrm_mib {
|
||||
#define SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1)
|
||||
#define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) \
|
||||
do { \
|
||||
__typeof__(*mib[0]) *ptr; \
|
||||
ptr = __this_cpu_ptr((mib)[0]); \
|
||||
__typeof__(*mib) *ptr; \
|
||||
ptr = __this_cpu_ptr(mib); \
|
||||
u64_stats_update_begin(&ptr->syncp); \
|
||||
ptr->mibs[basefield##PKTS]++; \
|
||||
ptr->mibs[basefield##OCTETS] += addend; \
|
||||
|
||||
Reference in New Issue
Block a user