diff options
| -rw-r--r-- | Documentation/block/00-INDEX | 2 | ||||
| -rw-r--r-- | Documentation/block/cmdline-partition.txt | 8 | ||||
| -rw-r--r-- | Documentation/kernel-parameters.txt | 6 | ||||
| -rw-r--r-- | arch/parisc/mm/fault.c | 5 | ||||
| -rw-r--r-- | block/Kconfig | 9 | ||||
| -rw-r--r-- | block/Makefile | 2 | ||||
| -rw-r--r-- | block/partitions/Kconfig | 4 | ||||
| -rw-r--r-- | block/partitions/cmdline.c | 8 | ||||
| -rw-r--r-- | fs/binfmt_elf.c | 30 | ||||
| -rw-r--r-- | fs/nilfs2/page.c | 2 | ||||
| -rw-r--r-- | fs/nilfs2/segment.c | 11 | ||||
| -rw-r--r-- | include/asm-generic/vtime.h | 1 | ||||
| -rw-r--r-- | include/linux/balloon_compaction.h | 25 | ||||
| -rw-r--r-- | ipc/msg.c | 13 | ||||
| -rw-r--r-- | ipc/sem.c | 180 | ||||
| -rw-r--r-- | kernel/kmod.c | 4 | ||||
| -rw-r--r-- | kernel/pid.c | 5 | ||||
| -rw-r--r-- | mm/bounce.c | 2 | ||||
| -rw-r--r-- | mm/compaction.c | 7 | ||||
| -rw-r--r-- | mm/hwpoison-inject.c | 5 | ||||
| -rw-r--r-- | mm/madvise.c | 5 | ||||
| -rw-r--r-- | mm/memory-failure.c | 8 | ||||
| -rw-r--r-- | mm/migrate.c | 2 | ||||
| -rw-r--r-- | mm/mlock.c | 8 | ||||
| -rw-r--r-- | mm/page_alloc.c | 4 | ||||
| -rw-r--r-- | mm/vmscan.c | 4 |
26 files changed, 258 insertions, 102 deletions
diff --git a/Documentation/block/00-INDEX b/Documentation/block/00-INDEX index d18ecd827c40..929d9904f74b 100644 --- a/Documentation/block/00-INDEX +++ b/Documentation/block/00-INDEX | |||
| @@ -6,6 +6,8 @@ capability.txt | |||
| 6 | - Generic Block Device Capability (/sys/block/<device>/capability) | 6 | - Generic Block Device Capability (/sys/block/<device>/capability) |
| 7 | cfq-iosched.txt | 7 | cfq-iosched.txt |
| 8 | - CFQ IO scheduler tunables | 8 | - CFQ IO scheduler tunables |
| 9 | cmdline-partition.txt | ||
| 10 | - how to specify block device partitions on kernel command line | ||
| 9 | data-integrity.txt | 11 | data-integrity.txt |
| 10 | - Block data integrity | 12 | - Block data integrity |
| 11 | deadline-iosched.txt | 13 | deadline-iosched.txt |
diff --git a/Documentation/block/cmdline-partition.txt b/Documentation/block/cmdline-partition.txt index 2bbf4cc40c3f..525b9f6d7fb4 100644 --- a/Documentation/block/cmdline-partition.txt +++ b/Documentation/block/cmdline-partition.txt | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | Embedded device command line partition | 1 | Embedded device command line partition parsing |
| 2 | ===================================================================== | 2 | ===================================================================== |
| 3 | 3 | ||
| 4 | Read block device partition table from command line. | 4 | Support for reading the block device partition table from the command line. |
| 5 | The partition used for fixed block device (eMMC) embedded device. | 5 | It is typically used for fixed block (eMMC) embedded devices. |
| 6 | It is no MBR, save storage space. Bootloader can be easily accessed | 6 | It has no MBR, so saves storage space. Bootloader can be easily accessed |
| 7 | by absolute address of data on the block device. | 7 | by absolute address of data on the block device. |
| 8 | Users can easily change the partition. | 8 | Users can easily change the partition. |
| 9 | 9 | ||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 539a23631990..fcbb736d55fe 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -480,6 +480,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 480 | Format: <io>,<irq>,<mode> | 480 | Format: <io>,<irq>,<mode> |
| 481 | See header of drivers/net/hamradio/baycom_ser_hdx.c. | 481 | See header of drivers/net/hamradio/baycom_ser_hdx.c. |
| 482 | 482 | ||
| 483 | blkdevparts= Manual partition parsing of block device(s) for | ||
| 484 | embedded devices based on command line input. | ||
| 485 | See Documentation/block/cmdline-partition.txt | ||
| 486 | |||
| 483 | boot_delay= Milliseconds to delay each printk during boot. | 487 | boot_delay= Milliseconds to delay each printk during boot. |
| 484 | Values larger than 10 seconds (10000) are changed to | 488 | Values larger than 10 seconds (10000) are changed to |
| 485 | no delay (0). | 489 | no delay (0). |
| @@ -1357,7 +1361,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 1357 | pages. In the event, a node is too small to have both | 1361 | pages. In the event, a node is too small to have both |
| 1358 | kernelcore and Movable pages, kernelcore pages will | 1362 | kernelcore and Movable pages, kernelcore pages will |
| 1359 | take priority and other nodes will have a larger number | 1363 | take priority and other nodes will have a larger number |
| 1360 | of kernelcore pages. The Movable zone is used for the | 1364 | of Movable pages. The Movable zone is used for the |
| 1361 | allocation of pages that may be reclaimed or moved | 1365 | allocation of pages that may be reclaimed or moved |
| 1362 | by the page migration subsystem. This means that | 1366 | by the page migration subsystem. This means that |
| 1363 | HugeTLB pages may not be allocated from this zone. | 1367 | HugeTLB pages may not be allocated from this zone. |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index d10d27a720c0..00c0ed333a3d 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
| @@ -182,6 +182,9 @@ void do_page_fault(struct pt_regs *regs, unsigned long code, | |||
| 182 | 182 | ||
| 183 | if (user_mode(regs)) | 183 | if (user_mode(regs)) |
| 184 | flags |= FAULT_FLAG_USER; | 184 | flags |= FAULT_FLAG_USER; |
| 185 | |||
| 186 | acc_type = parisc_acctyp(code, regs->iir); | ||
| 187 | |||
| 185 | if (acc_type & VM_WRITE) | 188 | if (acc_type & VM_WRITE) |
| 186 | flags |= FAULT_FLAG_WRITE; | 189 | flags |= FAULT_FLAG_WRITE; |
| 187 | retry: | 190 | retry: |
| @@ -196,8 +199,6 @@ retry: | |||
| 196 | 199 | ||
| 197 | good_area: | 200 | good_area: |
| 198 | 201 | ||
| 199 | acc_type = parisc_acctyp(code,regs->iir); | ||
| 200 | |||
| 201 | if ((vma->vm_flags & acc_type) != acc_type) | 202 | if ((vma->vm_flags & acc_type) != acc_type) |
| 202 | goto bad_area; | 203 | goto bad_area; |
| 203 | 204 | ||
diff --git a/block/Kconfig b/block/Kconfig index 7f38e40fee08..2429515c05c2 100644 --- a/block/Kconfig +++ b/block/Kconfig | |||
| @@ -99,11 +99,16 @@ config BLK_DEV_THROTTLING | |||
| 99 | 99 | ||
| 100 | See Documentation/cgroups/blkio-controller.txt for more information. | 100 | See Documentation/cgroups/blkio-controller.txt for more information. |
| 101 | 101 | ||
| 102 | config CMDLINE_PARSER | 102 | config BLK_CMDLINE_PARSER |
| 103 | bool "Block device command line partition parser" | 103 | bool "Block device command line partition parser" |
| 104 | default n | 104 | default n |
| 105 | ---help--- | 105 | ---help--- |
| 106 | Parsing command line, get the partitions information. | 106 | Enabling this option allows you to specify the partition layout from |
| 107 | the kernel boot args. This is typically of use for embedded devices | ||
| 108 | which don't otherwise have any standardized method for listing the | ||
| 109 | partitions on a block device. | ||
| 110 | |||
| 111 | See Documentation/block/cmdline-partition.txt for more information. | ||
| 107 | 112 | ||
| 108 | menu "Partition Types" | 113 | menu "Partition Types" |
| 109 | 114 | ||
diff --git a/block/Makefile b/block/Makefile index 4fa4be544ece..671a83d063a5 100644 --- a/block/Makefile +++ b/block/Makefile | |||
| @@ -18,4 +18,4 @@ obj-$(CONFIG_IOSCHED_CFQ) += cfq-iosched.o | |||
| 18 | 18 | ||
| 19 | obj-$(CONFIG_BLOCK_COMPAT) += compat_ioctl.o | 19 | obj-$(CONFIG_BLOCK_COMPAT) += compat_ioctl.o |
| 20 | obj-$(CONFIG_BLK_DEV_INTEGRITY) += blk-integrity.o | 20 | obj-$(CONFIG_BLK_DEV_INTEGRITY) += blk-integrity.o |
| 21 | obj-$(CONFIG_CMDLINE_PARSER) += cmdline-parser.o | 21 | obj-$(CONFIG_BLK_CMDLINE_PARSER) += cmdline-parser.o |
diff --git a/block/partitions/Kconfig b/block/partitions/Kconfig index 87a32086535d..9b29a996c311 100644 --- a/block/partitions/Kconfig +++ b/block/partitions/Kconfig | |||
| @@ -263,7 +263,7 @@ config SYSV68_PARTITION | |||
| 263 | 263 | ||
| 264 | config CMDLINE_PARTITION | 264 | config CMDLINE_PARTITION |
| 265 | bool "Command line partition support" if PARTITION_ADVANCED | 265 | bool "Command line partition support" if PARTITION_ADVANCED |
| 266 | select CMDLINE_PARSER | 266 | select BLK_CMDLINE_PARSER |
| 267 | help | 267 | help |
| 268 | Say Y here if you would read the partitions table from bootargs. | 268 | Say Y here if you want to read the partition table from bootargs. |
| 269 | The format for the command line is just like mtdparts. | 269 | The format for the command line is just like mtdparts. |
diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index 56cf4ffad51e..5141b563adf1 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c | |||
| @@ -2,15 +2,15 @@ | |||
| 2 | * Copyright (C) 2013 HUAWEI | 2 | * Copyright (C) 2013 HUAWEI |
| 3 | * Author: Cai Zhiyong <caizhiyong@huawei.com> | 3 | * Author: Cai Zhiyong <caizhiyong@huawei.com> |
| 4 | * | 4 | * |
| 5 | * Read block device partition table from command line. | 5 | * Read block device partition table from the command line. |
| 6 | * The partition used for fixed block device (eMMC) embedded device. | 6 | * Typically used for fixed block (eMMC) embedded devices. |
| 7 | * It is no MBR, save storage space. Bootloader can be easily accessed | 7 | * It has no MBR, so saves storage space. Bootloader can be easily accessed |
| 8 | * by absolute address of data on the block device. | 8 | * by absolute address of data on the block device. |
| 9 | * Users can easily change the partition. | 9 | * Users can easily change the partition. |
| 10 | * | 10 | * |
| 11 | * The format for the command line is just like mtdparts. | 11 | * The format for the command line is just like mtdparts. |
| 12 | * | 12 | * |
| 13 | * Verbose config please reference "Documentation/block/cmdline-partition.txt" | 13 | * For further information, see "Documentation/block/cmdline-partition.txt" |
| 14 | * | 14 | * |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 100edcc5e312..4c94a79991bb 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -1413,7 +1413,7 @@ static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata, | |||
| 1413 | * long file_ofs | 1413 | * long file_ofs |
| 1414 | * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL... | 1414 | * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL... |
| 1415 | */ | 1415 | */ |
| 1416 | static void fill_files_note(struct memelfnote *note) | 1416 | static int fill_files_note(struct memelfnote *note) |
| 1417 | { | 1417 | { |
| 1418 | struct vm_area_struct *vma; | 1418 | struct vm_area_struct *vma; |
| 1419 | unsigned count, size, names_ofs, remaining, n; | 1419 | unsigned count, size, names_ofs, remaining, n; |
| @@ -1428,11 +1428,11 @@ static void fill_files_note(struct memelfnote *note) | |||
| 1428 | names_ofs = (2 + 3 * count) * sizeof(data[0]); | 1428 | names_ofs = (2 + 3 * count) * sizeof(data[0]); |
| 1429 | alloc: | 1429 | alloc: |
| 1430 | if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */ | 1430 | if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */ |
| 1431 | goto err; | 1431 | return -EINVAL; |
| 1432 | size = round_up(size, PAGE_SIZE); | 1432 | size = round_up(size, PAGE_SIZE); |
| 1433 | data = vmalloc(size); | 1433 | data = vmalloc(size); |
| 1434 | if (!data) | 1434 | if (!data) |
| 1435 | goto err; | 1435 | return -ENOMEM; |
| 1436 | 1436 | ||
| 1437 | start_end_ofs = data + 2; | 1437 | start_end_ofs = data + 2; |
| 1438 | name_base = name_curpos = ((char *)data) + names_ofs; | 1438 | name_base = name_curpos = ((char *)data) + names_ofs; |
| @@ -1485,7 +1485,7 @@ static void fill_files_note(struct memelfnote *note) | |||
| 1485 | 1485 | ||
| 1486 | size = name_curpos - (char *)data; | 1486 | size = name_curpos - (char *)data; |
| 1487 | fill_note(note, "CORE", NT_FILE, size, data); | 1487 | fill_note(note, "CORE", NT_FILE, size, data); |
| 1488 | err: ; | 1488 | return 0; |
| 1489 | } | 1489 | } |
| 1490 | 1490 | ||
| 1491 | #ifdef CORE_DUMP_USE_REGSET | 1491 | #ifdef CORE_DUMP_USE_REGSET |
| @@ -1686,8 +1686,8 @@ static int fill_note_info(struct elfhdr *elf, int phdrs, | |||
| 1686 | fill_auxv_note(&info->auxv, current->mm); | 1686 | fill_auxv_note(&info->auxv, current->mm); |
| 1687 | info->size += notesize(&info->auxv); | 1687 | info->size += notesize(&info->auxv); |
| 1688 | 1688 | ||
| 1689 | fill_files_note(&info->files); | 1689 | if (fill_files_note(&info->files) == 0) |
| 1690 | info->size += notesize(&info->files); | 1690 | info->size += notesize(&info->files); |
| 1691 | 1691 | ||
| 1692 | return 1; | 1692 | return 1; |
| 1693 | } | 1693 | } |
| @@ -1719,7 +1719,8 @@ static int write_note_info(struct elf_note_info *info, | |||
| 1719 | return 0; | 1719 | return 0; |
| 1720 | if (first && !writenote(&info->auxv, file, foffset)) | 1720 | if (first && !writenote(&info->auxv, file, foffset)) |
| 1721 | return 0; | 1721 | return 0; |
| 1722 | if (first && !writenote(&info->files, file, foffset)) | 1722 | if (first && info->files.data && |
| 1723 | !writenote(&info->files, file, foffset)) | ||
| 1723 | return 0; | 1724 | return 0; |
| 1724 | 1725 | ||
| 1725 | for (i = 1; i < info->thread_notes; ++i) | 1726 | for (i = 1; i < info->thread_notes; ++i) |
| @@ -1806,6 +1807,7 @@ static int elf_dump_thread_status(long signr, struct elf_thread_status *t) | |||
| 1806 | 1807 | ||
| 1807 | struct elf_note_info { | 1808 | struct elf_note_info { |
| 1808 | struct memelfnote *notes; | 1809 | struct memelfnote *notes; |
| 1810 | struct memelfnote *notes_files; | ||
| 1809 | struct elf_prstatus *prstatus; /* NT_PRSTATUS */ | 1811 | struct elf_prstatus *prstatus; /* NT_PRSTATUS */ |
| 1810 | struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */ | 1812 | struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */ |
| 1811 | struct list_head thread_list; | 1813 | struct list_head thread_list; |
| @@ -1896,9 +1898,12 @@ static int fill_note_info(struct elfhdr *elf, int phdrs, | |||
| 1896 | 1898 | ||
| 1897 | fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo); | 1899 | fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo); |
| 1898 | fill_auxv_note(info->notes + 3, current->mm); | 1900 | fill_auxv_note(info->notes + 3, current->mm); |
| 1899 | fill_files_note(info->notes + 4); | 1901 | info->numnote = 4; |
| 1900 | 1902 | ||
| 1901 | info->numnote = 5; | 1903 | if (fill_files_note(info->notes + info->numnote) == 0) { |
| 1904 | info->notes_files = info->notes + info->numnote; | ||
| 1905 | info->numnote++; | ||
| 1906 | } | ||
| 1902 | 1907 | ||
| 1903 | /* Try to dump the FPU. */ | 1908 | /* Try to dump the FPU. */ |
| 1904 | info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, | 1909 | info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, |
| @@ -1960,8 +1965,9 @@ static void free_note_info(struct elf_note_info *info) | |||
| 1960 | kfree(list_entry(tmp, struct elf_thread_status, list)); | 1965 | kfree(list_entry(tmp, struct elf_thread_status, list)); |
| 1961 | } | 1966 | } |
| 1962 | 1967 | ||
| 1963 | /* Free data allocated by fill_files_note(): */ | 1968 | /* Free data possibly allocated by fill_files_note(): */ |
| 1964 | vfree(info->notes[4].data); | 1969 | if (info->notes_files) |
| 1970 | vfree(info->notes_files->data); | ||
| 1965 | 1971 | ||
| 1966 | kfree(info->prstatus); | 1972 | kfree(info->prstatus); |
| 1967 | kfree(info->psinfo); | 1973 | kfree(info->psinfo); |
| @@ -2044,7 +2050,7 @@ static int elf_core_dump(struct coredump_params *cprm) | |||
| 2044 | struct vm_area_struct *vma, *gate_vma; | 2050 | struct vm_area_struct *vma, *gate_vma; |
| 2045 | struct elfhdr *elf = NULL; | 2051 | struct elfhdr *elf = NULL; |
| 2046 | loff_t offset = 0, dataoff, foffset; | 2052 | loff_t offset = 0, dataoff, foffset; |
| 2047 | struct elf_note_info info; | 2053 | struct elf_note_info info = { }; |
| 2048 | struct elf_phdr *phdr4note = NULL; | 2054 | struct elf_phdr *phdr4note = NULL; |
| 2049 | struct elf_shdr *shdr4extnum = NULL; | 2055 | struct elf_shdr *shdr4extnum = NULL; |
| 2050 | Elf_Half e_phnum; | 2056 | Elf_Half e_phnum; |
diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c index 0ba679866e50..da276640f776 100644 --- a/fs/nilfs2/page.c +++ b/fs/nilfs2/page.c | |||
| @@ -94,6 +94,7 @@ void nilfs_forget_buffer(struct buffer_head *bh) | |||
| 94 | clear_buffer_nilfs_volatile(bh); | 94 | clear_buffer_nilfs_volatile(bh); |
| 95 | clear_buffer_nilfs_checked(bh); | 95 | clear_buffer_nilfs_checked(bh); |
| 96 | clear_buffer_nilfs_redirected(bh); | 96 | clear_buffer_nilfs_redirected(bh); |
| 97 | clear_buffer_async_write(bh); | ||
| 97 | clear_buffer_dirty(bh); | 98 | clear_buffer_dirty(bh); |
| 98 | if (nilfs_page_buffers_clean(page)) | 99 | if (nilfs_page_buffers_clean(page)) |
| 99 | __nilfs_clear_page_dirty(page); | 100 | __nilfs_clear_page_dirty(page); |
| @@ -429,6 +430,7 @@ void nilfs_clear_dirty_page(struct page *page, bool silent) | |||
| 429 | "discard block %llu, size %zu", | 430 | "discard block %llu, size %zu", |
| 430 | (u64)bh->b_blocknr, bh->b_size); | 431 | (u64)bh->b_blocknr, bh->b_size); |
| 431 | } | 432 | } |
| 433 | clear_buffer_async_write(bh); | ||
| 432 | clear_buffer_dirty(bh); | 434 | clear_buffer_dirty(bh); |
| 433 | clear_buffer_nilfs_volatile(bh); | 435 | clear_buffer_nilfs_volatile(bh); |
| 434 | clear_buffer_nilfs_checked(bh); | 436 | clear_buffer_nilfs_checked(bh); |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index bd88a7461063..9f6b486b6c01 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -665,7 +665,7 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode, | |||
| 665 | 665 | ||
| 666 | bh = head = page_buffers(page); | 666 | bh = head = page_buffers(page); |
| 667 | do { | 667 | do { |
| 668 | if (!buffer_dirty(bh)) | 668 | if (!buffer_dirty(bh) || buffer_async_write(bh)) |
| 669 | continue; | 669 | continue; |
| 670 | get_bh(bh); | 670 | get_bh(bh); |
| 671 | list_add_tail(&bh->b_assoc_buffers, listp); | 671 | list_add_tail(&bh->b_assoc_buffers, listp); |
| @@ -699,7 +699,8 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode, | |||
| 699 | for (i = 0; i < pagevec_count(&pvec); i++) { | 699 | for (i = 0; i < pagevec_count(&pvec); i++) { |
| 700 | bh = head = page_buffers(pvec.pages[i]); | 700 | bh = head = page_buffers(pvec.pages[i]); |
| 701 | do { | 701 | do { |
| 702 | if (buffer_dirty(bh)) { | 702 | if (buffer_dirty(bh) && |
| 703 | !buffer_async_write(bh)) { | ||
| 703 | get_bh(bh); | 704 | get_bh(bh); |
| 704 | list_add_tail(&bh->b_assoc_buffers, | 705 | list_add_tail(&bh->b_assoc_buffers, |
| 705 | listp); | 706 | listp); |
| @@ -1579,6 +1580,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci) | |||
| 1579 | 1580 | ||
| 1580 | list_for_each_entry(bh, &segbuf->sb_segsum_buffers, | 1581 | list_for_each_entry(bh, &segbuf->sb_segsum_buffers, |
| 1581 | b_assoc_buffers) { | 1582 | b_assoc_buffers) { |
| 1583 | set_buffer_async_write(bh); | ||
| 1582 | if (bh->b_page != bd_page) { | 1584 | if (bh->b_page != bd_page) { |
| 1583 | if (bd_page) { | 1585 | if (bd_page) { |
| 1584 | lock_page(bd_page); | 1586 | lock_page(bd_page); |
| @@ -1592,6 +1594,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci) | |||
| 1592 | 1594 | ||
| 1593 | list_for_each_entry(bh, &segbuf->sb_payload_buffers, | 1595 | list_for_each_entry(bh, &segbuf->sb_payload_buffers, |
| 1594 | b_assoc_buffers) { | 1596 | b_assoc_buffers) { |
| 1597 | set_buffer_async_write(bh); | ||
| 1595 | if (bh == segbuf->sb_super_root) { | 1598 | if (bh == segbuf->sb_super_root) { |
| 1596 | if (bh->b_page != bd_page) { | 1599 | if (bh->b_page != bd_page) { |
| 1597 | lock_page(bd_page); | 1600 | lock_page(bd_page); |
| @@ -1677,6 +1680,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err) | |||
| 1677 | list_for_each_entry(segbuf, logs, sb_list) { | 1680 | list_for_each_entry(segbuf, logs, sb_list) { |
| 1678 | list_for_each_entry(bh, &segbuf->sb_segsum_buffers, | 1681 | list_for_each_entry(bh, &segbuf->sb_segsum_buffers, |
| 1679 | b_assoc_buffers) { | 1682 | b_assoc_buffers) { |
| 1683 | clear_buffer_async_write(bh); | ||
| 1680 | if (bh->b_page != bd_page) { | 1684 | if (bh->b_page != bd_page) { |
| 1681 | if (bd_page) | 1685 | if (bd_page) |
| 1682 | end_page_writeback(bd_page); | 1686 | end_page_writeback(bd_page); |
| @@ -1686,6 +1690,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err) | |||
| 1686 | 1690 | ||
| 1687 | list_for_each_entry(bh, &segbuf->sb_payload_buffers, | 1691 | list_for_each_entry(bh, &segbuf->sb_payload_buffers, |
| 1688 | b_assoc_buffers) { | 1692 | b_assoc_buffers) { |
| 1693 | clear_buffer_async_write(bh); | ||
| 1689 | if (bh == segbuf->sb_super_root) { | 1694 | if (bh == segbuf->sb_super_root) { |
| 1690 | if (bh->b_page != bd_page) { | 1695 | if (bh->b_page != bd_page) { |
| 1691 | end_page_writeback(bd_page); | 1696 | end_page_writeback(bd_page); |
| @@ -1755,6 +1760,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
| 1755 | b_assoc_buffers) { | 1760 | b_assoc_buffers) { |
| 1756 | set_buffer_uptodate(bh); | 1761 | set_buffer_uptodate(bh); |
| 1757 | clear_buffer_dirty(bh); | 1762 | clear_buffer_dirty(bh); |
| 1763 | clear_buffer_async_write(bh); | ||
| 1758 | if (bh->b_page != bd_page) { | 1764 | if (bh->b_page != bd_page) { |
| 1759 | if (bd_page) | 1765 | if (bd_page) |
| 1760 | end_page_writeback(bd_page); | 1766 | end_page_writeback(bd_page); |
| @@ -1776,6 +1782,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
| 1776 | b_assoc_buffers) { | 1782 | b_assoc_buffers) { |
| 1777 | set_buffer_uptodate(bh); | 1783 | set_buffer_uptodate(bh); |
| 1778 | clear_buffer_dirty(bh); | 1784 | clear_buffer_dirty(bh); |
| 1785 | clear_buffer_async_write(bh); | ||
| 1779 | clear_buffer_delay(bh); | 1786 | clear_buffer_delay(bh); |
| 1780 | clear_buffer_nilfs_volatile(bh); | 1787 | clear_buffer_nilfs_volatile(bh); |
| 1781 | clear_buffer_nilfs_redirected(bh); | 1788 | clear_buffer_nilfs_redirected(bh); |
diff --git a/include/asm-generic/vtime.h b/include/asm-generic/vtime.h index e69de29bb2d1..b1a49677fe25 100644 --- a/include/asm-generic/vtime.h +++ b/include/asm-generic/vtime.h | |||
| @@ -0,0 +1 @@ | |||
| /* no content, but patch(1) dislikes empty files */ | |||
diff --git a/include/linux/balloon_compaction.h b/include/linux/balloon_compaction.h index f7f1d7169b11..089743ade734 100644 --- a/include/linux/balloon_compaction.h +++ b/include/linux/balloon_compaction.h | |||
| @@ -159,6 +159,26 @@ static inline bool balloon_page_movable(struct page *page) | |||
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | /* | 161 | /* |
| 162 | * isolated_balloon_page - identify an isolated balloon page on private | ||
| 163 | * compaction/migration page lists. | ||
| 164 | * | ||
| 165 | * After a compaction thread isolates a balloon page for migration, it raises | ||
| 166 | * the page refcount to prevent concurrent compaction threads from re-isolating | ||
| 167 | * the same page. For that reason putback_movable_pages(), or other routines | ||
| 168 | * that need to identify isolated balloon pages on private pagelists, cannot | ||
| 169 | * rely on balloon_page_movable() to accomplish the task. | ||
| 170 | */ | ||
| 171 | static inline bool isolated_balloon_page(struct page *page) | ||
| 172 | { | ||
| 173 | /* Already isolated balloon pages, by default, have a raised refcount */ | ||
| 174 | if (page_flags_cleared(page) && !page_mapped(page) && | ||
| 175 | page_count(page) >= 2) | ||
| 176 | return __is_movable_balloon_page(page); | ||
| 177 | |||
| 178 | return false; | ||
| 179 | } | ||
| 180 | |||
| 181 | /* | ||
| 162 | * balloon_page_insert - insert a page into the balloon's page list and make | 182 | * balloon_page_insert - insert a page into the balloon's page list and make |
| 163 | * the page->mapping assignment accordingly. | 183 | * the page->mapping assignment accordingly. |
| 164 | * @page : page to be assigned as a 'balloon page' | 184 | * @page : page to be assigned as a 'balloon page' |
| @@ -243,6 +263,11 @@ static inline bool balloon_page_movable(struct page *page) | |||
| 243 | return false; | 263 | return false; |
| 244 | } | 264 | } |
| 245 | 265 | ||
| 266 | static inline bool isolated_balloon_page(struct page *page) | ||
| 267 | { | ||
| 268 | return false; | ||
| 269 | } | ||
| 270 | |||
| 246 | static inline bool balloon_page_isolate(struct page *page) | 271 | static inline bool balloon_page_isolate(struct page *page) |
| 247 | { | 272 | { |
| 248 | return false; | 273 | return false; |
| @@ -695,6 +695,12 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, | |||
| 695 | if (ipcperms(ns, &msq->q_perm, S_IWUGO)) | 695 | if (ipcperms(ns, &msq->q_perm, S_IWUGO)) |
| 696 | goto out_unlock0; | 696 | goto out_unlock0; |
| 697 | 697 | ||
| 698 | /* raced with RMID? */ | ||
| 699 | if (msq->q_perm.deleted) { | ||
| 700 | err = -EIDRM; | ||
| 701 | goto out_unlock0; | ||
| 702 | } | ||
| 703 | |||
| 698 | err = security_msg_queue_msgsnd(msq, msg, msgflg); | 704 | err = security_msg_queue_msgsnd(msq, msg, msgflg); |
| 699 | if (err) | 705 | if (err) |
| 700 | goto out_unlock0; | 706 | goto out_unlock0; |
| @@ -901,6 +907,13 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgfl | |||
| 901 | goto out_unlock1; | 907 | goto out_unlock1; |
| 902 | 908 | ||
| 903 | ipc_lock_object(&msq->q_perm); | 909 | ipc_lock_object(&msq->q_perm); |
| 910 | |||
| 911 | /* raced with RMID? */ | ||
| 912 | if (msq->q_perm.deleted) { | ||
| 913 | msg = ERR_PTR(-EIDRM); | ||
| 914 | goto out_unlock0; | ||
| 915 | } | ||
| 916 | |||
| 904 | msg = find_msg(msq, &msgtyp, mode); | 917 | msg = find_msg(msq, &msgtyp, mode); |
| 905 | if (!IS_ERR(msg)) { | 918 | if (!IS_ERR(msg)) { |
| 906 | /* | 919 | /* |
| @@ -253,70 +253,112 @@ static void sem_rcu_free(struct rcu_head *head) | |||
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | /* | 255 | /* |
| 256 | * Wait until all currently ongoing simple ops have completed. | ||
| 257 | * Caller must own sem_perm.lock. | ||
| 258 | * New simple ops cannot start, because simple ops first check | ||
| 259 | * that sem_perm.lock is free. | ||
| 260 | * that a) sem_perm.lock is free and b) complex_count is 0. | ||
| 261 | */ | ||
| 262 | static void sem_wait_array(struct sem_array *sma) | ||
| 263 | { | ||
| 264 | int i; | ||
| 265 | struct sem *sem; | ||
| 266 | |||
| 267 | if (sma->complex_count) { | ||
| 268 | /* The thread that increased sma->complex_count waited on | ||
| 269 | * all sem->lock locks. Thus we don't need to wait again. | ||
| 270 | */ | ||
| 271 | return; | ||
| 272 | } | ||
| 273 | |||
| 274 | for (i = 0; i < sma->sem_nsems; i++) { | ||
| 275 | sem = sma->sem_base + i; | ||
| 276 | spin_unlock_wait(&sem->lock); | ||
| 277 | } | ||
| 278 | } | ||
| 279 | |||
| 280 | /* | ||
| 256 | * If the request contains only one semaphore operation, and there are | 281 | * If the request contains only one semaphore operation, and there are |
| 257 | * no complex transactions pending, lock only the semaphore involved. | 282 | * no complex transactions pending, lock only the semaphore involved. |
| 258 | * Otherwise, lock the entire semaphore array, since we either have | 283 | * Otherwise, lock the entire semaphore array, since we either have |
| 259 | * multiple semaphores in our own semops, or we need to look at | 284 | * multiple semaphores in our own semops, or we need to look at |
| 260 | * semaphores from other pending complex operations. | 285 | * semaphores from other pending complex operations. |
| 261 | * | ||
| 262 | * Carefully guard against sma->complex_count changing between zero | ||
| 263 | * and non-zero while we are spinning for the lock. The value of | ||
| 264 | * sma->complex_count cannot change while we are holding the lock, | ||
| 265 | * so sem_unlock should be fine. | ||
| 266 | * | ||
| 267 | * The global lock path checks that all the local locks have been released, | ||
| 268 | * checking each local lock once. This means that the local lock paths | ||
| 269 | * cannot start their critical sections while the global lock is held. | ||
| 270 | */ | 286 | */ |
| 271 | static inline int sem_lock(struct sem_array *sma, struct sembuf *sops, | 287 | static inline int sem_lock(struct sem_array *sma, struct sembuf *sops, |
| 272 | int nsops) | 288 | int nsops) |
| 273 | { | 289 | { |
| 274 | int locknum; | 290 | struct sem *sem; |
| 275 | again: | ||
| 276 | if (nsops == 1 && !sma->complex_count) { | ||
| 277 | struct sem *sem = sma->sem_base + sops->sem_num; | ||
| 278 | 291 | ||
| 279 | /* Lock just the semaphore we are interested in. */ | 292 | if (nsops != 1) { |
| 280 | spin_lock(&sem->lock); | 293 | /* Complex operation - acquire a full lock */ |
| 294 | ipc_lock_object(&sma->sem_perm); | ||
| 281 | 295 | ||
| 282 | /* | 296 | /* And wait until all simple ops that are processed |
| 283 | * If sma->complex_count was set while we were spinning, | 297 | * right now have dropped their locks. |
| 284 | * we may need to look at things we did not lock here. | ||
| 285 | */ | 298 | */ |
| 286 | if (unlikely(sma->complex_count)) { | 299 | sem_wait_array(sma); |
| 287 | spin_unlock(&sem->lock); | 300 | return -1; |
| 288 | goto lock_array; | 301 | } |
| 289 | } | ||
| 290 | 302 | ||
| 303 | /* | ||
| 304 | * Only one semaphore affected - try to optimize locking. | ||
| 305 | * The rules are: | ||
| 306 | * - optimized locking is possible if no complex operation | ||
| 307 | * is either enqueued or processed right now. | ||
| 308 | * - The test for enqueued complex ops is simple: | ||
| 309 | * sma->complex_count != 0 | ||
| 310 | * - Testing for complex ops that are processed right now is | ||
| 311 | * a bit more difficult. Complex ops acquire the full lock | ||
| 312 | * and first wait that the running simple ops have completed. | ||
| 313 | * (see above) | ||
| 314 | * Thus: If we own a simple lock and the global lock is free | ||
| 315 | * and complex_count is now 0, then it will stay 0 and | ||
| 316 | * thus just locking sem->lock is sufficient. | ||
| 317 | */ | ||
| 318 | sem = sma->sem_base + sops->sem_num; | ||
| 319 | |||
| 320 | if (sma->complex_count == 0) { | ||
| 291 | /* | 321 | /* |
| 292 | * Another process is holding the global lock on the | 322 | * It appears that no complex operation is around. |
| 293 | * sem_array; we cannot enter our critical section, | 323 | * Acquire the per-semaphore lock. |
| 294 | * but have to wait for the global lock to be released. | ||
| 295 | */ | 324 | */ |
| 296 | if (unlikely(spin_is_locked(&sma->sem_perm.lock))) { | 325 | spin_lock(&sem->lock); |
| 297 | spin_unlock(&sem->lock); | 326 | |
| 298 | spin_unlock_wait(&sma->sem_perm.lock); | 327 | /* Then check that the global lock is free */ |
| 299 | goto again; | 328 | if (!spin_is_locked(&sma->sem_perm.lock)) { |
| 329 | /* spin_is_locked() is not a memory barrier */ | ||
| 330 | smp_mb(); | ||
| 331 | |||
| 332 | /* Now repeat the test of complex_count: | ||
| 333 | * It can't change anymore until we drop sem->lock. | ||
| 334 | * Thus: if is now 0, then it will stay 0. | ||
| 335 | */ | ||
| 336 | if (sma->complex_count == 0) { | ||
| 337 | /* fast path successful! */ | ||
| 338 | return sops->sem_num; | ||
| 339 | } | ||
| 300 | } | 340 | } |
| 341 | spin_unlock(&sem->lock); | ||
| 342 | } | ||
| 301 | 343 | ||
| 302 | locknum = sops->sem_num; | 344 | /* slow path: acquire the full lock */ |
| 345 | ipc_lock_object(&sma->sem_perm); | ||
| 346 | |||
| 347 | if (sma->complex_count == 0) { | ||
| 348 | /* False alarm: | ||
| 349 | * There is no complex operation, thus we can switch | ||
| 350 | * back to the fast path. | ||
| 351 | */ | ||
| 352 | spin_lock(&sem->lock); | ||
| 353 | ipc_unlock_object(&sma->sem_perm); | ||
| 354 | return sops->sem_num; | ||
| 303 | } else { | 355 | } else { |
| 304 | int i; | 356 | /* Not a false alarm, thus complete the sequence for a |
| 305 | /* | 357 | * full lock. |
| 306 | * Lock the semaphore array, and wait for all of the | ||
| 307 | * individual semaphore locks to go away. The code | ||
| 308 | * above ensures no new single-lock holders will enter | ||
| 309 | * their critical section while the array lock is held. | ||
| 310 | */ | 358 | */ |
| 311 | lock_array: | 359 | sem_wait_array(sma); |
| 312 | ipc_lock_object(&sma->sem_perm); | 360 | return -1; |
| 313 | for (i = 0; i < sma->sem_nsems; i++) { | ||
| 314 | struct sem *sem = sma->sem_base + i; | ||
| 315 | spin_unlock_wait(&sem->lock); | ||
| 316 | } | ||
| 317 | locknum = -1; | ||
| 318 | } | 361 | } |
| 319 | return locknum; | ||
| 320 | } | 362 | } |
| 321 | 363 | ||
| 322 | static inline void sem_unlock(struct sem_array *sma, int locknum) | 364 | static inline void sem_unlock(struct sem_array *sma, int locknum) |
| @@ -876,6 +918,24 @@ again: | |||
| 876 | } | 918 | } |
| 877 | 919 | ||
| 878 | /** | 920 | /** |
| 921 | * set_semotime(sma, sops) - set sem_otime | ||
| 922 | * @sma: semaphore array | ||
| 923 | * @sops: operations that modified the array, may be NULL | ||
| 924 | * | ||
| 925 | * sem_otime is replicated to avoid cache line trashing. | ||
| 926 | * This function sets one instance to the current time. | ||
| 927 | */ | ||
| 928 | static void set_semotime(struct sem_array *sma, struct sembuf *sops) | ||
| 929 | { | ||
| 930 | if (sops == NULL) { | ||
| 931 | sma->sem_base[0].sem_otime = get_seconds(); | ||
| 932 | } else { | ||
| 933 | sma->sem_base[sops[0].sem_num].sem_otime = | ||
| 934 | get_seconds(); | ||
| 935 | } | ||
| 936 | } | ||
| 937 | |||
| 938 | /** | ||
| 879 | * do_smart_update(sma, sops, nsops, otime, pt) - optimized update_queue | 939 | * do_smart_update(sma, sops, nsops, otime, pt) - optimized update_queue |
| 880 | * @sma: semaphore array | 940 | * @sma: semaphore array |
| 881 | * @sops: operations that were performed | 941 | * @sops: operations that were performed |
| @@ -925,17 +985,10 @@ static void do_smart_update(struct sem_array *sma, struct sembuf *sops, int nsop | |||
| 925 | } | 985 | } |
| 926 | } | 986 | } |
| 927 | } | 987 | } |
| 928 | if (otime) { | 988 | if (otime) |
| 929 | if (sops == NULL) { | 989 | set_semotime(sma, sops); |
| 930 | sma->sem_base[0].sem_otime = get_seconds(); | ||
| 931 | } else { | ||
| 932 | sma->sem_base[sops[0].sem_num].sem_otime = | ||
| 933 | get_seconds(); | ||
| 934 | } | ||
| 935 | } | ||
| 936 | } | 990 | } |
| 937 | 991 | ||
| 938 | |||
| 939 | /* The following counts are associated to each semaphore: | 992 | /* The following counts are associated to each semaphore: |
| 940 | * semncnt number of tasks waiting on semval being nonzero | 993 | * semncnt number of tasks waiting on semval being nonzero |
| 941 | * semzcnt number of tasks waiting on semval being zero | 994 | * semzcnt number of tasks waiting on semval being zero |
| @@ -1797,12 +1850,17 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, | |||
| 1797 | 1850 | ||
| 1798 | error = perform_atomic_semop(sma, sops, nsops, un, | 1851 | error = perform_atomic_semop(sma, sops, nsops, un, |
| 1799 | task_tgid_vnr(current)); | 1852 | task_tgid_vnr(current)); |
| 1800 | if (error <= 0) { | 1853 | if (error == 0) { |
| 1801 | if (alter && error == 0) | 1854 | /* If the operation was successful, then do |
| 1855 | * the required updates. | ||
| 1856 | */ | ||
| 1857 | if (alter) | ||
| 1802 | do_smart_update(sma, sops, nsops, 1, &tasks); | 1858 | do_smart_update(sma, sops, nsops, 1, &tasks); |
| 1803 | 1859 | else | |
| 1804 | goto out_unlock_free; | 1860 | set_semotime(sma, sops); |
| 1805 | } | 1861 | } |
| 1862 | if (error <= 0) | ||
| 1863 | goto out_unlock_free; | ||
| 1806 | 1864 | ||
| 1807 | /* We need to sleep on this operation, so we put the current | 1865 | /* We need to sleep on this operation, so we put the current |
| 1808 | * task into the pending queue and go to sleep. | 1866 | * task into the pending queue and go to sleep. |
| @@ -2061,6 +2119,14 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it) | |||
| 2061 | struct sem_array *sma = it; | 2119 | struct sem_array *sma = it; |
| 2062 | time_t sem_otime; | 2120 | time_t sem_otime; |
| 2063 | 2121 | ||
| 2122 | /* | ||
| 2123 | * The proc interface isn't aware of sem_lock(), it calls | ||
| 2124 | * ipc_lock_object() directly (in sysvipc_find_ipc). | ||
| 2125 | * In order to stay compatible with sem_lock(), we must wait until | ||
| 2126 | * all simple semop() calls have left their critical regions. | ||
| 2127 | */ | ||
| 2128 | sem_wait_array(sma); | ||
| 2129 | |||
| 2064 | sem_otime = get_semotime(sma); | 2130 | sem_otime = get_semotime(sma); |
| 2065 | 2131 | ||
| 2066 | return seq_printf(s, | 2132 | return seq_printf(s, |
diff --git a/kernel/kmod.c b/kernel/kmod.c index fb326365b694..b086006c59e7 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -571,6 +571,10 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait) | |||
| 571 | DECLARE_COMPLETION_ONSTACK(done); | 571 | DECLARE_COMPLETION_ONSTACK(done); |
| 572 | int retval = 0; | 572 | int retval = 0; |
| 573 | 573 | ||
| 574 | if (!sub_info->path) { | ||
| 575 | call_usermodehelper_freeinfo(sub_info); | ||
| 576 | return -EINVAL; | ||
| 577 | } | ||
| 574 | helper_lock(); | 578 | helper_lock(); |
| 575 | if (!khelper_wq || usermodehelper_disabled) { | 579 | if (!khelper_wq || usermodehelper_disabled) { |
| 576 | retval = -EBUSY; | 580 | retval = -EBUSY; |
diff --git a/kernel/pid.c b/kernel/pid.c index ebe5e80b10f8..9b9a26698144 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
| @@ -273,6 +273,11 @@ void free_pid(struct pid *pid) | |||
| 273 | */ | 273 | */ |
| 274 | wake_up_process(ns->child_reaper); | 274 | wake_up_process(ns->child_reaper); |
| 275 | break; | 275 | break; |
| 276 | case PIDNS_HASH_ADDING: | ||
| 277 | /* Handle a fork failure of the first process */ | ||
| 278 | WARN_ON(ns->child_reaper); | ||
| 279 | ns->nr_hashed = 0; | ||
| 280 | /* fall through */ | ||
| 276 | case 0: | 281 | case 0: |
| 277 | schedule_work(&ns->proc_work); | 282 | schedule_work(&ns->proc_work); |
| 278 | break; | 283 | break; |
diff --git a/mm/bounce.c b/mm/bounce.c index c9f0a4339a7d..5a7d58fb883b 100644 --- a/mm/bounce.c +++ b/mm/bounce.c | |||
| @@ -204,6 +204,8 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig, | |||
| 204 | struct bio_vec *to, *from; | 204 | struct bio_vec *to, *from; |
| 205 | unsigned i; | 205 | unsigned i; |
| 206 | 206 | ||
| 207 | if (force) | ||
| 208 | goto bounce; | ||
| 207 | bio_for_each_segment(from, *bio_orig, i) | 209 | bio_for_each_segment(from, *bio_orig, i) |
| 208 | if (page_to_pfn(from->bv_page) > queue_bounce_pfn(q)) | 210 | if (page_to_pfn(from->bv_page) > queue_bounce_pfn(q)) |
| 209 | goto bounce; | 211 | goto bounce; |
diff --git a/mm/compaction.c b/mm/compaction.c index c43789388cd8..b5326b141a25 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
| @@ -677,6 +677,13 @@ static void isolate_freepages(struct zone *zone, | |||
| 677 | pfn -= pageblock_nr_pages) { | 677 | pfn -= pageblock_nr_pages) { |
| 678 | unsigned long isolated; | 678 | unsigned long isolated; |
| 679 | 679 | ||
| 680 | /* | ||
| 681 | * This can iterate a massively long zone without finding any | ||
| 682 | * suitable migration targets, so periodically check if we need | ||
| 683 | * to schedule. | ||
| 684 | */ | ||
| 685 | cond_resched(); | ||
| 686 | |||
| 680 | if (!pfn_valid(pfn)) | 687 | if (!pfn_valid(pfn)) |
| 681 | continue; | 688 | continue; |
| 682 | 689 | ||
diff --git a/mm/hwpoison-inject.c b/mm/hwpoison-inject.c index afc2daa91c60..4c84678371eb 100644 --- a/mm/hwpoison-inject.c +++ b/mm/hwpoison-inject.c | |||
| @@ -20,8 +20,6 @@ static int hwpoison_inject(void *data, u64 val) | |||
| 20 | if (!capable(CAP_SYS_ADMIN)) | 20 | if (!capable(CAP_SYS_ADMIN)) |
| 21 | return -EPERM; | 21 | return -EPERM; |
| 22 | 22 | ||
| 23 | if (!hwpoison_filter_enable) | ||
| 24 | goto inject; | ||
| 25 | if (!pfn_valid(pfn)) | 23 | if (!pfn_valid(pfn)) |
| 26 | return -ENXIO; | 24 | return -ENXIO; |
| 27 | 25 | ||
| @@ -33,6 +31,9 @@ static int hwpoison_inject(void *data, u64 val) | |||
| 33 | if (!get_page_unless_zero(hpage)) | 31 | if (!get_page_unless_zero(hpage)) |
| 34 | return 0; | 32 | return 0; |
| 35 | 33 | ||
| 34 | if (!hwpoison_filter_enable) | ||
| 35 | goto inject; | ||
| 36 | |||
| 36 | if (!PageLRU(p) && !PageHuge(p)) | 37 | if (!PageLRU(p) && !PageHuge(p)) |
| 37 | shake_page(p, 0); | 38 | shake_page(p, 0); |
| 38 | /* | 39 | /* |
diff --git a/mm/madvise.c b/mm/madvise.c index 6975bc812542..539eeb96b323 100644 --- a/mm/madvise.c +++ b/mm/madvise.c | |||
| @@ -343,10 +343,11 @@ static long madvise_remove(struct vm_area_struct *vma, | |||
| 343 | */ | 343 | */ |
| 344 | static int madvise_hwpoison(int bhv, unsigned long start, unsigned long end) | 344 | static int madvise_hwpoison(int bhv, unsigned long start, unsigned long end) |
| 345 | { | 345 | { |
| 346 | struct page *p; | ||
| 346 | if (!capable(CAP_SYS_ADMIN)) | 347 | if (!capable(CAP_SYS_ADMIN)) |
| 347 | return -EPERM; | 348 | return -EPERM; |
| 348 | for (; start < end; start += PAGE_SIZE) { | 349 | for (; start < end; start += PAGE_SIZE << |
| 349 | struct page *p; | 350 | compound_order(compound_head(p))) { |
| 350 | int ret; | 351 | int ret; |
| 351 | 352 | ||
| 352 | ret = get_user_pages_fast(start, 1, 0, &p); | 353 | ret = get_user_pages_fast(start, 1, 0, &p); |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 947ed5413279..bf3351b5115e 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -1114,8 +1114,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags) | |||
| 1114 | * shake_page could have turned it free. | 1114 | * shake_page could have turned it free. |
| 1115 | */ | 1115 | */ |
| 1116 | if (is_free_buddy_page(p)) { | 1116 | if (is_free_buddy_page(p)) { |
| 1117 | action_result(pfn, "free buddy, 2nd try", | 1117 | if (flags & MF_COUNT_INCREASED) |
| 1118 | DELAYED); | 1118 | action_result(pfn, "free buddy", DELAYED); |
| 1119 | else | ||
| 1120 | action_result(pfn, "free buddy, 2nd try", DELAYED); | ||
| 1119 | return 0; | 1121 | return 0; |
| 1120 | } | 1122 | } |
| 1121 | action_result(pfn, "non LRU", IGNORED); | 1123 | action_result(pfn, "non LRU", IGNORED); |
| @@ -1349,7 +1351,7 @@ int unpoison_memory(unsigned long pfn) | |||
| 1349 | * worked by memory_failure() and the page lock is not held yet. | 1351 | * worked by memory_failure() and the page lock is not held yet. |
| 1350 | * In such case, we yield to memory_failure() and make unpoison fail. | 1352 | * In such case, we yield to memory_failure() and make unpoison fail. |
| 1351 | */ | 1353 | */ |
| 1352 | if (PageTransHuge(page)) { | 1354 | if (!PageHuge(page) && PageTransHuge(page)) { |
| 1353 | pr_info("MCE: Memory failure is now running on %#lx\n", pfn); | 1355 | pr_info("MCE: Memory failure is now running on %#lx\n", pfn); |
| 1354 | return 0; | 1356 | return 0; |
| 1355 | } | 1357 | } |
diff --git a/mm/migrate.c b/mm/migrate.c index 9c8d5f59d30b..a26bccd44ccb 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -107,7 +107,7 @@ void putback_movable_pages(struct list_head *l) | |||
| 107 | list_del(&page->lru); | 107 | list_del(&page->lru); |
| 108 | dec_zone_page_state(page, NR_ISOLATED_ANON + | 108 | dec_zone_page_state(page, NR_ISOLATED_ANON + |
| 109 | page_is_file_cache(page)); | 109 | page_is_file_cache(page)); |
| 110 | if (unlikely(balloon_page_movable(page))) | 110 | if (unlikely(isolated_balloon_page(page))) |
| 111 | balloon_page_putback(page); | 111 | balloon_page_putback(page); |
| 112 | else | 112 | else |
| 113 | putback_lru_page(page); | 113 | putback_lru_page(page); |
diff --git a/mm/mlock.c b/mm/mlock.c index 67ba6da7d0e3..d480cd6fc475 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
| @@ -379,10 +379,14 @@ static unsigned long __munlock_pagevec_fill(struct pagevec *pvec, | |||
| 379 | 379 | ||
| 380 | /* | 380 | /* |
| 381 | * Initialize pte walk starting at the already pinned page where we | 381 | * Initialize pte walk starting at the already pinned page where we |
| 382 | * are sure that there is a pte. | 382 | * are sure that there is a pte, as it was pinned under the same |
| 383 | * mmap_sem write op. | ||
| 383 | */ | 384 | */ |
| 384 | pte = get_locked_pte(vma->vm_mm, start, &ptl); | 385 | pte = get_locked_pte(vma->vm_mm, start, &ptl); |
| 385 | end = min(end, pmd_addr_end(start, end)); | 386 | /* Make sure we do not cross the page table boundary */ |
| 387 | end = pgd_addr_end(start, end); | ||
| 388 | end = pud_addr_end(start, end); | ||
| 389 | end = pmd_addr_end(start, end); | ||
| 386 | 390 | ||
| 387 | /* The page next to the pinned page is the first we will try to get */ | 391 | /* The page next to the pinned page is the first we will try to get */ |
| 388 | start += PAGE_SIZE; | 392 | start += PAGE_SIZE; |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0ee638f76ebe..dd886fac451a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -6366,10 +6366,6 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) | |||
| 6366 | list_del(&page->lru); | 6366 | list_del(&page->lru); |
| 6367 | rmv_page_order(page); | 6367 | rmv_page_order(page); |
| 6368 | zone->free_area[order].nr_free--; | 6368 | zone->free_area[order].nr_free--; |
| 6369 | #ifdef CONFIG_HIGHMEM | ||
| 6370 | if (PageHighMem(page)) | ||
| 6371 | totalhigh_pages -= 1 << order; | ||
| 6372 | #endif | ||
| 6373 | for (i = 0; i < (1 << order); i++) | 6369 | for (i = 0; i < (1 << order); i++) |
| 6374 | SetPageReserved((page+i)); | 6370 | SetPageReserved((page+i)); |
| 6375 | pfn += (1 << order); | 6371 | pfn += (1 << order); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index beb35778c69f..53f2f82f83ae 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -48,6 +48,7 @@ | |||
| 48 | #include <asm/div64.h> | 48 | #include <asm/div64.h> |
| 49 | 49 | ||
| 50 | #include <linux/swapops.h> | 50 | #include <linux/swapops.h> |
| 51 | #include <linux/balloon_compaction.h> | ||
| 51 | 52 | ||
| 52 | #include "internal.h" | 53 | #include "internal.h" |
| 53 | 54 | ||
| @@ -1113,7 +1114,8 @@ unsigned long reclaim_clean_pages_from_list(struct zone *zone, | |||
| 1113 | LIST_HEAD(clean_pages); | 1114 | LIST_HEAD(clean_pages); |
| 1114 | 1115 | ||
| 1115 | list_for_each_entry_safe(page, next, page_list, lru) { | 1116 | list_for_each_entry_safe(page, next, page_list, lru) { |
| 1116 | if (page_is_file_cache(page) && !PageDirty(page)) { | 1117 | if (page_is_file_cache(page) && !PageDirty(page) && |
| 1118 | !isolated_balloon_page(page)) { | ||
| 1117 | ClearPageActive(page); | 1119 | ClearPageActive(page); |
| 1118 | list_move(&page->lru, &clean_pages); | 1120 | list_move(&page->lru, &clean_pages); |
| 1119 | } | 1121 | } |
