Index: linux-2.6.17-rc6-cl/mm/vmstat.c =================================================================== --- linux-2.6.17-rc6-cl.orig/mm/vmstat.c 2006-06-13 08:54:30.293915666 -0700 +++ linux-2.6.17-rc6-cl/mm/vmstat.c 2006-06-13 09:03:40.713958105 -0700 @@ -47,7 +47,11 @@ void get_zone_counts(unsigned long *acti } #ifdef CONFIG_VM_EVENT_COUNTERS +#ifdef CONFIG_WORKING_LOCAL_T +DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}}; +#else DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{LOCAL_INIT(0)}}; +#endif EXPORT_PER_CPU_SYMBOL(vm_event_states); static void sum_vm_events(unsigned long *ret, cpumask_t *cpumask) @@ -68,7 +72,11 @@ static void sum_vm_events(unsigned long for (i=0; i< NR_VM_EVENT_ITEMS; i++) +#ifdef CONFIG_WORKING_LOCAL_T + ret[i] += cpu_local_read(this->event[i]); +#else ret[i] += this->event[i]; +#endif } } @@ -95,8 +103,13 @@ void vm_events_fold_cpu(int cpu) int i; for (i = 0; i < NR_VM_EVENT_ITEMS; i++) { +#ifdef CONFIG_WORKING_LOCAL_T + count_vm_events(i, local_read(fold_state->event[i])); + local_set(0, fold_state->event[i]); +#else count_vm_events(i, fold_state->event[i]); fold_state->event[i], 0; +#endif } } #endif /* CONFIG_HOTPLUG */ Index: linux-2.6.17-rc6-cl/include/linux/vmstat.h =================================================================== --- linux-2.6.17-rc6-cl.orig/include/linux/vmstat.h 2006-06-13 08:54:23.029716703 -0700 +++ linux-2.6.17-rc6-cl/include/linux/vmstat.h 2006-06-13 09:01:18.287224692 -0700 @@ -112,38 +112,62 @@ enum vm_event_item { PGPGIN, PGPGOUT, PS }; struct vm_event_state { +#ifdef CONFIG_WORKING_LOCAL_T + localt_t event[NR_VM_EVENT_ITEMS]; +#else unsigned long event[NR_VM_EVENT_ITEMS]; +#endif }; DECLARE_PER_CPU(struct vm_event_state, vm_event_states); static inline unsigned long get_cpu_vm_events(enum vm_event_item item) { +#ifdef CONFIG_WORKING_LOCAL_T + return cpu_local_read(vm_event_states.event[item]); +#else return vm_event_states.event[item]; +#endif } static inline void __count_vm_event(enum vm_event_item item) { +#ifdef CONFIG_WORKING_LOCAL_T + __cpu_local_inc(vm_event_states.event[item]); +#else vm_event_states.event[item]++; +#endif } static inline void count_vm_event(enum vm_event_item item) { +#ifdef CONFIG_WORKING_LOCAL_T + cpu_local_inc(vm_event_states.event[item]); +#else preempt_disable(); __count_vm_event(item); preempt_enable(); +#endif } static inline void __count_vm_events(enum vm_event_item item, long delta) { +#ifdef CONFIG_WORKING_LOCAL_T + __cpu_local_add(delta, vm_event_states.event[item]); +#else vm_event_states.event[item] += delta; +#endif } static inline void count_vm_events(enum vm_event_item item, long delta) { +#ifdef CONFIG_WORKING_LOCAL_T + cpu_local_add(delta, vm_event_states.event[item]); +#else preempt_disable(); __count_vm_events(item, delta); preemt_enable(); +#endif } extern void all_vm_events(unsigned long *);