From f04ff79df6be5ae086b973ecd189ac7a1e920094 Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Mon, 16 May 2011 15:26:08 -0500 Subject: [PATCH] --- yaml --- r: 248624 b: refs/heads/master c: 1393d9a1857471f816d0be1ccc1d6433a86050f6 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/slub.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index f5e762fde197..84f41ceff542 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6332aa9d25e911cc97aa9cc09acee21afda07ea6 +refs/heads/master: 1393d9a1857471f816d0be1ccc1d6433a86050f6 diff --git a/trunk/mm/slub.c b/trunk/mm/slub.c index 8657ab838b82..97bb5b8d935f 100644 --- a/trunk/mm/slub.c +++ b/trunk/mm/slub.c @@ -261,6 +261,18 @@ static inline void *get_freepointer(struct kmem_cache *s, void *object) return *(void **)(object + s->offset); } +static inline void *get_freepointer_safe(struct kmem_cache *s, void *object) +{ + void *p; + +#ifdef CONFIG_DEBUG_PAGEALLOC + probe_kernel_read(&p, (void **)(object + s->offset), sizeof(p)); +#else + p = get_freepointer(s, object); +#endif + return p; +} + static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp) { *(void **)(object + s->offset) = fp; @@ -1933,7 +1945,7 @@ static __always_inline void *slab_alloc(struct kmem_cache *s, if (unlikely(!this_cpu_cmpxchg_double( s->cpu_slab->freelist, s->cpu_slab->tid, object, tid, - get_freepointer(s, object), next_tid(tid)))) { + get_freepointer_safe(s, object), next_tid(tid)))) { note_cmpxchg_failure("slab_alloc", s, tid); goto redo;