slab: introduce helper functions to get/set free object

In the following patches, to get/set free objects from the freelist
is changed so that simple casting doesn't work for it. Therefore,
introduce helper functions.

Acked-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>

authored by Joonsoo Kim and committed by Pekka Enberg e5c58dfd 9cef2e2b

+13 -7
+13 -7
mm/slab.c
··· 2548 2548 return freelist; 2549 2549 } 2550 2550 2551 - static inline unsigned int *slab_freelist(struct page *page) 2551 + static inline unsigned int get_free_obj(struct page *page, unsigned int idx) 2552 2552 { 2553 - return (unsigned int *)(page->freelist); 2553 + return ((unsigned int *)page->freelist)[idx]; 2554 + } 2555 + 2556 + static inline void set_free_obj(struct page *page, 2557 + unsigned int idx, unsigned int val) 2558 + { 2559 + ((unsigned int *)(page->freelist))[idx] = val; 2554 2560 } 2555 2561 2556 2562 static void cache_init_objs(struct kmem_cache *cachep, ··· 2601 2595 if (cachep->ctor) 2602 2596 cachep->ctor(objp); 2603 2597 #endif 2604 - slab_freelist(page)[i] = i; 2598 + set_free_obj(page, i, i); 2605 2599 } 2606 2600 } 2607 2601 ··· 2620 2614 { 2621 2615 void *objp; 2622 2616 2623 - objp = index_to_obj(cachep, page, slab_freelist(page)[page->active]); 2617 + objp = index_to_obj(cachep, page, get_free_obj(page, page->active)); 2624 2618 page->active++; 2625 2619 #if DEBUG 2626 2620 WARN_ON(page_to_nid(virt_to_page(objp)) != nodeid); ··· 2641 2635 2642 2636 /* Verify double free bug */ 2643 2637 for (i = page->active; i < cachep->num; i++) { 2644 - if (slab_freelist(page)[i] == objnr) { 2638 + if (get_free_obj(page, i) == objnr) { 2645 2639 printk(KERN_ERR "slab: double free detected in cache " 2646 2640 "'%s', objp %p\n", cachep->name, objp); 2647 2641 BUG(); ··· 2649 2643 } 2650 2644 #endif 2651 2645 page->active--; 2652 - slab_freelist(page)[page->active] = objnr; 2646 + set_free_obj(page, page->active, objnr); 2653 2647 } 2654 2648 2655 2649 /* ··· 4222 4216 4223 4217 for (j = page->active; j < c->num; j++) { 4224 4218 /* Skip freed item */ 4225 - if (slab_freelist(page)[j] == i) { 4219 + if (get_free_obj(page, j) == i) { 4226 4220 active = false; 4227 4221 break; 4228 4222 }