diff options
| -rw-r--r-- | mm/slub.c | 40 |
1 files changed, 28 insertions, 12 deletions
| @@ -87,6 +87,21 @@ | |||
| 87 | * the fast path. | 87 | * the fast path. |
| 88 | */ | 88 | */ |
| 89 | 89 | ||
| 90 | static inline int SlabDebug(struct page *page) | ||
| 91 | { | ||
| 92 | return PageError(page); | ||
| 93 | } | ||
| 94 | |||
| 95 | static inline void SetSlabDebug(struct page *page) | ||
| 96 | { | ||
| 97 | SetPageError(page); | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline void ClearSlabDebug(struct page *page) | ||
| 101 | { | ||
| 102 | ClearPageError(page); | ||
| 103 | } | ||
| 104 | |||
| 90 | /* | 105 | /* |
| 91 | * Issues still to be resolved: | 106 | * Issues still to be resolved: |
| 92 | * | 107 | * |
| @@ -823,7 +838,7 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) | |||
| 823 | static void setup_object(struct kmem_cache *s, struct page *page, | 838 | static void setup_object(struct kmem_cache *s, struct page *page, |
| 824 | void *object) | 839 | void *object) |
| 825 | { | 840 | { |
| 826 | if (PageError(page)) { | 841 | if (SlabDebug(page)) { |
| 827 | init_object(s, object, 0); | 842 | init_object(s, object, 0); |
| 828 | init_tracking(s, object); | 843 | init_tracking(s, object); |
| 829 | } | 844 | } |
| @@ -858,7 +873,7 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node) | |||
| 858 | page->flags |= 1 << PG_slab; | 873 | page->flags |= 1 << PG_slab; |
| 859 | if (s->flags & (SLAB_DEBUG_FREE | SLAB_RED_ZONE | SLAB_POISON | | 874 | if (s->flags & (SLAB_DEBUG_FREE | SLAB_RED_ZONE | SLAB_POISON | |
| 860 | SLAB_STORE_USER | SLAB_TRACE)) | 875 | SLAB_STORE_USER | SLAB_TRACE)) |
| 861 | page->flags |= 1 << PG_error; | 876 | SetSlabDebug(page); |
| 862 | 877 | ||
| 863 | start = page_address(page); | 878 | start = page_address(page); |
| 864 | end = start + s->objects * s->size; | 879 | end = start + s->objects * s->size; |
| @@ -887,7 +902,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page) | |||
| 887 | { | 902 | { |
| 888 | int pages = 1 << s->order; | 903 | int pages = 1 << s->order; |
| 889 | 904 | ||
| 890 | if (unlikely(PageError(page) || s->dtor)) { | 905 | if (unlikely(SlabDebug(page) || s->dtor)) { |
| 891 | void *p; | 906 | void *p; |
| 892 | 907 | ||
| 893 | slab_pad_check(s, page); | 908 | slab_pad_check(s, page); |
| @@ -934,7 +949,8 @@ static void discard_slab(struct kmem_cache *s, struct page *page) | |||
| 934 | 949 | ||
| 935 | atomic_long_dec(&n->nr_slabs); | 950 | atomic_long_dec(&n->nr_slabs); |
| 936 | reset_page_mapcount(page); | 951 | reset_page_mapcount(page); |
| 937 | page->flags &= ~(1 << PG_slab | 1 << PG_error); | 952 | ClearSlabDebug(page); |
| 953 | __ClearPageSlab(page); | ||
| 938 | free_slab(s, page); | 954 | free_slab(s, page); |
| 939 | } | 955 | } |
| 940 | 956 | ||
| @@ -1109,7 +1125,7 @@ static void putback_slab(struct kmem_cache *s, struct page *page) | |||
| 1109 | 1125 | ||
| 1110 | if (page->freelist) | 1126 | if (page->freelist) |
| 1111 | add_partial(n, page); | 1127 | add_partial(n, page); |
| 1112 | else if (PageError(page) && (s->flags & SLAB_STORE_USER)) | 1128 | else if (SlabDebug(page) && (s->flags & SLAB_STORE_USER)) |
| 1113 | add_full(n, page); | 1129 | add_full(n, page); |
| 1114 | slab_unlock(page); | 1130 | slab_unlock(page); |
| 1115 | 1131 | ||
| @@ -1193,7 +1209,7 @@ static void flush_all(struct kmem_cache *s) | |||
| 1193 | * per cpu array in the kmem_cache struct. | 1209 | * per cpu array in the kmem_cache struct. |
| 1194 | * | 1210 | * |
| 1195 | * Fastpath is not possible if we need to get a new slab or have | 1211 | * Fastpath is not possible if we need to get a new slab or have |
| 1196 | * debugging enabled (which means all slabs are marked with PageError) | 1212 | * debugging enabled (which means all slabs are marked with SlabDebug) |
| 1197 | */ | 1213 | */ |
| 1198 | static void *slab_alloc(struct kmem_cache *s, | 1214 | static void *slab_alloc(struct kmem_cache *s, |
| 1199 | gfp_t gfpflags, int node, void *addr) | 1215 | gfp_t gfpflags, int node, void *addr) |
| @@ -1216,7 +1232,7 @@ redo: | |||
| 1216 | object = page->freelist; | 1232 | object = page->freelist; |
| 1217 | if (unlikely(!object)) | 1233 | if (unlikely(!object)) |
| 1218 | goto another_slab; | 1234 | goto another_slab; |
| 1219 | if (unlikely(PageError(page))) | 1235 | if (unlikely(SlabDebug(page))) |
| 1220 | goto debug; | 1236 | goto debug; |
| 1221 | 1237 | ||
| 1222 | have_object: | 1238 | have_object: |
| @@ -1314,7 +1330,7 @@ static void slab_free(struct kmem_cache *s, struct page *page, | |||
| 1314 | local_irq_save(flags); | 1330 | local_irq_save(flags); |
| 1315 | slab_lock(page); | 1331 | slab_lock(page); |
| 1316 | 1332 | ||
| 1317 | if (unlikely(PageError(page))) | 1333 | if (unlikely(SlabDebug(page))) |
| 1318 | goto debug; | 1334 | goto debug; |
| 1319 | checks_ok: | 1335 | checks_ok: |
| 1320 | prior = object[page->offset] = page->freelist; | 1336 | prior = object[page->offset] = page->freelist; |
| @@ -2571,12 +2587,12 @@ static void validate_slab_slab(struct kmem_cache *s, struct page *page) | |||
| 2571 | s->name, page); | 2587 | s->name, page); |
| 2572 | 2588 | ||
| 2573 | if (s->flags & DEBUG_DEFAULT_FLAGS) { | 2589 | if (s->flags & DEBUG_DEFAULT_FLAGS) { |
| 2574 | if (!PageError(page)) | 2590 | if (!SlabDebug(page)) |
| 2575 | printk(KERN_ERR "SLUB %s: PageError not set " | 2591 | printk(KERN_ERR "SLUB %s: SlabDebug not set " |
| 2576 | "on slab 0x%p\n", s->name, page); | 2592 | "on slab 0x%p\n", s->name, page); |
| 2577 | } else { | 2593 | } else { |
| 2578 | if (PageError(page)) | 2594 | if (SlabDebug(page)) |
| 2579 | printk(KERN_ERR "SLUB %s: PageError set on " | 2595 | printk(KERN_ERR "SLUB %s: SlabDebug set on " |
| 2580 | "slab 0x%p\n", s->name, page); | 2596 | "slab 0x%p\n", s->name, page); |
| 2581 | } | 2597 | } |
| 2582 | } | 2598 | } |
