Skip to content
Snippets Groups Projects
  • Linus Torvalds's avatar
    Merge tag 'mm-stable-2022-05-25' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm · 98931dd9
    Linus Torvalds authored
    Pull MM updates from Andrew Morton:
     "Almost all of MM here. A few things are still getting finished off,
      reviewed, etc.
    
       - Yang Shi has improved the behaviour of khugepaged collapsing of
         readonly file-backed transparent hugepages.
    
       - Johannes Weiner has arranged for zswap memory use to be tracked and
         managed on a per-cgroup basis.
    
       - Munchun Song adds a /proc knob ("hugetlb_optimize_vmemmap") for
         runtime enablement of the recent huge page vmemmap optimization
         feature.
    
       - Baolin Wang contributes a series to fix some issues around hugetlb
         pagetable invalidation.
    
       - Zhenwei Pi has fixed some interactions between hwpoisoned pages and
         virtualization.
    
       - Tong Tiangen has enabled the use of the presently x86-only
         page_table_check debugging feature on arm64 and riscv.
    
       - David Vernet has done some fixup work on the memcg selftests.
    
       - Peter Xu has taught userfaultfd to handle write protection faults
         against shmem- and hugetlbfs-backed files.
    
       - More DAMON development from SeongJae Park - adding online tuning of
         the feature and support for monitoring of fixed virtual address
         ranges. Also easier discovery of which monitoring operations are
         available.
    
       - Nadav Amit has done some optimization of TLB flushing during
         mprotect().
    
       - Neil Brown continues to labor away at improving our swap-over-NFS
         support.
    
       - David Hildenbrand has some fixes to anon page COWing versus
         get_user_pages().
    
       - Peng Liu fixed some errors in the core hugetlb code.
    
       - Joao Martins has reduced the amount of memory consumed by
         device-dax's compound devmaps.
    
       - Some cleanups of the arch-specific pagemap code from Anshuman
         Khandual.
    
       - Muchun Song has found and fixed some errors in the TLB flushing of
         transparent hugepages.
    
       - Roman Gushchin has done more work on the memcg selftests.
    
      ... and, of course, many smaller fixes and cleanups. Notably, the
      customary million cleanup serieses from Miaohe Lin"
    
    * tag 'mm-stable-2022-05-25' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (381 commits)
      mm: kfence: use PAGE_ALIGNED helper
      selftests: vm: add the "settings" file with timeout variable
      selftests: vm: add "test_hmm.sh" to TEST_FILES
      selftests: vm: check numa_available() before operating "merge_across_nodes" in ksm_tests
      selftests: vm: add migration to the .gitignore
      selftests/vm/pkeys: fix typo in comment
      ksm: fix typo in comment
      selftests: vm: add process_mrelease tests
      Revert "mm/vmscan: never demote for memcg reclaim"
      mm/kfence: print disabling or re-enabling message
      include/trace/events/percpu.h: cleanup for "percpu: improve percpu_alloc_percpu event trace"
      include/trace/events/mmflags.h: cleanup for "tracing: incorrect gfp_t conversion"
      mm: fix a potential infinite loop in start_isolate_page_range()
      MAINTAINERS: add Muchun as co-maintainer for HugeTLB
      zram: fix Kconfig dependency warning
      mm/shmem: fix shmem folio swapoff hang
      cgroup: fix an error handling path in alloc_pagecache_max_30M()
      mm: damon: use HPAGE_PMD_SIZE
      tracing: incorrect isolate_mote_t cast in mm_vmscan_lru_isolate
      nodemask.h: fix compilation error with GCC12
      ...
    98931dd9
slab.c 105.89 KiB
// SPDX-License-Identifier: GPL-2.0
/*
 * linux/mm/slab.c
 * Written by Mark Hemment, 1996/97.
 * (markhe@nextd.demon.co.uk)
 *
 * kmem_cache_destroy() + some cleanup - 1999 Andrea Arcangeli
 *
 * Major cleanup, different bufctl logic, per-cpu arrays
 *	(c) 2000 Manfred Spraul
 *
 * Cleanup, make the head arrays unconditional, preparation for NUMA
 * 	(c) 2002 Manfred Spraul
 *
 * An implementation of the Slab Allocator as described in outline in;
 *	UNIX Internals: The New Frontiers by Uresh Vahalia
 *	Pub: Prentice Hall	ISBN 0-13-101908-2
 * or with a little more detail in;
 *	The Slab Allocator: An Object-Caching Kernel Memory Allocator
 *	Jeff Bonwick (Sun Microsystems).
 *	Presented at: USENIX Summer 1994 Technical Conference
 *
 * The memory is organized in caches, one cache for each object type.
 * (e.g. inode_cache, dentry_cache, buffer_head, vm_area_struct)
 * Each cache consists out of many slabs (they are small (usually one
 * page long) and always contiguous), and each slab contains multiple
 * initialized objects.
 *
 * This means, that your constructor is used only for newly allocated
 * slabs and you must pass objects with the same initializations to
 * kmem_cache_free.
 *
 * Each cache can only support one memory type (GFP_DMA, GFP_HIGHMEM,
 * normal). If you need a special memory type, then must create a new
 * cache for that memory type.
 *
 * In order to reduce fragmentation, the slabs are sorted in 3 groups:
 *   full slabs with 0 free objects
 *   partial slabs
 *   empty slabs with no allocated objects
 *
 * If partial slabs exist, then new allocations come from these slabs,
 * otherwise from empty slabs or new slabs are allocated.
 *
 * kmem_cache_destroy() CAN CRASH if you try to allocate from the cache
 * during kmem_cache_destroy(). The caller must prevent concurrent allocs.
 *
 * Each cache has a short per-cpu head array, most allocs
 * and frees go into that array, and if that array overflows, then 1/2
 * of the entries in the array are given back into the global cache.
 * The head array is strictly LIFO and should improve the cache hit rates.
 * On SMP, it additionally reduces the spinlock operations.
 *
 * The c_cpuarray may not be read with enabled local interrupts -
 * it's changed with a smp_call_function().
 *
 * SMP synchronization:
 *  constructors and destructors are called without any locking.
 *  Several members in struct kmem_cache and struct slab never change, they
 *	are accessed without any locking.
 *  The per-cpu arrays are never accessed from the wrong cpu, no locking,
 *  	and local interrupts are disabled so slab code is preempt-safe.
 *  The non-constant members are protected with a per-cache irq spinlock.
 *
 * Many thanks to Mark Hemment, who wrote another per-cpu slab patch
 * in 2000 - many ideas in the current implementation are derived from
 * his patch.
 *
 * Further notes from the original documentation:
 *