diff options
82 files changed, 709 insertions, 440 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 6c73b3bc7f34..7642365ed6d2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -896,11 +896,13 @@ S: Maintained | |||
| 896 | 896 | ||
| 897 | ARM/SAMSUNG ARM ARCHITECTURES | 897 | ARM/SAMSUNG ARM ARCHITECTURES |
| 898 | M: Ben Dooks <ben-linux@fluff.org> | 898 | M: Ben Dooks <ben-linux@fluff.org> |
| 899 | M: Kukjin Kim <kgene.kim@samsung.com> | ||
| 899 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 900 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 900 | W: http://www.fluff.org/ben/linux/ | 901 | W: http://www.fluff.org/ben/linux/ |
| 901 | S: Maintained | 902 | S: Maintained |
| 902 | F: arch/arm/plat-s3c/ | 903 | F: arch/arm/plat-samsung/ |
| 903 | F: arch/arm/plat-s3c24xx/ | 904 | F: arch/arm/plat-s3c24xx/ |
| 905 | F: arch/arm/plat-s5p/ | ||
| 904 | 906 | ||
| 905 | ARM/S3C2410 ARM ARCHITECTURE | 907 | ARM/S3C2410 ARM ARCHITECTURE |
| 906 | M: Ben Dooks <ben-linux@fluff.org> | 908 | M: Ben Dooks <ben-linux@fluff.org> |
| @@ -1148,7 +1150,7 @@ F: drivers/mmc/host/atmel-mci.c | |||
| 1148 | F: drivers/mmc/host/atmel-mci-regs.h | 1150 | F: drivers/mmc/host/atmel-mci-regs.h |
| 1149 | 1151 | ||
| 1150 | ATMEL AT91 / AT32 SERIAL DRIVER | 1152 | ATMEL AT91 / AT32 SERIAL DRIVER |
| 1151 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1153 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1152 | S: Supported | 1154 | S: Supported |
| 1153 | F: drivers/serial/atmel_serial.c | 1155 | F: drivers/serial/atmel_serial.c |
| 1154 | 1156 | ||
| @@ -1160,18 +1162,18 @@ F: drivers/video/atmel_lcdfb.c | |||
| 1160 | F: include/video/atmel_lcdc.h | 1162 | F: include/video/atmel_lcdc.h |
| 1161 | 1163 | ||
| 1162 | ATMEL MACB ETHERNET DRIVER | 1164 | ATMEL MACB ETHERNET DRIVER |
| 1163 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1165 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1164 | S: Supported | 1166 | S: Supported |
| 1165 | F: drivers/net/macb.* | 1167 | F: drivers/net/macb.* |
| 1166 | 1168 | ||
| 1167 | ATMEL SPI DRIVER | 1169 | ATMEL SPI DRIVER |
| 1168 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1170 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1169 | S: Supported | 1171 | S: Supported |
| 1170 | F: drivers/spi/atmel_spi.* | 1172 | F: drivers/spi/atmel_spi.* |
| 1171 | 1173 | ||
| 1172 | ATMEL USBA UDC DRIVER | 1174 | ATMEL USBA UDC DRIVER |
| 1173 | M: Haavard Skinnemoen <hskinnemoen@atmel.com> | 1175 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1174 | L: kernel@avr32linux.org | 1176 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1175 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver | 1177 | W: http://avr32linux.org/twiki/bin/view/Main/AtmelUsbDeviceDriver |
| 1176 | S: Supported | 1178 | S: Supported |
| 1177 | F: drivers/usb/gadget/atmel_usba_udc.* | 1179 | F: drivers/usb/gadget/atmel_usba_udc.* |
| @@ -3380,7 +3382,7 @@ KPROBES | |||
| 3380 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 3382 | M: Ananth N Mavinakayanahalli <ananth@in.ibm.com> |
| 3381 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 3383 | M: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
| 3382 | M: "David S. Miller" <davem@davemloft.net> | 3384 | M: "David S. Miller" <davem@davemloft.net> |
| 3383 | M: Masami Hiramatsu <mhiramat@redhat.com> | 3385 | M: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> |
| 3384 | S: Maintained | 3386 | S: Maintained |
| 3385 | F: Documentation/kprobes.txt | 3387 | F: Documentation/kprobes.txt |
| 3386 | F: include/linux/kprobes.h | 3388 | F: include/linux/kprobes.h |
| @@ -4628,6 +4630,12 @@ M: Robert Jarzmik <robert.jarzmik@free.fr> | |||
| 4628 | L: rtc-linux@googlegroups.com | 4630 | L: rtc-linux@googlegroups.com |
| 4629 | S: Maintained | 4631 | S: Maintained |
| 4630 | 4632 | ||
| 4633 | QLOGIC QLA1280 SCSI DRIVER | ||
| 4634 | M: Michael Reed <mdr@sgi.com> | ||
| 4635 | L: linux-scsi@vger.kernel.org | ||
| 4636 | S: Maintained | ||
| 4637 | F: drivers/scsi/qla1280.[ch] | ||
| 4638 | |||
| 4631 | QLOGIC QLA2XXX FC-SCSI DRIVER | 4639 | QLOGIC QLA2XXX FC-SCSI DRIVER |
| 4632 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> | 4640 | M: Andrew Vasquez <andrew.vasquez@qlogic.com> |
| 4633 | M: linux-driver@qlogic.com | 4641 | M: linux-driver@qlogic.com |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index f848ba8dbc16..a04cffd691c5 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
| @@ -538,9 +538,7 @@ static void ads7846_dev_init(void) | |||
| 538 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); | 538 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); |
| 539 | 539 | ||
| 540 | gpio_direction_input(OMAP3_STALKER_TS_GPIO); | 540 | gpio_direction_input(OMAP3_STALKER_TS_GPIO); |
| 541 | 541 | gpio_set_debounce(OMAP3_STALKER_TS_GPIO, 310); | |
| 542 | omap_set_gpio_debounce(OMAP3_STALKER_TS_GPIO, 1); | ||
| 543 | omap_set_gpio_debounce_time(OMAP3_STALKER_TS_GPIO, 0xa); | ||
| 544 | } | 542 | } |
| 545 | 543 | ||
| 546 | static int ads7846_get_pendown_state(void) | 544 | static int ads7846_get_pendown_state(void) |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 02804224517b..e10db7a90cb2 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -1369,6 +1369,7 @@ static struct clk emif1_ick = { | |||
| 1369 | .ops = &clkops_omap2_dflt, | 1369 | .ops = &clkops_omap2_dflt, |
| 1370 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL, | 1370 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL, |
| 1371 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | 1371 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, |
| 1372 | .flags = ENABLE_ON_INIT, | ||
| 1372 | .clkdm_name = "l3_emif_clkdm", | 1373 | .clkdm_name = "l3_emif_clkdm", |
| 1373 | .parent = &ddrphy_ck, | 1374 | .parent = &ddrphy_ck, |
| 1374 | .recalc = &followparent_recalc, | 1375 | .recalc = &followparent_recalc, |
| @@ -1379,6 +1380,7 @@ static struct clk emif2_ick = { | |||
| 1379 | .ops = &clkops_omap2_dflt, | 1380 | .ops = &clkops_omap2_dflt, |
| 1380 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL, | 1381 | .enable_reg = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL, |
| 1381 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | 1382 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, |
| 1383 | .flags = ENABLE_ON_INIT, | ||
| 1382 | .clkdm_name = "l3_emif_clkdm", | 1384 | .clkdm_name = "l3_emif_clkdm", |
| 1383 | .parent = &ddrphy_ck, | 1385 | .parent = &ddrphy_ck, |
| 1384 | .recalc = &followparent_recalc, | 1386 | .recalc = &followparent_recalc, |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 95c9a5f774e1..b7a4133267d8 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -409,10 +409,11 @@ static int _init_main_clk(struct omap_hwmod *oh) | |||
| 409 | return 0; | 409 | return 0; |
| 410 | 410 | ||
| 411 | oh->_clk = omap_clk_get_by_name(oh->main_clk); | 411 | oh->_clk = omap_clk_get_by_name(oh->main_clk); |
| 412 | if (!oh->_clk) | 412 | if (!oh->_clk) { |
| 413 | pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", | 413 | pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", |
| 414 | oh->name, oh->main_clk); | 414 | oh->name, oh->main_clk); |
| 415 | return -EINVAL; | 415 | return -EINVAL; |
| 416 | } | ||
| 416 | 417 | ||
| 417 | if (!oh->_clk->clkdm) | 418 | if (!oh->_clk->clkdm) |
| 418 | pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", | 419 | pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", |
| @@ -444,10 +445,11 @@ static int _init_interface_clks(struct omap_hwmod *oh) | |||
| 444 | continue; | 445 | continue; |
| 445 | 446 | ||
| 446 | c = omap_clk_get_by_name(os->clk); | 447 | c = omap_clk_get_by_name(os->clk); |
| 447 | if (!c) | 448 | if (!c) { |
| 448 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", | 449 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", |
| 449 | oh->name, os->clk); | 450 | oh->name, os->clk); |
| 450 | ret = -EINVAL; | 451 | ret = -EINVAL; |
| 452 | } | ||
| 451 | os->_clk = c; | 453 | os->_clk = c; |
| 452 | } | 454 | } |
| 453 | 455 | ||
| @@ -470,10 +472,11 @@ static int _init_opt_clks(struct omap_hwmod *oh) | |||
| 470 | 472 | ||
| 471 | for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { | 473 | for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { |
| 472 | c = omap_clk_get_by_name(oc->clk); | 474 | c = omap_clk_get_by_name(oc->clk); |
| 473 | if (!c) | 475 | if (!c) { |
| 474 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", | 476 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", |
| 475 | oh->name, oc->clk); | 477 | oh->name, oc->clk); |
| 476 | ret = -EINVAL; | 478 | ret = -EINVAL; |
| 479 | } | ||
| 477 | oc->_clk = c; | 480 | oc->_clk = c; |
| 478 | } | 481 | } |
| 479 | 482 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 2e967716cc3f..b88737fd6cfe 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -99,7 +99,7 @@ static void omap3_enable_io_chain(void) | |||
| 99 | /* Do a readback to assure write has been done */ | 99 | /* Do a readback to assure write has been done */ |
| 100 | prm_read_mod_reg(WKUP_MOD, PM_WKEN); | 100 | prm_read_mod_reg(WKUP_MOD, PM_WKEN); |
| 101 | 101 | ||
| 102 | while (!(prm_read_mod_reg(WKUP_MOD, PM_WKST) & | 102 | while (!(prm_read_mod_reg(WKUP_MOD, PM_WKEN) & |
| 103 | OMAP3430_ST_IO_CHAIN_MASK)) { | 103 | OMAP3430_ST_IO_CHAIN_MASK)) { |
| 104 | timeout++; | 104 | timeout++; |
| 105 | if (timeout > 1000) { | 105 | if (timeout > 1000) { |
| @@ -108,7 +108,7 @@ static void omap3_enable_io_chain(void) | |||
| 108 | return; | 108 | return; |
| 109 | } | 109 | } |
| 110 | prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, | 110 | prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, |
| 111 | WKUP_MOD, PM_WKST); | 111 | WKUP_MOD, PM_WKEN); |
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | } | 114 | } |
diff --git a/arch/arm/mach-omap2/usb-ehci.c b/arch/arm/mach-omap2/usb-ehci.c index c68f799e83c5..d72d1ac30333 100644 --- a/arch/arm/mach-omap2/usb-ehci.c +++ b/arch/arm/mach-omap2/usb-ehci.c | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
| 22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 23 | #include <linux/dma-mapping.h> | ||
| 24 | |||
| 23 | #include <asm/io.h> | 25 | #include <asm/io.h> |
| 24 | #include <plat/mux.h> | 26 | #include <plat/mux.h> |
| 25 | 27 | ||
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index e6f73030d5f0..9b11eedba65f 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * Versatile Express Core Tile Cortex A9x4 Support | 2 | * Versatile Express Core Tile Cortex A9x4 Support |
| 3 | */ | 3 | */ |
| 4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
| 5 | #include <linux/gfp.h> | ||
| 5 | #include <linux/device.h> | 6 | #include <linux/device.h> |
| 6 | #include <linux/dma-mapping.h> | 7 | #include <linux/dma-mapping.h> |
| 7 | #include <linux/platform_device.h> | 8 | #include <linux/platform_device.h> |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index c64875f11fac..44bafdab2dce 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
| @@ -541,11 +541,11 @@ void omap_dm_timer_stop(struct omap_dm_timer *timer) | |||
| 541 | * timer is stopped | 541 | * timer is stopped |
| 542 | */ | 542 | */ |
| 543 | udelay(3500000 / clk_get_rate(timer->fclk) + 1); | 543 | udelay(3500000 / clk_get_rate(timer->fclk) + 1); |
| 544 | /* Ack possibly pending interrupt */ | ||
| 545 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, | ||
| 546 | OMAP_TIMER_INT_OVERFLOW); | ||
| 547 | #endif | 544 | #endif |
| 548 | } | 545 | } |
| 546 | /* Ack possibly pending interrupt */ | ||
| 547 | omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, | ||
| 548 | OMAP_TIMER_INT_OVERFLOW); | ||
| 549 | } | 549 | } |
| 550 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | 550 | EXPORT_SYMBOL_GPL(omap_dm_timer_stop); |
| 551 | 551 | ||
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 393e9219a5b6..9b7e3545f325 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -673,6 +673,7 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | |||
| 673 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) | 673 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) |
| 674 | clk_disable(bank->dbck); | 674 | clk_disable(bank->dbck); |
| 675 | } | 675 | } |
| 676 | bank->dbck_enable_mask = val; | ||
| 676 | 677 | ||
| 677 | __raw_writel(val, reg); | 678 | __raw_writel(val, reg); |
| 678 | } | 679 | } |
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index e43983ba59c5..8ce0de247c71 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
| @@ -140,8 +140,10 @@ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags) | |||
| 140 | return ERR_PTR(-ENOMEM); | 140 | return ERR_PTR(-ENOMEM); |
| 141 | 141 | ||
| 142 | err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); | 142 | err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); |
| 143 | if (err) | 143 | if (err) { |
| 144 | kfree(sgt); | ||
| 144 | return ERR_PTR(err); | 145 | return ERR_PTR(err); |
| 146 | } | ||
| 145 | 147 | ||
| 146 | pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); | 148 | pr_debug("%s: sgt:%p(%d entries)\n", __func__, sgt, nr_entries); |
| 147 | 149 | ||
diff --git a/arch/um/include/asm/arch_hweight.h b/arch/um/include/asm/arch_hweight.h new file mode 100644 index 000000000000..c656cf443f4a --- /dev/null +++ b/arch/um/include/asm/arch_hweight.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef _ASM_UM_HWEIGHT_H | ||
| 2 | #define _ASM_UM_HWEIGHT_H | ||
| 3 | |||
| 4 | #include <asm-generic/bitops/arch_hweight.h> | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/arch/um/os-Linux/mem.c b/arch/um/os-Linux/mem.c index 93a11d7edfa0..e696144d2be3 100644 --- a/arch/um/os-Linux/mem.c +++ b/arch/um/os-Linux/mem.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <errno.h> | 10 | #include <errno.h> |
| 11 | #include <fcntl.h> | 11 | #include <fcntl.h> |
| 12 | #include <string.h> | 12 | #include <string.h> |
| 13 | #include <sys/stat.h> | ||
| 13 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
| 14 | #include <sys/param.h> | 15 | #include <sys/param.h> |
| 15 | #include "init.h" | 16 | #include "init.h" |
diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c index ed7aeff786b2..45bc9402aa49 100644 --- a/arch/x86/boot/video-vga.c +++ b/arch/x86/boot/video-vga.c | |||
| @@ -41,13 +41,12 @@ static __videocard video_vga; | |||
| 41 | static u8 vga_set_basic_mode(void) | 41 | static u8 vga_set_basic_mode(void) |
| 42 | { | 42 | { |
| 43 | struct biosregs ireg, oreg; | 43 | struct biosregs ireg, oreg; |
| 44 | u16 ax; | ||
| 45 | u8 mode; | 44 | u8 mode; |
| 46 | 45 | ||
| 47 | initregs(&ireg); | 46 | initregs(&ireg); |
| 48 | 47 | ||
| 49 | /* Query current mode */ | 48 | /* Query current mode */ |
| 50 | ax = 0x0f00; | 49 | ireg.ax = 0x0f00; |
| 51 | intcall(0x10, &ireg, &oreg); | 50 | intcall(0x10, &ireg, &oreg); |
| 52 | mode = oreg.al; | 51 | mode = oreg.al; |
| 53 | 52 | ||
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 63cb4096c3dc..9cb2edb87c2f 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -183,7 +183,7 @@ struct mp_ioapic_gsi{ | |||
| 183 | u32 gsi_end; | 183 | u32 gsi_end; |
| 184 | }; | 184 | }; |
| 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; | 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; |
| 186 | extern u32 gsi_end; | 186 | extern u32 gsi_top; |
| 187 | int mp_find_ioapic(u32 gsi); | 187 | int mp_find_ioapic(u32 gsi); |
| 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); | 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); |
| 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); | 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); |
| @@ -197,7 +197,7 @@ static const int timer_through_8259 = 0; | |||
| 197 | static inline void ioapic_init_mappings(void) { } | 197 | static inline void ioapic_init_mappings(void) { } |
| 198 | static inline void ioapic_insert_resources(void) { } | 198 | static inline void ioapic_insert_resources(void) { } |
| 199 | static inline void probe_nr_irqs_gsi(void) { } | 199 | static inline void probe_nr_irqs_gsi(void) { } |
| 200 | #define gsi_end (NR_IRQS_LEGACY - 1) | 200 | #define gsi_top (NR_IRQS_LEGACY) |
| 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } | 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } |
| 202 | 202 | ||
| 203 | struct io_apic_irq_attr; | 203 | struct io_apic_irq_attr; |
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index 0797e748d280..cd28f9ad910d 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -77,6 +77,7 @@ do { \ | |||
| 77 | if (0) { \ | 77 | if (0) { \ |
| 78 | pto_T__ pto_tmp__; \ | 78 | pto_T__ pto_tmp__; \ |
| 79 | pto_tmp__ = (val); \ | 79 | pto_tmp__ = (val); \ |
| 80 | (void)pto_tmp__; \ | ||
| 80 | } \ | 81 | } \ |
| 81 | switch (sizeof(var)) { \ | 82 | switch (sizeof(var)) { \ |
| 82 | case 1: \ | 83 | case 1: \ |
| @@ -115,6 +116,7 @@ do { \ | |||
| 115 | if (0) { \ | 116 | if (0) { \ |
| 116 | pao_T__ pao_tmp__; \ | 117 | pao_T__ pao_tmp__; \ |
| 117 | pao_tmp__ = (val); \ | 118 | pao_tmp__ = (val); \ |
| 119 | (void)pao_tmp__; \ | ||
| 118 | } \ | 120 | } \ |
| 119 | switch (sizeof(var)) { \ | 121 | switch (sizeof(var)) { \ |
| 120 | case 1: \ | 122 | case 1: \ |
diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h index 5e67c1532314..ed5903be26fe 100644 --- a/arch/x86/include/asm/pgtable_32_types.h +++ b/arch/x86/include/asm/pgtable_32_types.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) |
| 28 | 28 | ||
| 29 | #ifndef __ASSEMBLER__ | 29 | #ifndef __ASSEMBLY__ |
| 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ | 30 | extern bool __vmalloc_start_set; /* set once high_memory is set */ |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index b8fe48ee2ed9..e7f4d33c55ed 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -451,7 +451,7 @@ void stop_this_cpu(void *dummy); | |||
| 451 | * | 451 | * |
| 452 | * (Could use an alternative three way for this if there was one.) | 452 | * (Could use an alternative three way for this if there was one.) |
| 453 | */ | 453 | */ |
| 454 | static inline void rdtsc_barrier(void) | 454 | static __always_inline void rdtsc_barrier(void) |
| 455 | { | 455 | { |
| 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | 456 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); |
| 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | 457 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 60cc4058ed5f..c05872aa3ce0 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -118,7 +118,7 @@ static unsigned int gsi_to_irq(unsigned int gsi) | |||
| 118 | if (gsi >= NR_IRQS_LEGACY) | 118 | if (gsi >= NR_IRQS_LEGACY) |
| 119 | irq = gsi; | 119 | irq = gsi; |
| 120 | else | 120 | else |
| 121 | irq = gsi_end + 1 + gsi; | 121 | irq = gsi_top + gsi; |
| 122 | 122 | ||
| 123 | return irq; | 123 | return irq; |
| 124 | } | 124 | } |
| @@ -129,10 +129,10 @@ static u32 irq_to_gsi(int irq) | |||
| 129 | 129 | ||
| 130 | if (irq < NR_IRQS_LEGACY) | 130 | if (irq < NR_IRQS_LEGACY) |
| 131 | gsi = isa_irq_to_gsi[irq]; | 131 | gsi = isa_irq_to_gsi[irq]; |
| 132 | else if (irq <= gsi_end) | 132 | else if (irq < gsi_top) |
| 133 | gsi = irq; | 133 | gsi = irq; |
| 134 | else if (irq <= (gsi_end + NR_IRQS_LEGACY)) | 134 | else if (irq < (gsi_top + NR_IRQS_LEGACY)) |
| 135 | gsi = irq - gsi_end; | 135 | gsi = irq - gsi_top; |
| 136 | else | 136 | else |
| 137 | gsi = 0xffffffff; | 137 | gsi = 0xffffffff; |
| 138 | 138 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 33f3563a2a52..e41ed24ab26d 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -89,8 +89,8 @@ int nr_ioapics; | |||
| 89 | /* IO APIC gsi routing info */ | 89 | /* IO APIC gsi routing info */ |
| 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; | 90 | struct mp_ioapic_gsi mp_gsi_routing[MAX_IO_APICS]; |
| 91 | 91 | ||
| 92 | /* The last gsi number used */ | 92 | /* The one past the highest gsi number used */ |
| 93 | u32 gsi_end; | 93 | u32 gsi_top; |
| 94 | 94 | ||
| 95 | /* MP IRQ source entries */ | 95 | /* MP IRQ source entries */ |
| 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 96 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
| @@ -1035,7 +1035,7 @@ static int pin_2_irq(int idx, int apic, int pin) | |||
| 1035 | if (gsi >= NR_IRQS_LEGACY) | 1035 | if (gsi >= NR_IRQS_LEGACY) |
| 1036 | irq = gsi; | 1036 | irq = gsi; |
| 1037 | else | 1037 | else |
| 1038 | irq = gsi_end + 1 + gsi; | 1038 | irq = gsi_top + gsi; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | #ifdef CONFIG_X86_32 | 1041 | #ifdef CONFIG_X86_32 |
| @@ -3853,7 +3853,7 @@ void __init probe_nr_irqs_gsi(void) | |||
| 3853 | { | 3853 | { |
| 3854 | int nr; | 3854 | int nr; |
| 3855 | 3855 | ||
| 3856 | nr = gsi_end + 1 + NR_IRQS_LEGACY; | 3856 | nr = gsi_top + NR_IRQS_LEGACY; |
| 3857 | if (nr > nr_irqs_gsi) | 3857 | if (nr > nr_irqs_gsi) |
| 3858 | nr_irqs_gsi = nr; | 3858 | nr_irqs_gsi = nr; |
| 3859 | 3859 | ||
| @@ -4294,8 +4294,8 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
| 4294 | */ | 4294 | */ |
| 4295 | nr_ioapic_registers[idx] = entries; | 4295 | nr_ioapic_registers[idx] = entries; |
| 4296 | 4296 | ||
| 4297 | if (mp_gsi_routing[idx].gsi_end > gsi_end) | 4297 | if (mp_gsi_routing[idx].gsi_end >= gsi_top) |
| 4298 | gsi_end = mp_gsi_routing[idx].gsi_end; | 4298 | gsi_top = mp_gsi_routing[idx].gsi_end + 1; |
| 4299 | 4299 | ||
| 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " | 4300 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
| 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, | 4301 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index fdbc652d3feb..214ac860ebe0 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -72,6 +72,7 @@ static struct event_constraint intel_westmere_event_constraints[] = | |||
| 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
| 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ |
| 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
| 75 | INTEL_EVENT_CONSTRAINT(0xb3, 0x1), /* SNOOPQ_REQUEST_OUTSTANDING */ | ||
| 75 | EVENT_CONSTRAINT_END | 76 | EVENT_CONSTRAINT_END |
| 76 | }; | 77 | }; |
| 77 | 78 | ||
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 5ae5d2426edf..d86dbf7e54be 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -123,7 +123,7 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m) | |||
| 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", | 123 | printk(KERN_INFO "I/O APIC #%d Version %d at 0x%X.\n", |
| 124 | m->apicid, m->apicver, m->apicaddr); | 124 | m->apicid, m->apicver, m->apicaddr); |
| 125 | 125 | ||
| 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_end + 1); | 126 | mp_register_ioapic(m->apicid, m->apicaddr, gsi_top); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) | 129 | static void print_MP_intsrc_info(struct mpc_intsrc *m) |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index fb99f7edb341..0b96b5589f08 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
| @@ -103,11 +103,16 @@ int use_calgary __read_mostly = 0; | |||
| 103 | #define PMR_SOFTSTOPFAULT 0x40000000 | 103 | #define PMR_SOFTSTOPFAULT 0x40000000 |
| 104 | #define PMR_HARDSTOP 0x20000000 | 104 | #define PMR_HARDSTOP 0x20000000 |
| 105 | 105 | ||
| 106 | #define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | 106 | /* |
| 107 | #define MAX_NUM_CHASSIS 8 /* max number of chassis */ | 107 | * The maximum PHB bus number. |
| 108 | /* MAX_PHB_BUS_NUM is the maximal possible dev->bus->number */ | 108 | * x3950M2 (rare): 8 chassis, 48 PHBs per chassis = 384 |
| 109 | #define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) | 109 | * x3950M2: 4 chassis, 48 PHBs per chassis = 192 |
| 110 | #define PHBS_PER_CALGARY 4 | 110 | * x3950 (PCIE): 8 chassis, 32 PHBs per chassis = 256 |
| 111 | * x3950 (PCIX): 8 chassis, 16 PHBs per chassis = 128 | ||
| 112 | */ | ||
| 113 | #define MAX_PHB_BUS_NUM 384 | ||
| 114 | |||
| 115 | #define PHBS_PER_CALGARY 4 | ||
| 111 | 116 | ||
| 112 | /* register offsets in Calgary's internal register space */ | 117 | /* register offsets in Calgary's internal register space */ |
| 113 | static const unsigned long tar_offsets[] = { | 118 | static const unsigned long tar_offsets[] = { |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 8e1aac86b50c..e3af342fe83a 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -228,6 +228,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), | 228 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), |
| 229 | }, | 229 | }, |
| 230 | }, | 230 | }, |
| 231 | { /* Handle problems with rebooting on Dell T7400's */ | ||
| 232 | .callback = set_bios_reboot, | ||
| 233 | .ident = "Dell Precision T7400", | ||
| 234 | .matches = { | ||
| 235 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 236 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T7400"), | ||
| 237 | }, | ||
| 238 | }, | ||
| 231 | { /* Handle problems with rebooting on HP laptops */ | 239 | { /* Handle problems with rebooting on HP laptops */ |
| 232 | .callback = set_bios_reboot, | 240 | .callback = set_bios_reboot, |
| 233 | .ident = "HP Compaq Laptop", | 241 | .ident = "HP Compaq Laptop", |
diff --git a/arch/x86/kernel/sfi.c b/arch/x86/kernel/sfi.c index 7ded57896c0a..cb22acf3ed09 100644 --- a/arch/x86/kernel/sfi.c +++ b/arch/x86/kernel/sfi.c | |||
| @@ -93,7 +93,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table) | |||
| 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; | 93 | pentry = (struct sfi_apic_table_entry *)sb->pentry; |
| 94 | 94 | ||
| 95 | for (i = 0; i < num; i++) { | 95 | for (i = 0; i < num; i++) { |
| 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_end + 1); | 96 | mp_register_ioapic(i, pentry->phys_addr, gsi_top); |
| 97 | pentry++; | 97 | pentry++; |
| 98 | } | 98 | } |
| 99 | 99 | ||
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index acc15b23b743..64121a18b8cb 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -302,7 +302,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
| 302 | return -EINVAL; | 302 | return -EINVAL; |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | new = kmalloc(sizeof(struct memtype), GFP_KERNEL); | 305 | new = kzalloc(sizeof(struct memtype), GFP_KERNEL); |
| 306 | if (!new) | 306 | if (!new) |
| 307 | return -ENOMEM; | 307 | return -ENOMEM; |
| 308 | 308 | ||
diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index f537087bb740..f20eeec85a86 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c | |||
| @@ -226,6 +226,7 @@ int rbt_memtype_check_insert(struct memtype *new, unsigned long *ret_type) | |||
| 226 | if (ret_type) | 226 | if (ret_type) |
| 227 | new->type = *ret_type; | 227 | new->type = *ret_type; |
| 228 | 228 | ||
| 229 | new->subtree_max_end = new->end; | ||
| 229 | memtype_rb_insert(&memtype_rbroot, new); | 230 | memtype_rb_insert(&memtype_rbroot, new); |
| 230 | } | 231 | } |
| 231 | return err; | 232 | return err; |
diff --git a/block/blk-core.c b/block/blk-core.c index f84cce42fc58..f0640d7f800f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -1149,13 +1149,10 @@ void init_request_from_bio(struct request *req, struct bio *bio) | |||
| 1149 | else | 1149 | else |
| 1150 | req->cmd_flags |= bio->bi_rw & REQ_FAILFAST_MASK; | 1150 | req->cmd_flags |= bio->bi_rw & REQ_FAILFAST_MASK; |
| 1151 | 1151 | ||
| 1152 | if (unlikely(bio_rw_flagged(bio, BIO_RW_DISCARD))) { | 1152 | if (bio_rw_flagged(bio, BIO_RW_DISCARD)) |
| 1153 | req->cmd_flags |= REQ_DISCARD; | 1153 | req->cmd_flags |= REQ_DISCARD; |
| 1154 | if (bio_rw_flagged(bio, BIO_RW_BARRIER)) | 1154 | if (bio_rw_flagged(bio, BIO_RW_BARRIER)) |
| 1155 | req->cmd_flags |= REQ_SOFTBARRIER; | ||
| 1156 | } else if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) | ||
| 1157 | req->cmd_flags |= REQ_HARDBARRIER; | 1155 | req->cmd_flags |= REQ_HARDBARRIER; |
| 1158 | |||
| 1159 | if (bio_rw_flagged(bio, BIO_RW_SYNCIO)) | 1156 | if (bio_rw_flagged(bio, BIO_RW_SYNCIO)) |
| 1160 | req->cmd_flags |= REQ_RW_SYNC; | 1157 | req->cmd_flags |= REQ_RW_SYNC; |
| 1161 | if (bio_rw_flagged(bio, BIO_RW_META)) | 1158 | if (bio_rw_flagged(bio, BIO_RW_META)) |
| @@ -1586,7 +1583,7 @@ void submit_bio(int rw, struct bio *bio) | |||
| 1586 | * If it's a regular read/write or a barrier with data attached, | 1583 | * If it's a regular read/write or a barrier with data attached, |
| 1587 | * go through the normal accounting stuff before submission. | 1584 | * go through the normal accounting stuff before submission. |
| 1588 | */ | 1585 | */ |
| 1589 | if (bio_has_data(bio)) { | 1586 | if (bio_has_data(bio) && !(rw & (1 << BIO_RW_DISCARD))) { |
| 1590 | if (rw & WRITE) { | 1587 | if (rw & WRITE) { |
| 1591 | count_vm_events(PGPGOUT, count); | 1588 | count_vm_events(PGPGOUT, count); |
| 1592 | } else { | 1589 | } else { |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 5ff4f4850e71..7982b830db58 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/rbtree.h> | 14 | #include <linux/rbtree.h> |
| 15 | #include <linux/ioprio.h> | 15 | #include <linux/ioprio.h> |
| 16 | #include <linux/blktrace_api.h> | 16 | #include <linux/blktrace_api.h> |
| 17 | #include "blk-cgroup.h" | 17 | #include "cfq.h" |
| 18 | 18 | ||
| 19 | /* | 19 | /* |
| 20 | * tunables | 20 | * tunables |
| @@ -879,7 +879,7 @@ cfq_group_service_tree_del(struct cfq_data *cfqd, struct cfq_group *cfqg) | |||
| 879 | if (!RB_EMPTY_NODE(&cfqg->rb_node)) | 879 | if (!RB_EMPTY_NODE(&cfqg->rb_node)) |
| 880 | cfq_rb_erase(&cfqg->rb_node, st); | 880 | cfq_rb_erase(&cfqg->rb_node, st); |
| 881 | cfqg->saved_workload_slice = 0; | 881 | cfqg->saved_workload_slice = 0; |
| 882 | blkiocg_update_dequeue_stats(&cfqg->blkg, 1); | 882 | cfq_blkiocg_update_dequeue_stats(&cfqg->blkg, 1); |
| 883 | } | 883 | } |
| 884 | 884 | ||
| 885 | static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq) | 885 | static inline unsigned int cfq_cfqq_slice_usage(struct cfq_queue *cfqq) |
| @@ -939,8 +939,8 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg, | |||
| 939 | 939 | ||
| 940 | cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime, | 940 | cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime, |
| 941 | st->min_vdisktime); | 941 | st->min_vdisktime); |
| 942 | blkiocg_update_timeslice_used(&cfqg->blkg, used_sl); | 942 | cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl); |
| 943 | blkiocg_set_start_empty_time(&cfqg->blkg); | 943 | cfq_blkiocg_set_start_empty_time(&cfqg->blkg); |
| 944 | } | 944 | } |
| 945 | 945 | ||
| 946 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | 946 | #ifdef CONFIG_CFQ_GROUP_IOSCHED |
| @@ -995,7 +995,7 @@ cfq_find_alloc_cfqg(struct cfq_data *cfqd, struct cgroup *cgroup, int create) | |||
| 995 | 995 | ||
| 996 | /* Add group onto cgroup list */ | 996 | /* Add group onto cgroup list */ |
| 997 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); | 997 | sscanf(dev_name(bdi->dev), "%u:%u", &major, &minor); |
| 998 | blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, | 998 | cfq_blkiocg_add_blkio_group(blkcg, &cfqg->blkg, (void *)cfqd, |
| 999 | MKDEV(major, minor)); | 999 | MKDEV(major, minor)); |
| 1000 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); | 1000 | cfqg->weight = blkcg_get_weight(blkcg, cfqg->blkg.dev); |
| 1001 | 1001 | ||
| @@ -1079,7 +1079,7 @@ static void cfq_release_cfq_groups(struct cfq_data *cfqd) | |||
| 1079 | * it from cgroup list, then it will take care of destroying | 1079 | * it from cgroup list, then it will take care of destroying |
| 1080 | * cfqg also. | 1080 | * cfqg also. |
| 1081 | */ | 1081 | */ |
| 1082 | if (!blkiocg_del_blkio_group(&cfqg->blkg)) | 1082 | if (!cfq_blkiocg_del_blkio_group(&cfqg->blkg)) |
| 1083 | cfq_destroy_cfqg(cfqd, cfqg); | 1083 | cfq_destroy_cfqg(cfqd, cfqg); |
| 1084 | } | 1084 | } |
| 1085 | } | 1085 | } |
| @@ -1421,10 +1421,10 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) | |||
| 1421 | { | 1421 | { |
| 1422 | elv_rb_del(&cfqq->sort_list, rq); | 1422 | elv_rb_del(&cfqq->sort_list, rq); |
| 1423 | cfqq->queued[rq_is_sync(rq)]--; | 1423 | cfqq->queued[rq_is_sync(rq)]--; |
| 1424 | blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq), | 1424 | cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, |
| 1425 | rq_is_sync(rq)); | 1425 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1426 | cfq_add_rq_rb(rq); | 1426 | cfq_add_rq_rb(rq); |
| 1427 | blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, | 1427 | cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, |
| 1428 | &cfqq->cfqd->serving_group->blkg, rq_data_dir(rq), | 1428 | &cfqq->cfqd->serving_group->blkg, rq_data_dir(rq), |
| 1429 | rq_is_sync(rq)); | 1429 | rq_is_sync(rq)); |
| 1430 | } | 1430 | } |
| @@ -1482,8 +1482,8 @@ static void cfq_remove_request(struct request *rq) | |||
| 1482 | cfq_del_rq_rb(rq); | 1482 | cfq_del_rq_rb(rq); |
| 1483 | 1483 | ||
| 1484 | cfqq->cfqd->rq_queued--; | 1484 | cfqq->cfqd->rq_queued--; |
| 1485 | blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(rq), | 1485 | cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, |
| 1486 | rq_is_sync(rq)); | 1486 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1487 | if (rq_is_meta(rq)) { | 1487 | if (rq_is_meta(rq)) { |
| 1488 | WARN_ON(!cfqq->meta_pending); | 1488 | WARN_ON(!cfqq->meta_pending); |
| 1489 | cfqq->meta_pending--; | 1489 | cfqq->meta_pending--; |
| @@ -1518,8 +1518,8 @@ static void cfq_merged_request(struct request_queue *q, struct request *req, | |||
| 1518 | static void cfq_bio_merged(struct request_queue *q, struct request *req, | 1518 | static void cfq_bio_merged(struct request_queue *q, struct request *req, |
| 1519 | struct bio *bio) | 1519 | struct bio *bio) |
| 1520 | { | 1520 | { |
| 1521 | blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg, bio_data_dir(bio), | 1521 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(req))->blkg, |
| 1522 | cfq_bio_sync(bio)); | 1522 | bio_data_dir(bio), cfq_bio_sync(bio)); |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| 1525 | static void | 1525 | static void |
| @@ -1539,8 +1539,8 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, | |||
| 1539 | if (cfqq->next_rq == next) | 1539 | if (cfqq->next_rq == next) |
| 1540 | cfqq->next_rq = rq; | 1540 | cfqq->next_rq = rq; |
| 1541 | cfq_remove_request(next); | 1541 | cfq_remove_request(next); |
| 1542 | blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, rq_data_dir(next), | 1542 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, |
| 1543 | rq_is_sync(next)); | 1543 | rq_data_dir(next), rq_is_sync(next)); |
| 1544 | } | 1544 | } |
| 1545 | 1545 | ||
| 1546 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, | 1546 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, |
| @@ -1571,7 +1571,7 @@ static int cfq_allow_merge(struct request_queue *q, struct request *rq, | |||
| 1571 | static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq) | 1571 | static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq) |
| 1572 | { | 1572 | { |
| 1573 | del_timer(&cfqd->idle_slice_timer); | 1573 | del_timer(&cfqd->idle_slice_timer); |
| 1574 | blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg); | 1574 | cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg); |
| 1575 | } | 1575 | } |
| 1576 | 1576 | ||
| 1577 | static void __cfq_set_active_queue(struct cfq_data *cfqd, | 1577 | static void __cfq_set_active_queue(struct cfq_data *cfqd, |
| @@ -1580,7 +1580,7 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd, | |||
| 1580 | if (cfqq) { | 1580 | if (cfqq) { |
| 1581 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", | 1581 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", |
| 1582 | cfqd->serving_prio, cfqd->serving_type); | 1582 | cfqd->serving_prio, cfqd->serving_type); |
| 1583 | blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg); | 1583 | cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg); |
| 1584 | cfqq->slice_start = 0; | 1584 | cfqq->slice_start = 0; |
| 1585 | cfqq->dispatch_start = jiffies; | 1585 | cfqq->dispatch_start = jiffies; |
| 1586 | cfqq->allocated_slice = 0; | 1586 | cfqq->allocated_slice = 0; |
| @@ -1911,7 +1911,7 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd) | |||
| 1911 | sl = cfqd->cfq_slice_idle; | 1911 | sl = cfqd->cfq_slice_idle; |
| 1912 | 1912 | ||
| 1913 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); | 1913 | mod_timer(&cfqd->idle_slice_timer, jiffies + sl); |
| 1914 | blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg); | 1914 | cfq_blkiocg_update_set_idle_time_stats(&cfqq->cfqg->blkg); |
| 1915 | cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl); | 1915 | cfq_log_cfqq(cfqd, cfqq, "arm_idle: %lu", sl); |
| 1916 | } | 1916 | } |
| 1917 | 1917 | ||
| @@ -1931,7 +1931,7 @@ static void cfq_dispatch_insert(struct request_queue *q, struct request *rq) | |||
| 1931 | elv_dispatch_sort(q, rq); | 1931 | elv_dispatch_sort(q, rq); |
| 1932 | 1932 | ||
| 1933 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++; | 1933 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]++; |
| 1934 | blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq), | 1934 | cfq_blkiocg_update_dispatch_stats(&cfqq->cfqg->blkg, blk_rq_bytes(rq), |
| 1935 | rq_data_dir(rq), rq_is_sync(rq)); | 1935 | rq_data_dir(rq), rq_is_sync(rq)); |
| 1936 | } | 1936 | } |
| 1937 | 1937 | ||
| @@ -1986,6 +1986,15 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | |||
| 1986 | int process_refs, new_process_refs; | 1986 | int process_refs, new_process_refs; |
| 1987 | struct cfq_queue *__cfqq; | 1987 | struct cfq_queue *__cfqq; |
| 1988 | 1988 | ||
| 1989 | /* | ||
| 1990 | * If there are no process references on the new_cfqq, then it is | ||
| 1991 | * unsafe to follow the ->new_cfqq chain as other cfqq's in the | ||
| 1992 | * chain may have dropped their last reference (not just their | ||
| 1993 | * last process reference). | ||
| 1994 | */ | ||
| 1995 | if (!cfqq_process_refs(new_cfqq)) | ||
| 1996 | return; | ||
| 1997 | |||
| 1989 | /* Avoid a circular list and skip interim queue merges */ | 1998 | /* Avoid a circular list and skip interim queue merges */ |
| 1990 | while ((__cfqq = new_cfqq->new_cfqq)) { | 1999 | while ((__cfqq = new_cfqq->new_cfqq)) { |
| 1991 | if (__cfqq == cfqq) | 2000 | if (__cfqq == cfqq) |
| @@ -1994,17 +2003,17 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | |||
| 1994 | } | 2003 | } |
| 1995 | 2004 | ||
| 1996 | process_refs = cfqq_process_refs(cfqq); | 2005 | process_refs = cfqq_process_refs(cfqq); |
| 2006 | new_process_refs = cfqq_process_refs(new_cfqq); | ||
| 1997 | /* | 2007 | /* |
| 1998 | * If the process for the cfqq has gone away, there is no | 2008 | * If the process for the cfqq has gone away, there is no |
| 1999 | * sense in merging the queues. | 2009 | * sense in merging the queues. |
| 2000 | */ | 2010 | */ |
| 2001 | if (process_refs == 0) | 2011 | if (process_refs == 0 || new_process_refs == 0) |
| 2002 | return; | 2012 | return; |
| 2003 | 2013 | ||
| 2004 | /* | 2014 | /* |
| 2005 | * Merge in the direction of the lesser amount of work. | 2015 | * Merge in the direction of the lesser amount of work. |
| 2006 | */ | 2016 | */ |
| 2007 | new_process_refs = cfqq_process_refs(new_cfqq); | ||
| 2008 | if (new_process_refs >= process_refs) { | 2017 | if (new_process_refs >= process_refs) { |
| 2009 | cfqq->new_cfqq = new_cfqq; | 2018 | cfqq->new_cfqq = new_cfqq; |
| 2010 | atomic_add(process_refs, &new_cfqq->ref); | 2019 | atomic_add(process_refs, &new_cfqq->ref); |
| @@ -3248,7 +3257,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 3248 | cfq_clear_cfqq_wait_request(cfqq); | 3257 | cfq_clear_cfqq_wait_request(cfqq); |
| 3249 | __blk_run_queue(cfqd->queue); | 3258 | __blk_run_queue(cfqd->queue); |
| 3250 | } else { | 3259 | } else { |
| 3251 | blkiocg_update_idle_time_stats( | 3260 | cfq_blkiocg_update_idle_time_stats( |
| 3252 | &cfqq->cfqg->blkg); | 3261 | &cfqq->cfqg->blkg); |
| 3253 | cfq_mark_cfqq_must_dispatch(cfqq); | 3262 | cfq_mark_cfqq_must_dispatch(cfqq); |
| 3254 | } | 3263 | } |
| @@ -3276,7 +3285,7 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) | |||
| 3276 | rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]); | 3285 | rq_set_fifo_time(rq, jiffies + cfqd->cfq_fifo_expire[rq_is_sync(rq)]); |
| 3277 | list_add_tail(&rq->queuelist, &cfqq->fifo); | 3286 | list_add_tail(&rq->queuelist, &cfqq->fifo); |
| 3278 | cfq_add_rq_rb(rq); | 3287 | cfq_add_rq_rb(rq); |
| 3279 | blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, | 3288 | cfq_blkiocg_update_io_add_stats(&(RQ_CFQG(rq))->blkg, |
| 3280 | &cfqd->serving_group->blkg, rq_data_dir(rq), | 3289 | &cfqd->serving_group->blkg, rq_data_dir(rq), |
| 3281 | rq_is_sync(rq)); | 3290 | rq_is_sync(rq)); |
| 3282 | cfq_rq_enqueued(cfqd, cfqq, rq); | 3291 | cfq_rq_enqueued(cfqd, cfqq, rq); |
| @@ -3364,9 +3373,9 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq) | |||
| 3364 | WARN_ON(!cfqq->dispatched); | 3373 | WARN_ON(!cfqq->dispatched); |
| 3365 | cfqd->rq_in_driver--; | 3374 | cfqd->rq_in_driver--; |
| 3366 | cfqq->dispatched--; | 3375 | cfqq->dispatched--; |
| 3367 | blkiocg_update_completion_stats(&cfqq->cfqg->blkg, rq_start_time_ns(rq), | 3376 | cfq_blkiocg_update_completion_stats(&cfqq->cfqg->blkg, |
| 3368 | rq_io_start_time_ns(rq), rq_data_dir(rq), | 3377 | rq_start_time_ns(rq), rq_io_start_time_ns(rq), |
| 3369 | rq_is_sync(rq)); | 3378 | rq_data_dir(rq), rq_is_sync(rq)); |
| 3370 | 3379 | ||
| 3371 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; | 3380 | cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--; |
| 3372 | 3381 | ||
| @@ -3730,7 +3739,7 @@ static void cfq_exit_queue(struct elevator_queue *e) | |||
| 3730 | 3739 | ||
| 3731 | cfq_put_async_queues(cfqd); | 3740 | cfq_put_async_queues(cfqd); |
| 3732 | cfq_release_cfq_groups(cfqd); | 3741 | cfq_release_cfq_groups(cfqd); |
| 3733 | blkiocg_del_blkio_group(&cfqd->root_group.blkg); | 3742 | cfq_blkiocg_del_blkio_group(&cfqd->root_group.blkg); |
| 3734 | 3743 | ||
| 3735 | spin_unlock_irq(q->queue_lock); | 3744 | spin_unlock_irq(q->queue_lock); |
| 3736 | 3745 | ||
| @@ -3798,8 +3807,8 @@ static void *cfq_init_queue(struct request_queue *q) | |||
| 3798 | */ | 3807 | */ |
| 3799 | atomic_set(&cfqg->ref, 1); | 3808 | atomic_set(&cfqg->ref, 1); |
| 3800 | rcu_read_lock(); | 3809 | rcu_read_lock(); |
| 3801 | blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, (void *)cfqd, | 3810 | cfq_blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, |
| 3802 | 0); | 3811 | (void *)cfqd, 0); |
| 3803 | rcu_read_unlock(); | 3812 | rcu_read_unlock(); |
| 3804 | #endif | 3813 | #endif |
| 3805 | /* | 3814 | /* |
diff --git a/block/cfq.h b/block/cfq.h new file mode 100644 index 000000000000..93448e5a2e41 --- /dev/null +++ b/block/cfq.h | |||
| @@ -0,0 +1,115 @@ | |||
| 1 | #ifndef _CFQ_H | ||
| 2 | #define _CFQ_H | ||
| 3 | #include "blk-cgroup.h" | ||
| 4 | |||
| 5 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | ||
| 6 | static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg, | ||
| 7 | struct blkio_group *curr_blkg, bool direction, bool sync) | ||
| 8 | { | ||
| 9 | blkiocg_update_io_add_stats(blkg, curr_blkg, direction, sync); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg, | ||
| 13 | unsigned long dequeue) | ||
| 14 | { | ||
| 15 | blkiocg_update_dequeue_stats(blkg, dequeue); | ||
| 16 | } | ||
| 17 | |||
| 18 | static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg, | ||
| 19 | unsigned long time) | ||
| 20 | { | ||
| 21 | blkiocg_update_timeslice_used(blkg, time); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg) | ||
| 25 | { | ||
| 26 | blkiocg_set_start_empty_time(blkg); | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg, | ||
| 30 | bool direction, bool sync) | ||
| 31 | { | ||
| 32 | blkiocg_update_io_remove_stats(blkg, direction, sync); | ||
| 33 | } | ||
| 34 | |||
| 35 | static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg, | ||
| 36 | bool direction, bool sync) | ||
| 37 | { | ||
| 38 | blkiocg_update_io_merged_stats(blkg, direction, sync); | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg) | ||
| 42 | { | ||
| 43 | blkiocg_update_idle_time_stats(blkg); | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline void | ||
| 47 | cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg) | ||
| 48 | { | ||
| 49 | blkiocg_update_avg_queue_size_stats(blkg); | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline void | ||
| 53 | cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) | ||
| 54 | { | ||
| 55 | blkiocg_update_set_idle_time_stats(blkg); | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg, | ||
| 59 | uint64_t bytes, bool direction, bool sync) | ||
| 60 | { | ||
| 61 | blkiocg_update_dispatch_stats(blkg, bytes, direction, sync); | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync) | ||
| 65 | { | ||
| 66 | blkiocg_update_completion_stats(blkg, start_time, io_start_time, | ||
| 67 | direction, sync); | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, | ||
| 71 | struct blkio_group *blkg, void *key, dev_t dev) { | ||
| 72 | blkiocg_add_blkio_group(blkcg, blkg, key, dev); | ||
| 73 | } | ||
| 74 | |||
| 75 | static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg) | ||
| 76 | { | ||
| 77 | return blkiocg_del_blkio_group(blkg); | ||
| 78 | } | ||
| 79 | |||
| 80 | #else /* CFQ_GROUP_IOSCHED */ | ||
| 81 | static inline void cfq_blkiocg_update_io_add_stats(struct blkio_group *blkg, | ||
| 82 | struct blkio_group *curr_blkg, bool direction, bool sync) {} | ||
| 83 | |||
| 84 | static inline void cfq_blkiocg_update_dequeue_stats(struct blkio_group *blkg, | ||
| 85 | unsigned long dequeue) {} | ||
| 86 | |||
| 87 | static inline void cfq_blkiocg_update_timeslice_used(struct blkio_group *blkg, | ||
| 88 | unsigned long time) {} | ||
| 89 | static inline void cfq_blkiocg_set_start_empty_time(struct blkio_group *blkg) {} | ||
| 90 | static inline void cfq_blkiocg_update_io_remove_stats(struct blkio_group *blkg, | ||
| 91 | bool direction, bool sync) {} | ||
| 92 | static inline void cfq_blkiocg_update_io_merged_stats(struct blkio_group *blkg, | ||
| 93 | bool direction, bool sync) {} | ||
| 94 | static inline void cfq_blkiocg_update_idle_time_stats(struct blkio_group *blkg) | ||
| 95 | { | ||
| 96 | } | ||
| 97 | static inline void | ||
| 98 | cfq_blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg) {} | ||
| 99 | |||
| 100 | static inline void | ||
| 101 | cfq_blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) {} | ||
| 102 | |||
| 103 | static inline void cfq_blkiocg_update_dispatch_stats(struct blkio_group *blkg, | ||
| 104 | uint64_t bytes, bool direction, bool sync) {} | ||
| 105 | static inline void cfq_blkiocg_update_completion_stats(struct blkio_group *blkg, uint64_t start_time, uint64_t io_start_time, bool direction, bool sync) {} | ||
| 106 | |||
| 107 | static inline void cfq_blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, | ||
| 108 | struct blkio_group *blkg, void *key, dev_t dev) {} | ||
| 109 | static inline int cfq_blkiocg_del_blkio_group(struct blkio_group *blkg) | ||
| 110 | { | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | #endif /* CFQ_GROUP_IOSCHED */ | ||
| 115 | #endif | ||
diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c index db3946e9c66b..216e1e948ff6 100644 --- a/drivers/acpi/apei/apei-base.c +++ b/drivers/acpi/apei/apei-base.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
| 36 | #include <linux/acpi.h> | 36 | #include <linux/acpi.h> |
| 37 | #include <linux/slab.h> | ||
| 37 | #include <linux/io.h> | 38 | #include <linux/io.h> |
| 38 | #include <linux/kref.h> | 39 | #include <linux/kref.h> |
| 39 | #include <linux/rculist.h> | 40 | #include <linux/rculist.h> |
diff --git a/drivers/acpi/atomicio.c b/drivers/acpi/atomicio.c index 814b19249616..8f8bd736d4ff 100644 --- a/drivers/acpi/atomicio.c +++ b/drivers/acpi/atomicio.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/kref.h> | 31 | #include <linux/kref.h> |
| 32 | #include <linux/rculist.h> | 32 | #include <linux/rculist.h> |
| 33 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
| 34 | #include <linux/slab.h> | ||
| 34 | #include <acpi/atomicio.h> | 35 | #include <acpi/atomicio.h> |
| 35 | 36 | ||
| 36 | #define ACPI_PFX "ACPI: " | 37 | #define ACPI_PFX "ACPI: " |
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 3381505c8a6c..72dae92f3cab 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
| @@ -861,6 +861,7 @@ cciss_scsi_detect(int ctlr) | |||
| 861 | sh->n_io_port = 0; // I don't think we use these two... | 861 | sh->n_io_port = 0; // I don't think we use these two... |
| 862 | sh->this_id = SELF_SCSI_ID; | 862 | sh->this_id = SELF_SCSI_ID; |
| 863 | sh->sg_tablesize = hba[ctlr]->maxsgentries; | 863 | sh->sg_tablesize = hba[ctlr]->maxsgentries; |
| 864 | sh->max_cmd_len = MAX_COMMAND_SIZE; | ||
| 864 | 865 | ||
| 865 | ((struct cciss_scsi_adapter_data_t *) | 866 | ((struct cciss_scsi_adapter_data_t *) |
| 866 | hba[ctlr]->scsi_ctlr)->scsi_host = sh; | 867 | hba[ctlr]->scsi_ctlr)->scsi_host = sh; |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 91d11631cec9..abb4ec6690fc 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
| @@ -386,7 +386,7 @@ static void __devexit cpqarray_remove_one_eisa (int i) | |||
| 386 | } | 386 | } |
| 387 | 387 | ||
| 388 | /* pdev is NULL for eisa */ | 388 | /* pdev is NULL for eisa */ |
| 389 | static int __init cpqarray_register_ctlr( int i, struct pci_dev *pdev) | 389 | static int __devinit cpqarray_register_ctlr( int i, struct pci_dev *pdev) |
| 390 | { | 390 | { |
| 391 | struct request_queue *q; | 391 | struct request_queue *q; |
| 392 | int j; | 392 | int j; |
| @@ -503,7 +503,7 @@ Enomem4: | |||
| 503 | return -1; | 503 | return -1; |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | static int __init cpqarray_init_one( struct pci_dev *pdev, | 506 | static int __devinit cpqarray_init_one( struct pci_dev *pdev, |
| 507 | const struct pci_device_id *ent) | 507 | const struct pci_device_id *ent) |
| 508 | { | 508 | { |
| 509 | int i; | 509 | int i; |
| @@ -740,7 +740,7 @@ __setup("smart2=", cpqarray_setup); | |||
| 740 | /* | 740 | /* |
| 741 | * Find an EISA controller's signature. Set up an hba if we find it. | 741 | * Find an EISA controller's signature. Set up an hba if we find it. |
| 742 | */ | 742 | */ |
| 743 | static int __init cpqarray_eisa_detect(void) | 743 | static int __devinit cpqarray_eisa_detect(void) |
| 744 | { | 744 | { |
| 745 | int i=0, j; | 745 | int i=0, j; |
| 746 | __u32 board_id; | 746 | __u32 board_id; |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 6b077f93acc6..7258c95e895e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -1236,8 +1236,6 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
| 1236 | /* Last part of the attaching process ... */ | 1236 | /* Last part of the attaching process ... */ |
| 1237 | if (ns.conn >= C_CONNECTED && | 1237 | if (ns.conn >= C_CONNECTED && |
| 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { | 1238 | os.disk == D_ATTACHING && ns.disk == D_NEGOTIATING) { |
| 1239 | kfree(mdev->p_uuid); /* We expect to receive up-to-date UUIDs soon. */ | ||
| 1240 | mdev->p_uuid = NULL; /* ...to not use the old ones in the mean time */ | ||
| 1241 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ | 1239 | drbd_send_sizes(mdev, 0, 0); /* to start sync... */ |
| 1242 | drbd_send_uuids(mdev); | 1240 | drbd_send_uuids(mdev); |
| 1243 | drbd_send_state(mdev); | 1241 | drbd_send_state(mdev); |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 632e3245d1bb..2151f18b21de 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
| @@ -1114,6 +1114,12 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp | |||
| 1114 | mdev->new_state_tmp.i = ns.i; | 1114 | mdev->new_state_tmp.i = ns.i; |
| 1115 | ns.i = os.i; | 1115 | ns.i = os.i; |
| 1116 | ns.disk = D_NEGOTIATING; | 1116 | ns.disk = D_NEGOTIATING; |
| 1117 | |||
| 1118 | /* We expect to receive up-to-date UUIDs soon. | ||
| 1119 | To avoid a race in receive_state, free p_uuid while | ||
| 1120 | holding req_lock. I.e. atomic with the state change */ | ||
| 1121 | kfree(mdev->p_uuid); | ||
| 1122 | mdev->p_uuid = NULL; | ||
| 1117 | } | 1123 | } |
| 1118 | 1124 | ||
| 1119 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); | 1125 | rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 35603dd4e6c5..094bdc355b1f 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -302,6 +302,12 @@ struct smi_info { | |||
| 302 | 302 | ||
| 303 | static int force_kipmid[SI_MAX_PARMS]; | 303 | static int force_kipmid[SI_MAX_PARMS]; |
| 304 | static int num_force_kipmid; | 304 | static int num_force_kipmid; |
| 305 | #ifdef CONFIG_PCI | ||
| 306 | static int pci_registered; | ||
| 307 | #endif | ||
| 308 | #ifdef CONFIG_PPC_OF | ||
| 309 | static int of_registered; | ||
| 310 | #endif | ||
| 305 | 311 | ||
| 306 | static unsigned int kipmid_max_busy_us[SI_MAX_PARMS]; | 312 | static unsigned int kipmid_max_busy_us[SI_MAX_PARMS]; |
| 307 | static int num_max_busy_us; | 313 | static int num_max_busy_us; |
| @@ -1018,7 +1024,7 @@ static int ipmi_thread(void *data) | |||
| 1018 | else if (smi_result == SI_SM_IDLE) | 1024 | else if (smi_result == SI_SM_IDLE) |
| 1019 | schedule_timeout_interruptible(100); | 1025 | schedule_timeout_interruptible(100); |
| 1020 | else | 1026 | else |
| 1021 | schedule_timeout_interruptible(0); | 1027 | schedule_timeout_interruptible(1); |
| 1022 | } | 1028 | } |
| 1023 | return 0; | 1029 | return 0; |
| 1024 | } | 1030 | } |
| @@ -3314,6 +3320,8 @@ static __devinit int init_ipmi_si(void) | |||
| 3314 | rv = pci_register_driver(&ipmi_pci_driver); | 3320 | rv = pci_register_driver(&ipmi_pci_driver); |
| 3315 | if (rv) | 3321 | if (rv) |
| 3316 | printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv); | 3322 | printk(KERN_ERR PFX "Unable to register PCI driver: %d\n", rv); |
| 3323 | else | ||
| 3324 | pci_registered = 1; | ||
| 3317 | #endif | 3325 | #endif |
| 3318 | 3326 | ||
| 3319 | #ifdef CONFIG_ACPI | 3327 | #ifdef CONFIG_ACPI |
| @@ -3330,6 +3338,7 @@ static __devinit int init_ipmi_si(void) | |||
| 3330 | 3338 | ||
| 3331 | #ifdef CONFIG_PPC_OF | 3339 | #ifdef CONFIG_PPC_OF |
| 3332 | of_register_platform_driver(&ipmi_of_platform_driver); | 3340 | of_register_platform_driver(&ipmi_of_platform_driver); |
| 3341 | of_registered = 1; | ||
| 3333 | #endif | 3342 | #endif |
| 3334 | 3343 | ||
| 3335 | /* We prefer devices with interrupts, but in the case of a machine | 3344 | /* We prefer devices with interrupts, but in the case of a machine |
| @@ -3383,11 +3392,13 @@ static __devinit int init_ipmi_si(void) | |||
| 3383 | if (unload_when_empty && list_empty(&smi_infos)) { | 3392 | if (unload_when_empty && list_empty(&smi_infos)) { |
| 3384 | mutex_unlock(&smi_infos_lock); | 3393 | mutex_unlock(&smi_infos_lock); |
| 3385 | #ifdef CONFIG_PCI | 3394 | #ifdef CONFIG_PCI |
| 3386 | pci_unregister_driver(&ipmi_pci_driver); | 3395 | if (pci_registered) |
| 3396 | pci_unregister_driver(&ipmi_pci_driver); | ||
| 3387 | #endif | 3397 | #endif |
| 3388 | 3398 | ||
| 3389 | #ifdef CONFIG_PPC_OF | 3399 | #ifdef CONFIG_PPC_OF |
| 3390 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3400 | if (of_registered) |
| 3401 | of_unregister_platform_driver(&ipmi_of_platform_driver); | ||
| 3391 | #endif | 3402 | #endif |
| 3392 | driver_unregister(&ipmi_driver.driver); | 3403 | driver_unregister(&ipmi_driver.driver); |
| 3393 | printk(KERN_WARNING PFX | 3404 | printk(KERN_WARNING PFX |
| @@ -3478,14 +3489,16 @@ static __exit void cleanup_ipmi_si(void) | |||
| 3478 | return; | 3489 | return; |
| 3479 | 3490 | ||
| 3480 | #ifdef CONFIG_PCI | 3491 | #ifdef CONFIG_PCI |
| 3481 | pci_unregister_driver(&ipmi_pci_driver); | 3492 | if (pci_registered) |
| 3493 | pci_unregister_driver(&ipmi_pci_driver); | ||
| 3482 | #endif | 3494 | #endif |
| 3483 | #ifdef CONFIG_ACPI | 3495 | #ifdef CONFIG_ACPI |
| 3484 | pnp_unregister_driver(&ipmi_pnp_driver); | 3496 | pnp_unregister_driver(&ipmi_pnp_driver); |
| 3485 | #endif | 3497 | #endif |
| 3486 | 3498 | ||
| 3487 | #ifdef CONFIG_PPC_OF | 3499 | #ifdef CONFIG_PPC_OF |
| 3488 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3500 | if (of_registered) |
| 3501 | of_unregister_platform_driver(&ipmi_of_platform_driver); | ||
| 3489 | #endif | 3502 | #endif |
| 3490 | 3503 | ||
| 3491 | mutex_lock(&smi_infos_lock); | 3504 | mutex_lock(&smi_infos_lock); |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 724038dab4ca..7face915b963 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | # | 1 | # |
| 2 | # GPIO infrastructure and expanders | 2 | # platform-neutral GPIO infrastructure and expanders |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | config ARCH_WANT_OPTIONAL_GPIOLIB | 5 | config ARCH_WANT_OPTIONAL_GPIOLIB |
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 51c3cdd41b5a..e53dcff49b4f 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile | |||
| @@ -1,4 +1,8 @@ | |||
| 1 | # gpio support: dedicated expander chips, etc | 1 | # generic gpio support: dedicated expander chips, etc |
| 2 | # | ||
| 3 | # NOTE: platform-specific GPIO drivers don't belong in the | ||
| 4 | # drivers/gpio directory; put them with other platform setup | ||
| 5 | # code, IRQ controllers, board init, etc. | ||
| 2 | 6 | ||
| 3 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG | 7 | ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG |
| 4 | 8 | ||
diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 92a8f6cacda9..34647fc1ee98 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/bcd.h> | 29 | #include <linux/bcd.h> |
| 30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
| 31 | #include <linux/io.h> | 31 | #include <linux/io.h> |
| 32 | #include <linux/slab.h> | ||
| 32 | 33 | ||
| 33 | /* | 34 | /* |
| 34 | * The DaVinci RTC is a simple RTC with the following | 35 | * The DaVinci RTC is a simple RTC with the following |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index de033b7ac21f..d827ce570a8c 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
| @@ -777,7 +777,7 @@ static int __devinit ds1307_probe(struct i2c_client *client, | |||
| 777 | 777 | ||
| 778 | read_rtc: | 778 | read_rtc: |
| 779 | /* read RTC registers */ | 779 | /* read RTC registers */ |
| 780 | tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf); | 780 | tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf); |
| 781 | if (tmp != 8) { | 781 | if (tmp != 8) { |
| 782 | pr_debug("read error %d\n", tmp); | 782 | pr_debug("read error %d\n", tmp); |
| 783 | err = -EIO; | 783 | err = -EIO; |
| @@ -862,7 +862,7 @@ read_rtc: | |||
| 862 | if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) | 862 | if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) |
| 863 | tmp += 12; | 863 | tmp += 12; |
| 864 | i2c_smbus_write_byte_data(client, | 864 | i2c_smbus_write_byte_data(client, |
| 865 | DS1307_REG_HOUR, | 865 | ds1307->offset + DS1307_REG_HOUR, |
| 866 | bin2bcd(tmp)); | 866 | bin2bcd(tmp)); |
| 867 | } | 867 | } |
| 868 | 868 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 9eb62a256e9a..cd6cf575902e 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
| @@ -930,6 +930,83 @@ static void cpm_uart_config_port(struct uart_port *port, int flags) | |||
| 930 | } | 930 | } |
| 931 | } | 931 | } |
| 932 | 932 | ||
| 933 | #if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_CPM_CONSOLE) | ||
| 934 | /* | ||
| 935 | * Write a string to the serial port | ||
| 936 | * Note that this is called with interrupts already disabled | ||
| 937 | */ | ||
| 938 | static void cpm_uart_early_write(struct uart_cpm_port *pinfo, | ||
| 939 | const char *string, u_int count) | ||
| 940 | { | ||
| 941 | unsigned int i; | ||
| 942 | cbd_t __iomem *bdp, *bdbase; | ||
| 943 | unsigned char *cpm_outp_addr; | ||
| 944 | |||
| 945 | /* Get the address of the host memory buffer. | ||
| 946 | */ | ||
| 947 | bdp = pinfo->tx_cur; | ||
| 948 | bdbase = pinfo->tx_bd_base; | ||
| 949 | |||
| 950 | /* | ||
| 951 | * Now, do each character. This is not as bad as it looks | ||
| 952 | * since this is a holding FIFO and not a transmitting FIFO. | ||
| 953 | * We could add the complexity of filling the entire transmit | ||
| 954 | * buffer, but we would just wait longer between accesses...... | ||
| 955 | */ | ||
| 956 | for (i = 0; i < count; i++, string++) { | ||
| 957 | /* Wait for transmitter fifo to empty. | ||
| 958 | * Ready indicates output is ready, and xmt is doing | ||
| 959 | * that, not that it is ready for us to send. | ||
| 960 | */ | ||
| 961 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 962 | ; | ||
| 963 | |||
| 964 | /* Send the character out. | ||
| 965 | * If the buffer address is in the CPM DPRAM, don't | ||
| 966 | * convert it. | ||
| 967 | */ | ||
| 968 | cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
| 969 | pinfo); | ||
| 970 | *cpm_outp_addr = *string; | ||
| 971 | |||
| 972 | out_be16(&bdp->cbd_datlen, 1); | ||
| 973 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 974 | |||
| 975 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 976 | bdp = bdbase; | ||
| 977 | else | ||
| 978 | bdp++; | ||
| 979 | |||
| 980 | /* if a LF, also do CR... */ | ||
| 981 | if (*string == 10) { | ||
| 982 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 983 | ; | ||
| 984 | |||
| 985 | cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
| 986 | pinfo); | ||
| 987 | *cpm_outp_addr = 13; | ||
| 988 | |||
| 989 | out_be16(&bdp->cbd_datlen, 1); | ||
| 990 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 991 | |||
| 992 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 993 | bdp = bdbase; | ||
| 994 | else | ||
| 995 | bdp++; | ||
| 996 | } | ||
| 997 | } | ||
| 998 | |||
| 999 | /* | ||
| 1000 | * Finally, Wait for transmitter & holding register to empty | ||
| 1001 | * and restore the IER | ||
| 1002 | */ | ||
| 1003 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1004 | ; | ||
| 1005 | |||
| 1006 | pinfo->tx_cur = bdp; | ||
| 1007 | } | ||
| 1008 | #endif | ||
| 1009 | |||
| 933 | #ifdef CONFIG_CONSOLE_POLL | 1010 | #ifdef CONFIG_CONSOLE_POLL |
| 934 | /* Serial polling routines for writing and reading from the uart while | 1011 | /* Serial polling routines for writing and reading from the uart while |
| 935 | * in an interrupt or debug context. | 1012 | * in an interrupt or debug context. |
| @@ -999,7 +1076,7 @@ static void cpm_put_poll_char(struct uart_port *port, | |||
| 999 | static char ch[2]; | 1076 | static char ch[2]; |
| 1000 | 1077 | ||
| 1001 | ch[0] = (char)c; | 1078 | ch[0] = (char)c; |
| 1002 | cpm_uart_early_write(pinfo->port.line, ch, 1); | 1079 | cpm_uart_early_write(pinfo, ch, 1); |
| 1003 | } | 1080 | } |
| 1004 | #endif /* CONFIG_CONSOLE_POLL */ | 1081 | #endif /* CONFIG_CONSOLE_POLL */ |
| 1005 | 1082 | ||
| @@ -1130,9 +1207,6 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 1130 | u_int count) | 1207 | u_int count) |
| 1131 | { | 1208 | { |
| 1132 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; | 1209 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; |
| 1133 | unsigned int i; | ||
| 1134 | cbd_t __iomem *bdp, *bdbase; | ||
| 1135 | unsigned char *cp; | ||
| 1136 | unsigned long flags; | 1210 | unsigned long flags; |
| 1137 | int nolock = oops_in_progress; | 1211 | int nolock = oops_in_progress; |
| 1138 | 1212 | ||
| @@ -1142,66 +1216,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
| 1142 | spin_lock_irqsave(&pinfo->port.lock, flags); | 1216 | spin_lock_irqsave(&pinfo->port.lock, flags); |
| 1143 | } | 1217 | } |
| 1144 | 1218 | ||
| 1145 | /* Get the address of the host memory buffer. | 1219 | cpm_uart_early_write(pinfo, s, count); |
| 1146 | */ | ||
| 1147 | bdp = pinfo->tx_cur; | ||
| 1148 | bdbase = pinfo->tx_bd_base; | ||
| 1149 | |||
| 1150 | /* | ||
| 1151 | * Now, do each character. This is not as bad as it looks | ||
| 1152 | * since this is a holding FIFO and not a transmitting FIFO. | ||
| 1153 | * We could add the complexity of filling the entire transmit | ||
| 1154 | * buffer, but we would just wait longer between accesses...... | ||
| 1155 | */ | ||
| 1156 | for (i = 0; i < count; i++, s++) { | ||
| 1157 | /* Wait for transmitter fifo to empty. | ||
| 1158 | * Ready indicates output is ready, and xmt is doing | ||
| 1159 | * that, not that it is ready for us to send. | ||
| 1160 | */ | ||
| 1161 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1162 | ; | ||
| 1163 | |||
| 1164 | /* Send the character out. | ||
| 1165 | * If the buffer address is in the CPM DPRAM, don't | ||
| 1166 | * convert it. | ||
| 1167 | */ | ||
| 1168 | cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
| 1169 | *cp = *s; | ||
| 1170 | |||
| 1171 | out_be16(&bdp->cbd_datlen, 1); | ||
| 1172 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 1173 | |||
| 1174 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 1175 | bdp = bdbase; | ||
| 1176 | else | ||
| 1177 | bdp++; | ||
| 1178 | |||
| 1179 | /* if a LF, also do CR... */ | ||
| 1180 | if (*s == 10) { | ||
| 1181 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1182 | ; | ||
| 1183 | |||
| 1184 | cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
| 1185 | *cp = 13; | ||
| 1186 | |||
| 1187 | out_be16(&bdp->cbd_datlen, 1); | ||
| 1188 | setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
| 1189 | |||
| 1190 | if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
| 1191 | bdp = bdbase; | ||
| 1192 | else | ||
| 1193 | bdp++; | ||
| 1194 | } | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | /* | ||
| 1198 | * Finally, Wait for transmitter & holding register to empty | ||
| 1199 | * and restore the IER | ||
| 1200 | */ | ||
| 1201 | while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
| 1202 | ; | ||
| 1203 | |||
| 1204 | pinfo->tx_cur = bdp; | ||
| 1205 | 1220 | ||
| 1206 | if (unlikely(nolock)) { | 1221 | if (unlikely(nolock)) { |
| 1207 | local_irq_restore(flags); | 1222 | local_irq_restore(flags); |
diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index ce081cd44ad4..273e26ede650 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
| 16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
| 17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
| 18 | #include <linux/slab.h> | ||
| 18 | 19 | ||
| 19 | #include <asm/delay.h> | 20 | #include <asm/delay.h> |
| 20 | #include <sound/core.h> | 21 | #include <sound/core.h> |
diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index cedd9044022f..6a9ae40c7c6d 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
| 25 | #include <linux/usb.h> | 25 | #include <linux/usb.h> |
| 26 | #include <linux/version.h> | 26 | #include <linux/version.h> |
| 27 | #include <linux/slab.h> | ||
| 27 | #include <media/v4l2-common.h> | 28 | #include <media/v4l2-common.h> |
| 28 | #include <media/tuner.h> | 29 | #include <media/tuner.h> |
| 29 | #include <media/tvaudio.h> | 30 | #include <media/tvaudio.h> |
diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c index 27f3f551b545..c3690e3580da 100644 --- a/drivers/staging/tm6000/tm6000-core.c +++ b/drivers/staging/tm6000/tm6000-core.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/slab.h> | ||
| 25 | #include <linux/usb.h> | 26 | #include <linux/usb.h> |
| 26 | #include <linux/i2c.h> | 27 | #include <linux/i2c.h> |
| 27 | #include "tm6000.h" | 28 | #include "tm6000.h" |
diff --git a/drivers/staging/tm6000/tm6000-dvb.c b/drivers/staging/tm6000/tm6000-dvb.c index 261e66acbe46..86c1c8b5f25a 100644 --- a/drivers/staging/tm6000/tm6000-dvb.c +++ b/drivers/staging/tm6000/tm6000-dvb.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
| 21 | #include <linux/slab.h> | ||
| 21 | #include <linux/usb.h> | 22 | #include <linux/usb.h> |
| 22 | 23 | ||
| 23 | #include "tm6000.h" | 24 | #include "tm6000.h" |
diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c index 76e7dac6f259..70b1d9d51c96 100644 --- a/drivers/video/geode/gxfb_core.c +++ b/drivers/video/geode/gxfb_core.c | |||
| @@ -40,7 +40,7 @@ static int vram; | |||
| 40 | static int vt_switch; | 40 | static int vt_switch; |
| 41 | 41 | ||
| 42 | /* Modes relevant to the GX (taken from modedb.c) */ | 42 | /* Modes relevant to the GX (taken from modedb.c) */ |
| 43 | static struct fb_videomode gx_modedb[] __initdata = { | 43 | static struct fb_videomode gx_modedb[] __devinitdata = { |
| 44 | /* 640x480-60 VESA */ | 44 | /* 640x480-60 VESA */ |
| 45 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, | 45 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, |
| 46 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, | 46 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, |
| @@ -110,14 +110,15 @@ static struct fb_videomode gx_modedb[] __initdata = { | |||
| 110 | #ifdef CONFIG_OLPC | 110 | #ifdef CONFIG_OLPC |
| 111 | #include <asm/olpc.h> | 111 | #include <asm/olpc.h> |
| 112 | 112 | ||
| 113 | static struct fb_videomode gx_dcon_modedb[] __initdata = { | 113 | static struct fb_videomode gx_dcon_modedb[] __devinitdata = { |
| 114 | /* The only mode the DCON has is 1200x900 */ | 114 | /* The only mode the DCON has is 1200x900 */ |
| 115 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | 115 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, |
| 116 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 116 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| 117 | FB_VMODE_NONINTERLACED, 0 } | 117 | FB_VMODE_NONINTERLACED, 0 } |
| 118 | }; | 118 | }; |
| 119 | 119 | ||
| 120 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 120 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 121 | unsigned int *size) | ||
| 121 | { | 122 | { |
| 122 | if (olpc_has_dcon()) { | 123 | if (olpc_has_dcon()) { |
| 123 | *modedb = (struct fb_videomode *) gx_dcon_modedb; | 124 | *modedb = (struct fb_videomode *) gx_dcon_modedb; |
| @@ -129,7 +130,8 @@ static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | |||
| 129 | } | 130 | } |
| 130 | 131 | ||
| 131 | #else | 132 | #else |
| 132 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 133 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 134 | unsigned int *size) | ||
| 133 | { | 135 | { |
| 134 | *modedb = (struct fb_videomode *) gx_modedb; | 136 | *modedb = (struct fb_videomode *) gx_modedb; |
| 135 | *size = ARRAY_SIZE(gx_modedb); | 137 | *size = ARRAY_SIZE(gx_modedb); |
| @@ -226,7 +228,8 @@ static int gxfb_blank(int blank_mode, struct fb_info *info) | |||
| 226 | return gx_blank_display(info, blank_mode); | 228 | return gx_blank_display(info, blank_mode); |
| 227 | } | 229 | } |
| 228 | 230 | ||
| 229 | static int __init gxfb_map_video_memory(struct fb_info *info, struct pci_dev *dev) | 231 | static int __devinit gxfb_map_video_memory(struct fb_info *info, |
| 232 | struct pci_dev *dev) | ||
| 230 | { | 233 | { |
| 231 | struct gxfb_par *par = info->par; | 234 | struct gxfb_par *par = info->par; |
| 232 | int ret; | 235 | int ret; |
| @@ -290,7 +293,7 @@ static struct fb_ops gxfb_ops = { | |||
| 290 | .fb_imageblit = cfb_imageblit, | 293 | .fb_imageblit = cfb_imageblit, |
| 291 | }; | 294 | }; |
| 292 | 295 | ||
| 293 | static struct fb_info * __init gxfb_init_fbinfo(struct device *dev) | 296 | static struct fb_info *__devinit gxfb_init_fbinfo(struct device *dev) |
| 294 | { | 297 | { |
| 295 | struct gxfb_par *par; | 298 | struct gxfb_par *par; |
| 296 | struct fb_info *info; | 299 | struct fb_info *info; |
| @@ -371,7 +374,8 @@ static int gxfb_resume(struct pci_dev *pdev) | |||
| 371 | } | 374 | } |
| 372 | #endif | 375 | #endif |
| 373 | 376 | ||
| 374 | static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 377 | static int __devinit gxfb_probe(struct pci_dev *pdev, |
| 378 | const struct pci_device_id *id) | ||
| 375 | { | 379 | { |
| 376 | struct gxfb_par *par; | 380 | struct gxfb_par *par; |
| 377 | struct fb_info *info; | 381 | struct fb_info *info; |
| @@ -451,7 +455,7 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i | |||
| 451 | return ret; | 455 | return ret; |
| 452 | } | 456 | } |
| 453 | 457 | ||
| 454 | static void gxfb_remove(struct pci_dev *pdev) | 458 | static void __devexit gxfb_remove(struct pci_dev *pdev) |
| 455 | { | 459 | { |
| 456 | struct fb_info *info = pci_get_drvdata(pdev); | 460 | struct fb_info *info = pci_get_drvdata(pdev); |
| 457 | struct gxfb_par *par = info->par; | 461 | struct gxfb_par *par = info->par; |
diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c index 1a18da86d3fa..39bdbedf43b4 100644 --- a/drivers/video/geode/lxfb_core.c +++ b/drivers/video/geode/lxfb_core.c | |||
| @@ -35,7 +35,7 @@ static int vt_switch; | |||
| 35 | * we try to make it something sane - 640x480-60 is sane | 35 | * we try to make it something sane - 640x480-60 is sane |
| 36 | */ | 36 | */ |
| 37 | 37 | ||
| 38 | static struct fb_videomode geode_modedb[] __initdata = { | 38 | static struct fb_videomode geode_modedb[] __devinitdata = { |
| 39 | /* 640x480-60 */ | 39 | /* 640x480-60 */ |
| 40 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, | 40 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, |
| 41 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 41 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| @@ -219,14 +219,15 @@ static struct fb_videomode geode_modedb[] __initdata = { | |||
| 219 | #ifdef CONFIG_OLPC | 219 | #ifdef CONFIG_OLPC |
| 220 | #include <asm/olpc.h> | 220 | #include <asm/olpc.h> |
| 221 | 221 | ||
| 222 | static struct fb_videomode olpc_dcon_modedb[] __initdata = { | 222 | static struct fb_videomode olpc_dcon_modedb[] __devinitdata = { |
| 223 | /* The only mode the DCON has is 1200x900 */ | 223 | /* The only mode the DCON has is 1200x900 */ |
| 224 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | 224 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, |
| 225 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 225 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| 226 | FB_VMODE_NONINTERLACED, 0 } | 226 | FB_VMODE_NONINTERLACED, 0 } |
| 227 | }; | 227 | }; |
| 228 | 228 | ||
| 229 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 229 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 230 | unsigned int *size) | ||
| 230 | { | 231 | { |
| 231 | if (olpc_has_dcon()) { | 232 | if (olpc_has_dcon()) { |
| 232 | *modedb = (struct fb_videomode *) olpc_dcon_modedb; | 233 | *modedb = (struct fb_videomode *) olpc_dcon_modedb; |
| @@ -238,7 +239,8 @@ static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | |||
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | #else | 241 | #else |
| 241 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | 242 | static void __devinit get_modedb(struct fb_videomode **modedb, |
| 243 | unsigned int *size) | ||
| 242 | { | 244 | { |
| 243 | *modedb = (struct fb_videomode *) geode_modedb; | 245 | *modedb = (struct fb_videomode *) geode_modedb; |
| 244 | *size = ARRAY_SIZE(geode_modedb); | 246 | *size = ARRAY_SIZE(geode_modedb); |
| @@ -334,7 +336,7 @@ static int lxfb_blank(int blank_mode, struct fb_info *info) | |||
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | 338 | ||
| 337 | static int __init lxfb_map_video_memory(struct fb_info *info, | 339 | static int __devinit lxfb_map_video_memory(struct fb_info *info, |
| 338 | struct pci_dev *dev) | 340 | struct pci_dev *dev) |
| 339 | { | 341 | { |
| 340 | struct lxfb_par *par = info->par; | 342 | struct lxfb_par *par = info->par; |
| @@ -412,7 +414,7 @@ static struct fb_ops lxfb_ops = { | |||
| 412 | .fb_imageblit = cfb_imageblit, | 414 | .fb_imageblit = cfb_imageblit, |
| 413 | }; | 415 | }; |
| 414 | 416 | ||
| 415 | static struct fb_info * __init lxfb_init_fbinfo(struct device *dev) | 417 | static struct fb_info * __devinit lxfb_init_fbinfo(struct device *dev) |
| 416 | { | 418 | { |
| 417 | struct lxfb_par *par; | 419 | struct lxfb_par *par; |
| 418 | struct fb_info *info; | 420 | struct fb_info *info; |
| @@ -496,7 +498,7 @@ static int lxfb_resume(struct pci_dev *pdev) | |||
| 496 | #define lxfb_resume NULL | 498 | #define lxfb_resume NULL |
| 497 | #endif | 499 | #endif |
| 498 | 500 | ||
| 499 | static int __init lxfb_probe(struct pci_dev *pdev, | 501 | static int __devinit lxfb_probe(struct pci_dev *pdev, |
| 500 | const struct pci_device_id *id) | 502 | const struct pci_device_id *id) |
| 501 | { | 503 | { |
| 502 | struct lxfb_par *par; | 504 | struct lxfb_par *par; |
| @@ -588,7 +590,7 @@ err: | |||
| 588 | return ret; | 590 | return ret; |
| 589 | } | 591 | } |
| 590 | 592 | ||
| 591 | static void lxfb_remove(struct pci_dev *pdev) | 593 | static void __devexit lxfb_remove(struct pci_dev *pdev) |
| 592 | { | 594 | { |
| 593 | struct fb_info *info = pci_get_drvdata(pdev); | 595 | struct fb_info *info = pci_get_drvdata(pdev); |
| 594 | struct lxfb_par *par = info->par; | 596 | struct lxfb_par *par = info->par; |
diff --git a/drivers/video/nuc900fb.c b/drivers/video/nuc900fb.c index d4cde79ea15e..81687ed26ba9 100644 --- a/drivers/video/nuc900fb.c +++ b/drivers/video/nuc900fb.c | |||
| @@ -596,8 +596,6 @@ static int __devinit nuc900fb_probe(struct platform_device *pdev) | |||
| 596 | goto release_regs; | 596 | goto release_regs; |
| 597 | } | 597 | } |
| 598 | 598 | ||
| 599 | nuc900_driver_clksrc_div(&pdev->dev, "ext", 0x2); | ||
| 600 | |||
| 601 | fbi->clk = clk_get(&pdev->dev, NULL); | 599 | fbi->clk = clk_get(&pdev->dev, NULL); |
| 602 | if (!fbi->clk || IS_ERR(fbi->clk)) { | 600 | if (!fbi->clk || IS_ERR(fbi->clk)) { |
| 603 | printk(KERN_ERR "nuc900-lcd:failed to get lcd clock source\n"); | 601 | printk(KERN_ERR "nuc900-lcd:failed to get lcd clock source\n"); |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index b6ab27ccf214..811384bec8de 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -68,11 +68,7 @@ | |||
| 68 | * Here we can be a bit looser than the data sections since this | 68 | * Here we can be a bit looser than the data sections since this |
| 69 | * needs to only meet arch ABI requirements. | 69 | * needs to only meet arch ABI requirements. |
| 70 | */ | 70 | */ |
| 71 | #ifdef ARCH_SLAB_MINALIGN | 71 | #define FLAT_STACK_ALIGN max_t(unsigned long, sizeof(void *), ARCH_SLAB_MINALIGN) |
| 72 | #define FLAT_STACK_ALIGN (ARCH_SLAB_MINALIGN) | ||
| 73 | #else | ||
| 74 | #define FLAT_STACK_ALIGN (sizeof(void *)) | ||
| 75 | #endif | ||
| 76 | 72 | ||
| 77 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ | 73 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ |
| 78 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ | 74 | #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ |
diff --git a/fs/dcache.c b/fs/dcache.c index d96047b4a633..c8c78ba07827 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -590,6 +590,8 @@ static void prune_dcache(int count) | |||
| 590 | up_read(&sb->s_umount); | 590 | up_read(&sb->s_umount); |
| 591 | } | 591 | } |
| 592 | spin_lock(&sb_lock); | 592 | spin_lock(&sb_lock); |
| 593 | /* lock was dropped, must reset next */ | ||
| 594 | list_safe_reset_next(sb, n, s_list); | ||
| 593 | count -= pruned; | 595 | count -= pruned; |
| 594 | __put_super(sb); | 596 | __put_super(sb); |
| 595 | /* more work left to do? */ | 597 | /* more work left to do? */ |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 51e11bf5708f..9d175d623aab 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -733,12 +733,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band) | |||
| 733 | { | 733 | { |
| 734 | while (fa) { | 734 | while (fa) { |
| 735 | struct fown_struct *fown; | 735 | struct fown_struct *fown; |
| 736 | unsigned long flags; | ||
| 737 | |||
| 736 | if (fa->magic != FASYNC_MAGIC) { | 738 | if (fa->magic != FASYNC_MAGIC) { |
| 737 | printk(KERN_ERR "kill_fasync: bad magic number in " | 739 | printk(KERN_ERR "kill_fasync: bad magic number in " |
| 738 | "fasync_struct!\n"); | 740 | "fasync_struct!\n"); |
| 739 | return; | 741 | return; |
| 740 | } | 742 | } |
| 741 | spin_lock(&fa->fa_lock); | 743 | spin_lock_irqsave(&fa->fa_lock, flags); |
| 742 | if (fa->fa_file) { | 744 | if (fa->fa_file) { |
| 743 | fown = &fa->fa_file->f_owner; | 745 | fown = &fa->fa_file->f_owner; |
| 744 | /* Don't send SIGURG to processes which have not set a | 746 | /* Don't send SIGURG to processes which have not set a |
| @@ -747,7 +749,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band) | |||
| 747 | if (!(sig == SIGURG && fown->signum == 0)) | 749 | if (!(sig == SIGURG && fown->signum == 0)) |
| 748 | send_sigio(fown, fa->fa_fd, band); | 750 | send_sigio(fown, fa->fa_fd, band); |
| 749 | } | 751 | } |
| 750 | spin_unlock(&fa->fa_lock); | 752 | spin_unlock_irqrestore(&fa->fa_lock, flags); |
| 751 | fa = rcu_dereference(fa->fa_next); | 753 | fa = rcu_dereference(fa->fa_next); |
| 752 | } | 754 | } |
| 753 | } | 755 | } |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 1d1088f48bc2..0609607d3955 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -63,24 +63,16 @@ struct bdi_work { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | enum { | 65 | enum { |
| 66 | WS_USED_B = 0, | 66 | WS_INPROGRESS = 0, |
| 67 | WS_ONSTACK_B, | 67 | WS_ONSTACK, |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | #define WS_USED (1 << WS_USED_B) | ||
| 71 | #define WS_ONSTACK (1 << WS_ONSTACK_B) | ||
| 72 | |||
| 73 | static inline bool bdi_work_on_stack(struct bdi_work *work) | ||
| 74 | { | ||
| 75 | return test_bit(WS_ONSTACK_B, &work->state); | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline void bdi_work_init(struct bdi_work *work, | 70 | static inline void bdi_work_init(struct bdi_work *work, |
| 79 | struct wb_writeback_args *args) | 71 | struct wb_writeback_args *args) |
| 80 | { | 72 | { |
| 81 | INIT_RCU_HEAD(&work->rcu_head); | 73 | INIT_RCU_HEAD(&work->rcu_head); |
| 82 | work->args = *args; | 74 | work->args = *args; |
| 83 | work->state = WS_USED; | 75 | __set_bit(WS_INPROGRESS, &work->state); |
| 84 | } | 76 | } |
| 85 | 77 | ||
| 86 | /** | 78 | /** |
| @@ -95,43 +87,16 @@ int writeback_in_progress(struct backing_dev_info *bdi) | |||
| 95 | return !list_empty(&bdi->work_list); | 87 | return !list_empty(&bdi->work_list); |
| 96 | } | 88 | } |
| 97 | 89 | ||
| 98 | static void bdi_work_clear(struct bdi_work *work) | ||
| 99 | { | ||
| 100 | clear_bit(WS_USED_B, &work->state); | ||
| 101 | smp_mb__after_clear_bit(); | ||
| 102 | /* | ||
| 103 | * work can have disappeared at this point. bit waitq functions | ||
| 104 | * should be able to tolerate this, provided bdi_sched_wait does | ||
| 105 | * not dereference it's pointer argument. | ||
| 106 | */ | ||
| 107 | wake_up_bit(&work->state, WS_USED_B); | ||
| 108 | } | ||
| 109 | |||
| 110 | static void bdi_work_free(struct rcu_head *head) | 90 | static void bdi_work_free(struct rcu_head *head) |
| 111 | { | 91 | { |
| 112 | struct bdi_work *work = container_of(head, struct bdi_work, rcu_head); | 92 | struct bdi_work *work = container_of(head, struct bdi_work, rcu_head); |
| 113 | 93 | ||
| 114 | if (!bdi_work_on_stack(work)) | 94 | clear_bit(WS_INPROGRESS, &work->state); |
| 115 | kfree(work); | 95 | smp_mb__after_clear_bit(); |
| 116 | else | 96 | wake_up_bit(&work->state, WS_INPROGRESS); |
| 117 | bdi_work_clear(work); | ||
| 118 | } | ||
| 119 | |||
| 120 | static void wb_work_complete(struct bdi_work *work) | ||
| 121 | { | ||
| 122 | const enum writeback_sync_modes sync_mode = work->args.sync_mode; | ||
| 123 | int onstack = bdi_work_on_stack(work); | ||
| 124 | 97 | ||
| 125 | /* | 98 | if (!test_bit(WS_ONSTACK, &work->state)) |
| 126 | * For allocated work, we can clear the done/seen bit right here. | 99 | kfree(work); |
| 127 | * For on-stack work, we need to postpone both the clear and free | ||
| 128 | * to after the RCU grace period, since the stack could be invalidated | ||
| 129 | * as soon as bdi_work_clear() has done the wakeup. | ||
| 130 | */ | ||
| 131 | if (!onstack) | ||
| 132 | bdi_work_clear(work); | ||
| 133 | if (sync_mode == WB_SYNC_NONE || onstack) | ||
| 134 | call_rcu(&work->rcu_head, bdi_work_free); | ||
| 135 | } | 100 | } |
| 136 | 101 | ||
| 137 | static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) | 102 | static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) |
| @@ -147,7 +112,7 @@ static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) | |||
| 147 | list_del_rcu(&work->list); | 112 | list_del_rcu(&work->list); |
| 148 | spin_unlock(&bdi->wb_lock); | 113 | spin_unlock(&bdi->wb_lock); |
| 149 | 114 | ||
| 150 | wb_work_complete(work); | 115 | call_rcu(&work->rcu_head, bdi_work_free); |
| 151 | } | 116 | } |
| 152 | } | 117 | } |
| 153 | 118 | ||
| @@ -185,9 +150,9 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) | |||
| 185 | * Used for on-stack allocated work items. The caller needs to wait until | 150 | * Used for on-stack allocated work items. The caller needs to wait until |
| 186 | * the wb threads have acked the work before it's safe to continue. | 151 | * the wb threads have acked the work before it's safe to continue. |
| 187 | */ | 152 | */ |
| 188 | static void bdi_wait_on_work_clear(struct bdi_work *work) | 153 | static void bdi_wait_on_work_done(struct bdi_work *work) |
| 189 | { | 154 | { |
| 190 | wait_on_bit(&work->state, WS_USED_B, bdi_sched_wait, | 155 | wait_on_bit(&work->state, WS_INPROGRESS, bdi_sched_wait, |
| 191 | TASK_UNINTERRUPTIBLE); | 156 | TASK_UNINTERRUPTIBLE); |
| 192 | } | 157 | } |
| 193 | 158 | ||
| @@ -213,37 +178,28 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, | |||
| 213 | } | 178 | } |
| 214 | 179 | ||
| 215 | /** | 180 | /** |
| 216 | * bdi_sync_writeback - start and wait for writeback | 181 | * bdi_queue_work_onstack - start and wait for writeback |
| 217 | * @bdi: the backing device to write from | ||
| 218 | * @sb: write inodes from this super_block | 182 | * @sb: write inodes from this super_block |
| 219 | * | 183 | * |
| 220 | * Description: | 184 | * Description: |
| 221 | * This does WB_SYNC_ALL data integrity writeback and waits for the | 185 | * This function initiates writeback and waits for the operation to |
| 222 | * IO to complete. Callers must hold the sb s_umount semaphore for | 186 | * complete. Callers must hold the sb s_umount semaphore for |
| 223 | * reading, to avoid having the super disappear before we are done. | 187 | * reading, to avoid having the super disappear before we are done. |
| 224 | */ | 188 | */ |
| 225 | static void bdi_sync_writeback(struct backing_dev_info *bdi, | 189 | static void bdi_queue_work_onstack(struct wb_writeback_args *args) |
| 226 | struct super_block *sb) | ||
| 227 | { | 190 | { |
| 228 | struct wb_writeback_args args = { | ||
| 229 | .sb = sb, | ||
| 230 | .sync_mode = WB_SYNC_ALL, | ||
| 231 | .nr_pages = LONG_MAX, | ||
| 232 | .range_cyclic = 0, | ||
| 233 | }; | ||
| 234 | struct bdi_work work; | 191 | struct bdi_work work; |
| 235 | 192 | ||
| 236 | bdi_work_init(&work, &args); | 193 | bdi_work_init(&work, args); |
| 237 | work.state |= WS_ONSTACK; | 194 | __set_bit(WS_ONSTACK, &work.state); |
| 238 | 195 | ||
| 239 | bdi_queue_work(bdi, &work); | 196 | bdi_queue_work(args->sb->s_bdi, &work); |
| 240 | bdi_wait_on_work_clear(&work); | 197 | bdi_wait_on_work_done(&work); |
| 241 | } | 198 | } |
| 242 | 199 | ||
| 243 | /** | 200 | /** |
| 244 | * bdi_start_writeback - start writeback | 201 | * bdi_start_writeback - start writeback |
| 245 | * @bdi: the backing device to write from | 202 | * @bdi: the backing device to write from |
| 246 | * @sb: write inodes from this super_block | ||
| 247 | * @nr_pages: the number of pages to write | 203 | * @nr_pages: the number of pages to write |
| 248 | * | 204 | * |
| 249 | * Description: | 205 | * Description: |
| @@ -252,25 +208,34 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, | |||
| 252 | * completion. Caller need not hold sb s_umount semaphore. | 208 | * completion. Caller need not hold sb s_umount semaphore. |
| 253 | * | 209 | * |
| 254 | */ | 210 | */ |
| 255 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | 211 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages) |
| 256 | long nr_pages) | ||
| 257 | { | 212 | { |
| 258 | struct wb_writeback_args args = { | 213 | struct wb_writeback_args args = { |
| 259 | .sb = sb, | ||
| 260 | .sync_mode = WB_SYNC_NONE, | 214 | .sync_mode = WB_SYNC_NONE, |
| 261 | .nr_pages = nr_pages, | 215 | .nr_pages = nr_pages, |
| 262 | .range_cyclic = 1, | 216 | .range_cyclic = 1, |
| 263 | }; | 217 | }; |
| 264 | 218 | ||
| 265 | /* | 219 | bdi_alloc_queue_work(bdi, &args); |
| 266 | * We treat @nr_pages=0 as the special case to do background writeback, | 220 | } |
| 267 | * ie. to sync pages until the background dirty threshold is reached. | ||
| 268 | */ | ||
| 269 | if (!nr_pages) { | ||
| 270 | args.nr_pages = LONG_MAX; | ||
| 271 | args.for_background = 1; | ||
| 272 | } | ||
| 273 | 221 | ||
| 222 | /** | ||
| 223 | * bdi_start_background_writeback - start background writeback | ||
| 224 | * @bdi: the backing device to write from | ||
| 225 | * | ||
| 226 | * Description: | ||
| 227 | * This does WB_SYNC_NONE background writeback. The IO is only | ||
| 228 | * started when this function returns, we make no guarentees on | ||
| 229 | * completion. Caller need not hold sb s_umount semaphore. | ||
| 230 | */ | ||
| 231 | void bdi_start_background_writeback(struct backing_dev_info *bdi) | ||
| 232 | { | ||
| 233 | struct wb_writeback_args args = { | ||
| 234 | .sync_mode = WB_SYNC_NONE, | ||
| 235 | .nr_pages = LONG_MAX, | ||
| 236 | .for_background = 1, | ||
| 237 | .range_cyclic = 1, | ||
| 238 | }; | ||
| 274 | bdi_alloc_queue_work(bdi, &args); | 239 | bdi_alloc_queue_work(bdi, &args); |
| 275 | } | 240 | } |
| 276 | 241 | ||
| @@ -561,48 +526,30 @@ select_queue: | |||
| 561 | return ret; | 526 | return ret; |
| 562 | } | 527 | } |
| 563 | 528 | ||
| 564 | static void unpin_sb_for_writeback(struct super_block *sb) | ||
| 565 | { | ||
| 566 | up_read(&sb->s_umount); | ||
| 567 | put_super(sb); | ||
| 568 | } | ||
| 569 | |||
| 570 | enum sb_pin_state { | ||
| 571 | SB_PINNED, | ||
| 572 | SB_NOT_PINNED, | ||
| 573 | SB_PIN_FAILED | ||
| 574 | }; | ||
| 575 | |||
| 576 | /* | 529 | /* |
| 577 | * For WB_SYNC_NONE writeback, the caller does not have the sb pinned | 530 | * For background writeback the caller does not have the sb pinned |
| 578 | * before calling writeback. So make sure that we do pin it, so it doesn't | 531 | * before calling writeback. So make sure that we do pin it, so it doesn't |
| 579 | * go away while we are writing inodes from it. | 532 | * go away while we are writing inodes from it. |
| 580 | */ | 533 | */ |
| 581 | static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc, | 534 | static bool pin_sb_for_writeback(struct super_block *sb) |
| 582 | struct super_block *sb) | ||
| 583 | { | 535 | { |
| 584 | /* | ||
| 585 | * Caller must already hold the ref for this | ||
| 586 | */ | ||
| 587 | if (wbc->sync_mode == WB_SYNC_ALL) { | ||
| 588 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 589 | return SB_NOT_PINNED; | ||
| 590 | } | ||
| 591 | spin_lock(&sb_lock); | 536 | spin_lock(&sb_lock); |
| 537 | if (list_empty(&sb->s_instances)) { | ||
| 538 | spin_unlock(&sb_lock); | ||
| 539 | return false; | ||
| 540 | } | ||
| 541 | |||
| 592 | sb->s_count++; | 542 | sb->s_count++; |
| 543 | spin_unlock(&sb_lock); | ||
| 544 | |||
| 593 | if (down_read_trylock(&sb->s_umount)) { | 545 | if (down_read_trylock(&sb->s_umount)) { |
| 594 | if (sb->s_root) { | 546 | if (sb->s_root) |
| 595 | spin_unlock(&sb_lock); | 547 | return true; |
| 596 | return SB_PINNED; | ||
| 597 | } | ||
| 598 | /* | ||
| 599 | * umounted, drop rwsem again and fall through to failure | ||
| 600 | */ | ||
| 601 | up_read(&sb->s_umount); | 548 | up_read(&sb->s_umount); |
| 602 | } | 549 | } |
| 603 | sb->s_count--; | 550 | |
| 604 | spin_unlock(&sb_lock); | 551 | put_super(sb); |
| 605 | return SB_PIN_FAILED; | 552 | return false; |
| 606 | } | 553 | } |
| 607 | 554 | ||
| 608 | /* | 555 | /* |
| @@ -681,24 +628,31 @@ static void writeback_inodes_wb(struct bdi_writeback *wb, | |||
| 681 | struct inode *inode = list_entry(wb->b_io.prev, | 628 | struct inode *inode = list_entry(wb->b_io.prev, |
| 682 | struct inode, i_list); | 629 | struct inode, i_list); |
| 683 | struct super_block *sb = inode->i_sb; | 630 | struct super_block *sb = inode->i_sb; |
| 684 | enum sb_pin_state state; | ||
| 685 | 631 | ||
| 686 | if (wbc->sb && sb != wbc->sb) { | 632 | if (wbc->sb) { |
| 687 | /* super block given and doesn't | 633 | /* |
| 688 | match, skip this inode */ | 634 | * We are requested to write out inodes for a specific |
| 689 | redirty_tail(inode); | 635 | * superblock. This means we already have s_umount |
| 690 | continue; | 636 | * taken by the caller which also waits for us to |
| 691 | } | 637 | * complete the writeout. |
| 692 | state = pin_sb_for_writeback(wbc, sb); | 638 | */ |
| 639 | if (sb != wbc->sb) { | ||
| 640 | redirty_tail(inode); | ||
| 641 | continue; | ||
| 642 | } | ||
| 693 | 643 | ||
| 694 | if (state == SB_PIN_FAILED) { | 644 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); |
| 695 | requeue_io(inode); | 645 | |
| 696 | continue; | 646 | ret = writeback_sb_inodes(sb, wb, wbc); |
| 647 | } else { | ||
| 648 | if (!pin_sb_for_writeback(sb)) { | ||
| 649 | requeue_io(inode); | ||
| 650 | continue; | ||
| 651 | } | ||
| 652 | ret = writeback_sb_inodes(sb, wb, wbc); | ||
| 653 | drop_super(sb); | ||
| 697 | } | 654 | } |
| 698 | ret = writeback_sb_inodes(sb, wb, wbc); | ||
| 699 | 655 | ||
| 700 | if (state == SB_PINNED) | ||
| 701 | unpin_sb_for_writeback(sb); | ||
| 702 | if (ret) | 656 | if (ret) |
| 703 | break; | 657 | break; |
| 704 | } | 658 | } |
| @@ -911,7 +865,7 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 911 | * If this isn't a data integrity operation, just notify | 865 | * If this isn't a data integrity operation, just notify |
| 912 | * that we have seen this work and we are now starting it. | 866 | * that we have seen this work and we are now starting it. |
| 913 | */ | 867 | */ |
| 914 | if (args.sync_mode == WB_SYNC_NONE) | 868 | if (!test_bit(WS_ONSTACK, &work->state)) |
| 915 | wb_clear_pending(wb, work); | 869 | wb_clear_pending(wb, work); |
| 916 | 870 | ||
| 917 | wrote += wb_writeback(wb, &args); | 871 | wrote += wb_writeback(wb, &args); |
| @@ -920,7 +874,7 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 920 | * This is a data integrity writeback, so only do the | 874 | * This is a data integrity writeback, so only do the |
| 921 | * notification when we have completed the work. | 875 | * notification when we have completed the work. |
| 922 | */ | 876 | */ |
| 923 | if (args.sync_mode == WB_SYNC_ALL) | 877 | if (test_bit(WS_ONSTACK, &work->state)) |
| 924 | wb_clear_pending(wb, work); | 878 | wb_clear_pending(wb, work); |
| 925 | } | 879 | } |
| 926 | 880 | ||
| @@ -978,42 +932,32 @@ int bdi_writeback_task(struct bdi_writeback *wb) | |||
| 978 | } | 932 | } |
| 979 | 933 | ||
| 980 | /* | 934 | /* |
| 981 | * Schedule writeback for all backing devices. This does WB_SYNC_NONE | 935 | * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back |
| 982 | * writeback, for integrity writeback see bdi_sync_writeback(). | 936 | * the whole world. |
| 983 | */ | 937 | */ |
| 984 | static void bdi_writeback_all(struct super_block *sb, long nr_pages) | 938 | void wakeup_flusher_threads(long nr_pages) |
| 985 | { | 939 | { |
| 940 | struct backing_dev_info *bdi; | ||
| 986 | struct wb_writeback_args args = { | 941 | struct wb_writeback_args args = { |
| 987 | .sb = sb, | ||
| 988 | .nr_pages = nr_pages, | ||
| 989 | .sync_mode = WB_SYNC_NONE, | 942 | .sync_mode = WB_SYNC_NONE, |
| 990 | }; | 943 | }; |
| 991 | struct backing_dev_info *bdi; | ||
| 992 | 944 | ||
| 993 | rcu_read_lock(); | 945 | if (nr_pages) { |
| 946 | args.nr_pages = nr_pages; | ||
| 947 | } else { | ||
| 948 | args.nr_pages = global_page_state(NR_FILE_DIRTY) + | ||
| 949 | global_page_state(NR_UNSTABLE_NFS); | ||
| 950 | } | ||
| 994 | 951 | ||
| 952 | rcu_read_lock(); | ||
| 995 | list_for_each_entry_rcu(bdi, &bdi_list, bdi_list) { | 953 | list_for_each_entry_rcu(bdi, &bdi_list, bdi_list) { |
| 996 | if (!bdi_has_dirty_io(bdi)) | 954 | if (!bdi_has_dirty_io(bdi)) |
| 997 | continue; | 955 | continue; |
| 998 | |||
| 999 | bdi_alloc_queue_work(bdi, &args); | 956 | bdi_alloc_queue_work(bdi, &args); |
| 1000 | } | 957 | } |
| 1001 | |||
| 1002 | rcu_read_unlock(); | 958 | rcu_read_unlock(); |
| 1003 | } | 959 | } |
| 1004 | 960 | ||
| 1005 | /* | ||
| 1006 | * Start writeback of `nr_pages' pages. If `nr_pages' is zero, write back | ||
| 1007 | * the whole world. | ||
| 1008 | */ | ||
| 1009 | void wakeup_flusher_threads(long nr_pages) | ||
| 1010 | { | ||
| 1011 | if (nr_pages == 0) | ||
| 1012 | nr_pages = global_page_state(NR_FILE_DIRTY) + | ||
| 1013 | global_page_state(NR_UNSTABLE_NFS); | ||
| 1014 | bdi_writeback_all(NULL, nr_pages); | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | static noinline void block_dump___mark_inode_dirty(struct inode *inode) | 961 | static noinline void block_dump___mark_inode_dirty(struct inode *inode) |
| 1018 | { | 962 | { |
| 1019 | if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) { | 963 | if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) { |
| @@ -1218,12 +1162,17 @@ void writeback_inodes_sb(struct super_block *sb) | |||
| 1218 | { | 1162 | { |
| 1219 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); | 1163 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); |
| 1220 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); | 1164 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); |
| 1221 | long nr_to_write; | 1165 | struct wb_writeback_args args = { |
| 1166 | .sb = sb, | ||
| 1167 | .sync_mode = WB_SYNC_NONE, | ||
| 1168 | }; | ||
| 1169 | |||
| 1170 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 1222 | 1171 | ||
| 1223 | nr_to_write = nr_dirty + nr_unstable + | 1172 | args.nr_pages = nr_dirty + nr_unstable + |
| 1224 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); | 1173 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); |
| 1225 | 1174 | ||
| 1226 | bdi_start_writeback(sb->s_bdi, sb, nr_to_write); | 1175 | bdi_queue_work_onstack(&args); |
| 1227 | } | 1176 | } |
| 1228 | EXPORT_SYMBOL(writeback_inodes_sb); | 1177 | EXPORT_SYMBOL(writeback_inodes_sb); |
| 1229 | 1178 | ||
| @@ -1237,7 +1186,9 @@ EXPORT_SYMBOL(writeback_inodes_sb); | |||
| 1237 | int writeback_inodes_sb_if_idle(struct super_block *sb) | 1186 | int writeback_inodes_sb_if_idle(struct super_block *sb) |
| 1238 | { | 1187 | { |
| 1239 | if (!writeback_in_progress(sb->s_bdi)) { | 1188 | if (!writeback_in_progress(sb->s_bdi)) { |
| 1189 | down_read(&sb->s_umount); | ||
| 1240 | writeback_inodes_sb(sb); | 1190 | writeback_inodes_sb(sb); |
| 1191 | up_read(&sb->s_umount); | ||
| 1241 | return 1; | 1192 | return 1; |
| 1242 | } else | 1193 | } else |
| 1243 | return 0; | 1194 | return 0; |
| @@ -1253,7 +1204,16 @@ EXPORT_SYMBOL(writeback_inodes_sb_if_idle); | |||
| 1253 | */ | 1204 | */ |
| 1254 | void sync_inodes_sb(struct super_block *sb) | 1205 | void sync_inodes_sb(struct super_block *sb) |
| 1255 | { | 1206 | { |
| 1256 | bdi_sync_writeback(sb->s_bdi, sb); | 1207 | struct wb_writeback_args args = { |
| 1208 | .sb = sb, | ||
| 1209 | .sync_mode = WB_SYNC_ALL, | ||
| 1210 | .nr_pages = LONG_MAX, | ||
| 1211 | .range_cyclic = 0, | ||
| 1212 | }; | ||
| 1213 | |||
| 1214 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | ||
| 1215 | |||
| 1216 | bdi_queue_work_onstack(&args); | ||
| 1257 | wait_sb_inodes(sb); | 1217 | wait_sb_inodes(sb); |
| 1258 | } | 1218 | } |
| 1259 | EXPORT_SYMBOL(sync_inodes_sb); | 1219 | EXPORT_SYMBOL(sync_inodes_sb); |
diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c index 40650021fc24..d8b6e4259b80 100644 --- a/fs/ocfs2/reservations.c +++ b/fs/ocfs2/reservations.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/slab.h> | ||
| 30 | #include <linux/highmem.h> | 29 | #include <linux/highmem.h> |
| 31 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
| 32 | #include <linux/list.h> | 31 | #include <linux/list.h> |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 46d4b5d72bd3..cb6306e63843 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
| @@ -122,11 +122,20 @@ int task_statm(struct mm_struct *mm, int *shared, int *text, | |||
| 122 | return size; | 122 | return size; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | static void pad_len_spaces(struct seq_file *m, int len) | ||
| 126 | { | ||
| 127 | len = 25 + sizeof(void*) * 6 - len; | ||
| 128 | if (len < 1) | ||
| 129 | len = 1; | ||
| 130 | seq_printf(m, "%*c", len, ' '); | ||
| 131 | } | ||
| 132 | |||
| 125 | /* | 133 | /* |
| 126 | * display a single VMA to a sequenced file | 134 | * display a single VMA to a sequenced file |
| 127 | */ | 135 | */ |
| 128 | static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | 136 | static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) |
| 129 | { | 137 | { |
| 138 | struct mm_struct *mm = vma->vm_mm; | ||
| 130 | unsigned long ino = 0; | 139 | unsigned long ino = 0; |
| 131 | struct file *file; | 140 | struct file *file; |
| 132 | dev_t dev = 0; | 141 | dev_t dev = 0; |
| @@ -155,11 +164,14 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | |||
| 155 | MAJOR(dev), MINOR(dev), ino, &len); | 164 | MAJOR(dev), MINOR(dev), ino, &len); |
| 156 | 165 | ||
| 157 | if (file) { | 166 | if (file) { |
| 158 | len = 25 + sizeof(void *) * 6 - len; | 167 | pad_len_spaces(m, len); |
| 159 | if (len < 1) | ||
| 160 | len = 1; | ||
| 161 | seq_printf(m, "%*c", len, ' '); | ||
| 162 | seq_path(m, &file->f_path, ""); | 168 | seq_path(m, &file->f_path, ""); |
| 169 | } else if (mm) { | ||
| 170 | if (vma->vm_start <= mm->start_stack && | ||
| 171 | vma->vm_end >= mm->start_stack) { | ||
| 172 | pad_len_spaces(m, len); | ||
| 173 | seq_puts(m, "[stack]"); | ||
| 174 | } | ||
| 163 | } | 175 | } |
| 164 | 176 | ||
| 165 | seq_putc(m, '\n'); | 177 | seq_putc(m, '\n'); |
diff --git a/fs/super.c b/fs/super.c index 5c35bc7a499e..938119ab8dcb 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -374,6 +374,8 @@ void sync_supers(void) | |||
| 374 | up_read(&sb->s_umount); | 374 | up_read(&sb->s_umount); |
| 375 | 375 | ||
| 376 | spin_lock(&sb_lock); | 376 | spin_lock(&sb_lock); |
| 377 | /* lock was dropped, must reset next */ | ||
| 378 | list_safe_reset_next(sb, n, s_list); | ||
| 377 | __put_super(sb); | 379 | __put_super(sb); |
| 378 | } | 380 | } |
| 379 | } | 381 | } |
| @@ -405,6 +407,8 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg) | |||
| 405 | up_read(&sb->s_umount); | 407 | up_read(&sb->s_umount); |
| 406 | 408 | ||
| 407 | spin_lock(&sb_lock); | 409 | spin_lock(&sb_lock); |
| 410 | /* lock was dropped, must reset next */ | ||
| 411 | list_safe_reset_next(sb, n, s_list); | ||
| 408 | __put_super(sb); | 412 | __put_super(sb); |
| 409 | } | 413 | } |
| 410 | spin_unlock(&sb_lock); | 414 | spin_unlock(&sb_lock); |
| @@ -585,6 +589,8 @@ static void do_emergency_remount(struct work_struct *work) | |||
| 585 | } | 589 | } |
| 586 | up_write(&sb->s_umount); | 590 | up_write(&sb->s_umount); |
| 587 | spin_lock(&sb_lock); | 591 | spin_lock(&sb_lock); |
| 592 | /* lock was dropped, must reset next */ | ||
| 593 | list_safe_reset_next(sb, n, s_list); | ||
| 588 | __put_super(sb); | 594 | __put_super(sb); |
| 589 | } | 595 | } |
| 590 | spin_unlock(&sb_lock); | 596 | spin_unlock(&sb_lock); |
diff --git a/fs/sysv/ialloc.c b/fs/sysv/ialloc.c index bbd69bdb0fa8..fcc498ec9b33 100644 --- a/fs/sysv/ialloc.c +++ b/fs/sysv/ialloc.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/stat.h> | 25 | #include <linux/stat.h> |
| 26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
| 27 | #include <linux/buffer_head.h> | 27 | #include <linux/buffer_head.h> |
| 28 | #include <linux/writeback.h> | ||
| 28 | #include "sysv.h" | 29 | #include "sysv.h" |
| 29 | 30 | ||
| 30 | /* We don't trust the value of | 31 | /* We don't trust the value of |
| @@ -139,6 +140,9 @@ struct inode * sysv_new_inode(const struct inode * dir, mode_t mode) | |||
| 139 | struct inode *inode; | 140 | struct inode *inode; |
| 140 | sysv_ino_t ino; | 141 | sysv_ino_t ino; |
| 141 | unsigned count; | 142 | unsigned count; |
| 143 | struct writeback_control wbc = { | ||
| 144 | .sync_mode = WB_SYNC_NONE | ||
| 145 | }; | ||
| 142 | 146 | ||
| 143 | inode = new_inode(sb); | 147 | inode = new_inode(sb); |
| 144 | if (!inode) | 148 | if (!inode) |
| @@ -168,7 +172,7 @@ struct inode * sysv_new_inode(const struct inode * dir, mode_t mode) | |||
| 168 | insert_inode_hash(inode); | 172 | insert_inode_hash(inode); |
| 169 | mark_inode_dirty(inode); | 173 | mark_inode_dirty(inode); |
| 170 | 174 | ||
| 171 | sysv_write_inode(inode, 0); /* ensure inode not allocated again */ | 175 | sysv_write_inode(inode, &wbc); /* ensure inode not allocated again */ |
| 172 | mark_inode_dirty(inode); /* cleared by sysv_write_inode() */ | 176 | mark_inode_dirty(inode); /* cleared by sysv_write_inode() */ |
| 173 | /* That's it. */ | 177 | /* That's it. */ |
| 174 | unlock_super(sb); | 178 | unlock_super(sb); |
diff --git a/fs/ubifs/budget.c b/fs/ubifs/budget.c index 076ca50e9933..c8ff0d1ae5d3 100644 --- a/fs/ubifs/budget.c +++ b/fs/ubifs/budget.c | |||
| @@ -62,7 +62,9 @@ | |||
| 62 | */ | 62 | */ |
| 63 | static void shrink_liability(struct ubifs_info *c, int nr_to_write) | 63 | static void shrink_liability(struct ubifs_info *c, int nr_to_write) |
| 64 | { | 64 | { |
| 65 | down_read(&c->vfs_sb->s_umount); | ||
| 65 | writeback_inodes_sb(c->vfs_sb); | 66 | writeback_inodes_sb(c->vfs_sb); |
| 67 | up_read(&c->vfs_sb->s_umount); | ||
| 66 | } | 68 | } |
| 67 | 69 | ||
| 68 | /** | 70 | /** |
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index aee5f6ce166e..9ae2889096b6 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -105,8 +105,8 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, | |||
| 105 | int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); | 105 | int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); |
| 106 | void bdi_unregister(struct backing_dev_info *bdi); | 106 | void bdi_unregister(struct backing_dev_info *bdi); |
| 107 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); | 107 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); |
| 108 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | 108 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); |
| 109 | long nr_pages); | 109 | void bdi_start_background_writeback(struct backing_dev_info *bdi); |
| 110 | int bdi_writeback_task(struct bdi_writeback *wb); | 110 | int bdi_writeback_task(struct bdi_writeback *wb); |
| 111 | int bdi_has_dirty_io(struct backing_dev_info *bdi); | 111 | int bdi_has_dirty_io(struct backing_dev_info *bdi); |
| 112 | void bdi_arm_supers_timer(void); | 112 | void bdi_arm_supers_timer(void); |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 0c621604baa1..e3d00fdb858d 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -525,13 +525,21 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state( | |||
| 525 | return cgrp->subsys[subsys_id]; | 525 | return cgrp->subsys[subsys_id]; |
| 526 | } | 526 | } |
| 527 | 527 | ||
| 528 | static inline struct cgroup_subsys_state *task_subsys_state( | 528 | /* |
| 529 | struct task_struct *task, int subsys_id) | 529 | * function to get the cgroup_subsys_state which allows for extra |
| 530 | * rcu_dereference_check() conditions, such as locks used during the | ||
| 531 | * cgroup_subsys::attach() methods. | ||
| 532 | */ | ||
| 533 | #define task_subsys_state_check(task, subsys_id, __c) \ | ||
| 534 | rcu_dereference_check(task->cgroups->subsys[subsys_id], \ | ||
| 535 | rcu_read_lock_held() || \ | ||
| 536 | lockdep_is_held(&task->alloc_lock) || \ | ||
| 537 | cgroup_lock_is_held() || (__c)) | ||
| 538 | |||
| 539 | static inline struct cgroup_subsys_state * | ||
| 540 | task_subsys_state(struct task_struct *task, int subsys_id) | ||
| 530 | { | 541 | { |
| 531 | return rcu_dereference_check(task->cgroups->subsys[subsys_id], | 542 | return task_subsys_state_check(task, subsys_id, false); |
| 532 | rcu_read_lock_held() || | ||
| 533 | lockdep_is_held(&task->alloc_lock) || | ||
| 534 | cgroup_lock_is_held()); | ||
| 535 | } | 543 | } |
| 536 | 544 | ||
| 537 | static inline struct cgroup* task_cgroup(struct task_struct *task, | 545 | static inline struct cgroup* task_cgroup(struct task_struct *task, |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 73dcf804bc94..0da5b187f124 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
| @@ -58,8 +58,12 @@ | |||
| 58 | * naked functions because then mcount is called without stack and frame pointer | 58 | * naked functions because then mcount is called without stack and frame pointer |
| 59 | * being set up and there is no chance to restore the lr register to the value | 59 | * being set up and there is no chance to restore the lr register to the value |
| 60 | * before mcount was called. | 60 | * before mcount was called. |
| 61 | * | ||
| 62 | * The asm() bodies of naked functions often depend on standard calling conventions, | ||
| 63 | * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce | ||
| 64 | * this, so we must do so ourselves. See GCC PR44290. | ||
| 61 | */ | 65 | */ |
| 62 | #define __naked __attribute__((naked)) notrace | 66 | #define __naked __attribute__((naked)) noinline __noclone notrace |
| 63 | 67 | ||
| 64 | #define __noreturn __attribute__((noreturn)) | 68 | #define __noreturn __attribute__((noreturn)) |
| 65 | 69 | ||
| @@ -85,3 +89,7 @@ | |||
| 85 | #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) | 89 | #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) |
| 86 | #define gcc_header(x) _gcc_header(x) | 90 | #define gcc_header(x) _gcc_header(x) |
| 87 | #include gcc_header(__GNUC__) | 91 | #include gcc_header(__GNUC__) |
| 92 | |||
| 93 | #if !defined(__noclone) | ||
| 94 | #define __noclone /* not needed */ | ||
| 95 | #endif | ||
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 94dea3ffbfa1..fcfa5b9a4317 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h | |||
| @@ -48,6 +48,10 @@ | |||
| 48 | * unreleased. Really, we need to have autoconf for the kernel. | 48 | * unreleased. Really, we need to have autoconf for the kernel. |
| 49 | */ | 49 | */ |
| 50 | #define unreachable() __builtin_unreachable() | 50 | #define unreachable() __builtin_unreachable() |
| 51 | |||
| 52 | /* Mark a function definition as prohibited from being cloned. */ | ||
| 53 | #define __noclone __attribute__((__noclone__)) | ||
| 54 | |||
| 51 | #endif | 55 | #endif |
| 52 | 56 | ||
| 53 | #endif | 57 | #endif |
diff --git a/include/linux/drbd.h b/include/linux/drbd.h index 30da4ae48972..b8d2516668aa 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h | |||
| @@ -53,7 +53,7 @@ | |||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | extern const char *drbd_buildtag(void); | 55 | extern const char *drbd_buildtag(void); |
| 56 | #define REL_VERSION "8.3.8rc2" | 56 | #define REL_VERSION "8.3.8" |
| 57 | #define API_VERSION 88 | 57 | #define API_VERSION 88 |
| 58 | #define PRO_VERSION_MIN 86 | 58 | #define PRO_VERSION_MIN 86 |
| 59 | #define PRO_VERSION_MAX 94 | 59 | #define PRO_VERSION_MAX 94 |
diff --git a/include/linux/list.h b/include/linux/list.h index 8392884a2977..5d57a3a1fa1b 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
| @@ -544,6 +544,21 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
| 544 | &pos->member != (head); \ | 544 | &pos->member != (head); \ |
| 545 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) | 545 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) |
| 546 | 546 | ||
| 547 | /** | ||
| 548 | * list_safe_reset_next - reset a stale list_for_each_entry_safe loop | ||
| 549 | * @pos: the loop cursor used in the list_for_each_entry_safe loop | ||
| 550 | * @n: temporary storage used in list_for_each_entry_safe | ||
| 551 | * @member: the name of the list_struct within the struct. | ||
| 552 | * | ||
| 553 | * list_safe_reset_next is not safe to use in general if the list may be | ||
| 554 | * modified concurrently (eg. the lock is dropped in the loop body). An | ||
| 555 | * exception to this is if the cursor element (pos) is pinned in the list, | ||
| 556 | * and list_safe_reset_next is called after re-taking the lock and before | ||
| 557 | * completing the current iteration of the loop body. | ||
| 558 | */ | ||
| 559 | #define list_safe_reset_next(pos, n, member) \ | ||
| 560 | n = list_entry(pos->member.next, typeof(*pos), member) | ||
| 561 | |||
| 547 | /* | 562 | /* |
| 548 | * Double linked lists with a single pointer list head. | 563 | * Double linked lists with a single pointer list head. |
| 549 | * Mostly useful for hash tables where the two pointer list head is | 564 | * Mostly useful for hash tables where the two pointer list head is |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 9a59d1f98cd4..103d1b61aacb 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | * See the file COPYING for more details. | 14 | * See the file COPYING for more details. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/errno.h> | ||
| 17 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 18 | #include <linux/rcupdate.h> | 19 | #include <linux/rcupdate.h> |
| 19 | 20 | ||
diff --git a/kernel/futex.c b/kernel/futex.c index e7a35f1039e7..6a3a5fa1526d 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -429,20 +429,11 @@ static void free_pi_state(struct futex_pi_state *pi_state) | |||
| 429 | static struct task_struct * futex_find_get_task(pid_t pid) | 429 | static struct task_struct * futex_find_get_task(pid_t pid) |
| 430 | { | 430 | { |
| 431 | struct task_struct *p; | 431 | struct task_struct *p; |
| 432 | const struct cred *cred = current_cred(), *pcred; | ||
| 433 | 432 | ||
| 434 | rcu_read_lock(); | 433 | rcu_read_lock(); |
| 435 | p = find_task_by_vpid(pid); | 434 | p = find_task_by_vpid(pid); |
| 436 | if (!p) { | 435 | if (p) |
| 437 | p = ERR_PTR(-ESRCH); | 436 | get_task_struct(p); |
| 438 | } else { | ||
| 439 | pcred = __task_cred(p); | ||
| 440 | if (cred->euid != pcred->euid && | ||
| 441 | cred->euid != pcred->uid) | ||
| 442 | p = ERR_PTR(-ESRCH); | ||
| 443 | else | ||
| 444 | get_task_struct(p); | ||
| 445 | } | ||
| 446 | 437 | ||
| 447 | rcu_read_unlock(); | 438 | rcu_read_unlock(); |
| 448 | 439 | ||
| @@ -564,8 +555,8 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, | |||
| 564 | if (!pid) | 555 | if (!pid) |
| 565 | return -ESRCH; | 556 | return -ESRCH; |
| 566 | p = futex_find_get_task(pid); | 557 | p = futex_find_get_task(pid); |
| 567 | if (IS_ERR(p)) | 558 | if (!p) |
| 568 | return PTR_ERR(p); | 559 | return -ESRCH; |
| 569 | 560 | ||
| 570 | /* | 561 | /* |
| 571 | * We need to look at the task state flags to figure out, | 562 | * We need to look at the task state flags to figure out, |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 3164ba7ce151..e1497481fe8a 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -456,6 +456,9 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 456 | /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ | 456 | /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ |
| 457 | desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); | 457 | desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); |
| 458 | desc->status |= flags; | 458 | desc->status |= flags; |
| 459 | |||
| 460 | if (chip != desc->chip) | ||
| 461 | irq_chip_set_defaults(desc->chip); | ||
| 459 | } | 462 | } |
| 460 | 463 | ||
| 461 | return ret; | 464 | return ret; |
diff --git a/kernel/kexec.c b/kernel/kexec.c index 474a84715eac..131b1703936f 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -1089,9 +1089,10 @@ void crash_kexec(struct pt_regs *regs) | |||
| 1089 | 1089 | ||
| 1090 | size_t crash_get_memory_size(void) | 1090 | size_t crash_get_memory_size(void) |
| 1091 | { | 1091 | { |
| 1092 | size_t size; | 1092 | size_t size = 0; |
| 1093 | mutex_lock(&kexec_mutex); | 1093 | mutex_lock(&kexec_mutex); |
| 1094 | size = crashk_res.end - crashk_res.start + 1; | 1094 | if (crashk_res.end != crashk_res.start) |
| 1095 | size = crashk_res.end - crashk_res.start + 1; | ||
| 1095 | mutex_unlock(&kexec_mutex); | 1096 | mutex_unlock(&kexec_mutex); |
| 1096 | return size; | 1097 | return size; |
| 1097 | } | 1098 | } |
| @@ -1134,7 +1135,7 @@ int crash_shrink_memory(unsigned long new_size) | |||
| 1134 | 1135 | ||
| 1135 | free_reserved_phys_range(end, crashk_res.end); | 1136 | free_reserved_phys_range(end, crashk_res.end); |
| 1136 | 1137 | ||
| 1137 | if (start == end) | 1138 | if ((start == end) && (crashk_res.parent != NULL)) |
| 1138 | release_resource(&crashk_res); | 1139 | release_resource(&crashk_res); |
| 1139 | crashk_res.end = end - 1; | 1140 | crashk_res.end = end - 1; |
| 1140 | 1141 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index f8b8996228dd..cb816e36cc8b 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -306,52 +306,6 @@ static int init_task_group_load = INIT_TASK_GROUP_LOAD; | |||
| 306 | */ | 306 | */ |
| 307 | struct task_group init_task_group; | 307 | struct task_group init_task_group; |
| 308 | 308 | ||
| 309 | /* return group to which a task belongs */ | ||
| 310 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 311 | { | ||
| 312 | struct task_group *tg; | ||
| 313 | |||
| 314 | #ifdef CONFIG_CGROUP_SCHED | ||
| 315 | tg = container_of(task_subsys_state(p, cpu_cgroup_subsys_id), | ||
| 316 | struct task_group, css); | ||
| 317 | #else | ||
| 318 | tg = &init_task_group; | ||
| 319 | #endif | ||
| 320 | return tg; | ||
| 321 | } | ||
| 322 | |||
| 323 | /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */ | ||
| 324 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) | ||
| 325 | { | ||
| 326 | /* | ||
| 327 | * Strictly speaking this rcu_read_lock() is not needed since the | ||
| 328 | * task_group is tied to the cgroup, which in turn can never go away | ||
| 329 | * as long as there are tasks attached to it. | ||
| 330 | * | ||
| 331 | * However since task_group() uses task_subsys_state() which is an | ||
| 332 | * rcu_dereference() user, this quiets CONFIG_PROVE_RCU. | ||
| 333 | */ | ||
| 334 | rcu_read_lock(); | ||
| 335 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 336 | p->se.cfs_rq = task_group(p)->cfs_rq[cpu]; | ||
| 337 | p->se.parent = task_group(p)->se[cpu]; | ||
| 338 | #endif | ||
| 339 | |||
| 340 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 341 | p->rt.rt_rq = task_group(p)->rt_rq[cpu]; | ||
| 342 | p->rt.parent = task_group(p)->rt_se[cpu]; | ||
| 343 | #endif | ||
| 344 | rcu_read_unlock(); | ||
| 345 | } | ||
| 346 | |||
| 347 | #else | ||
| 348 | |||
| 349 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } | ||
| 350 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 351 | { | ||
| 352 | return NULL; | ||
| 353 | } | ||
| 354 | |||
| 355 | #endif /* CONFIG_CGROUP_SCHED */ | 309 | #endif /* CONFIG_CGROUP_SCHED */ |
| 356 | 310 | ||
| 357 | /* CFS-related fields in a runqueue */ | 311 | /* CFS-related fields in a runqueue */ |
| @@ -644,6 +598,49 @@ static inline int cpu_of(struct rq *rq) | |||
| 644 | #define cpu_curr(cpu) (cpu_rq(cpu)->curr) | 598 | #define cpu_curr(cpu) (cpu_rq(cpu)->curr) |
| 645 | #define raw_rq() (&__raw_get_cpu_var(runqueues)) | 599 | #define raw_rq() (&__raw_get_cpu_var(runqueues)) |
| 646 | 600 | ||
| 601 | #ifdef CONFIG_CGROUP_SCHED | ||
| 602 | |||
| 603 | /* | ||
| 604 | * Return the group to which this tasks belongs. | ||
| 605 | * | ||
| 606 | * We use task_subsys_state_check() and extend the RCU verification | ||
| 607 | * with lockdep_is_held(&task_rq(p)->lock) because cpu_cgroup_attach() | ||
| 608 | * holds that lock for each task it moves into the cgroup. Therefore | ||
| 609 | * by holding that lock, we pin the task to the current cgroup. | ||
| 610 | */ | ||
| 611 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 612 | { | ||
| 613 | struct cgroup_subsys_state *css; | ||
| 614 | |||
| 615 | css = task_subsys_state_check(p, cpu_cgroup_subsys_id, | ||
| 616 | lockdep_is_held(&task_rq(p)->lock)); | ||
| 617 | return container_of(css, struct task_group, css); | ||
| 618 | } | ||
| 619 | |||
| 620 | /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */ | ||
| 621 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) | ||
| 622 | { | ||
| 623 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
| 624 | p->se.cfs_rq = task_group(p)->cfs_rq[cpu]; | ||
| 625 | p->se.parent = task_group(p)->se[cpu]; | ||
| 626 | #endif | ||
| 627 | |||
| 628 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 629 | p->rt.rt_rq = task_group(p)->rt_rq[cpu]; | ||
| 630 | p->rt.parent = task_group(p)->rt_se[cpu]; | ||
| 631 | #endif | ||
| 632 | } | ||
| 633 | |||
| 634 | #else /* CONFIG_CGROUP_SCHED */ | ||
| 635 | |||
| 636 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } | ||
| 637 | static inline struct task_group *task_group(struct task_struct *p) | ||
| 638 | { | ||
| 639 | return NULL; | ||
| 640 | } | ||
| 641 | |||
| 642 | #endif /* CONFIG_CGROUP_SCHED */ | ||
| 643 | |||
| 647 | inline void update_rq_clock(struct rq *rq) | 644 | inline void update_rq_clock(struct rq *rq) |
| 648 | { | 645 | { |
| 649 | if (!rq->skip_clock_update) | 646 | if (!rq->skip_clock_update) |
| @@ -1257,6 +1254,12 @@ static void sched_avg_update(struct rq *rq) | |||
| 1257 | s64 period = sched_avg_period(); | 1254 | s64 period = sched_avg_period(); |
| 1258 | 1255 | ||
| 1259 | while ((s64)(rq->clock - rq->age_stamp) > period) { | 1256 | while ((s64)(rq->clock - rq->age_stamp) > period) { |
| 1257 | /* | ||
| 1258 | * Inline assembly required to prevent the compiler | ||
| 1259 | * optimising this loop into a divmod call. | ||
| 1260 | * See __iter_div_u64_rem() for another example of this. | ||
| 1261 | */ | ||
| 1262 | asm("" : "+rm" (rq->age_stamp)); | ||
| 1260 | rq->age_stamp += period; | 1263 | rq->age_stamp += period; |
| 1261 | rq->rt_avg /= 2; | 1264 | rq->rt_avg /= 2; |
| 1262 | } | 1265 | } |
| @@ -1660,9 +1663,6 @@ static void update_shares(struct sched_domain *sd) | |||
| 1660 | 1663 | ||
| 1661 | static void update_h_load(long cpu) | 1664 | static void update_h_load(long cpu) |
| 1662 | { | 1665 | { |
| 1663 | if (root_task_group_empty()) | ||
| 1664 | return; | ||
| 1665 | |||
| 1666 | walk_tg_tree(tg_load_down, tg_nop, (void *)cpu); | 1666 | walk_tg_tree(tg_load_down, tg_nop, (void *)cpu); |
| 1667 | } | 1667 | } |
| 1668 | 1668 | ||
| @@ -2494,7 +2494,16 @@ void sched_fork(struct task_struct *p, int clone_flags) | |||
| 2494 | if (p->sched_class->task_fork) | 2494 | if (p->sched_class->task_fork) |
| 2495 | p->sched_class->task_fork(p); | 2495 | p->sched_class->task_fork(p); |
| 2496 | 2496 | ||
| 2497 | /* | ||
| 2498 | * The child is not yet in the pid-hash so no cgroup attach races, | ||
| 2499 | * and the cgroup is pinned to this child due to cgroup_fork() | ||
| 2500 | * is ran before sched_fork(). | ||
| 2501 | * | ||
| 2502 | * Silence PROVE_RCU. | ||
| 2503 | */ | ||
| 2504 | rcu_read_lock(); | ||
| 2497 | set_task_cpu(p, cpu); | 2505 | set_task_cpu(p, cpu); |
| 2506 | rcu_read_unlock(); | ||
| 2498 | 2507 | ||
| 2499 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) | 2508 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) |
| 2500 | if (likely(sched_info_on())) | 2509 | if (likely(sched_info_on())) |
| @@ -4465,16 +4474,6 @@ recheck: | |||
| 4465 | } | 4474 | } |
| 4466 | 4475 | ||
| 4467 | if (user) { | 4476 | if (user) { |
| 4468 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 4469 | /* | ||
| 4470 | * Do not allow realtime tasks into groups that have no runtime | ||
| 4471 | * assigned. | ||
| 4472 | */ | ||
| 4473 | if (rt_bandwidth_enabled() && rt_policy(policy) && | ||
| 4474 | task_group(p)->rt_bandwidth.rt_runtime == 0) | ||
| 4475 | return -EPERM; | ||
| 4476 | #endif | ||
| 4477 | |||
| 4478 | retval = security_task_setscheduler(p, policy, param); | 4477 | retval = security_task_setscheduler(p, policy, param); |
| 4479 | if (retval) | 4478 | if (retval) |
| 4480 | return retval; | 4479 | return retval; |
| @@ -4490,6 +4489,22 @@ recheck: | |||
| 4490 | * runqueue lock must be held. | 4489 | * runqueue lock must be held. |
| 4491 | */ | 4490 | */ |
| 4492 | rq = __task_rq_lock(p); | 4491 | rq = __task_rq_lock(p); |
| 4492 | |||
| 4493 | #ifdef CONFIG_RT_GROUP_SCHED | ||
| 4494 | if (user) { | ||
| 4495 | /* | ||
| 4496 | * Do not allow realtime tasks into groups that have no runtime | ||
| 4497 | * assigned. | ||
| 4498 | */ | ||
| 4499 | if (rt_bandwidth_enabled() && rt_policy(policy) && | ||
| 4500 | task_group(p)->rt_bandwidth.rt_runtime == 0) { | ||
| 4501 | __task_rq_unlock(rq); | ||
| 4502 | raw_spin_unlock_irqrestore(&p->pi_lock, flags); | ||
| 4503 | return -EPERM; | ||
| 4504 | } | ||
| 4505 | } | ||
| 4506 | #endif | ||
| 4507 | |||
| 4493 | /* recheck policy now with rq lock held */ | 4508 | /* recheck policy now with rq lock held */ |
| 4494 | if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { | 4509 | if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { |
| 4495 | policy = oldpolicy = -1; | 4510 | policy = oldpolicy = -1; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index eed35eded602..a878b5332daa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -1240,6 +1240,7 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | |||
| 1240 | * effect of the currently running task from the load | 1240 | * effect of the currently running task from the load |
| 1241 | * of the current CPU: | 1241 | * of the current CPU: |
| 1242 | */ | 1242 | */ |
| 1243 | rcu_read_lock(); | ||
| 1243 | if (sync) { | 1244 | if (sync) { |
| 1244 | tg = task_group(current); | 1245 | tg = task_group(current); |
| 1245 | weight = current->se.load.weight; | 1246 | weight = current->se.load.weight; |
| @@ -1275,6 +1276,7 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync) | |||
| 1275 | balanced = this_eff_load <= prev_eff_load; | 1276 | balanced = this_eff_load <= prev_eff_load; |
| 1276 | } else | 1277 | } else |
| 1277 | balanced = true; | 1278 | balanced = true; |
| 1279 | rcu_read_unlock(); | ||
| 1278 | 1280 | ||
| 1279 | /* | 1281 | /* |
| 1280 | * If the currently running task will sleep within | 1282 | * If the currently running task will sleep within |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 1d7b9bc1c034..783fbadf2202 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -315,9 +315,6 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 315 | goto end; | 315 | goto end; |
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | if (nohz_ratelimit(cpu)) | ||
| 319 | goto end; | ||
| 320 | |||
| 321 | ts->idle_calls++; | 318 | ts->idle_calls++; |
| 322 | /* Read jiffies and the time when jiffies were updated last */ | 319 | /* Read jiffies and the time when jiffies were updated last */ |
| 323 | do { | 320 | do { |
| @@ -328,7 +325,7 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 328 | } while (read_seqretry(&xtime_lock, seq)); | 325 | } while (read_seqretry(&xtime_lock, seq)); |
| 329 | 326 | ||
| 330 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || | 327 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || |
| 331 | arch_needs_cpu(cpu)) { | 328 | arch_needs_cpu(cpu) || nohz_ratelimit(cpu)) { |
| 332 | next_jiffies = last_jiffies + 1; | 329 | next_jiffies = last_jiffies + 1; |
| 333 | delta_jiffies = 1; | 330 | delta_jiffies = 1; |
| 334 | } else { | 331 | } else { |
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index e6f65887842c..8a2b73f7c068 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c | |||
| @@ -96,7 +96,9 @@ int perf_trace_init(struct perf_event *p_event) | |||
| 96 | mutex_lock(&event_mutex); | 96 | mutex_lock(&event_mutex); |
| 97 | list_for_each_entry(tp_event, &ftrace_events, list) { | 97 | list_for_each_entry(tp_event, &ftrace_events, list) { |
| 98 | if (tp_event->event.type == event_id && | 98 | if (tp_event->event.type == event_id && |
| 99 | tp_event->class && tp_event->class->perf_probe && | 99 | tp_event->class && |
| 100 | (tp_event->class->perf_probe || | ||
| 101 | tp_event->class->reg) && | ||
| 100 | try_module_get(tp_event->mod)) { | 102 | try_module_get(tp_event->mod)) { |
| 101 | ret = perf_trace_event_init(tp_event, p_event); | 103 | ret = perf_trace_event_init(tp_event, p_event); |
| 102 | break; | 104 | break; |
diff --git a/lib/genalloc.c b/lib/genalloc.c index 736c3b06398e..1923f1490e72 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c | |||
| @@ -128,7 +128,6 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) | |||
| 128 | chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); | 128 | chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); |
| 129 | 129 | ||
| 130 | end_bit = (chunk->end_addr - chunk->start_addr) >> order; | 130 | end_bit = (chunk->end_addr - chunk->start_addr) >> order; |
| 131 | end_bit -= nbits + 1; | ||
| 132 | 131 | ||
| 133 | spin_lock_irqsave(&chunk->lock, flags); | 132 | spin_lock_irqsave(&chunk->lock, flags); |
| 134 | start_bit = bitmap_find_next_zero_area(chunk->bits, end_bit, 0, | 133 | start_bit = bitmap_find_next_zero_area(chunk->bits, end_bit, 0, |
| @@ -602,7 +602,7 @@ void *idr_get_next(struct idr *idp, int *nextidp) | |||
| 602 | /* find first ent */ | 602 | /* find first ent */ |
| 603 | n = idp->layers * IDR_BITS; | 603 | n = idp->layers * IDR_BITS; |
| 604 | max = 1 << n; | 604 | max = 1 << n; |
| 605 | p = rcu_dereference(idp->top); | 605 | p = rcu_dereference_raw(idp->top); |
| 606 | if (!p) | 606 | if (!p) |
| 607 | return NULL; | 607 | return NULL; |
| 608 | 608 | ||
| @@ -610,7 +610,7 @@ void *idr_get_next(struct idr *idp, int *nextidp) | |||
| 610 | while (n > 0 && p) { | 610 | while (n > 0 && p) { |
| 611 | n -= IDR_BITS; | 611 | n -= IDR_BITS; |
| 612 | *paa++ = p; | 612 | *paa++ = p; |
| 613 | p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]); | 613 | p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]); |
| 614 | } | 614 | } |
| 615 | 615 | ||
| 616 | if (p) { | 616 | if (p) { |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c6ece0a57595..20a8193a7af8 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -1370,7 +1370,7 @@ static void memcg_wakeup_oom(struct mem_cgroup *mem) | |||
| 1370 | 1370 | ||
| 1371 | static void memcg_oom_recover(struct mem_cgroup *mem) | 1371 | static void memcg_oom_recover(struct mem_cgroup *mem) |
| 1372 | { | 1372 | { |
| 1373 | if (mem->oom_kill_disable && atomic_read(&mem->oom_lock)) | 1373 | if (atomic_read(&mem->oom_lock)) |
| 1374 | memcg_wakeup_oom(mem); | 1374 | memcg_wakeup_oom(mem); |
| 1375 | } | 1375 | } |
| 1376 | 1376 | ||
| @@ -3781,6 +3781,8 @@ static int mem_cgroup_oom_control_write(struct cgroup *cgrp, | |||
| 3781 | return -EINVAL; | 3781 | return -EINVAL; |
| 3782 | } | 3782 | } |
| 3783 | mem->oom_kill_disable = val; | 3783 | mem->oom_kill_disable = val; |
| 3784 | if (!val) | ||
| 3785 | memcg_oom_recover(mem); | ||
| 3784 | cgroup_unlock(); | 3786 | cgroup_unlock(); |
| 3785 | return 0; | 3787 | return 0; |
| 3786 | } | 3788 | } |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 5d6fb339de03..5bc0a96beb51 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -2094,7 +2094,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 2094 | NODEMASK_SCRATCH(scratch); | 2094 | NODEMASK_SCRATCH(scratch); |
| 2095 | 2095 | ||
| 2096 | if (!scratch) | 2096 | if (!scratch) |
| 2097 | return; | 2097 | goto put_mpol; |
| 2098 | /* contextualize the tmpfs mount point mempolicy */ | 2098 | /* contextualize the tmpfs mount point mempolicy */ |
| 2099 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); | 2099 | new = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); |
| 2100 | if (IS_ERR(new)) | 2100 | if (IS_ERR(new)) |
| @@ -2103,19 +2103,20 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | |||
| 2103 | task_lock(current); | 2103 | task_lock(current); |
| 2104 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); | 2104 | ret = mpol_set_nodemask(new, &mpol->w.user_nodemask, scratch); |
| 2105 | task_unlock(current); | 2105 | task_unlock(current); |
| 2106 | mpol_put(mpol); /* drop our ref on sb mpol */ | ||
| 2107 | if (ret) | 2106 | if (ret) |
| 2108 | goto put_free; | 2107 | goto put_new; |
| 2109 | 2108 | ||
| 2110 | /* Create pseudo-vma that contains just the policy */ | 2109 | /* Create pseudo-vma that contains just the policy */ |
| 2111 | memset(&pvma, 0, sizeof(struct vm_area_struct)); | 2110 | memset(&pvma, 0, sizeof(struct vm_area_struct)); |
| 2112 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ | 2111 | pvma.vm_end = TASK_SIZE; /* policy covers entire file */ |
| 2113 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ | 2112 | mpol_set_shared_policy(sp, &pvma, new); /* adds ref */ |
| 2114 | 2113 | ||
| 2115 | put_free: | 2114 | put_new: |
| 2116 | mpol_put(new); /* drop initial ref */ | 2115 | mpol_put(new); /* drop initial ref */ |
| 2117 | free_scratch: | 2116 | free_scratch: |
| 2118 | NODEMASK_SCRATCH_FREE(scratch); | 2117 | NODEMASK_SCRATCH_FREE(scratch); |
| 2118 | put_mpol: | ||
| 2119 | mpol_put(mpol); /* drop our incoming ref on sb mpol */ | ||
| 2119 | } | 2120 | } |
| 2120 | } | 2121 | } |
| 2121 | 2122 | ||
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index bbd396ac9546..54f28bd493d3 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
| @@ -597,7 +597,7 @@ static void balance_dirty_pages(struct address_space *mapping, | |||
| 597 | (!laptop_mode && ((global_page_state(NR_FILE_DIRTY) | 597 | (!laptop_mode && ((global_page_state(NR_FILE_DIRTY) |
| 598 | + global_page_state(NR_UNSTABLE_NFS)) | 598 | + global_page_state(NR_UNSTABLE_NFS)) |
| 599 | > background_thresh))) | 599 | > background_thresh))) |
| 600 | bdi_start_writeback(bdi, NULL, 0); | 600 | bdi_start_background_writeback(bdi); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | void set_page_dirty_balance(struct page *page, int page_mkwrite) | 603 | void set_page_dirty_balance(struct page *page, int page_mkwrite) |
| @@ -705,9 +705,8 @@ void laptop_mode_timer_fn(unsigned long data) | |||
| 705 | * We want to write everything out, not just down to the dirty | 705 | * We want to write everything out, not just down to the dirty |
| 706 | * threshold | 706 | * threshold |
| 707 | */ | 707 | */ |
| 708 | |||
| 709 | if (bdi_has_dirty_io(&q->backing_dev_info)) | 708 | if (bdi_has_dirty_io(&q->backing_dev_info)) |
| 710 | bdi_start_writeback(&q->backing_dev_info, NULL, nr_pages); | 709 | bdi_start_writeback(&q->backing_dev_info, nr_pages); |
| 711 | } | 710 | } |
| 712 | 711 | ||
| 713 | /* | 712 | /* |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index dc3435e18bde..711745f56bba 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -193,7 +193,7 @@ static void sig_handler(int sig) | |||
| 193 | 193 | ||
| 194 | static void sig_atexit(void) | 194 | static void sig_atexit(void) |
| 195 | { | 195 | { |
| 196 | if (child_pid != -1) | 196 | if (child_pid > 0) |
| 197 | kill(child_pid, SIGTERM); | 197 | kill(child_pid, SIGTERM); |
| 198 | 198 | ||
| 199 | if (signr == -1) | 199 | if (signr == -1) |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1f08f008d289..2fbf6a463c81 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -538,8 +538,10 @@ int event__process_task(event_t *self, struct perf_session *session) | |||
| 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, | 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, |
| 539 | self->fork.ppid, self->fork.ptid); | 539 | self->fork.ppid, self->fork.ptid); |
| 540 | 540 | ||
| 541 | if (self->header.type == PERF_RECORD_EXIT) | 541 | if (self->header.type == PERF_RECORD_EXIT) { |
| 542 | perf_session__remove_thread(session, thread); | ||
| 542 | return 0; | 543 | return 0; |
| 544 | } | ||
| 543 | 545 | ||
| 544 | if (thread == NULL || parent == NULL || | 546 | if (thread == NULL || parent == NULL || |
| 545 | thread__fork(thread, parent) < 0) { | 547 | thread__fork(thread, parent) < 0) { |
diff --git a/tools/perf/util/newt.c b/tools/perf/util/newt.c index cf182ca132fe..7537ca15900b 100644 --- a/tools/perf/util/newt.c +++ b/tools/perf/util/newt.c | |||
| @@ -43,6 +43,9 @@ struct ui_progress *ui_progress__new(const char *title, u64 total) | |||
| 43 | 43 | ||
| 44 | if (self != NULL) { | 44 | if (self != NULL) { |
| 45 | int cols; | 45 | int cols; |
| 46 | |||
| 47 | if (use_browser <= 0) | ||
| 48 | return self; | ||
| 46 | newtGetScreenSize(&cols, NULL); | 49 | newtGetScreenSize(&cols, NULL); |
| 47 | cols -= 4; | 50 | cols -= 4; |
| 48 | newtCenteredWindow(cols, 1, title); | 51 | newtCenteredWindow(cols, 1, title); |
| @@ -67,14 +70,22 @@ out_free_self: | |||
| 67 | 70 | ||
| 68 | void ui_progress__update(struct ui_progress *self, u64 curr) | 71 | void ui_progress__update(struct ui_progress *self, u64 curr) |
| 69 | { | 72 | { |
| 73 | /* | ||
| 74 | * FIXME: We should have a per UI backend way of showing progress, | ||
| 75 | * stdio will just show a percentage as NN%, etc. | ||
| 76 | */ | ||
| 77 | if (use_browser <= 0) | ||
| 78 | return; | ||
| 70 | newtScaleSet(self->scale, curr); | 79 | newtScaleSet(self->scale, curr); |
| 71 | newtRefresh(); | 80 | newtRefresh(); |
| 72 | } | 81 | } |
| 73 | 82 | ||
| 74 | void ui_progress__delete(struct ui_progress *self) | 83 | void ui_progress__delete(struct ui_progress *self) |
| 75 | { | 84 | { |
| 76 | newtFormDestroy(self->form); | 85 | if (use_browser > 0) { |
| 77 | newtPopWindow(); | 86 | newtFormDestroy(self->form); |
| 87 | newtPopWindow(); | ||
| 88 | } | ||
| 78 | free(self); | 89 | free(self); |
| 79 | } | 90 | } |
| 80 | 91 | ||
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 8f83a1835766..c422cd676313 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -90,6 +90,7 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc | |||
| 90 | 90 | ||
| 91 | memcpy(self->filename, filename, len); | 91 | memcpy(self->filename, filename, len); |
| 92 | self->threads = RB_ROOT; | 92 | self->threads = RB_ROOT; |
| 93 | INIT_LIST_HEAD(&self->dead_threads); | ||
| 93 | self->hists_tree = RB_ROOT; | 94 | self->hists_tree = RB_ROOT; |
| 94 | self->last_match = NULL; | 95 | self->last_match = NULL; |
| 95 | self->mmap_window = 32; | 96 | self->mmap_window = 32; |
| @@ -131,6 +132,16 @@ void perf_session__delete(struct perf_session *self) | |||
| 131 | free(self); | 132 | free(self); |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 135 | void perf_session__remove_thread(struct perf_session *self, struct thread *th) | ||
| 136 | { | ||
| 137 | rb_erase(&th->rb_node, &self->threads); | ||
| 138 | /* | ||
| 139 | * We may have references to this thread, for instance in some hist_entry | ||
| 140 | * instances, so just move them to a separate list. | ||
| 141 | */ | ||
| 142 | list_add_tail(&th->node, &self->dead_threads); | ||
| 143 | } | ||
| 144 | |||
| 134 | static bool symbol__match_parent_regex(struct symbol *sym) | 145 | static bool symbol__match_parent_regex(struct symbol *sym) |
| 135 | { | 146 | { |
| 136 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) | 147 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 55c6881b218d..9fa0fc2a863f 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
| @@ -26,6 +26,7 @@ struct perf_session { | |||
| 26 | unsigned long size; | 26 | unsigned long size; |
| 27 | unsigned long mmap_window; | 27 | unsigned long mmap_window; |
| 28 | struct rb_root threads; | 28 | struct rb_root threads; |
| 29 | struct list_head dead_threads; | ||
| 29 | struct thread *last_match; | 30 | struct thread *last_match; |
| 30 | struct machine host_machine; | 31 | struct machine host_machine; |
| 31 | struct rb_root machines; | 32 | struct rb_root machines; |
| @@ -99,6 +100,7 @@ int perf_session__create_kernel_maps(struct perf_session *self); | |||
| 99 | 100 | ||
| 100 | int do_read(int fd, void *buf, size_t size); | 101 | int do_read(int fd, void *buf, size_t size); |
| 101 | void perf_session__update_sample_type(struct perf_session *self); | 102 | void perf_session__update_sample_type(struct perf_session *self); |
| 103 | void perf_session__remove_thread(struct perf_session *self, struct thread *th); | ||
| 102 | 104 | ||
| 103 | static inline | 105 | static inline |
| 104 | struct machine *perf_session__find_host_machine(struct perf_session *self) | 106 | struct machine *perf_session__find_host_machine(struct perf_session *self) |
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 1dfd9ff8bdcd..ee6bbcf277ca 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h | |||
| @@ -6,7 +6,10 @@ | |||
| 6 | #include "symbol.h" | 6 | #include "symbol.h" |
| 7 | 7 | ||
| 8 | struct thread { | 8 | struct thread { |
| 9 | struct rb_node rb_node; | 9 | union { |
| 10 | struct rb_node rb_node; | ||
| 11 | struct list_head node; | ||
| 12 | }; | ||
| 10 | struct map_groups mg; | 13 | struct map_groups mg; |
| 11 | pid_t pid; | 14 | pid_t pid; |
| 12 | char shortname[3]; | 15 | char shortname[3]; |
