Index: linux-stable/localversion-rt =================================================================== --- linux-stable.orig/localversion-rt +++ linux-stable/localversion-rt @@ -1 +1 @@ --rt7 +-rt8 Index: linux-stable/mm/slub.c =================================================================== --- linux-stable.orig/mm/slub.c +++ linux-stable/mm/slub.c @@ -1874,10 +1874,10 @@ redo: * * This function must be called with interrupt disabled. */ -static void unfreeze_partials(struct kmem_cache *s) +static void unfreeze_partials(struct kmem_cache *s, unsigned int cpu) { struct kmem_cache_node *n = NULL, *n2 = NULL; - struct kmem_cache_cpu *c = this_cpu_ptr(s->cpu_slab); + struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu); struct page *page, *discard_page = NULL; while ((page = c->partial)) { @@ -1963,7 +1963,7 @@ int put_cpu_partial(struct kmem_cache *s * set to the per node partial list. */ local_lock_irqsave(slub_lock, flags); - unfreeze_partials(s); + unfreeze_partials(s, smp_processor_id()); local_unlock_irqrestore(slub_lock, flags); pobjects = 0; pages = 0; @@ -2005,17 +2005,10 @@ static inline void __flush_cpu_slab(stru if (c->page) flush_slab(s, c); - unfreeze_partials(s); + unfreeze_partials(s, cpu); } } -static void flush_cpu_slab(void *d) -{ - struct kmem_cache *s = d; - - __flush_cpu_slab(s, smp_processor_id()); -} - static bool has_cpu_slab(int cpu, void *info) { struct kmem_cache *s = info; @@ -2024,10 +2017,29 @@ static bool has_cpu_slab(int cpu, void * return c->page || c->partial; } +#ifndef CONFIG_PREEMPT_RT_FULL +static void flush_cpu_slab(void *d) +{ + struct kmem_cache *s = d; + + __flush_cpu_slab(s, smp_processor_id()); +} + static void flush_all(struct kmem_cache *s) { on_each_cpu_cond(has_cpu_slab, flush_cpu_slab, s, 1, GFP_ATOMIC); } +#else +static void flush_all(struct kmem_cache *s) +{ + int cpu; + + for_each_online_cpu(cpu) { + if (has_cpu_slab(cpu, s)) + __flush_cpu_slab(s, cpu); + } +} +#endif /* * Check if the objects in a per cpu structure fit numa Index: linux-stable/drivers/cpufreq/powernow-k8.c =================================================================== --- linux-stable.orig/drivers/cpufreq/powernow-k8.c +++ linux-stable/drivers/cpufreq/powernow-k8.c @@ -1224,13 +1224,12 @@ static int powernowk8_target(struct cpuf .relation = relation }; /* - * Must run on @pol->cpu. cpufreq core is responsible for ensuring - * that we're bound to the current CPU and pol->cpu stays online. + * Must run on @pol->cpu. We queue it on the target cpu even + * if we are currently on the target cpu. This is preemptible + * non cpu bound context, so we can't call the target function + * directly. */ - if (smp_processor_id() == pol->cpu) - return powernowk8_target_fn(&pta); - else - return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); + return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); } /* Driver entry point to verify the policy and range of frequencies */