Commit 6ed5eb2211204224799b2821656bbbfde26ef200

Authored by Pekka Enberg
Committed by Linus Torvalds
1 parent 5295a74cc0

[PATCH] slab: extract virt_to_{cache|slab}

Introduce virt_to_cache() and virt_to_slab() functions to reduce duplicate
code and introduce a proper abstraction should we want to support other kind
of mapping for address to slab and cache (eg.  for vmalloc() or I/O memory).

Acked-by: Manfred Spraul <manfred@colorfullife.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 1 changed file with 17 additions and 5 deletions Side-by-side Diff

... ... @@ -596,6 +596,18 @@
596 596 return (struct slab *)page->lru.prev;
597 597 }
598 598  
  599 +static inline struct kmem_cache *virt_to_cache(const void *obj)
  600 +{
  601 + struct page *page = virt_to_page(obj);
  602 + return page_get_cache(page);
  603 +}
  604 +
  605 +static inline struct slab *virt_to_slab(const void *obj)
  606 +{
  607 + struct page *page = virt_to_page(obj);
  608 + return page_get_slab(page);
  609 +}
  610 +
599 611 /* These are the default caches for kmalloc. Custom caches can have other sizes. */
600 612 struct cache_sizes malloc_sizes[] = {
601 613 #define CACHE(x) { .cs_size = (x) },
... ... @@ -1437,7 +1449,7 @@
1437 1449 /* Print some data about the neighboring objects, if they
1438 1450 * exist:
1439 1451 */
1440   - struct slab *slabp = page_get_slab(virt_to_page(objp));
  1452 + struct slab *slabp = virt_to_slab(objp);
1441 1453 int objnr;
1442 1454  
1443 1455 objnr = (unsigned)(objp - slabp->s_mem) / cachep->buffer_size;
... ... @@ -2767,7 +2779,7 @@
2767 2779 void *objp = objpp[i];
2768 2780 struct slab *slabp;
2769 2781  
2770   - slabp = page_get_slab(virt_to_page(objp));
  2782 + slabp = virt_to_slab(objp);
2771 2783 l3 = cachep->nodelists[node];
2772 2784 list_del(&slabp->list);
2773 2785 check_spinlock_acquired_node(cachep, node);
... ... @@ -2867,7 +2879,7 @@
2867 2879 #ifdef CONFIG_NUMA
2868 2880 {
2869 2881 struct slab *slabp;
2870   - slabp = page_get_slab(virt_to_page(objp));
  2882 + slabp = virt_to_slab(objp);
2871 2883 if (unlikely(slabp->nodeid != numa_node_id())) {
2872 2884 struct array_cache *alien = NULL;
2873 2885 int nodeid = slabp->nodeid;
... ... @@ -3130,7 +3142,7 @@
3130 3142 return;
3131 3143 local_irq_save(flags);
3132 3144 kfree_debugcheck(objp);
3133   - c = page_get_cache(virt_to_page(objp));
  3145 + c = virt_to_cache(objp);
3134 3146 mutex_debug_check_no_locks_freed(objp, obj_size(c));
3135 3147 __cache_free(c, (void *)objp);
3136 3148 local_irq_restore(flags);
... ... @@ -3704,6 +3716,6 @@
3704 3716 if (unlikely(objp == NULL))
3705 3717 return 0;
3706 3718  
3707   - return obj_size(page_get_cache(virt_to_page(objp)));
  3719 + return obj_size(virt_to_cache(objp));
3708 3720 }