diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/page_alloc.c | 13 | ||||
| -rw-r--r-- | mm/page_isolation.c | 12 | ||||
| -rw-r--r-- | mm/slob.c | 2 | ||||
| -rw-r--r-- | mm/tiny-shmem.c | 6 |
4 files changed, 23 insertions, 10 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e293c58bea58..27b8681139fd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -268,13 +268,14 @@ void prep_compound_page(struct page *page, unsigned long order) | |||
| 268 | { | 268 | { |
| 269 | int i; | 269 | int i; |
| 270 | int nr_pages = 1 << order; | 270 | int nr_pages = 1 << order; |
| 271 | struct page *p = page + 1; | ||
| 271 | 272 | ||
| 272 | set_compound_page_dtor(page, free_compound_page); | 273 | set_compound_page_dtor(page, free_compound_page); |
| 273 | set_compound_order(page, order); | 274 | set_compound_order(page, order); |
| 274 | __SetPageHead(page); | 275 | __SetPageHead(page); |
| 275 | for (i = 1; i < nr_pages; i++) { | 276 | for (i = 1; i < nr_pages; i++, p++) { |
| 276 | struct page *p = page + i; | 277 | if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) |
| 277 | 278 | p = pfn_to_page(page_to_pfn(page) + i); | |
| 278 | __SetPageTail(p); | 279 | __SetPageTail(p); |
| 279 | p->first_page = page; | 280 | p->first_page = page; |
| 280 | } | 281 | } |
| @@ -284,6 +285,7 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
| 284 | { | 285 | { |
| 285 | int i; | 286 | int i; |
| 286 | int nr_pages = 1 << order; | 287 | int nr_pages = 1 << order; |
| 288 | struct page *p = page + 1; | ||
| 287 | 289 | ||
| 288 | if (unlikely(compound_order(page) != order)) | 290 | if (unlikely(compound_order(page) != order)) |
| 289 | bad_page(page); | 291 | bad_page(page); |
| @@ -291,8 +293,9 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
| 291 | if (unlikely(!PageHead(page))) | 293 | if (unlikely(!PageHead(page))) |
| 292 | bad_page(page); | 294 | bad_page(page); |
| 293 | __ClearPageHead(page); | 295 | __ClearPageHead(page); |
| 294 | for (i = 1; i < nr_pages; i++) { | 296 | for (i = 1; i < nr_pages; i++, p++) { |
| 295 | struct page *p = page + i; | 297 | if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) |
| 298 | p = pfn_to_page(page_to_pfn(page) + i); | ||
| 296 | 299 | ||
| 297 | if (unlikely(!PageTail(p) | | 300 | if (unlikely(!PageTail(p) | |
| 298 | (p->first_page != page))) | 301 | (p->first_page != page))) |
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index c69f84fe038d..b70a7fec1ff6 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c | |||
| @@ -114,8 +114,10 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn) | |||
| 114 | 114 | ||
| 115 | int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | 115 | int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) |
| 116 | { | 116 | { |
| 117 | unsigned long pfn; | 117 | unsigned long pfn, flags; |
| 118 | struct page *page; | 118 | struct page *page; |
| 119 | struct zone *zone; | ||
| 120 | int ret; | ||
| 119 | 121 | ||
| 120 | pfn = start_pfn; | 122 | pfn = start_pfn; |
| 121 | /* | 123 | /* |
| @@ -131,7 +133,9 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | |||
| 131 | if (pfn < end_pfn) | 133 | if (pfn < end_pfn) |
| 132 | return -EBUSY; | 134 | return -EBUSY; |
| 133 | /* Check all pages are free or Marked as ISOLATED */ | 135 | /* Check all pages are free or Marked as ISOLATED */ |
| 134 | if (__test_page_isolated_in_pageblock(start_pfn, end_pfn)) | 136 | zone = page_zone(pfn_to_page(pfn)); |
| 135 | return 0; | 137 | spin_lock_irqsave(&zone->lock, flags); |
| 136 | return -EBUSY; | 138 | ret = __test_page_isolated_in_pageblock(start_pfn, end_pfn); |
| 139 | spin_unlock_irqrestore(&zone->lock, flags); | ||
| 140 | return ret ? 0 : -EBUSY; | ||
| 137 | } | 141 | } |
| @@ -515,7 +515,7 @@ size_t ksize(const void *block) | |||
| 515 | 515 | ||
| 516 | sp = (struct slob_page *)virt_to_page(block); | 516 | sp = (struct slob_page *)virt_to_page(block); |
| 517 | if (slob_page(sp)) | 517 | if (slob_page(sp)) |
| 518 | return ((slob_t *)block - 1)->units + SLOB_UNIT; | 518 | return (((slob_t *)block - 1)->units - 1) * SLOB_UNIT; |
| 519 | else | 519 | else |
| 520 | return sp->page.private; | 520 | return sp->page.private; |
| 521 | } | 521 | } |
diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c index d17cb6f6ab10..8d7a27a6335c 100644 --- a/mm/tiny-shmem.c +++ b/mm/tiny-shmem.c | |||
| @@ -80,6 +80,12 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
| 80 | inode->i_nlink = 0; /* It is unlinked */ | 80 | inode->i_nlink = 0; /* It is unlinked */ |
| 81 | init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ, | 81 | init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ, |
| 82 | &ramfs_file_operations); | 82 | &ramfs_file_operations); |
| 83 | |||
| 84 | #ifndef CONFIG_MMU | ||
| 85 | error = ramfs_nommu_expand_for_mapping(inode, size); | ||
| 86 | if (error) | ||
| 87 | goto close_file; | ||
| 88 | #endif | ||
| 83 | return file; | 89 | return file; |
| 84 | 90 | ||
| 85 | close_file: | 91 | close_file: |
