|
@@ -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 @@ redo:
|
|
|
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;
|