diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 58 |
1 files changed, 29 insertions, 29 deletions
@@ -195,6 +195,18 @@ static enum { | |||
195 | static DECLARE_RWSEM(slub_lock); | 195 | static DECLARE_RWSEM(slub_lock); |
196 | LIST_HEAD(slab_caches); | 196 | LIST_HEAD(slab_caches); |
197 | 197 | ||
198 | /* | ||
199 | * Tracking user of a slab. | ||
200 | */ | ||
201 | struct track { | ||
202 | void *addr; /* Called from address */ | ||
203 | int cpu; /* Was running on cpu */ | ||
204 | int pid; /* Pid context */ | ||
205 | unsigned long when; /* When did the operation occur */ | ||
206 | }; | ||
207 | |||
208 | enum track_item { TRACK_ALLOC, TRACK_FREE }; | ||
209 | |||
198 | #ifdef CONFIG_SYSFS | 210 | #ifdef CONFIG_SYSFS |
199 | static int sysfs_slab_add(struct kmem_cache *); | 211 | static int sysfs_slab_add(struct kmem_cache *); |
200 | static int sysfs_slab_alias(struct kmem_cache *, const char *); | 212 | static int sysfs_slab_alias(struct kmem_cache *, const char *); |
@@ -223,6 +235,23 @@ static inline struct kmem_cache_node *get_node(struct kmem_cache *s, int node) | |||
223 | #endif | 235 | #endif |
224 | } | 236 | } |
225 | 237 | ||
238 | static inline int check_valid_pointer(struct kmem_cache *s, | ||
239 | struct page *page, const void *object) | ||
240 | { | ||
241 | void *base; | ||
242 | |||
243 | if (!object) | ||
244 | return 1; | ||
245 | |||
246 | base = page_address(page); | ||
247 | if (object < base || object >= base + s->objects * s->size || | ||
248 | (object - base) % s->size) { | ||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | return 1; | ||
253 | } | ||
254 | |||
226 | /* | 255 | /* |
227 | * Slow version of get and set free pointer. | 256 | * Slow version of get and set free pointer. |
228 | * | 257 | * |
@@ -290,18 +319,6 @@ static void print_section(char *text, u8 *addr, unsigned int length) | |||
290 | } | 319 | } |
291 | } | 320 | } |
292 | 321 | ||
293 | /* | ||
294 | * Tracking user of a slab. | ||
295 | */ | ||
296 | struct track { | ||
297 | void *addr; /* Called from address */ | ||
298 | int cpu; /* Was running on cpu */ | ||
299 | int pid; /* Pid context */ | ||
300 | unsigned long when; /* When did the operation occur */ | ||
301 | }; | ||
302 | |||
303 | enum track_item { TRACK_ALLOC, TRACK_FREE }; | ||
304 | |||
305 | static struct track *get_track(struct kmem_cache *s, void *object, | 322 | static struct track *get_track(struct kmem_cache *s, void *object, |
306 | enum track_item alloc) | 323 | enum track_item alloc) |
307 | { | 324 | { |
@@ -436,23 +453,6 @@ static int check_bytes(u8 *start, unsigned int value, unsigned int bytes) | |||
436 | return 1; | 453 | return 1; |
437 | } | 454 | } |
438 | 455 | ||
439 | static inline int check_valid_pointer(struct kmem_cache *s, | ||
440 | struct page *page, const void *object) | ||
441 | { | ||
442 | void *base; | ||
443 | |||
444 | if (!object) | ||
445 | return 1; | ||
446 | |||
447 | base = page_address(page); | ||
448 | if (object < base || object >= base + s->objects * s->size || | ||
449 | (object - base) % s->size) { | ||
450 | return 0; | ||
451 | } | ||
452 | |||
453 | return 1; | ||
454 | } | ||
455 | |||
456 | /* | 456 | /* |
457 | * Object layout: | 457 | * Object layout: |
458 | * | 458 | * |