diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-12 17:15:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-12 17:15:21 -0400 |
| commit | ecca5c3acc0d0933d89abc44e60afb0cc8170e35 (patch) | |
| tree | e765a76f8bf07717b4c446193bc4e2601b4fd038 | |
| parent | 174808af90a06ee59ffedd60c00c252f1f887f25 (diff) | |
| parent | 026ee1f66aaa7f01b617a0ba89ac4b531f9603f1 (diff) | |
Merge branch 'akpm' (Andrew's patch-bomb)
Merge fixes from Andrew Morton.
* emailed from Andrew Morton <akpm@linux-foundation.org>: (14 patches)
panic: fix stack dump print on direct call to panic()
drivers/rtc/rtc-pl031.c: enable clock on all ST variants
Revert "mm: vmscan: fix misused nr_reclaimed in shrink_mem_cgroup_zone()"
hugetlb: fix race condition in hugetlb_fault()
drivers/rtc/rtc-twl.c: use static register while reading time
drivers/rtc/rtc-s3c.c: add placeholder for driver private data
drivers/rtc/rtc-s3c.c: fix compilation error
MAINTAINERS: add PCDP console maintainer
memcg: do not open code accesses to res_counter members
drivers/rtc/rtc-efi.c: fix section mismatch warning
drivers/rtc/rtc-r9701.c: reset registers if invalid values are detected
drivers/char/random.c: fix boot id uniqueness race
memcg: fix broken boolen expression
memcg: fix up documentation on global LRU
| -rw-r--r-- | Documentation/cgroups/memory.txt | 5 | ||||
| -rw-r--r-- | MAINTAINERS | 5 | ||||
| -rw-r--r-- | drivers/char/random.c | 11 | ||||
| -rw-r--r-- | drivers/rtc/rtc-efi.c | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-pl031.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-r9701.c | 22 | ||||
| -rw-r--r-- | drivers/rtc/rtc-s3c.c | 31 | ||||
| -rw-r--r-- | drivers/rtc/rtc-twl.c | 43 | ||||
| -rw-r--r-- | kernel/panic.c | 2 | ||||
| -rw-r--r-- | mm/hugetlb.c | 2 | ||||
| -rw-r--r-- | mm/memcontrol.c | 6 | ||||
| -rw-r--r-- | mm/vmscan.c | 7 |
12 files changed, 105 insertions, 33 deletions
diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index 4c95c0034a4b..9b1067afb224 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt | |||
| @@ -34,8 +34,7 @@ Current Status: linux-2.6.34-mmotm(development version of 2010/April) | |||
| 34 | 34 | ||
| 35 | Features: | 35 | Features: |
| 36 | - accounting anonymous pages, file caches, swap caches usage and limiting them. | 36 | - accounting anonymous pages, file caches, swap caches usage and limiting them. |
| 37 | - private LRU and reclaim routine. (system's global LRU and private LRU | 37 | - pages are linked to per-memcg LRU exclusively, and there is no global LRU. |
| 38 | work independently from each other) | ||
| 39 | - optionally, memory+swap usage can be accounted and limited. | 38 | - optionally, memory+swap usage can be accounted and limited. |
| 40 | - hierarchical accounting | 39 | - hierarchical accounting |
| 41 | - soft limit | 40 | - soft limit |
| @@ -154,7 +153,7 @@ updated. page_cgroup has its own LRU on cgroup. | |||
| 154 | 2.2.1 Accounting details | 153 | 2.2.1 Accounting details |
| 155 | 154 | ||
| 156 | All mapped anon pages (RSS) and cache pages (Page Cache) are accounted. | 155 | All mapped anon pages (RSS) and cache pages (Page Cache) are accounted. |
| 157 | Some pages which are never reclaimable and will not be on the global LRU | 156 | Some pages which are never reclaimable and will not be on the LRU |
| 158 | are not accounted. We just account pages under usual VM management. | 157 | are not accounted. We just account pages under usual VM management. |
| 159 | 158 | ||
| 160 | RSS pages are accounted at page_fault unless they've already been accounted | 159 | RSS pages are accounted at page_fault unless they've already been accounted |
diff --git a/MAINTAINERS b/MAINTAINERS index f08bac96c431..32671e00800d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -5117,6 +5117,11 @@ F: drivers/i2c/busses/i2c-pca-* | |||
| 5117 | F: include/linux/i2c-algo-pca.h | 5117 | F: include/linux/i2c-algo-pca.h |
| 5118 | F: include/linux/i2c-pca-platform.h | 5118 | F: include/linux/i2c-pca-platform.h |
| 5119 | 5119 | ||
| 5120 | PCDP - PRIMARY CONSOLE AND DEBUG PORT | ||
| 5121 | M: Khalid Aziz <khalid.aziz@hp.com> | ||
| 5122 | S: Maintained | ||
| 5123 | F: drivers/firmware/pcdp.* | ||
| 5124 | |||
| 5120 | PCI ERROR RECOVERY | 5125 | PCI ERROR RECOVERY |
| 5121 | M: Linas Vepstas <linasvepstas@gmail.com> | 5126 | M: Linas Vepstas <linasvepstas@gmail.com> |
| 5122 | L: linux-pci@vger.kernel.org | 5127 | L: linux-pci@vger.kernel.org |
diff --git a/drivers/char/random.c b/drivers/char/random.c index 54ca8b23cde3..4ec04a754733 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
| @@ -1260,10 +1260,15 @@ static int proc_do_uuid(ctl_table *table, int write, | |||
| 1260 | uuid = table->data; | 1260 | uuid = table->data; |
| 1261 | if (!uuid) { | 1261 | if (!uuid) { |
| 1262 | uuid = tmp_uuid; | 1262 | uuid = tmp_uuid; |
| 1263 | uuid[8] = 0; | ||
| 1264 | } | ||
| 1265 | if (uuid[8] == 0) | ||
| 1266 | generate_random_uuid(uuid); | 1263 | generate_random_uuid(uuid); |
| 1264 | } else { | ||
| 1265 | static DEFINE_SPINLOCK(bootid_spinlock); | ||
| 1266 | |||
| 1267 | spin_lock(&bootid_spinlock); | ||
| 1268 | if (!uuid[8]) | ||
| 1269 | generate_random_uuid(uuid); | ||
| 1270 | spin_unlock(&bootid_spinlock); | ||
| 1271 | } | ||
| 1267 | 1272 | ||
| 1268 | sprintf(buf, "%pU", uuid); | 1273 | sprintf(buf, "%pU", uuid); |
| 1269 | 1274 | ||
diff --git a/drivers/rtc/rtc-efi.c b/drivers/rtc/rtc-efi.c index 550292304b0f..c9f890b088da 100644 --- a/drivers/rtc/rtc-efi.c +++ b/drivers/rtc/rtc-efi.c | |||
| @@ -213,7 +213,6 @@ static struct platform_driver efi_rtc_driver = { | |||
| 213 | .name = "rtc-efi", | 213 | .name = "rtc-efi", |
| 214 | .owner = THIS_MODULE, | 214 | .owner = THIS_MODULE, |
| 215 | }, | 215 | }, |
| 216 | .probe = efi_rtc_probe, | ||
| 217 | .remove = __exit_p(efi_rtc_remove), | 216 | .remove = __exit_p(efi_rtc_remove), |
| 218 | }; | 217 | }; |
| 219 | 218 | ||
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 692de7360e94..684ef4bbfce4 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
| @@ -339,8 +339,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 339 | dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision); | 339 | dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision); |
| 340 | 340 | ||
| 341 | /* Enable the clockwatch on ST Variants */ | 341 | /* Enable the clockwatch on ST Variants */ |
| 342 | if ((ldata->hw_designer == AMBA_VENDOR_ST) && | 342 | if (ldata->hw_designer == AMBA_VENDOR_ST) |
| 343 | (ldata->hw_revision > 1)) | ||
| 344 | writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, | 343 | writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, |
| 345 | ldata->base + RTC_CR); | 344 | ldata->base + RTC_CR); |
| 346 | 345 | ||
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index 7f8e6c247935..33b6ba0afa0d 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c | |||
| @@ -122,6 +122,7 @@ static const struct rtc_class_ops r9701_rtc_ops = { | |||
| 122 | static int __devinit r9701_probe(struct spi_device *spi) | 122 | static int __devinit r9701_probe(struct spi_device *spi) |
| 123 | { | 123 | { |
| 124 | struct rtc_device *rtc; | 124 | struct rtc_device *rtc; |
| 125 | struct rtc_time dt; | ||
| 125 | unsigned char tmp; | 126 | unsigned char tmp; |
| 126 | int res; | 127 | int res; |
| 127 | 128 | ||
| @@ -132,6 +133,27 @@ static int __devinit r9701_probe(struct spi_device *spi) | |||
| 132 | return -ENODEV; | 133 | return -ENODEV; |
| 133 | } | 134 | } |
| 134 | 135 | ||
| 136 | /* | ||
| 137 | * The device seems to be present. Now check if the registers | ||
| 138 | * contain invalid values. If so, try to write a default date: | ||
| 139 | * 2000/1/1 00:00:00 | ||
| 140 | */ | ||
| 141 | r9701_get_datetime(&spi->dev, &dt); | ||
| 142 | if (rtc_valid_tm(&dt)) { | ||
| 143 | dev_info(&spi->dev, "trying to repair invalid date/time\n"); | ||
| 144 | dt.tm_sec = 0; | ||
| 145 | dt.tm_min = 0; | ||
| 146 | dt.tm_hour = 0; | ||
| 147 | dt.tm_mday = 1; | ||
| 148 | dt.tm_mon = 0; | ||
| 149 | dt.tm_year = 100; | ||
| 150 | |||
| 151 | if (r9701_set_datetime(&spi->dev, &dt)) { | ||
| 152 | dev_err(&spi->dev, "cannot repair RTC register\n"); | ||
| 153 | return -ENODEV; | ||
| 154 | } | ||
| 155 | } | ||
| 156 | |||
| 135 | rtc = rtc_device_register("r9701", | 157 | rtc = rtc_device_register("r9701", |
| 136 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); | 158 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); |
| 137 | if (IS_ERR(rtc)) | 159 | if (IS_ERR(rtc)) |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 9ccea134a996..3f3a29752369 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -40,6 +40,10 @@ enum s3c_cpu_type { | |||
| 40 | TYPE_S3C64XX, | 40 | TYPE_S3C64XX, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | struct s3c_rtc_drv_data { | ||
| 44 | int cpu_type; | ||
| 45 | }; | ||
| 46 | |||
| 43 | /* I have yet to find an S3C implementation with more than one | 47 | /* I have yet to find an S3C implementation with more than one |
| 44 | * of these rtc blocks in */ | 48 | * of these rtc blocks in */ |
| 45 | 49 | ||
| @@ -446,10 +450,12 @@ static const struct of_device_id s3c_rtc_dt_match[]; | |||
| 446 | static inline int s3c_rtc_get_driver_data(struct platform_device *pdev) | 450 | static inline int s3c_rtc_get_driver_data(struct platform_device *pdev) |
| 447 | { | 451 | { |
| 448 | #ifdef CONFIG_OF | 452 | #ifdef CONFIG_OF |
| 453 | struct s3c_rtc_drv_data *data; | ||
| 449 | if (pdev->dev.of_node) { | 454 | if (pdev->dev.of_node) { |
| 450 | const struct of_device_id *match; | 455 | const struct of_device_id *match; |
| 451 | match = of_match_node(s3c_rtc_dt_match, pdev->dev.of_node); | 456 | match = of_match_node(s3c_rtc_dt_match, pdev->dev.of_node); |
| 452 | return match->data; | 457 | data = (struct s3c_rtc_drv_data *) match->data; |
| 458 | return data->cpu_type; | ||
| 453 | } | 459 | } |
| 454 | #endif | 460 | #endif |
| 455 | return platform_get_device_id(pdev)->driver_data; | 461 | return platform_get_device_id(pdev)->driver_data; |
| @@ -664,20 +670,27 @@ static int s3c_rtc_resume(struct platform_device *pdev) | |||
| 664 | #define s3c_rtc_resume NULL | 670 | #define s3c_rtc_resume NULL |
| 665 | #endif | 671 | #endif |
| 666 | 672 | ||
| 673 | static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = { | ||
| 674 | [TYPE_S3C2410] = { TYPE_S3C2410 }, | ||
| 675 | [TYPE_S3C2416] = { TYPE_S3C2416 }, | ||
| 676 | [TYPE_S3C2443] = { TYPE_S3C2443 }, | ||
| 677 | [TYPE_S3C64XX] = { TYPE_S3C64XX }, | ||
| 678 | }; | ||
| 679 | |||
| 667 | #ifdef CONFIG_OF | 680 | #ifdef CONFIG_OF |
| 668 | static const struct of_device_id s3c_rtc_dt_match[] = { | 681 | static const struct of_device_id s3c_rtc_dt_match[] = { |
| 669 | { | 682 | { |
| 670 | .compatible = "samsung,s3c2410-rtc" | 683 | .compatible = "samsung,s3c2410-rtc", |
| 671 | .data = TYPE_S3C2410, | 684 | .data = &s3c_rtc_drv_data_array[TYPE_S3C2410], |
| 672 | }, { | 685 | }, { |
| 673 | .compatible = "samsung,s3c2416-rtc" | 686 | .compatible = "samsung,s3c2416-rtc", |
| 674 | .data = TYPE_S3C2416, | 687 | .data = &s3c_rtc_drv_data_array[TYPE_S3C2416], |
| 675 | }, { | 688 | }, { |
| 676 | .compatible = "samsung,s3c2443-rtc" | 689 | .compatible = "samsung,s3c2443-rtc", |
| 677 | .data = TYPE_S3C2443, | 690 | .data = &s3c_rtc_drv_data_array[TYPE_S3C2443], |
| 678 | }, { | 691 | }, { |
| 679 | .compatible = "samsung,s3c6410-rtc" | 692 | .compatible = "samsung,s3c6410-rtc", |
| 680 | .data = TYPE_S3C64XX, | 693 | .data = &s3c_rtc_drv_data_array[TYPE_S3C64XX], |
| 681 | }, | 694 | }, |
| 682 | {}, | 695 | {}, |
| 683 | }; | 696 | }; |
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 4c2c6df2a9ef..258abeabf624 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
| @@ -112,6 +112,7 @@ static const u8 twl6030_rtc_reg_map[] = { | |||
| 112 | #define BIT_RTC_CTRL_REG_TEST_MODE_M 0x10 | 112 | #define BIT_RTC_CTRL_REG_TEST_MODE_M 0x10 |
| 113 | #define BIT_RTC_CTRL_REG_SET_32_COUNTER_M 0x20 | 113 | #define BIT_RTC_CTRL_REG_SET_32_COUNTER_M 0x20 |
| 114 | #define BIT_RTC_CTRL_REG_GET_TIME_M 0x40 | 114 | #define BIT_RTC_CTRL_REG_GET_TIME_M 0x40 |
| 115 | #define BIT_RTC_CTRL_REG_RTC_V_OPT 0x80 | ||
| 115 | 116 | ||
| 116 | /* RTC_STATUS_REG bitfields */ | 117 | /* RTC_STATUS_REG bitfields */ |
| 117 | #define BIT_RTC_STATUS_REG_RUN_M 0x02 | 118 | #define BIT_RTC_STATUS_REG_RUN_M 0x02 |
| @@ -235,25 +236,57 @@ static int twl_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 235 | unsigned char rtc_data[ALL_TIME_REGS + 1]; | 236 | unsigned char rtc_data[ALL_TIME_REGS + 1]; |
| 236 | int ret; | 237 | int ret; |
| 237 | u8 save_control; | 238 | u8 save_control; |
| 239 | u8 rtc_control; | ||
| 238 | 240 | ||
| 239 | ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG); | 241 | ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG); |
| 240 | if (ret < 0) | 242 | if (ret < 0) { |
| 243 | dev_err(dev, "%s: reading CTRL_REG, error %d\n", __func__, ret); | ||
| 241 | return ret; | 244 | return ret; |
| 245 | } | ||
| 246 | /* for twl6030/32 make sure BIT_RTC_CTRL_REG_GET_TIME_M is clear */ | ||
| 247 | if (twl_class_is_6030()) { | ||
| 248 | if (save_control & BIT_RTC_CTRL_REG_GET_TIME_M) { | ||
| 249 | save_control &= ~BIT_RTC_CTRL_REG_GET_TIME_M; | ||
| 250 | ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG); | ||
| 251 | if (ret < 0) { | ||
| 252 | dev_err(dev, "%s clr GET_TIME, error %d\n", | ||
| 253 | __func__, ret); | ||
| 254 | return ret; | ||
| 255 | } | ||
| 256 | } | ||
| 257 | } | ||
| 242 | 258 | ||
| 243 | save_control |= BIT_RTC_CTRL_REG_GET_TIME_M; | 259 | /* Copy RTC counting registers to static registers or latches */ |
| 260 | rtc_control = save_control | BIT_RTC_CTRL_REG_GET_TIME_M; | ||
| 244 | 261 | ||
| 245 | ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG); | 262 | /* for twl6030/32 enable read access to static shadowed registers */ |
| 246 | if (ret < 0) | 263 | if (twl_class_is_6030()) |
| 264 | rtc_control |= BIT_RTC_CTRL_REG_RTC_V_OPT; | ||
| 265 | |||
| 266 | ret = twl_rtc_write_u8(rtc_control, REG_RTC_CTRL_REG); | ||
| 267 | if (ret < 0) { | ||
| 268 | dev_err(dev, "%s: writing CTRL_REG, error %d\n", __func__, ret); | ||
| 247 | return ret; | 269 | return ret; |
| 270 | } | ||
| 248 | 271 | ||
| 249 | ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data, | 272 | ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data, |
| 250 | (rtc_reg_map[REG_SECONDS_REG]), ALL_TIME_REGS); | 273 | (rtc_reg_map[REG_SECONDS_REG]), ALL_TIME_REGS); |
| 251 | 274 | ||
| 252 | if (ret < 0) { | 275 | if (ret < 0) { |
| 253 | dev_err(dev, "rtc_read_time error %d\n", ret); | 276 | dev_err(dev, "%s: reading data, error %d\n", __func__, ret); |
| 254 | return ret; | 277 | return ret; |
| 255 | } | 278 | } |
| 256 | 279 | ||
| 280 | /* for twl6030 restore original state of rtc control register */ | ||
| 281 | if (twl_class_is_6030()) { | ||
| 282 | ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG); | ||
| 283 | if (ret < 0) { | ||
| 284 | dev_err(dev, "%s: restore CTRL_REG, error %d\n", | ||
| 285 | __func__, ret); | ||
| 286 | return ret; | ||
| 287 | } | ||
| 288 | } | ||
| 289 | |||
| 257 | tm->tm_sec = bcd2bin(rtc_data[0]); | 290 | tm->tm_sec = bcd2bin(rtc_data[0]); |
| 258 | tm->tm_min = bcd2bin(rtc_data[1]); | 291 | tm->tm_min = bcd2bin(rtc_data[1]); |
| 259 | tm->tm_hour = bcd2bin(rtc_data[2]); | 292 | tm->tm_hour = bcd2bin(rtc_data[2]); |
diff --git a/kernel/panic.c b/kernel/panic.c index 80aed44e345a..8ed89a175d79 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -97,7 +97,7 @@ void panic(const char *fmt, ...) | |||
| 97 | /* | 97 | /* |
| 98 | * Avoid nested stack-dumping if a panic occurs during oops processing | 98 | * Avoid nested stack-dumping if a panic occurs during oops processing |
| 99 | */ | 99 | */ |
| 100 | if (!oops_in_progress) | 100 | if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) |
| 101 | dump_stack(); | 101 | dump_stack(); |
| 102 | #endif | 102 | #endif |
| 103 | 103 | ||
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index b8ce6f450956..cd65cb19c941 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -2791,6 +2791,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2791 | * so no worry about deadlock. | 2791 | * so no worry about deadlock. |
| 2792 | */ | 2792 | */ |
| 2793 | page = pte_page(entry); | 2793 | page = pte_page(entry); |
| 2794 | get_page(page); | ||
| 2794 | if (page != pagecache_page) | 2795 | if (page != pagecache_page) |
| 2795 | lock_page(page); | 2796 | lock_page(page); |
| 2796 | 2797 | ||
| @@ -2822,6 +2823,7 @@ out_page_table_lock: | |||
| 2822 | } | 2823 | } |
| 2823 | if (page != pagecache_page) | 2824 | if (page != pagecache_page) |
| 2824 | unlock_page(page); | 2825 | unlock_page(page); |
| 2826 | put_page(page); | ||
| 2825 | 2827 | ||
| 2826 | out_mutex: | 2828 | out_mutex: |
| 2827 | mutex_unlock(&hugetlb_instantiation_mutex); | 2829 | mutex_unlock(&hugetlb_instantiation_mutex); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7d698df4a067..a7165a60d0a7 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -2165,7 +2165,7 @@ static int __cpuinit memcg_cpu_hotplug_callback(struct notifier_block *nb, | |||
| 2165 | if (action == CPU_ONLINE) | 2165 | if (action == CPU_ONLINE) |
| 2166 | return NOTIFY_OK; | 2166 | return NOTIFY_OK; |
| 2167 | 2167 | ||
| 2168 | if ((action != CPU_DEAD) || action != CPU_DEAD_FROZEN) | 2168 | if (action != CPU_DEAD && action != CPU_DEAD_FROZEN) |
| 2169 | return NOTIFY_OK; | 2169 | return NOTIFY_OK; |
| 2170 | 2170 | ||
| 2171 | for_each_mem_cgroup(iter) | 2171 | for_each_mem_cgroup(iter) |
| @@ -3763,7 +3763,7 @@ move_account: | |||
| 3763 | goto try_to_free; | 3763 | goto try_to_free; |
| 3764 | cond_resched(); | 3764 | cond_resched(); |
| 3765 | /* "ret" should also be checked to ensure all lists are empty. */ | 3765 | /* "ret" should also be checked to ensure all lists are empty. */ |
| 3766 | } while (memcg->res.usage > 0 || ret); | 3766 | } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0 || ret); |
| 3767 | out: | 3767 | out: |
| 3768 | css_put(&memcg->css); | 3768 | css_put(&memcg->css); |
| 3769 | return ret; | 3769 | return ret; |
| @@ -3778,7 +3778,7 @@ try_to_free: | |||
| 3778 | lru_add_drain_all(); | 3778 | lru_add_drain_all(); |
| 3779 | /* try to free all pages in this cgroup */ | 3779 | /* try to free all pages in this cgroup */ |
| 3780 | shrink = 1; | 3780 | shrink = 1; |
| 3781 | while (nr_retries && memcg->res.usage > 0) { | 3781 | while (nr_retries && res_counter_read_u64(&memcg->res, RES_USAGE) > 0) { |
| 3782 | int progress; | 3782 | int progress; |
| 3783 | 3783 | ||
| 3784 | if (signal_pending(current)) { | 3784 | if (signal_pending(current)) { |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 33c332bbab73..1a518684a32f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -2107,12 +2107,7 @@ restart: | |||
| 2107 | * with multiple processes reclaiming pages, the total | 2107 | * with multiple processes reclaiming pages, the total |
| 2108 | * freeing target can get unreasonably large. | 2108 | * freeing target can get unreasonably large. |
| 2109 | */ | 2109 | */ |
| 2110 | if (nr_reclaimed >= nr_to_reclaim) | 2110 | if (nr_reclaimed >= nr_to_reclaim && priority < DEF_PRIORITY) |
| 2111 | nr_to_reclaim = 0; | ||
| 2112 | else | ||
| 2113 | nr_to_reclaim -= nr_reclaimed; | ||
| 2114 | |||
| 2115 | if (!nr_to_reclaim && priority < DEF_PRIORITY) | ||
| 2116 | break; | 2111 | break; |
| 2117 | } | 2112 | } |
| 2118 | blk_finish_plug(&plug); | 2113 | blk_finish_plug(&plug); |
