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.org Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> Acked-by: Christoph Lameter <cl@linux.com> Acked-by: Vlastimil 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
50e7fbc3bf
commit
bf68c214df
@ -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)
|
||||||
|
27
mm/slub.c
27
mm/slub.c
@ -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)
|
|||||||
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)
|
|||||||
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user