diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-30 17:32:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-30 17:32:32 -0400 |
commit | 522d6d38f83a3809d26db7e24fafc56404693606 (patch) | |
tree | 7f08a58f5562b915c5e81e13347fa664c894898e | |
parent | df532d54d024f69446a13c31898cad6ac6b775ca (diff) | |
parent | 314a8ad0f18ac37887896b288939acd8cb17e208 (diff) |
Merge branch 'akpm' (fixes from Andrew Morton)
Merge misc fixes from Andrew Morton.
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (22 commits)
pidns: fix free_pid() to handle the first fork failure
ipc,msg: prevent race with rmid in msgsnd,msgrcv
ipc/sem.c: update sem_otime for all operations
mm/hwpoison: fix the lack of one reference count against poisoned page
mm/hwpoison: fix false report on 2nd attempt at page recovery
mm/hwpoison: fix test for a transparent huge page
mm/hwpoison: fix traversal of hugetlbfs pages to avoid printk flood
block: change config option name for cmdline partition parsing
mm/mlock.c: prevent walking off the end of a pagetable in no-pmd configuration
mm: avoid reinserting isolated balloon pages into LRU lists
arch/parisc/mm/fault.c: fix uninitialized variable usage
include/asm-generic/vtime.h: avoid zero-length file
nilfs2: fix issue with race condition of competition between segments for dirty blocks
Documentation/kernel-parameters.txt: replace kernelcore with Movable
mm/bounce.c: fix a regression where MS_SNAP_STABLE (stable pages snapshotting) was ignored
kernel/kmod.c: check for NULL in call_usermodehelper_exec()
ipc/sem.c: synchronize the proc interface
ipc/sem.c: optimize sem_lock()
ipc/sem.c: fix race in sem_lock()
mm/compaction.c: periodically schedule when freeing pages
...
-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 | } |