Commit bf68c214 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds

slab,slub: remove rcu_head size checks

rcu_head may now grow larger than list_head without affecting slab or
slub.

Link: http://lkml.kernel.org/r/20180518194519.3820-15-willy@infradead.orgSigned-off-by: default avatarMatthew Wilcox <mawilcox@microsoft.com>
Acked-by: default avatarChristoph Lameter <cl@linux.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 50e7fbc3
...@@ -1235,8 +1235,6 @@ void __init kmem_cache_init(void) ...@@ -1235,8 +1235,6 @@ void __init kmem_cache_init(void)
{ {
int i; int i;
BUILD_BUG_ON(sizeof(((struct page *)NULL)->lru) <
sizeof(struct rcu_head));
kmem_cache = &kmem_cache_boot; kmem_cache = &kmem_cache_boot;
if (!IS_ENABLED(CONFIG_NUMA) || num_possible_nodes() == 1) if (!IS_ENABLED(CONFIG_NUMA) || num_possible_nodes() == 1)
......
...@@ -1686,17 +1686,9 @@ static void __free_slab(struct kmem_cache *s, struct page *page) ...@@ -1686,17 +1686,9 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
__free_pages(page, order); __free_pages(page, order);
} }
#define need_reserve_slab_rcu \
(sizeof(((struct page *)NULL)->lru) < sizeof(struct rcu_head))
static void rcu_free_slab(struct rcu_head *h) static void rcu_free_slab(struct rcu_head *h)
{ {
struct page *page; struct page *page = container_of(h, struct page, rcu_head);
if (need_reserve_slab_rcu)
page = virt_to_head_page(h);
else
page = container_of((struct list_head *)h, struct page, lru);
__free_slab(page->slab_cache, page); __free_slab(page->slab_cache, page);
} }
...@@ -1704,19 +1696,7 @@ static void rcu_free_slab(struct rcu_head *h) ...@@ -1704,19 +1696,7 @@ static void rcu_free_slab(struct rcu_head *h)
static void free_slab(struct kmem_cache *s, struct page *page) static void free_slab(struct kmem_cache *s, struct page *page)
{ {
if (unlikely(s->flags & SLAB_TYPESAFE_BY_RCU)) { if (unlikely(s->flags & SLAB_TYPESAFE_BY_RCU)) {
struct rcu_head *head; call_rcu(&page->rcu_head, rcu_free_slab);
if (need_reserve_slab_rcu) {
int order = compound_order(page);
int offset = (PAGE_SIZE << order) - s->reserved;
VM_BUG_ON(s->reserved != sizeof(*head));
head = page_address(page) + offset;
} else {
head = &page->rcu_head;
}
call_rcu(head, rcu_free_slab);
} else } else
__free_slab(s, page); __free_slab(s, page);
} }
...@@ -3583,9 +3563,6 @@ static int kmem_cache_open(struct kmem_cache *s, slab_flags_t flags) ...@@ -3583,9 +3563,6 @@ static int kmem_cache_open(struct kmem_cache *s, slab_flags_t flags)
s->random = get_random_long(); s->random = get_random_long();
#endif #endif
if (need_reserve_slab_rcu && (s->flags & SLAB_TYPESAFE_BY_RCU))
s->reserved = sizeof(struct rcu_head);
if (!calculate_sizes(s, -1)) if (!calculate_sizes(s, -1))
goto error; goto error;
if (disable_higher_order_debug) { if (disable_higher_order_debug) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment