diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-12 19:29:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-12 19:29:53 -0400 |
| commit | a568fa1c91d4f0e565345119d0b942cc7f74ca3d (patch) | |
| tree | 8d57522244da002e44b2f79cc2b376799630ba83 | |
| parent | 1a9c3d68d65f4b5ce32f7d67ccc730396e04cdd2 (diff) | |
| parent | c2853c8df57f49620d26f317d7d43347c29bfc2e (diff) | |
Merge branch 'akpm' (updates from Andrew Morton)
Merge misc fixes from Andrew Morton:
"Bunch of fixes and one little addition to math64.h"
* emailed patches from Andrew Morton <akpm@linux-foundation.org>: (27 commits)
include/linux/math64.h: add div64_ul()
mm: memcontrol: fix lockless reclaim hierarchy iterator
frontswap: fix incorrect zeroing and allocation size for frontswap_map
kernel/audit_tree.c:audit_add_tree_rule(): protect `rule' from kill_rules()
mm: migration: add migrate_entry_wait_huge()
ocfs2: add missing lockres put in dlm_mig_lockres_handler
mm/page_alloc.c: fix watermark check in __zone_watermark_ok()
drivers/misc/sgi-gru/grufile.c: fix info leak in gru_get_config_info()
aio: fix io_destroy() regression by using call_rcu()
rtc-at91rm9200: use shadow IMR on at91sam9x5
rtc-at91rm9200: add shadow interrupt mask
rtc-at91rm9200: refactor interrupt-register handling
rtc-at91rm9200: add configuration support
rtc-at91rm9200: add match-table compile guard
fs/ocfs2/namei.c: remove unecessary ERROR when removing non-empty directory
swap: avoid read_swap_cache_async() race to deadlock while waiting on discard I/O completion
drivers/rtc/rtc-twl.c: fix missing device_init_wakeup() when booted with device tree
cciss: fix broken mutex usage in ioctl
audit: wait_for_auditd() should use TASK_UNINTERRUPTIBLE
drivers/rtc/rtc-cmos.c: fix accidentally enabling rtc channel
...
| -rw-r--r-- | Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt | 2 | ||||
| -rw-r--r-- | drivers/block/cciss.c | 32 | ||||
| -rw-r--r-- | drivers/misc/sgi-gru/grufile.c | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-at91rm9200.c | 131 | ||||
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 4 | ||||
| -rw-r--r-- | drivers/rtc/rtc-tps6586x.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-twl.c | 1 | ||||
| -rw-r--r-- | fs/aio.c | 36 | ||||
| -rw-r--r-- | fs/ocfs2/dlm/dlmrecovery.c | 1 | ||||
| -rw-r--r-- | fs/ocfs2/namei.c | 4 | ||||
| -rw-r--r-- | fs/proc/kmsg.c | 10 | ||||
| -rw-r--r-- | include/linux/cpu.h | 4 | ||||
| -rw-r--r-- | include/linux/math64.h | 6 | ||||
| -rw-r--r-- | include/linux/swapops.h | 3 | ||||
| -rw-r--r-- | include/linux/syslog.h | 4 | ||||
| -rw-r--r-- | kernel/audit.c | 2 | ||||
| -rw-r--r-- | kernel/audit_tree.c | 1 | ||||
| -rw-r--r-- | kernel/cpu.c | 55 | ||||
| -rw-r--r-- | kernel/printk.c | 91 | ||||
| -rw-r--r-- | kernel/sys.c | 29 | ||||
| -rw-r--r-- | lib/mpi/mpicoder.c | 2 | ||||
| -rw-r--r-- | mm/frontswap.c | 2 | ||||
| -rw-r--r-- | mm/hugetlb.c | 2 | ||||
| -rw-r--r-- | mm/memcontrol.c | 14 | ||||
| -rw-r--r-- | mm/migrate.c | 23 | ||||
| -rw-r--r-- | mm/page_alloc.c | 6 | ||||
| -rw-r--r-- | mm/swap_state.c | 18 | ||||
| -rw-r--r-- | mm/swapfile.c | 2 |
28 files changed, 321 insertions, 168 deletions
diff --git a/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt b/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt index 2a3feabd3b22..34c1505774bf 100644 --- a/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt +++ b/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | Atmel AT91RM9200 Real Time Clock | 1 | Atmel AT91RM9200 Real Time Clock |
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible: should be: "atmel,at91rm9200-rtc" | 4 | - compatible: should be: "atmel,at91rm9200-rtc" or "atmel,at91sam9x5-rtc" |
| 5 | - reg: physical base address of the controller and length of memory mapped | 5 | - reg: physical base address of the controller and length of memory mapped |
| 6 | region. | 6 | region. |
| 7 | - interrupts: rtc alarm/event interrupt | 7 | - interrupts: rtc alarm/event interrupt |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6374dc103521..62b6c2cc80b5 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -168,8 +168,6 @@ static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); | |||
| 168 | static int cciss_open(struct block_device *bdev, fmode_t mode); | 168 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
| 169 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); | 169 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); |
| 170 | static void cciss_release(struct gendisk *disk, fmode_t mode); | 170 | static void cciss_release(struct gendisk *disk, fmode_t mode); |
| 171 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | ||
| 172 | unsigned int cmd, unsigned long arg); | ||
| 173 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, | 171 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
| 174 | unsigned int cmd, unsigned long arg); | 172 | unsigned int cmd, unsigned long arg); |
| 175 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 173 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
| @@ -235,7 +233,7 @@ static const struct block_device_operations cciss_fops = { | |||
| 235 | .owner = THIS_MODULE, | 233 | .owner = THIS_MODULE, |
| 236 | .open = cciss_unlocked_open, | 234 | .open = cciss_unlocked_open, |
| 237 | .release = cciss_release, | 235 | .release = cciss_release, |
| 238 | .ioctl = do_ioctl, | 236 | .ioctl = cciss_ioctl, |
| 239 | .getgeo = cciss_getgeo, | 237 | .getgeo = cciss_getgeo, |
| 240 | #ifdef CONFIG_COMPAT | 238 | #ifdef CONFIG_COMPAT |
| 241 | .compat_ioctl = cciss_compat_ioctl, | 239 | .compat_ioctl = cciss_compat_ioctl, |
| @@ -1143,16 +1141,6 @@ static void cciss_release(struct gendisk *disk, fmode_t mode) | |||
| 1143 | mutex_unlock(&cciss_mutex); | 1141 | mutex_unlock(&cciss_mutex); |
| 1144 | } | 1142 | } |
| 1145 | 1143 | ||
| 1146 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | ||
| 1147 | unsigned cmd, unsigned long arg) | ||
| 1148 | { | ||
| 1149 | int ret; | ||
| 1150 | mutex_lock(&cciss_mutex); | ||
| 1151 | ret = cciss_ioctl(bdev, mode, cmd, arg); | ||
| 1152 | mutex_unlock(&cciss_mutex); | ||
| 1153 | return ret; | ||
| 1154 | } | ||
| 1155 | |||
| 1156 | #ifdef CONFIG_COMPAT | 1144 | #ifdef CONFIG_COMPAT |
| 1157 | 1145 | ||
| 1158 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | 1146 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
| @@ -1179,7 +1167,7 @@ static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 1179 | case CCISS_REGNEWD: | 1167 | case CCISS_REGNEWD: |
| 1180 | case CCISS_RESCANDISK: | 1168 | case CCISS_RESCANDISK: |
| 1181 | case CCISS_GETLUNINFO: | 1169 | case CCISS_GETLUNINFO: |
| 1182 | return do_ioctl(bdev, mode, cmd, arg); | 1170 | return cciss_ioctl(bdev, mode, cmd, arg); |
| 1183 | 1171 | ||
| 1184 | case CCISS_PASSTHRU32: | 1172 | case CCISS_PASSTHRU32: |
| 1185 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); | 1173 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); |
| @@ -1219,7 +1207,7 @@ static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | |||
| 1219 | if (err) | 1207 | if (err) |
| 1220 | return -EFAULT; | 1208 | return -EFAULT; |
| 1221 | 1209 | ||
| 1222 | err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); | 1210 | err = cciss_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); |
| 1223 | if (err) | 1211 | if (err) |
| 1224 | return err; | 1212 | return err; |
| 1225 | err |= | 1213 | err |= |
| @@ -1261,7 +1249,7 @@ static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, | |||
| 1261 | if (err) | 1249 | if (err) |
| 1262 | return -EFAULT; | 1250 | return -EFAULT; |
| 1263 | 1251 | ||
| 1264 | err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); | 1252 | err = cciss_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); |
| 1265 | if (err) | 1253 | if (err) |
| 1266 | return err; | 1254 | return err; |
| 1267 | err |= | 1255 | err |= |
| @@ -1311,11 +1299,14 @@ static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) | |||
| 1311 | static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) | 1299 | static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) |
| 1312 | { | 1300 | { |
| 1313 | cciss_coalint_struct intinfo; | 1301 | cciss_coalint_struct intinfo; |
| 1302 | unsigned long flags; | ||
| 1314 | 1303 | ||
| 1315 | if (!argp) | 1304 | if (!argp) |
| 1316 | return -EINVAL; | 1305 | return -EINVAL; |
| 1306 | spin_lock_irqsave(&h->lock, flags); | ||
| 1317 | intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); | 1307 | intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); |
| 1318 | intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); | 1308 | intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); |
| 1309 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 1319 | if (copy_to_user | 1310 | if (copy_to_user |
| 1320 | (argp, &intinfo, sizeof(cciss_coalint_struct))) | 1311 | (argp, &intinfo, sizeof(cciss_coalint_struct))) |
| 1321 | return -EFAULT; | 1312 | return -EFAULT; |
| @@ -1356,12 +1347,15 @@ static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) | |||
| 1356 | static int cciss_getnodename(ctlr_info_t *h, void __user *argp) | 1347 | static int cciss_getnodename(ctlr_info_t *h, void __user *argp) |
| 1357 | { | 1348 | { |
| 1358 | NodeName_type NodeName; | 1349 | NodeName_type NodeName; |
| 1350 | unsigned long flags; | ||
| 1359 | int i; | 1351 | int i; |
| 1360 | 1352 | ||
| 1361 | if (!argp) | 1353 | if (!argp) |
| 1362 | return -EINVAL; | 1354 | return -EINVAL; |
| 1355 | spin_lock_irqsave(&h->lock, flags); | ||
| 1363 | for (i = 0; i < 16; i++) | 1356 | for (i = 0; i < 16; i++) |
| 1364 | NodeName[i] = readb(&h->cfgtable->ServerName[i]); | 1357 | NodeName[i] = readb(&h->cfgtable->ServerName[i]); |
| 1358 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 1365 | if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) | 1359 | if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) |
| 1366 | return -EFAULT; | 1360 | return -EFAULT; |
| 1367 | return 0; | 1361 | return 0; |
| @@ -1398,10 +1392,13 @@ static int cciss_setnodename(ctlr_info_t *h, void __user *argp) | |||
| 1398 | static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) | 1392 | static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) |
| 1399 | { | 1393 | { |
| 1400 | Heartbeat_type heartbeat; | 1394 | Heartbeat_type heartbeat; |
| 1395 | unsigned long flags; | ||
| 1401 | 1396 | ||
| 1402 | if (!argp) | 1397 | if (!argp) |
| 1403 | return -EINVAL; | 1398 | return -EINVAL; |
| 1399 | spin_lock_irqsave(&h->lock, flags); | ||
| 1404 | heartbeat = readl(&h->cfgtable->HeartBeat); | 1400 | heartbeat = readl(&h->cfgtable->HeartBeat); |
| 1401 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 1405 | if (copy_to_user(argp, &heartbeat, sizeof(Heartbeat_type))) | 1402 | if (copy_to_user(argp, &heartbeat, sizeof(Heartbeat_type))) |
| 1406 | return -EFAULT; | 1403 | return -EFAULT; |
| 1407 | return 0; | 1404 | return 0; |
| @@ -1410,10 +1407,13 @@ static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) | |||
| 1410 | static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) | 1407 | static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) |
| 1411 | { | 1408 | { |
| 1412 | BusTypes_type BusTypes; | 1409 | BusTypes_type BusTypes; |
| 1410 | unsigned long flags; | ||
| 1413 | 1411 | ||
| 1414 | if (!argp) | 1412 | if (!argp) |
| 1415 | return -EINVAL; | 1413 | return -EINVAL; |
| 1414 | spin_lock_irqsave(&h->lock, flags); | ||
| 1416 | BusTypes = readl(&h->cfgtable->BusTypes); | 1415 | BusTypes = readl(&h->cfgtable->BusTypes); |
| 1416 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 1417 | if (copy_to_user(argp, &BusTypes, sizeof(BusTypes_type))) | 1417 | if (copy_to_user(argp, &BusTypes, sizeof(BusTypes_type))) |
| 1418 | return -EFAULT; | 1418 | return -EFAULT; |
| 1419 | return 0; | 1419 | return 0; |
diff --git a/drivers/misc/sgi-gru/grufile.c b/drivers/misc/sgi-gru/grufile.c index 44d273c5e19d..0535d1e0bc78 100644 --- a/drivers/misc/sgi-gru/grufile.c +++ b/drivers/misc/sgi-gru/grufile.c | |||
| @@ -172,6 +172,7 @@ static long gru_get_config_info(unsigned long arg) | |||
| 172 | nodesperblade = 2; | 172 | nodesperblade = 2; |
| 173 | else | 173 | else |
| 174 | nodesperblade = 1; | 174 | nodesperblade = 1; |
| 175 | memset(&info, 0, sizeof(info)); | ||
| 175 | info.cpus = num_online_cpus(); | 176 | info.cpus = num_online_cpus(); |
| 176 | info.nodes = num_online_nodes(); | 177 | info.nodes = num_online_nodes(); |
| 177 | info.blades = info.nodes / nodesperblade; | 178 | info.blades = info.nodes / nodesperblade; |
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 0eab77b22340..f296f3f7db9b 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/rtc.h> | 25 | #include <linux/rtc.h> |
| 26 | #include <linux/bcd.h> | 26 | #include <linux/bcd.h> |
| 27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
| 28 | #include <linux/spinlock.h> | ||
| 28 | #include <linux/ioctl.h> | 29 | #include <linux/ioctl.h> |
| 29 | #include <linux/completion.h> | 30 | #include <linux/completion.h> |
| 30 | #include <linux/io.h> | 31 | #include <linux/io.h> |
| @@ -42,10 +43,65 @@ | |||
| 42 | 43 | ||
| 43 | #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */ | 44 | #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */ |
| 44 | 45 | ||
| 46 | struct at91_rtc_config { | ||
| 47 | bool use_shadow_imr; | ||
| 48 | }; | ||
| 49 | |||
| 50 | static const struct at91_rtc_config *at91_rtc_config; | ||
| 45 | static DECLARE_COMPLETION(at91_rtc_updated); | 51 | static DECLARE_COMPLETION(at91_rtc_updated); |
| 46 | static unsigned int at91_alarm_year = AT91_RTC_EPOCH; | 52 | static unsigned int at91_alarm_year = AT91_RTC_EPOCH; |
| 47 | static void __iomem *at91_rtc_regs; | 53 | static void __iomem *at91_rtc_regs; |
| 48 | static int irq; | 54 | static int irq; |
| 55 | static DEFINE_SPINLOCK(at91_rtc_lock); | ||
| 56 | static u32 at91_rtc_shadow_imr; | ||
| 57 | |||
| 58 | static void at91_rtc_write_ier(u32 mask) | ||
| 59 | { | ||
| 60 | unsigned long flags; | ||
| 61 | |||
| 62 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
| 63 | at91_rtc_shadow_imr |= mask; | ||
| 64 | at91_rtc_write(AT91_RTC_IER, mask); | ||
| 65 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
| 66 | } | ||
| 67 | |||
| 68 | static void at91_rtc_write_idr(u32 mask) | ||
| 69 | { | ||
| 70 | unsigned long flags; | ||
| 71 | |||
| 72 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
| 73 | at91_rtc_write(AT91_RTC_IDR, mask); | ||
| 74 | /* | ||
| 75 | * Register read back (of any RTC-register) needed to make sure | ||
| 76 | * IDR-register write has reached the peripheral before updating | ||
| 77 | * shadow mask. | ||
| 78 | * | ||
| 79 | * Note that there is still a possibility that the mask is updated | ||
| 80 | * before interrupts have actually been disabled in hardware. The only | ||
| 81 | * way to be certain would be to poll the IMR-register, which is is | ||
| 82 | * the very register we are trying to emulate. The register read back | ||
| 83 | * is a reasonable heuristic. | ||
| 84 | */ | ||
| 85 | at91_rtc_read(AT91_RTC_SR); | ||
| 86 | at91_rtc_shadow_imr &= ~mask; | ||
| 87 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
| 88 | } | ||
| 89 | |||
| 90 | static u32 at91_rtc_read_imr(void) | ||
| 91 | { | ||
| 92 | unsigned long flags; | ||
| 93 | u32 mask; | ||
| 94 | |||
| 95 | if (at91_rtc_config->use_shadow_imr) { | ||
| 96 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
| 97 | mask = at91_rtc_shadow_imr; | ||
| 98 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
| 99 | } else { | ||
| 100 | mask = at91_rtc_read(AT91_RTC_IMR); | ||
| 101 | } | ||
| 102 | |||
| 103 | return mask; | ||
| 104 | } | ||
| 49 | 105 | ||
| 50 | /* | 106 | /* |
| 51 | * Decode time/date into rtc_time structure | 107 | * Decode time/date into rtc_time structure |
| @@ -110,9 +166,9 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 110 | cr = at91_rtc_read(AT91_RTC_CR); | 166 | cr = at91_rtc_read(AT91_RTC_CR); |
| 111 | at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); | 167 | at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); |
| 112 | 168 | ||
| 113 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD); | 169 | at91_rtc_write_ier(AT91_RTC_ACKUPD); |
| 114 | wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ | 170 | wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ |
| 115 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD); | 171 | at91_rtc_write_idr(AT91_RTC_ACKUPD); |
| 116 | 172 | ||
| 117 | at91_rtc_write(AT91_RTC_TIMR, | 173 | at91_rtc_write(AT91_RTC_TIMR, |
| 118 | bin2bcd(tm->tm_sec) << 0 | 174 | bin2bcd(tm->tm_sec) << 0 |
| @@ -144,7 +200,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 144 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); | 200 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); |
| 145 | tm->tm_year = at91_alarm_year - 1900; | 201 | tm->tm_year = at91_alarm_year - 1900; |
| 146 | 202 | ||
| 147 | alrm->enabled = (at91_rtc_read(AT91_RTC_IMR) & AT91_RTC_ALARM) | 203 | alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) |
| 148 | ? 1 : 0; | 204 | ? 1 : 0; |
| 149 | 205 | ||
| 150 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 206 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, |
| @@ -169,7 +225,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 169 | tm.tm_min = alrm->time.tm_min; | 225 | tm.tm_min = alrm->time.tm_min; |
| 170 | tm.tm_sec = alrm->time.tm_sec; | 226 | tm.tm_sec = alrm->time.tm_sec; |
| 171 | 227 | ||
| 172 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); | 228 | at91_rtc_write_idr(AT91_RTC_ALARM); |
| 173 | at91_rtc_write(AT91_RTC_TIMALR, | 229 | at91_rtc_write(AT91_RTC_TIMALR, |
| 174 | bin2bcd(tm.tm_sec) << 0 | 230 | bin2bcd(tm.tm_sec) << 0 |
| 175 | | bin2bcd(tm.tm_min) << 8 | 231 | | bin2bcd(tm.tm_min) << 8 |
| @@ -182,7 +238,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 182 | 238 | ||
| 183 | if (alrm->enabled) { | 239 | if (alrm->enabled) { |
| 184 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); | 240 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
| 185 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); | 241 | at91_rtc_write_ier(AT91_RTC_ALARM); |
| 186 | } | 242 | } |
| 187 | 243 | ||
| 188 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 244 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, |
| @@ -198,9 +254,9 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 198 | 254 | ||
| 199 | if (enabled) { | 255 | if (enabled) { |
| 200 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); | 256 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
| 201 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); | 257 | at91_rtc_write_ier(AT91_RTC_ALARM); |
| 202 | } else | 258 | } else |
| 203 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); | 259 | at91_rtc_write_idr(AT91_RTC_ALARM); |
| 204 | 260 | ||
| 205 | return 0; | 261 | return 0; |
| 206 | } | 262 | } |
| @@ -209,7 +265,7 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 209 | */ | 265 | */ |
| 210 | static int at91_rtc_proc(struct device *dev, struct seq_file *seq) | 266 | static int at91_rtc_proc(struct device *dev, struct seq_file *seq) |
| 211 | { | 267 | { |
| 212 | unsigned long imr = at91_rtc_read(AT91_RTC_IMR); | 268 | unsigned long imr = at91_rtc_read_imr(); |
| 213 | 269 | ||
| 214 | seq_printf(seq, "update_IRQ\t: %s\n", | 270 | seq_printf(seq, "update_IRQ\t: %s\n", |
| 215 | (imr & AT91_RTC_ACKUPD) ? "yes" : "no"); | 271 | (imr & AT91_RTC_ACKUPD) ? "yes" : "no"); |
| @@ -229,7 +285,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) | |||
| 229 | unsigned int rtsr; | 285 | unsigned int rtsr; |
| 230 | unsigned long events = 0; | 286 | unsigned long events = 0; |
| 231 | 287 | ||
| 232 | rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read(AT91_RTC_IMR); | 288 | rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read_imr(); |
| 233 | if (rtsr) { /* this interrupt is shared! Is it ours? */ | 289 | if (rtsr) { /* this interrupt is shared! Is it ours? */ |
| 234 | if (rtsr & AT91_RTC_ALARM) | 290 | if (rtsr & AT91_RTC_ALARM) |
| 235 | events |= (RTC_AF | RTC_IRQF); | 291 | events |= (RTC_AF | RTC_IRQF); |
| @@ -250,6 +306,43 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) | |||
| 250 | return IRQ_NONE; /* not handled */ | 306 | return IRQ_NONE; /* not handled */ |
| 251 | } | 307 | } |
| 252 | 308 | ||
| 309 | static const struct at91_rtc_config at91rm9200_config = { | ||
| 310 | }; | ||
| 311 | |||
| 312 | static const struct at91_rtc_config at91sam9x5_config = { | ||
| 313 | .use_shadow_imr = true, | ||
| 314 | }; | ||
| 315 | |||
| 316 | #ifdef CONFIG_OF | ||
| 317 | static const struct of_device_id at91_rtc_dt_ids[] = { | ||
| 318 | { | ||
| 319 | .compatible = "atmel,at91rm9200-rtc", | ||
| 320 | .data = &at91rm9200_config, | ||
| 321 | }, { | ||
| 322 | .compatible = "atmel,at91sam9x5-rtc", | ||
| 323 | .data = &at91sam9x5_config, | ||
| 324 | }, { | ||
| 325 | /* sentinel */ | ||
| 326 | } | ||
| 327 | }; | ||
| 328 | MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); | ||
| 329 | #endif | ||
| 330 | |||
| 331 | static const struct at91_rtc_config * | ||
| 332 | at91_rtc_get_config(struct platform_device *pdev) | ||
| 333 | { | ||
| 334 | const struct of_device_id *match; | ||
| 335 | |||
| 336 | if (pdev->dev.of_node) { | ||
| 337 | match = of_match_node(at91_rtc_dt_ids, pdev->dev.of_node); | ||
| 338 | if (!match) | ||
| 339 | return NULL; | ||
| 340 | return (const struct at91_rtc_config *)match->data; | ||
| 341 | } | ||
| 342 | |||
| 343 | return &at91rm9200_config; | ||
| 344 | } | ||
| 345 | |||
| 253 | static const struct rtc_class_ops at91_rtc_ops = { | 346 | static const struct rtc_class_ops at91_rtc_ops = { |
| 254 | .read_time = at91_rtc_readtime, | 347 | .read_time = at91_rtc_readtime, |
| 255 | .set_time = at91_rtc_settime, | 348 | .set_time = at91_rtc_settime, |
| @@ -268,6 +361,10 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 268 | struct resource *regs; | 361 | struct resource *regs; |
| 269 | int ret = 0; | 362 | int ret = 0; |
| 270 | 363 | ||
| 364 | at91_rtc_config = at91_rtc_get_config(pdev); | ||
| 365 | if (!at91_rtc_config) | ||
| 366 | return -ENODEV; | ||
| 367 | |||
| 271 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 368 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 272 | if (!regs) { | 369 | if (!regs) { |
| 273 | dev_err(&pdev->dev, "no mmio resource defined\n"); | 370 | dev_err(&pdev->dev, "no mmio resource defined\n"); |
| @@ -290,7 +387,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 290 | at91_rtc_write(AT91_RTC_MR, 0); /* 24 hour mode */ | 387 | at91_rtc_write(AT91_RTC_MR, 0); /* 24 hour mode */ |
| 291 | 388 | ||
| 292 | /* Disable all interrupts */ | 389 | /* Disable all interrupts */ |
| 293 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 390 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
| 294 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 391 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
| 295 | AT91_RTC_CALEV); | 392 | AT91_RTC_CALEV); |
| 296 | 393 | ||
| @@ -335,7 +432,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) | |||
| 335 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 432 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
| 336 | 433 | ||
| 337 | /* Disable all interrupts */ | 434 | /* Disable all interrupts */ |
| 338 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 435 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
| 339 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 436 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
| 340 | AT91_RTC_CALEV); | 437 | AT91_RTC_CALEV); |
| 341 | free_irq(irq, pdev); | 438 | free_irq(irq, pdev); |
| @@ -358,13 +455,13 @@ static int at91_rtc_suspend(struct device *dev) | |||
| 358 | /* this IRQ is shared with DBGU and other hardware which isn't | 455 | /* this IRQ is shared with DBGU and other hardware which isn't |
| 359 | * necessarily doing PM like we are... | 456 | * necessarily doing PM like we are... |
| 360 | */ | 457 | */ |
| 361 | at91_rtc_imr = at91_rtc_read(AT91_RTC_IMR) | 458 | at91_rtc_imr = at91_rtc_read_imr() |
| 362 | & (AT91_RTC_ALARM|AT91_RTC_SECEV); | 459 | & (AT91_RTC_ALARM|AT91_RTC_SECEV); |
| 363 | if (at91_rtc_imr) { | 460 | if (at91_rtc_imr) { |
| 364 | if (device_may_wakeup(dev)) | 461 | if (device_may_wakeup(dev)) |
| 365 | enable_irq_wake(irq); | 462 | enable_irq_wake(irq); |
| 366 | else | 463 | else |
| 367 | at91_rtc_write(AT91_RTC_IDR, at91_rtc_imr); | 464 | at91_rtc_write_idr(at91_rtc_imr); |
| 368 | } | 465 | } |
| 369 | return 0; | 466 | return 0; |
| 370 | } | 467 | } |
| @@ -375,7 +472,7 @@ static int at91_rtc_resume(struct device *dev) | |||
| 375 | if (device_may_wakeup(dev)) | 472 | if (device_may_wakeup(dev)) |
| 376 | disable_irq_wake(irq); | 473 | disable_irq_wake(irq); |
| 377 | else | 474 | else |
| 378 | at91_rtc_write(AT91_RTC_IER, at91_rtc_imr); | 475 | at91_rtc_write_ier(at91_rtc_imr); |
| 379 | } | 476 | } |
| 380 | return 0; | 477 | return 0; |
| 381 | } | 478 | } |
| @@ -383,12 +480,6 @@ static int at91_rtc_resume(struct device *dev) | |||
| 383 | 480 | ||
| 384 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); | 481 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); |
| 385 | 482 | ||
| 386 | static const struct of_device_id at91_rtc_dt_ids[] = { | ||
| 387 | { .compatible = "atmel,at91rm9200-rtc" }, | ||
| 388 | { /* sentinel */ } | ||
| 389 | }; | ||
| 390 | MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); | ||
| 391 | |||
| 392 | static struct platform_driver at91_rtc_driver = { | 483 | static struct platform_driver at91_rtc_driver = { |
| 393 | .remove = __exit_p(at91_rtc_remove), | 484 | .remove = __exit_p(at91_rtc_remove), |
| 394 | .driver = { | 485 | .driver = { |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index cc5bea9c4b1c..f1cb706445c7 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -854,6 +854,9 @@ static int cmos_resume(struct device *dev) | |||
| 854 | } | 854 | } |
| 855 | 855 | ||
| 856 | spin_lock_irq(&rtc_lock); | 856 | spin_lock_irq(&rtc_lock); |
| 857 | if (device_may_wakeup(dev)) | ||
| 858 | hpet_rtc_timer_init(); | ||
| 859 | |||
| 857 | do { | 860 | do { |
| 858 | CMOS_WRITE(tmp, RTC_CONTROL); | 861 | CMOS_WRITE(tmp, RTC_CONTROL); |
| 859 | hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK); | 862 | hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK); |
| @@ -869,7 +872,6 @@ static int cmos_resume(struct device *dev) | |||
| 869 | rtc_update_irq(cmos->rtc, 1, mask); | 872 | rtc_update_irq(cmos->rtc, 1, mask); |
| 870 | tmp &= ~RTC_AIE; | 873 | tmp &= ~RTC_AIE; |
| 871 | hpet_mask_rtc_irq_bit(RTC_AIE); | 874 | hpet_mask_rtc_irq_bit(RTC_AIE); |
| 872 | hpet_rtc_timer_init(); | ||
| 873 | } while (mask & RTC_AIE); | 875 | } while (mask & RTC_AIE); |
| 874 | spin_unlock_irq(&rtc_lock); | 876 | spin_unlock_irq(&rtc_lock); |
| 875 | } | 877 | } |
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c index 459c2ffc95a6..426901cef14f 100644 --- a/drivers/rtc/rtc-tps6586x.c +++ b/drivers/rtc/rtc-tps6586x.c | |||
| @@ -273,6 +273,8 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) | |||
| 273 | return ret; | 273 | return ret; |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | device_init_wakeup(&pdev->dev, 1); | ||
| 277 | |||
| 276 | platform_set_drvdata(pdev, rtc); | 278 | platform_set_drvdata(pdev, rtc); |
| 277 | rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), | 279 | rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), |
| 278 | &tps6586x_rtc_ops, THIS_MODULE); | 280 | &tps6586x_rtc_ops, THIS_MODULE); |
| @@ -292,7 +294,6 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) | |||
| 292 | goto fail_rtc_register; | 294 | goto fail_rtc_register; |
| 293 | } | 295 | } |
| 294 | disable_irq(rtc->irq); | 296 | disable_irq(rtc->irq); |
| 295 | device_set_wakeup_capable(&pdev->dev, 1); | ||
| 296 | return 0; | 297 | return 0; |
| 297 | 298 | ||
| 298 | fail_rtc_register: | 299 | fail_rtc_register: |
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 8751a5240c99..b2eab34f38d9 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
| @@ -524,6 +524,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
| 524 | } | 524 | } |
| 525 | 525 | ||
| 526 | platform_set_drvdata(pdev, rtc); | 526 | platform_set_drvdata(pdev, rtc); |
| 527 | device_init_wakeup(&pdev->dev, 1); | ||
| 527 | return 0; | 528 | return 0; |
| 528 | 529 | ||
| 529 | out2: | 530 | out2: |
| @@ -141,9 +141,6 @@ static void aio_free_ring(struct kioctx *ctx) | |||
| 141 | for (i = 0; i < ctx->nr_pages; i++) | 141 | for (i = 0; i < ctx->nr_pages; i++) |
| 142 | put_page(ctx->ring_pages[i]); | 142 | put_page(ctx->ring_pages[i]); |
| 143 | 143 | ||
| 144 | if (ctx->mmap_size) | ||
| 145 | vm_munmap(ctx->mmap_base, ctx->mmap_size); | ||
| 146 | |||
| 147 | if (ctx->ring_pages && ctx->ring_pages != ctx->internal_pages) | 144 | if (ctx->ring_pages && ctx->ring_pages != ctx->internal_pages) |
| 148 | kfree(ctx->ring_pages); | 145 | kfree(ctx->ring_pages); |
| 149 | } | 146 | } |
| @@ -322,11 +319,6 @@ static void free_ioctx(struct kioctx *ctx) | |||
| 322 | 319 | ||
| 323 | aio_free_ring(ctx); | 320 | aio_free_ring(ctx); |
| 324 | 321 | ||
| 325 | spin_lock(&aio_nr_lock); | ||
| 326 | BUG_ON(aio_nr - ctx->max_reqs > aio_nr); | ||
| 327 | aio_nr -= ctx->max_reqs; | ||
| 328 | spin_unlock(&aio_nr_lock); | ||
| 329 | |||
| 330 | pr_debug("freeing %p\n", ctx); | 322 | pr_debug("freeing %p\n", ctx); |
| 331 | 323 | ||
| 332 | /* | 324 | /* |
| @@ -435,17 +427,24 @@ static void kill_ioctx(struct kioctx *ctx) | |||
| 435 | { | 427 | { |
| 436 | if (!atomic_xchg(&ctx->dead, 1)) { | 428 | if (!atomic_xchg(&ctx->dead, 1)) { |
| 437 | hlist_del_rcu(&ctx->list); | 429 | hlist_del_rcu(&ctx->list); |
| 438 | /* Between hlist_del_rcu() and dropping the initial ref */ | ||
| 439 | synchronize_rcu(); | ||
| 440 | 430 | ||
| 441 | /* | 431 | /* |
| 442 | * We can't punt to workqueue here because put_ioctx() -> | 432 | * It'd be more correct to do this in free_ioctx(), after all |
| 443 | * free_ioctx() will unmap the ringbuffer, and that has to be | 433 | * the outstanding kiocbs have finished - but by then io_destroy |
| 444 | * done in the original process's context. kill_ioctx_rcu/work() | 434 | * has already returned, so io_setup() could potentially return |
| 445 | * exist for exit_aio(), as in that path free_ioctx() won't do | 435 | * -EAGAIN with no ioctxs actually in use (as far as userspace |
| 446 | * the unmap. | 436 | * could tell). |
| 447 | */ | 437 | */ |
| 448 | kill_ioctx_work(&ctx->rcu_work); | 438 | spin_lock(&aio_nr_lock); |
| 439 | BUG_ON(aio_nr - ctx->max_reqs > aio_nr); | ||
| 440 | aio_nr -= ctx->max_reqs; | ||
| 441 | spin_unlock(&aio_nr_lock); | ||
| 442 | |||
| 443 | if (ctx->mmap_size) | ||
| 444 | vm_munmap(ctx->mmap_base, ctx->mmap_size); | ||
| 445 | |||
| 446 | /* Between hlist_del_rcu() and dropping the initial ref */ | ||
| 447 | call_rcu(&ctx->rcu_head, kill_ioctx_rcu); | ||
| 449 | } | 448 | } |
| 450 | } | 449 | } |
| 451 | 450 | ||
| @@ -495,10 +494,7 @@ void exit_aio(struct mm_struct *mm) | |||
| 495 | */ | 494 | */ |
| 496 | ctx->mmap_size = 0; | 495 | ctx->mmap_size = 0; |
| 497 | 496 | ||
| 498 | if (!atomic_xchg(&ctx->dead, 1)) { | 497 | kill_ioctx(ctx); |
| 499 | hlist_del_rcu(&ctx->list); | ||
| 500 | call_rcu(&ctx->rcu_head, kill_ioctx_rcu); | ||
| 501 | } | ||
| 502 | } | 498 | } |
| 503 | } | 499 | } |
| 504 | 500 | ||
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index b3fdd1a323d6..e68588e6b1e8 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
| @@ -1408,6 +1408,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
| 1408 | mres->lockname_len, mres->lockname); | 1408 | mres->lockname_len, mres->lockname); |
| 1409 | ret = -EFAULT; | 1409 | ret = -EFAULT; |
| 1410 | spin_unlock(&res->spinlock); | 1410 | spin_unlock(&res->spinlock); |
| 1411 | dlm_lockres_put(res); | ||
| 1411 | goto leave; | 1412 | goto leave; |
| 1412 | } | 1413 | } |
| 1413 | res->state |= DLM_LOCK_RES_MIGRATING; | 1414 | res->state |= DLM_LOCK_RES_MIGRATING; |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 04ee1b57c243..b4a5cdf9dbc5 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -947,7 +947,7 @@ leave: | |||
| 947 | ocfs2_free_dir_lookup_result(&orphan_insert); | 947 | ocfs2_free_dir_lookup_result(&orphan_insert); |
| 948 | ocfs2_free_dir_lookup_result(&lookup); | 948 | ocfs2_free_dir_lookup_result(&lookup); |
| 949 | 949 | ||
| 950 | if (status) | 950 | if (status && (status != -ENOTEMPTY)) |
| 951 | mlog_errno(status); | 951 | mlog_errno(status); |
| 952 | 952 | ||
| 953 | return status; | 953 | return status; |
| @@ -2216,7 +2216,7 @@ out: | |||
| 2216 | 2216 | ||
| 2217 | brelse(orphan_dir_bh); | 2217 | brelse(orphan_dir_bh); |
| 2218 | 2218 | ||
| 2219 | return 0; | 2219 | return ret; |
| 2220 | } | 2220 | } |
| 2221 | 2221 | ||
| 2222 | int ocfs2_create_inode_in_orphan(struct inode *dir, | 2222 | int ocfs2_create_inode_in_orphan(struct inode *dir, |
diff --git a/fs/proc/kmsg.c b/fs/proc/kmsg.c index bd4b5a740ff1..bdfabdaefdce 100644 --- a/fs/proc/kmsg.c +++ b/fs/proc/kmsg.c | |||
| @@ -21,12 +21,12 @@ extern wait_queue_head_t log_wait; | |||
| 21 | 21 | ||
| 22 | static int kmsg_open(struct inode * inode, struct file * file) | 22 | static int kmsg_open(struct inode * inode, struct file * file) |
| 23 | { | 23 | { |
| 24 | return do_syslog(SYSLOG_ACTION_OPEN, NULL, 0, SYSLOG_FROM_FILE); | 24 | return do_syslog(SYSLOG_ACTION_OPEN, NULL, 0, SYSLOG_FROM_PROC); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | static int kmsg_release(struct inode * inode, struct file * file) | 27 | static int kmsg_release(struct inode * inode, struct file * file) |
| 28 | { | 28 | { |
| 29 | (void) do_syslog(SYSLOG_ACTION_CLOSE, NULL, 0, SYSLOG_FROM_FILE); | 29 | (void) do_syslog(SYSLOG_ACTION_CLOSE, NULL, 0, SYSLOG_FROM_PROC); |
| 30 | return 0; | 30 | return 0; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| @@ -34,15 +34,15 @@ static ssize_t kmsg_read(struct file *file, char __user *buf, | |||
| 34 | size_t count, loff_t *ppos) | 34 | size_t count, loff_t *ppos) |
| 35 | { | 35 | { |
| 36 | if ((file->f_flags & O_NONBLOCK) && | 36 | if ((file->f_flags & O_NONBLOCK) && |
| 37 | !do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_FILE)) | 37 | !do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_PROC)) |
| 38 | return -EAGAIN; | 38 | return -EAGAIN; |
| 39 | return do_syslog(SYSLOG_ACTION_READ, buf, count, SYSLOG_FROM_FILE); | 39 | return do_syslog(SYSLOG_ACTION_READ, buf, count, SYSLOG_FROM_PROC); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | static unsigned int kmsg_poll(struct file *file, poll_table *wait) | 42 | static unsigned int kmsg_poll(struct file *file, poll_table *wait) |
| 43 | { | 43 | { |
| 44 | poll_wait(file, &log_wait, wait); | 44 | poll_wait(file, &log_wait, wait); |
| 45 | if (do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_FILE)) | 45 | if (do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_PROC)) |
| 46 | return POLLIN | POLLRDNORM; | 46 | return POLLIN | POLLRDNORM; |
| 47 | return 0; | 47 | return 0; |
| 48 | } | 48 | } |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index c6f6e0839b61..9f3c7e81270a 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -175,6 +175,8 @@ extern struct bus_type cpu_subsys; | |||
| 175 | 175 | ||
| 176 | extern void get_online_cpus(void); | 176 | extern void get_online_cpus(void); |
| 177 | extern void put_online_cpus(void); | 177 | extern void put_online_cpus(void); |
| 178 | extern void cpu_hotplug_disable(void); | ||
| 179 | extern void cpu_hotplug_enable(void); | ||
| 178 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) | 180 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) |
| 179 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) | 181 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) |
| 180 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) | 182 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) |
| @@ -198,6 +200,8 @@ static inline void cpu_hotplug_driver_unlock(void) | |||
| 198 | 200 | ||
| 199 | #define get_online_cpus() do { } while (0) | 201 | #define get_online_cpus() do { } while (0) |
| 200 | #define put_online_cpus() do { } while (0) | 202 | #define put_online_cpus() do { } while (0) |
| 203 | #define cpu_hotplug_disable() do { } while (0) | ||
| 204 | #define cpu_hotplug_enable() do { } while (0) | ||
| 201 | #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) | 205 | #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) |
| 202 | /* These aren't inline functions due to a GCC bug. */ | 206 | /* These aren't inline functions due to a GCC bug. */ |
| 203 | #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) | 207 | #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) |
diff --git a/include/linux/math64.h b/include/linux/math64.h index b8ba85544721..2913b86eb12a 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h | |||
| @@ -6,7 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | #if BITS_PER_LONG == 64 | 7 | #if BITS_PER_LONG == 64 |
| 8 | 8 | ||
| 9 | #define div64_long(x,y) div64_s64((x),(y)) | 9 | #define div64_long(x, y) div64_s64((x), (y)) |
| 10 | #define div64_ul(x, y) div64_u64((x), (y)) | ||
| 10 | 11 | ||
| 11 | /** | 12 | /** |
| 12 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder | 13 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder |
| @@ -47,7 +48,8 @@ static inline s64 div64_s64(s64 dividend, s64 divisor) | |||
| 47 | 48 | ||
| 48 | #elif BITS_PER_LONG == 32 | 49 | #elif BITS_PER_LONG == 32 |
| 49 | 50 | ||
| 50 | #define div64_long(x,y) div_s64((x),(y)) | 51 | #define div64_long(x, y) div_s64((x), (y)) |
| 52 | #define div64_ul(x, y) div_u64((x), (y)) | ||
| 51 | 53 | ||
| 52 | #ifndef div_u64_rem | 54 | #ifndef div_u64_rem |
| 53 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | 55 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) |
diff --git a/include/linux/swapops.h b/include/linux/swapops.h index 47ead515c811..c5fd30d2a415 100644 --- a/include/linux/swapops.h +++ b/include/linux/swapops.h | |||
| @@ -137,6 +137,7 @@ static inline void make_migration_entry_read(swp_entry_t *entry) | |||
| 137 | 137 | ||
| 138 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 138 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
| 139 | unsigned long address); | 139 | unsigned long address); |
| 140 | extern void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte); | ||
| 140 | #else | 141 | #else |
| 141 | 142 | ||
| 142 | #define make_migration_entry(page, write) swp_entry(0, 0) | 143 | #define make_migration_entry(page, write) swp_entry(0, 0) |
| @@ -148,6 +149,8 @@ static inline int is_migration_entry(swp_entry_t swp) | |||
| 148 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } | 149 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } |
| 149 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 150 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
| 150 | unsigned long address) { } | 151 | unsigned long address) { } |
| 152 | static inline void migration_entry_wait_huge(struct mm_struct *mm, | ||
| 153 | pte_t *pte) { } | ||
| 151 | static inline int is_write_migration_entry(swp_entry_t entry) | 154 | static inline int is_write_migration_entry(swp_entry_t entry) |
| 152 | { | 155 | { |
| 153 | return 0; | 156 | return 0; |
diff --git a/include/linux/syslog.h b/include/linux/syslog.h index 38911391a139..98a3153c0f96 100644 --- a/include/linux/syslog.h +++ b/include/linux/syslog.h | |||
| @@ -44,8 +44,8 @@ | |||
| 44 | /* Return size of the log buffer */ | 44 | /* Return size of the log buffer */ |
| 45 | #define SYSLOG_ACTION_SIZE_BUFFER 10 | 45 | #define SYSLOG_ACTION_SIZE_BUFFER 10 |
| 46 | 46 | ||
| 47 | #define SYSLOG_FROM_CALL 0 | 47 | #define SYSLOG_FROM_READER 0 |
| 48 | #define SYSLOG_FROM_FILE 1 | 48 | #define SYSLOG_FROM_PROC 1 |
| 49 | 49 | ||
| 50 | int do_syslog(int type, char __user *buf, int count, bool from_file); | 50 | int do_syslog(int type, char __user *buf, int count, bool from_file); |
| 51 | 51 | ||
diff --git a/kernel/audit.c b/kernel/audit.c index 21c7fa615bd3..91e53d04b6a9 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
| @@ -1056,7 +1056,7 @@ static inline void audit_get_stamp(struct audit_context *ctx, | |||
| 1056 | static void wait_for_auditd(unsigned long sleep_time) | 1056 | static void wait_for_auditd(unsigned long sleep_time) |
| 1057 | { | 1057 | { |
| 1058 | DECLARE_WAITQUEUE(wait, current); | 1058 | DECLARE_WAITQUEUE(wait, current); |
| 1059 | set_current_state(TASK_INTERRUPTIBLE); | 1059 | set_current_state(TASK_UNINTERRUPTIBLE); |
| 1060 | add_wait_queue(&audit_backlog_wait, &wait); | 1060 | add_wait_queue(&audit_backlog_wait, &wait); |
| 1061 | 1061 | ||
| 1062 | if (audit_backlog_limit && | 1062 | if (audit_backlog_limit && |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index a291aa23fb3f..43c307dc9453 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -658,6 +658,7 @@ int audit_add_tree_rule(struct audit_krule *rule) | |||
| 658 | struct vfsmount *mnt; | 658 | struct vfsmount *mnt; |
| 659 | int err; | 659 | int err; |
| 660 | 660 | ||
| 661 | rule->tree = NULL; | ||
| 661 | list_for_each_entry(tree, &tree_list, list) { | 662 | list_for_each_entry(tree, &tree_list, list) { |
| 662 | if (!strcmp(seed->pathname, tree->pathname)) { | 663 | if (!strcmp(seed->pathname, tree->pathname)) { |
| 663 | put_tree(seed); | 664 | put_tree(seed); |
diff --git a/kernel/cpu.c b/kernel/cpu.c index b5e4ab2d427e..198a38883e64 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -133,6 +133,27 @@ static void cpu_hotplug_done(void) | |||
| 133 | mutex_unlock(&cpu_hotplug.lock); | 133 | mutex_unlock(&cpu_hotplug.lock); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | /* | ||
| 137 | * Wait for currently running CPU hotplug operations to complete (if any) and | ||
| 138 | * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects | ||
| 139 | * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the | ||
| 140 | * hotplug path before performing hotplug operations. So acquiring that lock | ||
| 141 | * guarantees mutual exclusion from any currently running hotplug operations. | ||
| 142 | */ | ||
| 143 | void cpu_hotplug_disable(void) | ||
| 144 | { | ||
| 145 | cpu_maps_update_begin(); | ||
| 146 | cpu_hotplug_disabled = 1; | ||
| 147 | cpu_maps_update_done(); | ||
| 148 | } | ||
| 149 | |||
| 150 | void cpu_hotplug_enable(void) | ||
| 151 | { | ||
| 152 | cpu_maps_update_begin(); | ||
| 153 | cpu_hotplug_disabled = 0; | ||
| 154 | cpu_maps_update_done(); | ||
| 155 | } | ||
| 156 | |||
| 136 | #else /* #if CONFIG_HOTPLUG_CPU */ | 157 | #else /* #if CONFIG_HOTPLUG_CPU */ |
| 137 | static void cpu_hotplug_begin(void) {} | 158 | static void cpu_hotplug_begin(void) {} |
| 138 | static void cpu_hotplug_done(void) {} | 159 | static void cpu_hotplug_done(void) {} |
| @@ -541,36 +562,6 @@ static int __init alloc_frozen_cpus(void) | |||
| 541 | core_initcall(alloc_frozen_cpus); | 562 | core_initcall(alloc_frozen_cpus); |
| 542 | 563 | ||
| 543 | /* | 564 | /* |
| 544 | * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU | ||
| 545 | * hotplug when tasks are about to be frozen. Also, don't allow the freezer | ||
| 546 | * to continue until any currently running CPU hotplug operation gets | ||
| 547 | * completed. | ||
| 548 | * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the | ||
| 549 | * 'cpu_add_remove_lock'. And this same lock is also taken by the regular | ||
| 550 | * CPU hotplug path and released only after it is complete. Thus, we | ||
| 551 | * (and hence the freezer) will block here until any currently running CPU | ||
| 552 | * hotplug operation gets completed. | ||
| 553 | */ | ||
| 554 | void cpu_hotplug_disable_before_freeze(void) | ||
| 555 | { | ||
| 556 | cpu_maps_update_begin(); | ||
| 557 | cpu_hotplug_disabled = 1; | ||
| 558 | cpu_maps_update_done(); | ||
| 559 | } | ||
| 560 | |||
| 561 | |||
| 562 | /* | ||
| 563 | * When tasks have been thawed, re-enable regular CPU hotplug (which had been | ||
| 564 | * disabled while beginning to freeze tasks). | ||
| 565 | */ | ||
| 566 | void cpu_hotplug_enable_after_thaw(void) | ||
| 567 | { | ||
| 568 | cpu_maps_update_begin(); | ||
| 569 | cpu_hotplug_disabled = 0; | ||
| 570 | cpu_maps_update_done(); | ||
| 571 | } | ||
| 572 | |||
| 573 | /* | ||
| 574 | * When callbacks for CPU hotplug notifications are being executed, we must | 565 | * When callbacks for CPU hotplug notifications are being executed, we must |
| 575 | * ensure that the state of the system with respect to the tasks being frozen | 566 | * ensure that the state of the system with respect to the tasks being frozen |
| 576 | * or not, as reported by the notification, remains unchanged *throughout the | 567 | * or not, as reported by the notification, remains unchanged *throughout the |
| @@ -589,12 +580,12 @@ cpu_hotplug_pm_callback(struct notifier_block *nb, | |||
| 589 | 580 | ||
| 590 | case PM_SUSPEND_PREPARE: | 581 | case PM_SUSPEND_PREPARE: |
| 591 | case PM_HIBERNATION_PREPARE: | 582 | case PM_HIBERNATION_PREPARE: |
| 592 | cpu_hotplug_disable_before_freeze(); | 583 | cpu_hotplug_disable(); |
| 593 | break; | 584 | break; |
| 594 | 585 | ||
| 595 | case PM_POST_SUSPEND: | 586 | case PM_POST_SUSPEND: |
| 596 | case PM_POST_HIBERNATION: | 587 | case PM_POST_HIBERNATION: |
| 597 | cpu_hotplug_enable_after_thaw(); | 588 | cpu_hotplug_enable(); |
| 598 | break; | 589 | break; |
| 599 | 590 | ||
| 600 | default: | 591 | default: |
diff --git a/kernel/printk.c b/kernel/printk.c index fa36e1494420..8212c1aef125 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -363,6 +363,53 @@ static void log_store(int facility, int level, | |||
| 363 | log_next_seq++; | 363 | log_next_seq++; |
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | #ifdef CONFIG_SECURITY_DMESG_RESTRICT | ||
| 367 | int dmesg_restrict = 1; | ||
| 368 | #else | ||
| 369 | int dmesg_restrict; | ||
| 370 | #endif | ||
| 371 | |||
| 372 | static int syslog_action_restricted(int type) | ||
| 373 | { | ||
| 374 | if (dmesg_restrict) | ||
| 375 | return 1; | ||
| 376 | /* | ||
| 377 | * Unless restricted, we allow "read all" and "get buffer size" | ||
| 378 | * for everybody. | ||
| 379 | */ | ||
| 380 | return type != SYSLOG_ACTION_READ_ALL && | ||
| 381 | type != SYSLOG_ACTION_SIZE_BUFFER; | ||
| 382 | } | ||
| 383 | |||
| 384 | static int check_syslog_permissions(int type, bool from_file) | ||
| 385 | { | ||
| 386 | /* | ||
| 387 | * If this is from /proc/kmsg and we've already opened it, then we've | ||
| 388 | * already done the capabilities checks at open time. | ||
| 389 | */ | ||
| 390 | if (from_file && type != SYSLOG_ACTION_OPEN) | ||
| 391 | return 0; | ||
| 392 | |||
| 393 | if (syslog_action_restricted(type)) { | ||
| 394 | if (capable(CAP_SYSLOG)) | ||
| 395 | return 0; | ||
| 396 | /* | ||
| 397 | * For historical reasons, accept CAP_SYS_ADMIN too, with | ||
| 398 | * a warning. | ||
| 399 | */ | ||
| 400 | if (capable(CAP_SYS_ADMIN)) { | ||
| 401 | pr_warn_once("%s (%d): Attempt to access syslog with " | ||
| 402 | "CAP_SYS_ADMIN but no CAP_SYSLOG " | ||
| 403 | "(deprecated).\n", | ||
| 404 | current->comm, task_pid_nr(current)); | ||
| 405 | return 0; | ||
| 406 | } | ||
| 407 | return -EPERM; | ||
| 408 | } | ||
| 409 | return security_syslog(type); | ||
| 410 | } | ||
| 411 | |||
| 412 | |||
| 366 | /* /dev/kmsg - userspace message inject/listen interface */ | 413 | /* /dev/kmsg - userspace message inject/listen interface */ |
| 367 | struct devkmsg_user { | 414 | struct devkmsg_user { |
| 368 | u64 seq; | 415 | u64 seq; |
| @@ -620,7 +667,8 @@ static int devkmsg_open(struct inode *inode, struct file *file) | |||
| 620 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) | 667 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) |
| 621 | return 0; | 668 | return 0; |
| 622 | 669 | ||
| 623 | err = security_syslog(SYSLOG_ACTION_READ_ALL); | 670 | err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL, |
| 671 | SYSLOG_FROM_READER); | ||
| 624 | if (err) | 672 | if (err) |
| 625 | return err; | 673 | return err; |
| 626 | 674 | ||
| @@ -813,45 +861,6 @@ static inline void boot_delay_msec(int level) | |||
| 813 | } | 861 | } |
| 814 | #endif | 862 | #endif |
| 815 | 863 | ||
| 816 | #ifdef CONFIG_SECURITY_DMESG_RESTRICT | ||
| 817 | int dmesg_restrict = 1; | ||
| 818 | #else | ||
| 819 | int dmesg_restrict; | ||
| 820 | #endif | ||
| 821 | |||
| 822 | static int syslog_action_restricted(int type) | ||
| 823 | { | ||
| 824 | if (dmesg_restrict) | ||
| 825 | return 1; | ||
| 826 | /* Unless restricted, we allow "read all" and "get buffer size" for everybody */ | ||
| 827 | return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER; | ||
| 828 | } | ||
| 829 | |||
| 830 | static int check_syslog_permissions(int type, bool from_file) | ||
| 831 | { | ||
| 832 | /* | ||
| 833 | * If this is from /proc/kmsg and we've already opened it, then we've | ||
| 834 | * already done the capabilities checks at open time. | ||
| 835 | */ | ||
| 836 | if (from_file && type != SYSLOG_ACTION_OPEN) | ||
| 837 | return 0; | ||
| 838 | |||
| 839 | if (syslog_action_restricted(type)) { | ||
| 840 | if (capable(CAP_SYSLOG)) | ||
| 841 | return 0; | ||
| 842 | /* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */ | ||
| 843 | if (capable(CAP_SYS_ADMIN)) { | ||
| 844 | printk_once(KERN_WARNING "%s (%d): " | ||
| 845 | "Attempt to access syslog with CAP_SYS_ADMIN " | ||
| 846 | "but no CAP_SYSLOG (deprecated).\n", | ||
| 847 | current->comm, task_pid_nr(current)); | ||
| 848 | return 0; | ||
| 849 | } | ||
| 850 | return -EPERM; | ||
| 851 | } | ||
| 852 | return 0; | ||
| 853 | } | ||
| 854 | |||
| 855 | #if defined(CONFIG_PRINTK_TIME) | 864 | #if defined(CONFIG_PRINTK_TIME) |
| 856 | static bool printk_time = 1; | 865 | static bool printk_time = 1; |
| 857 | #else | 866 | #else |
| @@ -1249,7 +1258,7 @@ out: | |||
| 1249 | 1258 | ||
| 1250 | SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) | 1259 | SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) |
| 1251 | { | 1260 | { |
| 1252 | return do_syslog(type, buf, len, SYSLOG_FROM_CALL); | 1261 | return do_syslog(type, buf, len, SYSLOG_FROM_READER); |
| 1253 | } | 1262 | } |
| 1254 | 1263 | ||
| 1255 | /* | 1264 | /* |
diff --git a/kernel/sys.c b/kernel/sys.c index b95d3c72ba21..2bbd9a73b54c 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -362,6 +362,29 @@ int unregister_reboot_notifier(struct notifier_block *nb) | |||
| 362 | } | 362 | } |
| 363 | EXPORT_SYMBOL(unregister_reboot_notifier); | 363 | EXPORT_SYMBOL(unregister_reboot_notifier); |
| 364 | 364 | ||
| 365 | /* Add backwards compatibility for stable trees. */ | ||
| 366 | #ifndef PF_NO_SETAFFINITY | ||
| 367 | #define PF_NO_SETAFFINITY PF_THREAD_BOUND | ||
| 368 | #endif | ||
| 369 | |||
| 370 | static void migrate_to_reboot_cpu(void) | ||
| 371 | { | ||
| 372 | /* The boot cpu is always logical cpu 0 */ | ||
| 373 | int cpu = 0; | ||
| 374 | |||
| 375 | cpu_hotplug_disable(); | ||
| 376 | |||
| 377 | /* Make certain the cpu I'm about to reboot on is online */ | ||
| 378 | if (!cpu_online(cpu)) | ||
| 379 | cpu = cpumask_first(cpu_online_mask); | ||
| 380 | |||
| 381 | /* Prevent races with other tasks migrating this task */ | ||
| 382 | current->flags |= PF_NO_SETAFFINITY; | ||
| 383 | |||
| 384 | /* Make certain I only run on the appropriate processor */ | ||
| 385 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
| 386 | } | ||
| 387 | |||
| 365 | /** | 388 | /** |
| 366 | * kernel_restart - reboot the system | 389 | * kernel_restart - reboot the system |
| 367 | * @cmd: pointer to buffer containing command to execute for restart | 390 | * @cmd: pointer to buffer containing command to execute for restart |
| @@ -373,7 +396,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); | |||
| 373 | void kernel_restart(char *cmd) | 396 | void kernel_restart(char *cmd) |
| 374 | { | 397 | { |
| 375 | kernel_restart_prepare(cmd); | 398 | kernel_restart_prepare(cmd); |
| 376 | disable_nonboot_cpus(); | 399 | migrate_to_reboot_cpu(); |
| 377 | syscore_shutdown(); | 400 | syscore_shutdown(); |
| 378 | if (!cmd) | 401 | if (!cmd) |
| 379 | printk(KERN_EMERG "Restarting system.\n"); | 402 | printk(KERN_EMERG "Restarting system.\n"); |
| @@ -400,7 +423,7 @@ static void kernel_shutdown_prepare(enum system_states state) | |||
| 400 | void kernel_halt(void) | 423 | void kernel_halt(void) |
| 401 | { | 424 | { |
| 402 | kernel_shutdown_prepare(SYSTEM_HALT); | 425 | kernel_shutdown_prepare(SYSTEM_HALT); |
| 403 | disable_nonboot_cpus(); | 426 | migrate_to_reboot_cpu(); |
| 404 | syscore_shutdown(); | 427 | syscore_shutdown(); |
| 405 | printk(KERN_EMERG "System halted.\n"); | 428 | printk(KERN_EMERG "System halted.\n"); |
| 406 | kmsg_dump(KMSG_DUMP_HALT); | 429 | kmsg_dump(KMSG_DUMP_HALT); |
| @@ -419,7 +442,7 @@ void kernel_power_off(void) | |||
| 419 | kernel_shutdown_prepare(SYSTEM_POWER_OFF); | 442 | kernel_shutdown_prepare(SYSTEM_POWER_OFF); |
| 420 | if (pm_power_off_prepare) | 443 | if (pm_power_off_prepare) |
| 421 | pm_power_off_prepare(); | 444 | pm_power_off_prepare(); |
| 422 | disable_nonboot_cpus(); | 445 | migrate_to_reboot_cpu(); |
| 423 | syscore_shutdown(); | 446 | syscore_shutdown(); |
| 424 | printk(KERN_EMERG "Power down.\n"); | 447 | printk(KERN_EMERG "Power down.\n"); |
| 425 | kmsg_dump(KMSG_DUMP_POWEROFF); | 448 | kmsg_dump(KMSG_DUMP_POWEROFF); |
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 5f9c44cdf1f5..4cc6442733f4 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
| @@ -37,7 +37,7 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes) | |||
| 37 | mpi_limb_t a; | 37 | mpi_limb_t a; |
| 38 | MPI val = NULL; | 38 | MPI val = NULL; |
| 39 | 39 | ||
| 40 | while (nbytes >= 0 && buffer[0] == 0) { | 40 | while (nbytes > 0 && buffer[0] == 0) { |
| 41 | buffer++; | 41 | buffer++; |
| 42 | nbytes--; | 42 | nbytes--; |
| 43 | } | 43 | } |
diff --git a/mm/frontswap.c b/mm/frontswap.c index 538367ef1372..1b24bdcb3197 100644 --- a/mm/frontswap.c +++ b/mm/frontswap.c | |||
| @@ -319,7 +319,7 @@ void __frontswap_invalidate_area(unsigned type) | |||
| 319 | return; | 319 | return; |
| 320 | frontswap_ops->invalidate_area(type); | 320 | frontswap_ops->invalidate_area(type); |
| 321 | atomic_set(&sis->frontswap_pages, 0); | 321 | atomic_set(&sis->frontswap_pages, 0); |
| 322 | memset(sis->frontswap_map, 0, sis->max / sizeof(long)); | 322 | bitmap_zero(sis->frontswap_map, sis->max); |
| 323 | } | 323 | } |
| 324 | clear_bit(type, need_init); | 324 | clear_bit(type, need_init); |
| 325 | } | 325 | } |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f8feeeca6686..e2bfbf73a551 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -2839,7 +2839,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2839 | if (ptep) { | 2839 | if (ptep) { |
| 2840 | entry = huge_ptep_get(ptep); | 2840 | entry = huge_ptep_get(ptep); |
| 2841 | if (unlikely(is_hugetlb_entry_migration(entry))) { | 2841 | if (unlikely(is_hugetlb_entry_migration(entry))) { |
| 2842 | migration_entry_wait(mm, (pmd_t *)ptep, address); | 2842 | migration_entry_wait_huge(mm, ptep); |
| 2843 | return 0; | 2843 | return 0; |
| 2844 | } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) | 2844 | } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) |
| 2845 | return VM_FAULT_HWPOISON_LARGE | | 2845 | return VM_FAULT_HWPOISON_LARGE | |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 010d6c14129a..194721839cf5 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1199,7 +1199,6 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | |||
| 1199 | 1199 | ||
| 1200 | mz = mem_cgroup_zoneinfo(root, nid, zid); | 1200 | mz = mem_cgroup_zoneinfo(root, nid, zid); |
| 1201 | iter = &mz->reclaim_iter[reclaim->priority]; | 1201 | iter = &mz->reclaim_iter[reclaim->priority]; |
| 1202 | last_visited = iter->last_visited; | ||
| 1203 | if (prev && reclaim->generation != iter->generation) { | 1202 | if (prev && reclaim->generation != iter->generation) { |
| 1204 | iter->last_visited = NULL; | 1203 | iter->last_visited = NULL; |
| 1205 | goto out_unlock; | 1204 | goto out_unlock; |
| @@ -1218,13 +1217,12 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | |||
| 1218 | * is alive. | 1217 | * is alive. |
| 1219 | */ | 1218 | */ |
| 1220 | dead_count = atomic_read(&root->dead_count); | 1219 | dead_count = atomic_read(&root->dead_count); |
| 1221 | smp_rmb(); | 1220 | if (dead_count == iter->last_dead_count) { |
| 1222 | last_visited = iter->last_visited; | 1221 | smp_rmb(); |
| 1223 | if (last_visited) { | 1222 | last_visited = iter->last_visited; |
| 1224 | if ((dead_count != iter->last_dead_count) || | 1223 | if (last_visited && |
| 1225 | !css_tryget(&last_visited->css)) { | 1224 | !css_tryget(&last_visited->css)) |
| 1226 | last_visited = NULL; | 1225 | last_visited = NULL; |
| 1227 | } | ||
| 1228 | } | 1226 | } |
| 1229 | } | 1227 | } |
| 1230 | 1228 | ||
| @@ -3141,8 +3139,6 @@ int memcg_update_cache_size(struct kmem_cache *s, int num_groups) | |||
| 3141 | return -ENOMEM; | 3139 | return -ENOMEM; |
| 3142 | } | 3140 | } |
| 3143 | 3141 | ||
| 3144 | INIT_WORK(&s->memcg_params->destroy, | ||
| 3145 | kmem_cache_destroy_work_func); | ||
| 3146 | s->memcg_params->is_root_cache = true; | 3142 | s->memcg_params->is_root_cache = true; |
| 3147 | 3143 | ||
| 3148 | /* | 3144 | /* |
diff --git a/mm/migrate.c b/mm/migrate.c index b1f57501de9c..6f0c24438bba 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -200,15 +200,14 @@ static void remove_migration_ptes(struct page *old, struct page *new) | |||
| 200 | * get to the page and wait until migration is finished. | 200 | * get to the page and wait until migration is finished. |
| 201 | * When we return from this function the fault will be retried. | 201 | * When we return from this function the fault will be retried. |
| 202 | */ | 202 | */ |
| 203 | void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 203 | static void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, |
| 204 | unsigned long address) | 204 | spinlock_t *ptl) |
| 205 | { | 205 | { |
| 206 | pte_t *ptep, pte; | 206 | pte_t pte; |
| 207 | spinlock_t *ptl; | ||
| 208 | swp_entry_t entry; | 207 | swp_entry_t entry; |
| 209 | struct page *page; | 208 | struct page *page; |
| 210 | 209 | ||
| 211 | ptep = pte_offset_map_lock(mm, pmd, address, &ptl); | 210 | spin_lock(ptl); |
| 212 | pte = *ptep; | 211 | pte = *ptep; |
| 213 | if (!is_swap_pte(pte)) | 212 | if (!is_swap_pte(pte)) |
| 214 | goto out; | 213 | goto out; |
| @@ -236,6 +235,20 @@ out: | |||
| 236 | pte_unmap_unlock(ptep, ptl); | 235 | pte_unmap_unlock(ptep, ptl); |
| 237 | } | 236 | } |
| 238 | 237 | ||
| 238 | void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | ||
| 239 | unsigned long address) | ||
| 240 | { | ||
| 241 | spinlock_t *ptl = pte_lockptr(mm, pmd); | ||
| 242 | pte_t *ptep = pte_offset_map(pmd, address); | ||
| 243 | __migration_entry_wait(mm, ptep, ptl); | ||
| 244 | } | ||
| 245 | |||
| 246 | void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte) | ||
| 247 | { | ||
| 248 | spinlock_t *ptl = &(mm)->page_table_lock; | ||
| 249 | __migration_entry_wait(mm, pte, ptl); | ||
| 250 | } | ||
| 251 | |||
| 239 | #ifdef CONFIG_BLOCK | 252 | #ifdef CONFIG_BLOCK |
| 240 | /* Returns true if all buffers are successfully locked */ | 253 | /* Returns true if all buffers are successfully locked */ |
| 241 | static bool buffer_migrate_lock_buffers(struct buffer_head *head, | 254 | static bool buffer_migrate_lock_buffers(struct buffer_head *head, |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 378a15bcd649..c3edb624fccf 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -1628,6 +1628,7 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, | |||
| 1628 | long min = mark; | 1628 | long min = mark; |
| 1629 | long lowmem_reserve = z->lowmem_reserve[classzone_idx]; | 1629 | long lowmem_reserve = z->lowmem_reserve[classzone_idx]; |
| 1630 | int o; | 1630 | int o; |
| 1631 | long free_cma = 0; | ||
| 1631 | 1632 | ||
| 1632 | free_pages -= (1 << order) - 1; | 1633 | free_pages -= (1 << order) - 1; |
| 1633 | if (alloc_flags & ALLOC_HIGH) | 1634 | if (alloc_flags & ALLOC_HIGH) |
| @@ -1637,9 +1638,10 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, | |||
| 1637 | #ifdef CONFIG_CMA | 1638 | #ifdef CONFIG_CMA |
| 1638 | /* If allocation can't use CMA areas don't use free CMA pages */ | 1639 | /* If allocation can't use CMA areas don't use free CMA pages */ |
| 1639 | if (!(alloc_flags & ALLOC_CMA)) | 1640 | if (!(alloc_flags & ALLOC_CMA)) |
| 1640 | free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES); | 1641 | free_cma = zone_page_state(z, NR_FREE_CMA_PAGES); |
| 1641 | #endif | 1642 | #endif |
| 1642 | if (free_pages <= min + lowmem_reserve) | 1643 | |
| 1644 | if (free_pages - free_cma <= min + lowmem_reserve) | ||
| 1643 | return false; | 1645 | return false; |
| 1644 | for (o = 0; o < order; o++) { | 1646 | for (o = 0; o < order; o++) { |
| 1645 | /* At the next order, this order's pages become unavailable */ | 1647 | /* At the next order, this order's pages become unavailable */ |
diff --git a/mm/swap_state.c b/mm/swap_state.c index b3d40dcf3624..f24ab0dff554 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
| @@ -336,8 +336,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
| 336 | * Swap entry may have been freed since our caller observed it. | 336 | * Swap entry may have been freed since our caller observed it. |
| 337 | */ | 337 | */ |
| 338 | err = swapcache_prepare(entry); | 338 | err = swapcache_prepare(entry); |
| 339 | if (err == -EEXIST) { /* seems racy */ | 339 | if (err == -EEXIST) { |
| 340 | radix_tree_preload_end(); | 340 | radix_tree_preload_end(); |
| 341 | /* | ||
| 342 | * We might race against get_swap_page() and stumble | ||
| 343 | * across a SWAP_HAS_CACHE swap_map entry whose page | ||
| 344 | * has not been brought into the swapcache yet, while | ||
| 345 | * the other end is scheduled away waiting on discard | ||
| 346 | * I/O completion at scan_swap_map(). | ||
| 347 | * | ||
| 348 | * In order to avoid turning this transitory state | ||
| 349 | * into a permanent loop around this -EEXIST case | ||
| 350 | * if !CONFIG_PREEMPT and the I/O completion happens | ||
| 351 | * to be waiting on the CPU waitqueue where we are now | ||
| 352 | * busy looping, we just conditionally invoke the | ||
| 353 | * scheduler here, if there are some more important | ||
| 354 | * tasks to run. | ||
| 355 | */ | ||
| 356 | cond_resched(); | ||
| 341 | continue; | 357 | continue; |
| 342 | } | 358 | } |
| 343 | if (err) { /* swp entry is obsolete ? */ | 359 | if (err) { /* swp entry is obsolete ? */ |
diff --git a/mm/swapfile.c b/mm/swapfile.c index 6c340d908b27..746af55b8455 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
| @@ -2116,7 +2116,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) | |||
| 2116 | } | 2116 | } |
| 2117 | /* frontswap enabled? set up bit-per-page map for frontswap */ | 2117 | /* frontswap enabled? set up bit-per-page map for frontswap */ |
| 2118 | if (frontswap_enabled) | 2118 | if (frontswap_enabled) |
| 2119 | frontswap_map = vzalloc(maxpages / sizeof(long)); | 2119 | frontswap_map = vzalloc(BITS_TO_LONGS(maxpages) * sizeof(long)); |
| 2120 | 2120 | ||
| 2121 | if (p->bdev) { | 2121 | if (p->bdev) { |
| 2122 | if (blk_queue_nonrot(bdev_get_queue(p->bdev))) { | 2122 | if (blk_queue_nonrot(bdev_get_queue(p->bdev))) { |
