~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/stackdepot.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/stackdepot.h (Version linux-6.11-rc3) and /include/linux/stackdepot.h (Version linux-5.16.20)


  1 /* SPDX-License-Identifier: GPL-2.0-or-later *      1 /* SPDX-License-Identifier: GPL-2.0-or-later */
  2 /*                                                  2 /*
  3  * Stack depot - a stack trace storage that av !!   3  * A generic stack depot implementation
  4  *                                             << 
  5  * Stack depot is intended to be used by subsy << 
  6  * later retrieve many potentially duplicated  << 
  7  * memory.                                     << 
  8  *                                             << 
  9  * For example, KASAN needs to save allocation << 
 10  * object. Storing two stack traces per object << 
 11  * SLUB_DEBUG needs 256 bytes per object for t << 
 12  * stack traces often repeat, using stack depo << 
 13  *                                                  4  *
 14  * Author: Alexander Potapenko <glider@google.      5  * Author: Alexander Potapenko <glider@google.com>
 15  * Copyright (C) 2016 Google, Inc.                  6  * Copyright (C) 2016 Google, Inc.
 16  *                                                  7  *
 17  * Based on the code by Dmitry Chernenkov.     !!   8  * Based on code by Dmitry Chernenkov.
 18  */                                                 9  */
 19                                                    10 
 20 #ifndef _LINUX_STACKDEPOT_H                        11 #ifndef _LINUX_STACKDEPOT_H
 21 #define _LINUX_STACKDEPOT_H                        12 #define _LINUX_STACKDEPOT_H
 22                                                    13 
 23 #include <linux/gfp.h>                             14 #include <linux/gfp.h>
 24                                                    15 
 25 typedef u32 depot_stack_handle_t;                  16 typedef u32 depot_stack_handle_t;
 26                                                    17 
 27 /*                                             !!  18 depot_stack_handle_t __stack_depot_save(unsigned long *entries,
 28  * Number of bits in the handle that stack dep !!  19                                         unsigned int nr_entries,
 29  * information in them via stack_depot_set/get !!  20                                         gfp_t gfp_flags, bool can_alloc);
 30  */                                            << 
 31 #define STACK_DEPOT_EXTRA_BITS 5               << 
 32                                                << 
 33 #define DEPOT_HANDLE_BITS (sizeof(depot_stack_ << 
 34                                                << 
 35 #define DEPOT_POOL_ORDER 2 /* Pool size order, << 
 36 #define DEPOT_POOL_SIZE (1LL << (PAGE_SHIFT +  << 
 37 #define DEPOT_STACK_ALIGN 4                    << 
 38 #define DEPOT_OFFSET_BITS (DEPOT_POOL_ORDER +  << 
 39 #define DEPOT_POOL_INDEX_BITS (DEPOT_HANDLE_BI << 
 40                                STACK_DEPOT_EXT << 
 41                                                << 
 42 #ifdef CONFIG_STACKDEPOT                       << 
 43 /* Compact structure that stores a reference t << 
 44 union handle_parts {                           << 
 45         depot_stack_handle_t handle;           << 
 46         struct {                               << 
 47                 u32 pool_index_plus_1   : DEPO << 
 48                 u32 offset              : DEPO << 
 49                 u32 extra               : STAC << 
 50         };                                     << 
 51 };                                             << 
 52                                                << 
 53 struct stack_record {                          << 
 54         struct list_head hash_list;     /* Lin << 
 55         u32 hash;                       /* Has << 
 56         u32 size;                       /* Num << 
 57         union handle_parts handle;      /* Con << 
 58         refcount_t count;                      << 
 59         union {                                << 
 60                 unsigned long entries[CONFIG_S << 
 61                 struct {                       << 
 62                         /*                     << 
 63                          * An important invari << 
 64                          * only place a stack  << 
 65                          * refcount is zero. B << 
 66                          * refcount are never  << 
 67                          * union @entries and  << 
 68                          * Conversely, as soon << 
 69                          * and its refcount be << 
 70                          * be accessed until b << 
 71                          */                    << 
 72                         struct list_head free_ << 
 73                         unsigned long rcu_stat << 
 74                 };                             << 
 75         };                                     << 
 76 };                                             << 
 77 #endif                                         << 
 78                                                << 
 79 typedef u32 depot_flags_t;                     << 
 80                                                << 
 81 /*                                             << 
 82  * Flags that can be passed to stack_depot_sav << 
 83  * to its declaration for more details.        << 
 84  */                                            << 
 85 #define STACK_DEPOT_FLAG_CAN_ALLOC      ((depo << 
 86 #define STACK_DEPOT_FLAG_GET            ((depo << 
 87                                                << 
 88 #define STACK_DEPOT_FLAGS_NUM   2              << 
 89 #define STACK_DEPOT_FLAGS_MASK  ((depot_flags_ << 
 90                                                << 
 91 /*                                             << 
 92  * Using stack depot requires its initializati << 
 93  *                                             << 
 94  * 1. Selecting CONFIG_STACKDEPOT_ALWAYS_INIT. << 
 95  *    scenarios where it's known at compile ti << 
 96  *    Enabling this config makes the kernel in << 
 97  *                                             << 
 98  * 2. Calling stack_depot_request_early_init() << 
 99  *    stack_depot_early_init() in mm_init() co << 
100  *    be done when evaluating kernel boot para << 
101  *                                             << 
102  * 3. Calling stack_depot_init(). Possible aft << 
103  *    is recommended for modules initialized l << 
104  *    mm_init() completes.                     << 
105  *                                             << 
106  * stack_depot_init() and stack_depot_request_ << 
107  * regardless of whether CONFIG_STACKDEPOT is  << 
108  * config is disabled. The save/fetch/print st << 
109  * called from the code that makes sure CONFIG << 
110  * initializes stack depot via one of the ways << 
111  */                                            << 
112 #ifdef CONFIG_STACKDEPOT                       << 
113 int stack_depot_init(void);                    << 
114                                                    21 
115 void __init stack_depot_request_early_init(voi << 
116                                                << 
117 /* Must be only called from mm_init(). */      << 
118 int __init stack_depot_early_init(void);       << 
119 #else                                          << 
120 static inline int stack_depot_init(void) { ret << 
121                                                << 
122 static inline void stack_depot_request_early_i << 
123                                                << 
124 static inline int stack_depot_early_init(void) << 
125 #endif                                         << 
126                                                << 
127 /**                                            << 
128  * stack_depot_save_flags - Save a stack trace << 
129  *                                             << 
130  * @entries:            Pointer to the stack t << 
131  * @nr_entries:         Number of frames in th << 
132  * @alloc_flags:        Allocation GFP flags   << 
133  * @depot_flags:        Stack depot flags      << 
134  *                                             << 
135  * Saves a stack trace from @entries array of  << 
136  *                                             << 
137  * If STACK_DEPOT_FLAG_CAN_ALLOC is set in @de << 
138  * replenish the stack pools in case no space  << 
139  * flags of @alloc_flags). Otherwise, stack de << 
140  * fails if no space is left to store the stac << 
141  *                                             << 
142  * If STACK_DEPOT_FLAG_GET is set in @depot_fl << 
143  * the refcount on the saved stack trace if it << 
144  * Users of this flag must also call stack_dep << 
145  * trace is no longer required to avoid overfl << 
146  *                                             << 
147  * If the provided stack trace comes from the  << 
148  * up to the interrupt entry is saved.         << 
149  *                                             << 
150  * Context: Any context, but setting STACK_DEP << 
151  *          alloc_pages() cannot be used from  << 
152  *          this is the case for contexts wher << 
153  *          %GFP_NOWAIT can be used (NMI, raw_ << 
154  *                                             << 
155  * Return: Handle of the stack struct stored i << 
156  */                                            << 
157 depot_stack_handle_t stack_depot_save_flags(un << 
158                                             un << 
159                                             gf << 
160                                             de << 
161                                                << 
162 /**                                            << 
163  * stack_depot_save - Save a stack trace to st << 
164  *                                             << 
165  * @entries:            Pointer to the stack t << 
166  * @nr_entries:         Number of frames in th << 
167  * @alloc_flags:        Allocation GFP flags   << 
168  *                                             << 
169  * Does not increment the refcount on the save << 
170  * stack_depot_save_flags() for more details.  << 
171  *                                             << 
172  * Context: Contexts where allocations via all << 
173  *          see stack_depot_save_flags() for m << 
174  *                                             << 
175  * Return: Handle of the stack trace stored in << 
176  */                                            << 
177 depot_stack_handle_t stack_depot_save(unsigned     22 depot_stack_handle_t stack_depot_save(unsigned long *entries,
178                                       unsigned     23                                       unsigned int nr_entries, gfp_t gfp_flags);
179                                                    24 
180 /**                                            << 
181  * __stack_depot_get_stack_record - Get a poin << 
182  *                                             << 
183  * @handle: Stack depot handle                 << 
184  *                                             << 
185  * This function is only for internal purposes << 
186  *                                             << 
187  * Return: Returns a pointer to a stack_record << 
188  */                                            << 
189 struct stack_record *__stack_depot_get_stack_r << 
190                                                << 
191 /**                                            << 
192  * stack_depot_fetch - Fetch a stack trace fro << 
193  *                                             << 
194  * @handle:     Stack depot handle returned fr << 
195  * @entries:    Pointer to store the address o << 
196  *                                             << 
197  * Return: Number of frames for the fetched st << 
198  */                                            << 
199 unsigned int stack_depot_fetch(depot_stack_han     25 unsigned int stack_depot_fetch(depot_stack_handle_t handle,
200                                unsigned long *     26                                unsigned long **entries);
201                                                    27 
202 /**                                            << 
203  * stack_depot_print - Print a stack trace fro << 
204  *                                             << 
205  * @stack:      Stack depot handle returned fr << 
206  */                                            << 
207 void stack_depot_print(depot_stack_handle_t st << 
208                                                << 
209 /**                                            << 
210  * stack_depot_snprint - Print a stack trace f << 
211  *                                             << 
212  * @handle:     Stack depot handle returned fr << 
213  * @buf:        Pointer to the print buffer    << 
214  * @size:       Size of the print buffer       << 
215  * @spaces:     Number of leading spaces to pr << 
216  *                                             << 
217  * Return:      Number of bytes printed        << 
218  */                                            << 
219 int stack_depot_snprint(depot_stack_handle_t h     28 int stack_depot_snprint(depot_stack_handle_t handle, char *buf, size_t size,
220                        int spaces);                29                        int spaces);
221                                                    30 
222 /**                                            !!  31 void stack_depot_print(depot_stack_handle_t stack);
223  * stack_depot_put - Drop a reference to a sta << 
224  *                                             << 
225  * @handle:     Stack depot handle returned fr << 
226  *                                             << 
227  * The stack trace is evicted from stack depot << 
228  * been dropped (once the number of stack_depo << 
229  * number of stack_depot_save_flags() calls wi << 
230  * this stack trace).                          << 
231  */                                            << 
232 void stack_depot_put(depot_stack_handle_t hand << 
233                                                << 
234 /**                                            << 
235  * stack_depot_set_extra_bits - Set extra bits << 
236  *                                             << 
237  * @handle:     Stack depot handle returned fr << 
238  * @extra_bits: Value to set the extra bits    << 
239  *                                             << 
240  * Return: Stack depot handle with extra bits  << 
241  *                                             << 
242  * Stack depot handles have a few unused bits, << 
243  * user-specific information. These bits are t << 
244  */                                            << 
245 depot_stack_handle_t __must_check stack_depot_ << 
246                         depot_stack_handle_t h << 
247                                                    32 
248 /**                                            !!  33 #ifdef CONFIG_STACKDEPOT
249  * stack_depot_get_extra_bits - Retrieve extra !!  34 int stack_depot_init(void);
250  *                                             !!  35 #else
251  * @handle:     Stack depot handle with extra  !!  36 static inline int stack_depot_init(void)
252  *                                             !!  37 {
253  * Return: Extra bits retrieved from the stack !!  38         return 0;
254  */                                            !!  39 }
255 unsigned int stack_depot_get_extra_bits(depot_ !!  40 #endif  /* CONFIG_STACKDEPOT */
256                                                    41 
257 #endif                                             42 #endif
258                                                    43 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php