LCOV - code coverage report
Current view: top level - mm - slab.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 39 62 62.9 %
Date: 2023-08-24 13:40:31 Functions: 2 3 66.7 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef MM_SLAB_H
       3             : #define MM_SLAB_H
       4             : /*
       5             :  * Internal slab definitions
       6             :  */
       7             : void __init kmem_cache_init(void);
       8             : 
       9             : #ifdef CONFIG_64BIT
      10             : # ifdef system_has_cmpxchg128
      11             : # define system_has_freelist_aba()      system_has_cmpxchg128()
      12             : # define try_cmpxchg_freelist           try_cmpxchg128
      13             : # endif
      14             : #define this_cpu_try_cmpxchg_freelist   this_cpu_try_cmpxchg128
      15             : typedef u128 freelist_full_t;
      16             : #else /* CONFIG_64BIT */
      17             : # ifdef system_has_cmpxchg64
      18             : # define system_has_freelist_aba()      system_has_cmpxchg64()
      19             : # define try_cmpxchg_freelist           try_cmpxchg64
      20             : # endif
      21             : #define this_cpu_try_cmpxchg_freelist   this_cpu_try_cmpxchg64
      22             : typedef u64 freelist_full_t;
      23             : #endif /* CONFIG_64BIT */
      24             : 
      25             : #if defined(system_has_freelist_aba) && !defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
      26             : #undef system_has_freelist_aba
      27             : #endif
      28             : 
      29             : /*
      30             :  * Freelist pointer and counter to cmpxchg together, avoids the typical ABA
      31             :  * problems with cmpxchg of just a pointer.
      32             :  */
      33             : typedef union {
      34             :         struct {
      35             :                 void *freelist;
      36             :                 unsigned long counter;
      37             :         };
      38             :         freelist_full_t full;
      39             : } freelist_aba_t;
      40             : 
      41             : /* Reuses the bits in struct page */
      42             : struct slab {
      43             :         unsigned long __page_flags;
      44             : 
      45             : #if defined(CONFIG_SLAB)
      46             : 
      47             :         struct kmem_cache *slab_cache;
      48             :         union {
      49             :                 struct {
      50             :                         struct list_head slab_list;
      51             :                         void *freelist; /* array of free object indexes */
      52             :                         void *s_mem;    /* first object */
      53             :                 };
      54             :                 struct rcu_head rcu_head;
      55             :         };
      56             :         unsigned int active;
      57             : 
      58             : #elif defined(CONFIG_SLUB)
      59             : 
      60             :         struct kmem_cache *slab_cache;
      61             :         union {
      62             :                 struct {
      63             :                         union {
      64             :                                 struct list_head slab_list;
      65             : #ifdef CONFIG_SLUB_CPU_PARTIAL
      66             :                                 struct {
      67             :                                         struct slab *next;
      68             :                                         int slabs;      /* Nr of slabs left */
      69             :                                 };
      70             : #endif
      71             :                         };
      72             :                         /* Double-word boundary */
      73             :                         union {
      74             :                                 struct {
      75             :                                         void *freelist;         /* first free object */
      76             :                                         union {
      77             :                                                 unsigned long counters;
      78             :                                                 struct {
      79             :                                                         unsigned inuse:16;
      80             :                                                         unsigned objects:15;
      81             :                                                         unsigned frozen:1;
      82             :                                                 };
      83             :                                         };
      84             :                                 };
      85             : #ifdef system_has_freelist_aba
      86             :                                 freelist_aba_t freelist_counter;
      87             : #endif
      88             :                         };
      89             :                 };
      90             :                 struct rcu_head rcu_head;
      91             :         };
      92             :         unsigned int __unused;
      93             : 
      94             : #else
      95             : #error "Unexpected slab allocator configured"
      96             : #endif
      97             : 
      98             :         atomic_t __page_refcount;
      99             : #ifdef CONFIG_MEMCG
     100             :         unsigned long memcg_data;
     101             : #endif
     102             : };
     103             : 
     104             : #define SLAB_MATCH(pg, sl)                                              \
     105             :         static_assert(offsetof(struct page, pg) == offsetof(struct slab, sl))
     106             : SLAB_MATCH(flags, __page_flags);
     107             : SLAB_MATCH(compound_head, slab_cache);  /* Ensure bit 0 is clear */
     108             : SLAB_MATCH(_refcount, __page_refcount);
     109             : #ifdef CONFIG_MEMCG
     110             : SLAB_MATCH(memcg_data, memcg_data);
     111             : #endif
     112             : #undef SLAB_MATCH
     113             : static_assert(sizeof(struct slab) <= sizeof(struct page));
     114             : #if defined(system_has_freelist_aba) && defined(CONFIG_SLUB)
     115             : static_assert(IS_ALIGNED(offsetof(struct slab, freelist), sizeof(freelist_aba_t)));
     116             : #endif
     117             : 
     118             : /**
     119             :  * folio_slab - Converts from folio to slab.
     120             :  * @folio: The folio.
     121             :  *
     122             :  * Currently struct slab is a different representation of a folio where
     123             :  * folio_test_slab() is true.
     124             :  *
     125             :  * Return: The slab which contains this folio.
     126             :  */
     127             : #define folio_slab(folio)       (_Generic((folio),                      \
     128             :         const struct folio *:   (const struct slab *)(folio),           \
     129             :         struct folio *:         (struct slab *)(folio)))
     130             : 
     131             : /**
     132             :  * slab_folio - The folio allocated for a slab
     133             :  * @slab: The slab.
     134             :  *
     135             :  * Slabs are allocated as folios that contain the individual objects and are
     136             :  * using some fields in the first struct page of the folio - those fields are
     137             :  * now accessed by struct slab. It is occasionally necessary to convert back to
     138             :  * a folio in order to communicate with the rest of the mm.  Please use this
     139             :  * helper function instead of casting yourself, as the implementation may change
     140             :  * in the future.
     141             :  */
     142             : #define slab_folio(s)           (_Generic((s),                          \
     143             :         const struct slab *:    (const struct folio *)s,                \
     144             :         struct slab *:          (struct folio *)s))
     145             : 
     146             : /**
     147             :  * page_slab - Converts from first struct page to slab.
     148             :  * @p: The first (either head of compound or single) page of slab.
     149             :  *
     150             :  * A temporary wrapper to convert struct page to struct slab in situations where
     151             :  * we know the page is the compound head, or single order-0 page.
     152             :  *
     153             :  * Long-term ideally everything would work with struct slab directly or go
     154             :  * through folio to struct slab.
     155             :  *
     156             :  * Return: The slab which contains this page
     157             :  */
     158             : #define page_slab(p)            (_Generic((p),                          \
     159             :         const struct page *:    (const struct slab *)(p),               \
     160             :         struct page *:          (struct slab *)(p)))
     161             : 
     162             : /**
     163             :  * slab_page - The first struct page allocated for a slab
     164             :  * @slab: The slab.
     165             :  *
     166             :  * A convenience wrapper for converting slab to the first struct page of the
     167             :  * underlying folio, to communicate with code not yet converted to folio or
     168             :  * struct slab.
     169             :  */
     170             : #define slab_page(s) folio_page(slab_folio(s), 0)
     171             : 
     172             : /*
     173             :  * If network-based swap is enabled, sl*b must keep track of whether pages
     174             :  * were allocated from pfmemalloc reserves.
     175             :  */
     176             : static inline bool slab_test_pfmemalloc(const struct slab *slab)
     177             : {
     178         922 :         return folio_test_active((struct folio *)slab_folio(slab));
     179             : }
     180             : 
     181             : static inline void slab_set_pfmemalloc(struct slab *slab)
     182             : {
     183           0 :         folio_set_active(slab_folio(slab));
     184             : }
     185             : 
     186             : static inline void slab_clear_pfmemalloc(struct slab *slab)
     187             : {
     188             :         folio_clear_active(slab_folio(slab));
     189             : }
     190             : 
     191             : static inline void __slab_clear_pfmemalloc(struct slab *slab)
     192             : {
     193           0 :         __folio_clear_active(slab_folio(slab));
     194             : }
     195             : 
     196             : static inline void *slab_address(const struct slab *slab)
     197             : {
     198         435 :         return folio_address(slab_folio(slab));
     199             : }
     200             : 
     201             : static inline int slab_nid(const struct slab *slab)
     202             : {
     203         475 :         return folio_nid(slab_folio(slab));
     204             : }
     205             : 
     206             : static inline pg_data_t *slab_pgdat(const struct slab *slab)
     207             : {
     208         435 :         return folio_pgdat(slab_folio(slab));
     209             : }
     210             : 
     211             : static inline struct slab *virt_to_slab(const void *addr)
     212             : {
     213        4423 :         struct folio *folio = virt_to_folio(addr);
     214             : 
     215        4423 :         if (!folio_test_slab(folio))
     216             :                 return NULL;
     217             : 
     218             :         return folio_slab(folio);
     219             : }
     220             : 
     221             : static inline int slab_order(const struct slab *slab)
     222             : {
     223           0 :         return folio_order((struct folio *)slab_folio(slab));
     224             : }
     225             : 
     226             : static inline size_t slab_size(const struct slab *slab)
     227             : {
     228           0 :         return PAGE_SIZE << slab_order(slab);
     229             : }
     230             : 
     231             : #ifdef CONFIG_SLAB
     232             : #include <linux/slab_def.h>
     233             : #endif
     234             : 
     235             : #ifdef CONFIG_SLUB
     236             : #include <linux/slub_def.h>
     237             : #endif
     238             : 
     239             : #include <linux/memcontrol.h>
     240             : #include <linux/fault-inject.h>
     241             : #include <linux/kasan.h>
     242             : #include <linux/kmemleak.h>
     243             : #include <linux/random.h>
     244             : #include <linux/sched/mm.h>
     245             : #include <linux/list_lru.h>
     246             : 
     247             : /*
     248             :  * State of the slab allocator.
     249             :  *
     250             :  * This is used to describe the states of the allocator during bootup.
     251             :  * Allocators use this to gradually bootstrap themselves. Most allocators
     252             :  * have the problem that the structures used for managing slab caches are
     253             :  * allocated from slab caches themselves.
     254             :  */
     255             : enum slab_state {
     256             :         DOWN,                   /* No slab functionality yet */
     257             :         PARTIAL,                /* SLUB: kmem_cache_node available */
     258             :         PARTIAL_NODE,           /* SLAB: kmalloc size for node struct available */
     259             :         UP,                     /* Slab caches usable but not all extras yet */
     260             :         FULL                    /* Everything is working */
     261             : };
     262             : 
     263             : extern enum slab_state slab_state;
     264             : 
     265             : /* The slab cache mutex protects the management structures during changes */
     266             : extern struct mutex slab_mutex;
     267             : 
     268             : /* The list of all slab caches on the system */
     269             : extern struct list_head slab_caches;
     270             : 
     271             : /* The slab cache that manages slab cache information */
     272             : extern struct kmem_cache *kmem_cache;
     273             : 
     274             : /* A table of kmalloc cache names and sizes */
     275             : extern const struct kmalloc_info_struct {
     276             :         const char *name[NR_KMALLOC_TYPES];
     277             :         unsigned int size;
     278             : } kmalloc_info[];
     279             : 
     280             : /* Kmalloc array related functions */
     281             : void setup_kmalloc_cache_index_table(void);
     282             : void create_kmalloc_caches(slab_flags_t);
     283             : 
     284             : /* Find the kmalloc slab corresponding for a certain size */
     285             : struct kmem_cache *kmalloc_slab(size_t, gfp_t);
     286             : 
     287             : void *__kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags,
     288             :                               int node, size_t orig_size,
     289             :                               unsigned long caller);
     290             : void __kmem_cache_free(struct kmem_cache *s, void *x, unsigned long caller);
     291             : 
     292             : gfp_t kmalloc_fix_flags(gfp_t flags);
     293             : 
     294             : /* Functions provided by the slab allocators */
     295             : int __kmem_cache_create(struct kmem_cache *, slab_flags_t flags);
     296             : 
     297             : void __init new_kmalloc_cache(int idx, enum kmalloc_cache_type type,
     298             :                               slab_flags_t flags);
     299             : extern void create_boot_cache(struct kmem_cache *, const char *name,
     300             :                         unsigned int size, slab_flags_t flags,
     301             :                         unsigned int useroffset, unsigned int usersize);
     302             : 
     303             : int slab_unmergeable(struct kmem_cache *s);
     304             : struct kmem_cache *find_mergeable(unsigned size, unsigned align,
     305             :                 slab_flags_t flags, const char *name, void (*ctor)(void *));
     306             : struct kmem_cache *
     307             : __kmem_cache_alias(const char *name, unsigned int size, unsigned int align,
     308             :                    slab_flags_t flags, void (*ctor)(void *));
     309             : 
     310             : slab_flags_t kmem_cache_flags(unsigned int object_size,
     311             :         slab_flags_t flags, const char *name);
     312             : 
     313             : static inline bool is_kmalloc_cache(struct kmem_cache *s)
     314             : {
     315             :         return (s->flags & SLAB_KMALLOC);
     316             : }
     317             : 
     318             : /* Legal flag mask for kmem_cache_create(), for various configurations */
     319             : #define SLAB_CORE_FLAGS (SLAB_HWCACHE_ALIGN | SLAB_CACHE_DMA | \
     320             :                          SLAB_CACHE_DMA32 | SLAB_PANIC | \
     321             :                          SLAB_TYPESAFE_BY_RCU | SLAB_DEBUG_OBJECTS )
     322             : 
     323             : #if defined(CONFIG_DEBUG_SLAB)
     324             : #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER)
     325             : #elif defined(CONFIG_SLUB_DEBUG)
     326             : #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
     327             :                           SLAB_TRACE | SLAB_CONSISTENCY_CHECKS)
     328             : #else
     329             : #define SLAB_DEBUG_FLAGS (0)
     330             : #endif
     331             : 
     332             : #if defined(CONFIG_SLAB)
     333             : #define SLAB_CACHE_FLAGS (SLAB_MEM_SPREAD | SLAB_NOLEAKTRACE | \
     334             :                           SLAB_RECLAIM_ACCOUNT | SLAB_TEMPORARY | \
     335             :                           SLAB_ACCOUNT | SLAB_NO_MERGE)
     336             : #elif defined(CONFIG_SLUB)
     337             : #define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE | SLAB_RECLAIM_ACCOUNT | \
     338             :                           SLAB_TEMPORARY | SLAB_ACCOUNT | \
     339             :                           SLAB_NO_USER_FLAGS | SLAB_KMALLOC | SLAB_NO_MERGE)
     340             : #else
     341             : #define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE)
     342             : #endif
     343             : 
     344             : /* Common flags available with current configuration */
     345             : #define CACHE_CREATE_MASK (SLAB_CORE_FLAGS | SLAB_DEBUG_FLAGS | SLAB_CACHE_FLAGS)
     346             : 
     347             : /* Common flags permitted for kmem_cache_create */
     348             : #define SLAB_FLAGS_PERMITTED (SLAB_CORE_FLAGS | \
     349             :                               SLAB_RED_ZONE | \
     350             :                               SLAB_POISON | \
     351             :                               SLAB_STORE_USER | \
     352             :                               SLAB_TRACE | \
     353             :                               SLAB_CONSISTENCY_CHECKS | \
     354             :                               SLAB_MEM_SPREAD | \
     355             :                               SLAB_NOLEAKTRACE | \
     356             :                               SLAB_RECLAIM_ACCOUNT | \
     357             :                               SLAB_TEMPORARY | \
     358             :                               SLAB_ACCOUNT | \
     359             :                               SLAB_KMALLOC | \
     360             :                               SLAB_NO_MERGE | \
     361             :                               SLAB_NO_USER_FLAGS)
     362             : 
     363             : bool __kmem_cache_empty(struct kmem_cache *);
     364             : int __kmem_cache_shutdown(struct kmem_cache *);
     365             : void __kmem_cache_release(struct kmem_cache *);
     366             : int __kmem_cache_shrink(struct kmem_cache *);
     367             : void slab_kmem_cache_release(struct kmem_cache *);
     368             : 
     369             : struct seq_file;
     370             : struct file;
     371             : 
     372             : struct slabinfo {
     373             :         unsigned long active_objs;
     374             :         unsigned long num_objs;
     375             :         unsigned long active_slabs;
     376             :         unsigned long num_slabs;
     377             :         unsigned long shared_avail;
     378             :         unsigned int limit;
     379             :         unsigned int batchcount;
     380             :         unsigned int shared;
     381             :         unsigned int objects_per_slab;
     382             :         unsigned int cache_order;
     383             : };
     384             : 
     385             : void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
     386             : void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s);
     387             : ssize_t slabinfo_write(struct file *file, const char __user *buffer,
     388             :                        size_t count, loff_t *ppos);
     389             : 
     390             : static inline enum node_stat_item cache_vmstat_idx(struct kmem_cache *s)
     391             : {
     392         435 :         return (s->flags & SLAB_RECLAIM_ACCOUNT) ?
     393         435 :                 NR_SLAB_RECLAIMABLE_B : NR_SLAB_UNRECLAIMABLE_B;
     394             : }
     395             : 
     396             : #ifdef CONFIG_SLUB_DEBUG
     397             : #ifdef CONFIG_SLUB_DEBUG_ON
     398             : DECLARE_STATIC_KEY_TRUE(slub_debug_enabled);
     399             : #else
     400             : DECLARE_STATIC_KEY_FALSE(slub_debug_enabled);
     401             : #endif
     402             : extern void print_tracking(struct kmem_cache *s, void *object);
     403             : long validate_slab_cache(struct kmem_cache *s);
     404             : static inline bool __slub_debug_enabled(void)
     405             : {
     406       51853 :         return static_branch_unlikely(&slub_debug_enabled);
     407             : }
     408             : #else
     409             : static inline void print_tracking(struct kmem_cache *s, void *object)
     410             : {
     411             : }
     412             : static inline bool __slub_debug_enabled(void)
     413             : {
     414             :         return false;
     415             : }
     416             : #endif
     417             : 
     418             : /*
     419             :  * Returns true if any of the specified slub_debug flags is enabled for the
     420             :  * cache. Use only for flags parsed by setup_slub_debug() as it also enables
     421             :  * the static key.
     422             :  */
     423             : static inline bool kmem_cache_debug_flags(struct kmem_cache *s, slab_flags_t flags)
     424             : {
     425             :         if (IS_ENABLED(CONFIG_SLUB_DEBUG))
     426             :                 VM_WARN_ON_ONCE(!(flags & SLAB_DEBUG_FLAGS));
     427       34896 :         if (__slub_debug_enabled())
     428           0 :                 return s->flags & flags;
     429             :         return false;
     430             : }
     431             : 
     432             : #ifdef CONFIG_MEMCG_KMEM
     433             : /*
     434             :  * slab_objcgs - get the object cgroups vector associated with a slab
     435             :  * @slab: a pointer to the slab struct
     436             :  *
     437             :  * Returns a pointer to the object cgroups vector associated with the slab,
     438             :  * or NULL if no such vector has been associated yet.
     439             :  */
     440             : static inline struct obj_cgroup **slab_objcgs(struct slab *slab)
     441             : {
     442             :         unsigned long memcg_data = READ_ONCE(slab->memcg_data);
     443             : 
     444             :         VM_BUG_ON_PAGE(memcg_data && !(memcg_data & MEMCG_DATA_OBJCGS),
     445             :                                                         slab_page(slab));
     446             :         VM_BUG_ON_PAGE(memcg_data & MEMCG_DATA_KMEM, slab_page(slab));
     447             : 
     448             :         return (struct obj_cgroup **)(memcg_data & ~MEMCG_DATA_FLAGS_MASK);
     449             : }
     450             : 
     451             : int memcg_alloc_slab_cgroups(struct slab *slab, struct kmem_cache *s,
     452             :                                  gfp_t gfp, bool new_slab);
     453             : void mod_objcg_state(struct obj_cgroup *objcg, struct pglist_data *pgdat,
     454             :                      enum node_stat_item idx, int nr);
     455             : 
     456             : static inline void memcg_free_slab_cgroups(struct slab *slab)
     457             : {
     458             :         kfree(slab_objcgs(slab));
     459             :         slab->memcg_data = 0;
     460             : }
     461             : 
     462             : static inline size_t obj_full_size(struct kmem_cache *s)
     463             : {
     464             :         /*
     465             :          * For each accounted object there is an extra space which is used
     466             :          * to store obj_cgroup membership. Charge it too.
     467             :          */
     468             :         return s->size + sizeof(struct obj_cgroup *);
     469             : }
     470             : 
     471             : /*
     472             :  * Returns false if the allocation should fail.
     473             :  */
     474             : static inline bool memcg_slab_pre_alloc_hook(struct kmem_cache *s,
     475             :                                              struct list_lru *lru,
     476             :                                              struct obj_cgroup **objcgp,
     477             :                                              size_t objects, gfp_t flags)
     478             : {
     479             :         struct obj_cgroup *objcg;
     480             : 
     481             :         if (!memcg_kmem_online())
     482             :                 return true;
     483             : 
     484             :         if (!(flags & __GFP_ACCOUNT) && !(s->flags & SLAB_ACCOUNT))
     485             :                 return true;
     486             : 
     487             :         objcg = get_obj_cgroup_from_current();
     488             :         if (!objcg)
     489             :                 return true;
     490             : 
     491             :         if (lru) {
     492             :                 int ret;
     493             :                 struct mem_cgroup *memcg;
     494             : 
     495             :                 memcg = get_mem_cgroup_from_objcg(objcg);
     496             :                 ret = memcg_list_lru_alloc(memcg, lru, flags);
     497             :                 css_put(&memcg->css);
     498             : 
     499             :                 if (ret)
     500             :                         goto out;
     501             :         }
     502             : 
     503             :         if (obj_cgroup_charge(objcg, flags, objects * obj_full_size(s)))
     504             :                 goto out;
     505             : 
     506             :         *objcgp = objcg;
     507             :         return true;
     508             : out:
     509             :         obj_cgroup_put(objcg);
     510             :         return false;
     511             : }
     512             : 
     513             : static inline void memcg_slab_post_alloc_hook(struct kmem_cache *s,
     514             :                                               struct obj_cgroup *objcg,
     515             :                                               gfp_t flags, size_t size,
     516             :                                               void **p)
     517             : {
     518             :         struct slab *slab;
     519             :         unsigned long off;
     520             :         size_t i;
     521             : 
     522             :         if (!memcg_kmem_online() || !objcg)
     523             :                 return;
     524             : 
     525             :         for (i = 0; i < size; i++) {
     526             :                 if (likely(p[i])) {
     527             :                         slab = virt_to_slab(p[i]);
     528             : 
     529             :                         if (!slab_objcgs(slab) &&
     530             :                             memcg_alloc_slab_cgroups(slab, s, flags,
     531             :                                                          false)) {
     532             :                                 obj_cgroup_uncharge(objcg, obj_full_size(s));
     533             :                                 continue;
     534             :                         }
     535             : 
     536             :                         off = obj_to_index(s, slab, p[i]);
     537             :                         obj_cgroup_get(objcg);
     538             :                         slab_objcgs(slab)[off] = objcg;
     539             :                         mod_objcg_state(objcg, slab_pgdat(slab),
     540             :                                         cache_vmstat_idx(s), obj_full_size(s));
     541             :                 } else {
     542             :                         obj_cgroup_uncharge(objcg, obj_full_size(s));
     543             :                 }
     544             :         }
     545             :         obj_cgroup_put(objcg);
     546             : }
     547             : 
     548             : static inline void memcg_slab_free_hook(struct kmem_cache *s, struct slab *slab,
     549             :                                         void **p, int objects)
     550             : {
     551             :         struct obj_cgroup **objcgs;
     552             :         int i;
     553             : 
     554             :         if (!memcg_kmem_online())
     555             :                 return;
     556             : 
     557             :         objcgs = slab_objcgs(slab);
     558             :         if (!objcgs)
     559             :                 return;
     560             : 
     561             :         for (i = 0; i < objects; i++) {
     562             :                 struct obj_cgroup *objcg;
     563             :                 unsigned int off;
     564             : 
     565             :                 off = obj_to_index(s, slab, p[i]);
     566             :                 objcg = objcgs[off];
     567             :                 if (!objcg)
     568             :                         continue;
     569             : 
     570             :                 objcgs[off] = NULL;
     571             :                 obj_cgroup_uncharge(objcg, obj_full_size(s));
     572             :                 mod_objcg_state(objcg, slab_pgdat(slab), cache_vmstat_idx(s),
     573             :                                 -obj_full_size(s));
     574             :                 obj_cgroup_put(objcg);
     575             :         }
     576             : }
     577             : 
     578             : #else /* CONFIG_MEMCG_KMEM */
     579             : static inline struct obj_cgroup **slab_objcgs(struct slab *slab)
     580             : {
     581             :         return NULL;
     582             : }
     583             : 
     584             : static inline struct mem_cgroup *memcg_from_slab_obj(void *ptr)
     585             : {
     586             :         return NULL;
     587             : }
     588             : 
     589             : static inline int memcg_alloc_slab_cgroups(struct slab *slab,
     590             :                                                struct kmem_cache *s, gfp_t gfp,
     591             :                                                bool new_slab)
     592             : {
     593             :         return 0;
     594             : }
     595             : 
     596             : static inline void memcg_free_slab_cgroups(struct slab *slab)
     597             : {
     598             : }
     599             : 
     600             : static inline bool memcg_slab_pre_alloc_hook(struct kmem_cache *s,
     601             :                                              struct list_lru *lru,
     602             :                                              struct obj_cgroup **objcgp,
     603             :                                              size_t objects, gfp_t flags)
     604             : {
     605             :         return true;
     606             : }
     607             : 
     608             : static inline void memcg_slab_post_alloc_hook(struct kmem_cache *s,
     609             :                                               struct obj_cgroup *objcg,
     610             :                                               gfp_t flags, size_t size,
     611             :                                               void **p)
     612             : {
     613             : }
     614             : 
     615             : static inline void memcg_slab_free_hook(struct kmem_cache *s, struct slab *slab,
     616             :                                         void **p, int objects)
     617             : {
     618             : }
     619             : #endif /* CONFIG_MEMCG_KMEM */
     620             : 
     621           0 : static inline struct kmem_cache *virt_to_cache(const void *obj)
     622             : {
     623             :         struct slab *slab;
     624             : 
     625           0 :         slab = virt_to_slab(obj);
     626           0 :         if (WARN_ONCE(!slab, "%s: Object is not a Slab page!\n",
     627             :                                         __func__))
     628             :                 return NULL;
     629           0 :         return slab->slab_cache;
     630             : }
     631             : 
     632             : static __always_inline void account_slab(struct slab *slab, int order,
     633             :                                          struct kmem_cache *s, gfp_t gfp)
     634             : {
     635             :         if (memcg_kmem_online() && (s->flags & SLAB_ACCOUNT))
     636             :                 memcg_alloc_slab_cgroups(slab, s, gfp, true);
     637             : 
     638        1740 :         mod_node_page_state(slab_pgdat(slab), cache_vmstat_idx(s),
     639         435 :                             PAGE_SIZE << order);
     640             : }
     641             : 
     642             : static __always_inline void unaccount_slab(struct slab *slab, int order,
     643             :                                            struct kmem_cache *s)
     644             : {
     645             :         if (memcg_kmem_online())
     646             :                 memcg_free_slab_cgroups(slab);
     647             : 
     648           0 :         mod_node_page_state(slab_pgdat(slab), cache_vmstat_idx(s),
     649           0 :                             -(PAGE_SIZE << order));
     650             : }
     651             : 
     652        1296 : static inline struct kmem_cache *cache_from_obj(struct kmem_cache *s, void *x)
     653             : {
     654             :         struct kmem_cache *cachep;
     655             : 
     656        1296 :         if (!IS_ENABLED(CONFIG_SLAB_FREELIST_HARDENED) &&
     657        2592 :             !kmem_cache_debug_flags(s, SLAB_CONSISTENCY_CHECKS))
     658             :                 return s;
     659             : 
     660           0 :         cachep = virt_to_cache(x);
     661           0 :         if (WARN(cachep && cachep != s,
     662             :                   "%s: Wrong slab cache. %s but object is from %s\n",
     663             :                   __func__, s->name, cachep->name))
     664           0 :                 print_tracking(cachep, x);
     665             :         return cachep;
     666             : }
     667             : 
     668             : void free_large_kmalloc(struct folio *folio, void *object);
     669             : 
     670             : size_t __ksize(const void *objp);
     671             : 
     672             : static inline size_t slab_ksize(const struct kmem_cache *s)
     673             : {
     674             : #ifndef CONFIG_SLUB
     675             :         return s->object_size;
     676             : 
     677             : #else /* CONFIG_SLUB */
     678             : # ifdef CONFIG_SLUB_DEBUG
     679             :         /*
     680             :          * Debugging requires use of the padding between object
     681             :          * and whatever may come after it.
     682             :          */
     683         107 :         if (s->flags & (SLAB_RED_ZONE | SLAB_POISON))
     684           0 :                 return s->object_size;
     685             : # endif
     686             :         if (s->flags & SLAB_KASAN)
     687             :                 return s->object_size;
     688             :         /*
     689             :          * If we have the need to store the freelist pointer
     690             :          * back there or track user information then we can
     691             :          * only use the space before that information.
     692             :          */
     693         107 :         if (s->flags & (SLAB_TYPESAFE_BY_RCU | SLAB_STORE_USER))
     694           0 :                 return s->inuse;
     695             :         /*
     696             :          * Else we can use all the padding etc for the allocation
     697             :          */
     698         107 :         return s->size;
     699             : #endif
     700             : }
     701             : 
     702             : static inline struct kmem_cache *slab_pre_alloc_hook(struct kmem_cache *s,
     703             :                                                      struct list_lru *lru,
     704             :                                                      struct obj_cgroup **objcgp,
     705             :                                                      size_t size, gfp_t flags)
     706             : {
     707       16956 :         flags &= gfp_allowed_mask;
     708             : 
     709       16956 :         might_alloc(flags);
     710             : 
     711       16956 :         if (should_failslab(s, flags))
     712             :                 return NULL;
     713             : 
     714       16956 :         if (!memcg_slab_pre_alloc_hook(s, lru, objcgp, size, flags))
     715             :                 return NULL;
     716             : 
     717             :         return s;
     718             : }
     719             : 
     720       16956 : static inline void slab_post_alloc_hook(struct kmem_cache *s,
     721             :                                         struct obj_cgroup *objcg, gfp_t flags,
     722             :                                         size_t size, void **p, bool init,
     723             :                                         unsigned int orig_size)
     724             : {
     725       16956 :         unsigned int zero_size = s->object_size;
     726       16956 :         bool kasan_init = init;
     727             :         size_t i;
     728             : 
     729       16956 :         flags &= gfp_allowed_mask;
     730             : 
     731             :         /*
     732             :          * For kmalloc object, the allocated memory size(object_size) is likely
     733             :          * larger than the requested size(orig_size). If redzone check is
     734             :          * enabled for the extra space, don't zero it, as it will be redzoned
     735             :          * soon. The redzone operation for this extra space could be seen as a
     736             :          * replacement of current poisoning under certain debug option, and
     737             :          * won't break other sanity checks.
     738             :          */
     739       33912 :         if (kmem_cache_debug_flags(s, SLAB_STORE_USER | SLAB_RED_ZONE) &&
     740           0 :             (s->flags & SLAB_KMALLOC))
     741           0 :                 zero_size = orig_size;
     742             : 
     743             :         /*
     744             :          * When slub_debug is enabled, avoid memory initialization integrated
     745             :          * into KASAN and instead zero out the memory via the memset below with
     746             :          * the proper size. Otherwise, KASAN might overwrite SLUB redzones and
     747             :          * cause false-positive reports. This does not lead to a performance
     748             :          * penalty on production builds, as slub_debug is not intended to be
     749             :          * enabled there.
     750             :          */
     751             :         if (__slub_debug_enabled())
     752             :                 kasan_init = false;
     753             : 
     754             :         /*
     755             :          * As memory initialization might be integrated into KASAN,
     756             :          * kasan_slab_alloc and initialization memset must be
     757             :          * kept together to avoid discrepancies in behavior.
     758             :          *
     759             :          * As p[i] might get tagged, memset and kmemleak hook come after KASAN.
     760             :          */
     761       33931 :         for (i = 0; i < size; i++) {
     762       16975 :                 p[i] = kasan_slab_alloc(s, p[i], flags, kasan_init);
     763       16975 :                 if (p[i] && init && (!kasan_init || !kasan_has_integrated_init()))
     764       25560 :                         memset(p[i], 0, zero_size);
     765       16975 :                 kmemleak_alloc_recursive(p[i], s->object_size, 1,
     766             :                                          s->flags, flags);
     767       16975 :                 kmsan_slab_alloc(s, p[i], flags);
     768             :         }
     769             : 
     770       16956 :         memcg_slab_post_alloc_hook(s, objcg, flags, size, p);
     771       16956 : }
     772             : 
     773             : /*
     774             :  * The slab lists for all objects.
     775             :  */
     776             : struct kmem_cache_node {
     777             : #ifdef CONFIG_SLAB
     778             :         raw_spinlock_t list_lock;
     779             :         struct list_head slabs_partial; /* partial list first, better asm code */
     780             :         struct list_head slabs_full;
     781             :         struct list_head slabs_free;
     782             :         unsigned long total_slabs;      /* length of all slab lists */
     783             :         unsigned long free_slabs;       /* length of free slab list only */
     784             :         unsigned long free_objects;
     785             :         unsigned int free_limit;
     786             :         unsigned int colour_next;       /* Per-node cache coloring */
     787             :         struct array_cache *shared;     /* shared per node */
     788             :         struct alien_cache **alien;     /* on other nodes */
     789             :         unsigned long next_reap;        /* updated without locking */
     790             :         int free_touched;               /* updated without locking */
     791             : #endif
     792             : 
     793             : #ifdef CONFIG_SLUB
     794             :         spinlock_t list_lock;
     795             :         unsigned long nr_partial;
     796             :         struct list_head partial;
     797             : #ifdef CONFIG_SLUB_DEBUG
     798             :         atomic_long_t nr_slabs;
     799             :         atomic_long_t total_objects;
     800             :         struct list_head full;
     801             : #endif
     802             : #endif
     803             : 
     804             : };
     805             : 
     806             : static inline struct kmem_cache_node *get_node(struct kmem_cache *s, int node)
     807             : {
     808         939 :         return s->node[node];
     809             : }
     810             : 
     811             : /*
     812             :  * Iterator over all nodes. The body will be executed for each node that has
     813             :  * a kmem_cache_node structure allocated (which is true for all online nodes)
     814             :  */
     815             : #define for_each_kmem_cache_node(__s, __node, __n) \
     816             :         for (__node = 0; __node < nr_node_ids; __node++) \
     817             :                  if ((__n = get_node(__s, __node)))
     818             : 
     819             : 
     820             : #if defined(CONFIG_SLAB) || defined(CONFIG_SLUB_DEBUG)
     821             : void dump_unreclaimable_slab(void);
     822             : #else
     823             : static inline void dump_unreclaimable_slab(void)
     824             : {
     825             : }
     826             : #endif
     827             : 
     828             : void ___cache_free(struct kmem_cache *cache, void *x, unsigned long addr);
     829             : 
     830             : #ifdef CONFIG_SLAB_FREELIST_RANDOM
     831             : int cache_random_seq_create(struct kmem_cache *cachep, unsigned int count,
     832             :                         gfp_t gfp);
     833             : void cache_random_seq_destroy(struct kmem_cache *cachep);
     834             : #else
     835             : static inline int cache_random_seq_create(struct kmem_cache *cachep,
     836             :                                         unsigned int count, gfp_t gfp)
     837             : {
     838             :         return 0;
     839             : }
     840             : static inline void cache_random_seq_destroy(struct kmem_cache *cachep) { }
     841             : #endif /* CONFIG_SLAB_FREELIST_RANDOM */
     842             : 
     843             : static inline bool slab_want_init_on_alloc(gfp_t flags, struct kmem_cache *c)
     844             : {
     845       16956 :         if (static_branch_maybe(CONFIG_INIT_ON_ALLOC_DEFAULT_ON,
     846             :                                 &init_on_alloc)) {
     847           0 :                 if (c->ctor)
     848             :                         return false;
     849           0 :                 if (c->flags & (SLAB_TYPESAFE_BY_RCU | SLAB_POISON))
     850           0 :                         return flags & __GFP_ZERO;
     851             :                 return true;
     852             :         }
     853       16956 :         return flags & __GFP_ZERO;
     854             : }
     855             : 
     856             : static inline bool slab_want_init_on_free(struct kmem_cache *c)
     857             : {
     858       21398 :         if (static_branch_maybe(CONFIG_INIT_ON_FREE_DEFAULT_ON,
     859             :                                 &init_on_free))
     860           0 :                 return !(c->ctor ||
     861           0 :                          (c->flags & (SLAB_TYPESAFE_BY_RCU | SLAB_POISON)));
     862             :         return false;
     863             : }
     864             : 
     865             : #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_SLUB_DEBUG)
     866             : void debugfs_slab_release(struct kmem_cache *);
     867             : #else
     868             : static inline void debugfs_slab_release(struct kmem_cache *s) { }
     869             : #endif
     870             : 
     871             : #ifdef CONFIG_PRINTK
     872             : #define KS_ADDRS_COUNT 16
     873             : struct kmem_obj_info {
     874             :         void *kp_ptr;
     875             :         struct slab *kp_slab;
     876             :         void *kp_objp;
     877             :         unsigned long kp_data_offset;
     878             :         struct kmem_cache *kp_slab_cache;
     879             :         void *kp_ret;
     880             :         void *kp_stack[KS_ADDRS_COUNT];
     881             :         void *kp_free_stack[KS_ADDRS_COUNT];
     882             : };
     883             : void __kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab);
     884             : #endif
     885             : 
     886             : void __check_heap_object(const void *ptr, unsigned long n,
     887             :                          const struct slab *slab, bool to_user);
     888             : 
     889             : #ifdef CONFIG_SLUB_DEBUG
     890             : void skip_orig_size_check(struct kmem_cache *s, const void *object);
     891             : #endif
     892             : 
     893             : #endif /* MM_SLAB_H */

Generated by: LCOV version 1.14