mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 01:34:00 +08: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
@ -34,8 +34,7 @@ Current Status: linux-2.6.34-mmotm(development version of 2010/April)
|
||||
|
||||
Features:
|
||||
- accounting anonymous pages, file caches, swap caches usage and limiting them.
|
||||
- private LRU and reclaim routine. (system's global LRU and private LRU
|
||||
work independently from each other)
|
||||
- pages are linked to per-memcg LRU exclusively, and there is no global LRU.
|
||||
- optionally, memory+swap usage can be accounted and limited.
|
||||
- hierarchical accounting
|
||||
- soft limit
|
||||
@ -154,7 +153,7 @@ updated. page_cgroup has its own LRU on cgroup.
|
||||
2.2.1 Accounting details
|
||||
|
||||
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.
|
||||
|
||||
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-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
|
||||
M: Linas Vepstas <linasvepstas@gmail.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
|
@ -1260,10 +1260,15 @@ static int proc_do_uuid(ctl_table *table, int write,
|
||||
uuid = table->data;
|
||||
if (!uuid) {
|
||||
uuid = tmp_uuid;
|
||||
uuid[8] = 0;
|
||||
}
|
||||
if (uuid[8] == 0)
|
||||
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);
|
||||
|
||||
|
@ -213,7 +213,6 @@ static struct platform_driver efi_rtc_driver = {
|
||||
.name = "rtc-efi",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = efi_rtc_probe,
|
||||
.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);
|
||||
|
||||
/* Enable the clockwatch on ST Variants */
|
||||
if ((ldata->hw_designer == AMBA_VENDOR_ST) &&
|
||||
(ldata->hw_revision > 1))
|
||||
if (ldata->hw_designer == AMBA_VENDOR_ST)
|
||||
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
|
||||
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)
|
||||
{
|
||||
struct rtc_device *rtc;
|
||||
struct rtc_time dt;
|
||||
unsigned char tmp;
|
||||
int res;
|
||||
|
||||
@ -132,6 +133,27 @@ static int __devinit r9701_probe(struct spi_device *spi)
|
||||
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",
|
||||
&spi->dev, &r9701_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtc))
|
||||
|
@ -40,6 +40,10 @@ enum s3c_cpu_type {
|
||||
TYPE_S3C64XX,
|
||||
};
|
||||
|
||||
struct s3c_rtc_drv_data {
|
||||
int cpu_type;
|
||||
};
|
||||
|
||||
/* I have yet to find an S3C implementation with more than one
|
||||
* 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)
|
||||
{
|
||||
#ifdef CONFIG_OF
|
||||
struct s3c_rtc_drv_data *data;
|
||||
if (pdev->dev.of_node) {
|
||||
const struct of_device_id *match;
|
||||
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
|
||||
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
|
||||
#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
|
||||
static const struct of_device_id s3c_rtc_dt_match[] = {
|
||||
{
|
||||
.compatible = "samsung,s3c2410-rtc"
|
||||
.data = TYPE_S3C2410,
|
||||
.compatible = "samsung,s3c2410-rtc",
|
||||
.data = &s3c_rtc_drv_data_array[TYPE_S3C2410],
|
||||
}, {
|
||||
.compatible = "samsung,s3c2416-rtc"
|
||||
.data = TYPE_S3C2416,
|
||||
.compatible = "samsung,s3c2416-rtc",
|
||||
.data = &s3c_rtc_drv_data_array[TYPE_S3C2416],
|
||||
}, {
|
||||
.compatible = "samsung,s3c2443-rtc"
|
||||
.data = TYPE_S3C2443,
|
||||
.compatible = "samsung,s3c2443-rtc",
|
||||
.data = &s3c_rtc_drv_data_array[TYPE_S3C2443],
|
||||
}, {
|
||||
.compatible = "samsung,s3c6410-rtc"
|
||||
.data = TYPE_S3C64XX,
|
||||
.compatible = "samsung,s3c6410-rtc",
|
||||
.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_SET_32_COUNTER_M 0x20
|
||||
#define BIT_RTC_CTRL_REG_GET_TIME_M 0x40
|
||||
#define BIT_RTC_CTRL_REG_RTC_V_OPT 0x80
|
||||
|
||||
/* RTC_STATUS_REG bitfields */
|
||||
#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];
|
||||
int ret;
|
||||
u8 save_control;
|
||||
u8 rtc_control;
|
||||
|
||||
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;
|
||||
}
|
||||
/* 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);
|
||||
if (ret < 0)
|
||||
/* for twl6030/32 enable read access to static shadowed registers */
|
||||
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;
|
||||
}
|
||||
|
||||
ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data,
|
||||
(rtc_reg_map[REG_SECONDS_REG]), ALL_TIME_REGS);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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_min = bcd2bin(rtc_data[1]);
|
||||
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
|
||||
*/
|
||||
if (!oops_in_progress)
|
||||
if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
|
||||
dump_stack();
|
||||
#endif
|
||||
|
||||
|
@ -2791,6 +2791,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
* so no worry about deadlock.
|
||||
*/
|
||||
page = pte_page(entry);
|
||||
get_page(page);
|
||||
if (page != pagecache_page)
|
||||
lock_page(page);
|
||||
|
||||
@ -2822,6 +2823,7 @@ out_page_table_lock:
|
||||
}
|
||||
if (page != pagecache_page)
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
|
||||
out_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)
|
||||
return NOTIFY_OK;
|
||||
|
||||
if ((action != CPU_DEAD) || action != CPU_DEAD_FROZEN)
|
||||
if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
|
||||
return NOTIFY_OK;
|
||||
|
||||
for_each_mem_cgroup(iter)
|
||||
@ -3763,7 +3763,7 @@ move_account:
|
||||
goto try_to_free;
|
||||
cond_resched();
|
||||
/* "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:
|
||||
css_put(&memcg->css);
|
||||
return ret;
|
||||
@ -3778,7 +3778,7 @@ try_to_free:
|
||||
lru_add_drain_all();
|
||||
/* try to free all pages in this cgroup */
|
||||
shrink = 1;
|
||||
while (nr_retries && memcg->res.usage > 0) {
|
||||
while (nr_retries && res_counter_read_u64(&memcg->res, RES_USAGE) > 0) {
|
||||
int progress;
|
||||
|
||||
if (signal_pending(current)) {
|
||||
|
@ -2107,12 +2107,7 @@ restart:
|
||||
* with multiple processes reclaiming pages, the total
|
||||
* freeing target can get unreasonably large.
|
||||
*/
|
||||
if (nr_reclaimed >= nr_to_reclaim)
|
||||
nr_to_reclaim = 0;
|
||||
else
|
||||
nr_to_reclaim -= nr_reclaimed;
|
||||
|
||||
if (!nr_to_reclaim && priority < DEF_PRIORITY)
|
||||
if (nr_reclaimed >= nr_to_reclaim && priority < DEF_PRIORITY)
|
||||
break;
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
|
Loading…
Reference in New Issue
Block a user