@@ -547,8 +547,6 @@ static struct cache_names __initdata cache_names[] = {
547
547
#undef CACHE
548
548
};
549
549
550
- static struct arraycache_init initarray_cache __initdata =
551
- { {0 , BOOT_CPUCACHE_ENTRIES , 1 , 0 } };
552
550
static struct arraycache_init initarray_generic =
553
551
{ {0 , BOOT_CPUCACHE_ENTRIES , 1 , 0 } };
554
552
@@ -1572,12 +1570,9 @@ static void setup_nodelists_pointer(struct kmem_cache *cachep)
1572
1570
*/
1573
1571
void __init kmem_cache_init (void )
1574
1572
{
1575
- size_t left_over ;
1576
1573
struct cache_sizes * sizes ;
1577
1574
struct cache_names * names ;
1578
1575
int i ;
1579
- int order ;
1580
- int node ;
1581
1576
1582
1577
kmem_cache = & kmem_cache_boot ;
1583
1578
setup_nodelists_pointer (kmem_cache );
@@ -1618,36 +1613,16 @@ void __init kmem_cache_init(void)
1618
1613
* 6) Resize the head arrays of the kmalloc caches to their final sizes.
1619
1614
*/
1620
1615
1621
- node = numa_mem_id ();
1622
-
1623
1616
/* 1) create the kmem_cache */
1624
- INIT_LIST_HEAD (& slab_caches );
1625
- list_add (& kmem_cache -> list , & slab_caches );
1626
- kmem_cache -> colour_off = cache_line_size ();
1627
- kmem_cache -> array [smp_processor_id ()] = & initarray_cache .cache ;
1628
1617
1629
1618
/*
1630
1619
* struct kmem_cache size depends on nr_node_ids & nr_cpu_ids
1631
1620
*/
1632
- kmem_cache -> size = offsetof(struct kmem_cache , array [nr_cpu_ids ]) +
1633
- nr_node_ids * sizeof (struct kmem_list3 * );
1634
- kmem_cache -> object_size = kmem_cache -> size ;
1635
- kmem_cache -> size = ALIGN (kmem_cache -> object_size ,
1636
- cache_line_size ());
1637
- kmem_cache -> reciprocal_buffer_size =
1638
- reciprocal_value (kmem_cache -> size );
1639
-
1640
- for (order = 0 ; order < MAX_ORDER ; order ++ ) {
1641
- cache_estimate (order , kmem_cache -> size ,
1642
- cache_line_size (), 0 , & left_over , & kmem_cache -> num );
1643
- if (kmem_cache -> num )
1644
- break ;
1645
- }
1646
- BUG_ON (!kmem_cache -> num );
1647
- kmem_cache -> gfporder = order ;
1648
- kmem_cache -> colour = left_over / kmem_cache -> colour_off ;
1649
- kmem_cache -> slab_size = ALIGN (kmem_cache -> num * sizeof (kmem_bufctl_t ) +
1650
- sizeof (struct slab ), cache_line_size ());
1621
+ create_boot_cache (kmem_cache , "kmem_cache" ,
1622
+ offsetof(struct kmem_cache , array [nr_cpu_ids ]) +
1623
+ nr_node_ids * sizeof (struct kmem_list3 * ),
1624
+ SLAB_HWCACHE_ALIGN );
1625
+ list_add (& kmem_cache -> list , & slab_caches );
1651
1626
1652
1627
/* 2+3) create the kmalloc caches */
1653
1628
sizes = malloc_sizes ;
@@ -1695,7 +1670,6 @@ void __init kmem_cache_init(void)
1695
1670
1696
1671
ptr = kmalloc (sizeof (struct arraycache_init ), GFP_NOWAIT );
1697
1672
1698
- BUG_ON (cpu_cache_get (kmem_cache ) != & initarray_cache .cache );
1699
1673
memcpy (ptr , cpu_cache_get (kmem_cache ),
1700
1674
sizeof (struct arraycache_init ));
1701
1675
/*
@@ -2250,15 +2224,23 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp)
2250
2224
2251
2225
if (slab_state == DOWN ) {
2252
2226
/*
2253
- * Note: the first kmem_cache_create must create the cache
2227
+ * Note: Creation of first cache (kmem_cache).
2228
+ * The setup_list3s is taken care
2229
+ * of by the caller of __kmem_cache_create
2230
+ */
2231
+ cachep -> array [smp_processor_id ()] = & initarray_generic .cache ;
2232
+ slab_state = PARTIAL ;
2233
+ } else if (slab_state == PARTIAL ) {
2234
+ /*
2235
+ * Note: the second kmem_cache_create must create the cache
2254
2236
* that's used by kmalloc(24), otherwise the creation of
2255
2237
* further caches will BUG().
2256
2238
*/
2257
2239
cachep -> array [smp_processor_id ()] = & initarray_generic .cache ;
2258
2240
2259
2241
/*
2260
2242
* If the cache that's used by kmalloc(sizeof(kmem_list3)) is
2261
- * the first cache, then we need to set up all its list3s,
2243
+ * the second cache, then we need to set up all its list3s,
2262
2244
* otherwise the creation of further caches will BUG().
2263
2245
*/
2264
2246
set_up_list3s (cachep , SIZE_AC );
@@ -2267,6 +2249,7 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep, gfp_t gfp)
2267
2249
else
2268
2250
slab_state = PARTIAL_ARRAYCACHE ;
2269
2251
} else {
2252
+ /* Remaining boot caches */
2270
2253
cachep -> array [smp_processor_id ()] =
2271
2254
kmalloc (sizeof (struct arraycache_init ), gfp );
2272
2255
0 commit comments