mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-17 20:44:37 +00:00
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
This commit is contained in:
commit
ecca5c3acc
12 changed files with 105 additions and 33 deletions
|
@ -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.
|
||||||
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-*
|
||||||
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,
|
||||||
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 = {
|
||||||
.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)
|
||||||
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 = {
|
||||||
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)
|
||||||
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 {
|
||||||
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[];
|
||||||
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)
|
||||||
#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[] = {
|
||||||
#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)
|
||||||
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, ...)
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* 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 @@ out_page_table_lock:
|
||||||
}
|
}
|
||||||
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,
|
||||||
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 @@ move_account:
|
||||||
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 @@ try_to_free:
|
||||||
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 @@ restart:
|
||||||
* 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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue