Messages in this thread Patch in this message | | | Date | Wed, 19 Mar 2014 15:38:51 -0700 | From | Andrew Morton <> | Subject | Re: [percpu] BUG: using __this_cpu_add() in preemptible [00000000] code: init/1 |
| |
On Tue, 18 Mar 2014 09:43:27 -0500 (CDT) Christoph Lameter <cl@linux.com> wrote:
> Anyways the statistics in slub should be low impact and able to > be placed anywhere. So I think we need this patch to avoid > the preemption checks begin triggered. > > > Subject: SLUB: Use raw_cpu_inc for incrementing statistics > > Statistics are not critical to the operation of the allocation > but should also not cause too much overhead. > > __this_cpu_inc now checks if preemption is disabled and triggers. > Use raw_cpu_inc to avoid the checks. Using this_cpu_ops may cause > interrupt disable/enable sequences on various arches which may > significantly impact allocator performance. > > ... > > --- linux.orig/mm/slub.c 2014-03-07 14:10:30.142777022 -0600 > +++ linux/mm/slub.c 2014-03-18 09:39:15.675035324 -0500 > @@ -224,7 +224,7 @@ > static inline void stat(const struct kmem_cache *s, enum stat_item si) > { > #ifdef CONFIG_SLUB_STATS > - __this_cpu_inc(s->cpu_slab->stat[si]); > + raw_cpu_inc(s->cpu_slab->stat[si]); > #endif > }
Please always consider how the code will appear to a naive reader. That reader won't know why raw_ is being used here, so we should provide an explanation.
--- a/mm/slub.c~slub-use-raw_cpu_inc-for-incrementing-statistics-fix +++ a/mm/slub.c @@ -224,6 +224,10 @@ static inline void memcg_propagate_slab_ static inline void stat(const struct kmem_cache *s, enum stat_item si) { #ifdef CONFIG_SLUB_STATS + /* + * The rmw is racy on a preemptible kernel but this is acceptable, so + * avoid this_cpu_add()'s irq-disable overhead. + */ raw_cpu_inc(s->cpu_slab->stat[si]); #endif } _
| |