Subject: Re: [PATCH net-2.6.26 5/5][LIB]: Forget the pcounter abstraction.

From: Eric Dumazet <[email-masked]>
Date: Fri, 28 Mar 2008 10:46:30 +0100

Pavel Emelyanov a écrit :
> It was used by proto.inuse only. Now it's reworked and we can
> drop the pcounter, all the more so this was intended to be done.
>
> Not sure whether this should go via netdev tree, but as far as
> I remember it was added via this one...
>
> Signed-off-by: Pavel Emelyanov <[email-masked]>
>   

I believe this will be Acked-by Andrew himself, dont worry :)

> ---
>  include/linux/pcounter.h |   74 ----------------------------------------------
>  lib/Makefile             |    1 -
>  lib/pcounter.c           |   58 ------------------------------------
>  3 files changed, 0 insertions(+), 133 deletions(-)
>  delete mode 100644 include/linux/pcounter.h
>  delete mode 100644 lib/pcounter.c
>
> diff --git a/include/linux/pcounter.h b/include/linux/pcounter.h
> deleted file mode 100644
> index a82d9f2..0000000
> --- a/include/linux/pcounter.h
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -#ifndef __LINUX_PCOUNTER_H
> -#define __LINUX_PCOUNTER_H
> -/*
> - * Using a dynamic percpu 'int' variable has a cost :
> - * 1) Extra dereference
> - * Current per_cpu_ptr() implementation uses an array per 'percpu variable'.
> - * 2) memory cost of NR_CPUS*(32+sizeof(void *)) instead of num_possible_cpus()*4
> - *
> - * This pcounter implementation is an abstraction to be able to use
> - * either a static or a dynamic per cpu variable.
> - * One dynamic per cpu variable gets a fast & cheap implementation, we can
> - * change pcounter implementation too.
> - */
> -struct pcounter {
> -#ifdef CONFIG_SMP
> -	void		(*add)(struct pcounter *self, int inc);
> -	int		(*getval)(const struct pcounter *self, int cpu);
> -	int		*per_cpu_values;
> -#else
> -	int		val;
> -#endif
> -};
> -
> -#ifdef CONFIG_SMP
> -#include <linux/percpu.h>
> -
> -#define DEFINE_PCOUNTER(NAME)						\
> -static DEFINE_PER_CPU(int, NAME##_pcounter_values);			\
> -static void NAME##_pcounter_add(struct pcounter *self, int val)		\
> -{									\
> -       __get_cpu_var(NAME##_pcounter_values) += val;			\
> -}									\
> -static int NAME##_pcounter_getval(const struct pcounter *self, int cpu)	\
> -{									\
> -	return per_cpu(NAME##_pcounter_values, cpu);			\
> -}									\
> -
> -#define PCOUNTER_MEMBER_INITIALIZER(NAME, MEMBER)		\
> -	MEMBER = {						\
> -		.add	= NAME##_pcounter_add,			\
> -		.getval = NAME##_pcounter_getval,		\
> -	}
> -
> -
> -static inline void pcounter_add(struct pcounter *self, int inc)
> -{
> -	self->add(self, inc);
> -}
> -
> -extern int pcounter_getval(const struct pcounter *self);
> -extern int pcounter_alloc(struct pcounter *self);
> -extern void pcounter_free(struct pcounter *self);
> -
> -
> -#else /* CONFIG_SMP */
> -
> -static inline void pcounter_add(struct pcounter *self, int inc)
> -{
> -	self->val += inc;
> -}
> -
> -static inline int pcounter_getval(const struct pcounter *self)
> -{
> -	return self->val;
> -}
> -
> -#define DEFINE_PCOUNTER(NAME)
> -#define PCOUNTER_MEMBER_INITIALIZER(NAME, MEMBER)
> -#define pcounter_alloc(self) 0
> -#define pcounter_free(self)
> -
> -#endif /* CONFIG_SMP */
> -
> -#endif /* __LINUX_PCOUNTER_H */
> diff --git a/lib/Makefile b/lib/Makefile
> index 23de261..4d059d4 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -61,7 +61,6 @@ obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
>  obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o
>  obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o
>  obj-$(CONFIG_SMP) += percpu_counter.o
> -obj-$(CONFIG_SMP) += pcounter.o
>  obj-$(CONFIG_AUDIT_GENERIC) += audit.o
>  
>  obj-$(CONFIG_SWIOTLB) += swiotlb.o
> diff --git a/lib/pcounter.c b/lib/pcounter.c
> deleted file mode 100644
> index 9b56807..0000000
> --- a/lib/pcounter.c
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -/*
> - * Define default pcounter functions
> - * Note that often used pcounters use dedicated functions to get a speed increase.
> - * (see DEFINE_PCOUNTER/REF_PCOUNTER_MEMBER)
> - */
> -
> -#include <linux/module.h>
> -#include <linux/pcounter.h>
> -#include <linux/smp.h>
> -#include <linux/cpumask.h>
> -
> -static void pcounter_dyn_add(struct pcounter *self, int inc)
> -{
> -	per_cpu_ptr(self->per_cpu_values, smp_processor_id())[0] += inc;
> -}
> -
> -static int pcounter_dyn_getval(const struct pcounter *self, int cpu)
> -{
> -	return per_cpu_ptr(self->per_cpu_values, cpu)[0];
> -}
> -
> -int pcounter_getval(const struct pcounter *self)
> -{
> -	int res = 0, cpu;
> -
> -	for_each_possible_cpu(cpu)
> -		res += self->getval(self, cpu);
> -
> -	return res;
> -}
> -EXPORT_SYMBOL_GPL(pcounter_getval);
> -
> -int pcounter_alloc(struct pcounter *self)
> -{
> -	int rc = 0;
> -	if (self->add == NULL) {
> -		self->per_cpu_values = alloc_percpu(int);
> -		if (self->per_cpu_values != NULL) {
> -			self->add    = pcounter_dyn_add;
> -			self->getval = pcounter_dyn_getval;
> -		} else
> -			rc = 1;
> -	}
> -	return rc;
> -}
> -EXPORT_SYMBOL_GPL(pcounter_alloc);
> -
> -void pcounter_free(struct pcounter *self)
> -{
> -	if (self->per_cpu_values != NULL) {
> -		free_percpu(self->per_cpu_values);
> -		self->per_cpu_values = NULL;
> -		self->getval = NULL;
> -		self->add = NULL;
> -	}
> -}
> -EXPORT_SYMBOL_GPL(pcounter_free);
> -
>