|
@@ -2530,90 +2530,6 @@ static struct notifier_block __cpuinitdata slab_notifier =
|
|
|
|
|
|
#endif
|
|
|
|
|
|
-#ifdef CONFIG_NUMA
|
|
|
-
|
|
|
-/*****************************************************************
|
|
|
- * Generic reaper used to support the page allocator
|
|
|
- * (the cpu slabs are reaped by a per slab workqueue).
|
|
|
- *
|
|
|
- * Maybe move this to the page allocator?
|
|
|
- ****************************************************************/
|
|
|
-
|
|
|
-static DEFINE_PER_CPU(unsigned long, reap_node);
|
|
|
-
|
|
|
-static void init_reap_node(int cpu)
|
|
|
-{
|
|
|
- int node;
|
|
|
-
|
|
|
- node = next_node(cpu_to_node(cpu), node_online_map);
|
|
|
- if (node == MAX_NUMNODES)
|
|
|
- node = first_node(node_online_map);
|
|
|
-
|
|
|
- __get_cpu_var(reap_node) = node;
|
|
|
-}
|
|
|
-
|
|
|
-static void next_reap_node(void)
|
|
|
-{
|
|
|
- int node = __get_cpu_var(reap_node);
|
|
|
-
|
|
|
- /*
|
|
|
- * Also drain per cpu pages on remote zones
|
|
|
- */
|
|
|
- if (node != numa_node_id())
|
|
|
- drain_node_pages(node);
|
|
|
-
|
|
|
- node = next_node(node, node_online_map);
|
|
|
- if (unlikely(node >= MAX_NUMNODES))
|
|
|
- node = first_node(node_online_map);
|
|
|
- __get_cpu_var(reap_node) = node;
|
|
|
-}
|
|
|
-#else
|
|
|
-#define init_reap_node(cpu) do { } while (0)
|
|
|
-#define next_reap_node(void) do { } while (0)
|
|
|
-#endif
|
|
|
-
|
|
|
-#define REAPTIMEOUT_CPUC (2*HZ)
|
|
|
-
|
|
|
-#ifdef CONFIG_SMP
|
|
|
-static DEFINE_PER_CPU(struct delayed_work, reap_work);
|
|
|
-
|
|
|
-static void cache_reap(struct work_struct *unused)
|
|
|
-{
|
|
|
- next_reap_node();
|
|
|
- schedule_delayed_work(&__get_cpu_var(reap_work),
|
|
|
- REAPTIMEOUT_CPUC);
|
|
|
-}
|
|
|
-
|
|
|
-static void __devinit start_cpu_timer(int cpu)
|
|
|
-{
|
|
|
- struct delayed_work *reap_work = &per_cpu(reap_work, cpu);
|
|
|
-
|
|
|
- /*
|
|
|
- * When this gets called from do_initcalls via cpucache_init(),
|
|
|
- * init_workqueues() has already run, so keventd will be setup
|
|
|
- * at that time.
|
|
|
- */
|
|
|
- if (keventd_up() && reap_work->work.func == NULL) {
|
|
|
- init_reap_node(cpu);
|
|
|
- INIT_DELAYED_WORK(reap_work, cache_reap);
|
|
|
- schedule_delayed_work_on(cpu, reap_work, HZ + 3 * cpu);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static int __init cpucache_init(void)
|
|
|
-{
|
|
|
- int cpu;
|
|
|
-
|
|
|
- /*
|
|
|
- * Register the timers that drain pcp pages and update vm statistics
|
|
|
- */
|
|
|
- for_each_online_cpu(cpu)
|
|
|
- start_cpu_timer(cpu);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-__initcall(cpucache_init);
|
|
|
-#endif
|
|
|
-
|
|
|
void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, void *caller)
|
|
|
{
|
|
|
struct kmem_cache *s = get_slab(size, gfpflags);
|