: Enumerate struct proto-s to facilitate percpu inuse accounting (v2).
Subsystems (3)
PATCH 1/5 : Enumerate struct proto-s to facilitate percpu inuse accounting (v2).
The inuse counters are going to become a per-cpu array. Introduce an index for this array on the struct proto.
To handle the case of proto register-unregister-register loop the bitmap is used. All its bits manipulations are protected with proto_list_lock and a sanity check for the bitmap being exhausted is also added.
--- include/net/sock.h | 1 + net/core/sock.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 0 deletions(-)
include/net/sock.h +1 -0
@@ -562,6 +562,7 @@ struct proto {/* Keeping track of sockets in use */ #ifdef CONFIG_PROC_FS +unsigned int inuse_idx;struct pcounter inuse;#endif
net/core/sock.c +34 -0
@@ -1940,6 +1940,38 @@ EXPORT_SYMBOL(sk_common_release);static DEFINE_RWLOCK (proto_list_lock);static LIST_HEAD (proto_list); +#ifdef CONFIG_PROC_FS +#define PROTO_INUSE_NR 64/* should be enough for the first time */ + +static DECLARE_BITMAP(proto_inuse_idx, PROTO_INUSE_NR); + +static void assign_proto_idx (struct proto *prot) +{ + prot->inuse_idx =find_first_zero_bit (proto_inuse_idx,PROTO_INUSE_NR ); + +if (unlikely (prot->inuse_idx ==PROTO_INUSE_NR -1 )) { +printk (KERN_ERR "PROTO_INUSE_NR exhausted\n" ); +return ; + } + +set_bit (prot->inuse_idx, proto_inuse_idx); +} + +static void release_proto_idx (struct proto *prot) +{ +if (prot->inuse_idx !=PROTO_INUSE_NR -1 ) +clear_bit (prot->inuse_idx, proto_inuse_idx); +} +#else +static inline void assign_proto_idx (struct proto *prot) +{ +} + +static inline void release_proto_idx (struct proto *prot) +{ +} +#endif +int proto_register (struct proto *prot,int alloc_slab) {char *request_sock_slab_name =NULL ;
@@ -2000,6 +2032,7 @@ int proto_register(struct proto *prot, int alloc_slab)write_lock (&proto_list_lock);list_add (&prot->node, &proto_list); +assign_proto_idx (prot);write_unlock (&proto_list_lock);return 0 ;
@@ -2026,6 +2059,7 @@ EXPORT_SYMBOL(proto_register);void proto_unregister (struct proto *prot) {write_lock (&proto_list_lock); +release_proto_idx (prot);list_del (&prot->node);write_unlock (&proto_list_lock);
Quoted 11 lines · Pavel Emelyanov
The inuse counters are going to become a per-cpu array. Introduce an index for this array on the struct proto.
To handle the case of proto register-unregister-register loop the bitmap is used. All its bits manipulations are protected with
proto_list_lockand a sanity check for the bitmap being exhausted is also added.Signed-off-by Pavel Emelyanov <[email protected]>
Quoted 79 lines
--- include/net/sock.h | 1 + net/core/sock.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 0 deletions(-)include/net/sock.h +1
-0@@ -562,6 +562,7 @@ struct proto {/* Keeping track of sockets in use */ #ifdef CONFIG_PROC_FS +unsigned int inuse_idx;struct pcounter inuse;#endif net/core/sock.c +34
-0@@ -1940,6 +1940,38 @@ EXPORT_SYMBOL(sk_common_release);static DEFINE_RWLOCK (proto_list_lock);static LIST_HEAD (proto_list); +#ifdef CONFIG_PROC_FS +#define PROTO_INUSE_NR 64/* should be enough for the first time */ + +static DECLARE_BITMAP(proto_inuse_idx, PROTO_INUSE_NR); + +static void assign_proto_idx (struct proto *prot) +{ + prot->inuse_idx =find_first_zero_bit (proto_inuse_idx,PROTO_INUSE_NR ); + +if (unlikely (prot->inuse_idx ==PROTO_INUSE_NR -1 )) { +printk (KERN_ERR "PROTO_INUSE_NR exhausted\n" ); +return ; + } + +set_bit (prot->inuse_idx, proto_inuse_idx); +} + +static void release_proto_idx (struct proto *prot) +{ +if (prot->inuse_idx !=PROTO_INUSE_NR -1 ) +clear_bit (prot->inuse_idx, proto_inuse_idx); +} +#else +static inline void assign_proto_idx (struct proto *prot) +{ +} + +static inline void release_proto_idx (struct proto *prot) +{ +} +#endif +int proto_register (struct proto *prot,int alloc_slab) {char *request_sock_slab_name =NULL ;@@ -2000,6 +2032,7 @@ int proto_register(struct proto *prot, int alloc_slab)write_lock (&proto_list_lock);list_add (&prot->node, &proto_list); +assign_proto_idx (prot);write_unlock (&proto_list_lock);return 0 ;@@ -2026,6 +2059,7 @@ EXPORT_SYMBOL(proto_register);void proto_unregister (struct proto *prot) {write_lock (&proto_list_lock); +release_proto_idx (prot);list_del (&prot->node);write_unlock (&proto_list_lock);
From: Eric Dumazet <[email protected]>
Date: Fri, 28 Mar 2008 18:15:51 +0100
Quoted 9 lines
Quoted 8 lines · Pavel Emelyanov
The inuse counters are going to become a per-cpu array. Introduce an index for this array on the struct proto.
To handle the case of proto register-unregister-register loop the bitmap is used. All its bits manipulations are protected with
proto_list_lockand a sanity check for the bitmap being exhausted is also added.
Quoted 4 lines
Quoted 3 lines
Signed-off-by Pavel Emelyanov <[email protected]>Acked-by Eric Dumazet <[email protected]>
Applied.