内存管理[5]

  •     一个新的高速缓存是通过kmem_chache_create()函数进行创建的:

 

  1. 在<Slab.c(mm)>中
  2. /**
  3.  * kmem_cache_create - Create a cache.
  4.  * @name: A string which is used in /proc/slabinfo to identify this cache.
  5.  * @size: The size of objects to be created in this cache.
  6.  * @align: The required alignment for the objects.
  7.  * @flags: SLAB flags
  8.  * @ctor: A constructor for the objects.
  9.  * @dtor: A destructor for the objects.
  10.  *
  11.  * Returns a ptr to the cache on success, NULL on failure.
  12.  * Cannot be called within a int, but can be interrupted.
  13.  * The @ctor is run when new pages are allocated by the cache
  14.  * and the @dtor is run before the pages are handed back.
  15.  *
  16.  * @name must be valid until the cache is destroyed. This implies that
  17.  * the module calling this has to destroy the cache before getting unloaded.
  18.  *
  19.  * The flags are
  20.  *
  21.  * %SLAB_POISON - Poison the slab with a known test pattern (a5a5a5a5)
  22.  * to catch references to uninitialised memory.
  23.  *
  24.  * %SLAB_RED_ZONE - Insert `Red' zones around the allocated memory to check
  25.  * for buffer overruns.
  26.  *
  27.  * %SLAB_HWCACHE_ALIGN - Align the objects in this cache to a hardware
  28.  * cacheline.  This can be beneficial if you're counting cycles as closely
  29.  * as davem.
  30.  */
  31. struct kmem_cache *
  32. kmem_cache_create (const char *name, size_t size, size_t align,
  33.     unsigned long flags,
  34.     void (*ctor)(void*, struct kmem_cache *, unsigned long),
  35.     void (*dtor)(void*, struct kmem_cache *, unsigned long))
  36. {
  37.     size_t left_over, slab_size, ralign;
  38.     struct kmem_cache *cachep = NULL, *pc;
  39.     /*
  40.      * Sanity checks... these are all serious usage bugs.
  41.      */
  42.     if (!name || in_interrupt() || (size < BYTES_PER_WORD) ||
  43.         (size > (1 << MAX_OBJ_ORDER) * PAGE_SIZE) || (dtor && !ctor)) {
  44.         printk(KERN_ERR "%s: Early error in slab %s/n", __FUNCTION__,
  45.                 name);
  46.         BUG();
  47.     }
  48.     /*
  49.      * We use cache_chain_mutex to ensure a consistent view of
  50.      * cpu_online_map as well.  Please see cpuup_callback
  51.      */
  52.     mutex_lock(&cache_chain_mutex);
  53.     list_for_each_entry(pc, &cache_chain, next) {
  54.         char tmp;
  55.         int res;
  56.         /*
  57.          * This happens when the module gets unloaded and doesn't
  58.          * destroy its slab cache and no-one else reuses the vmalloc
  59.          * area of the module.  Print a warning.
  60.          */
  61.         res = probe_kernel_address(pc->name, tmp);
  62.         if (res) {
  63.             printk("SLAB: cache with size %d has lost its name/n",
  64.                    pc->buffer_size);
  65.             continue;
  66.         }
  67.         if (!strcmp(pc->name, name)) {
  68.             printk("kmem_cache_create: duplicate cache %s/n", name);
  69.             dump_stack();
  70.             goto oops;
  71.         }
  72.     }
  73. #if DEBUG
  74.     WARN_ON(strchr(name, ' ')); /* It confuses parsers */
  75.     if ((flags & SLAB_DEBUG_INITIAL) && !ctor) {
  76.         /* No constructor, but inital state check requested */
  77.         printk(KERN_ERR "%s: No con, but init state check "
  78.                "requested - %s/n", __FUNCTION__, name);
  79.         flags &= ~SLAB_DEBUG_INITIAL;
  80.     }
  81. #if FORCED_DEBUG
  82.     /*
  83.      * Enable redzoning and last user accounting, except for caches with
  84.      * large objects, if the increased size would increase the object size
  85.      * above the next power of two: caches with object sizes just above a
  86.      * power of two have a significant amount of internal fragmentation.
  87.      */
  88.     if (size < 4096 || fls(size - 1) == fls(size-1 + 3 * BYTES_PER_WORD))
  89.         flags |= SLAB_RED_ZONE | SLAB_STORE_USER;
  90.     if (!(flags & SLAB_DESTROY_BY_RCU))
  91.         flags |= SLAB_POISON;
  92. #endif
  93.     if (flags & SLAB_DESTROY_BY_RCU)
  94.         BUG_ON(flags & SLAB_POISON);
  95. #endif
  96.     if (flags & SLAB_DESTROY_BY_RCU)
  97.         BUG_ON(dtor);
  98.     /*
  99.      * Always checks flags, a caller might be expecting debug support which
  100.      * isn't available.
  101.      */
  102.     BUG_ON(flags & ~CREATE_MASK);
  103.     /*
  104.      * Check that size is in terms of words.  This is needed to avoid
  105.      * unaligned accesses for some archs when redzoning is used, and makes
  106.      * sure any on-slab bufctl's are also correctly aligned.
  107.      */
  108.     if (size & (BYTES_PER_WORD - 1)) {
  109.         size += (BYTES_PER_WORD - 1);
  110.         size &= ~(BYTES_PER_WORD - 1);
  111.     }
  112.     /* calculate the final buffer alignment: */
  113.     /* 1) arch recommendation: can be overridden for debug */
  114.     if (flags & SLAB_HWCACHE_ALIGN) {
  115.         /*
  116.          * Default alignment: as specified by the arch code.  Except if
  117.          * an object is really small, then squeeze multiple objects into
  118.          * one cacheline.
  119.          */
  120.         ralign = cache_line_size();
  121.         while (size <= ralign / 2)
  122.             ralign /= 2;
  123.     } else {
  124.         ralign = BYTES_PER_WORD;
  125.     }
  126.     /*
  127.      * Redzoning and user store require word alignment. Note this will be
  128.      * overridden by architecture or caller mandated alignment if either
  129.      * is greater than BYTES_PER_WORD.
  130.      */
  131.     if (flags & SLAB_RED_ZONE || flags & SLAB_STORE_USER)
  132.         ralign = BYTES_PER_WORD;
  133.     /* 2) arch mandated alignment */
  134.     if (ralign < ARCH_SLAB_MINALIGN) {
  135.         ralign = ARCH_SLAB_MINALIGN;
  136.     }
  137.     /* 3) caller mandated alignment */
  138.     if (ralign < align) {
  139.         ralign = align;
  140.     }
  141.     /* disable debug if necessary */
  142.     if (ralign > BYTES_PER_WORD)
  143.         flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
  144.     /*
  145.      * 4) Store it.
  146.      */
  147.     align = ralign;
  148.     /* Get cache's description obj. */
  149.     cachep = kmem_cache_zalloc(&cache_cache, GFP_KERNEL);
  150.     if (!cachep)
  151.         goto oops;
  152. #if DEBUG
  153.     cachep->obj_size = size;
  154.     /*
  155.      * Both debugging options require word-alignment which is calculated
  156.      * into align above.
  157.      */
  158.     if (flags & SLAB_RED_ZONE) {
  159.         /* add space for red zone words */
  160.         cachep->obj_offset += BYTES_PER_WORD;
  161.         size += 2 * BYTES_PER_WORD;
  162.     }
  163.     if (flags & SLAB_STORE_USER) {
  164.         /* user store requires one word storage behind the end of
  165.          * the real object.
  166.          */
  167.         size += BYTES_PER_WORD;
  168.     }
  169. #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
  170.     if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
  171.         && cachep->obj_size > cache_line_size() && size < PAGE_SIZE) {
  172.         cachep->obj_offset += PAGE_SIZE - size;
  173.         size = PAGE_SIZE;
  174.     }
  175. #endif
  176. #endif
  177.     /*
  178.      * Determine if the slab management is 'on' or 'off' slab.
  179.      * (bootstrapping cannot cope with offslab caches so don't do
  180.      * it too early on.)
  181.      */
  182.     if ((size >= (PAGE_SIZE >> 3)) && !slab_early_init)
  183.         /*
  184.          * Size is large, assume best to place the slab management obj
  185.          * off-slab (should allow better packing of objs).
  186.          */
  187.         flags |= CFLGS_OFF_SLAB;
  188.     size = ALIGN(size, align);
  189.     left_over = calculate_slab_order(cachep, size, align, flags);
  190.     if (!cachep->num) {
  191.         printk("kmem_cache_create: couldn't create cache %s./n", name);
  192.         kmem_cache_free(&cache_cache, cachep);
  193.         cachep = NULL;
  194.         goto oops;
  195.     }
  196.     slab_size = ALIGN(cachep->num * sizeof(kmem_bufctl_t)
  197.               + sizeof(struct slab), align);
  198.     /*
  199.      * If the slab has been placed off-slab, and we have enough space then
  200.      * move it on-slab. This is at the expense of any extra colouring.
  201.      */
  202.     if (flags & CFLGS_OFF_SLAB && left_over >= slab_size) {
  203.         flags &= ~CFLGS_OFF_SLAB;
  204.         left_over -= slab_size;
  205.     }
  206.     if (flags & CFLGS_OFF_SLAB) {
  207.         /* really off slab. No need for manual alignment */
  208.         slab_size =
  209.             cachep->num * sizeof(kmem_bufctl_t) + sizeof(struct slab);
  210.     }
  211.     cachep->colour_off = cache_line_size();
  212.     /* Offset must be a multiple of the alignment. */
  213.     if (cachep->colour_off < align)
  214.         cachep->colour_off = align;
  215.     cachep->colour = left_over / cachep->colour_off;
  216.     cachep->slab_size = slab_size;
  217.     cachep->flags = flags;
  218.     cachep->gfpflags = 0;
  219.     if (CONFIG_ZONE_DMA_FLAG && (flags & SLAB_CACHE_DMA))
  220.         cachep->gfpflags |= GFP_DMA;
  221.     cachep->buffer_size = size;
  222.     cachep->reciprocal_buffer_size = reciprocal_value(size);
  223.     if (flags & CFLGS_OFF_SLAB) {
  224.         cachep->slabp_cache = kmem_find_general_cachep(slab_size, 0u);
  225.         /*
  226.          * This is a possibility for one of the malloc_sizes caches.
  227.          * But since we go off slab only for object size greater than
  228.          * PAGE_SIZE/8, and malloc_sizes gets created in ascending order,
  229.          * this should not happen at all.
  230.          * But leave a BUG_ON for some lucky dude.
  231.          */
  232.         BUG_ON(!cachep->slabp_cache);
  233.     }
  234.     cachep->ctor = ctor;
  235.     cachep->dtor = dtor;
  236.     cachep->name = name;
  237.     if (setup_cpu_cache(cachep)) {
  238.         __kmem_cache_destroy(cachep);
  239.         cachep = NULL;
  240.         goto oops;
  241.     }
  242.     /* cache setup completed, link it into the list */
  243.     list_add(&cachep->next, &cache_chain);
  244. oops:
  245.     if (!cachep && (flags & SLAB_PANIC))
  246.         panic("kmem_cache_create(): failed to create slab `%s'/n",
  247.               name);
  248.     mutex_unlock(&cache_chain_mutex);
  249.     return cachep;
  250. }

   这个函数不能在中断上下文中调用,因为它可能会睡眠。

  •    要销毁一个高速缓存可以使用kmem_cache_destroy()函数:

 

  1. /**
  2.  * kmem_cache_destroy - delete a cache
  3.  * @cachep: the cache to destroy
  4.  *
  5.  * Remove a &struct kmem_cache object from the slab cache.
  6.  *
  7.  * It is expected this function will be called by a module when it is
  8.  * unloaded.  This will remove the cache completely, and avoid a duplicate
  9.  * cache being allocated each time a module is loaded and unloaded, if the
  10.  * module doesn't have persistent in-kernel storage across loads and unloads.
  11.  *
  12.  * The cache must be empty before calling this function.
  13.  *
  14.  * The caller must guarantee that noone will allocate memory from the cache
  15.  * during the kmem_cache_destroy().
  16.  */
  17. void kmem_cache_destroy(struct kmem_cache *cachep)
  18. {
  19.     BUG_ON(!cachep || in_interrupt());
  20.     /* Find the cache in the chain of caches. */
  21.     mutex_lock(&cache_chain_mutex);
  22.     /*
  23.      * the chain is never empty, cache_cache is never destroyed
  24.      */
  25.     list_del(&cachep->next);
  26.     if (__cache_shrink(cachep)) {
  27.         slab_error(cachep, "Can't free all objects");
  28.         list_add(&cachep->next, &cache_chain);
  29.         mutex_unlock(&cache_chain_mutex);
  30.         return;
  31.     }
  32.     if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU))
  33.         synchronize_rcu();
  34.     __kmem_cache_destroy(cachep);
  35.     mutex_unlock(&cache_chain_mutex);
  36. }

  这个函数也不能在中断上下文中调用,因为它可能会睡眠。

  调用kmem_cache_destroy()之前必须确保以下两个条件:

1. 告诉缓存中的所有slab都必须为空。其实,不管哪个slab中只要还有一个对象被分配出去,并正在使用的话,不可能销毁这个高速缓存。

2. 在调用该函数期间,不再访问这个高速缓存。调用者必须确保这种同步。

  • 创建高速缓存后,通过kmem_cache_alloc()函数从中获取对象:

 

  1. /**
  2.  * kmem_cache_alloc - Allocate an object
  3.  * @cachep: The cache to allocate from.
  4.  * @flags: See kmalloc().
  5.  *
  6.  * Allocate an object from this cache.  The flags are only relevant
  7.  * if the cache has no available objects.
  8.  */
  9. void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
  10. {
  11.     return __cache_alloc(cachep, flags, __builtin_return_address(0));
  12. }
  1. static __always_inline void *
  2. __cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
  3. {
  4.     unsigned long save_flags;
  5.     void *objp;
  6.     cache_alloc_debugcheck_before(cachep, flags);
  7.     local_irq_save(save_flags);
  8.     objp = __do_cache_alloc(cachep, flags);
  9.     local_irq_restore(save_flags);
  10.     objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
  11.     prefetchw(objp);
  12.     return objp;
  13. }

如果高速缓存的所有slab中都没有空闲的对象,那么slab层必须通过kmem_getpages()获取新的页。

  • 最后,使用kmem_cache_free()函数释放一个对象,并把它返回给原先的slab:

 

  1. /**
  2.  * kmem_cache_free - Deallocate an object
  3.  * @cachep: The cache the allocation was from.
  4.  * @objp: The previously allocated object.
  5.  *
  6.  * Free an object which was previously allocated from this
  7.  * cache.
  8.  */
  9. void kmem_cache_free(struct kmem_cache *cachep, void *objp)
  10. {
  11.     unsigned long flags;
  12.     BUG_ON(virt_to_cache(objp) != cachep);
  13.     local_irq_save(flags);
  14.     debug_check_no_locks_freed(objp, obj_size(cachep));
  15.     __cache_free(cachep, objp);
  16.     local_irq_restore(flags);
  17. }
  1. /*
  2.  * Release an obj back to its cache. If the obj has a constructed state, it must
  3.  * be in this state _before_ it is released.  Called with disabled ints.
  4.  */
  5. static inline void __cache_free(struct kmem_cache *cachep, void *objp)
  6. {
  7.     struct array_cache *ac = cpu_cache_get(cachep);
  8.     check_irq_off();
  9.     objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
  10.     if (cache_free_alien(cachep, objp))
  11.         return;
  12.     if (likely(ac->avail < ac->limit)) {
  13.         STATS_INC_FREEHIT(cachep);
  14.         ac->entry[ac->avail++] = objp;
  15.         return;
  16.     } else {
  17.         STATS_INC_FREEMISS(cachep);
  18.         cache_flusharray(cachep, ac);
  19.         ac->entry[ac->avail++] = objp;
  20.     }
  21. }

 

你可能感兴趣的:(内存管理[5])