diff options
author | Peter Zijlstra <peterz@infradead.org> | 2013-11-14 17:31:52 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-14 19:32:20 -0500 |
commit | 539edb5846c740d78a8b6c2e43a99ca4323df68f (patch) | |
tree | dd03e1a7149f101f42311eac41e2857816cce36c /include/linux/mm.h | |
parent | 49076ec2ccaf68610aa03d96bced9a6694b93ca1 (diff) |
mm: properly separate the bloated ptl from the regular case
Use kernel/bounds.c to convert build-time spinlock_t size check into a
preprocessor symbol and apply that to properly separate the page::ptl
situation.
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/mm.h')
-rw-r--r-- | include/linux/mm.h | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index d0339741b6ce..1cedd000cf29 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -1317,27 +1317,29 @@ static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long a | |||
1317 | #endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */ | 1317 | #endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */ |
1318 | 1318 | ||
1319 | #if USE_SPLIT_PTE_PTLOCKS | 1319 | #if USE_SPLIT_PTE_PTLOCKS |
1320 | bool __ptlock_alloc(struct page *page); | 1320 | #if BLOATED_SPINLOCKS |
1321 | void __ptlock_free(struct page *page); | 1321 | extern bool ptlock_alloc(struct page *page); |
1322 | extern void ptlock_free(struct page *page); | ||
1323 | |||
1324 | static inline spinlock_t *ptlock_ptr(struct page *page) | ||
1325 | { | ||
1326 | return page->ptl; | ||
1327 | } | ||
1328 | #else /* BLOATED_SPINLOCKS */ | ||
1322 | static inline bool ptlock_alloc(struct page *page) | 1329 | static inline bool ptlock_alloc(struct page *page) |
1323 | { | 1330 | { |
1324 | if (sizeof(spinlock_t) > sizeof(page->ptl)) | ||
1325 | return __ptlock_alloc(page); | ||
1326 | return true; | 1331 | return true; |
1327 | } | 1332 | } |
1333 | |||
1328 | static inline void ptlock_free(struct page *page) | 1334 | static inline void ptlock_free(struct page *page) |
1329 | { | 1335 | { |
1330 | if (sizeof(spinlock_t) > sizeof(page->ptl)) | ||
1331 | __ptlock_free(page); | ||
1332 | } | 1336 | } |
1333 | 1337 | ||
1334 | static inline spinlock_t *ptlock_ptr(struct page *page) | 1338 | static inline spinlock_t *ptlock_ptr(struct page *page) |
1335 | { | 1339 | { |
1336 | if (sizeof(spinlock_t) > sizeof(page->ptl)) | 1340 | return &page->ptl; |
1337 | return (spinlock_t *) page->ptl; | ||
1338 | else | ||
1339 | return (spinlock_t *) &page->ptl; | ||
1340 | } | 1341 | } |
1342 | #endif /* BLOATED_SPINLOCKS */ | ||
1341 | 1343 | ||
1342 | static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd) | 1344 | static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd) |
1343 | { | 1345 | { |
@@ -1354,7 +1356,7 @@ static inline bool ptlock_init(struct page *page) | |||
1354 | * slab code uses page->slab_cache and page->first_page (for tail | 1356 | * slab code uses page->slab_cache and page->first_page (for tail |
1355 | * pages), which share storage with page->ptl. | 1357 | * pages), which share storage with page->ptl. |
1356 | */ | 1358 | */ |
1357 | VM_BUG_ON(page->ptl); | 1359 | VM_BUG_ON(*(unsigned long *)&page->ptl); |
1358 | if (!ptlock_alloc(page)) | 1360 | if (!ptlock_alloc(page)) |
1359 | return false; | 1361 | return false; |
1360 | spin_lock_init(ptlock_ptr(page)); | 1362 | spin_lock_init(ptlock_ptr(page)); |