diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2007-11-21 09:08:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 17:54:40 -0500 |
commit | ebb53d75657f86587ac8cf3e38ab0c860a8e3d4f (patch) | |
tree | 2b1d63cb8ee54b19589d6d13a693147001e642ad /include/net | |
parent | de4d1db369785c29d68915edfee0cb70e8199f4c (diff) |
[NET] proto: Use pcounters for the inuse field
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/sock.h | 59 |
1 files changed, 8 insertions, 51 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 9c55af8e5f81..e329d05f7995 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <linux/module.h> | 47 | #include <linux/module.h> |
48 | #include <linux/lockdep.h> | 48 | #include <linux/lockdep.h> |
49 | #include <linux/netdevice.h> | 49 | #include <linux/netdevice.h> |
50 | #include <linux/pcounter.h> | ||
50 | #include <linux/skbuff.h> /* struct sk_buff */ | 51 | #include <linux/skbuff.h> /* struct sk_buff */ |
51 | #include <linux/mm.h> | 52 | #include <linux/mm.h> |
52 | #include <linux/security.h> | 53 | #include <linux/security.h> |
@@ -565,14 +566,9 @@ struct proto { | |||
565 | void (*unhash)(struct sock *sk); | 566 | void (*unhash)(struct sock *sk); |
566 | int (*get_port)(struct sock *sk, unsigned short snum); | 567 | int (*get_port)(struct sock *sk, unsigned short snum); |
567 | 568 | ||
568 | #ifdef CONFIG_SMP | ||
569 | /* Keeping track of sockets in use */ | 569 | /* Keeping track of sockets in use */ |
570 | void (*inuse_add)(struct proto *prot, int inc); | 570 | struct pcounter inuse; |
571 | int (*inuse_getval)(const struct proto *prot); | 571 | |
572 | int *inuse_ptr; | ||
573 | #else | ||
574 | int inuse; | ||
575 | #endif | ||
576 | /* Memory pressure */ | 572 | /* Memory pressure */ |
577 | void (*enter_memory_pressure)(void); | 573 | void (*enter_memory_pressure)(void); |
578 | atomic_t *memory_allocated; /* Current allocated memory. */ | 574 | atomic_t *memory_allocated; /* Current allocated memory. */ |
@@ -607,35 +603,8 @@ struct proto { | |||
607 | #endif | 603 | #endif |
608 | }; | 604 | }; |
609 | 605 | ||
610 | /* | 606 | #define DEFINE_PROTO_INUSE(NAME) DEFINE_PCOUNTER(NAME) |
611 | * Special macros to let protos use a fast version of inuse{get|add} | 607 | #define REF_PROTO_INUSE(NAME) PCOUNTER_MEMBER_INITIALIZER(NAME, .inuse) |
612 | * using a static percpu variable per proto instead of an allocated one, | ||
613 | * saving one dereference. | ||
614 | * This might be changed if/when dynamic percpu vars become fast. | ||
615 | */ | ||
616 | #ifdef CONFIG_SMP | ||
617 | # define DEFINE_PROTO_INUSE(NAME) \ | ||
618 | static DEFINE_PER_CPU(int, NAME##_inuse); \ | ||
619 | static void NAME##_inuse_add(struct proto *prot, int inc) \ | ||
620 | { \ | ||
621 | __get_cpu_var(NAME##_inuse) += inc; \ | ||
622 | } \ | ||
623 | \ | ||
624 | static int NAME##_inuse_getval(const struct proto *prot)\ | ||
625 | { \ | ||
626 | int res = 0, cpu; \ | ||
627 | \ | ||
628 | for_each_possible_cpu(cpu) \ | ||
629 | res += per_cpu(NAME##_inuse, cpu); \ | ||
630 | return res; \ | ||
631 | } | ||
632 | # define REF_PROTO_INUSE(NAME) \ | ||
633 | .inuse_add = NAME##_inuse_add, \ | ||
634 | .inuse_getval = NAME##_inuse_getval, | ||
635 | #else | ||
636 | # define DEFINE_PROTO_INUSE(NAME) | ||
637 | # define REF_PROTO_INUSE(NAME) | ||
638 | #endif | ||
639 | 608 | ||
640 | extern int proto_register(struct proto *prot, int alloc_slab); | 609 | extern int proto_register(struct proto *prot, int alloc_slab); |
641 | extern void proto_unregister(struct proto *prot); | 610 | extern void proto_unregister(struct proto *prot); |
@@ -668,29 +637,17 @@ static inline void sk_refcnt_debug_release(const struct sock *sk) | |||
668 | /* Called with local bh disabled */ | 637 | /* Called with local bh disabled */ |
669 | static __inline__ void sock_prot_inc_use(struct proto *prot) | 638 | static __inline__ void sock_prot_inc_use(struct proto *prot) |
670 | { | 639 | { |
671 | #ifdef CONFIG_SMP | 640 | pcounter_add(&prot->inuse, 1); |
672 | prot->inuse_add(prot, 1); | ||
673 | #else | ||
674 | prot->inuse++; | ||
675 | #endif | ||
676 | } | 641 | } |
677 | 642 | ||
678 | static __inline__ void sock_prot_dec_use(struct proto *prot) | 643 | static __inline__ void sock_prot_dec_use(struct proto *prot) |
679 | { | 644 | { |
680 | #ifdef CONFIG_SMP | 645 | pcounter_add(&prot->inuse, -1); |
681 | prot->inuse_add(prot, -1); | ||
682 | #else | ||
683 | prot->inuse--; | ||
684 | #endif | ||
685 | } | 646 | } |
686 | 647 | ||
687 | static __inline__ int sock_prot_inuse(struct proto *proto) | 648 | static __inline__ int sock_prot_inuse(struct proto *proto) |
688 | { | 649 | { |
689 | #ifdef CONFIG_SMP | 650 | return pcounter_getval(&proto->inuse); |
690 | return proto->inuse_getval(proto); | ||
691 | #else | ||
692 | return proto->inuse; | ||
693 | #endif | ||
694 | } | 651 | } |
695 | 652 | ||
696 | /* With per-bucket locks this operation is not-atomic, so that | 653 | /* With per-bucket locks this operation is not-atomic, so that |