From: Pavel Emelyanov <xemul@openvz.org>
To: Eric Dumazet <dada1@cosmosbay.com>
Cc: Linux Netdev List <netdev@vger.kernel.org>
Subject: [PATCH net-2.6.26 2/5][SOCK]: Introduce a percpu inuse counting array.
Date: Fri, 28 Mar 2008 12:03:08 +0300 [thread overview]
Message-ID: <47ECB44C.5080807@openvz.org> (raw)
And redirect sock_prot_inuse_add|_get to use one.
As far as the dereferences are concerned. Before the patch we made
1 dereference to proto->inuse.add call, the call itself and then
made a __get_cpu_var() on a static variable. After the patch we make
a direct call, then one dereference to proto->inuse_idx and then
the same __get_cpu_var() on a still static variable. So this patch
doesn't seem to produce performance penalty on SMP.
Besides, add a sanity check into inuse_idx generator.
This is net per-net yet, but I will deliberately make this case
separated from NET_NS=n, since it'll cost us one-or-two more
dereferences to get the struct net and the inuse counter.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
---
include/net/sock.h | 13 +++++--------
net/core/sock.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/include/net/sock.h b/include/net/sock.h
index abc6341..ebf9552 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -639,18 +639,15 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
# define DEFINE_PROTO_INUSE(NAME) DEFINE_PCOUNTER(NAME)
# define REF_PROTO_INUSE(NAME) PCOUNTER_MEMBER_INITIALIZER(NAME, .inuse)
/* Called with local bh disabled */
-static inline void sock_prot_inuse_add(struct proto *prot, int inc)
-{
- pcounter_add(&prot->inuse, inc);
-}
+extern void sock_prot_inuse_add(struct proto *prot, int inc);
+
static inline int sock_prot_inuse_init(struct proto *proto)
{
return pcounter_alloc(&proto->inuse);
}
-static inline int sock_prot_inuse_get(struct proto *proto)
-{
- return pcounter_getval(&proto->inuse);
-}
+
+extern int sock_prot_inuse_get(struct proto *proto);
+
static inline void sock_prot_inuse_free(struct proto *proto)
{
pcounter_free(&proto->inuse);
diff --git a/net/core/sock.c b/net/core/sock.c
index a7faf30..2b6f8f1 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1940,11 +1940,45 @@ 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 */
+
+struct prot_inuse {
+ int val[PROTO_INUSE_NR];
+};
+
+static DEFINE_PER_CPU(struct prot_inuse, prot_inuse);
+
+void sock_prot_inuse_add(struct proto *prot, int val)
+{
+ __get_cpu_var(prot_inuse).val[prot->inuse_idx] += val;
+}
+EXPORT_SYMBOL_GPL(sock_prot_inuse_add);
+
+int sock_prot_inuse_get(struct proto *prot)
+{
+ int cpu, idx = prot->inuse_idx;
+ int res = 0;
+
+ for_each_possible_cpu(cpu)
+ res += per_cpu(prot_inuse, cpu).val[idx];
+
+ return res >= 0 ? res : 0;
+}
+EXPORT_SYMBOL_GPL(sock_prot_inuse_get);
+#endif
+
static void assign_proto_idx(struct proto *prot)
{
#ifdef CONFIG_PROC_FS
static unsigned int idx = 0;
+ if (unlikely(idx == PROTO_INUSE_NR - 1)) {
+ printk(KERN_ERR "PROTO_INUSE_NR exhausted\n");
+ prot->inuse_idx = idx;
+ return;
+ }
+
prot->inuse_idx = idx++;
#endif
}
--
1.5.3.4
reply other threads:[~2008-03-28 9:03 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47ECB44C.5080807@openvz.org \
--to=xemul@openvz.org \
--cc=dada1@cosmosbay.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.