diff options
| -rw-r--r-- | include/linux/slub_def.h | 9 | ||||
| -rw-r--r-- | mm/slub.c | 168 |
2 files changed, 160 insertions, 17 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 92e10cf6d0e8..f74716b59ce2 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -16,8 +16,7 @@ struct kmem_cache_cpu { | |||
| 16 | struct page *page; | 16 | struct page *page; |
| 17 | int node; | 17 | int node; |
| 18 | unsigned int offset; | 18 | unsigned int offset; |
| 19 | /* Lots of wasted space */ | 19 | }; |
| 20 | } ____cacheline_aligned_in_smp; | ||
| 21 | 20 | ||
| 22 | struct kmem_cache_node { | 21 | struct kmem_cache_node { |
| 23 | spinlock_t list_lock; /* Protect partial list and nr_partial */ | 22 | spinlock_t list_lock; /* Protect partial list and nr_partial */ |
| @@ -62,7 +61,11 @@ struct kmem_cache { | |||
| 62 | int defrag_ratio; | 61 | int defrag_ratio; |
| 63 | struct kmem_cache_node *node[MAX_NUMNODES]; | 62 | struct kmem_cache_node *node[MAX_NUMNODES]; |
| 64 | #endif | 63 | #endif |
| 65 | struct kmem_cache_cpu cpu_slab[NR_CPUS]; | 64 | #ifdef CONFIG_SMP |
| 65 | struct kmem_cache_cpu *cpu_slab[NR_CPUS]; | ||
| 66 | #else | ||
| 67 | struct kmem_cache_cpu cpu_slab; | ||
| 68 | #endif | ||
| 66 | }; | 69 | }; |
| 67 | 70 | ||
| 68 | /* | 71 | /* |
| @@ -269,7 +269,11 @@ static inline struct kmem_cache_node *get_node(struct kmem_cache *s, int node) | |||
| 269 | 269 | ||
| 270 | static inline struct kmem_cache_cpu *get_cpu_slab(struct kmem_cache *s, int cpu) | 270 | static inline struct kmem_cache_cpu *get_cpu_slab(struct kmem_cache *s, int cpu) |
| 271 | { | 271 | { |
| 272 | return &s->cpu_slab[cpu]; | 272 | #ifdef CONFIG_SMP |
| 273 | return s->cpu_slab[cpu]; | ||
| 274 | #else | ||
| 275 | return &s->cpu_slab; | ||
| 276 | #endif | ||
| 273 | } | 277 | } |
| 274 | 278 | ||
| 275 | static inline int check_valid_pointer(struct kmem_cache *s, | 279 | static inline int check_valid_pointer(struct kmem_cache *s, |
| @@ -1858,16 +1862,6 @@ static void init_kmem_cache_cpu(struct kmem_cache *s, | |||
| 1858 | c->node = 0; | 1862 | c->node = 0; |
| 1859 | } | 1863 | } |
| 1860 | 1864 | ||
| 1861 | static inline int alloc_kmem_cache_cpus(struct kmem_cache *s, gfp_t flags) | ||
| 1862 | { | ||
| 1863 | int cpu; | ||
| 1864 | |||
| 1865 | for_each_possible_cpu(cpu) | ||
| 1866 | init_kmem_cache_cpu(s, get_cpu_slab(s, cpu)); | ||
| 1867 | |||
| 1868 | return 1; | ||
| 1869 | } | ||
| 1870 | |||
| 1871 | static void init_kmem_cache_node(struct kmem_cache_node *n) | 1865 | static void init_kmem_cache_node(struct kmem_cache_node *n) |
| 1872 | { | 1866 | { |
| 1873 | n->nr_partial = 0; | 1867 | n->nr_partial = 0; |
| @@ -1879,6 +1873,131 @@ static void init_kmem_cache_node(struct kmem_cache_node *n) | |||
| 1879 | #endif | 1873 | #endif |
| 1880 | } | 1874 | } |
| 1881 | 1875 | ||
| 1876 | #ifdef CONFIG_SMP | ||
| 1877 | /* | ||
| 1878 | * Per cpu array for per cpu structures. | ||
| 1879 | * | ||
| 1880 | * The per cpu array places all kmem_cache_cpu structures from one processor | ||
| 1881 | * close together meaning that it becomes possible that multiple per cpu | ||
| 1882 | * structures are contained in one cacheline. This may be particularly | ||
| 1883 | * beneficial for the kmalloc caches. | ||
| 1884 | * | ||
| 1885 | * A desktop system typically has around 60-80 slabs. With 100 here we are | ||
| 1886 | * likely able to get per cpu structures for all caches from the array defined | ||
| 1887 | * here. We must be able to cover all kmalloc caches during bootstrap. | ||
| 1888 | * | ||
| 1889 | * If the per cpu array is exhausted then fall back to kmalloc | ||
| 1890 | * of individual cachelines. No sharing is possible then. | ||
| 1891 | */ | ||
| 1892 | #define NR_KMEM_CACHE_CPU 100 | ||
| 1893 | |||
| 1894 | static DEFINE_PER_CPU(struct kmem_cache_cpu, | ||
| 1895 | kmem_cache_cpu)[NR_KMEM_CACHE_CPU]; | ||
| 1896 | |||
| 1897 | static DEFINE_PER_CPU(struct kmem_cache_cpu *, kmem_cache_cpu_free); | ||
| 1898 | static cpumask_t kmem_cach_cpu_free_init_once = CPU_MASK_NONE; | ||
| 1899 | |||
| 1900 | static struct kmem_cache_cpu *alloc_kmem_cache_cpu(struct kmem_cache *s, | ||
| 1901 | int cpu, gfp_t flags) | ||
| 1902 | { | ||
| 1903 | struct kmem_cache_cpu *c = per_cpu(kmem_cache_cpu_free, cpu); | ||
| 1904 | |||
| 1905 | if (c) | ||
| 1906 | per_cpu(kmem_cache_cpu_free, cpu) = | ||
| 1907 | (void *)c->freelist; | ||
| 1908 | else { | ||
| 1909 | /* Table overflow: So allocate ourselves */ | ||
| 1910 | c = kmalloc_node( | ||
| 1911 | ALIGN(sizeof(struct kmem_cache_cpu), cache_line_size()), | ||
| 1912 | flags, cpu_to_node(cpu)); | ||
| 1913 | if (!c) | ||
| 1914 | return NULL; | ||
| 1915 | } | ||
| 1916 | |||
| 1917 | init_kmem_cache_cpu(s, c); | ||
| 1918 | return c; | ||
| 1919 | } | ||
| 1920 | |||
| 1921 | static void free_kmem_cache_cpu(struct kmem_cache_cpu *c, int cpu) | ||
| 1922 | { | ||
| 1923 | if (c < per_cpu(kmem_cache_cpu, cpu) || | ||
| 1924 | c > per_cpu(kmem_cache_cpu, cpu) + NR_KMEM_CACHE_CPU) { | ||
| 1925 | kfree(c); | ||
| 1926 | return; | ||
| 1927 | } | ||
| 1928 | c->freelist = (void *)per_cpu(kmem_cache_cpu_free, cpu); | ||
| 1929 | per_cpu(kmem_cache_cpu_free, cpu) = c; | ||
| 1930 | } | ||
| 1931 | |||
| 1932 | static void free_kmem_cache_cpus(struct kmem_cache *s) | ||
| 1933 | { | ||
| 1934 | int cpu; | ||
| 1935 | |||
| 1936 | for_each_online_cpu(cpu) { | ||
| 1937 | struct kmem_cache_cpu *c = get_cpu_slab(s, cpu); | ||
| 1938 | |||
| 1939 | if (c) { | ||
| 1940 | s->cpu_slab[cpu] = NULL; | ||
| 1941 | free_kmem_cache_cpu(c, cpu); | ||
| 1942 | } | ||
| 1943 | } | ||
| 1944 | } | ||
| 1945 | |||
| 1946 | static int alloc_kmem_cache_cpus(struct kmem_cache *s, gfp_t flags) | ||
| 1947 | { | ||
| 1948 | int cpu; | ||
| 1949 | |||
| 1950 | for_each_online_cpu(cpu) { | ||
| 1951 | struct kmem_cache_cpu *c = get_cpu_slab(s, cpu); | ||
| 1952 | |||
| 1953 | if (c) | ||
| 1954 | continue; | ||
| 1955 | |||
| 1956 | c = alloc_kmem_cache_cpu(s, cpu, flags); | ||
| 1957 | if (!c) { | ||
| 1958 | free_kmem_cache_cpus(s); | ||
| 1959 | return 0; | ||
| 1960 | } | ||
| 1961 | s->cpu_slab[cpu] = c; | ||
| 1962 | } | ||
| 1963 | return 1; | ||
| 1964 | } | ||
| 1965 | |||
| 1966 | /* | ||
| 1967 | * Initialize the per cpu array. | ||
| 1968 | */ | ||
| 1969 | static void init_alloc_cpu_cpu(int cpu) | ||
| 1970 | { | ||
| 1971 | int i; | ||
| 1972 | |||
| 1973 | if (cpu_isset(cpu, kmem_cach_cpu_free_init_once)) | ||
| 1974 | return; | ||
| 1975 | |||
| 1976 | for (i = NR_KMEM_CACHE_CPU - 1; i >= 0; i--) | ||
| 1977 | free_kmem_cache_cpu(&per_cpu(kmem_cache_cpu, cpu)[i], cpu); | ||
| 1978 | |||
| 1979 | cpu_set(cpu, kmem_cach_cpu_free_init_once); | ||
| 1980 | } | ||
| 1981 | |||
| 1982 | static void __init init_alloc_cpu(void) | ||
| 1983 | { | ||
| 1984 | int cpu; | ||
| 1985 | |||
| 1986 | for_each_online_cpu(cpu) | ||
| 1987 | init_alloc_cpu_cpu(cpu); | ||
| 1988 | } | ||
| 1989 | |||
| 1990 | #else | ||
| 1991 | static inline void free_kmem_cache_cpus(struct kmem_cache *s) {} | ||
| 1992 | static inline void init_alloc_cpu(void) {} | ||
| 1993 | |||
| 1994 | static inline int alloc_kmem_cache_cpus(struct kmem_cache *s, gfp_t flags) | ||
| 1995 | { | ||
| 1996 | init_kmem_cache_cpu(s, &s->cpu_slab); | ||
| 1997 | return 1; | ||
| 1998 | } | ||
| 1999 | #endif | ||
| 2000 | |||
| 1882 | #ifdef CONFIG_NUMA | 2001 | #ifdef CONFIG_NUMA |
| 1883 | /* | 2002 | /* |
| 1884 | * No kmalloc_node yet so do it by hand. We know that this is the first | 2003 | * No kmalloc_node yet so do it by hand. We know that this is the first |
| @@ -1886,7 +2005,8 @@ static void init_kmem_cache_node(struct kmem_cache_node *n) | |||
| 1886 | * possible. | 2005 | * possible. |
| 1887 | * | 2006 | * |
| 1888 | * Note that this function only works on the kmalloc_node_cache | 2007 | * Note that this function only works on the kmalloc_node_cache |
| 1889 | * when allocating for the kmalloc_node_cache. | 2008 | * when allocating for the kmalloc_node_cache. This is used for bootstrapping |
| 2009 | * memory on a fresh node that has no slab structures yet. | ||
| 1890 | */ | 2010 | */ |
| 1891 | static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags, | 2011 | static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags, |
| 1892 | int node) | 2012 | int node) |
| @@ -2115,6 +2235,7 @@ static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags, | |||
| 2115 | 2235 | ||
| 2116 | if (alloc_kmem_cache_cpus(s, gfpflags & ~SLUB_DMA)) | 2236 | if (alloc_kmem_cache_cpus(s, gfpflags & ~SLUB_DMA)) |
| 2117 | return 1; | 2237 | return 1; |
| 2238 | free_kmem_cache_nodes(s); | ||
| 2118 | error: | 2239 | error: |
| 2119 | if (flags & SLAB_PANIC) | 2240 | if (flags & SLAB_PANIC) |
| 2120 | panic("Cannot create slab %s size=%lu realsize=%u " | 2241 | panic("Cannot create slab %s size=%lu realsize=%u " |
| @@ -2197,6 +2318,7 @@ static inline int kmem_cache_close(struct kmem_cache *s) | |||
| 2197 | flush_all(s); | 2318 | flush_all(s); |
| 2198 | 2319 | ||
| 2199 | /* Attempt to free all objects */ | 2320 | /* Attempt to free all objects */ |
| 2321 | free_kmem_cache_cpus(s); | ||
| 2200 | for_each_node_state(node, N_NORMAL_MEMORY) { | 2322 | for_each_node_state(node, N_NORMAL_MEMORY) { |
| 2201 | struct kmem_cache_node *n = get_node(s, node); | 2323 | struct kmem_cache_node *n = get_node(s, node); |
| 2202 | 2324 | ||
| @@ -2584,6 +2706,8 @@ void __init kmem_cache_init(void) | |||
| 2584 | int i; | 2706 | int i; |
| 2585 | int caches = 0; | 2707 | int caches = 0; |
| 2586 | 2708 | ||
| 2709 | init_alloc_cpu(); | ||
| 2710 | |||
| 2587 | #ifdef CONFIG_NUMA | 2711 | #ifdef CONFIG_NUMA |
| 2588 | /* | 2712 | /* |
| 2589 | * Must first have the slab cache available for the allocations of the | 2713 | * Must first have the slab cache available for the allocations of the |
| @@ -2644,10 +2768,12 @@ void __init kmem_cache_init(void) | |||
| 2644 | 2768 | ||
| 2645 | #ifdef CONFIG_SMP | 2769 | #ifdef CONFIG_SMP |
| 2646 | register_cpu_notifier(&slab_notifier); | 2770 | register_cpu_notifier(&slab_notifier); |
| 2771 | kmem_size = offsetof(struct kmem_cache, cpu_slab) + | ||
| 2772 | nr_cpu_ids * sizeof(struct kmem_cache_cpu *); | ||
| 2773 | #else | ||
| 2774 | kmem_size = sizeof(struct kmem_cache); | ||
| 2647 | #endif | 2775 | #endif |
| 2648 | 2776 | ||
| 2649 | kmem_size = offsetof(struct kmem_cache, cpu_slab) + | ||
| 2650 | nr_cpu_ids * sizeof(struct kmem_cache_cpu); | ||
| 2651 | 2777 | ||
| 2652 | printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," | 2778 | printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," |
| 2653 | " CPUs=%d, Nodes=%d\n", | 2779 | " CPUs=%d, Nodes=%d\n", |
| @@ -2774,15 +2900,29 @@ static int __cpuinit slab_cpuup_callback(struct notifier_block *nfb, | |||
| 2774 | unsigned long flags; | 2900 | unsigned long flags; |
| 2775 | 2901 | ||
| 2776 | switch (action) { | 2902 | switch (action) { |
| 2903 | case CPU_UP_PREPARE: | ||
| 2904 | case CPU_UP_PREPARE_FROZEN: | ||
| 2905 | init_alloc_cpu_cpu(cpu); | ||
| 2906 | down_read(&slub_lock); | ||
| 2907 | list_for_each_entry(s, &slab_caches, list) | ||
| 2908 | s->cpu_slab[cpu] = alloc_kmem_cache_cpu(s, cpu, | ||
| 2909 | GFP_KERNEL); | ||
| 2910 | up_read(&slub_lock); | ||
| 2911 | break; | ||
| 2912 | |||
| 2777 | case CPU_UP_CANCELED: | 2913 | case CPU_UP_CANCELED: |
| 2778 | case CPU_UP_CANCELED_FROZEN: | 2914 | case CPU_UP_CANCELED_FROZEN: |
| 2779 | case CPU_DEAD: | 2915 | case CPU_DEAD: |
| 2780 | case CPU_DEAD_FROZEN: | 2916 | case CPU_DEAD_FROZEN: |
| 2781 | down_read(&slub_lock); | 2917 | down_read(&slub_lock); |
| 2782 | list_for_each_entry(s, &slab_caches, list) { | 2918 | list_for_each_entry(s, &slab_caches, list) { |
| 2919 | struct kmem_cache_cpu *c = get_cpu_slab(s, cpu); | ||
| 2920 | |||
| 2783 | local_irq_save(flags); | 2921 | local_irq_save(flags); |
| 2784 | __flush_cpu_slab(s, cpu); | 2922 | __flush_cpu_slab(s, cpu); |
| 2785 | local_irq_restore(flags); | 2923 | local_irq_restore(flags); |
| 2924 | free_kmem_cache_cpu(c, cpu); | ||
| 2925 | s->cpu_slab[cpu] = NULL; | ||
| 2786 | } | 2926 | } |
| 2787 | up_read(&slub_lock); | 2927 | up_read(&slub_lock); |
| 2788 | break; | 2928 | break; |
