Commit ecca5c3a authored by Linus Torvalds's avatar Linus Torvalds

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
parents 174808af 026ee1f6
...@@ -34,8 +34,7 @@ Current Status: linux-2.6.34-mmotm(development version of 2010/April) ...@@ -34,8 +34,7 @@ Current Status: linux-2.6.34-mmotm(development version of 2010/April)
Features: Features:
- accounting anonymous pages, file caches, swap caches usage and limiting them. - accounting anonymous pages, file caches, swap caches usage and limiting them.
- private LRU and reclaim routine. (system's global LRU and private LRU - pages are linked to per-memcg LRU exclusively, and there is no global LRU.
work independently from each other)
- optionally, memory+swap usage can be accounted and limited. - optionally, memory+swap usage can be accounted and limited.
- hierarchical accounting - hierarchical accounting
- soft limit - soft limit
...@@ -154,7 +153,7 @@ updated. page_cgroup has its own LRU on cgroup. ...@@ -154,7 +153,7 @@ updated. page_cgroup has its own LRU on cgroup.
2.2.1 Accounting details 2.2.1 Accounting details
All mapped anon pages (RSS) and cache pages (Page Cache) are accounted. All mapped anon pages (RSS) and cache pages (Page Cache) are accounted.
Some pages which are never reclaimable and will not be on the global LRU Some pages which are never reclaimable and will not be on the LRU
are not accounted. We just account pages under usual VM management. are not accounted. We just account pages under usual VM management.
RSS pages are accounted at page_fault unless they've already been accounted RSS pages are accounted at page_fault unless they've already been accounted
......
...@@ -5117,6 +5117,11 @@ F: drivers/i2c/busses/i2c-pca-* ...@@ -5117,6 +5117,11 @@ F: drivers/i2c/busses/i2c-pca-*
F: include/linux/i2c-algo-pca.h F: include/linux/i2c-algo-pca.h
F: include/linux/i2c-pca-platform.h F: include/linux/i2c-pca-platform.h
PCDP - PRIMARY CONSOLE AND DEBUG PORT
M: Khalid Aziz <khalid.aziz@hp.com>
S: Maintained
F: drivers/firmware/pcdp.*
PCI ERROR RECOVERY PCI ERROR RECOVERY
M: Linas Vepstas <linasvepstas@gmail.com> M: Linas Vepstas <linasvepstas@gmail.com>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
......
...@@ -1260,10 +1260,15 @@ static int proc_do_uuid(ctl_table *table, int write, ...@@ -1260,10 +1260,15 @@ static int proc_do_uuid(ctl_table *table, int write,
uuid = table->data; uuid = table->data;
if (!uuid) { if (!uuid) {
uuid = tmp_uuid; uuid = tmp_uuid;
uuid[8] = 0;
}
if (uuid[8] == 0)
generate_random_uuid(uuid); generate_random_uuid(uuid);
} else {
static DEFINE_SPINLOCK(bootid_spinlock);
spin_lock(&bootid_spinlock);
if (!uuid[8])
generate_random_uuid(uuid);
spin_unlock(&bootid_spinlock);
}
sprintf(buf, "%pU", uuid); sprintf(buf, "%pU", uuid);
......
...@@ -213,7 +213,6 @@ static struct platform_driver efi_rtc_driver = { ...@@ -213,7 +213,6 @@ static struct platform_driver efi_rtc_driver = {
.name = "rtc-efi", .name = "rtc-efi",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = efi_rtc_probe,
.remove = __exit_p(efi_rtc_remove), .remove = __exit_p(efi_rtc_remove),
}; };
......
...@@ -339,8 +339,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -339,8 +339,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision); dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision);
/* Enable the clockwatch on ST Variants */ /* Enable the clockwatch on ST Variants */
if ((ldata->hw_designer == AMBA_VENDOR_ST) && if (ldata->hw_designer == AMBA_VENDOR_ST)
(ldata->hw_revision > 1))
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
ldata->base + RTC_CR); ldata->base + RTC_CR);
......
...@@ -122,6 +122,7 @@ static const struct rtc_class_ops r9701_rtc_ops = { ...@@ -122,6 +122,7 @@ static const struct rtc_class_ops r9701_rtc_ops = {
static int __devinit r9701_probe(struct spi_device *spi) static int __devinit r9701_probe(struct spi_device *spi)
{ {
struct rtc_device *rtc; struct rtc_device *rtc;
struct rtc_time dt;
unsigned char tmp; unsigned char tmp;
int res; int res;
...@@ -132,6 +133,27 @@ static int __devinit r9701_probe(struct spi_device *spi) ...@@ -132,6 +133,27 @@ static int __devinit r9701_probe(struct spi_device *spi)
return -ENODEV; return -ENODEV;
} }
/*
* The device seems to be present. Now check if the registers
* contain invalid values. If so, try to write a default date:
* 2000/1/1 00:00:00
*/
r9701_get_datetime(&spi->dev, &dt);
if (rtc_valid_tm(&dt)) {
dev_info(&spi->dev, "trying to repair invalid date/time\n");
dt.tm_sec = 0;
dt.tm_min = 0;
dt.tm_hour = 0;
dt.tm_mday = 1;
dt.tm_mon = 0;
dt.tm_year = 100;
if (r9701_set_datetime(&spi->dev, &dt)) {
dev_err(&spi->dev, "cannot repair RTC register\n");
return -ENODEV;
}
}
rtc = rtc_device_register("r9701", rtc = rtc_device_register("r9701",
&spi->dev, &r9701_rtc_ops, THIS_MODULE); &spi->dev, &r9701_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) if (IS_ERR(rtc))
......
...@@ -40,6 +40,10 @@ enum s3c_cpu_type { ...@@ -40,6 +40,10 @@ enum s3c_cpu_type {
TYPE_S3C64XX, TYPE_S3C64XX,
}; };
struct s3c_rtc_drv_data {
int cpu_type;
};
/* I have yet to find an S3C implementation with more than one /* I have yet to find an S3C implementation with more than one
* of these rtc blocks in */ * of these rtc blocks in */
...@@ -446,10 +450,12 @@ static const struct of_device_id s3c_rtc_dt_match[]; ...@@ -446,10 +450,12 @@ static const struct of_device_id s3c_rtc_dt_match[];
static inline int s3c_rtc_get_driver_data(struct platform_device *pdev) static inline int s3c_rtc_get_driver_data(struct platform_device *pdev)
{ {
#ifdef CONFIG_OF #ifdef CONFIG_OF
struct s3c_rtc_drv_data *data;
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
const struct of_device_id *match; const struct of_device_id *match;
match = of_match_node(s3c_rtc_dt_match, pdev->dev.of_node); match = of_match_node(s3c_rtc_dt_match, pdev->dev.of_node);
return match->data; data = (struct s3c_rtc_drv_data *) match->data;
return data->cpu_type;
} }
#endif #endif
return platform_get_device_id(pdev)->driver_data; return platform_get_device_id(pdev)->driver_data;
...@@ -664,20 +670,27 @@ static int s3c_rtc_resume(struct platform_device *pdev) ...@@ -664,20 +670,27 @@ static int s3c_rtc_resume(struct platform_device *pdev)
#define s3c_rtc_resume NULL #define s3c_rtc_resume NULL
#endif #endif
static struct s3c_rtc_drv_data s3c_rtc_drv_data_array[] = {
[TYPE_S3C2410] = { TYPE_S3C2410 },
[TYPE_S3C2416] = { TYPE_S3C2416 },
[TYPE_S3C2443] = { TYPE_S3C2443 },
[TYPE_S3C64XX] = { TYPE_S3C64XX },
};
#ifdef CONFIG_OF #ifdef CONFIG_OF
static const struct of_device_id s3c_rtc_dt_match[] = { static const struct of_device_id s3c_rtc_dt_match[] = {
{ {
.compatible = "samsung,s3c2410-rtc" .compatible = "samsung,s3c2410-rtc",
.data = TYPE_S3C2410, .data = &s3c_rtc_drv_data_array[TYPE_S3C2410],
}, { }, {
.compatible = "samsung,s3c2416-rtc" .compatible = "samsung,s3c2416-rtc",
.data = TYPE_S3C2416, .data = &s3c_rtc_drv_data_array[TYPE_S3C2416],
}, { }, {
.compatible = "samsung,s3c2443-rtc" .compatible = "samsung,s3c2443-rtc",
.data = TYPE_S3C2443, .data = &s3c_rtc_drv_data_array[TYPE_S3C2443],
}, { }, {
.compatible = "samsung,s3c6410-rtc" .compatible = "samsung,s3c6410-rtc",
.data = TYPE_S3C64XX, .data = &s3c_rtc_drv_data_array[TYPE_S3C64XX],
}, },
{}, {},
}; };
......
...@@ -112,6 +112,7 @@ static const u8 twl6030_rtc_reg_map[] = { ...@@ -112,6 +112,7 @@ static const u8 twl6030_rtc_reg_map[] = {
#define BIT_RTC_CTRL_REG_TEST_MODE_M 0x10 #define BIT_RTC_CTRL_REG_TEST_MODE_M 0x10
#define BIT_RTC_CTRL_REG_SET_32_COUNTER_M 0x20 #define BIT_RTC_CTRL_REG_SET_32_COUNTER_M 0x20
#define BIT_RTC_CTRL_REG_GET_TIME_M 0x40 #define BIT_RTC_CTRL_REG_GET_TIME_M 0x40
#define BIT_RTC_CTRL_REG_RTC_V_OPT 0x80
/* RTC_STATUS_REG bitfields */ /* RTC_STATUS_REG bitfields */
#define BIT_RTC_STATUS_REG_RUN_M 0x02 #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,25 +236,57 @@ static int twl_rtc_read_time(struct device *dev, struct rtc_time *tm)
unsigned char rtc_data[ALL_TIME_REGS + 1]; unsigned char rtc_data[ALL_TIME_REGS + 1];
int ret; int ret;
u8 save_control; u8 save_control;
u8 rtc_control;
ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG); ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG);
if (ret < 0) if (ret < 0) {
dev_err(dev, "%s: reading CTRL_REG, error %d\n", __func__, ret);
return ret; return ret;
}
/* for twl6030/32 make sure BIT_RTC_CTRL_REG_GET_TIME_M is clear */
if (twl_class_is_6030()) {
if (save_control & BIT_RTC_CTRL_REG_GET_TIME_M) {
save_control &= ~BIT_RTC_CTRL_REG_GET_TIME_M;
ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
if (ret < 0) {
dev_err(dev, "%s clr GET_TIME, error %d\n",
__func__, ret);
return ret;
}
}
}
save_control |= BIT_RTC_CTRL_REG_GET_TIME_M; /* Copy RTC counting registers to static registers or latches */
rtc_control = save_control | BIT_RTC_CTRL_REG_GET_TIME_M;
ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG); /* for twl6030/32 enable read access to static shadowed registers */
if (ret < 0) if (twl_class_is_6030())
rtc_control |= BIT_RTC_CTRL_REG_RTC_V_OPT;
ret = twl_rtc_write_u8(rtc_control, REG_RTC_CTRL_REG);
if (ret < 0) {
dev_err(dev, "%s: writing CTRL_REG, error %d\n", __func__, ret);
return ret; return ret;
}
ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data, ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data,
(rtc_reg_map[REG_SECONDS_REG]), ALL_TIME_REGS); (rtc_reg_map[REG_SECONDS_REG]), ALL_TIME_REGS);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "rtc_read_time error %d\n", ret); dev_err(dev, "%s: reading data, error %d\n", __func__, ret);
return ret; return ret;
} }
/* for twl6030 restore original state of rtc control register */
if (twl_class_is_6030()) {
ret = twl_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
if (ret < 0) {
dev_err(dev, "%s: restore CTRL_REG, error %d\n",
__func__, ret);
return ret;
}
}
tm->tm_sec = bcd2bin(rtc_data[0]); tm->tm_sec = bcd2bin(rtc_data[0]);
tm->tm_min = bcd2bin(rtc_data[1]); tm->tm_min = bcd2bin(rtc_data[1]);
tm->tm_hour = bcd2bin(rtc_data[2]); tm->tm_hour = bcd2bin(rtc_data[2]);
......
...@@ -97,7 +97,7 @@ void panic(const char *fmt, ...) ...@@ -97,7 +97,7 @@ void panic(const char *fmt, ...)
/* /*
* Avoid nested stack-dumping if a panic occurs during oops processing * Avoid nested stack-dumping if a panic occurs during oops processing
*/ */
if (!oops_in_progress) if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
dump_stack(); dump_stack();
#endif #endif
......
...@@ -2791,6 +2791,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2791,6 +2791,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
* so no worry about deadlock. * so no worry about deadlock.
*/ */
page = pte_page(entry); page = pte_page(entry);
get_page(page);
if (page != pagecache_page) if (page != pagecache_page)
lock_page(page); lock_page(page);
...@@ -2822,6 +2823,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, ...@@ -2822,6 +2823,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
} }
if (page != pagecache_page) if (page != pagecache_page)
unlock_page(page); unlock_page(page);
put_page(page);
out_mutex: out_mutex:
mutex_unlock(&hugetlb_instantiation_mutex); mutex_unlock(&hugetlb_instantiation_mutex);
......
...@@ -2165,7 +2165,7 @@ static int __cpuinit memcg_cpu_hotplug_callback(struct notifier_block *nb, ...@@ -2165,7 +2165,7 @@ static int __cpuinit memcg_cpu_hotplug_callback(struct notifier_block *nb,
if (action == CPU_ONLINE) if (action == CPU_ONLINE)
return NOTIFY_OK; return NOTIFY_OK;
if ((action != CPU_DEAD) || action != CPU_DEAD_FROZEN) if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
return NOTIFY_OK; return NOTIFY_OK;
for_each_mem_cgroup(iter) for_each_mem_cgroup(iter)
...@@ -3763,7 +3763,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg, bool free_all) ...@@ -3763,7 +3763,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg, bool free_all)
goto try_to_free; goto try_to_free;
cond_resched(); cond_resched();
/* "ret" should also be checked to ensure all lists are empty. */ /* "ret" should also be checked to ensure all lists are empty. */
} while (memcg->res.usage > 0 || ret); } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0 || ret);
out: out:
css_put(&memcg->css); css_put(&memcg->css);
return ret; return ret;
...@@ -3778,7 +3778,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg, bool free_all) ...@@ -3778,7 +3778,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg, bool free_all)
lru_add_drain_all(); lru_add_drain_all();
/* try to free all pages in this cgroup */ /* try to free all pages in this cgroup */
shrink = 1; shrink = 1;
while (nr_retries && memcg->res.usage > 0) { while (nr_retries && res_counter_read_u64(&memcg->res, RES_USAGE) > 0) {
int progress; int progress;
if (signal_pending(current)) { if (signal_pending(current)) {
......
...@@ -2107,12 +2107,7 @@ static void shrink_mem_cgroup_zone(int priority, struct mem_cgroup_zone *mz, ...@@ -2107,12 +2107,7 @@ static void shrink_mem_cgroup_zone(int priority, struct mem_cgroup_zone *mz,
* with multiple processes reclaiming pages, the total * with multiple processes reclaiming pages, the total
* freeing target can get unreasonably large. * freeing target can get unreasonably large.
*/ */
if (nr_reclaimed >= nr_to_reclaim) if (nr_reclaimed >= nr_to_reclaim && priority < DEF_PRIORITY)
nr_to_reclaim = 0;
else
nr_to_reclaim -= nr_reclaimed;
if (!nr_to_reclaim && priority < DEF_PRIORITY)
break; break;
} }
blk_finish_plug(&plug); blk_finish_plug(&plug);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment