diff options
368 files changed, 4160 insertions, 2135 deletions
diff --git a/Documentation/ABI/testing/ima_policy b/Documentation/ABI/testing/ima_policy index 6434f0df012e..6cd6daefaaed 100644 --- a/Documentation/ABI/testing/ima_policy +++ b/Documentation/ABI/testing/ima_policy | |||
| @@ -20,7 +20,7 @@ Description: | |||
| 20 | lsm: [[subj_user=] [subj_role=] [subj_type=] | 20 | lsm: [[subj_user=] [subj_role=] [subj_type=] |
| 21 | [obj_user=] [obj_role=] [obj_type=]] | 21 | [obj_user=] [obj_role=] [obj_type=]] |
| 22 | 22 | ||
| 23 | base: func:= [BPRM_CHECK][FILE_MMAP][INODE_PERMISSION] | 23 | base: func:= [BPRM_CHECK][FILE_MMAP][FILE_CHECK] |
| 24 | mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC] | 24 | mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC] |
| 25 | fsmagic:= hex value | 25 | fsmagic:= hex value |
| 26 | uid:= decimal value | 26 | uid:= decimal value |
| @@ -40,11 +40,11 @@ Description: | |||
| 40 | 40 | ||
| 41 | measure func=BPRM_CHECK | 41 | measure func=BPRM_CHECK |
| 42 | measure func=FILE_MMAP mask=MAY_EXEC | 42 | measure func=FILE_MMAP mask=MAY_EXEC |
| 43 | measure func=INODE_PERM mask=MAY_READ uid=0 | 43 | measure func=FILE_CHECK mask=MAY_READ uid=0 |
| 44 | 44 | ||
| 45 | The default policy measures all executables in bprm_check, | 45 | The default policy measures all executables in bprm_check, |
| 46 | all files mmapped executable in file_mmap, and all files | 46 | all files mmapped executable in file_mmap, and all files |
| 47 | open for read by root in inode_permission. | 47 | open for read by root in do_filp_open. |
| 48 | 48 | ||
| 49 | Examples of LSM specific definitions: | 49 | Examples of LSM specific definitions: |
| 50 | 50 | ||
| @@ -54,8 +54,8 @@ Description: | |||
| 54 | 54 | ||
| 55 | dont_measure obj_type=var_log_t | 55 | dont_measure obj_type=var_log_t |
| 56 | dont_measure obj_type=auditd_log_t | 56 | dont_measure obj_type=auditd_log_t |
| 57 | measure subj_user=system_u func=INODE_PERM mask=MAY_READ | 57 | measure subj_user=system_u func=FILE_CHECK mask=MAY_READ |
| 58 | measure subj_role=system_r func=INODE_PERM mask=MAY_READ | 58 | measure subj_role=system_r func=FILE_CHECK mask=MAY_READ |
| 59 | 59 | ||
| 60 | Smack: | 60 | Smack: |
| 61 | measure subj_user=_ func=INODE_PERM mask=MAY_READ | 61 | measure subj_user=_ func=FILE_CHECK mask=MAY_READ |
diff --git a/Documentation/cpu-freq/governors.txt b/Documentation/cpu-freq/governors.txt index aed082f49d09..737988fca64d 100644 --- a/Documentation/cpu-freq/governors.txt +++ b/Documentation/cpu-freq/governors.txt | |||
| @@ -145,8 +145,8 @@ show_sampling_rate_max: THIS INTERFACE IS DEPRECATED, DON'T USE IT. | |||
| 145 | up_threshold: defines what the average CPU usage between the samplings | 145 | up_threshold: defines what the average CPU usage between the samplings |
| 146 | of 'sampling_rate' needs to be for the kernel to make a decision on | 146 | of 'sampling_rate' needs to be for the kernel to make a decision on |
| 147 | whether it should increase the frequency. For example when it is set | 147 | whether it should increase the frequency. For example when it is set |
| 148 | to its default value of '80' it means that between the checking | 148 | to its default value of '95' it means that between the checking |
| 149 | intervals the CPU needs to be on average more than 80% in use to then | 149 | intervals the CPU needs to be on average more than 95% in use to then |
| 150 | decide that the CPU frequency needs to be increased. | 150 | decide that the CPU frequency needs to be increased. |
| 151 | 151 | ||
| 152 | ignore_nice_load: this parameter takes a value of '0' or '1'. When | 152 | ignore_nice_load: this parameter takes a value of '0' or '1'. When |
diff --git a/Documentation/fault-injection/fault-injection.txt b/Documentation/fault-injection/fault-injection.txt index 079305640790..7be15e44d481 100644 --- a/Documentation/fault-injection/fault-injection.txt +++ b/Documentation/fault-injection/fault-injection.txt | |||
| @@ -143,8 +143,8 @@ o provide a way to configure fault attributes | |||
| 143 | failslab, fail_page_alloc, and fail_make_request use this way. | 143 | failslab, fail_page_alloc, and fail_make_request use this way. |
| 144 | Helper functions: | 144 | Helper functions: |
| 145 | 145 | ||
| 146 | init_fault_attr_entries(entries, attr, name); | 146 | init_fault_attr_dentries(entries, attr, name); |
| 147 | void cleanup_fault_attr_entries(entries); | 147 | void cleanup_fault_attr_dentries(entries); |
| 148 | 148 | ||
| 149 | - module parameters | 149 | - module parameters |
| 150 | 150 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 03f38c18f323..412eff60c33d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3411,8 +3411,10 @@ S: Maintained | |||
| 3411 | F: drivers/scsi/sym53c8xx_2/ | 3411 | F: drivers/scsi/sym53c8xx_2/ |
| 3412 | 3412 | ||
| 3413 | LTP (Linux Test Project) | 3413 | LTP (Linux Test Project) |
| 3414 | M: Subrata Modak <subrata@linux.vnet.ibm.com> | 3414 | M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com> |
| 3415 | M: Mike Frysinger <vapier@gentoo.org> | 3415 | M: Garrett Cooper <yanegomi@gmail.com> |
| 3416 | M: Mike Frysinger <vapier@gentoo.org> | ||
| 3417 | M: Subrata Modak <subrata@linux.vnet.ibm.com> | ||
| 3416 | L: ltp-list@lists.sourceforge.net (subscribers-only) | 3418 | L: ltp-list@lists.sourceforge.net (subscribers-only) |
| 3417 | W: http://ltp.sourceforge.net/ | 3419 | W: http://ltp.sourceforge.net/ |
| 3418 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git | 3420 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git |
| @@ -3836,6 +3838,7 @@ NETWORKING DRIVERS | |||
| 3836 | L: netdev@vger.kernel.org | 3838 | L: netdev@vger.kernel.org |
| 3837 | W: http://www.linuxfoundation.org/en/Net | 3839 | W: http://www.linuxfoundation.org/en/Net |
| 3838 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git | 3840 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git |
| 3841 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git | ||
| 3839 | S: Odd Fixes | 3842 | S: Odd Fixes |
| 3840 | F: drivers/net/ | 3843 | F: drivers/net/ |
| 3841 | F: include/linux/if_* | 3844 | F: include/linux/if_* |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 33 | 3 | SUBLEVEL = 33 |
| 4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc8 |
| 5 | NAME = Man-Eating Seals of Antiquity | 5 | NAME = Man-Eating Seals of Antiquity |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4c33ca82f9b1..184a6bd54825 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -702,6 +702,7 @@ config ARCH_OMAP | |||
| 702 | select ARCH_HAS_CPUFREQ | 702 | select ARCH_HAS_CPUFREQ |
| 703 | select GENERIC_TIME | 703 | select GENERIC_TIME |
| 704 | select GENERIC_CLOCKEVENTS | 704 | select GENERIC_CLOCKEVENTS |
| 705 | select ARCH_HAS_HOLES_MEMORYMODEL | ||
| 705 | help | 706 | help |
| 706 | Support for TI's OMAP platform (OMAP1 and OMAP2). | 707 | Support for TI's OMAP platform (OMAP1 and OMAP2). |
| 707 | 708 | ||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 9e7582572741..356d702c0808 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -94,7 +94,7 @@ CFLAGS_ABI +=-funwind-tables | |||
| 94 | endif | 94 | endif |
| 95 | 95 | ||
| 96 | ifeq ($(CONFIG_THUMB2_KERNEL),y) | 96 | ifeq ($(CONFIG_THUMB2_KERNEL),y) |
| 97 | AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=thumb,-Wa$(comma)-mauto-it) | 97 | AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it) |
| 98 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) | 98 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) |
| 99 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) | 99 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) |
| 100 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb | 100 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb |
diff --git a/arch/arm/mach-mx25/clock.c b/arch/arm/mach-mx25/clock.c index 6e838b857712..6acc88bcdc40 100644 --- a/arch/arm/mach-mx25/clock.c +++ b/arch/arm/mach-mx25/clock.c | |||
| @@ -119,6 +119,11 @@ static unsigned long get_rate_nfc(struct clk *clk) | |||
| 119 | return get_rate_per(8); | 119 | return get_rate_per(8); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | static unsigned long get_rate_gpt(struct clk *clk) | ||
| 123 | { | ||
| 124 | return get_rate_per(5); | ||
| 125 | } | ||
| 126 | |||
| 122 | static unsigned long get_rate_otg(struct clk *clk) | 127 | static unsigned long get_rate_otg(struct clk *clk) |
| 123 | { | 128 | { |
| 124 | return 48000000; /* FIXME */ | 129 | return 48000000; /* FIXME */ |
| @@ -144,7 +149,7 @@ static void clk_cgcr_disable(struct clk *clk) | |||
| 144 | __raw_writel(reg, clk->enable_reg); | 149 | __raw_writel(reg, clk->enable_reg); |
| 145 | } | 150 | } |
| 146 | 151 | ||
| 147 | #define DEFINE_CLOCK(name, i, er, es, gr, sr) \ | 152 | #define DEFINE_CLOCK(name, i, er, es, gr, sr, s) \ |
| 148 | static struct clk name = { \ | 153 | static struct clk name = { \ |
| 149 | .id = i, \ | 154 | .id = i, \ |
| 150 | .enable_reg = CRM_BASE + er, \ | 155 | .enable_reg = CRM_BASE + er, \ |
| @@ -153,27 +158,30 @@ static void clk_cgcr_disable(struct clk *clk) | |||
| 153 | .set_rate = sr, \ | 158 | .set_rate = sr, \ |
| 154 | .enable = clk_cgcr_enable, \ | 159 | .enable = clk_cgcr_enable, \ |
| 155 | .disable = clk_cgcr_disable, \ | 160 | .disable = clk_cgcr_disable, \ |
| 161 | .secondary = s, \ | ||
| 156 | } | 162 | } |
| 157 | 163 | ||
| 158 | DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_ipg, NULL); | 164 | DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_gpt, NULL, NULL); |
| 159 | DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL); | 165 | DEFINE_CLOCK(uart_per_clk, 0, CCM_CGCR0, 15, get_rate_uart, NULL, NULL); |
| 160 | DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL); | 166 | DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL, NULL); |
| 161 | DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL); | 167 | DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL, NULL); |
| 162 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL); | 168 | DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL, NULL); |
| 163 | DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL); | 169 | DEFINE_CLOCK(fec_ahb_clk, 0, CCM_CGCR0, 23, NULL, NULL, NULL); |
| 164 | DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL); | 170 | DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL, &uart_per_clk); |
| 165 | DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL); | 171 | DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL, &uart_per_clk); |
| 166 | DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL); | 172 | DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL, &uart_per_clk); |
| 167 | DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL); | 173 | DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL, &uart_per_clk); |
| 168 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL); | 174 | DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL, &uart_per_clk); |
| 169 | DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL); | 175 | DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL, NULL); |
| 170 | DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL); | 176 | DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL, NULL); |
| 171 | DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL); | 177 | DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL, NULL); |
| 172 | DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL); | 178 | DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL, NULL); |
| 173 | DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL); | 179 | DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL, NULL); |
| 174 | DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL); | 180 | DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL, NULL); |
| 175 | DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL); | 181 | DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL, NULL); |
| 176 | DEFINE_CLOCK(fec_clk, 0, CCM_CGCR0, 23, get_rate_ipg, NULL); | 182 | DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL, NULL); |
| 183 | DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL, NULL); | ||
| 184 | DEFINE_CLOCK(fec_clk, 0, CCM_CGCR1, 15, get_rate_ipg, NULL, &fec_ahb_clk); | ||
| 177 | 185 | ||
| 178 | #define _REGISTER_CLOCK(d, n, c) \ | 186 | #define _REGISTER_CLOCK(d, n, c) \ |
| 179 | { \ | 187 | { \ |
| @@ -208,13 +216,21 @@ static struct clk_lookup lookups[] = { | |||
| 208 | _REGISTER_CLOCK("fec.0", NULL, fec_clk) | 216 | _REGISTER_CLOCK("fec.0", NULL, fec_clk) |
| 209 | }; | 217 | }; |
| 210 | 218 | ||
| 211 | int __init mx25_clocks_init(unsigned long fref) | 219 | int __init mx25_clocks_init(void) |
| 212 | { | 220 | { |
| 213 | int i; | 221 | int i; |
| 214 | 222 | ||
| 215 | for (i = 0; i < ARRAY_SIZE(lookups); i++) | 223 | for (i = 0; i < ARRAY_SIZE(lookups); i++) |
| 216 | clkdev_add(&lookups[i]); | 224 | clkdev_add(&lookups[i]); |
| 217 | 225 | ||
| 226 | /* Turn off all clocks except the ones we need to survive, namely: | ||
| 227 | * EMI, GPIO1-3 (CCM_CGCR1[18:16]), GPT1, IOMUXC (CCM_CGCR1[27]), IIM, | ||
| 228 | * SCC | ||
| 229 | */ | ||
| 230 | __raw_writel((1 << 19), CRM_BASE + CCM_CGCR0); | ||
| 231 | __raw_writel((0xf << 16) | (3 << 26), CRM_BASE + CCM_CGCR1); | ||
| 232 | __raw_writel((1 << 5), CRM_BASE + CCM_CGCR2); | ||
| 233 | |||
| 218 | mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); | 234 | mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); |
| 219 | 235 | ||
| 220 | return 0; | 236 | return 0; |
diff --git a/arch/arm/mach-mx25/mx25pdk.c b/arch/arm/mach-mx25/mx25pdk.c index 921bc99ea231..6f06089246eb 100644 --- a/arch/arm/mach-mx25/mx25pdk.c +++ b/arch/arm/mach-mx25/mx25pdk.c | |||
| @@ -91,7 +91,7 @@ static void __init mx25pdk_init(void) | |||
| 91 | 91 | ||
| 92 | static void __init mx25pdk_timer_init(void) | 92 | static void __init mx25pdk_timer_init(void) |
| 93 | { | 93 | { |
| 94 | mx25_clocks_init(26000000); | 94 | mx25_clocks_init(); |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | static struct sys_timer mx25pdk_timer = { | 97 | static struct sys_timer mx25pdk_timer = { |
diff --git a/arch/arm/mach-mx3/mx31ads.c b/arch/arm/mach-mx3/mx31ads.c index 3e7bafa2ddbb..938c549767dc 100644 --- a/arch/arm/mach-mx3/mx31ads.c +++ b/arch/arm/mach-mx3/mx31ads.c | |||
| @@ -173,6 +173,7 @@ static void expio_unmask_irq(u32 irq) | |||
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | static struct irq_chip expio_irq_chip = { | 175 | static struct irq_chip expio_irq_chip = { |
| 176 | .name = "EXPIO(CPLD)", | ||
| 176 | .ack = expio_ack_irq, | 177 | .ack = expio_ack_irq, |
| 177 | .mask = expio_mask_irq, | 178 | .mask = expio_mask_irq, |
| 178 | .unmask = expio_unmask_irq, | 179 | .unmask = expio_unmask_irq, |
| @@ -302,6 +303,7 @@ static struct regulator_init_data ldo1_data = { | |||
| 302 | .min_uV = 2800000, | 303 | .min_uV = 2800000, |
| 303 | .max_uV = 2800000, | 304 | .max_uV = 2800000, |
| 304 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | 305 | .valid_modes_mask = REGULATOR_MODE_NORMAL, |
| 306 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
| 305 | .apply_uV = 1, | 307 | .apply_uV = 1, |
| 306 | }, | 308 | }, |
| 307 | }; | 309 | }; |
| @@ -322,6 +324,7 @@ static struct regulator_init_data ldo2_data = { | |||
| 322 | .min_uV = 3300000, | 324 | .min_uV = 3300000, |
| 323 | .max_uV = 3300000, | 325 | .max_uV = 3300000, |
| 324 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | 326 | .valid_modes_mask = REGULATOR_MODE_NORMAL, |
| 327 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
| 325 | .apply_uV = 1, | 328 | .apply_uV = 1, |
| 326 | }, | 329 | }, |
| 327 | .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers), | 330 | .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers), |
| @@ -459,6 +462,7 @@ static int mx31_wm8350_init(struct wm8350 *wm8350) | |||
| 459 | 462 | ||
| 460 | static struct wm8350_platform_data __initdata mx31_wm8350_pdata = { | 463 | static struct wm8350_platform_data __initdata mx31_wm8350_pdata = { |
| 461 | .init = mx31_wm8350_init, | 464 | .init = mx31_wm8350_init, |
| 465 | .irq_base = MXC_BOARD_IRQ_START + MXC_MAX_EXP_IO_LINES, | ||
| 462 | }; | 466 | }; |
| 463 | #endif | 467 | #endif |
| 464 | 468 | ||
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 3f1334f62e7a..7027cdc1ba49 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -505,7 +505,7 @@ static void __init gpmc_mem_init(void) | |||
| 505 | void __init gpmc_init(void) | 505 | void __init gpmc_init(void) |
| 506 | { | 506 | { |
| 507 | u32 l; | 507 | u32 l; |
| 508 | char *ck; | 508 | char *ck = NULL; |
| 509 | 509 | ||
| 510 | if (cpu_is_omap24xx()) { | 510 | if (cpu_is_omap24xx()) { |
| 511 | ck = "core_l3_ck"; | 511 | ck = "core_l3_ck"; |
| @@ -521,6 +521,9 @@ void __init gpmc_init(void) | |||
| 521 | l = OMAP44XX_GPMC_BASE; | 521 | l = OMAP44XX_GPMC_BASE; |
| 522 | } | 522 | } |
| 523 | 523 | ||
| 524 | if (WARN_ON(!ck)) | ||
| 525 | return; | ||
| 526 | |||
| 524 | gpmc_l3_clk = clk_get(NULL, ck); | 527 | gpmc_l3_clk = clk_get(NULL, ck); |
| 525 | if (IS_ERR(gpmc_l3_clk)) { | 528 | if (IS_ERR(gpmc_l3_clk)) { |
| 526 | printk(KERN_ERR "Could not get GPMC clock %s\n", ck); | 529 | printk(KERN_ERR "Could not get GPMC clock %s\n", ck); |
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 27054025da2b..26aeef560aa3 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
| @@ -194,7 +194,7 @@ void __init omap_init_irq(void) | |||
| 194 | int i; | 194 | int i; |
| 195 | 195 | ||
| 196 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { | 196 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { |
| 197 | unsigned long base; | 197 | unsigned long base = 0; |
| 198 | struct omap_irq_bank *bank = irq_banks + i; | 198 | struct omap_irq_bank *bank = irq_banks + i; |
| 199 | 199 | ||
| 200 | if (cpu_is_omap24xx()) | 200 | if (cpu_is_omap24xx()) |
| @@ -202,6 +202,8 @@ void __init omap_init_irq(void) | |||
| 202 | else if (cpu_is_omap34xx()) | 202 | else if (cpu_is_omap34xx()) |
| 203 | base = OMAP34XX_IC_BASE; | 203 | base = OMAP34XX_IC_BASE; |
| 204 | 204 | ||
| 205 | BUG_ON(!base); | ||
| 206 | |||
| 205 | /* Static mapping, never released */ | 207 | /* Static mapping, never released */ |
| 206 | bank->base_reg = ioremap(base, SZ_4K); | 208 | bank->base_reg = ioremap(base, SZ_4K); |
| 207 | if (!bank->base_reg) { | 209 | if (!bank->base_reg) { |
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c index 0c3c72d934bf..8afe9dd3f150 100644 --- a/arch/arm/mach-omap2/mmc-twl4030.c +++ b/arch/arm/mach-omap2/mmc-twl4030.c | |||
| @@ -408,6 +408,7 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers) | |||
| 408 | { | 408 | { |
| 409 | struct twl4030_hsmmc_info *c; | 409 | struct twl4030_hsmmc_info *c; |
| 410 | int nr_hsmmc = ARRAY_SIZE(hsmmc_data); | 410 | int nr_hsmmc = ARRAY_SIZE(hsmmc_data); |
| 411 | int i; | ||
| 411 | 412 | ||
| 412 | if (cpu_is_omap2430()) { | 413 | if (cpu_is_omap2430()) { |
| 413 | control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; | 414 | control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; |
| @@ -434,7 +435,7 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers) | |||
| 434 | mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL); | 435 | mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL); |
| 435 | if (!mmc) { | 436 | if (!mmc) { |
| 436 | pr_err("Cannot allocate memory for mmc device!\n"); | 437 | pr_err("Cannot allocate memory for mmc device!\n"); |
| 437 | return; | 438 | goto done; |
| 438 | } | 439 | } |
| 439 | 440 | ||
| 440 | if (c->name) | 441 | if (c->name) |
| @@ -532,6 +533,10 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers) | |||
| 532 | continue; | 533 | continue; |
| 533 | c->dev = mmc->dev; | 534 | c->dev = mmc->dev; |
| 534 | } | 535 | } |
| 536 | |||
| 537 | done: | ||
| 538 | for (i = 0; i < nr_hsmmc; i++) | ||
| 539 | kfree(hsmmc_data[i]); | ||
| 535 | } | 540 | } |
| 536 | 541 | ||
| 537 | #endif | 542 | #endif |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 3f59bd12cbbf..5fedc50c58e4 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -486,7 +486,7 @@ int __init omap_mux_init_signal(char *muxname, int val) | |||
| 486 | static inline void omap_mux_decode(struct seq_file *s, u16 val) | 486 | static inline void omap_mux_decode(struct seq_file *s, u16 val) |
| 487 | { | 487 | { |
| 488 | char *flags[OMAP_MUX_MAX_NR_FLAGS]; | 488 | char *flags[OMAP_MUX_MAX_NR_FLAGS]; |
| 489 | char mode[14]; | 489 | char mode[sizeof("OMAP_MUX_MODE") + 1]; |
| 490 | int i = -1; | 490 | int i = -1; |
| 491 | 491 | ||
| 492 | sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7); | 492 | sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7); |
| @@ -553,6 +553,7 @@ static int omap_mux_dbg_board_show(struct seq_file *s, void *unused) | |||
| 553 | if (!m0_name) | 553 | if (!m0_name) |
| 554 | continue; | 554 | continue; |
| 555 | 555 | ||
| 556 | /* REVISIT: Needs to be updated if mode0 names get longer */ | ||
| 556 | for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) { | 557 | for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) { |
| 557 | if (m0_name[i] == '\0') { | 558 | if (m0_name[i] == '\0') { |
| 558 | m0_def[i] = m0_name[i]; | 559 | m0_def[i] = m0_name[i]; |
| @@ -968,6 +969,13 @@ static void __init omap_mux_init_list(struct omap_mux *superset) | |||
| 968 | } | 969 | } |
| 969 | #endif | 970 | #endif |
| 970 | 971 | ||
| 972 | #if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) | ||
| 973 | if (!superset->muxnames || !superset->muxnames[0]) { | ||
| 974 | superset++; | ||
| 975 | continue; | ||
| 976 | } | ||
| 977 | #endif | ||
| 978 | |||
| 971 | entry = omap_mux_list_add(superset); | 979 | entry = omap_mux_list_add(superset); |
| 972 | if (!entry) { | 980 | if (!entry) { |
| 973 | printk(KERN_ERR "mux: Could not add entry\n"); | 981 | printk(KERN_ERR "mux: Could not add entry\n"); |
diff --git a/arch/arm/mach-omap2/mux34xx.c b/arch/arm/mach-omap2/mux34xx.c index 68e0a595f9a1..07aa7b3c95f7 100644 --- a/arch/arm/mach-omap2/mux34xx.c +++ b/arch/arm/mach-omap2/mux34xx.c | |||
| @@ -649,6 +649,53 @@ static struct omap_mux __initdata omap3_muxmodes[] = { | |||
| 649 | _OMAP3_MUXENTRY(UART3_TX_IRTX, 166, | 649 | _OMAP3_MUXENTRY(UART3_TX_IRTX, 166, |
| 650 | "uart3_tx_irtx", NULL, NULL, NULL, | 650 | "uart3_tx_irtx", NULL, NULL, NULL, |
| 651 | "gpio_166", NULL, NULL, "safe_mode"), | 651 | "gpio_166", NULL, NULL, "safe_mode"), |
| 652 | |||
| 653 | /* Only on 3630, see omap36xx_cbp_subset for the signals */ | ||
| 654 | _OMAP3_MUXENTRY(GPMC_A11, 0, | ||
| 655 | NULL, NULL, NULL, NULL, | ||
| 656 | NULL, NULL, NULL, NULL), | ||
| 657 | _OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0, | ||
| 658 | NULL, NULL, NULL, NULL, | ||
| 659 | NULL, NULL, NULL, NULL), | ||
| 660 | _OMAP3_MUXENTRY(SAD2D_MREAD, 0, | ||
| 661 | NULL, NULL, NULL, NULL, | ||
| 662 | NULL, NULL, NULL, NULL), | ||
| 663 | _OMAP3_MUXENTRY(SAD2D_MWRITE, 0, | ||
| 664 | NULL, NULL, NULL, NULL, | ||
| 665 | NULL, NULL, NULL, NULL), | ||
| 666 | _OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0, | ||
| 667 | NULL, NULL, NULL, NULL, | ||
| 668 | NULL, NULL, NULL, NULL), | ||
| 669 | _OMAP3_MUXENTRY(SAD2D_SREAD, 0, | ||
| 670 | NULL, NULL, NULL, NULL, | ||
| 671 | NULL, NULL, NULL, NULL), | ||
| 672 | _OMAP3_MUXENTRY(SAD2D_SWRITE, 0, | ||
| 673 | NULL, NULL, NULL, NULL, | ||
| 674 | NULL, NULL, NULL, NULL), | ||
| 675 | _OMAP3_MUXENTRY(GPMC_A11, 0, | ||
| 676 | NULL, NULL, NULL, NULL, | ||
| 677 | NULL, NULL, NULL, NULL), | ||
| 678 | _OMAP3_MUXENTRY(SAD2D_MCAD28, 0, | ||
| 679 | NULL, NULL, NULL, NULL, | ||
| 680 | NULL, NULL, NULL, NULL), | ||
| 681 | _OMAP3_MUXENTRY(SAD2D_MCAD29, 0, | ||
| 682 | NULL, NULL, NULL, NULL, | ||
| 683 | NULL, NULL, NULL, NULL), | ||
| 684 | _OMAP3_MUXENTRY(SAD2D_MCAD32, 0, | ||
| 685 | NULL, NULL, NULL, NULL, | ||
| 686 | NULL, NULL, NULL, NULL), | ||
| 687 | _OMAP3_MUXENTRY(SAD2D_MCAD33, 0, | ||
| 688 | NULL, NULL, NULL, NULL, | ||
| 689 | NULL, NULL, NULL, NULL), | ||
| 690 | _OMAP3_MUXENTRY(SAD2D_MCAD34, 0, | ||
| 691 | NULL, NULL, NULL, NULL, | ||
| 692 | NULL, NULL, NULL, NULL), | ||
| 693 | _OMAP3_MUXENTRY(SAD2D_MCAD35, 0, | ||
| 694 | NULL, NULL, NULL, NULL, | ||
| 695 | NULL, NULL, NULL, NULL), | ||
| 696 | _OMAP3_MUXENTRY(SAD2D_MCAD36, 0, | ||
| 697 | NULL, NULL, NULL, NULL, | ||
| 698 | NULL, NULL, NULL, NULL), | ||
| 652 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 699 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 653 | }; | 700 | }; |
| 654 | 701 | ||
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 8c964bec8159..e10a02df6e1d 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
| @@ -36,7 +36,13 @@ | |||
| 36 | #define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52 | 36 | #define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52 |
| 37 | #define UART_OMAP_WER 0x17 /* Wake-up enable register */ | 37 | #define UART_OMAP_WER 0x17 /* Wake-up enable register */ |
| 38 | 38 | ||
| 39 | #define DEFAULT_TIMEOUT (5 * HZ) | 39 | /* |
| 40 | * NOTE: By default the serial timeout is disabled as it causes lost characters | ||
| 41 | * over the serial ports. This means that the UART clocks will stay on until | ||
| 42 | * disabled via sysfs. This also causes that any deeper omap sleep states are | ||
| 43 | * blocked. | ||
| 44 | */ | ||
| 45 | #define DEFAULT_TIMEOUT 0 | ||
| 40 | 46 | ||
| 41 | struct omap_uart_state { | 47 | struct omap_uart_state { |
| 42 | int num; | 48 | int num; |
| @@ -422,7 +428,8 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
| 422 | uart->timeout = DEFAULT_TIMEOUT; | 428 | uart->timeout = DEFAULT_TIMEOUT; |
| 423 | setup_timer(&uart->timer, omap_uart_idle_timer, | 429 | setup_timer(&uart->timer, omap_uart_idle_timer, |
| 424 | (unsigned long) uart); | 430 | (unsigned long) uart); |
| 425 | mod_timer(&uart->timer, jiffies + uart->timeout); | 431 | if (uart->timeout) |
| 432 | mod_timer(&uart->timer, jiffies + uart->timeout); | ||
| 426 | omap_uart_smart_idle_enable(uart, 0); | 433 | omap_uart_smart_idle_enable(uart, 0); |
| 427 | 434 | ||
| 428 | if (cpu_is_omap34xx()) { | 435 | if (cpu_is_omap34xx()) { |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index a21a4b395f73..d94857eb0690 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
| @@ -334,8 +334,8 @@ static void realview_pbx_reset(char mode) | |||
| 334 | * in the system FPGA | 334 | * in the system FPGA |
| 335 | */ | 335 | */ |
| 336 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 336 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 337 | __raw_writel(0x0000, reset_ctrl); | 337 | __raw_writel(0x00F0, reset_ctrl); |
| 338 | __raw_writel(0x0004, reset_ctrl); | 338 | __raw_writel(0x00F4, reset_ctrl); |
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | static void __init realview_pbx_init(void) | 341 | static void __init realview_pbx_init(void) |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 3f9cd3d8f6d5..795dc615f43b 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
| @@ -41,7 +41,7 @@ ENTRY(cpu_arm7_dcache_clean_area) | |||
| 41 | ENTRY(cpu_arm7_data_abort) | 41 | ENTRY(cpu_arm7_data_abort) |
| 42 | mrc p15, 0, r1, c5, c0, 0 @ get FSR | 42 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
| 43 | mrc p15, 0, r0, c6, c0, 0 @ get FAR | 43 | mrc p15, 0, r0, c6, c0, 0 @ get FAR |
| 44 | ldr r8, [r0] @ read arm instruction | 44 | ldr r8, [r2] @ read arm instruction |
| 45 | tst r8, #1 << 20 @ L = 0 -> write? | 45 | tst r8, #1 << 20 @ L = 0 -> write? |
| 46 | orreq r1, r1, #1 << 11 @ yes. | 46 | orreq r1, r1, #1 << 11 @ yes. |
| 47 | and r7, r8, #15 << 24 | 47 | and r7, r8, #15 << 24 |
diff --git a/arch/arm/plat-mxc/audmux-v2.c b/arch/arm/plat-mxc/audmux-v2.c index 6f21096086fd..b06954a84436 100644 --- a/arch/arm/plat-mxc/audmux-v2.c +++ b/arch/arm/plat-mxc/audmux-v2.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
| 24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
| 26 | #include <linux/debugfs.h> | ||
| 26 | #include <mach/audmux.h> | 27 | #include <mach/audmux.h> |
| 27 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
| 28 | 29 | ||
| @@ -32,6 +33,140 @@ static void __iomem *audmux_base; | |||
| 32 | #define MXC_AUDMUX_V2_PTCR(x) ((x) * 8) | 33 | #define MXC_AUDMUX_V2_PTCR(x) ((x) * 8) |
| 33 | #define MXC_AUDMUX_V2_PDCR(x) ((x) * 8 + 4) | 34 | #define MXC_AUDMUX_V2_PDCR(x) ((x) * 8 + 4) |
| 34 | 35 | ||
| 36 | #ifdef CONFIG_DEBUG_FS | ||
| 37 | static struct dentry *audmux_debugfs_root; | ||
| 38 | |||
| 39 | static int audmux_open_file(struct inode *inode, struct file *file) | ||
| 40 | { | ||
| 41 | file->private_data = inode->i_private; | ||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | /* There is an annoying discontinuity in the SSI numbering with regard | ||
| 46 | * to the Linux number of the devices */ | ||
| 47 | static const char *audmux_port_string(int port) | ||
| 48 | { | ||
| 49 | switch (port) { | ||
| 50 | case MX31_AUDMUX_PORT1_SSI0: | ||
| 51 | return "imx-ssi.0"; | ||
| 52 | case MX31_AUDMUX_PORT2_SSI1: | ||
| 53 | return "imx-ssi.1"; | ||
| 54 | case MX31_AUDMUX_PORT3_SSI_PINS_3: | ||
| 55 | return "SSI3"; | ||
| 56 | case MX31_AUDMUX_PORT4_SSI_PINS_4: | ||
| 57 | return "SSI4"; | ||
| 58 | case MX31_AUDMUX_PORT5_SSI_PINS_5: | ||
| 59 | return "SSI5"; | ||
| 60 | case MX31_AUDMUX_PORT6_SSI_PINS_6: | ||
| 61 | return "SSI6"; | ||
| 62 | default: | ||
| 63 | return "UNKNOWN"; | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | static ssize_t audmux_read_file(struct file *file, char __user *user_buf, | ||
| 68 | size_t count, loff_t *ppos) | ||
| 69 | { | ||
| 70 | ssize_t ret; | ||
| 71 | char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
| 72 | int port = (int)file->private_data; | ||
| 73 | u32 pdcr, ptcr; | ||
| 74 | |||
| 75 | if (!buf) | ||
| 76 | return -ENOMEM; | ||
| 77 | |||
| 78 | if (audmux_clk) | ||
| 79 | clk_enable(audmux_clk); | ||
| 80 | |||
| 81 | ptcr = readl(audmux_base + MXC_AUDMUX_V2_PTCR(port)); | ||
| 82 | pdcr = readl(audmux_base + MXC_AUDMUX_V2_PDCR(port)); | ||
| 83 | |||
| 84 | if (audmux_clk) | ||
| 85 | clk_disable(audmux_clk); | ||
| 86 | |||
| 87 | ret = snprintf(buf, PAGE_SIZE, "PDCR: %08x\nPTCR: %08x\n", | ||
| 88 | pdcr, ptcr); | ||
| 89 | |||
| 90 | if (ptcr & MXC_AUDMUX_V2_PTCR_TFSDIR) | ||
| 91 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 92 | "TxFS output from %s, ", | ||
| 93 | audmux_port_string((ptcr >> 27) & 0x7)); | ||
| 94 | else | ||
| 95 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 96 | "TxFS input, "); | ||
| 97 | |||
| 98 | if (ptcr & MXC_AUDMUX_V2_PTCR_TCLKDIR) | ||
| 99 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 100 | "TxClk output from %s", | ||
| 101 | audmux_port_string((ptcr >> 22) & 0x7)); | ||
| 102 | else | ||
| 103 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 104 | "TxClk input"); | ||
| 105 | |||
| 106 | ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n"); | ||
| 107 | |||
| 108 | if (ptcr & MXC_AUDMUX_V2_PTCR_SYN) { | ||
| 109 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 110 | "Port is symmetric"); | ||
| 111 | } else { | ||
| 112 | if (ptcr & MXC_AUDMUX_V2_PTCR_RFSDIR) | ||
| 113 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 114 | "RxFS output from %s, ", | ||
| 115 | audmux_port_string((ptcr >> 17) & 0x7)); | ||
| 116 | else | ||
| 117 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 118 | "RxFS input, "); | ||
| 119 | |||
| 120 | if (ptcr & MXC_AUDMUX_V2_PTCR_RCLKDIR) | ||
| 121 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 122 | "RxClk output from %s", | ||
| 123 | audmux_port_string((ptcr >> 12) & 0x7)); | ||
| 124 | else | ||
| 125 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 126 | "RxClk input"); | ||
| 127 | } | ||
| 128 | |||
| 129 | ret += snprintf(buf + ret, PAGE_SIZE - ret, | ||
| 130 | "\nData received from %s\n", | ||
| 131 | audmux_port_string((pdcr >> 13) & 0x7)); | ||
| 132 | |||
| 133 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); | ||
| 134 | |||
| 135 | kfree(buf); | ||
| 136 | |||
| 137 | return ret; | ||
| 138 | } | ||
| 139 | |||
| 140 | static const struct file_operations audmux_debugfs_fops = { | ||
| 141 | .open = audmux_open_file, | ||
| 142 | .read = audmux_read_file, | ||
| 143 | }; | ||
| 144 | |||
| 145 | static void audmux_debugfs_init(void) | ||
| 146 | { | ||
| 147 | int i; | ||
| 148 | char buf[20]; | ||
| 149 | |||
| 150 | audmux_debugfs_root = debugfs_create_dir("audmux", NULL); | ||
| 151 | if (!audmux_debugfs_root) { | ||
| 152 | pr_warning("Failed to create AUDMUX debugfs root\n"); | ||
| 153 | return; | ||
| 154 | } | ||
| 155 | |||
| 156 | for (i = 1; i < 8; i++) { | ||
| 157 | snprintf(buf, sizeof(buf), "ssi%d", i); | ||
| 158 | if (!debugfs_create_file(buf, 0444, audmux_debugfs_root, | ||
| 159 | (void *)i, &audmux_debugfs_fops)) | ||
| 160 | pr_warning("Failed to create AUDMUX port %d debugfs file\n", | ||
| 161 | i); | ||
| 162 | } | ||
| 163 | } | ||
| 164 | #else | ||
| 165 | static inline void audmux_debugfs_init(void) | ||
| 166 | { | ||
| 167 | } | ||
| 168 | #endif | ||
| 169 | |||
| 35 | int mxc_audmux_v2_configure_port(unsigned int port, unsigned int ptcr, | 170 | int mxc_audmux_v2_configure_port(unsigned int port, unsigned int ptcr, |
| 36 | unsigned int pdcr) | 171 | unsigned int pdcr) |
| 37 | { | 172 | { |
| @@ -68,6 +203,8 @@ static int mxc_audmux_v2_init(void) | |||
| 68 | if (cpu_is_mx31() || cpu_is_mx35()) | 203 | if (cpu_is_mx31() || cpu_is_mx35()) |
| 69 | audmux_base = IO_ADDRESS(AUDMUX_BASE_ADDR); | 204 | audmux_base = IO_ADDRESS(AUDMUX_BASE_ADDR); |
| 70 | 205 | ||
| 206 | audmux_debugfs_init(); | ||
| 207 | |||
| 71 | return 0; | 208 | return 0; |
| 72 | } | 209 | } |
| 73 | 210 | ||
diff --git a/arch/arm/plat-mxc/include/mach/board-mx31lite.h b/arch/arm/plat-mxc/include/mach/board-mx31lite.h index 0184b638c268..2b2da0367578 100644 --- a/arch/arm/plat-mxc/include/mach/board-mx31lite.h +++ b/arch/arm/plat-mxc/include/mach/board-mx31lite.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #ifndef __ASSEMBLY__ | 26 | #ifndef __ASSEMBLY__ |
| 27 | 27 | ||
| 28 | enum mx31lilly_boards { | 28 | enum mx31lite_boards { |
| 29 | MX31LITE_NOBOARD = 0, | 29 | MX31LITE_NOBOARD = 0, |
| 30 | MX31LITE_DB = 1, | 30 | MX31LITE_DB = 1, |
| 31 | }; | 31 | }; |
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 286cb9b0a25b..4bf1068ffad9 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
| @@ -32,7 +32,7 @@ extern void mxc91231_init_irq(void); | |||
| 32 | extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); | 32 | extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); |
| 33 | extern int mx1_clocks_init(unsigned long fref); | 33 | extern int mx1_clocks_init(unsigned long fref); |
| 34 | extern int mx21_clocks_init(unsigned long lref, unsigned long fref); | 34 | extern int mx21_clocks_init(unsigned long lref, unsigned long fref); |
| 35 | extern int mx25_clocks_init(unsigned long fref); | 35 | extern int mx25_clocks_init(void); |
| 36 | extern int mx27_clocks_init(unsigned long fref); | 36 | extern int mx27_clocks_init(unsigned long fref); |
| 37 | extern int mx31_clocks_init(unsigned long fref); | 37 | extern int mx31_clocks_init(unsigned long fref); |
| 38 | extern int mx35_clocks_init(void); | 38 | extern int mx35_clocks_init(void); |
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx35.h b/arch/arm/plat-mxc/include/mach/iomux-mx35.h index 00b0ac1db225..c88d40795f7a 100644 --- a/arch/arm/plat-mxc/include/mach/iomux-mx35.h +++ b/arch/arm/plat-mxc/include/mach/iomux-mx35.h | |||
| @@ -671,7 +671,7 @@ | |||
| 671 | #define MX35_PAD_LD8__SDMA_SDMA_DEBUG_PC_8 IOMUX_PAD(0x634, 0x1d0, 6, 0x0, 0, NO_PAD_CTRL) | 671 | #define MX35_PAD_LD8__SDMA_SDMA_DEBUG_PC_8 IOMUX_PAD(0x634, 0x1d0, 6, 0x0, 0, NO_PAD_CTRL) |
| 672 | 672 | ||
| 673 | #define MX35_PAD_LD9__IPU_DISPB_DAT_9 IOMUX_PAD(0x638, 0x1d4, 0, 0x0, 0, NO_PAD_CTRL) | 673 | #define MX35_PAD_LD9__IPU_DISPB_DAT_9 IOMUX_PAD(0x638, 0x1d4, 0, 0x0, 0, NO_PAD_CTRL) |
| 674 | #define MX35_PAD_LD9__GPIO2_9 IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4 0, NO_PAD_CTRL) | 674 | #define MX35_PAD_LD9__GPIO2_9 IOMUX_PAD(0x638, 0x1d4, 5, 0x8e4, 0, NO_PAD_CTRL) |
| 675 | #define MX35_PAD_LD9__SDMA_SDMA_DEBUG_PC_9 IOMUX_PAD(0x638, 0x1d4, 6, 0x0, 0, NO_PAD_CTRL) | 675 | #define MX35_PAD_LD9__SDMA_SDMA_DEBUG_PC_9 IOMUX_PAD(0x638, 0x1d4, 6, 0x0, 0, NO_PAD_CTRL) |
| 676 | 676 | ||
| 677 | #define MX35_PAD_LD10__IPU_DISPB_DAT_10 IOMUX_PAD(0x63c, 0x1d8, 0, 0x0, 0, NO_PAD_CTRL) | 677 | #define MX35_PAD_LD10__IPU_DISPB_DAT_10 IOMUX_PAD(0x63c, 0x1d8, 0, 0x0, 0, NO_PAD_CTRL) |
diff --git a/arch/arm/plat-mxc/include/mach/irqs.h b/arch/arm/plat-mxc/include/mach/irqs.h index ead9d592168d..0cb347645db4 100644 --- a/arch/arm/plat-mxc/include/mach/irqs.h +++ b/arch/arm/plat-mxc/include/mach/irqs.h | |||
| @@ -37,7 +37,12 @@ | |||
| 37 | * within sensible limits. | 37 | * within sensible limits. |
| 38 | */ | 38 | */ |
| 39 | #define MXC_BOARD_IRQ_START (MXC_INTERNAL_IRQS + MXC_GPIO_IRQS) | 39 | #define MXC_BOARD_IRQ_START (MXC_INTERNAL_IRQS + MXC_GPIO_IRQS) |
| 40 | |||
| 41 | #ifdef CONFIG_MACH_MX31ADS_WM1133_EV1 | ||
| 42 | #define MXC_BOARD_IRQS 80 | ||
| 43 | #else | ||
| 40 | #define MXC_BOARD_IRQS 16 | 44 | #define MXC_BOARD_IRQS 16 |
| 45 | #endif | ||
| 41 | 46 | ||
| 42 | #define MXC_IPU_IRQ_START (MXC_BOARD_IRQ_START + MXC_BOARD_IRQS) | 47 | #define MXC_IPU_IRQ_START (MXC_BOARD_IRQ_START + MXC_BOARD_IRQS) |
| 43 | 48 | ||
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index d9f8c844c385..4becbdd1935c 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
| @@ -391,7 +391,7 @@ static struct dentry *clk_debugfs_root; | |||
| 391 | static int clk_debugfs_register_one(struct clk *c) | 391 | static int clk_debugfs_register_one(struct clk *c) |
| 392 | { | 392 | { |
| 393 | int err; | 393 | int err; |
| 394 | struct dentry *d, *child; | 394 | struct dentry *d, *child, *child_tmp; |
| 395 | struct clk *pa = c->parent; | 395 | struct clk *pa = c->parent; |
| 396 | char s[255]; | 396 | char s[255]; |
| 397 | char *p = s; | 397 | char *p = s; |
| @@ -423,7 +423,7 @@ static int clk_debugfs_register_one(struct clk *c) | |||
| 423 | 423 | ||
| 424 | err_out: | 424 | err_out: |
| 425 | d = c->dent; | 425 | d = c->dent; |
| 426 | list_for_each_entry(child, &d->d_subdirs, d_u.d_child) | 426 | list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child) |
| 427 | debugfs_remove(child); | 427 | debugfs_remove(child); |
| 428 | debugfs_remove(c->dent); | 428 | debugfs_remove(c->dent); |
| 429 | return err; | 429 | return err; |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index d17620c50c28..d2422c766cca 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -750,6 +750,7 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | |||
| 750 | } | 750 | } |
| 751 | #endif | 751 | #endif |
| 752 | 752 | ||
| 753 | #ifdef CONFIG_ARCH_OMAP1 | ||
| 753 | /* | 754 | /* |
| 754 | * This only applies to chips that can't do both rising and falling edge | 755 | * This only applies to chips that can't do both rising and falling edge |
| 755 | * detection at once. For all other chips, this function is a noop. | 756 | * detection at once. For all other chips, this function is a noop. |
| @@ -760,11 +761,9 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | |||
| 760 | u32 l = 0; | 761 | u32 l = 0; |
| 761 | 762 | ||
| 762 | switch (bank->method) { | 763 | switch (bank->method) { |
| 763 | #ifdef CONFIG_ARCH_OMAP1 | ||
| 764 | case METHOD_MPUIO: | 764 | case METHOD_MPUIO: |
| 765 | reg += OMAP_MPUIO_GPIO_INT_EDGE; | 765 | reg += OMAP_MPUIO_GPIO_INT_EDGE; |
| 766 | break; | 766 | break; |
| 767 | #endif | ||
| 768 | #ifdef CONFIG_ARCH_OMAP15XX | 767 | #ifdef CONFIG_ARCH_OMAP15XX |
| 769 | case METHOD_GPIO_1510: | 768 | case METHOD_GPIO_1510: |
| 770 | reg += OMAP1510_GPIO_INT_CONTROL; | 769 | reg += OMAP1510_GPIO_INT_CONTROL; |
| @@ -787,6 +786,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) | |||
| 787 | 786 | ||
| 788 | __raw_writel(l, reg); | 787 | __raw_writel(l, reg); |
| 789 | } | 788 | } |
| 789 | #endif | ||
| 790 | 790 | ||
| 791 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | 791 | static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) |
| 792 | { | 792 | { |
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index 1e5648d3e3d8..2ed72013c2e2 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c | |||
| @@ -89,16 +89,6 @@ | |||
| 89 | #define USE_WAKEUP_LAT 0 | 89 | #define USE_WAKEUP_LAT 0 |
| 90 | #define IGNORE_WAKEUP_LAT 1 | 90 | #define IGNORE_WAKEUP_LAT 1 |
| 91 | 91 | ||
| 92 | /* XXX this should be moved into a separate file */ | ||
| 93 | #if defined(CONFIG_ARCH_OMAP2420) | ||
| 94 | # define OMAP_32KSYNCT_BASE 0x48004000 | ||
| 95 | #elif defined(CONFIG_ARCH_OMAP2430) | ||
| 96 | # define OMAP_32KSYNCT_BASE 0x49020000 | ||
| 97 | #elif defined(CONFIG_ARCH_OMAP3430) | ||
| 98 | # define OMAP_32KSYNCT_BASE 0x48320000 | ||
| 99 | #else | ||
| 100 | # error Unknown OMAP device | ||
| 101 | #endif | ||
| 102 | 92 | ||
| 103 | /* Private functions */ | 93 | /* Private functions */ |
| 104 | 94 | ||
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index f60a5400a25b..a63c4be99b36 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
| @@ -197,10 +197,13 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ | |||
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | /* | 199 | /* |
| 200 | * Update the FPSCR with the additional exception flags. | 200 | * If any of the status flags are set, update the FPSCR. |
| 201 | * Comparison instructions always return at least one of | 201 | * Comparison instructions always return at least one of |
| 202 | * these flags set. | 202 | * these flags set. |
| 203 | */ | 203 | */ |
| 204 | if (exceptions & (FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V)) | ||
| 205 | fpscr &= ~(FPSCR_N|FPSCR_Z|FPSCR_C|FPSCR_V); | ||
| 206 | |||
| 204 | fpscr |= exceptions; | 207 | fpscr |= exceptions; |
| 205 | 208 | ||
| 206 | fmxr(FPSCR, fpscr); | 209 | fmxr(FPSCR, fpscr); |
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index 1aa1ea5e9212..b13d1879e51b 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
| @@ -1325,7 +1325,7 @@ struct platform_device *__init | |||
| 1325 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | 1325 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) |
| 1326 | { | 1326 | { |
| 1327 | struct platform_device *pdev; | 1327 | struct platform_device *pdev; |
| 1328 | struct mci_dma_slave *slave; | 1328 | struct mci_dma_data *slave; |
| 1329 | u32 pioa_mask; | 1329 | u32 pioa_mask; |
| 1330 | u32 piob_mask; | 1330 | u32 piob_mask; |
| 1331 | 1331 | ||
| @@ -1344,7 +1344,9 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
| 1344 | ARRAY_SIZE(atmel_mci0_resource))) | 1344 | ARRAY_SIZE(atmel_mci0_resource))) |
| 1345 | goto fail; | 1345 | goto fail; |
| 1346 | 1346 | ||
| 1347 | slave = kzalloc(sizeof(struct mci_dma_slave), GFP_KERNEL); | 1347 | slave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL); |
| 1348 | if (!slave) | ||
| 1349 | goto fail; | ||
| 1348 | 1350 | ||
| 1349 | slave->sdata.dma_dev = &dw_dmac0_device.dev; | 1351 | slave->sdata.dma_dev = &dw_dmac0_device.dev; |
| 1350 | slave->sdata.reg_width = DW_DMA_SLAVE_WIDTH_32BIT; | 1352 | slave->sdata.reg_width = DW_DMA_SLAVE_WIDTH_32BIT; |
| @@ -1357,7 +1359,7 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
| 1357 | 1359 | ||
| 1358 | if (platform_device_add_data(pdev, data, | 1360 | if (platform_device_add_data(pdev, data, |
| 1359 | sizeof(struct mci_platform_data))) | 1361 | sizeof(struct mci_platform_data))) |
| 1360 | goto fail; | 1362 | goto fail_free; |
| 1361 | 1363 | ||
| 1362 | /* CLK line is common to both slots */ | 1364 | /* CLK line is common to both slots */ |
| 1363 | pioa_mask = 1 << 10; | 1365 | pioa_mask = 1 << 10; |
| @@ -1381,7 +1383,7 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
| 1381 | /* Slot is unused */ | 1383 | /* Slot is unused */ |
| 1382 | break; | 1384 | break; |
| 1383 | default: | 1385 | default: |
| 1384 | goto fail; | 1386 | goto fail_free; |
| 1385 | } | 1387 | } |
| 1386 | 1388 | ||
| 1387 | select_peripheral(PIOA, pioa_mask, PERIPH_A, 0); | 1389 | select_peripheral(PIOA, pioa_mask, PERIPH_A, 0); |
| @@ -1408,7 +1410,7 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
| 1408 | break; | 1410 | break; |
| 1409 | default: | 1411 | default: |
| 1410 | if (!data->slot[0].bus_width) | 1412 | if (!data->slot[0].bus_width) |
| 1411 | goto fail; | 1413 | goto fail_free; |
| 1412 | 1414 | ||
| 1413 | data->slot[1].bus_width = 0; | 1415 | data->slot[1].bus_width = 0; |
| 1414 | break; | 1416 | break; |
| @@ -1419,9 +1421,10 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | |||
| 1419 | platform_device_add(pdev); | 1421 | platform_device_add(pdev); |
| 1420 | return pdev; | 1422 | return pdev; |
| 1421 | 1423 | ||
| 1424 | fail_free: | ||
| 1425 | kfree(slave); | ||
| 1422 | fail: | 1426 | fail: |
| 1423 | data->dma_slave = NULL; | 1427 | data->dma_slave = NULL; |
| 1424 | kfree(slave); | ||
| 1425 | platform_device_put(pdev); | 1428 | platform_device_put(pdev); |
| 1426 | return NULL; | 1429 | return NULL; |
| 1427 | } | 1430 | } |
diff --git a/arch/microblaze/configs/mmu_defconfig b/arch/microblaze/configs/mmu_defconfig index bb7c374713ad..6fced1fe3bf0 100644 --- a/arch/microblaze/configs/mmu_defconfig +++ b/arch/microblaze/configs/mmu_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.31 | 3 | # Linux kernel version: 2.6.33-rc6 |
| 4 | # Thu Sep 24 10:28:50 2009 | 4 | # Wed Feb 3 10:02:59 2010 |
| 5 | # | 5 | # |
| 6 | CONFIG_MICROBLAZE=y | 6 | CONFIG_MICROBLAZE=y |
| 7 | # CONFIG_SWAP is not set | 7 | # CONFIG_SWAP is not set |
| @@ -19,8 +19,12 @@ CONFIG_GENERIC_CLOCKEVENTS=y | |||
| 19 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 19 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 20 | CONFIG_GENERIC_GPIO=y | 20 | CONFIG_GENERIC_GPIO=y |
| 21 | CONFIG_GENERIC_CSUM=y | 21 | CONFIG_GENERIC_CSUM=y |
| 22 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 23 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 24 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
| 22 | # CONFIG_PCI is not set | 25 | # CONFIG_PCI is not set |
| 23 | CONFIG_NO_DMA=y | 26 | CONFIG_NO_DMA=y |
| 27 | CONFIG_DTC=y | ||
| 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 25 | CONFIG_CONSTRUCTORS=y | 29 | CONFIG_CONSTRUCTORS=y |
| 26 | 30 | ||
| @@ -44,6 +48,7 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
| 44 | # | 48 | # |
| 45 | CONFIG_TREE_RCU=y | 49 | CONFIG_TREE_RCU=y |
| 46 | # CONFIG_TREE_PREEMPT_RCU is not set | 50 | # CONFIG_TREE_PREEMPT_RCU is not set |
| 51 | # CONFIG_TINY_RCU is not set | ||
| 47 | # CONFIG_RCU_TRACE is not set | 52 | # CONFIG_RCU_TRACE is not set |
| 48 | CONFIG_RCU_FANOUT=32 | 53 | CONFIG_RCU_FANOUT=32 |
| 49 | # CONFIG_RCU_FANOUT_EXACT is not set | 54 | # CONFIG_RCU_FANOUT_EXACT is not set |
| @@ -64,10 +69,12 @@ CONFIG_INITRAMFS_ROOT_GID=0 | |||
| 64 | CONFIG_RD_GZIP=y | 69 | CONFIG_RD_GZIP=y |
| 65 | # CONFIG_RD_BZIP2 is not set | 70 | # CONFIG_RD_BZIP2 is not set |
| 66 | # CONFIG_RD_LZMA is not set | 71 | # CONFIG_RD_LZMA is not set |
| 72 | # CONFIG_RD_LZO is not set | ||
| 67 | # CONFIG_INITRAMFS_COMPRESSION_NONE is not set | 73 | # CONFIG_INITRAMFS_COMPRESSION_NONE is not set |
| 68 | CONFIG_INITRAMFS_COMPRESSION_GZIP=y | 74 | CONFIG_INITRAMFS_COMPRESSION_GZIP=y |
| 69 | # CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set | 75 | # CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set |
| 70 | # CONFIG_INITRAMFS_COMPRESSION_LZMA is not set | 76 | # CONFIG_INITRAMFS_COMPRESSION_LZMA is not set |
| 77 | # CONFIG_INITRAMFS_COMPRESSION_LZO is not set | ||
| 71 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 78 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 72 | CONFIG_SYSCTL=y | 79 | CONFIG_SYSCTL=y |
| 73 | CONFIG_ANON_INODES=y | 80 | CONFIG_ANON_INODES=y |
| @@ -90,21 +97,20 @@ CONFIG_EVENTFD=y | |||
| 90 | CONFIG_AIO=y | 97 | CONFIG_AIO=y |
| 91 | 98 | ||
| 92 | # | 99 | # |
| 93 | # Performance Counters | 100 | # Kernel Performance Events And Counters |
| 94 | # | 101 | # |
| 95 | CONFIG_VM_EVENT_COUNTERS=y | 102 | CONFIG_VM_EVENT_COUNTERS=y |
| 96 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 97 | CONFIG_COMPAT_BRK=y | 103 | CONFIG_COMPAT_BRK=y |
| 98 | CONFIG_SLAB=y | 104 | CONFIG_SLAB=y |
| 99 | # CONFIG_SLUB is not set | 105 | # CONFIG_SLUB is not set |
| 100 | # CONFIG_SLOB is not set | 106 | # CONFIG_SLOB is not set |
| 101 | # CONFIG_PROFILING is not set | 107 | # CONFIG_PROFILING is not set |
| 102 | # CONFIG_MARKERS is not set | 108 | CONFIG_HAVE_OPROFILE=y |
| 103 | 109 | ||
| 104 | # | 110 | # |
| 105 | # GCOV-based kernel profiling | 111 | # GCOV-based kernel profiling |
| 106 | # | 112 | # |
| 107 | # CONFIG_SLOW_WORK is not set | 113 | CONFIG_SLOW_WORK=y |
| 108 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 114 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 109 | CONFIG_SLABINFO=y | 115 | CONFIG_SLABINFO=y |
| 110 | CONFIG_BASE_SMALL=1 | 116 | CONFIG_BASE_SMALL=1 |
| @@ -123,14 +129,41 @@ CONFIG_LBDAF=y | |||
| 123 | # IO Schedulers | 129 | # IO Schedulers |
| 124 | # | 130 | # |
| 125 | CONFIG_IOSCHED_NOOP=y | 131 | CONFIG_IOSCHED_NOOP=y |
| 126 | CONFIG_IOSCHED_AS=y | ||
| 127 | CONFIG_IOSCHED_DEADLINE=y | 132 | CONFIG_IOSCHED_DEADLINE=y |
| 128 | CONFIG_IOSCHED_CFQ=y | 133 | CONFIG_IOSCHED_CFQ=y |
| 129 | # CONFIG_DEFAULT_AS is not set | ||
| 130 | # CONFIG_DEFAULT_DEADLINE is not set | 134 | # CONFIG_DEFAULT_DEADLINE is not set |
| 131 | CONFIG_DEFAULT_CFQ=y | 135 | CONFIG_DEFAULT_CFQ=y |
| 132 | # CONFIG_DEFAULT_NOOP is not set | 136 | # CONFIG_DEFAULT_NOOP is not set |
| 133 | CONFIG_DEFAULT_IOSCHED="cfq" | 137 | CONFIG_DEFAULT_IOSCHED="cfq" |
| 138 | # CONFIG_INLINE_SPIN_TRYLOCK is not set | ||
| 139 | # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set | ||
| 140 | # CONFIG_INLINE_SPIN_LOCK is not set | ||
| 141 | # CONFIG_INLINE_SPIN_LOCK_BH is not set | ||
| 142 | # CONFIG_INLINE_SPIN_LOCK_IRQ is not set | ||
| 143 | # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set | ||
| 144 | # CONFIG_INLINE_SPIN_UNLOCK is not set | ||
| 145 | # CONFIG_INLINE_SPIN_UNLOCK_BH is not set | ||
| 146 | # CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set | ||
| 147 | # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set | ||
| 148 | # CONFIG_INLINE_READ_TRYLOCK is not set | ||
| 149 | # CONFIG_INLINE_READ_LOCK is not set | ||
| 150 | # CONFIG_INLINE_READ_LOCK_BH is not set | ||
| 151 | # CONFIG_INLINE_READ_LOCK_IRQ is not set | ||
| 152 | # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set | ||
| 153 | # CONFIG_INLINE_READ_UNLOCK is not set | ||
| 154 | # CONFIG_INLINE_READ_UNLOCK_BH is not set | ||
| 155 | # CONFIG_INLINE_READ_UNLOCK_IRQ is not set | ||
| 156 | # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set | ||
| 157 | # CONFIG_INLINE_WRITE_TRYLOCK is not set | ||
| 158 | # CONFIG_INLINE_WRITE_LOCK is not set | ||
| 159 | # CONFIG_INLINE_WRITE_LOCK_BH is not set | ||
| 160 | # CONFIG_INLINE_WRITE_LOCK_IRQ is not set | ||
| 161 | # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set | ||
| 162 | # CONFIG_INLINE_WRITE_UNLOCK is not set | ||
| 163 | # CONFIG_INLINE_WRITE_UNLOCK_BH is not set | ||
| 164 | # CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set | ||
| 165 | # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set | ||
| 166 | # CONFIG_MUTEX_SPIN_ON_OWNER is not set | ||
| 134 | # CONFIG_FREEZER is not set | 167 | # CONFIG_FREEZER is not set |
| 135 | 168 | ||
| 136 | # | 169 | # |
| @@ -139,11 +172,6 @@ CONFIG_DEFAULT_IOSCHED="cfq" | |||
| 139 | CONFIG_PLATFORM_GENERIC=y | 172 | CONFIG_PLATFORM_GENERIC=y |
| 140 | CONFIG_OPT_LIB_FUNCTION=y | 173 | CONFIG_OPT_LIB_FUNCTION=y |
| 141 | CONFIG_OPT_LIB_ASM=y | 174 | CONFIG_OPT_LIB_ASM=y |
| 142 | CONFIG_ALLOW_EDIT_AUTO=y | ||
| 143 | |||
| 144 | # | ||
| 145 | # Automatic platform settings from Kconfig.auto | ||
| 146 | # | ||
| 147 | 175 | ||
| 148 | # | 176 | # |
| 149 | # Definitions for MICROBLAZE0 | 177 | # Definitions for MICROBLAZE0 |
| @@ -203,12 +231,11 @@ CONFIG_FLATMEM_MANUAL=y | |||
| 203 | CONFIG_FLATMEM=y | 231 | CONFIG_FLATMEM=y |
| 204 | CONFIG_FLAT_NODE_MEM_MAP=y | 232 | CONFIG_FLAT_NODE_MEM_MAP=y |
| 205 | CONFIG_PAGEFLAGS_EXTENDED=y | 233 | CONFIG_PAGEFLAGS_EXTENDED=y |
| 206 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 234 | CONFIG_SPLIT_PTLOCK_CPUS=999999 |
| 207 | # CONFIG_PHYS_ADDR_T_64BIT is not set | 235 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 208 | CONFIG_ZONE_DMA_FLAG=0 | 236 | CONFIG_ZONE_DMA_FLAG=0 |
| 209 | CONFIG_VIRT_TO_BUS=y | 237 | CONFIG_VIRT_TO_BUS=y |
| 210 | CONFIG_HAVE_MLOCK=y | 238 | # CONFIG_KSM is not set |
| 211 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | ||
| 212 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | 239 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 |
| 213 | 240 | ||
| 214 | # | 241 | # |
| @@ -289,7 +316,13 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 289 | # CONFIG_IRDA is not set | 316 | # CONFIG_IRDA is not set |
| 290 | # CONFIG_BT is not set | 317 | # CONFIG_BT is not set |
| 291 | # CONFIG_AF_RXRPC is not set | 318 | # CONFIG_AF_RXRPC is not set |
| 292 | # CONFIG_WIRELESS is not set | 319 | CONFIG_WIRELESS=y |
| 320 | # CONFIG_CFG80211 is not set | ||
| 321 | # CONFIG_LIB80211 is not set | ||
| 322 | |||
| 323 | # | ||
| 324 | # CFG80211 needs to be enabled for MAC80211 | ||
| 325 | # | ||
| 293 | # CONFIG_WIMAX is not set | 326 | # CONFIG_WIMAX is not set |
| 294 | # CONFIG_RFKILL is not set | 327 | # CONFIG_RFKILL is not set |
| 295 | # CONFIG_NET_9P is not set | 328 | # CONFIG_NET_9P is not set |
| @@ -313,6 +346,10 @@ CONFIG_OF_DEVICE=y | |||
| 313 | CONFIG_BLK_DEV=y | 346 | CONFIG_BLK_DEV=y |
| 314 | # CONFIG_BLK_DEV_COW_COMMON is not set | 347 | # CONFIG_BLK_DEV_COW_COMMON is not set |
| 315 | # CONFIG_BLK_DEV_LOOP is not set | 348 | # CONFIG_BLK_DEV_LOOP is not set |
| 349 | |||
| 350 | # | ||
| 351 | # DRBD disabled because PROC_FS, INET or CONNECTOR not selected | ||
| 352 | # | ||
| 316 | # CONFIG_BLK_DEV_NBD is not set | 353 | # CONFIG_BLK_DEV_NBD is not set |
| 317 | CONFIG_BLK_DEV_RAM=y | 354 | CONFIG_BLK_DEV_RAM=y |
| 318 | CONFIG_BLK_DEV_RAM_COUNT=16 | 355 | CONFIG_BLK_DEV_RAM_COUNT=16 |
| @@ -349,7 +386,6 @@ CONFIG_NETDEVICES=y | |||
| 349 | # CONFIG_PHYLIB is not set | 386 | # CONFIG_PHYLIB is not set |
| 350 | CONFIG_NET_ETHERNET=y | 387 | CONFIG_NET_ETHERNET=y |
| 351 | # CONFIG_MII is not set | 388 | # CONFIG_MII is not set |
| 352 | # CONFIG_ETHOC is not set | ||
| 353 | # CONFIG_DNET is not set | 389 | # CONFIG_DNET is not set |
| 354 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | 390 | # CONFIG_IBM_NEW_EMAC_ZMII is not set |
| 355 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 391 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| @@ -359,12 +395,12 @@ CONFIG_NET_ETHERNET=y | |||
| 359 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 395 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
| 360 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 396 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 361 | # CONFIG_KS8842 is not set | 397 | # CONFIG_KS8842 is not set |
| 398 | # CONFIG_KS8851_MLL is not set | ||
| 362 | CONFIG_XILINX_EMACLITE=y | 399 | CONFIG_XILINX_EMACLITE=y |
| 363 | CONFIG_NETDEV_1000=y | 400 | CONFIG_NETDEV_1000=y |
| 364 | CONFIG_NETDEV_10000=y | 401 | CONFIG_NETDEV_10000=y |
| 365 | CONFIG_WLAN=y | 402 | CONFIG_WLAN=y |
| 366 | # CONFIG_WLAN_PRE80211 is not set | 403 | # CONFIG_HOSTAP is not set |
| 367 | # CONFIG_WLAN_80211 is not set | ||
| 368 | 404 | ||
| 369 | # | 405 | # |
| 370 | # Enable WiMAX (Networking options) to see the WiMAX drivers | 406 | # Enable WiMAX (Networking options) to see the WiMAX drivers |
| @@ -408,6 +444,7 @@ CONFIG_SERIAL_UARTLITE=y | |||
| 408 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | 444 | CONFIG_SERIAL_UARTLITE_CONSOLE=y |
| 409 | CONFIG_SERIAL_CORE=y | 445 | CONFIG_SERIAL_CORE=y |
| 410 | CONFIG_SERIAL_CORE_CONSOLE=y | 446 | CONFIG_SERIAL_CORE_CONSOLE=y |
| 447 | # CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set | ||
| 411 | CONFIG_UNIX98_PTYS=y | 448 | CONFIG_UNIX98_PTYS=y |
| 412 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | 449 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set |
| 413 | CONFIG_LEGACY_PTYS=y | 450 | CONFIG_LEGACY_PTYS=y |
| @@ -433,7 +470,6 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | |||
| 433 | # CONFIG_POWER_SUPPLY is not set | 470 | # CONFIG_POWER_SUPPLY is not set |
| 434 | # CONFIG_HWMON is not set | 471 | # CONFIG_HWMON is not set |
| 435 | # CONFIG_THERMAL is not set | 472 | # CONFIG_THERMAL is not set |
| 436 | # CONFIG_THERMAL_HWMON is not set | ||
| 437 | # CONFIG_WATCHDOG is not set | 473 | # CONFIG_WATCHDOG is not set |
| 438 | 474 | ||
| 439 | # | 475 | # |
| @@ -526,8 +562,6 @@ CONFIG_PROC_FS=y | |||
| 526 | CONFIG_PROC_SYSCTL=y | 562 | CONFIG_PROC_SYSCTL=y |
| 527 | CONFIG_PROC_PAGE_MONITOR=y | 563 | CONFIG_PROC_PAGE_MONITOR=y |
| 528 | CONFIG_SYSFS=y | 564 | CONFIG_SYSFS=y |
| 529 | CONFIG_TMPFS=y | ||
| 530 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 531 | # CONFIG_HUGETLB_PAGE is not set | 565 | # CONFIG_HUGETLB_PAGE is not set |
| 532 | # CONFIG_CONFIGFS_FS is not set | 566 | # CONFIG_CONFIGFS_FS is not set |
| 533 | CONFIG_MISC_FILESYSTEMS=y | 567 | CONFIG_MISC_FILESYSTEMS=y |
| @@ -638,11 +672,13 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
| 638 | # | 672 | # |
| 639 | # Kernel hacking | 673 | # Kernel hacking |
| 640 | # | 674 | # |
| 675 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 641 | # CONFIG_PRINTK_TIME is not set | 676 | # CONFIG_PRINTK_TIME is not set |
| 642 | CONFIG_ENABLE_WARN_DEPRECATED=y | 677 | CONFIG_ENABLE_WARN_DEPRECATED=y |
| 643 | CONFIG_ENABLE_MUST_CHECK=y | 678 | CONFIG_ENABLE_MUST_CHECK=y |
| 644 | CONFIG_FRAME_WARN=1024 | 679 | CONFIG_FRAME_WARN=1024 |
| 645 | # CONFIG_MAGIC_SYSRQ is not set | 680 | # CONFIG_MAGIC_SYSRQ is not set |
| 681 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 646 | # CONFIG_UNUSED_SYMBOLS is not set | 682 | # CONFIG_UNUSED_SYMBOLS is not set |
| 647 | # CONFIG_DEBUG_FS is not set | 683 | # CONFIG_DEBUG_FS is not set |
| 648 | # CONFIG_HEADERS_CHECK is not set | 684 | # CONFIG_HEADERS_CHECK is not set |
| @@ -662,6 +698,9 @@ CONFIG_DEBUG_SLAB=y | |||
| 662 | # CONFIG_DEBUG_SLAB_LEAK is not set | 698 | # CONFIG_DEBUG_SLAB_LEAK is not set |
| 663 | CONFIG_DEBUG_SPINLOCK=y | 699 | CONFIG_DEBUG_SPINLOCK=y |
| 664 | # CONFIG_DEBUG_MUTEXES is not set | 700 | # CONFIG_DEBUG_MUTEXES is not set |
| 701 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 702 | # CONFIG_PROVE_LOCKING is not set | ||
| 703 | # CONFIG_LOCK_STAT is not set | ||
| 665 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 704 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
| 666 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 705 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
| 667 | # CONFIG_DEBUG_KOBJECT is not set | 706 | # CONFIG_DEBUG_KOBJECT is not set |
| @@ -680,10 +719,29 @@ CONFIG_DEBUG_INFO=y | |||
| 680 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | 719 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set |
| 681 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set | 720 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set |
| 682 | # CONFIG_FAULT_INJECTION is not set | 721 | # CONFIG_FAULT_INJECTION is not set |
| 722 | # CONFIG_LATENCYTOP is not set | ||
| 683 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set | 723 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set |
| 684 | # CONFIG_PAGE_POISONING is not set | 724 | # CONFIG_PAGE_POISONING is not set |
| 725 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
| 726 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 727 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 728 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
| 729 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
| 730 | CONFIG_TRACING_SUPPORT=y | ||
| 731 | CONFIG_FTRACE=y | ||
| 732 | # CONFIG_FUNCTION_TRACER is not set | ||
| 733 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 734 | # CONFIG_SCHED_TRACER is not set | ||
| 735 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set | ||
| 736 | # CONFIG_BOOT_TRACER is not set | ||
| 737 | CONFIG_BRANCH_PROFILE_NONE=y | ||
| 738 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
| 739 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
| 740 | # CONFIG_STACK_TRACER is not set | ||
| 741 | # CONFIG_KMEMTRACE is not set | ||
| 742 | # CONFIG_WORKQUEUE_TRACER is not set | ||
| 743 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 685 | # CONFIG_SAMPLES is not set | 744 | # CONFIG_SAMPLES is not set |
| 686 | # CONFIG_KMEMCHECK is not set | ||
| 687 | CONFIG_EARLY_PRINTK=y | 745 | CONFIG_EARLY_PRINTK=y |
| 688 | # CONFIG_HEART_BEAT is not set | 746 | # CONFIG_HEART_BEAT is not set |
| 689 | CONFIG_DEBUG_BOOTMEM=y | 747 | CONFIG_DEBUG_BOOTMEM=y |
| @@ -694,7 +752,11 @@ CONFIG_DEBUG_BOOTMEM=y | |||
| 694 | # CONFIG_KEYS is not set | 752 | # CONFIG_KEYS is not set |
| 695 | # CONFIG_SECURITY is not set | 753 | # CONFIG_SECURITY is not set |
| 696 | # CONFIG_SECURITYFS is not set | 754 | # CONFIG_SECURITYFS is not set |
| 697 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 755 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set |
| 756 | # CONFIG_DEFAULT_SECURITY_SMACK is not set | ||
| 757 | # CONFIG_DEFAULT_SECURITY_TOMOYO is not set | ||
| 758 | CONFIG_DEFAULT_SECURITY_DAC=y | ||
| 759 | CONFIG_DEFAULT_SECURITY="" | ||
| 698 | CONFIG_CRYPTO=y | 760 | CONFIG_CRYPTO=y |
| 699 | 761 | ||
| 700 | # | 762 | # |
diff --git a/arch/microblaze/configs/nommu_defconfig b/arch/microblaze/configs/nommu_defconfig index adb839bab704..ce2da535246a 100644 --- a/arch/microblaze/configs/nommu_defconfig +++ b/arch/microblaze/configs/nommu_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.31 | 3 | # Linux kernel version: 2.6.33-rc6 |
| 4 | # Thu Sep 24 10:29:43 2009 | 4 | # Wed Feb 3 10:03:21 2010 |
| 5 | # | 5 | # |
| 6 | CONFIG_MICROBLAZE=y | 6 | CONFIG_MICROBLAZE=y |
| 7 | # CONFIG_SWAP is not set | 7 | # CONFIG_SWAP is not set |
| @@ -19,8 +19,12 @@ CONFIG_GENERIC_CLOCKEVENTS=y | |||
| 19 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 19 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 20 | CONFIG_GENERIC_GPIO=y | 20 | CONFIG_GENERIC_GPIO=y |
| 21 | CONFIG_GENERIC_CSUM=y | 21 | CONFIG_GENERIC_CSUM=y |
| 22 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 23 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 24 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
| 22 | # CONFIG_PCI is not set | 25 | # CONFIG_PCI is not set |
| 23 | CONFIG_NO_DMA=y | 26 | CONFIG_NO_DMA=y |
| 27 | CONFIG_DTC=y | ||
| 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 25 | CONFIG_CONSTRUCTORS=y | 29 | CONFIG_CONSTRUCTORS=y |
| 26 | 30 | ||
| @@ -46,6 +50,7 @@ CONFIG_BSD_PROCESS_ACCT_V3=y | |||
| 46 | # | 50 | # |
| 47 | CONFIG_TREE_RCU=y | 51 | CONFIG_TREE_RCU=y |
| 48 | # CONFIG_TREE_PREEMPT_RCU is not set | 52 | # CONFIG_TREE_PREEMPT_RCU is not set |
| 53 | # CONFIG_TINY_RCU is not set | ||
| 49 | # CONFIG_RCU_TRACE is not set | 54 | # CONFIG_RCU_TRACE is not set |
| 50 | CONFIG_RCU_FANOUT=32 | 55 | CONFIG_RCU_FANOUT=32 |
| 51 | # CONFIG_RCU_FANOUT_EXACT is not set | 56 | # CONFIG_RCU_FANOUT_EXACT is not set |
| @@ -81,16 +86,16 @@ CONFIG_EVENTFD=y | |||
| 81 | CONFIG_AIO=y | 86 | CONFIG_AIO=y |
| 82 | 87 | ||
| 83 | # | 88 | # |
| 84 | # Performance Counters | 89 | # Kernel Performance Events And Counters |
| 85 | # | 90 | # |
| 86 | CONFIG_VM_EVENT_COUNTERS=y | 91 | CONFIG_VM_EVENT_COUNTERS=y |
| 87 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 88 | CONFIG_COMPAT_BRK=y | 92 | CONFIG_COMPAT_BRK=y |
| 89 | CONFIG_SLAB=y | 93 | CONFIG_SLAB=y |
| 90 | # CONFIG_SLUB is not set | 94 | # CONFIG_SLUB is not set |
| 91 | # CONFIG_SLOB is not set | 95 | # CONFIG_SLOB is not set |
| 96 | # CONFIG_MMAP_ALLOW_UNINITIALIZED is not set | ||
| 92 | # CONFIG_PROFILING is not set | 97 | # CONFIG_PROFILING is not set |
| 93 | # CONFIG_MARKERS is not set | 98 | CONFIG_HAVE_OPROFILE=y |
| 94 | 99 | ||
| 95 | # | 100 | # |
| 96 | # GCOV-based kernel profiling | 101 | # GCOV-based kernel profiling |
| @@ -116,14 +121,41 @@ CONFIG_LBDAF=y | |||
| 116 | # IO Schedulers | 121 | # IO Schedulers |
| 117 | # | 122 | # |
| 118 | CONFIG_IOSCHED_NOOP=y | 123 | CONFIG_IOSCHED_NOOP=y |
| 119 | CONFIG_IOSCHED_AS=y | ||
| 120 | CONFIG_IOSCHED_DEADLINE=y | 124 | CONFIG_IOSCHED_DEADLINE=y |
| 121 | CONFIG_IOSCHED_CFQ=y | 125 | CONFIG_IOSCHED_CFQ=y |
| 122 | # CONFIG_DEFAULT_AS is not set | ||
| 123 | # CONFIG_DEFAULT_DEADLINE is not set | 126 | # CONFIG_DEFAULT_DEADLINE is not set |
| 124 | CONFIG_DEFAULT_CFQ=y | 127 | CONFIG_DEFAULT_CFQ=y |
| 125 | # CONFIG_DEFAULT_NOOP is not set | 128 | # CONFIG_DEFAULT_NOOP is not set |
| 126 | CONFIG_DEFAULT_IOSCHED="cfq" | 129 | CONFIG_DEFAULT_IOSCHED="cfq" |
| 130 | # CONFIG_INLINE_SPIN_TRYLOCK is not set | ||
| 131 | # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set | ||
| 132 | # CONFIG_INLINE_SPIN_LOCK is not set | ||
| 133 | # CONFIG_INLINE_SPIN_LOCK_BH is not set | ||
| 134 | # CONFIG_INLINE_SPIN_LOCK_IRQ is not set | ||
| 135 | # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set | ||
| 136 | CONFIG_INLINE_SPIN_UNLOCK=y | ||
| 137 | # CONFIG_INLINE_SPIN_UNLOCK_BH is not set | ||
| 138 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y | ||
| 139 | # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set | ||
| 140 | # CONFIG_INLINE_READ_TRYLOCK is not set | ||
| 141 | # CONFIG_INLINE_READ_LOCK is not set | ||
| 142 | # CONFIG_INLINE_READ_LOCK_BH is not set | ||
| 143 | # CONFIG_INLINE_READ_LOCK_IRQ is not set | ||
| 144 | # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set | ||
| 145 | CONFIG_INLINE_READ_UNLOCK=y | ||
| 146 | # CONFIG_INLINE_READ_UNLOCK_BH is not set | ||
| 147 | CONFIG_INLINE_READ_UNLOCK_IRQ=y | ||
| 148 | # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set | ||
| 149 | # CONFIG_INLINE_WRITE_TRYLOCK is not set | ||
| 150 | # CONFIG_INLINE_WRITE_LOCK is not set | ||
| 151 | # CONFIG_INLINE_WRITE_LOCK_BH is not set | ||
| 152 | # CONFIG_INLINE_WRITE_LOCK_IRQ is not set | ||
| 153 | # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set | ||
| 154 | CONFIG_INLINE_WRITE_UNLOCK=y | ||
| 155 | # CONFIG_INLINE_WRITE_UNLOCK_BH is not set | ||
| 156 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y | ||
| 157 | # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set | ||
| 158 | # CONFIG_MUTEX_SPIN_ON_OWNER is not set | ||
| 127 | # CONFIG_FREEZER is not set | 159 | # CONFIG_FREEZER is not set |
| 128 | 160 | ||
| 129 | # | 161 | # |
| @@ -132,7 +164,10 @@ CONFIG_DEFAULT_IOSCHED="cfq" | |||
| 132 | CONFIG_PLATFORM_GENERIC=y | 164 | CONFIG_PLATFORM_GENERIC=y |
| 133 | # CONFIG_SELFMOD is not set | 165 | # CONFIG_SELFMOD is not set |
| 134 | # CONFIG_OPT_LIB_FUNCTION is not set | 166 | # CONFIG_OPT_LIB_FUNCTION is not set |
| 135 | # CONFIG_ALLOW_EDIT_AUTO is not set | 167 | |
| 168 | # | ||
| 169 | # Definitions for MICROBLAZE0 | ||
| 170 | # | ||
| 136 | CONFIG_KERNEL_BASE_ADDR=0x90000000 | 171 | CONFIG_KERNEL_BASE_ADDR=0x90000000 |
| 137 | CONFIG_XILINX_MICROBLAZE0_FAMILY="virtex5" | 172 | CONFIG_XILINX_MICROBLAZE0_FAMILY="virtex5" |
| 138 | CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1 | 173 | CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1 |
| @@ -190,7 +225,6 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 | |||
| 190 | # CONFIG_PHYS_ADDR_T_64BIT is not set | 225 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 191 | CONFIG_ZONE_DMA_FLAG=0 | 226 | CONFIG_ZONE_DMA_FLAG=0 |
| 192 | CONFIG_VIRT_TO_BUS=y | 227 | CONFIG_VIRT_TO_BUS=y |
| 193 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
| 194 | CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1 | 228 | CONFIG_NOMMU_INITIAL_TRIM_EXCESS=1 |
| 195 | 229 | ||
| 196 | # | 230 | # |
| @@ -274,9 +308,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
| 274 | # CONFIG_AF_RXRPC is not set | 308 | # CONFIG_AF_RXRPC is not set |
| 275 | CONFIG_WIRELESS=y | 309 | CONFIG_WIRELESS=y |
| 276 | # CONFIG_CFG80211 is not set | 310 | # CONFIG_CFG80211 is not set |
| 277 | CONFIG_CFG80211_DEFAULT_PS_VALUE=0 | ||
| 278 | CONFIG_WIRELESS_OLD_REGULATORY=y | ||
| 279 | # CONFIG_WIRELESS_EXT is not set | ||
| 280 | # CONFIG_LIB80211 is not set | 311 | # CONFIG_LIB80211 is not set |
| 281 | 312 | ||
| 282 | # | 313 | # |
| @@ -301,9 +332,9 @@ CONFIG_STANDALONE=y | |||
| 301 | # CONFIG_CONNECTOR is not set | 332 | # CONFIG_CONNECTOR is not set |
| 302 | CONFIG_MTD=y | 333 | CONFIG_MTD=y |
| 303 | # CONFIG_MTD_DEBUG is not set | 334 | # CONFIG_MTD_DEBUG is not set |
| 335 | # CONFIG_MTD_TESTS is not set | ||
| 304 | CONFIG_MTD_CONCAT=y | 336 | CONFIG_MTD_CONCAT=y |
| 305 | CONFIG_MTD_PARTITIONS=y | 337 | CONFIG_MTD_PARTITIONS=y |
| 306 | # CONFIG_MTD_TESTS is not set | ||
| 307 | # CONFIG_MTD_REDBOOT_PARTS is not set | 338 | # CONFIG_MTD_REDBOOT_PARTS is not set |
| 308 | CONFIG_MTD_CMDLINE_PARTS=y | 339 | CONFIG_MTD_CMDLINE_PARTS=y |
| 309 | # CONFIG_MTD_OF_PARTS is not set | 340 | # CONFIG_MTD_OF_PARTS is not set |
| @@ -387,6 +418,10 @@ CONFIG_OF_DEVICE=y | |||
| 387 | CONFIG_BLK_DEV=y | 418 | CONFIG_BLK_DEV=y |
| 388 | # CONFIG_BLK_DEV_COW_COMMON is not set | 419 | # CONFIG_BLK_DEV_COW_COMMON is not set |
| 389 | # CONFIG_BLK_DEV_LOOP is not set | 420 | # CONFIG_BLK_DEV_LOOP is not set |
| 421 | |||
| 422 | # | ||
| 423 | # DRBD disabled because PROC_FS, INET or CONNECTOR not selected | ||
| 424 | # | ||
| 390 | CONFIG_BLK_DEV_NBD=y | 425 | CONFIG_BLK_DEV_NBD=y |
| 391 | CONFIG_BLK_DEV_RAM=y | 426 | CONFIG_BLK_DEV_RAM=y |
| 392 | CONFIG_BLK_DEV_RAM_COUNT=16 | 427 | CONFIG_BLK_DEV_RAM_COUNT=16 |
| @@ -423,7 +458,6 @@ CONFIG_NETDEVICES=y | |||
| 423 | # CONFIG_PHYLIB is not set | 458 | # CONFIG_PHYLIB is not set |
| 424 | CONFIG_NET_ETHERNET=y | 459 | CONFIG_NET_ETHERNET=y |
| 425 | # CONFIG_MII is not set | 460 | # CONFIG_MII is not set |
| 426 | # CONFIG_ETHOC is not set | ||
| 427 | # CONFIG_DNET is not set | 461 | # CONFIG_DNET is not set |
| 428 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | 462 | # CONFIG_IBM_NEW_EMAC_ZMII is not set |
| 429 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 463 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| @@ -433,12 +467,12 @@ CONFIG_NET_ETHERNET=y | |||
| 433 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | 467 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set |
| 434 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 468 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
| 435 | # CONFIG_KS8842 is not set | 469 | # CONFIG_KS8842 is not set |
| 470 | # CONFIG_KS8851_MLL is not set | ||
| 436 | # CONFIG_XILINX_EMACLITE is not set | 471 | # CONFIG_XILINX_EMACLITE is not set |
| 437 | CONFIG_NETDEV_1000=y | 472 | CONFIG_NETDEV_1000=y |
| 438 | CONFIG_NETDEV_10000=y | 473 | CONFIG_NETDEV_10000=y |
| 439 | CONFIG_WLAN=y | 474 | CONFIG_WLAN=y |
| 440 | # CONFIG_WLAN_PRE80211 is not set | 475 | # CONFIG_HOSTAP is not set |
| 441 | # CONFIG_WLAN_80211 is not set | ||
| 442 | 476 | ||
| 443 | # | 477 | # |
| 444 | # Enable WiMAX (Networking options) to see the WiMAX drivers | 478 | # Enable WiMAX (Networking options) to see the WiMAX drivers |
| @@ -482,6 +516,7 @@ CONFIG_SERIAL_UARTLITE=y | |||
| 482 | CONFIG_SERIAL_UARTLITE_CONSOLE=y | 516 | CONFIG_SERIAL_UARTLITE_CONSOLE=y |
| 483 | CONFIG_SERIAL_CORE=y | 517 | CONFIG_SERIAL_CORE=y |
| 484 | CONFIG_SERIAL_CORE_CONSOLE=y | 518 | CONFIG_SERIAL_CORE_CONSOLE=y |
| 519 | # CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set | ||
| 485 | CONFIG_UNIX98_PTYS=y | 520 | CONFIG_UNIX98_PTYS=y |
| 486 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | 521 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set |
| 487 | CONFIG_LEGACY_PTYS=y | 522 | CONFIG_LEGACY_PTYS=y |
| @@ -508,7 +543,6 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | |||
| 508 | # CONFIG_POWER_SUPPLY is not set | 543 | # CONFIG_POWER_SUPPLY is not set |
| 509 | # CONFIG_HWMON is not set | 544 | # CONFIG_HWMON is not set |
| 510 | # CONFIG_THERMAL is not set | 545 | # CONFIG_THERMAL is not set |
| 511 | # CONFIG_THERMAL_HWMON is not set | ||
| 512 | # CONFIG_WATCHDOG is not set | 546 | # CONFIG_WATCHDOG is not set |
| 513 | 547 | ||
| 514 | # | 548 | # |
| @@ -616,7 +650,6 @@ CONFIG_INOTIFY_USER=y | |||
| 616 | CONFIG_PROC_FS=y | 650 | CONFIG_PROC_FS=y |
| 617 | CONFIG_PROC_SYSCTL=y | 651 | CONFIG_PROC_SYSCTL=y |
| 618 | CONFIG_SYSFS=y | 652 | CONFIG_SYSFS=y |
| 619 | # CONFIG_TMPFS is not set | ||
| 620 | # CONFIG_HUGETLB_PAGE is not set | 653 | # CONFIG_HUGETLB_PAGE is not set |
| 621 | # CONFIG_CONFIGFS_FS is not set | 654 | # CONFIG_CONFIGFS_FS is not set |
| 622 | CONFIG_MISC_FILESYSTEMS=y | 655 | CONFIG_MISC_FILESYSTEMS=y |
| @@ -672,11 +705,13 @@ CONFIG_MSDOS_PARTITION=y | |||
| 672 | # | 705 | # |
| 673 | # Kernel hacking | 706 | # Kernel hacking |
| 674 | # | 707 | # |
| 708 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 675 | # CONFIG_PRINTK_TIME is not set | 709 | # CONFIG_PRINTK_TIME is not set |
| 676 | CONFIG_ENABLE_WARN_DEPRECATED=y | 710 | CONFIG_ENABLE_WARN_DEPRECATED=y |
| 677 | CONFIG_ENABLE_MUST_CHECK=y | 711 | CONFIG_ENABLE_MUST_CHECK=y |
| 678 | CONFIG_FRAME_WARN=1024 | 712 | CONFIG_FRAME_WARN=1024 |
| 679 | # CONFIG_MAGIC_SYSRQ is not set | 713 | # CONFIG_MAGIC_SYSRQ is not set |
| 714 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 680 | CONFIG_UNUSED_SYMBOLS=y | 715 | CONFIG_UNUSED_SYMBOLS=y |
| 681 | CONFIG_DEBUG_FS=y | 716 | CONFIG_DEBUG_FS=y |
| 682 | # CONFIG_HEADERS_CHECK is not set | 717 | # CONFIG_HEADERS_CHECK is not set |
| @@ -695,12 +730,16 @@ CONFIG_DEBUG_OBJECTS=y | |||
| 695 | CONFIG_DEBUG_OBJECTS_SELFTEST=y | 730 | CONFIG_DEBUG_OBJECTS_SELFTEST=y |
| 696 | CONFIG_DEBUG_OBJECTS_FREE=y | 731 | CONFIG_DEBUG_OBJECTS_FREE=y |
| 697 | CONFIG_DEBUG_OBJECTS_TIMERS=y | 732 | CONFIG_DEBUG_OBJECTS_TIMERS=y |
| 733 | # CONFIG_DEBUG_OBJECTS_WORK is not set | ||
| 698 | CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 | 734 | CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 |
| 699 | # CONFIG_DEBUG_SLAB is not set | 735 | # CONFIG_DEBUG_SLAB is not set |
| 700 | # CONFIG_DEBUG_RT_MUTEXES is not set | 736 | # CONFIG_DEBUG_RT_MUTEXES is not set |
| 701 | # CONFIG_RT_MUTEX_TESTER is not set | 737 | # CONFIG_RT_MUTEX_TESTER is not set |
| 702 | # CONFIG_DEBUG_SPINLOCK is not set | 738 | # CONFIG_DEBUG_SPINLOCK is not set |
| 703 | # CONFIG_DEBUG_MUTEXES is not set | 739 | # CONFIG_DEBUG_MUTEXES is not set |
| 740 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 741 | # CONFIG_PROVE_LOCKING is not set | ||
| 742 | # CONFIG_LOCK_STAT is not set | ||
| 704 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 743 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
| 705 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 744 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
| 706 | # CONFIG_DEBUG_KOBJECT is not set | 745 | # CONFIG_DEBUG_KOBJECT is not set |
| @@ -720,8 +759,28 @@ CONFIG_DEBUG_SG=y | |||
| 720 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | 759 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set |
| 721 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set | 760 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set |
| 722 | # CONFIG_FAULT_INJECTION is not set | 761 | # CONFIG_FAULT_INJECTION is not set |
| 762 | # CONFIG_LATENCYTOP is not set | ||
| 723 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 763 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 724 | # CONFIG_PAGE_POISONING is not set | 764 | # CONFIG_PAGE_POISONING is not set |
| 765 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
| 766 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 767 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 768 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
| 769 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
| 770 | CONFIG_TRACING_SUPPORT=y | ||
| 771 | CONFIG_FTRACE=y | ||
| 772 | # CONFIG_FUNCTION_TRACER is not set | ||
| 773 | # CONFIG_IRQSOFF_TRACER is not set | ||
| 774 | # CONFIG_SCHED_TRACER is not set | ||
| 775 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set | ||
| 776 | # CONFIG_BOOT_TRACER is not set | ||
| 777 | CONFIG_BRANCH_PROFILE_NONE=y | ||
| 778 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
| 779 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
| 780 | # CONFIG_STACK_TRACER is not set | ||
| 781 | # CONFIG_KMEMTRACE is not set | ||
| 782 | # CONFIG_WORKQUEUE_TRACER is not set | ||
| 783 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 725 | # CONFIG_DYNAMIC_DEBUG is not set | 784 | # CONFIG_DYNAMIC_DEBUG is not set |
| 726 | # CONFIG_SAMPLES is not set | 785 | # CONFIG_SAMPLES is not set |
| 727 | CONFIG_EARLY_PRINTK=y | 786 | CONFIG_EARLY_PRINTK=y |
| @@ -734,7 +793,11 @@ CONFIG_EARLY_PRINTK=y | |||
| 734 | # CONFIG_KEYS is not set | 793 | # CONFIG_KEYS is not set |
| 735 | # CONFIG_SECURITY is not set | 794 | # CONFIG_SECURITY is not set |
| 736 | # CONFIG_SECURITYFS is not set | 795 | # CONFIG_SECURITYFS is not set |
| 737 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 796 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set |
| 797 | # CONFIG_DEFAULT_SECURITY_SMACK is not set | ||
| 798 | # CONFIG_DEFAULT_SECURITY_TOMOYO is not set | ||
| 799 | CONFIG_DEFAULT_SECURITY_DAC=y | ||
| 800 | CONFIG_DEFAULT_SECURITY="" | ||
| 738 | CONFIG_CRYPTO=y | 801 | CONFIG_CRYPTO=y |
| 739 | 802 | ||
| 740 | # | 803 | # |
diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index 95b0855802df..391d6197fc3b 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S | |||
| @@ -122,7 +122,7 @@ ENTRY(_interrupt) | |||
| 122 | 122 | ||
| 123 | ret_from_intr: | 123 | ret_from_intr: |
| 124 | lwi r11, r1, PT_MODE | 124 | lwi r11, r1, PT_MODE |
| 125 | bneid r11, 3f | 125 | bneid r11, no_intr_resched |
| 126 | 126 | ||
| 127 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ | 127 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ |
| 128 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ | 128 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ |
| @@ -133,16 +133,18 @@ ret_from_intr: | |||
| 133 | bralid r15, schedule | 133 | bralid r15, schedule |
| 134 | nop | 134 | nop |
| 135 | 1: andi r11, r19, _TIF_SIGPENDING | 135 | 1: andi r11, r19, _TIF_SIGPENDING |
| 136 | beqid r11, no_intr_reshed | 136 | beqid r11, no_intr_resched |
| 137 | addk r5, r1, r0 | 137 | addk r5, r1, r0 |
| 138 | addk r7, r0, r0 | 138 | addk r7, r0, r0 |
| 139 | bralid r15, do_signal | 139 | bralid r15, do_signal |
| 140 | addk r6, r0, r0 | 140 | addk r6, r0, r0 |
| 141 | 141 | ||
| 142 | no_intr_reshed: | 142 | no_intr_resched: |
| 143 | /* Disable interrupts, we are now committed to the state restore */ | ||
| 144 | disable_irq | ||
| 145 | |||
| 143 | /* save mode indicator */ | 146 | /* save mode indicator */ |
| 144 | lwi r11, r1, PT_MODE | 147 | lwi r11, r1, PT_MODE |
| 145 | 3: | ||
| 146 | swi r11, r0, PER_CPU(KM) | 148 | swi r11, r0, PER_CPU(KM) |
| 147 | 149 | ||
| 148 | /* save r31 */ | 150 | /* save r31 */ |
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index 5372b24ad049..bb8c4b9ccb80 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c | |||
| @@ -54,6 +54,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 54 | 54 | ||
| 55 | microblaze_cache_init(); | 55 | microblaze_cache_init(); |
| 56 | 56 | ||
| 57 | invalidate_dcache(); | ||
| 57 | enable_dcache(); | 58 | enable_dcache(); |
| 58 | 59 | ||
| 59 | invalidate_icache(); | 60 | invalidate_icache(); |
diff --git a/arch/mips/alchemy/common/dbdma.c b/arch/mips/alchemy/common/dbdma.c index 5c68569344c1..f9201ca2295b 100644 --- a/arch/mips/alchemy/common/dbdma.c +++ b/arch/mips/alchemy/common/dbdma.c | |||
| @@ -412,8 +412,11 @@ u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries) | |||
| 412 | if (desc_base == 0) | 412 | if (desc_base == 0) |
| 413 | return 0; | 413 | return 0; |
| 414 | 414 | ||
| 415 | ctp->cdb_membase = desc_base; | ||
| 415 | desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t)); | 416 | desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t)); |
| 416 | } | 417 | } else |
| 418 | ctp->cdb_membase = desc_base; | ||
| 419 | |||
| 417 | dp = (au1x_ddma_desc_t *)desc_base; | 420 | dp = (au1x_ddma_desc_t *)desc_base; |
| 418 | 421 | ||
| 419 | /* Keep track of the base descriptor. */ | 422 | /* Keep track of the base descriptor. */ |
| @@ -831,7 +834,7 @@ void au1xxx_dbdma_chan_free(u32 chanid) | |||
| 831 | 834 | ||
| 832 | au1xxx_dbdma_stop(chanid); | 835 | au1xxx_dbdma_stop(chanid); |
| 833 | 836 | ||
| 834 | kfree((void *)ctp->chan_desc_base); | 837 | kfree((void *)ctp->cdb_membase); |
| 835 | 838 | ||
| 836 | stp->dev_flags &= ~DEV_FLAGS_INUSE; | 839 | stp->dev_flags &= ~DEV_FLAGS_INUSE; |
| 837 | dtp->dev_flags &= ~DEV_FLAGS_INUSE; | 840 | dtp->dev_flags &= ~DEV_FLAGS_INUSE; |
diff --git a/arch/mips/ar7/platform.c b/arch/mips/ar7/platform.c index 85169c08d8dc..f70a10a8cc96 100644 --- a/arch/mips/ar7/platform.c +++ b/arch/mips/ar7/platform.c | |||
| @@ -202,7 +202,7 @@ static struct resource usb_res[] = { | |||
| 202 | .name = "mem", | 202 | .name = "mem", |
| 203 | .flags = IORESOURCE_MEM, | 203 | .flags = IORESOURCE_MEM, |
| 204 | .start = 0x03400000, | 204 | .start = 0x03400000, |
| 205 | .end = 0x034001fff, | 205 | .end = 0x03401fff, |
| 206 | }, | 206 | }, |
| 207 | }; | 207 | }; |
| 208 | 208 | ||
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index ed84b4cb3c8d..84b6503f10b9 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.23-rc2 | 3 | # Linux kernel version: 2.6.33-rc6 |
| 4 | # Tue Aug 7 13:04:24 2007 | 4 | # Wed Feb 3 18:12:31 2010 |
| 5 | # | 5 | # |
| 6 | CONFIG_MIPS=y | 6 | CONFIG_MIPS=y |
| 7 | 7 | ||
| @@ -9,20 +9,28 @@ CONFIG_MIPS=y | |||
| 9 | # Machine selection | 9 | # Machine selection |
| 10 | # | 10 | # |
| 11 | # CONFIG_MACH_ALCHEMY is not set | 11 | # CONFIG_MACH_ALCHEMY is not set |
| 12 | # CONFIG_AR7 is not set | ||
| 13 | # CONFIG_BCM47XX is not set | ||
| 14 | # CONFIG_BCM63XX is not set | ||
| 12 | # CONFIG_MIPS_COBALT is not set | 15 | # CONFIG_MIPS_COBALT is not set |
| 13 | # CONFIG_MACH_DECSTATION is not set | 16 | # CONFIG_MACH_DECSTATION is not set |
| 14 | # CONFIG_MACH_JAZZ is not set | 17 | # CONFIG_MACH_JAZZ is not set |
| 15 | # CONFIG_LEMOTE_FULONG is not set | 18 | # CONFIG_LASAT is not set |
| 19 | # CONFIG_MACH_LOONGSON is not set | ||
| 16 | # CONFIG_MIPS_MALTA is not set | 20 | # CONFIG_MIPS_MALTA is not set |
| 17 | # CONFIG_MIPS_SIM is not set | 21 | # CONFIG_MIPS_SIM is not set |
| 18 | # CONFIG_MARKEINS is not set | 22 | # CONFIG_NEC_MARKEINS is not set |
| 19 | # CONFIG_MACH_VR41XX is not set | 23 | # CONFIG_MACH_VR41XX is not set |
| 24 | # CONFIG_NXP_STB220 is not set | ||
| 25 | # CONFIG_NXP_STB225 is not set | ||
| 20 | # CONFIG_PNX8550_JBS is not set | 26 | # CONFIG_PNX8550_JBS is not set |
| 21 | # CONFIG_PNX8550_STB810 is not set | 27 | # CONFIG_PNX8550_STB810 is not set |
| 22 | # CONFIG_PMC_MSP is not set | 28 | # CONFIG_PMC_MSP is not set |
| 23 | # CONFIG_PMC_YOSEMITE is not set | 29 | # CONFIG_PMC_YOSEMITE is not set |
| 30 | # CONFIG_POWERTV is not set | ||
| 24 | # CONFIG_SGI_IP22 is not set | 31 | # CONFIG_SGI_IP22 is not set |
| 25 | CONFIG_SGI_IP27=y | 32 | CONFIG_SGI_IP27=y |
| 33 | # CONFIG_SGI_IP28 is not set | ||
| 26 | # CONFIG_SGI_IP32 is not set | 34 | # CONFIG_SGI_IP32 is not set |
| 27 | # CONFIG_SIBYTE_CRHINE is not set | 35 | # CONFIG_SIBYTE_CRHINE is not set |
| 28 | # CONFIG_SIBYTE_CARMEL is not set | 36 | # CONFIG_SIBYTE_CARMEL is not set |
| @@ -33,32 +41,39 @@ CONFIG_SGI_IP27=y | |||
| 33 | # CONFIG_SIBYTE_SENTOSA is not set | 41 | # CONFIG_SIBYTE_SENTOSA is not set |
| 34 | # CONFIG_SIBYTE_BIGSUR is not set | 42 | # CONFIG_SIBYTE_BIGSUR is not set |
| 35 | # CONFIG_SNI_RM is not set | 43 | # CONFIG_SNI_RM is not set |
| 36 | # CONFIG_TOSHIBA_JMR3927 is not set | 44 | # CONFIG_MACH_TX39XX is not set |
| 37 | # CONFIG_TOSHIBA_RBTX4927 is not set | 45 | # CONFIG_MACH_TX49XX is not set |
| 38 | # CONFIG_TOSHIBA_RBTX4938 is not set | 46 | # CONFIG_MIKROTIK_RB532 is not set |
| 39 | # CONFIG_WR_PPMC is not set | 47 | # CONFIG_WR_PPMC is not set |
| 48 | # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set | ||
| 49 | # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set | ||
| 50 | # CONFIG_ALCHEMY_GPIO_INDIRECT is not set | ||
| 40 | CONFIG_SGI_SN_M_MODE=y | 51 | CONFIG_SGI_SN_M_MODE=y |
| 41 | # CONFIG_SGI_SN_N_MODE is not set | 52 | # CONFIG_SGI_SN_N_MODE is not set |
| 42 | # CONFIG_MAPPED_KERNEL is not set | 53 | # CONFIG_MAPPED_KERNEL is not set |
| 43 | # CONFIG_REPLICATE_KTEXT is not set | 54 | # CONFIG_REPLICATE_KTEXT is not set |
| 44 | # CONFIG_REPLICATE_EXHANDLERS is not set | 55 | # CONFIG_REPLICATE_EXHANDLERS is not set |
| 56 | CONFIG_LOONGSON_UART_BASE=y | ||
| 45 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 57 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
| 46 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 58 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
| 47 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 59 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
| 60 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
| 48 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 61 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 49 | CONFIG_GENERIC_HWEIGHT=y | 62 | CONFIG_GENERIC_HWEIGHT=y |
| 50 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 63 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 64 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 51 | CONFIG_GENERIC_TIME=y | 65 | CONFIG_GENERIC_TIME=y |
| 52 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 66 | CONFIG_GENERIC_CMOS_UPDATE=y |
| 67 | CONFIG_SCHED_OMIT_FRAME_POINTER=y | ||
| 53 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 68 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
| 54 | CONFIG_ARC=y | 69 | CONFIG_ARC=y |
| 55 | CONFIG_DMA_COHERENT=y | 70 | CONFIG_DMA_COHERENT=y |
| 56 | CONFIG_EARLY_PRINTK=y | ||
| 57 | CONFIG_SYS_HAS_EARLY_PRINTK=y | 71 | CONFIG_SYS_HAS_EARLY_PRINTK=y |
| 58 | # CONFIG_NO_IOPORT is not set | 72 | # CONFIG_NO_IOPORT is not set |
| 59 | CONFIG_CPU_BIG_ENDIAN=y | 73 | CONFIG_CPU_BIG_ENDIAN=y |
| 60 | # CONFIG_CPU_LITTLE_ENDIAN is not set | 74 | # CONFIG_CPU_LITTLE_ENDIAN is not set |
| 61 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | 75 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y |
| 76 | CONFIG_DEFAULT_SGI_PARTITION=y | ||
| 62 | CONFIG_MIPS_L1_CACHE_SHIFT=7 | 77 | CONFIG_MIPS_L1_CACHE_SHIFT=7 |
| 63 | CONFIG_ARC64=y | 78 | CONFIG_ARC64=y |
| 64 | CONFIG_BOOT_ELF64=y | 79 | CONFIG_BOOT_ELF64=y |
| @@ -66,7 +81,8 @@ CONFIG_BOOT_ELF64=y | |||
| 66 | # | 81 | # |
| 67 | # CPU selection | 82 | # CPU selection |
| 68 | # | 83 | # |
| 69 | # CONFIG_CPU_LOONGSON2 is not set | 84 | # CONFIG_CPU_LOONGSON2E is not set |
| 85 | # CONFIG_CPU_LOONGSON2F is not set | ||
| 70 | # CONFIG_CPU_MIPS32_R1 is not set | 86 | # CONFIG_CPU_MIPS32_R1 is not set |
| 71 | # CONFIG_CPU_MIPS32_R2 is not set | 87 | # CONFIG_CPU_MIPS32_R2 is not set |
| 72 | # CONFIG_CPU_MIPS64_R1 is not set | 88 | # CONFIG_CPU_MIPS64_R1 is not set |
| @@ -79,6 +95,7 @@ CONFIG_BOOT_ELF64=y | |||
| 79 | # CONFIG_CPU_TX49XX is not set | 95 | # CONFIG_CPU_TX49XX is not set |
| 80 | # CONFIG_CPU_R5000 is not set | 96 | # CONFIG_CPU_R5000 is not set |
| 81 | # CONFIG_CPU_R5432 is not set | 97 | # CONFIG_CPU_R5432 is not set |
| 98 | # CONFIG_CPU_R5500 is not set | ||
| 82 | # CONFIG_CPU_R6000 is not set | 99 | # CONFIG_CPU_R6000 is not set |
| 83 | # CONFIG_CPU_NEVADA is not set | 100 | # CONFIG_CPU_NEVADA is not set |
| 84 | # CONFIG_CPU_R8000 is not set | 101 | # CONFIG_CPU_R8000 is not set |
| @@ -86,6 +103,7 @@ CONFIG_CPU_R10000=y | |||
| 86 | # CONFIG_CPU_RM7000 is not set | 103 | # CONFIG_CPU_RM7000 is not set |
| 87 | # CONFIG_CPU_RM9000 is not set | 104 | # CONFIG_CPU_RM9000 is not set |
| 88 | # CONFIG_CPU_SB1 is not set | 105 | # CONFIG_CPU_SB1 is not set |
| 106 | # CONFIG_CPU_CAVIUM_OCTEON is not set | ||
| 89 | CONFIG_SYS_HAS_CPU_R10000=y | 107 | CONFIG_SYS_HAS_CPU_R10000=y |
| 90 | CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y | 108 | CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y |
| 91 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | 109 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y |
| @@ -99,6 +117,7 @@ CONFIG_64BIT=y | |||
| 99 | CONFIG_PAGE_SIZE_4KB=y | 117 | CONFIG_PAGE_SIZE_4KB=y |
| 100 | # CONFIG_PAGE_SIZE_8KB is not set | 118 | # CONFIG_PAGE_SIZE_8KB is not set |
| 101 | # CONFIG_PAGE_SIZE_16KB is not set | 119 | # CONFIG_PAGE_SIZE_16KB is not set |
| 120 | # CONFIG_PAGE_SIZE_32KB is not set | ||
| 102 | # CONFIG_PAGE_SIZE_64KB is not set | 121 | # CONFIG_PAGE_SIZE_64KB is not set |
| 103 | CONFIG_CPU_HAS_PREFETCH=y | 122 | CONFIG_CPU_HAS_PREFETCH=y |
| 104 | CONFIG_MIPS_MT_DISABLED=y | 123 | CONFIG_MIPS_MT_DISABLED=y |
| @@ -110,6 +129,7 @@ CONFIG_GENERIC_IRQ_PROBE=y | |||
| 110 | CONFIG_IRQ_PER_CPU=y | 129 | CONFIG_IRQ_PER_CPU=y |
| 111 | CONFIG_CPU_SUPPORTS_HIGHMEM=y | 130 | CONFIG_CPU_SUPPORTS_HIGHMEM=y |
| 112 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y | 131 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y |
| 132 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 113 | CONFIG_NUMA=y | 133 | CONFIG_NUMA=y |
| 114 | CONFIG_SYS_SUPPORTS_NUMA=y | 134 | CONFIG_SYS_SUPPORTS_NUMA=y |
| 115 | CONFIG_NODES_SHIFT=6 | 135 | CONFIG_NODES_SHIFT=6 |
| @@ -120,16 +140,22 @@ CONFIG_DISCONTIGMEM_MANUAL=y | |||
| 120 | CONFIG_DISCONTIGMEM=y | 140 | CONFIG_DISCONTIGMEM=y |
| 121 | CONFIG_FLAT_NODE_MEM_MAP=y | 141 | CONFIG_FLAT_NODE_MEM_MAP=y |
| 122 | CONFIG_NEED_MULTIPLE_NODES=y | 142 | CONFIG_NEED_MULTIPLE_NODES=y |
| 123 | # CONFIG_SPARSEMEM_STATIC is not set | 143 | CONFIG_PAGEFLAGS_EXTENDED=y |
| 124 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 144 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 125 | CONFIG_MIGRATION=y | 145 | CONFIG_MIGRATION=y |
| 126 | CONFIG_RESOURCES_64BIT=y | 146 | CONFIG_PHYS_ADDR_T_64BIT=y |
| 127 | CONFIG_ZONE_DMA_FLAG=0 | 147 | CONFIG_ZONE_DMA_FLAG=0 |
| 128 | CONFIG_VIRT_TO_BUS=y | 148 | CONFIG_VIRT_TO_BUS=y |
| 149 | # CONFIG_KSM is not set | ||
| 150 | CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 | ||
| 129 | CONFIG_SMP=y | 151 | CONFIG_SMP=y |
| 130 | CONFIG_SYS_SUPPORTS_SMP=y | 152 | CONFIG_SYS_SUPPORTS_SMP=y |
| 131 | CONFIG_NR_CPUS_DEFAULT_64=y | 153 | CONFIG_NR_CPUS_DEFAULT_64=y |
| 132 | CONFIG_NR_CPUS=64 | 154 | CONFIG_NR_CPUS=64 |
| 155 | CONFIG_TICK_ONESHOT=y | ||
| 156 | CONFIG_NO_HZ=y | ||
| 157 | CONFIG_HIGH_RES_TIMERS=y | ||
| 158 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 133 | # CONFIG_HZ_48 is not set | 159 | # CONFIG_HZ_48 is not set |
| 134 | # CONFIG_HZ_100 is not set | 160 | # CONFIG_HZ_100 is not set |
| 135 | # CONFIG_HZ_128 is not set | 161 | # CONFIG_HZ_128 is not set |
| @@ -142,13 +168,13 @@ CONFIG_HZ=1000 | |||
| 142 | CONFIG_PREEMPT_NONE=y | 168 | CONFIG_PREEMPT_NONE=y |
| 143 | # CONFIG_PREEMPT_VOLUNTARY is not set | 169 | # CONFIG_PREEMPT_VOLUNTARY is not set |
| 144 | # CONFIG_PREEMPT is not set | 170 | # CONFIG_PREEMPT is not set |
| 145 | CONFIG_PREEMPT_BKL=y | ||
| 146 | # CONFIG_MIPS_INSANE_LARGE is not set | 171 | # CONFIG_MIPS_INSANE_LARGE is not set |
| 147 | # CONFIG_KEXEC is not set | 172 | # CONFIG_KEXEC is not set |
| 148 | CONFIG_SECCOMP=y | 173 | CONFIG_SECCOMP=y |
| 149 | CONFIG_LOCKDEP_SUPPORT=y | 174 | CONFIG_LOCKDEP_SUPPORT=y |
| 150 | CONFIG_STACKTRACE_SUPPORT=y | 175 | CONFIG_STACKTRACE_SUPPORT=y |
| 151 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 176 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 177 | CONFIG_CONSTRUCTORS=y | ||
| 152 | 178 | ||
| 153 | # | 179 | # |
| 154 | # General setup | 180 | # General setup |
| @@ -162,20 +188,41 @@ CONFIG_SWAP=y | |||
| 162 | CONFIG_SYSVIPC=y | 188 | CONFIG_SYSVIPC=y |
| 163 | CONFIG_SYSVIPC_SYSCTL=y | 189 | CONFIG_SYSVIPC_SYSCTL=y |
| 164 | CONFIG_POSIX_MQUEUE=y | 190 | CONFIG_POSIX_MQUEUE=y |
| 191 | CONFIG_POSIX_MQUEUE_SYSCTL=y | ||
| 165 | # CONFIG_BSD_PROCESS_ACCT is not set | 192 | # CONFIG_BSD_PROCESS_ACCT is not set |
| 166 | # CONFIG_TASKSTATS is not set | 193 | # CONFIG_TASKSTATS is not set |
| 167 | # CONFIG_USER_NS is not set | ||
| 168 | # CONFIG_AUDIT is not set | 194 | # CONFIG_AUDIT is not set |
| 195 | |||
| 196 | # | ||
| 197 | # RCU Subsystem | ||
| 198 | # | ||
| 199 | CONFIG_TREE_RCU=y | ||
| 200 | # CONFIG_TREE_PREEMPT_RCU is not set | ||
| 201 | # CONFIG_TINY_RCU is not set | ||
| 202 | # CONFIG_RCU_TRACE is not set | ||
| 203 | CONFIG_RCU_FANOUT=64 | ||
| 204 | # CONFIG_RCU_FANOUT_EXACT is not set | ||
| 205 | # CONFIG_TREE_RCU_TRACE is not set | ||
| 169 | CONFIG_IKCONFIG=y | 206 | CONFIG_IKCONFIG=y |
| 170 | CONFIG_IKCONFIG_PROC=y | 207 | CONFIG_IKCONFIG_PROC=y |
| 171 | CONFIG_LOG_BUF_SHIFT=15 | 208 | CONFIG_LOG_BUF_SHIFT=15 |
| 209 | # CONFIG_GROUP_SCHED is not set | ||
| 172 | CONFIG_CGROUPS=y | 210 | CONFIG_CGROUPS=y |
| 211 | # CONFIG_CGROUP_DEBUG is not set | ||
| 212 | # CONFIG_CGROUP_NS is not set | ||
| 213 | # CONFIG_CGROUP_FREEZER is not set | ||
| 214 | # CONFIG_CGROUP_DEVICE is not set | ||
| 173 | CONFIG_CPUSETS=y | 215 | CONFIG_CPUSETS=y |
| 174 | CONFIG_SYSFS_DEPRECATED=y | 216 | CONFIG_PROC_PID_CPUSET=y |
| 217 | # CONFIG_CGROUP_CPUACCT is not set | ||
| 218 | # CONFIG_RESOURCE_COUNTERS is not set | ||
| 219 | # CONFIG_SYSFS_DEPRECATED_V2 is not set | ||
| 175 | CONFIG_RELAY=y | 220 | CONFIG_RELAY=y |
| 221 | # CONFIG_NAMESPACES is not set | ||
| 176 | # CONFIG_BLK_DEV_INITRD is not set | 222 | # CONFIG_BLK_DEV_INITRD is not set |
| 177 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 223 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 178 | CONFIG_SYSCTL=y | 224 | CONFIG_SYSCTL=y |
| 225 | CONFIG_ANON_INODES=y | ||
| 179 | CONFIG_EMBEDDED=y | 226 | CONFIG_EMBEDDED=y |
| 180 | CONFIG_SYSCTL_SYSCALL=y | 227 | CONFIG_SYSCTL_SYSCALL=y |
| 181 | CONFIG_KALLSYMS=y | 228 | CONFIG_KALLSYMS=y |
| @@ -184,44 +231,92 @@ CONFIG_HOTPLUG=y | |||
| 184 | CONFIG_PRINTK=y | 231 | CONFIG_PRINTK=y |
| 185 | CONFIG_BUG=y | 232 | CONFIG_BUG=y |
| 186 | CONFIG_ELF_CORE=y | 233 | CONFIG_ELF_CORE=y |
| 234 | # CONFIG_PCSPKR_PLATFORM is not set | ||
| 187 | CONFIG_BASE_FULL=y | 235 | CONFIG_BASE_FULL=y |
| 188 | CONFIG_FUTEX=y | 236 | CONFIG_FUTEX=y |
| 189 | CONFIG_ANON_INODES=y | ||
| 190 | CONFIG_EPOLL=y | 237 | CONFIG_EPOLL=y |
| 191 | CONFIG_SIGNALFD=y | 238 | CONFIG_SIGNALFD=y |
| 192 | CONFIG_TIMERFD=y | 239 | CONFIG_TIMERFD=y |
| 193 | CONFIG_EVENTFD=y | 240 | CONFIG_EVENTFD=y |
| 194 | CONFIG_SHMEM=y | 241 | CONFIG_SHMEM=y |
| 242 | CONFIG_AIO=y | ||
| 243 | |||
| 244 | # | ||
| 245 | # Kernel Performance Events And Counters | ||
| 246 | # | ||
| 195 | CONFIG_VM_EVENT_COUNTERS=y | 247 | CONFIG_VM_EVENT_COUNTERS=y |
| 248 | CONFIG_PCI_QUIRKS=y | ||
| 249 | CONFIG_COMPAT_BRK=y | ||
| 196 | CONFIG_SLAB=y | 250 | CONFIG_SLAB=y |
| 197 | # CONFIG_SLUB is not set | 251 | # CONFIG_SLUB is not set |
| 198 | # CONFIG_SLOB is not set | 252 | # CONFIG_SLOB is not set |
| 253 | # CONFIG_PROFILING is not set | ||
| 254 | CONFIG_HAVE_OPROFILE=y | ||
| 255 | CONFIG_HAVE_SYSCALL_WRAPPERS=y | ||
| 256 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
| 257 | |||
| 258 | # | ||
| 259 | # GCOV-based kernel profiling | ||
| 260 | # | ||
| 261 | CONFIG_SLOW_WORK=y | ||
| 262 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
| 263 | CONFIG_SLABINFO=y | ||
| 199 | CONFIG_RT_MUTEXES=y | 264 | CONFIG_RT_MUTEXES=y |
| 200 | # CONFIG_TINY_SHMEM is not set | ||
| 201 | CONFIG_BASE_SMALL=0 | 265 | CONFIG_BASE_SMALL=0 |
| 202 | CONFIG_MODULES=y | 266 | CONFIG_MODULES=y |
| 267 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 203 | CONFIG_MODULE_UNLOAD=y | 268 | CONFIG_MODULE_UNLOAD=y |
| 204 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 269 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
| 205 | # CONFIG_MODVERSIONS is not set | 270 | # CONFIG_MODVERSIONS is not set |
| 206 | CONFIG_MODULE_SRCVERSION_ALL=y | 271 | CONFIG_MODULE_SRCVERSION_ALL=y |
| 207 | CONFIG_KMOD=y | ||
| 208 | CONFIG_STOP_MACHINE=y | 272 | CONFIG_STOP_MACHINE=y |
| 209 | CONFIG_BLOCK=y | 273 | CONFIG_BLOCK=y |
| 210 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 211 | # CONFIG_BLK_DEV_BSG is not set | 274 | # CONFIG_BLK_DEV_BSG is not set |
| 275 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
| 276 | # CONFIG_BLK_CGROUP is not set | ||
| 277 | CONFIG_BLOCK_COMPAT=y | ||
| 212 | 278 | ||
| 213 | # | 279 | # |
| 214 | # IO Schedulers | 280 | # IO Schedulers |
| 215 | # | 281 | # |
| 216 | CONFIG_IOSCHED_NOOP=y | 282 | CONFIG_IOSCHED_NOOP=y |
| 217 | CONFIG_IOSCHED_AS=y | ||
| 218 | CONFIG_IOSCHED_DEADLINE=y | 283 | CONFIG_IOSCHED_DEADLINE=y |
| 219 | CONFIG_IOSCHED_CFQ=y | 284 | CONFIG_IOSCHED_CFQ=y |
| 220 | CONFIG_DEFAULT_AS=y | 285 | # CONFIG_CFQ_GROUP_IOSCHED is not set |
| 221 | # CONFIG_DEFAULT_DEADLINE is not set | 286 | # CONFIG_DEFAULT_DEADLINE is not set |
| 222 | # CONFIG_DEFAULT_CFQ is not set | 287 | CONFIG_DEFAULT_CFQ=y |
| 223 | # CONFIG_DEFAULT_NOOP is not set | 288 | # CONFIG_DEFAULT_NOOP is not set |
| 224 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 289 | CONFIG_DEFAULT_IOSCHED="cfq" |
| 290 | # CONFIG_INLINE_SPIN_TRYLOCK is not set | ||
| 291 | # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set | ||
| 292 | # CONFIG_INLINE_SPIN_LOCK is not set | ||
| 293 | # CONFIG_INLINE_SPIN_LOCK_BH is not set | ||
| 294 | # CONFIG_INLINE_SPIN_LOCK_IRQ is not set | ||
| 295 | # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set | ||
| 296 | CONFIG_INLINE_SPIN_UNLOCK=y | ||
| 297 | # CONFIG_INLINE_SPIN_UNLOCK_BH is not set | ||
| 298 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y | ||
| 299 | # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set | ||
| 300 | # CONFIG_INLINE_READ_TRYLOCK is not set | ||
| 301 | # CONFIG_INLINE_READ_LOCK is not set | ||
| 302 | # CONFIG_INLINE_READ_LOCK_BH is not set | ||
| 303 | # CONFIG_INLINE_READ_LOCK_IRQ is not set | ||
| 304 | # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set | ||
| 305 | CONFIG_INLINE_READ_UNLOCK=y | ||
| 306 | # CONFIG_INLINE_READ_UNLOCK_BH is not set | ||
| 307 | CONFIG_INLINE_READ_UNLOCK_IRQ=y | ||
| 308 | # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set | ||
| 309 | # CONFIG_INLINE_WRITE_TRYLOCK is not set | ||
| 310 | # CONFIG_INLINE_WRITE_LOCK is not set | ||
| 311 | # CONFIG_INLINE_WRITE_LOCK_BH is not set | ||
| 312 | # CONFIG_INLINE_WRITE_LOCK_IRQ is not set | ||
| 313 | # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set | ||
| 314 | CONFIG_INLINE_WRITE_UNLOCK=y | ||
| 315 | # CONFIG_INLINE_WRITE_UNLOCK_BH is not set | ||
| 316 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y | ||
| 317 | # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set | ||
| 318 | CONFIG_MUTEX_SPIN_ON_OWNER=y | ||
| 319 | # CONFIG_FREEZER is not set | ||
| 225 | 320 | ||
| 226 | # | 321 | # |
| 227 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) | 322 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) |
| @@ -230,11 +325,10 @@ CONFIG_HW_HAS_PCI=y | |||
| 230 | CONFIG_PCI=y | 325 | CONFIG_PCI=y |
| 231 | CONFIG_PCI_DOMAINS=y | 326 | CONFIG_PCI_DOMAINS=y |
| 232 | # CONFIG_ARCH_SUPPORTS_MSI is not set | 327 | # CONFIG_ARCH_SUPPORTS_MSI is not set |
| 328 | # CONFIG_PCI_LEGACY is not set | ||
| 329 | # CONFIG_PCI_STUB is not set | ||
| 330 | # CONFIG_PCI_IOV is not set | ||
| 233 | CONFIG_MMU=y | 331 | CONFIG_MMU=y |
| 234 | |||
| 235 | # | ||
| 236 | # PCCARD (PCMCIA/CardBus) support | ||
| 237 | # | ||
| 238 | # CONFIG_PCCARD is not set | 332 | # CONFIG_PCCARD is not set |
| 239 | # CONFIG_HOTPLUG_PCI is not set | 333 | # CONFIG_HOTPLUG_PCI is not set |
| 240 | 334 | ||
| @@ -242,8 +336,9 @@ CONFIG_MMU=y | |||
| 242 | # Executable file formats | 336 | # Executable file formats |
| 243 | # | 337 | # |
| 244 | CONFIG_BINFMT_ELF=y | 338 | CONFIG_BINFMT_ELF=y |
| 339 | CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | ||
| 340 | # CONFIG_HAVE_AOUT is not set | ||
| 245 | # CONFIG_BINFMT_MISC is not set | 341 | # CONFIG_BINFMT_MISC is not set |
| 246 | # CONFIG_BUILD_ELF64 is not set | ||
| 247 | CONFIG_MIPS32_COMPAT=y | 342 | CONFIG_MIPS32_COMPAT=y |
| 248 | CONFIG_COMPAT=y | 343 | CONFIG_COMPAT=y |
| 249 | CONFIG_SYSVIPC_COMPAT=y | 344 | CONFIG_SYSVIPC_COMPAT=y |
| @@ -255,13 +350,10 @@ CONFIG_BINFMT_ELF32=y | |||
| 255 | # Power management options | 350 | # Power management options |
| 256 | # | 351 | # |
| 257 | CONFIG_PM=y | 352 | CONFIG_PM=y |
| 258 | # CONFIG_PM_LEGACY is not set | ||
| 259 | # CONFIG_PM_DEBUG is not set | 353 | # CONFIG_PM_DEBUG is not set |
| 260 | 354 | # CONFIG_PM_RUNTIME is not set | |
| 261 | # | ||
| 262 | # Networking | ||
| 263 | # | ||
| 264 | CONFIG_NET=y | 355 | CONFIG_NET=y |
| 356 | CONFIG_COMPAT_NETLINK_MESSAGES=y | ||
| 265 | 357 | ||
| 266 | # | 358 | # |
| 267 | # Networking options | 359 | # Networking options |
| @@ -273,6 +365,8 @@ CONFIG_XFRM=y | |||
| 273 | CONFIG_XFRM_USER=m | 365 | CONFIG_XFRM_USER=m |
| 274 | # CONFIG_XFRM_SUB_POLICY is not set | 366 | # CONFIG_XFRM_SUB_POLICY is not set |
| 275 | CONFIG_XFRM_MIGRATE=y | 367 | CONFIG_XFRM_MIGRATE=y |
| 368 | CONFIG_XFRM_STATISTICS=y | ||
| 369 | CONFIG_XFRM_IPCOMP=m | ||
| 276 | CONFIG_NET_KEY=y | 370 | CONFIG_NET_KEY=y |
| 277 | CONFIG_NET_KEY_MIGRATE=y | 371 | CONFIG_NET_KEY_MIGRATE=y |
| 278 | CONFIG_INET=y | 372 | CONFIG_INET=y |
| @@ -292,19 +386,40 @@ CONFIG_IP_PNP=y | |||
| 292 | # CONFIG_INET_ESP is not set | 386 | # CONFIG_INET_ESP is not set |
| 293 | # CONFIG_INET_IPCOMP is not set | 387 | # CONFIG_INET_IPCOMP is not set |
| 294 | # CONFIG_INET_XFRM_TUNNEL is not set | 388 | # CONFIG_INET_XFRM_TUNNEL is not set |
| 295 | # CONFIG_INET_TUNNEL is not set | 389 | CONFIG_INET_TUNNEL=m |
| 296 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | 390 | CONFIG_INET_XFRM_MODE_TRANSPORT=m |
| 297 | CONFIG_INET_XFRM_MODE_TUNNEL=m | 391 | CONFIG_INET_XFRM_MODE_TUNNEL=m |
| 298 | CONFIG_INET_XFRM_MODE_BEET=m | 392 | CONFIG_INET_XFRM_MODE_BEET=m |
| 393 | CONFIG_INET_LRO=y | ||
| 299 | CONFIG_INET_DIAG=y | 394 | CONFIG_INET_DIAG=y |
| 300 | CONFIG_INET_TCP_DIAG=y | 395 | CONFIG_INET_TCP_DIAG=y |
| 301 | # CONFIG_TCP_CONG_ADVANCED is not set | 396 | # CONFIG_TCP_CONG_ADVANCED is not set |
| 302 | CONFIG_TCP_CONG_CUBIC=y | 397 | CONFIG_TCP_CONG_CUBIC=y |
| 303 | CONFIG_DEFAULT_TCP_CONG="cubic" | 398 | CONFIG_DEFAULT_TCP_CONG="cubic" |
| 304 | CONFIG_TCP_MD5SIG=y | 399 | CONFIG_TCP_MD5SIG=y |
| 305 | # CONFIG_IPV6 is not set | 400 | CONFIG_IPV6=y |
| 306 | # CONFIG_INET6_XFRM_TUNNEL is not set | 401 | CONFIG_IPV6_PRIVACY=y |
| 307 | # CONFIG_INET6_TUNNEL is not set | 402 | CONFIG_IPV6_ROUTER_PREF=y |
| 403 | CONFIG_IPV6_ROUTE_INFO=y | ||
| 404 | CONFIG_IPV6_OPTIMISTIC_DAD=y | ||
| 405 | CONFIG_INET6_AH=m | ||
| 406 | CONFIG_INET6_ESP=m | ||
| 407 | CONFIG_INET6_IPCOMP=m | ||
| 408 | CONFIG_IPV6_MIP6=m | ||
| 409 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 410 | CONFIG_INET6_TUNNEL=m | ||
| 411 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 412 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 413 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 414 | CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m | ||
| 415 | CONFIG_IPV6_SIT=m | ||
| 416 | CONFIG_IPV6_SIT_6RD=y | ||
| 417 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
| 418 | CONFIG_IPV6_TUNNEL=m | ||
| 419 | CONFIG_IPV6_MULTIPLE_TABLES=y | ||
| 420 | CONFIG_IPV6_SUBTREES=y | ||
| 421 | CONFIG_IPV6_MROUTE=y | ||
| 422 | CONFIG_IPV6_PIMSM_V2=y | ||
| 308 | CONFIG_NETWORK_SECMARK=y | 423 | CONFIG_NETWORK_SECMARK=y |
| 309 | # CONFIG_NETFILTER is not set | 424 | # CONFIG_NETFILTER is not set |
| 310 | # CONFIG_IP_DCCP is not set | 425 | # CONFIG_IP_DCCP is not set |
| @@ -314,9 +429,11 @@ CONFIG_IP_SCTP=m | |||
| 314 | # CONFIG_SCTP_HMAC_NONE is not set | 429 | # CONFIG_SCTP_HMAC_NONE is not set |
| 315 | # CONFIG_SCTP_HMAC_SHA1 is not set | 430 | # CONFIG_SCTP_HMAC_SHA1 is not set |
| 316 | CONFIG_SCTP_HMAC_MD5=y | 431 | CONFIG_SCTP_HMAC_MD5=y |
| 432 | # CONFIG_RDS is not set | ||
| 317 | # CONFIG_TIPC is not set | 433 | # CONFIG_TIPC is not set |
| 318 | # CONFIG_ATM is not set | 434 | # CONFIG_ATM is not set |
| 319 | # CONFIG_BRIDGE is not set | 435 | # CONFIG_BRIDGE is not set |
| 436 | # CONFIG_NET_DSA is not set | ||
| 320 | # CONFIG_VLAN_8021Q is not set | 437 | # CONFIG_VLAN_8021Q is not set |
| 321 | # CONFIG_DECNET is not set | 438 | # CONFIG_DECNET is not set |
| 322 | # CONFIG_LLC2 is not set | 439 | # CONFIG_LLC2 is not set |
| @@ -326,12 +443,9 @@ CONFIG_SCTP_HMAC_MD5=y | |||
| 326 | # CONFIG_LAPB is not set | 443 | # CONFIG_LAPB is not set |
| 327 | # CONFIG_ECONET is not set | 444 | # CONFIG_ECONET is not set |
| 328 | # CONFIG_WAN_ROUTER is not set | 445 | # CONFIG_WAN_ROUTER is not set |
| 329 | 446 | # CONFIG_PHONET is not set | |
| 330 | # | 447 | # CONFIG_IEEE802154 is not set |
| 331 | # QoS and/or fair queueing | ||
| 332 | # | ||
| 333 | CONFIG_NET_SCHED=y | 448 | CONFIG_NET_SCHED=y |
| 334 | CONFIG_NET_SCH_FIFO=y | ||
| 335 | 449 | ||
| 336 | # | 450 | # |
| 337 | # Queueing/Scheduling | 451 | # Queueing/Scheduling |
| @@ -340,7 +454,7 @@ CONFIG_NET_SCH_CBQ=m | |||
| 340 | CONFIG_NET_SCH_HTB=m | 454 | CONFIG_NET_SCH_HTB=m |
| 341 | CONFIG_NET_SCH_HFSC=m | 455 | CONFIG_NET_SCH_HFSC=m |
| 342 | CONFIG_NET_SCH_PRIO=m | 456 | CONFIG_NET_SCH_PRIO=m |
| 343 | CONFIG_NET_SCH_RR=m | 457 | CONFIG_NET_SCH_MULTIQ=y |
| 344 | CONFIG_NET_SCH_RED=m | 458 | CONFIG_NET_SCH_RED=m |
| 345 | CONFIG_NET_SCH_SFQ=m | 459 | CONFIG_NET_SCH_SFQ=m |
| 346 | CONFIG_NET_SCH_TEQL=m | 460 | CONFIG_NET_SCH_TEQL=m |
| @@ -348,6 +462,7 @@ CONFIG_NET_SCH_TBF=m | |||
| 348 | CONFIG_NET_SCH_GRED=m | 462 | CONFIG_NET_SCH_GRED=m |
| 349 | CONFIG_NET_SCH_DSMARK=m | 463 | CONFIG_NET_SCH_DSMARK=m |
| 350 | CONFIG_NET_SCH_NETEM=m | 464 | CONFIG_NET_SCH_NETEM=m |
| 465 | # CONFIG_NET_SCH_DRR is not set | ||
| 351 | CONFIG_NET_SCH_INGRESS=m | 466 | CONFIG_NET_SCH_INGRESS=m |
| 352 | 467 | ||
| 353 | # | 468 | # |
| @@ -364,41 +479,63 @@ CONFIG_NET_CLS_U32=m | |||
| 364 | CONFIG_CLS_U32_MARK=y | 479 | CONFIG_CLS_U32_MARK=y |
| 365 | CONFIG_NET_CLS_RSVP=m | 480 | CONFIG_NET_CLS_RSVP=m |
| 366 | CONFIG_NET_CLS_RSVP6=m | 481 | CONFIG_NET_CLS_RSVP6=m |
| 482 | CONFIG_NET_CLS_FLOW=m | ||
| 483 | CONFIG_NET_CLS_CGROUP=y | ||
| 367 | # CONFIG_NET_EMATCH is not set | 484 | # CONFIG_NET_EMATCH is not set |
| 368 | CONFIG_NET_CLS_ACT=y | 485 | CONFIG_NET_CLS_ACT=y |
| 369 | CONFIG_NET_ACT_POLICE=y | 486 | CONFIG_NET_ACT_POLICE=y |
| 370 | CONFIG_NET_ACT_GACT=m | 487 | CONFIG_NET_ACT_GACT=m |
| 371 | CONFIG_GACT_PROB=y | 488 | CONFIG_GACT_PROB=y |
| 372 | CONFIG_NET_ACT_MIRRED=m | 489 | CONFIG_NET_ACT_MIRRED=m |
| 490 | CONFIG_NET_ACT_NAT=m | ||
| 373 | CONFIG_NET_ACT_PEDIT=m | 491 | CONFIG_NET_ACT_PEDIT=m |
| 374 | # CONFIG_NET_ACT_SIMP is not set | 492 | # CONFIG_NET_ACT_SIMP is not set |
| 375 | CONFIG_NET_CLS_POLICE=y | 493 | CONFIG_NET_ACT_SKBEDIT=m |
| 376 | # CONFIG_NET_CLS_IND is not set | 494 | # CONFIG_NET_CLS_IND is not set |
| 495 | CONFIG_NET_SCH_FIFO=y | ||
| 496 | # CONFIG_DCB is not set | ||
| 377 | 497 | ||
| 378 | # | 498 | # |
| 379 | # Network testing | 499 | # Network testing |
| 380 | # | 500 | # |
| 381 | # CONFIG_NET_PKTGEN is not set | 501 | # CONFIG_NET_PKTGEN is not set |
| 382 | # CONFIG_HAMRADIO is not set | 502 | # CONFIG_HAMRADIO is not set |
| 503 | # CONFIG_CAN is not set | ||
| 383 | # CONFIG_IRDA is not set | 504 | # CONFIG_IRDA is not set |
| 384 | # CONFIG_BT is not set | 505 | # CONFIG_BT is not set |
| 385 | # CONFIG_AF_RXRPC is not set | 506 | # CONFIG_AF_RXRPC is not set |
| 386 | 507 | CONFIG_FIB_RULES=y | |
| 387 | # | 508 | CONFIG_WIRELESS=y |
| 388 | # Wireless | ||
| 389 | # | ||
| 390 | CONFIG_CFG80211=m | ||
| 391 | CONFIG_WIRELESS_EXT=y | 509 | CONFIG_WIRELESS_EXT=y |
| 510 | CONFIG_WEXT_CORE=y | ||
| 511 | CONFIG_WEXT_PROC=y | ||
| 512 | CONFIG_WEXT_SPY=y | ||
| 513 | CONFIG_WEXT_PRIV=y | ||
| 514 | CONFIG_CFG80211=m | ||
| 515 | # CONFIG_NL80211_TESTMODE is not set | ||
| 516 | # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set | ||
| 517 | # CONFIG_CFG80211_REG_DEBUG is not set | ||
| 518 | CONFIG_CFG80211_DEFAULT_PS=y | ||
| 519 | # CONFIG_WIRELESS_OLD_REGULATORY is not set | ||
| 520 | CONFIG_CFG80211_WEXT=y | ||
| 521 | CONFIG_WIRELESS_EXT_SYSFS=y | ||
| 522 | CONFIG_LIB80211=m | ||
| 523 | CONFIG_LIB80211_CRYPT_WEP=m | ||
| 524 | CONFIG_LIB80211_CRYPT_CCMP=m | ||
| 525 | CONFIG_LIB80211_CRYPT_TKIP=m | ||
| 526 | # CONFIG_LIB80211_DEBUG is not set | ||
| 392 | CONFIG_MAC80211=m | 527 | CONFIG_MAC80211=m |
| 393 | # CONFIG_MAC80211_DEBUG is not set | 528 | CONFIG_MAC80211_RC_PID=y |
| 394 | CONFIG_IEEE80211=m | 529 | CONFIG_MAC80211_RC_MINSTREL=y |
| 395 | # CONFIG_IEEE80211_DEBUG is not set | 530 | # CONFIG_MAC80211_RC_DEFAULT_PID is not set |
| 396 | CONFIG_IEEE80211_CRYPT_WEP=m | 531 | CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y |
| 397 | CONFIG_IEEE80211_CRYPT_CCMP=m | 532 | CONFIG_MAC80211_RC_DEFAULT="minstrel" |
| 398 | CONFIG_IEEE80211_CRYPT_TKIP=m | 533 | # CONFIG_MAC80211_MESH is not set |
| 399 | CONFIG_IEEE80211_SOFTMAC=m | 534 | CONFIG_MAC80211_LEDS=y |
| 400 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | 535 | # CONFIG_MAC80211_DEBUG_MENU is not set |
| 536 | # CONFIG_WIMAX is not set | ||
| 401 | CONFIG_RFKILL=m | 537 | CONFIG_RFKILL=m |
| 538 | CONFIG_RFKILL_LEDS=y | ||
| 402 | # CONFIG_NET_9P is not set | 539 | # CONFIG_NET_9P is not set |
| 403 | 540 | ||
| 404 | # | 541 | # |
| @@ -408,9 +545,13 @@ CONFIG_RFKILL=m | |||
| 408 | # | 545 | # |
| 409 | # Generic Driver Options | 546 | # Generic Driver Options |
| 410 | # | 547 | # |
| 548 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 549 | # CONFIG_DEVTMPFS is not set | ||
| 411 | CONFIG_STANDALONE=y | 550 | CONFIG_STANDALONE=y |
| 412 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 551 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
| 413 | CONFIG_FW_LOADER=y | 552 | CONFIG_FW_LOADER=y |
| 553 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
| 554 | CONFIG_EXTRA_FIRMWARE="" | ||
| 414 | # CONFIG_SYS_HYPERVISOR is not set | 555 | # CONFIG_SYS_HYPERVISOR is not set |
| 415 | CONFIG_CONNECTOR=m | 556 | CONFIG_CONNECTOR=m |
| 416 | # CONFIG_MTD is not set | 557 | # CONFIG_MTD is not set |
| @@ -423,14 +564,19 @@ CONFIG_BLK_DEV=y | |||
| 423 | # CONFIG_BLK_DEV_COW_COMMON is not set | 564 | # CONFIG_BLK_DEV_COW_COMMON is not set |
| 424 | CONFIG_BLK_DEV_LOOP=y | 565 | CONFIG_BLK_DEV_LOOP=y |
| 425 | CONFIG_BLK_DEV_CRYPTOLOOP=m | 566 | CONFIG_BLK_DEV_CRYPTOLOOP=m |
| 567 | # CONFIG_BLK_DEV_DRBD is not set | ||
| 426 | # CONFIG_BLK_DEV_NBD is not set | 568 | # CONFIG_BLK_DEV_NBD is not set |
| 569 | CONFIG_BLK_DEV_OSD=m | ||
| 427 | # CONFIG_BLK_DEV_SX8 is not set | 570 | # CONFIG_BLK_DEV_SX8 is not set |
| 428 | # CONFIG_BLK_DEV_RAM is not set | 571 | # CONFIG_BLK_DEV_RAM is not set |
| 429 | CONFIG_CDROM_PKTCDVD=m | 572 | CONFIG_CDROM_PKTCDVD=m |
| 430 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | 573 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 |
| 431 | # CONFIG_CDROM_PKTCDVD_WCACHE is not set | 574 | # CONFIG_CDROM_PKTCDVD_WCACHE is not set |
| 432 | CONFIG_ATA_OVER_ETH=m | 575 | CONFIG_ATA_OVER_ETH=m |
| 576 | # CONFIG_BLK_DEV_HD is not set | ||
| 433 | # CONFIG_MISC_DEVICES is not set | 577 | # CONFIG_MISC_DEVICES is not set |
| 578 | CONFIG_EEPROM_93CX6=m | ||
| 579 | CONFIG_HAVE_IDE=y | ||
| 434 | # CONFIG_IDE is not set | 580 | # CONFIG_IDE is not set |
| 435 | 581 | ||
| 436 | # | 582 | # |
| @@ -453,10 +599,6 @@ CONFIG_BLK_DEV_SR=m | |||
| 453 | CONFIG_BLK_DEV_SR_VENDOR=y | 599 | CONFIG_BLK_DEV_SR_VENDOR=y |
| 454 | CONFIG_CHR_DEV_SG=m | 600 | CONFIG_CHR_DEV_SG=m |
| 455 | CONFIG_CHR_DEV_SCH=m | 601 | CONFIG_CHR_DEV_SCH=m |
| 456 | |||
| 457 | # | ||
| 458 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 459 | # | ||
| 460 | # CONFIG_SCSI_MULTI_LUN is not set | 602 | # CONFIG_SCSI_MULTI_LUN is not set |
| 461 | CONFIG_SCSI_CONSTANTS=y | 603 | CONFIG_SCSI_CONSTANTS=y |
| 462 | CONFIG_SCSI_LOGGING=y | 604 | CONFIG_SCSI_LOGGING=y |
| @@ -471,11 +613,18 @@ CONFIG_SCSI_FC_ATTRS=y | |||
| 471 | CONFIG_SCSI_ISCSI_ATTRS=m | 613 | CONFIG_SCSI_ISCSI_ATTRS=m |
| 472 | CONFIG_SCSI_SAS_ATTRS=m | 614 | CONFIG_SCSI_SAS_ATTRS=m |
| 473 | CONFIG_SCSI_SAS_LIBSAS=m | 615 | CONFIG_SCSI_SAS_LIBSAS=m |
| 616 | CONFIG_SCSI_SAS_HOST_SMP=y | ||
| 474 | # CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set | 617 | # CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set |
| 618 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 475 | CONFIG_SCSI_LOWLEVEL=y | 619 | CONFIG_SCSI_LOWLEVEL=y |
| 476 | # CONFIG_ISCSI_TCP is not set | 620 | # CONFIG_ISCSI_TCP is not set |
| 621 | CONFIG_SCSI_CXGB3_ISCSI=m | ||
| 622 | CONFIG_SCSI_BNX2_ISCSI=m | ||
| 623 | CONFIG_BE2ISCSI=m | ||
| 477 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 624 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
| 625 | CONFIG_SCSI_HPSA=m | ||
| 478 | # CONFIG_SCSI_3W_9XXX is not set | 626 | # CONFIG_SCSI_3W_9XXX is not set |
| 627 | CONFIG_SCSI_3W_SAS=m | ||
| 479 | # CONFIG_SCSI_ACARD is not set | 628 | # CONFIG_SCSI_ACARD is not set |
| 480 | # CONFIG_SCSI_AACRAID is not set | 629 | # CONFIG_SCSI_AACRAID is not set |
| 481 | # CONFIG_SCSI_AIC7XXX is not set | 630 | # CONFIG_SCSI_AIC7XXX is not set |
| @@ -483,11 +632,21 @@ CONFIG_SCSI_LOWLEVEL=y | |||
| 483 | # CONFIG_SCSI_AIC79XX is not set | 632 | # CONFIG_SCSI_AIC79XX is not set |
| 484 | CONFIG_SCSI_AIC94XX=m | 633 | CONFIG_SCSI_AIC94XX=m |
| 485 | # CONFIG_AIC94XX_DEBUG is not set | 634 | # CONFIG_AIC94XX_DEBUG is not set |
| 635 | CONFIG_SCSI_MVSAS=m | ||
| 636 | # CONFIG_SCSI_MVSAS_DEBUG is not set | ||
| 637 | CONFIG_SCSI_DPT_I2O=m | ||
| 638 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 486 | # CONFIG_SCSI_ARCMSR is not set | 639 | # CONFIG_SCSI_ARCMSR is not set |
| 487 | # CONFIG_MEGARAID_NEWGEN is not set | 640 | # CONFIG_MEGARAID_NEWGEN is not set |
| 488 | # CONFIG_MEGARAID_LEGACY is not set | 641 | # CONFIG_MEGARAID_LEGACY is not set |
| 489 | # CONFIG_MEGARAID_SAS is not set | 642 | # CONFIG_MEGARAID_SAS is not set |
| 643 | CONFIG_SCSI_MPT2SAS=m | ||
| 644 | CONFIG_SCSI_MPT2SAS_MAX_SGE=128 | ||
| 645 | # CONFIG_SCSI_MPT2SAS_LOGGING is not set | ||
| 490 | # CONFIG_SCSI_HPTIOP is not set | 646 | # CONFIG_SCSI_HPTIOP is not set |
| 647 | CONFIG_LIBFC=m | ||
| 648 | # CONFIG_LIBFCOE is not set | ||
| 649 | # CONFIG_FCOE is not set | ||
| 491 | # CONFIG_SCSI_DMX3191D is not set | 650 | # CONFIG_SCSI_DMX3191D is not set |
| 492 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | 651 | # CONFIG_SCSI_FUTURE_DOMAIN is not set |
| 493 | # CONFIG_SCSI_IPS is not set | 652 | # CONFIG_SCSI_IPS is not set |
| @@ -502,16 +661,31 @@ CONFIG_SCSI_QLOGIC_1280=y | |||
| 502 | # CONFIG_SCSI_DC395x is not set | 661 | # CONFIG_SCSI_DC395x is not set |
| 503 | # CONFIG_SCSI_DC390T is not set | 662 | # CONFIG_SCSI_DC390T is not set |
| 504 | # CONFIG_SCSI_DEBUG is not set | 663 | # CONFIG_SCSI_DEBUG is not set |
| 664 | CONFIG_SCSI_PMCRAID=m | ||
| 665 | # CONFIG_SCSI_PM8001 is not set | ||
| 505 | # CONFIG_SCSI_SRP is not set | 666 | # CONFIG_SCSI_SRP is not set |
| 667 | CONFIG_SCSI_BFA_FC=m | ||
| 668 | CONFIG_SCSI_DH=m | ||
| 669 | CONFIG_SCSI_DH_RDAC=m | ||
| 670 | CONFIG_SCSI_DH_HP_SW=m | ||
| 671 | CONFIG_SCSI_DH_EMC=m | ||
| 672 | CONFIG_SCSI_DH_ALUA=m | ||
| 673 | CONFIG_SCSI_OSD_INITIATOR=m | ||
| 674 | CONFIG_SCSI_OSD_ULD=m | ||
| 675 | CONFIG_SCSI_OSD_DPRINT_SENSE=1 | ||
| 676 | # CONFIG_SCSI_OSD_DEBUG is not set | ||
| 506 | # CONFIG_ATA is not set | 677 | # CONFIG_ATA is not set |
| 507 | CONFIG_MD=y | 678 | CONFIG_MD=y |
| 508 | CONFIG_BLK_DEV_MD=y | 679 | CONFIG_BLK_DEV_MD=y |
| 680 | CONFIG_MD_AUTODETECT=y | ||
| 509 | CONFIG_MD_LINEAR=m | 681 | CONFIG_MD_LINEAR=m |
| 510 | CONFIG_MD_RAID0=y | 682 | CONFIG_MD_RAID0=y |
| 511 | CONFIG_MD_RAID1=y | 683 | CONFIG_MD_RAID1=y |
| 512 | CONFIG_MD_RAID10=m | 684 | CONFIG_MD_RAID10=m |
| 513 | CONFIG_MD_RAID456=y | 685 | CONFIG_MD_RAID456=y |
| 514 | CONFIG_MD_RAID5_RESHAPE=y | 686 | # CONFIG_MULTICORE_RAID456 is not set |
| 687 | CONFIG_MD_RAID6_PQ=y | ||
| 688 | # CONFIG_ASYNC_RAID6_TEST is not set | ||
| 515 | CONFIG_MD_MULTIPATH=m | 689 | CONFIG_MD_MULTIPATH=m |
| 516 | CONFIG_MD_FAULTY=m | 690 | CONFIG_MD_FAULTY=m |
| 517 | CONFIG_BLK_DEV_DM=m | 691 | CONFIG_BLK_DEV_DM=m |
| @@ -519,36 +693,39 @@ CONFIG_BLK_DEV_DM=m | |||
| 519 | CONFIG_DM_CRYPT=m | 693 | CONFIG_DM_CRYPT=m |
| 520 | CONFIG_DM_SNAPSHOT=m | 694 | CONFIG_DM_SNAPSHOT=m |
| 521 | CONFIG_DM_MIRROR=m | 695 | CONFIG_DM_MIRROR=m |
| 696 | CONFIG_DM_LOG_USERSPACE=m | ||
| 522 | CONFIG_DM_ZERO=m | 697 | CONFIG_DM_ZERO=m |
| 523 | CONFIG_DM_MULTIPATH=m | 698 | CONFIG_DM_MULTIPATH=m |
| 524 | CONFIG_DM_MULTIPATH_EMC=m | 699 | CONFIG_DM_MULTIPATH_QL=m |
| 525 | CONFIG_DM_MULTIPATH_RDAC=m | 700 | CONFIG_DM_MULTIPATH_ST=m |
| 526 | # CONFIG_DM_DELAY is not set | 701 | # CONFIG_DM_DELAY is not set |
| 702 | CONFIG_DM_UEVENT=y | ||
| 703 | # CONFIG_FUSION is not set | ||
| 527 | 704 | ||
| 528 | # | 705 | # |
| 529 | # Fusion MPT device support | 706 | # IEEE 1394 (FireWire) support |
| 530 | # | 707 | # |
| 531 | # CONFIG_FUSION is not set | ||
| 532 | # CONFIG_FUSION_SPI is not set | ||
| 533 | # CONFIG_FUSION_FC is not set | ||
| 534 | # CONFIG_FUSION_SAS is not set | ||
| 535 | 708 | ||
| 536 | # | 709 | # |
| 537 | # IEEE 1394 (FireWire) support | 710 | # You can enable one or both FireWire driver stacks. |
| 711 | # | ||
| 712 | |||
| 713 | # | ||
| 714 | # The newer stack is recommended. | ||
| 538 | # | 715 | # |
| 539 | # CONFIG_FIREWIRE is not set | 716 | # CONFIG_FIREWIRE is not set |
| 540 | # CONFIG_IEEE1394 is not set | 717 | # CONFIG_IEEE1394 is not set |
| 541 | # CONFIG_I2O is not set | 718 | # CONFIG_I2O is not set |
| 542 | CONFIG_NETDEVICES=y | 719 | CONFIG_NETDEVICES=y |
| 543 | CONFIG_NETDEVICES_MULTIQUEUE=y | ||
| 544 | CONFIG_IFB=m | 720 | CONFIG_IFB=m |
| 545 | # CONFIG_DUMMY is not set | 721 | # CONFIG_DUMMY is not set |
| 546 | # CONFIG_BONDING is not set | 722 | # CONFIG_BONDING is not set |
| 547 | CONFIG_MACVLAN=m | 723 | CONFIG_MACVLAN=m |
| 548 | # CONFIG_EQUALIZER is not set | 724 | # CONFIG_EQUALIZER is not set |
| 549 | # CONFIG_TUN is not set | 725 | # CONFIG_TUN is not set |
| 726 | CONFIG_VETH=m | ||
| 550 | # CONFIG_ARCNET is not set | 727 | # CONFIG_ARCNET is not set |
| 551 | CONFIG_PHYLIB=m | 728 | CONFIG_PHYLIB=y |
| 552 | 729 | ||
| 553 | # | 730 | # |
| 554 | # MII PHY device drivers | 731 | # MII PHY device drivers |
| @@ -562,23 +739,51 @@ CONFIG_VITESSE_PHY=m | |||
| 562 | CONFIG_SMSC_PHY=m | 739 | CONFIG_SMSC_PHY=m |
| 563 | # CONFIG_BROADCOM_PHY is not set | 740 | # CONFIG_BROADCOM_PHY is not set |
| 564 | CONFIG_ICPLUS_PHY=m | 741 | CONFIG_ICPLUS_PHY=m |
| 742 | CONFIG_REALTEK_PHY=m | ||
| 743 | CONFIG_NATIONAL_PHY=m | ||
| 744 | CONFIG_STE10XP=m | ||
| 745 | CONFIG_LSI_ET1011C_PHY=m | ||
| 565 | # CONFIG_FIXED_PHY is not set | 746 | # CONFIG_FIXED_PHY is not set |
| 747 | CONFIG_MDIO_BITBANG=m | ||
| 566 | CONFIG_NET_ETHERNET=y | 748 | CONFIG_NET_ETHERNET=y |
| 567 | CONFIG_MII=y | 749 | CONFIG_MII=y |
| 568 | CONFIG_AX88796=m | 750 | CONFIG_AX88796=m |
| 751 | CONFIG_AX88796_93CX6=y | ||
| 569 | CONFIG_SGI_IOC3_ETH=y | 752 | CONFIG_SGI_IOC3_ETH=y |
| 570 | # CONFIG_HAPPYMEAL is not set | 753 | # CONFIG_HAPPYMEAL is not set |
| 571 | # CONFIG_SUNGEM is not set | 754 | # CONFIG_SUNGEM is not set |
| 572 | # CONFIG_CASSINI is not set | 755 | # CONFIG_CASSINI is not set |
| 573 | # CONFIG_NET_VENDOR_3COM is not set | 756 | # CONFIG_NET_VENDOR_3COM is not set |
| 757 | CONFIG_SMC91X=m | ||
| 574 | # CONFIG_DM9000 is not set | 758 | # CONFIG_DM9000 is not set |
| 759 | CONFIG_ETHOC=m | ||
| 760 | CONFIG_SMSC911X=m | ||
| 761 | CONFIG_DNET=m | ||
| 575 | # CONFIG_NET_TULIP is not set | 762 | # CONFIG_NET_TULIP is not set |
| 576 | # CONFIG_HP100 is not set | 763 | # CONFIG_HP100 is not set |
| 764 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 765 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 766 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 767 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 768 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
| 769 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
| 770 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
| 577 | # CONFIG_NET_PCI is not set | 771 | # CONFIG_NET_PCI is not set |
| 772 | CONFIG_B44=m | ||
| 773 | CONFIG_B44_PCI_AUTOSELECT=y | ||
| 774 | CONFIG_B44_PCICORE_AUTOSELECT=y | ||
| 775 | CONFIG_B44_PCI=y | ||
| 776 | CONFIG_KS8842=m | ||
| 777 | CONFIG_KS8851_MLL=m | ||
| 778 | CONFIG_ATL2=m | ||
| 578 | CONFIG_NETDEV_1000=y | 779 | CONFIG_NETDEV_1000=y |
| 579 | # CONFIG_ACENIC is not set | 780 | # CONFIG_ACENIC is not set |
| 580 | # CONFIG_DL2K is not set | 781 | # CONFIG_DL2K is not set |
| 581 | # CONFIG_E1000 is not set | 782 | # CONFIG_E1000 is not set |
| 783 | CONFIG_E1000E=m | ||
| 784 | CONFIG_IP1000=m | ||
| 785 | CONFIG_IGB=m | ||
| 786 | CONFIG_IGBVF=m | ||
| 582 | # CONFIG_NS83820 is not set | 787 | # CONFIG_NS83820 is not set |
| 583 | # CONFIG_HAMACHI is not set | 788 | # CONFIG_HAMACHI is not set |
| 584 | # CONFIG_YELLOWFIN is not set | 789 | # CONFIG_YELLOWFIN is not set |
| @@ -588,24 +793,75 @@ CONFIG_NETDEV_1000=y | |||
| 588 | # CONFIG_SKY2 is not set | 793 | # CONFIG_SKY2 is not set |
| 589 | CONFIG_VIA_VELOCITY=m | 794 | CONFIG_VIA_VELOCITY=m |
| 590 | # CONFIG_TIGON3 is not set | 795 | # CONFIG_TIGON3 is not set |
| 591 | # CONFIG_BNX2 is not set | 796 | CONFIG_BNX2=m |
| 797 | CONFIG_CNIC=m | ||
| 592 | CONFIG_QLA3XXX=m | 798 | CONFIG_QLA3XXX=m |
| 593 | # CONFIG_ATL1 is not set | 799 | # CONFIG_ATL1 is not set |
| 800 | CONFIG_ATL1E=m | ||
| 801 | CONFIG_ATL1C=m | ||
| 802 | CONFIG_JME=m | ||
| 594 | CONFIG_NETDEV_10000=y | 803 | CONFIG_NETDEV_10000=y |
| 804 | CONFIG_MDIO=m | ||
| 595 | # CONFIG_CHELSIO_T1 is not set | 805 | # CONFIG_CHELSIO_T1 is not set |
| 806 | CONFIG_CHELSIO_T3_DEPENDS=y | ||
| 596 | CONFIG_CHELSIO_T3=m | 807 | CONFIG_CHELSIO_T3=m |
| 808 | CONFIG_ENIC=m | ||
| 809 | CONFIG_IXGBE=m | ||
| 597 | # CONFIG_IXGB is not set | 810 | # CONFIG_IXGB is not set |
| 598 | # CONFIG_S2IO is not set | 811 | # CONFIG_S2IO is not set |
| 812 | CONFIG_VXGE=m | ||
| 813 | # CONFIG_VXGE_DEBUG_TRACE_ALL is not set | ||
| 599 | # CONFIG_MYRI10GE is not set | 814 | # CONFIG_MYRI10GE is not set |
| 600 | CONFIG_NETXEN_NIC=m | 815 | CONFIG_NETXEN_NIC=m |
| 601 | # CONFIG_MLX4_CORE is not set | 816 | CONFIG_NIU=m |
| 817 | CONFIG_MLX4_EN=m | ||
| 818 | CONFIG_MLX4_CORE=m | ||
| 819 | # CONFIG_MLX4_DEBUG is not set | ||
| 820 | CONFIG_TEHUTI=m | ||
| 821 | CONFIG_BNX2X=m | ||
| 822 | CONFIG_QLGE=m | ||
| 823 | CONFIG_SFC=m | ||
| 824 | CONFIG_BE2NET=m | ||
| 602 | # CONFIG_TR is not set | 825 | # CONFIG_TR is not set |
| 603 | 826 | CONFIG_WLAN=y | |
| 604 | # | 827 | CONFIG_LIBERTAS_THINFIRM=m |
| 605 | # Wireless LAN | 828 | CONFIG_ATMEL=m |
| 606 | # | 829 | CONFIG_PCI_ATMEL=m |
| 607 | # CONFIG_WLAN_PRE80211 is not set | 830 | CONFIG_PRISM54=m |
| 608 | CONFIG_WLAN_80211=y | 831 | CONFIG_RTL8180=m |
| 832 | CONFIG_ADM8211=m | ||
| 833 | # CONFIG_MAC80211_HWSIM is not set | ||
| 834 | CONFIG_MWL8K=m | ||
| 835 | CONFIG_ATH_COMMON=m | ||
| 836 | # CONFIG_ATH_DEBUG is not set | ||
| 837 | CONFIG_ATH5K=m | ||
| 838 | # CONFIG_ATH5K_DEBUG is not set | ||
| 839 | CONFIG_ATH9K_HW=m | ||
| 840 | CONFIG_ATH9K_COMMON=m | ||
| 841 | CONFIG_ATH9K=m | ||
| 842 | CONFIG_B43=m | ||
| 843 | CONFIG_B43_PCI_AUTOSELECT=y | ||
| 844 | CONFIG_B43_PCICORE_AUTOSELECT=y | ||
| 845 | CONFIG_B43_PHY_LP=y | ||
| 846 | CONFIG_B43_LEDS=y | ||
| 847 | CONFIG_B43_HWRNG=y | ||
| 848 | # CONFIG_B43_DEBUG is not set | ||
| 849 | CONFIG_B43LEGACY=m | ||
| 850 | CONFIG_B43LEGACY_PCI_AUTOSELECT=y | ||
| 851 | CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y | ||
| 852 | CONFIG_B43LEGACY_LEDS=y | ||
| 853 | CONFIG_B43LEGACY_HWRNG=y | ||
| 854 | # CONFIG_B43LEGACY_DEBUG is not set | ||
| 855 | CONFIG_B43LEGACY_DMA=y | ||
| 856 | CONFIG_B43LEGACY_PIO=y | ||
| 857 | CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y | ||
| 858 | # CONFIG_B43LEGACY_DMA_MODE is not set | ||
| 859 | # CONFIG_B43LEGACY_PIO_MODE is not set | ||
| 860 | CONFIG_HOSTAP=m | ||
| 861 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 862 | CONFIG_HOSTAP_FIRMWARE_NVRAM=y | ||
| 863 | CONFIG_HOSTAP_PLX=m | ||
| 864 | CONFIG_HOSTAP_PCI=m | ||
| 609 | CONFIG_IPW2100=m | 865 | CONFIG_IPW2100=m |
| 610 | CONFIG_IPW2100_MONITOR=y | 866 | CONFIG_IPW2100_MONITOR=y |
| 611 | CONFIG_IPW2100_DEBUG=y | 867 | CONFIG_IPW2100_DEBUG=y |
| @@ -615,38 +871,57 @@ CONFIG_IPW2200_RADIOTAP=y | |||
| 615 | CONFIG_IPW2200_PROMISCUOUS=y | 871 | CONFIG_IPW2200_PROMISCUOUS=y |
| 616 | CONFIG_IPW2200_QOS=y | 872 | CONFIG_IPW2200_QOS=y |
| 617 | CONFIG_IPW2200_DEBUG=y | 873 | CONFIG_IPW2200_DEBUG=y |
| 874 | CONFIG_LIBIPW=m | ||
| 875 | # CONFIG_LIBIPW_DEBUG is not set | ||
| 876 | CONFIG_IWLWIFI=m | ||
| 877 | CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT=y | ||
| 878 | # CONFIG_IWLWIFI_DEBUG is not set | ||
| 879 | CONFIG_IWLAGN=m | ||
| 880 | CONFIG_IWL4965=y | ||
| 881 | CONFIG_IWL5000=y | ||
| 882 | CONFIG_IWL3945=m | ||
| 883 | CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y | ||
| 618 | CONFIG_LIBERTAS=m | 884 | CONFIG_LIBERTAS=m |
| 619 | # CONFIG_LIBERTAS_DEBUG is not set | 885 | # CONFIG_LIBERTAS_DEBUG is not set |
| 620 | CONFIG_HERMES=m | 886 | CONFIG_HERMES=m |
| 887 | # CONFIG_HERMES_CACHE_FW_ON_INIT is not set | ||
| 621 | CONFIG_PLX_HERMES=m | 888 | CONFIG_PLX_HERMES=m |
| 622 | CONFIG_TMD_HERMES=m | 889 | CONFIG_TMD_HERMES=m |
| 623 | CONFIG_NORTEL_HERMES=m | 890 | CONFIG_NORTEL_HERMES=m |
| 624 | CONFIG_PCI_HERMES=m | 891 | CONFIG_PCI_HERMES=m |
| 625 | CONFIG_ATMEL=m | 892 | CONFIG_P54_COMMON=m |
| 626 | CONFIG_PCI_ATMEL=m | 893 | CONFIG_P54_PCI=m |
| 627 | CONFIG_PRISM54=m | 894 | CONFIG_P54_LEDS=y |
| 628 | CONFIG_HOSTAP=m | 895 | CONFIG_RT2X00=m |
| 629 | CONFIG_HOSTAP_FIRMWARE=y | 896 | CONFIG_RT2400PCI=m |
| 630 | CONFIG_HOSTAP_FIRMWARE_NVRAM=y | 897 | CONFIG_RT2500PCI=m |
| 631 | CONFIG_HOSTAP_PLX=m | 898 | CONFIG_RT61PCI=m |
| 632 | CONFIG_HOSTAP_PCI=m | 899 | CONFIG_RT2800PCI_PCI=m |
| 633 | CONFIG_BCM43XX=m | 900 | CONFIG_RT2800PCI=m |
| 634 | CONFIG_BCM43XX_DEBUG=y | 901 | CONFIG_RT2800_LIB=m |
| 635 | CONFIG_BCM43XX_DMA=y | 902 | CONFIG_RT2X00_LIB_PCI=m |
| 636 | CONFIG_BCM43XX_PIO=y | 903 | CONFIG_RT2X00_LIB=m |
| 637 | CONFIG_BCM43XX_DMA_AND_PIO_MODE=y | 904 | CONFIG_RT2X00_LIB_HT=y |
| 638 | # CONFIG_BCM43XX_DMA_MODE is not set | 905 | CONFIG_RT2X00_LIB_FIRMWARE=y |
| 639 | # CONFIG_BCM43XX_PIO_MODE is not set | 906 | CONFIG_RT2X00_LIB_CRYPTO=y |
| 907 | CONFIG_RT2X00_LIB_LEDS=y | ||
| 908 | # CONFIG_RT2X00_DEBUG is not set | ||
| 909 | CONFIG_WL12XX=m | ||
| 910 | CONFIG_WL1251=m | ||
| 911 | |||
| 912 | # | ||
| 913 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
| 914 | # | ||
| 640 | # CONFIG_WAN is not set | 915 | # CONFIG_WAN is not set |
| 641 | # CONFIG_FDDI is not set | 916 | # CONFIG_FDDI is not set |
| 642 | # CONFIG_HIPPI is not set | 917 | # CONFIG_HIPPI is not set |
| 643 | # CONFIG_PPP is not set | 918 | # CONFIG_PPP is not set |
| 644 | # CONFIG_SLIP is not set | 919 | # CONFIG_SLIP is not set |
| 645 | # CONFIG_NET_FC is not set | 920 | # CONFIG_NET_FC is not set |
| 646 | # CONFIG_SHAPER is not set | ||
| 647 | # CONFIG_NETCONSOLE is not set | 921 | # CONFIG_NETCONSOLE is not set |
| 648 | # CONFIG_NETPOLL is not set | 922 | # CONFIG_NETPOLL is not set |
| 649 | # CONFIG_NET_POLL_CONTROLLER is not set | 923 | # CONFIG_NET_POLL_CONTROLLER is not set |
| 924 | # CONFIG_VMXNET3 is not set | ||
| 650 | # CONFIG_ISDN is not set | 925 | # CONFIG_ISDN is not set |
| 651 | # CONFIG_PHONE is not set | 926 | # CONFIG_PHONE is not set |
| 652 | 927 | ||
| @@ -664,13 +939,16 @@ CONFIG_SERIO_SERPORT=y | |||
| 664 | # CONFIG_SERIO_PCIPS2 is not set | 939 | # CONFIG_SERIO_PCIPS2 is not set |
| 665 | CONFIG_SERIO_LIBPS2=m | 940 | CONFIG_SERIO_LIBPS2=m |
| 666 | CONFIG_SERIO_RAW=m | 941 | CONFIG_SERIO_RAW=m |
| 942 | CONFIG_SERIO_ALTERA_PS2=m | ||
| 667 | # CONFIG_GAMEPORT is not set | 943 | # CONFIG_GAMEPORT is not set |
| 668 | 944 | ||
| 669 | # | 945 | # |
| 670 | # Character devices | 946 | # Character devices |
| 671 | # | 947 | # |
| 672 | # CONFIG_VT is not set | 948 | # CONFIG_VT is not set |
| 949 | CONFIG_DEVKMEM=y | ||
| 673 | # CONFIG_SERIAL_NONSTANDARD is not set | 950 | # CONFIG_SERIAL_NONSTANDARD is not set |
| 951 | CONFIG_NOZOMI=m | ||
| 674 | 952 | ||
| 675 | # | 953 | # |
| 676 | # Serial drivers | 954 | # Serial drivers |
| @@ -693,95 +971,258 @@ CONFIG_SERIAL_CORE=y | |||
| 693 | CONFIG_SERIAL_CORE_CONSOLE=y | 971 | CONFIG_SERIAL_CORE_CONSOLE=y |
| 694 | # CONFIG_SERIAL_JSM is not set | 972 | # CONFIG_SERIAL_JSM is not set |
| 695 | CONFIG_UNIX98_PTYS=y | 973 | CONFIG_UNIX98_PTYS=y |
| 974 | CONFIG_DEVPTS_MULTIPLE_INSTANCES=y | ||
| 696 | CONFIG_LEGACY_PTYS=y | 975 | CONFIG_LEGACY_PTYS=y |
| 697 | CONFIG_LEGACY_PTY_COUNT=256 | 976 | CONFIG_LEGACY_PTY_COUNT=256 |
| 698 | # CONFIG_IPMI_HANDLER is not set | 977 | # CONFIG_IPMI_HANDLER is not set |
| 699 | # CONFIG_WATCHDOG is not set | ||
| 700 | CONFIG_HW_RANDOM=m | 978 | CONFIG_HW_RANDOM=m |
| 701 | # CONFIG_RTC is not set | 979 | CONFIG_HW_RANDOM_TIMERIOMEM=m |
| 702 | # CONFIG_R3964 is not set | 980 | # CONFIG_R3964 is not set |
| 703 | # CONFIG_APPLICOM is not set | 981 | # CONFIG_APPLICOM is not set |
| 704 | # CONFIG_DRM is not set | ||
| 705 | # CONFIG_RAW_DRIVER is not set | 982 | # CONFIG_RAW_DRIVER is not set |
| 706 | # CONFIG_TCG_TPM is not set | 983 | # CONFIG_TCG_TPM is not set |
| 707 | CONFIG_DEVPORT=y | 984 | CONFIG_DEVPORT=y |
| 708 | # CONFIG_I2C is not set | 985 | CONFIG_I2C=m |
| 986 | CONFIG_I2C_BOARDINFO=y | ||
| 987 | CONFIG_I2C_COMPAT=y | ||
| 988 | CONFIG_I2C_CHARDEV=m | ||
| 989 | CONFIG_I2C_HELPER_AUTO=y | ||
| 990 | CONFIG_I2C_ALGOBIT=m | ||
| 991 | CONFIG_I2C_ALGOPCA=m | ||
| 992 | |||
| 993 | # | ||
| 994 | # I2C Hardware Bus support | ||
| 995 | # | ||
| 996 | |||
| 997 | # | ||
| 998 | # PC SMBus host controller drivers | ||
| 999 | # | ||
| 1000 | CONFIG_I2C_ALI1535=m | ||
| 1001 | CONFIG_I2C_ALI1563=m | ||
| 1002 | CONFIG_I2C_ALI15X3=m | ||
| 1003 | CONFIG_I2C_AMD756=m | ||
| 1004 | CONFIG_I2C_AMD8111=m | ||
| 1005 | CONFIG_I2C_I801=m | ||
| 1006 | CONFIG_I2C_ISCH=m | ||
| 1007 | CONFIG_I2C_PIIX4=m | ||
| 1008 | CONFIG_I2C_NFORCE2=m | ||
| 1009 | CONFIG_I2C_SIS5595=m | ||
| 1010 | CONFIG_I2C_SIS630=m | ||
| 1011 | CONFIG_I2C_SIS96X=m | ||
| 1012 | CONFIG_I2C_VIA=m | ||
| 1013 | CONFIG_I2C_VIAPRO=m | ||
| 709 | 1014 | ||
| 710 | # | 1015 | # |
| 711 | # SPI support | 1016 | # I2C system bus drivers (mostly embedded / system-on-chip) |
| 712 | # | 1017 | # |
| 1018 | CONFIG_I2C_OCORES=m | ||
| 1019 | CONFIG_I2C_SIMTEC=m | ||
| 1020 | |||
| 1021 | # | ||
| 1022 | # External I2C/SMBus adapter drivers | ||
| 1023 | # | ||
| 1024 | CONFIG_I2C_PARPORT_LIGHT=m | ||
| 1025 | CONFIG_I2C_TAOS_EVM=m | ||
| 1026 | |||
| 1027 | # | ||
| 1028 | # Other I2C/SMBus bus drivers | ||
| 1029 | # | ||
| 1030 | CONFIG_I2C_PCA_PLATFORM=m | ||
| 1031 | CONFIG_I2C_STUB=m | ||
| 1032 | |||
| 1033 | # | ||
| 1034 | # Miscellaneous I2C Chip support | ||
| 1035 | # | ||
| 1036 | CONFIG_SENSORS_TSL2550=m | ||
| 1037 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 1038 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 1039 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 1040 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 713 | # CONFIG_SPI is not set | 1041 | # CONFIG_SPI is not set |
| 714 | # CONFIG_SPI_MASTER is not set | 1042 | |
| 1043 | # | ||
| 1044 | # PPS support | ||
| 1045 | # | ||
| 1046 | CONFIG_PPS=m | ||
| 1047 | # CONFIG_PPS_DEBUG is not set | ||
| 715 | # CONFIG_W1 is not set | 1048 | # CONFIG_W1 is not set |
| 716 | # CONFIG_POWER_SUPPLY is not set | 1049 | # CONFIG_POWER_SUPPLY is not set |
| 717 | # CONFIG_HWMON is not set | 1050 | # CONFIG_HWMON is not set |
| 1051 | CONFIG_THERMAL=m | ||
| 1052 | # CONFIG_WATCHDOG is not set | ||
| 1053 | CONFIG_SSB_POSSIBLE=y | ||
| 718 | 1054 | ||
| 719 | # | 1055 | # |
| 720 | # Multifunction device drivers | 1056 | # Sonics Silicon Backplane |
| 721 | # | 1057 | # |
| 722 | # CONFIG_MFD_SM501 is not set | 1058 | CONFIG_SSB=m |
| 1059 | CONFIG_SSB_SPROM=y | ||
| 1060 | CONFIG_SSB_PCIHOST_POSSIBLE=y | ||
| 1061 | CONFIG_SSB_PCIHOST=y | ||
| 1062 | CONFIG_SSB_B43_PCI_BRIDGE=y | ||
| 1063 | # CONFIG_SSB_SILENT is not set | ||
| 1064 | # CONFIG_SSB_DEBUG is not set | ||
| 1065 | CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y | ||
| 1066 | CONFIG_SSB_DRIVER_PCICORE=y | ||
| 1067 | # CONFIG_SSB_DRIVER_MIPS is not set | ||
| 723 | 1068 | ||
| 724 | # | 1069 | # |
| 725 | # Multimedia devices | 1070 | # Multifunction device drivers |
| 726 | # | 1071 | # |
| 727 | # CONFIG_VIDEO_DEV is not set | 1072 | # CONFIG_MFD_CORE is not set |
| 728 | # CONFIG_DVB_CORE is not set | 1073 | # CONFIG_MFD_SM501 is not set |
| 729 | # CONFIG_DAB is not set | 1074 | # CONFIG_HTC_PASIC3 is not set |
| 1075 | # CONFIG_MFD_TMIO is not set | ||
| 1076 | # CONFIG_MFD_WM8400 is not set | ||
| 1077 | CONFIG_MFD_WM8350=m | ||
| 1078 | CONFIG_MFD_WM8350_I2C=m | ||
| 1079 | CONFIG_MFD_PCF50633=m | ||
| 1080 | CONFIG_PCF50633_ADC=m | ||
| 1081 | CONFIG_PCF50633_GPIO=m | ||
| 1082 | CONFIG_AB3100_CORE=m | ||
| 1083 | CONFIG_AB3100_OTP=m | ||
| 1084 | # CONFIG_REGULATOR is not set | ||
| 1085 | # CONFIG_MEDIA_SUPPORT is not set | ||
| 730 | 1086 | ||
| 731 | # | 1087 | # |
| 732 | # Graphics support | 1088 | # Graphics support |
| 733 | # | 1089 | # |
| 734 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 1090 | # CONFIG_VGA_ARB is not set |
| 735 | 1091 | # CONFIG_DRM is not set | |
| 736 | # | ||
| 737 | # Display device support | ||
| 738 | # | ||
| 739 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 740 | # CONFIG_VGASTATE is not set | 1092 | # CONFIG_VGASTATE is not set |
| 741 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | 1093 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set |
| 742 | # CONFIG_FB is not set | 1094 | # CONFIG_FB is not set |
| 1095 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 743 | 1096 | ||
| 744 | # | 1097 | # |
| 745 | # Sound | 1098 | # Display device support |
| 746 | # | 1099 | # |
| 1100 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 747 | # CONFIG_SOUND is not set | 1101 | # CONFIG_SOUND is not set |
| 748 | CONFIG_USB_SUPPORT=y | 1102 | CONFIG_USB_SUPPORT=y |
| 749 | CONFIG_USB_ARCH_HAS_HCD=y | 1103 | CONFIG_USB_ARCH_HAS_HCD=y |
| 750 | CONFIG_USB_ARCH_HAS_OHCI=y | 1104 | CONFIG_USB_ARCH_HAS_OHCI=y |
| 751 | CONFIG_USB_ARCH_HAS_EHCI=y | 1105 | CONFIG_USB_ARCH_HAS_EHCI=y |
| 752 | # CONFIG_USB is not set | 1106 | # CONFIG_USB is not set |
| 1107 | # CONFIG_USB_OTG_WHITELIST is not set | ||
| 1108 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
| 753 | 1109 | ||
| 754 | # | 1110 | # |
| 755 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 1111 | # Enable Host or Gadget support to see Inventra options |
| 756 | # | 1112 | # |
| 757 | 1113 | ||
| 758 | # | 1114 | # |
| 759 | # USB Gadget Support | 1115 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may |
| 760 | # | 1116 | # |
| 761 | # CONFIG_USB_GADGET is not set | 1117 | # CONFIG_USB_GADGET is not set |
| 1118 | |||
| 1119 | # | ||
| 1120 | # OTG and related infrastructure | ||
| 1121 | # | ||
| 1122 | # CONFIG_UWB is not set | ||
| 762 | # CONFIG_MMC is not set | 1123 | # CONFIG_MMC is not set |
| 763 | # CONFIG_NEW_LEDS is not set | 1124 | # CONFIG_MEMSTICK is not set |
| 764 | # CONFIG_INFINIBAND is not set | 1125 | CONFIG_NEW_LEDS=y |
| 765 | # CONFIG_RTC_CLASS is not set | 1126 | CONFIG_LEDS_CLASS=m |
| 1127 | |||
| 1128 | # | ||
| 1129 | # LED drivers | ||
| 1130 | # | ||
| 1131 | CONFIG_LEDS_LP3944=m | ||
| 1132 | CONFIG_LEDS_PCA955X=m | ||
| 1133 | CONFIG_LEDS_WM8350=m | ||
| 1134 | CONFIG_LEDS_BD2802=m | ||
| 1135 | |||
| 1136 | # | ||
| 1137 | # LED Triggers | ||
| 1138 | # | ||
| 1139 | CONFIG_LEDS_TRIGGERS=y | ||
| 1140 | CONFIG_LEDS_TRIGGER_TIMER=m | ||
| 1141 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
| 1142 | CONFIG_LEDS_TRIGGER_BACKLIGHT=m | ||
| 1143 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=m | ||
| 766 | 1144 | ||
| 767 | # | 1145 | # |
| 768 | # DMA Engine support | 1146 | # iptables trigger is under Netfilter config (LED target) |
| 769 | # | 1147 | # |
| 770 | # CONFIG_DMA_ENGINE is not set | 1148 | # CONFIG_ACCESSIBILITY is not set |
| 1149 | # CONFIG_INFINIBAND is not set | ||
| 1150 | CONFIG_RTC_LIB=y | ||
| 1151 | CONFIG_RTC_CLASS=y | ||
| 1152 | CONFIG_RTC_HCTOSYS=y | ||
| 1153 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1154 | # CONFIG_RTC_DEBUG is not set | ||
| 771 | 1155 | ||
| 772 | # | 1156 | # |
| 773 | # DMA Clients | 1157 | # RTC interfaces |
| 774 | # | 1158 | # |
| 1159 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1160 | CONFIG_RTC_INTF_PROC=y | ||
| 1161 | CONFIG_RTC_INTF_DEV=y | ||
| 1162 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1163 | # CONFIG_RTC_DRV_TEST is not set | ||
| 775 | 1164 | ||
| 776 | # | 1165 | # |
| 777 | # DMA Devices | 1166 | # I2C RTC drivers |
| 1167 | # | ||
| 1168 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1169 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1170 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1171 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1172 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1173 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1174 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1175 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1176 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1177 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1178 | # CONFIG_RTC_DRV_BQ32K is not set | ||
| 1179 | # CONFIG_RTC_DRV_S35390A is not set | ||
| 1180 | # CONFIG_RTC_DRV_FM3130 is not set | ||
| 1181 | # CONFIG_RTC_DRV_RX8581 is not set | ||
| 1182 | # CONFIG_RTC_DRV_RX8025 is not set | ||
| 1183 | |||
| 1184 | # | ||
| 1185 | # SPI RTC drivers | ||
| 1186 | # | ||
| 1187 | |||
| 778 | # | 1188 | # |
| 1189 | # Platform RTC drivers | ||
| 1190 | # | ||
| 1191 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1192 | # CONFIG_RTC_DRV_DS1286 is not set | ||
| 1193 | # CONFIG_RTC_DRV_DS1511 is not set | ||
| 1194 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1195 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1196 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1197 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1198 | CONFIG_RTC_DRV_M48T35=y | ||
| 1199 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1200 | # CONFIG_RTC_DRV_MSM6242 is not set | ||
| 1201 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
| 1202 | # CONFIG_RTC_DRV_RP5C01 is not set | ||
| 1203 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1204 | # CONFIG_RTC_DRV_WM8350 is not set | ||
| 1205 | # CONFIG_RTC_DRV_PCF50633 is not set | ||
| 1206 | CONFIG_RTC_DRV_AB3100=m | ||
| 779 | 1207 | ||
| 780 | # | 1208 | # |
| 781 | # Userspace I/O | 1209 | # on-CPU RTC drivers |
| 782 | # | 1210 | # |
| 1211 | # CONFIG_DMADEVICES is not set | ||
| 1212 | # CONFIG_AUXDISPLAY is not set | ||
| 783 | CONFIG_UIO=y | 1213 | CONFIG_UIO=y |
| 784 | # CONFIG_UIO_CIF is not set | 1214 | # CONFIG_UIO_CIF is not set |
| 1215 | # CONFIG_UIO_PDRV is not set | ||
| 1216 | # CONFIG_UIO_PDRV_GENIRQ is not set | ||
| 1217 | CONFIG_UIO_SMX=m | ||
| 1218 | CONFIG_UIO_AEC=m | ||
| 1219 | CONFIG_UIO_SERCOS3=m | ||
| 1220 | CONFIG_UIO_PCI_GENERIC=m | ||
| 1221 | |||
| 1222 | # | ||
| 1223 | # TI VLYNQ | ||
| 1224 | # | ||
| 1225 | # CONFIG_STAGING is not set | ||
| 785 | 1226 | ||
| 786 | # | 1227 | # |
| 787 | # File systems | 1228 | # File systems |
| @@ -792,36 +1233,58 @@ CONFIG_EXT2_FS_POSIX_ACL=y | |||
| 792 | CONFIG_EXT2_FS_SECURITY=y | 1233 | CONFIG_EXT2_FS_SECURITY=y |
| 793 | # CONFIG_EXT2_FS_XIP is not set | 1234 | # CONFIG_EXT2_FS_XIP is not set |
| 794 | CONFIG_EXT3_FS=y | 1235 | CONFIG_EXT3_FS=y |
| 1236 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
| 795 | CONFIG_EXT3_FS_XATTR=y | 1237 | CONFIG_EXT3_FS_XATTR=y |
| 796 | CONFIG_EXT3_FS_POSIX_ACL=y | 1238 | CONFIG_EXT3_FS_POSIX_ACL=y |
| 797 | CONFIG_EXT3_FS_SECURITY=y | 1239 | CONFIG_EXT3_FS_SECURITY=y |
| 798 | # CONFIG_EXT4DEV_FS is not set | 1240 | CONFIG_EXT4_FS=y |
| 1241 | CONFIG_EXT4_FS_XATTR=y | ||
| 1242 | CONFIG_EXT4_FS_POSIX_ACL=y | ||
| 1243 | CONFIG_EXT4_FS_SECURITY=y | ||
| 1244 | # CONFIG_EXT4_DEBUG is not set | ||
| 799 | CONFIG_JBD=y | 1245 | CONFIG_JBD=y |
| 800 | CONFIG_JBD_DEBUG=y | 1246 | CONFIG_JBD2=y |
| 801 | CONFIG_FS_MBCACHE=y | 1247 | CONFIG_FS_MBCACHE=y |
| 802 | # CONFIG_REISERFS_FS is not set | 1248 | # CONFIG_REISERFS_FS is not set |
| 803 | # CONFIG_JFS_FS is not set | 1249 | # CONFIG_JFS_FS is not set |
| 804 | CONFIG_FS_POSIX_ACL=y | 1250 | CONFIG_FS_POSIX_ACL=y |
| 805 | CONFIG_XFS_FS=m | 1251 | CONFIG_XFS_FS=m |
| 806 | CONFIG_XFS_QUOTA=y | 1252 | CONFIG_XFS_QUOTA=y |
| 807 | CONFIG_XFS_SECURITY=y | ||
| 808 | CONFIG_XFS_POSIX_ACL=y | 1253 | CONFIG_XFS_POSIX_ACL=y |
| 809 | # CONFIG_XFS_RT is not set | 1254 | # CONFIG_XFS_RT is not set |
| 1255 | # CONFIG_XFS_DEBUG is not set | ||
| 810 | # CONFIG_GFS2_FS is not set | 1256 | # CONFIG_GFS2_FS is not set |
| 811 | # CONFIG_OCFS2_FS is not set | 1257 | # CONFIG_OCFS2_FS is not set |
| 812 | # CONFIG_MINIX_FS is not set | 1258 | CONFIG_BTRFS_FS=m |
| 813 | # CONFIG_ROMFS_FS is not set | 1259 | CONFIG_BTRFS_FS_POSIX_ACL=y |
| 1260 | # CONFIG_NILFS2_FS is not set | ||
| 1261 | CONFIG_FILE_LOCKING=y | ||
| 1262 | CONFIG_FSNOTIFY=y | ||
| 1263 | CONFIG_DNOTIFY=y | ||
| 814 | CONFIG_INOTIFY=y | 1264 | CONFIG_INOTIFY=y |
| 815 | CONFIG_INOTIFY_USER=y | 1265 | CONFIG_INOTIFY_USER=y |
| 816 | # CONFIG_QUOTA is not set | 1266 | # CONFIG_QUOTA is not set |
| 1267 | CONFIG_QUOTA_NETLINK_INTERFACE=y | ||
| 817 | CONFIG_QUOTACTL=y | 1268 | CONFIG_QUOTACTL=y |
| 818 | CONFIG_DNOTIFY=y | ||
| 819 | CONFIG_AUTOFS_FS=m | 1269 | CONFIG_AUTOFS_FS=m |
| 820 | # CONFIG_AUTOFS4_FS is not set | 1270 | # CONFIG_AUTOFS4_FS is not set |
| 821 | CONFIG_FUSE_FS=m | 1271 | CONFIG_FUSE_FS=m |
| 1272 | CONFIG_CUSE=m | ||
| 822 | CONFIG_GENERIC_ACL=y | 1273 | CONFIG_GENERIC_ACL=y |
| 823 | 1274 | ||
| 824 | # | 1275 | # |
| 1276 | # Caches | ||
| 1277 | # | ||
| 1278 | CONFIG_FSCACHE=m | ||
| 1279 | CONFIG_FSCACHE_STATS=y | ||
| 1280 | # CONFIG_FSCACHE_HISTOGRAM is not set | ||
| 1281 | # CONFIG_FSCACHE_DEBUG is not set | ||
| 1282 | # CONFIG_FSCACHE_OBJECT_LIST is not set | ||
| 1283 | CONFIG_CACHEFILES=m | ||
| 1284 | # CONFIG_CACHEFILES_DEBUG is not set | ||
| 1285 | # CONFIG_CACHEFILES_HISTOGRAM is not set | ||
| 1286 | |||
| 1287 | # | ||
| 825 | # CD-ROM/DVD Filesystems | 1288 | # CD-ROM/DVD Filesystems |
| 826 | # | 1289 | # |
| 827 | # CONFIG_ISO9660_FS is not set | 1290 | # CONFIG_ISO9660_FS is not set |
| @@ -840,16 +1303,13 @@ CONFIG_GENERIC_ACL=y | |||
| 840 | CONFIG_PROC_FS=y | 1303 | CONFIG_PROC_FS=y |
| 841 | CONFIG_PROC_KCORE=y | 1304 | CONFIG_PROC_KCORE=y |
| 842 | CONFIG_PROC_SYSCTL=y | 1305 | CONFIG_PROC_SYSCTL=y |
| 1306 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 843 | CONFIG_SYSFS=y | 1307 | CONFIG_SYSFS=y |
| 844 | CONFIG_TMPFS=y | 1308 | CONFIG_TMPFS=y |
| 845 | CONFIG_TMPFS_POSIX_ACL=y | 1309 | CONFIG_TMPFS_POSIX_ACL=y |
| 846 | # CONFIG_HUGETLB_PAGE is not set | 1310 | # CONFIG_HUGETLB_PAGE is not set |
| 847 | CONFIG_RAMFS=y | ||
| 848 | CONFIG_CONFIGFS_FS=m | 1311 | CONFIG_CONFIGFS_FS=m |
| 849 | 1312 | CONFIG_MISC_FILESYSTEMS=y | |
| 850 | # | ||
| 851 | # Miscellaneous filesystems | ||
| 852 | # | ||
| 853 | # CONFIG_ADFS_FS is not set | 1313 | # CONFIG_ADFS_FS is not set |
| 854 | # CONFIG_AFFS_FS is not set | 1314 | # CONFIG_AFFS_FS is not set |
| 855 | # CONFIG_ECRYPT_FS is not set | 1315 | # CONFIG_ECRYPT_FS is not set |
| @@ -859,28 +1319,32 @@ CONFIG_CONFIGFS_FS=m | |||
| 859 | # CONFIG_BFS_FS is not set | 1319 | # CONFIG_BFS_FS is not set |
| 860 | # CONFIG_EFS_FS is not set | 1320 | # CONFIG_EFS_FS is not set |
| 861 | # CONFIG_CRAMFS is not set | 1321 | # CONFIG_CRAMFS is not set |
| 1322 | CONFIG_SQUASHFS=m | ||
| 1323 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1324 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 862 | # CONFIG_VXFS_FS is not set | 1325 | # CONFIG_VXFS_FS is not set |
| 1326 | # CONFIG_MINIX_FS is not set | ||
| 1327 | CONFIG_OMFS_FS=m | ||
| 863 | # CONFIG_HPFS_FS is not set | 1328 | # CONFIG_HPFS_FS is not set |
| 864 | # CONFIG_QNX4FS_FS is not set | 1329 | # CONFIG_QNX4FS_FS is not set |
| 1330 | # CONFIG_ROMFS_FS is not set | ||
| 865 | # CONFIG_SYSV_FS is not set | 1331 | # CONFIG_SYSV_FS is not set |
| 866 | # CONFIG_UFS_FS is not set | 1332 | # CONFIG_UFS_FS is not set |
| 867 | 1333 | CONFIG_EXOFS_FS=m | |
| 868 | # | 1334 | # CONFIG_EXOFS_DEBUG is not set |
| 869 | # Network File Systems | 1335 | CONFIG_NETWORK_FILESYSTEMS=y |
| 870 | # | ||
| 871 | CONFIG_NFS_FS=y | 1336 | CONFIG_NFS_FS=y |
| 872 | CONFIG_NFS_V3=y | 1337 | CONFIG_NFS_V3=y |
| 873 | # CONFIG_NFS_V3_ACL is not set | 1338 | # CONFIG_NFS_V3_ACL is not set |
| 874 | # CONFIG_NFS_V4 is not set | 1339 | # CONFIG_NFS_V4 is not set |
| 875 | # CONFIG_NFS_DIRECTIO is not set | ||
| 876 | # CONFIG_NFSD is not set | ||
| 877 | # CONFIG_ROOT_NFS is not set | 1340 | # CONFIG_ROOT_NFS is not set |
| 1341 | # CONFIG_NFSD is not set | ||
| 878 | CONFIG_LOCKD=y | 1342 | CONFIG_LOCKD=y |
| 879 | CONFIG_LOCKD_V4=y | 1343 | CONFIG_LOCKD_V4=y |
| 1344 | CONFIG_EXPORTFS=m | ||
| 880 | CONFIG_NFS_COMMON=y | 1345 | CONFIG_NFS_COMMON=y |
| 881 | CONFIG_SUNRPC=y | 1346 | CONFIG_SUNRPC=y |
| 882 | CONFIG_SUNRPC_GSS=y | 1347 | CONFIG_SUNRPC_GSS=y |
| 883 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 884 | CONFIG_RPCSEC_GSS_KRB5=y | 1348 | CONFIG_RPCSEC_GSS_KRB5=y |
| 885 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1349 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
| 886 | # CONFIG_SMB_FS is not set | 1350 | # CONFIG_SMB_FS is not set |
| @@ -910,35 +1374,37 @@ CONFIG_SGI_PARTITION=y | |||
| 910 | # CONFIG_KARMA_PARTITION is not set | 1374 | # CONFIG_KARMA_PARTITION is not set |
| 911 | # CONFIG_EFI_PARTITION is not set | 1375 | # CONFIG_EFI_PARTITION is not set |
| 912 | # CONFIG_SYSV68_PARTITION is not set | 1376 | # CONFIG_SYSV68_PARTITION is not set |
| 913 | |||
| 914 | # | ||
| 915 | # Native Language Support | ||
| 916 | # | ||
| 917 | # CONFIG_NLS is not set | 1377 | # CONFIG_NLS is not set |
| 918 | |||
| 919 | # | ||
| 920 | # Distributed Lock Manager | ||
| 921 | # | ||
| 922 | CONFIG_DLM=m | 1378 | CONFIG_DLM=m |
| 923 | # CONFIG_DLM_DEBUG is not set | 1379 | # CONFIG_DLM_DEBUG is not set |
| 924 | 1380 | ||
| 925 | # | 1381 | # |
| 926 | # Profiling support | ||
| 927 | # | ||
| 928 | # CONFIG_PROFILING is not set | ||
| 929 | |||
| 930 | # | ||
| 931 | # Kernel hacking | 1382 | # Kernel hacking |
| 932 | # | 1383 | # |
| 933 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 1384 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
| 934 | # CONFIG_PRINTK_TIME is not set | 1385 | # CONFIG_PRINTK_TIME is not set |
| 1386 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 935 | CONFIG_ENABLE_MUST_CHECK=y | 1387 | CONFIG_ENABLE_MUST_CHECK=y |
| 1388 | CONFIG_FRAME_WARN=2048 | ||
| 936 | # CONFIG_MAGIC_SYSRQ is not set | 1389 | # CONFIG_MAGIC_SYSRQ is not set |
| 1390 | # CONFIG_STRIP_ASM_SYMS is not set | ||
| 937 | # CONFIG_UNUSED_SYMBOLS is not set | 1391 | # CONFIG_UNUSED_SYMBOLS is not set |
| 938 | # CONFIG_DEBUG_FS is not set | 1392 | # CONFIG_DEBUG_FS is not set |
| 939 | # CONFIG_HEADERS_CHECK is not set | 1393 | # CONFIG_HEADERS_CHECK is not set |
| 940 | # CONFIG_DEBUG_KERNEL is not set | 1394 | # CONFIG_DEBUG_KERNEL is not set |
| 941 | CONFIG_CROSSCOMPILE=y | 1395 | # CONFIG_DEBUG_MEMORY_INIT is not set |
| 1396 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 1397 | # CONFIG_SYSCTL_SYSCALL_CHECK is not set | ||
| 1398 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
| 1399 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 1400 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 1401 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
| 1402 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
| 1403 | CONFIG_TRACING_SUPPORT=y | ||
| 1404 | # CONFIG_FTRACE is not set | ||
| 1405 | # CONFIG_SAMPLES is not set | ||
| 1406 | CONFIG_HAVE_ARCH_KGDB=y | ||
| 1407 | CONFIG_EARLY_PRINTK=y | ||
| 942 | # CONFIG_CMDLINE_BOOL is not set | 1408 | # CONFIG_CMDLINE_BOOL is not set |
| 943 | 1409 | ||
| 944 | # | 1410 | # |
| @@ -947,65 +1413,140 @@ CONFIG_CROSSCOMPILE=y | |||
| 947 | CONFIG_KEYS=y | 1413 | CONFIG_KEYS=y |
| 948 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | 1414 | CONFIG_KEYS_DEBUG_PROC_KEYS=y |
| 949 | # CONFIG_SECURITY is not set | 1415 | # CONFIG_SECURITY is not set |
| 950 | CONFIG_XOR_BLOCKS=m | 1416 | CONFIG_SECURITYFS=y |
| 951 | CONFIG_ASYNC_CORE=m | 1417 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set |
| 952 | CONFIG_ASYNC_MEMCPY=m | 1418 | # CONFIG_DEFAULT_SECURITY_SMACK is not set |
| 953 | CONFIG_ASYNC_XOR=m | 1419 | # CONFIG_DEFAULT_SECURITY_TOMOYO is not set |
| 1420 | CONFIG_DEFAULT_SECURITY_DAC=y | ||
| 1421 | CONFIG_DEFAULT_SECURITY="" | ||
| 1422 | CONFIG_XOR_BLOCKS=y | ||
| 1423 | CONFIG_ASYNC_CORE=y | ||
| 1424 | CONFIG_ASYNC_MEMCPY=y | ||
| 1425 | CONFIG_ASYNC_XOR=y | ||
| 1426 | CONFIG_ASYNC_PQ=y | ||
| 1427 | CONFIG_ASYNC_RAID6_RECOV=y | ||
| 954 | CONFIG_CRYPTO=y | 1428 | CONFIG_CRYPTO=y |
| 1429 | |||
| 1430 | # | ||
| 1431 | # Crypto core or helper | ||
| 1432 | # | ||
| 1433 | CONFIG_CRYPTO_FIPS=y | ||
| 955 | CONFIG_CRYPTO_ALGAPI=y | 1434 | CONFIG_CRYPTO_ALGAPI=y |
| 956 | CONFIG_CRYPTO_ABLKCIPHER=m | 1435 | CONFIG_CRYPTO_ALGAPI2=y |
| 1436 | CONFIG_CRYPTO_AEAD=m | ||
| 1437 | CONFIG_CRYPTO_AEAD2=y | ||
| 957 | CONFIG_CRYPTO_BLKCIPHER=y | 1438 | CONFIG_CRYPTO_BLKCIPHER=y |
| 1439 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
| 958 | CONFIG_CRYPTO_HASH=y | 1440 | CONFIG_CRYPTO_HASH=y |
| 1441 | CONFIG_CRYPTO_HASH2=y | ||
| 1442 | CONFIG_CRYPTO_RNG=m | ||
| 1443 | CONFIG_CRYPTO_RNG2=y | ||
| 1444 | CONFIG_CRYPTO_PCOMP=y | ||
| 959 | CONFIG_CRYPTO_MANAGER=y | 1445 | CONFIG_CRYPTO_MANAGER=y |
| 1446 | CONFIG_CRYPTO_MANAGER2=y | ||
| 1447 | CONFIG_CRYPTO_GF128MUL=m | ||
| 1448 | CONFIG_CRYPTO_NULL=m | ||
| 1449 | CONFIG_CRYPTO_WORKQUEUE=y | ||
| 1450 | CONFIG_CRYPTO_CRYPTD=m | ||
| 1451 | CONFIG_CRYPTO_AUTHENC=m | ||
| 1452 | # CONFIG_CRYPTO_TEST is not set | ||
| 1453 | |||
| 1454 | # | ||
| 1455 | # Authenticated Encryption with Associated Data | ||
| 1456 | # | ||
| 1457 | CONFIG_CRYPTO_CCM=m | ||
| 1458 | CONFIG_CRYPTO_GCM=m | ||
| 1459 | CONFIG_CRYPTO_SEQIV=m | ||
| 1460 | |||
| 1461 | # | ||
| 1462 | # Block modes | ||
| 1463 | # | ||
| 1464 | CONFIG_CRYPTO_CBC=y | ||
| 1465 | CONFIG_CRYPTO_CTR=m | ||
| 1466 | CONFIG_CRYPTO_CTS=m | ||
| 1467 | CONFIG_CRYPTO_ECB=m | ||
| 1468 | CONFIG_CRYPTO_LRW=m | ||
| 1469 | CONFIG_CRYPTO_PCBC=m | ||
| 1470 | CONFIG_CRYPTO_XTS=m | ||
| 1471 | |||
| 1472 | # | ||
| 1473 | # Hash modes | ||
| 1474 | # | ||
| 960 | CONFIG_CRYPTO_HMAC=y | 1475 | CONFIG_CRYPTO_HMAC=y |
| 961 | CONFIG_CRYPTO_XCBC=m | 1476 | CONFIG_CRYPTO_XCBC=m |
| 962 | CONFIG_CRYPTO_NULL=m | 1477 | CONFIG_CRYPTO_VMAC=m |
| 1478 | |||
| 1479 | # | ||
| 1480 | # Digest | ||
| 1481 | # | ||
| 1482 | CONFIG_CRYPTO_CRC32C=m | ||
| 1483 | CONFIG_CRYPTO_GHASH=m | ||
| 963 | CONFIG_CRYPTO_MD4=m | 1484 | CONFIG_CRYPTO_MD4=m |
| 964 | CONFIG_CRYPTO_MD5=y | 1485 | CONFIG_CRYPTO_MD5=y |
| 1486 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1487 | CONFIG_CRYPTO_RMD128=m | ||
| 1488 | CONFIG_CRYPTO_RMD160=m | ||
| 1489 | CONFIG_CRYPTO_RMD256=m | ||
| 1490 | CONFIG_CRYPTO_RMD320=m | ||
| 965 | CONFIG_CRYPTO_SHA1=m | 1491 | CONFIG_CRYPTO_SHA1=m |
| 966 | CONFIG_CRYPTO_SHA256=m | 1492 | CONFIG_CRYPTO_SHA256=m |
| 967 | CONFIG_CRYPTO_SHA512=m | 1493 | CONFIG_CRYPTO_SHA512=m |
| 968 | CONFIG_CRYPTO_WP512=m | ||
| 969 | CONFIG_CRYPTO_TGR192=m | 1494 | CONFIG_CRYPTO_TGR192=m |
| 970 | CONFIG_CRYPTO_GF128MUL=m | 1495 | CONFIG_CRYPTO_WP512=m |
| 971 | CONFIG_CRYPTO_ECB=m | 1496 | |
| 972 | CONFIG_CRYPTO_CBC=y | 1497 | # |
| 973 | CONFIG_CRYPTO_PCBC=m | 1498 | # Ciphers |
| 974 | CONFIG_CRYPTO_LRW=m | 1499 | # |
| 975 | CONFIG_CRYPTO_CRYPTD=m | ||
| 976 | CONFIG_CRYPTO_DES=y | ||
| 977 | CONFIG_CRYPTO_FCRYPT=m | ||
| 978 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 979 | CONFIG_CRYPTO_TWOFISH=m | ||
| 980 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 981 | CONFIG_CRYPTO_SERPENT=m | ||
| 982 | CONFIG_CRYPTO_AES=m | 1500 | CONFIG_CRYPTO_AES=m |
| 1501 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1502 | CONFIG_CRYPTO_ARC4=m | ||
| 1503 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1504 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 983 | CONFIG_CRYPTO_CAST5=m | 1505 | CONFIG_CRYPTO_CAST5=m |
| 984 | CONFIG_CRYPTO_CAST6=m | 1506 | CONFIG_CRYPTO_CAST6=m |
| 985 | CONFIG_CRYPTO_TEA=m | 1507 | CONFIG_CRYPTO_DES=y |
| 986 | CONFIG_CRYPTO_ARC4=m | 1508 | CONFIG_CRYPTO_FCRYPT=m |
| 987 | CONFIG_CRYPTO_KHAZAD=m | 1509 | CONFIG_CRYPTO_KHAZAD=m |
| 988 | CONFIG_CRYPTO_ANUBIS=m | 1510 | CONFIG_CRYPTO_SALSA20=m |
| 1511 | CONFIG_CRYPTO_SEED=m | ||
| 1512 | CONFIG_CRYPTO_SERPENT=m | ||
| 1513 | CONFIG_CRYPTO_TEA=m | ||
| 1514 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1515 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1516 | |||
| 1517 | # | ||
| 1518 | # Compression | ||
| 1519 | # | ||
| 989 | CONFIG_CRYPTO_DEFLATE=m | 1520 | CONFIG_CRYPTO_DEFLATE=m |
| 990 | CONFIG_CRYPTO_MICHAEL_MIC=m | 1521 | CONFIG_CRYPTO_ZLIB=m |
| 991 | CONFIG_CRYPTO_CRC32C=m | 1522 | CONFIG_CRYPTO_LZO=m |
| 992 | CONFIG_CRYPTO_CAMELLIA=m | 1523 | |
| 993 | # CONFIG_CRYPTO_TEST is not set | 1524 | # |
| 1525 | # Random Number Generation | ||
| 1526 | # | ||
| 1527 | CONFIG_CRYPTO_ANSI_CPRNG=m | ||
| 994 | CONFIG_CRYPTO_HW=y | 1528 | CONFIG_CRYPTO_HW=y |
| 1529 | CONFIG_CRYPTO_DEV_HIFN_795X=m | ||
| 1530 | # CONFIG_CRYPTO_DEV_HIFN_795X_RNG is not set | ||
| 1531 | # CONFIG_BINARY_PRINTF is not set | ||
| 995 | 1532 | ||
| 996 | # | 1533 | # |
| 997 | # Library routines | 1534 | # Library routines |
| 998 | # | 1535 | # |
| 999 | CONFIG_BITREVERSE=y | 1536 | CONFIG_BITREVERSE=y |
| 1537 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
| 1000 | CONFIG_CRC_CCITT=m | 1538 | CONFIG_CRC_CCITT=m |
| 1001 | # CONFIG_CRC16 is not set | 1539 | CONFIG_CRC16=y |
| 1002 | # CONFIG_CRC_ITU_T is not set | 1540 | CONFIG_CRC_T10DIF=m |
| 1541 | CONFIG_CRC_ITU_T=m | ||
| 1003 | CONFIG_CRC32=y | 1542 | CONFIG_CRC32=y |
| 1004 | # CONFIG_CRC7 is not set | 1543 | CONFIG_CRC7=m |
| 1005 | CONFIG_LIBCRC32C=m | 1544 | CONFIG_LIBCRC32C=m |
| 1006 | CONFIG_ZLIB_INFLATE=m | 1545 | CONFIG_ZLIB_INFLATE=m |
| 1007 | CONFIG_ZLIB_DEFLATE=m | 1546 | CONFIG_ZLIB_DEFLATE=m |
| 1008 | CONFIG_PLIST=y | 1547 | CONFIG_LZO_COMPRESS=m |
| 1548 | CONFIG_LZO_DECOMPRESS=m | ||
| 1009 | CONFIG_HAS_IOMEM=y | 1549 | CONFIG_HAS_IOMEM=y |
| 1010 | CONFIG_HAS_IOPORT=y | 1550 | CONFIG_HAS_IOPORT=y |
| 1011 | CONFIG_HAS_DMA=y | 1551 | CONFIG_HAS_DMA=y |
| 1552 | CONFIG_NLATTR=y | ||
diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h index 1f4df647c384..272c5ef35bbb 100644 --- a/arch/mips/include/asm/cpu-features.h +++ b/arch/mips/include/asm/cpu-features.h | |||
| @@ -191,6 +191,9 @@ | |||
| 191 | # ifndef cpu_has_64bit_addresses | 191 | # ifndef cpu_has_64bit_addresses |
| 192 | # define cpu_has_64bit_addresses 0 | 192 | # define cpu_has_64bit_addresses 0 |
| 193 | # endif | 193 | # endif |
| 194 | # ifndef cpu_vmbits | ||
| 195 | # define cpu_vmbits 31 | ||
| 196 | # endif | ||
| 194 | #endif | 197 | #endif |
| 195 | 198 | ||
| 196 | #ifdef CONFIG_64BIT | 199 | #ifdef CONFIG_64BIT |
| @@ -209,6 +212,10 @@ | |||
| 209 | # ifndef cpu_has_64bit_addresses | 212 | # ifndef cpu_has_64bit_addresses |
| 210 | # define cpu_has_64bit_addresses 1 | 213 | # define cpu_has_64bit_addresses 1 |
| 211 | # endif | 214 | # endif |
| 215 | # ifndef cpu_vmbits | ||
| 216 | # define cpu_vmbits cpu_data[0].vmbits | ||
| 217 | # define __NEED_VMBITS_PROBE | ||
| 218 | # endif | ||
| 212 | #endif | 219 | #endif |
| 213 | 220 | ||
| 214 | #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint) | 221 | #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint) |
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h index 126044308dec..b39def3f6e03 100644 --- a/arch/mips/include/asm/cpu-info.h +++ b/arch/mips/include/asm/cpu-info.h | |||
| @@ -58,6 +58,9 @@ struct cpuinfo_mips { | |||
| 58 | struct cache_desc tcache; /* Tertiary/split secondary cache */ | 58 | struct cache_desc tcache; /* Tertiary/split secondary cache */ |
| 59 | int srsets; /* Shadow register sets */ | 59 | int srsets; /* Shadow register sets */ |
| 60 | int core; /* physical core number */ | 60 | int core; /* physical core number */ |
| 61 | #ifdef CONFIG_64BIT | ||
| 62 | int vmbits; /* Virtual memory size in bits */ | ||
| 63 | #endif | ||
| 61 | #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC) | 64 | #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC) |
| 62 | /* | 65 | /* |
| 63 | * In the MIPS MT "SMTC" model, each TC is considered | 66 | * In the MIPS MT "SMTC" model, each TC is considered |
diff --git a/arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h b/arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h index 06f68f43800a..d206000fbfe2 100644 --- a/arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h +++ b/arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h | |||
| @@ -305,6 +305,7 @@ typedef struct dbdma_chan_config { | |||
| 305 | dbdev_tab_t *chan_dest; | 305 | dbdev_tab_t *chan_dest; |
| 306 | au1x_dma_chan_t *chan_ptr; | 306 | au1x_dma_chan_t *chan_ptr; |
| 307 | au1x_ddma_desc_t *chan_desc_base; | 307 | au1x_ddma_desc_t *chan_desc_base; |
| 308 | u32 cdb_membase; /* kmalloc base of above */ | ||
| 308 | au1x_ddma_desc_t *get_ptr, *put_ptr, *cur_ptr; | 309 | au1x_ddma_desc_t *get_ptr, *put_ptr, *cur_ptr; |
| 309 | void *chan_callparam; | 310 | void *chan_callparam; |
| 310 | void (*chan_callback)(int, void *); | 311 | void (*chan_callback)(int, void *); |
diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h index 9cd508993956..8eda30b467da 100644 --- a/arch/mips/include/asm/pgtable-64.h +++ b/arch/mips/include/asm/pgtable-64.h | |||
| @@ -110,7 +110,9 @@ | |||
| 110 | #define VMALLOC_START MAP_BASE | 110 | #define VMALLOC_START MAP_BASE |
| 111 | #define VMALLOC_END \ | 111 | #define VMALLOC_END \ |
| 112 | (VMALLOC_START + \ | 112 | (VMALLOC_START + \ |
| 113 | PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32)) | 113 | min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \ |
| 114 | (1UL << cpu_vmbits)) - (1UL << 32)) | ||
| 115 | |||
| 114 | #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \ | 116 | #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \ |
| 115 | VMALLOC_START != CKSSEG | 117 | VMALLOC_START != CKSSEG |
| 116 | /* Load modules into 32bit-compatible segment. */ | 118 | /* Load modules into 32bit-compatible segment. */ |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 80e202eca056..758ad426c57f 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -284,6 +284,15 @@ static inline int __cpu_has_fpu(void) | |||
| 284 | return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); | 284 | return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); |
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | static inline void cpu_probe_vmbits(struct cpuinfo_mips *c) | ||
| 288 | { | ||
| 289 | #ifdef __NEED_VMBITS_PROBE | ||
| 290 | write_c0_entryhi(0x3fffffffffffe000ULL); | ||
| 291 | back_to_back_c0_hazard(); | ||
| 292 | c->vmbits = fls64(read_c0_entryhi() & 0x3fffffffffffe000ULL); | ||
| 293 | #endif | ||
| 294 | } | ||
| 295 | |||
| 287 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ | 296 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ |
| 288 | | MIPS_CPU_COUNTER) | 297 | | MIPS_CPU_COUNTER) |
| 289 | 298 | ||
| @@ -969,6 +978,8 @@ __cpuinit void cpu_probe(void) | |||
| 969 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | 978 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; |
| 970 | else | 979 | else |
| 971 | c->srsets = 1; | 980 | c->srsets = 1; |
| 981 | |||
| 982 | cpu_probe_vmbits(c); | ||
| 972 | } | 983 | } |
| 973 | 984 | ||
| 974 | __cpuinit void cpu_report(void) | 985 | __cpuinit void cpu_report(void) |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 338dfe8ed002..31b204b26ba0 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -1501,6 +1501,7 @@ void __cpuinit per_cpu_trap_init(void) | |||
| 1501 | cp0_perfcount_irq = -1; | 1501 | cp0_perfcount_irq = -1; |
| 1502 | } else { | 1502 | } else { |
| 1503 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; | 1503 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; |
| 1504 | cp0_compare_irq_shift = cp0_compare_irq; | ||
| 1504 | cp0_perfcount_irq = -1; | 1505 | cp0_perfcount_irq = -1; |
| 1505 | } | 1506 | } |
| 1506 | 1507 | ||
diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c index 94e05e5733c1..e06f1af760a7 100644 --- a/arch/mips/mm/c-octeon.c +++ b/arch/mips/mm/c-octeon.c | |||
| @@ -174,7 +174,7 @@ static void octeon_flush_cache_page(struct vm_area_struct *vma, | |||
| 174 | * Probe Octeon's caches | 174 | * Probe Octeon's caches |
| 175 | * | 175 | * |
| 176 | */ | 176 | */ |
| 177 | static void __devinit probe_octeon(void) | 177 | static void __cpuinit probe_octeon(void) |
| 178 | { | 178 | { |
| 179 | unsigned long icache_size; | 179 | unsigned long icache_size; |
| 180 | unsigned long dcache_size; | 180 | unsigned long dcache_size; |
| @@ -235,7 +235,7 @@ static void __devinit probe_octeon(void) | |||
| 235 | * Setup the Octeon cache flush routines | 235 | * Setup the Octeon cache flush routines |
| 236 | * | 236 | * |
| 237 | */ | 237 | */ |
| 238 | void __devinit octeon_cache_init(void) | 238 | void __cpuinit octeon_cache_init(void) |
| 239 | { | 239 | { |
| 240 | extern unsigned long ebase; | 240 | extern unsigned long ebase; |
| 241 | extern char except_vec2_octeon; | 241 | extern char except_vec2_octeon; |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 102b2dfa542a..e716cafc346d 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
| @@ -155,7 +155,7 @@ static inline void setup_protection_map(void) | |||
| 155 | protection_map[15] = PAGE_SHARED; | 155 | protection_map[15] = PAGE_SHARED; |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | void __devinit cpu_cache_init(void) | 158 | void __cpuinit cpu_cache_init(void) |
| 159 | { | 159 | { |
| 160 | if (cpu_has_3k_cache) { | 160 | if (cpu_has_3k_cache) { |
| 161 | extern void __weak r3k_cache_init(void); | 161 | extern void __weak r3k_cache_init(void); |
diff --git a/arch/mips/sni/rm200.c b/arch/mips/sni/rm200.c index 46f00691f448..31e2583ec622 100644 --- a/arch/mips/sni/rm200.c +++ b/arch/mips/sni/rm200.c | |||
| @@ -404,7 +404,7 @@ void __init sni_rm200_i8259_irqs(void) | |||
| 404 | if (!rm200_pic_master) | 404 | if (!rm200_pic_master) |
| 405 | return; | 405 | return; |
| 406 | rm200_pic_slave = ioremap_nocache(0x160000a0, 4); | 406 | rm200_pic_slave = ioremap_nocache(0x160000a0, 4); |
| 407 | if (!rm200_pic_master) { | 407 | if (!rm200_pic_slave) { |
| 408 | iounmap(rm200_pic_master); | 408 | iounmap(rm200_pic_master); |
| 409 | return; | 409 | return; |
| 410 | } | 410 | } |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index fb37ac52e46c..35c827e94e31 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -468,7 +468,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 468 | recalc_sigpending(); | 468 | recalc_sigpending(); |
| 469 | spin_unlock_irq(¤t->sighand->siglock); | 469 | spin_unlock_irq(¤t->sighand->siglock); |
| 470 | 470 | ||
| 471 | tracehook_signal_handler(sig, info, ka, regs, 0); | 471 | tracehook_signal_handler(sig, info, ka, regs, |
| 472 | test_thread_flag(TIF_SINGLESTEP) || | ||
| 473 | test_thread_flag(TIF_BLOCKSTEP)); | ||
| 472 | 474 | ||
| 473 | return 1; | 475 | return 1; |
| 474 | } | 476 | } |
diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index 282d9306361f..1ec06576f619 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c | |||
| @@ -63,15 +63,21 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | |||
| 63 | if (huge) { | 63 | if (huge) { |
| 64 | #ifdef CONFIG_HUGETLB_PAGE | 64 | #ifdef CONFIG_HUGETLB_PAGE |
| 65 | psize = get_slice_psize(mm, addr); | 65 | psize = get_slice_psize(mm, addr); |
| 66 | /* Mask the address for the correct page size */ | ||
| 67 | addr &= ~((1UL << mmu_psize_defs[psize].shift) - 1); | ||
| 66 | #else | 68 | #else |
| 67 | BUG(); | 69 | BUG(); |
| 68 | psize = pte_pagesize_index(mm, addr, pte); /* shutup gcc */ | 70 | psize = pte_pagesize_index(mm, addr, pte); /* shutup gcc */ |
| 69 | #endif | 71 | #endif |
| 70 | } else | 72 | } else { |
| 71 | psize = pte_pagesize_index(mm, addr, pte); | 73 | psize = pte_pagesize_index(mm, addr, pte); |
| 74 | /* Mask the address for the standard page size. If we | ||
| 75 | * have a 64k page kernel, but the hardware does not | ||
| 76 | * support 64k pages, this might be different from the | ||
| 77 | * hardware page size encoded in the slice table. */ | ||
| 78 | addr &= PAGE_MASK; | ||
| 79 | } | ||
| 72 | 80 | ||
| 73 | /* Mask the address for the correct page size */ | ||
| 74 | addr &= ~((1UL << mmu_psize_defs[psize].shift) - 1); | ||
| 75 | 81 | ||
| 76 | /* Build full vaddr */ | 82 | /* Build full vaddr */ |
| 77 | if (!is_kernel_addr(addr)) { | 83 | if (!is_kernel_addr(addr)) { |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 1ee66db003be..f5f79196721c 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
| @@ -784,9 +784,13 @@ static void xics_set_cpu_priority(unsigned char cppr) | |||
| 784 | { | 784 | { |
| 785 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); | 785 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); |
| 786 | 786 | ||
| 787 | BUG_ON(os_cppr->index != 0); | 787 | /* |
| 788 | * we only really want to set the priority when there's | ||
| 789 | * just one cppr value on the stack | ||
| 790 | */ | ||
| 791 | WARN_ON(os_cppr->index != 0); | ||
| 788 | 792 | ||
| 789 | os_cppr->stack[os_cppr->index] = cppr; | 793 | os_cppr->stack[0] = cppr; |
| 790 | 794 | ||
| 791 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 795 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
| 792 | lpar_cppr_info(cppr); | 796 | lpar_cppr_info(cppr); |
| @@ -821,8 +825,14 @@ void xics_setup_cpu(void) | |||
| 821 | 825 | ||
| 822 | void xics_teardown_cpu(void) | 826 | void xics_teardown_cpu(void) |
| 823 | { | 827 | { |
| 828 | struct xics_cppr *os_cppr = &__get_cpu_var(xics_cppr); | ||
| 824 | int cpu = smp_processor_id(); | 829 | int cpu = smp_processor_id(); |
| 825 | 830 | ||
| 831 | /* | ||
| 832 | * we have to reset the cppr index to 0 because we're | ||
| 833 | * not going to return from the IPI | ||
| 834 | */ | ||
| 835 | os_cppr->index = 0; | ||
| 826 | xics_set_cpu_priority(0); | 836 | xics_set_cpu_priority(0); |
| 827 | 837 | ||
| 828 | /* Clear any pending IPI request */ | 838 | /* Clear any pending IPI request */ |
diff --git a/arch/s390/include/asm/lowcore.h b/arch/s390/include/asm/lowcore.h index f2ef4b619ce1..c25dfac7dd76 100644 --- a/arch/s390/include/asm/lowcore.h +++ b/arch/s390/include/asm/lowcore.h | |||
| @@ -293,12 +293,12 @@ struct _lowcore | |||
| 293 | __u64 clock_comparator; /* 0x02d0 */ | 293 | __u64 clock_comparator; /* 0x02d0 */ |
| 294 | __u32 machine_flags; /* 0x02d8 */ | 294 | __u32 machine_flags; /* 0x02d8 */ |
| 295 | __u32 ftrace_func; /* 0x02dc */ | 295 | __u32 ftrace_func; /* 0x02dc */ |
| 296 | __u8 pad_0x02f0[0x0300-0x02f0]; /* 0x02f0 */ | 296 | __u8 pad_0x02e0[0x0300-0x02e0]; /* 0x02e0 */ |
| 297 | 297 | ||
| 298 | /* Interrupt response block */ | 298 | /* Interrupt response block */ |
| 299 | __u8 irb[64]; /* 0x0300 */ | 299 | __u8 irb[64]; /* 0x0300 */ |
| 300 | 300 | ||
| 301 | __u8 pad_0x0400[0x0e00-0x0400]; /* 0x0400 */ | 301 | __u8 pad_0x0340[0x0e00-0x0340]; /* 0x0340 */ |
| 302 | 302 | ||
| 303 | /* | 303 | /* |
| 304 | * 0xe00 contains the address of the IPL Parameter Information | 304 | * 0xe00 contains the address of the IPL Parameter Information |
diff --git a/arch/sh/kernel/cpu/clock.c b/arch/sh/kernel/cpu/clock.c index f3a46be2ae81..83da5debeedf 100644 --- a/arch/sh/kernel/cpu/clock.c +++ b/arch/sh/kernel/cpu/clock.c | |||
| @@ -598,7 +598,7 @@ static struct dentry *clk_debugfs_root; | |||
| 598 | static int clk_debugfs_register_one(struct clk *c) | 598 | static int clk_debugfs_register_one(struct clk *c) |
| 599 | { | 599 | { |
| 600 | int err; | 600 | int err; |
| 601 | struct dentry *d, *child; | 601 | struct dentry *d, *child, *child_tmp; |
| 602 | struct clk *pa = c->parent; | 602 | struct clk *pa = c->parent; |
| 603 | char s[255]; | 603 | char s[255]; |
| 604 | char *p = s; | 604 | char *p = s; |
| @@ -630,7 +630,7 @@ static int clk_debugfs_register_one(struct clk *c) | |||
| 630 | 630 | ||
| 631 | err_out: | 631 | err_out: |
| 632 | d = c->dentry; | 632 | d = c->dentry; |
| 633 | list_for_each_entry(child, &d->d_subdirs, d_u.d_child) | 633 | list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child) |
| 634 | debugfs_remove(child); | 634 | debugfs_remove(child); |
| 635 | debugfs_remove(c->dentry); | 635 | debugfs_remove(c->dentry); |
| 636 | return err; | 636 | return err; |
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index 3f7e2a22c7c2..f6a389c996cb 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
| @@ -132,7 +132,6 @@ ENTRY(tlb_protection_violation_store) | |||
| 132 | mov #1, r5 | 132 | mov #1, r5 |
| 133 | 133 | ||
| 134 | call_handle_tlbmiss: | 134 | call_handle_tlbmiss: |
| 135 | setup_frame_reg | ||
| 136 | mov.l 1f, r0 | 135 | mov.l 1f, r0 |
| 137 | mov r5, r8 | 136 | mov r5, r8 |
| 138 | mov.l @r0, r6 | 137 | mov.l @r0, r6 |
| @@ -365,6 +364,8 @@ handle_exception: | |||
| 365 | mov.l @k2, k2 ! read out vector and keep in k2 | 364 | mov.l @k2, k2 ! read out vector and keep in k2 |
| 366 | 365 | ||
| 367 | handle_exception_special: | 366 | handle_exception_special: |
| 367 | setup_frame_reg | ||
| 368 | |||
| 368 | ! Setup return address and jump to exception handler | 369 | ! Setup return address and jump to exception handler |
| 369 | mov.l 7f, r9 ! fetch return address | 370 | mov.l 7f, r9 ! fetch return address |
| 370 | stc r2_bank, r0 ! k2 (vector) | 371 | stc r2_bank, r0 ! k2 (vector) |
diff --git a/arch/sh/kernel/dwarf.c b/arch/sh/kernel/dwarf.c index 3576b709f052..e51168064e56 100644 --- a/arch/sh/kernel/dwarf.c +++ b/arch/sh/kernel/dwarf.c | |||
| @@ -540,6 +540,8 @@ void dwarf_free_frame(struct dwarf_frame *frame) | |||
| 540 | mempool_free(frame, dwarf_frame_pool); | 540 | mempool_free(frame, dwarf_frame_pool); |
| 541 | } | 541 | } |
| 542 | 542 | ||
| 543 | extern void ret_from_irq(void); | ||
| 544 | |||
| 543 | /** | 545 | /** |
| 544 | * dwarf_unwind_stack - unwind the stack | 546 | * dwarf_unwind_stack - unwind the stack |
| 545 | * | 547 | * |
| @@ -678,6 +680,24 @@ struct dwarf_frame * dwarf_unwind_stack(unsigned long pc, | |||
| 678 | addr = frame->cfa + reg->addr; | 680 | addr = frame->cfa + reg->addr; |
| 679 | frame->return_addr = __raw_readl(addr); | 681 | frame->return_addr = __raw_readl(addr); |
| 680 | 682 | ||
| 683 | /* | ||
| 684 | * Ah, the joys of unwinding through interrupts. | ||
| 685 | * | ||
| 686 | * Interrupts are tricky - the DWARF info needs to be _really_ | ||
| 687 | * accurate and unfortunately I'm seeing a lot of bogus DWARF | ||
| 688 | * info. For example, I've seen interrupts occur in epilogues | ||
| 689 | * just after the frame pointer (r14) had been restored. The | ||
| 690 | * problem was that the DWARF info claimed that the CFA could be | ||
| 691 | * reached by using the value of the frame pointer before it was | ||
| 692 | * restored. | ||
| 693 | * | ||
| 694 | * So until the compiler can be trusted to produce reliable | ||
| 695 | * DWARF info when it really matters, let's stop unwinding once | ||
| 696 | * we've calculated the function that was interrupted. | ||
| 697 | */ | ||
| 698 | if (prev && prev->pc == (unsigned long)ret_from_irq) | ||
| 699 | frame->return_addr = 0; | ||
| 700 | |||
| 681 | return frame; | 701 | return frame; |
| 682 | 702 | ||
| 683 | bail: | 703 | bail: |
| @@ -892,18 +912,18 @@ static struct unwinder dwarf_unwinder = { | |||
| 892 | 912 | ||
| 893 | static void dwarf_unwinder_cleanup(void) | 913 | static void dwarf_unwinder_cleanup(void) |
| 894 | { | 914 | { |
| 895 | struct dwarf_cie *cie; | 915 | struct dwarf_cie *cie, *cie_tmp; |
| 896 | struct dwarf_fde *fde; | 916 | struct dwarf_fde *fde, *fde_tmp; |
| 897 | 917 | ||
| 898 | /* | 918 | /* |
| 899 | * Deallocate all the memory allocated for the DWARF unwinder. | 919 | * Deallocate all the memory allocated for the DWARF unwinder. |
| 900 | * Traverse all the FDE/CIE lists and remove and free all the | 920 | * Traverse all the FDE/CIE lists and remove and free all the |
| 901 | * memory associated with those data structures. | 921 | * memory associated with those data structures. |
| 902 | */ | 922 | */ |
| 903 | list_for_each_entry(cie, &dwarf_cie_list, link) | 923 | list_for_each_entry_safe(cie, cie_tmp, &dwarf_cie_list, link) |
| 904 | kfree(cie); | 924 | kfree(cie); |
| 905 | 925 | ||
| 906 | list_for_each_entry(fde, &dwarf_fde_list, link) | 926 | list_for_each_entry_safe(fde, fde_tmp, &dwarf_fde_list, link) |
| 907 | kfree(fde); | 927 | kfree(fde); |
| 908 | 928 | ||
| 909 | kmem_cache_destroy(dwarf_reg_cachep); | 929 | kmem_cache_destroy(dwarf_reg_cachep); |
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index f0abd58c3a69..2b15ae60c3a0 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
| @@ -70,8 +70,14 @@ ret_from_exception: | |||
| 70 | CFI_STARTPROC simple | 70 | CFI_STARTPROC simple |
| 71 | CFI_DEF_CFA r14, 0 | 71 | CFI_DEF_CFA r14, 0 |
| 72 | CFI_REL_OFFSET 17, 64 | 72 | CFI_REL_OFFSET 17, 64 |
| 73 | CFI_REL_OFFSET 15, 0 | 73 | CFI_REL_OFFSET 15, 60 |
| 74 | CFI_REL_OFFSET 14, 56 | 74 | CFI_REL_OFFSET 14, 56 |
| 75 | CFI_REL_OFFSET 13, 52 | ||
| 76 | CFI_REL_OFFSET 12, 48 | ||
| 77 | CFI_REL_OFFSET 11, 44 | ||
| 78 | CFI_REL_OFFSET 10, 40 | ||
| 79 | CFI_REL_OFFSET 9, 36 | ||
| 80 | CFI_REL_OFFSET 8, 32 | ||
| 75 | preempt_stop() | 81 | preempt_stop() |
| 76 | ENTRY(ret_from_irq) | 82 | ENTRY(ret_from_irq) |
| 77 | ! | 83 | ! |
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c index 2830b415e214..c49865b30719 100644 --- a/arch/sparc/kernel/process_32.c +++ b/arch/sparc/kernel/process_32.c | |||
| @@ -526,7 +526,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
| 526 | * Set some valid stack frames to give to the child. | 526 | * Set some valid stack frames to give to the child. |
| 527 | */ | 527 | */ |
| 528 | childstack = (struct sparc_stackf __user *) | 528 | childstack = (struct sparc_stackf __user *) |
| 529 | (sp & ~0x7UL); | 529 | (sp & ~0xfUL); |
| 530 | parentstack = (struct sparc_stackf __user *) | 530 | parentstack = (struct sparc_stackf __user *) |
| 531 | regs->u_regs[UREG_FP]; | 531 | regs->u_regs[UREG_FP]; |
| 532 | 532 | ||
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c index c3f1cce0e95e..cb70476bd8f5 100644 --- a/arch/sparc/kernel/process_64.c +++ b/arch/sparc/kernel/process_64.c | |||
| @@ -398,11 +398,11 @@ static unsigned long clone_stackframe(unsigned long csp, unsigned long psp) | |||
| 398 | } else | 398 | } else |
| 399 | __get_user(fp, &(((struct reg_window32 __user *)psp)->ins[6])); | 399 | __get_user(fp, &(((struct reg_window32 __user *)psp)->ins[6])); |
| 400 | 400 | ||
| 401 | /* Now 8-byte align the stack as this is mandatory in the | 401 | /* Now align the stack as this is mandatory in the Sparc ABI |
| 402 | * Sparc ABI due to how register windows work. This hides | 402 | * due to how register windows work. This hides the |
| 403 | * the restriction from thread libraries etc. -DaveM | 403 | * restriction from thread libraries etc. |
| 404 | */ | 404 | */ |
| 405 | csp &= ~7UL; | 405 | csp &= ~15UL; |
| 406 | 406 | ||
| 407 | distance = fp - psp; | 407 | distance = fp - psp; |
| 408 | rval = (csp - distance); | 408 | rval = (csp - distance); |
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index ba5b09ad6666..ea22cd373c64 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
| @@ -120,8 +120,8 @@ struct rt_signal_frame32 { | |||
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | /* Align macros */ | 122 | /* Align macros */ |
| 123 | #define SF_ALIGNEDSZ (((sizeof(struct signal_frame32) + 7) & (~7))) | 123 | #define SF_ALIGNEDSZ (((sizeof(struct signal_frame32) + 15) & (~15))) |
| 124 | #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7))) | 124 | #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 15) & (~15))) |
| 125 | 125 | ||
| 126 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | 126 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) |
| 127 | { | 127 | { |
| @@ -420,15 +420,17 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns | |||
| 420 | sp = current->sas_ss_sp + current->sas_ss_size; | 420 | sp = current->sas_ss_sp + current->sas_ss_size; |
| 421 | } | 421 | } |
| 422 | 422 | ||
| 423 | sp -= framesize; | ||
| 424 | |||
| 423 | /* Always align the stack frame. This handles two cases. First, | 425 | /* Always align the stack frame. This handles two cases. First, |
| 424 | * sigaltstack need not be mindful of platform specific stack | 426 | * sigaltstack need not be mindful of platform specific stack |
| 425 | * alignment. Second, if we took this signal because the stack | 427 | * alignment. Second, if we took this signal because the stack |
| 426 | * is not aligned properly, we'd like to take the signal cleanly | 428 | * is not aligned properly, we'd like to take the signal cleanly |
| 427 | * and report that. | 429 | * and report that. |
| 428 | */ | 430 | */ |
| 429 | sp &= ~7UL; | 431 | sp &= ~15UL; |
| 430 | 432 | ||
| 431 | return (void __user *)(sp - framesize); | 433 | return (void __user *) sp; |
| 432 | } | 434 | } |
| 433 | 435 | ||
| 434 | static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) | 436 | static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) |
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 7ce1a1005b1d..9882df92ba0a 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
| @@ -267,15 +267,17 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re | |||
| 267 | sp = current->sas_ss_sp + current->sas_ss_size; | 267 | sp = current->sas_ss_sp + current->sas_ss_size; |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | sp -= framesize; | ||
| 271 | |||
| 270 | /* Always align the stack frame. This handles two cases. First, | 272 | /* Always align the stack frame. This handles two cases. First, |
| 271 | * sigaltstack need not be mindful of platform specific stack | 273 | * sigaltstack need not be mindful of platform specific stack |
| 272 | * alignment. Second, if we took this signal because the stack | 274 | * alignment. Second, if we took this signal because the stack |
| 273 | * is not aligned properly, we'd like to take the signal cleanly | 275 | * is not aligned properly, we'd like to take the signal cleanly |
| 274 | * and report that. | 276 | * and report that. |
| 275 | */ | 277 | */ |
| 276 | sp &= ~7UL; | 278 | sp &= ~15UL; |
| 277 | 279 | ||
| 278 | return (void __user *)(sp - framesize); | 280 | return (void __user *) sp; |
| 279 | } | 281 | } |
| 280 | 282 | ||
| 281 | static inline int | 283 | static inline int |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 647afbda7ae1..9fa48c30037e 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -353,7 +353,7 @@ segv: | |||
| 353 | /* Checks if the fp is valid */ | 353 | /* Checks if the fp is valid */ |
| 354 | static int invalid_frame_pointer(void __user *fp, int fplen) | 354 | static int invalid_frame_pointer(void __user *fp, int fplen) |
| 355 | { | 355 | { |
| 356 | if (((unsigned long) fp) & 7) | 356 | if (((unsigned long) fp) & 15) |
| 357 | return 1; | 357 | return 1; |
| 358 | return 0; | 358 | return 0; |
| 359 | } | 359 | } |
| @@ -396,15 +396,17 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
| 396 | sp = current->sas_ss_sp + current->sas_ss_size; | 396 | sp = current->sas_ss_sp + current->sas_ss_size; |
| 397 | } | 397 | } |
| 398 | 398 | ||
| 399 | sp -= framesize; | ||
| 400 | |||
| 399 | /* Always align the stack frame. This handles two cases. First, | 401 | /* Always align the stack frame. This handles two cases. First, |
| 400 | * sigaltstack need not be mindful of platform specific stack | 402 | * sigaltstack need not be mindful of platform specific stack |
| 401 | * alignment. Second, if we took this signal because the stack | 403 | * alignment. Second, if we took this signal because the stack |
| 402 | * is not aligned properly, we'd like to take the signal cleanly | 404 | * is not aligned properly, we'd like to take the signal cleanly |
| 403 | * and report that. | 405 | * and report that. |
| 404 | */ | 406 | */ |
| 405 | sp &= ~7UL; | 407 | sp &= ~15UL; |
| 406 | 408 | ||
| 407 | return (void __user *)(sp - framesize); | 409 | return (void __user *) sp; |
| 408 | } | 410 | } |
| 409 | 411 | ||
| 410 | static inline void | 412 | static inline void |
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index ecb544e65382..e04740f7a0bb 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -11,9 +11,9 @@ | |||
| 11 | #include <linux/irqflags.h> | 11 | #include <linux/irqflags.h> |
| 12 | 12 | ||
| 13 | /* entries in ARCH_DLINFO: */ | 13 | /* entries in ARCH_DLINFO: */ |
| 14 | #ifdef CONFIG_IA32_EMULATION | 14 | #if defined(CONFIG_IA32_EMULATION) || !defined(CONFIG_X86_64) |
| 15 | # define AT_VECTOR_SIZE_ARCH 2 | 15 | # define AT_VECTOR_SIZE_ARCH 2 |
| 16 | #else | 16 | #else /* else it's non-compat x86-64 */ |
| 17 | # define AT_VECTOR_SIZE_ARCH 1 | 17 | # define AT_VECTOR_SIZE_ARCH 1 |
| 18 | #endif | 18 | #endif |
| 19 | 19 | ||
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 036d28adf59d..0acbcdfa5ca4 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -1185,9 +1185,6 @@ static void __init acpi_process_madt(void) | |||
| 1185 | if (!error) { | 1185 | if (!error) { |
| 1186 | acpi_lapic = 1; | 1186 | acpi_lapic = 1; |
| 1187 | 1187 | ||
| 1188 | #ifdef CONFIG_X86_BIGSMP | ||
| 1189 | generic_bigsmp_probe(); | ||
| 1190 | #endif | ||
| 1191 | /* | 1188 | /* |
| 1192 | * Parse MADT IO-APIC entries | 1189 | * Parse MADT IO-APIC entries |
| 1193 | */ | 1190 | */ |
| @@ -1197,8 +1194,6 @@ static void __init acpi_process_madt(void) | |||
| 1197 | acpi_ioapic = 1; | 1194 | acpi_ioapic = 1; |
| 1198 | 1195 | ||
| 1199 | smp_found_config = 1; | 1196 | smp_found_config = 1; |
| 1200 | if (apic->setup_apic_routing) | ||
| 1201 | apic->setup_apic_routing(); | ||
| 1202 | } | 1197 | } |
| 1203 | } | 1198 | } |
| 1204 | if (error == -EINVAL) { | 1199 | if (error == -EINVAL) { |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 3987e4408f75..dfca210f6a10 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
| @@ -1641,9 +1641,7 @@ int __init APIC_init_uniprocessor(void) | |||
| 1641 | #endif | 1641 | #endif |
| 1642 | 1642 | ||
| 1643 | enable_IR_x2apic(); | 1643 | enable_IR_x2apic(); |
| 1644 | #ifdef CONFIG_X86_64 | ||
| 1645 | default_setup_apic_routing(); | 1644 | default_setup_apic_routing(); |
| 1646 | #endif | ||
| 1647 | 1645 | ||
| 1648 | verify_local_APIC(); | 1646 | verify_local_APIC(); |
| 1649 | connect_bsp_APIC(); | 1647 | connect_bsp_APIC(); |
| @@ -1891,21 +1889,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1891 | if (apicid > max_physical_apicid) | 1889 | if (apicid > max_physical_apicid) |
| 1892 | max_physical_apicid = apicid; | 1890 | max_physical_apicid = apicid; |
| 1893 | 1891 | ||
| 1894 | #ifdef CONFIG_X86_32 | ||
| 1895 | if (num_processors > 8) { | ||
| 1896 | switch (boot_cpu_data.x86_vendor) { | ||
| 1897 | case X86_VENDOR_INTEL: | ||
| 1898 | if (!APIC_XAPIC(version)) { | ||
| 1899 | def_to_bigsmp = 0; | ||
| 1900 | break; | ||
| 1901 | } | ||
| 1902 | /* If P4 and above fall through */ | ||
| 1903 | case X86_VENDOR_AMD: | ||
| 1904 | def_to_bigsmp = 1; | ||
| 1905 | } | ||
| 1906 | } | ||
| 1907 | #endif | ||
| 1908 | |||
| 1909 | #if defined(CONFIG_SMP) || defined(CONFIG_X86_64) | 1892 | #if defined(CONFIG_SMP) || defined(CONFIG_X86_64) |
| 1910 | early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; | 1893 | early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; |
| 1911 | early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; | 1894 | early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; |
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c index 1a6559f6768c..99d2fe016084 100644 --- a/arch/x86/kernel/apic/probe_32.c +++ b/arch/x86/kernel/apic/probe_32.c | |||
| @@ -52,7 +52,32 @@ static int __init print_ipi_mode(void) | |||
| 52 | } | 52 | } |
| 53 | late_initcall(print_ipi_mode); | 53 | late_initcall(print_ipi_mode); |
| 54 | 54 | ||
| 55 | void default_setup_apic_routing(void) | 55 | void __init default_setup_apic_routing(void) |
| 56 | { | ||
| 57 | int version = apic_version[boot_cpu_physical_apicid]; | ||
| 58 | |||
| 59 | if (num_possible_cpus() > 8) { | ||
| 60 | switch (boot_cpu_data.x86_vendor) { | ||
| 61 | case X86_VENDOR_INTEL: | ||
| 62 | if (!APIC_XAPIC(version)) { | ||
| 63 | def_to_bigsmp = 0; | ||
| 64 | break; | ||
| 65 | } | ||
| 66 | /* If P4 and above fall through */ | ||
| 67 | case X86_VENDOR_AMD: | ||
| 68 | def_to_bigsmp = 1; | ||
| 69 | } | ||
| 70 | } | ||
| 71 | |||
| 72 | #ifdef CONFIG_X86_BIGSMP | ||
| 73 | generic_bigsmp_probe(); | ||
| 74 | #endif | ||
| 75 | |||
| 76 | if (apic->setup_apic_routing) | ||
| 77 | apic->setup_apic_routing(); | ||
| 78 | } | ||
| 79 | |||
| 80 | static void setup_apic_flat_routing(void) | ||
| 56 | { | 81 | { |
| 57 | #ifdef CONFIG_X86_IO_APIC | 82 | #ifdef CONFIG_X86_IO_APIC |
| 58 | printk(KERN_INFO | 83 | printk(KERN_INFO |
| @@ -103,7 +128,7 @@ struct apic apic_default = { | |||
| 103 | .init_apic_ldr = default_init_apic_ldr, | 128 | .init_apic_ldr = default_init_apic_ldr, |
| 104 | 129 | ||
| 105 | .ioapic_phys_id_map = default_ioapic_phys_id_map, | 130 | .ioapic_phys_id_map = default_ioapic_phys_id_map, |
| 106 | .setup_apic_routing = default_setup_apic_routing, | 131 | .setup_apic_routing = setup_apic_flat_routing, |
| 107 | .multi_timer_check = NULL, | 132 | .multi_timer_check = NULL, |
| 108 | .apicid_to_node = default_apicid_to_node, | 133 | .apicid_to_node = default_apicid_to_node, |
| 109 | .cpu_to_logical_apicid = default_cpu_to_logical_apicid, | 134 | .cpu_to_logical_apicid = default_cpu_to_logical_apicid, |
diff --git a/arch/x86/kernel/apic/probe_64.c b/arch/x86/kernel/apic/probe_64.c index 450fe2064a14..83e9be4778e2 100644 --- a/arch/x86/kernel/apic/probe_64.c +++ b/arch/x86/kernel/apic/probe_64.c | |||
| @@ -67,7 +67,7 @@ void __init default_setup_apic_routing(void) | |||
| 67 | } | 67 | } |
| 68 | #endif | 68 | #endif |
| 69 | 69 | ||
| 70 | if (apic == &apic_flat && num_processors > 8) | 70 | if (apic == &apic_flat && num_possible_cpus() > 8) |
| 71 | apic = &apic_physflat; | 71 | apic = &apic_physflat; |
| 72 | 72 | ||
| 73 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); | 73 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index f125e5c551c0..6e44519960c8 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1356,6 +1356,7 @@ static int __devexit powernowk8_cpu_exit(struct cpufreq_policy *pol) | |||
| 1356 | 1356 | ||
| 1357 | kfree(data->powernow_table); | 1357 | kfree(data->powernow_table); |
| 1358 | kfree(data); | 1358 | kfree(data); |
| 1359 | per_cpu(powernow_data, pol->cpu) = NULL; | ||
| 1359 | 1360 | ||
| 1360 | return 0; | 1361 | return 0; |
| 1361 | } | 1362 | } |
| @@ -1375,7 +1376,7 @@ static unsigned int powernowk8_get(unsigned int cpu) | |||
| 1375 | int err; | 1376 | int err; |
| 1376 | 1377 | ||
| 1377 | if (!data) | 1378 | if (!data) |
| 1378 | return -EINVAL; | 1379 | return 0; |
| 1379 | 1380 | ||
| 1380 | smp_call_function_single(cpu, query_values_on_cpu, &err, true); | 1381 | smp_call_function_single(cpu, query_values_on_cpu, &err, true); |
| 1381 | if (err) | 1382 | if (err) |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 40b54ceb68b5..a2c1edd2d3ac 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -359,13 +359,6 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
| 359 | x86_init.mpparse.mpc_record(1); | 359 | x86_init.mpparse.mpc_record(1); |
| 360 | } | 360 | } |
| 361 | 361 | ||
| 362 | #ifdef CONFIG_X86_BIGSMP | ||
| 363 | generic_bigsmp_probe(); | ||
| 364 | #endif | ||
| 365 | |||
| 366 | if (apic->setup_apic_routing) | ||
| 367 | apic->setup_apic_routing(); | ||
| 368 | |||
| 369 | if (!num_processors) | 362 | if (!num_processors) |
| 370 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); | 363 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); |
| 371 | return num_processors; | 364 | return num_processors; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 678d0b8c26f3..b4e870cbdc60 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -1083,9 +1083,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1083 | set_cpu_sibling_map(0); | 1083 | set_cpu_sibling_map(0); |
| 1084 | 1084 | ||
| 1085 | enable_IR_x2apic(); | 1085 | enable_IR_x2apic(); |
| 1086 | #ifdef CONFIG_X86_64 | ||
| 1087 | default_setup_apic_routing(); | 1086 | default_setup_apic_routing(); |
| 1088 | #endif | ||
| 1089 | 1087 | ||
| 1090 | if (smp_sanity_check(max_cpus) < 0) { | 1088 | if (smp_sanity_check(max_cpus) < 0) { |
| 1091 | printk(KERN_INFO "SMP disabled\n"); | 1089 | printk(KERN_INFO "SMP disabled\n"); |
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 296aba49472a..15578f180e59 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
| @@ -467,6 +467,9 @@ static int pit_ioport_read(struct kvm_io_device *this, | |||
| 467 | return -EOPNOTSUPP; | 467 | return -EOPNOTSUPP; |
| 468 | 468 | ||
| 469 | addr &= KVM_PIT_CHANNEL_MASK; | 469 | addr &= KVM_PIT_CHANNEL_MASK; |
| 470 | if (addr == 3) | ||
| 471 | return 0; | ||
| 472 | |||
| 470 | s = &pit_state->channels[addr]; | 473 | s = &pit_state->channels[addr]; |
| 471 | 474 | ||
| 472 | mutex_lock(&pit_state->lock); | 475 | mutex_lock(&pit_state->lock); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 1ddcad452add..a1e1bc9d412d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -670,7 +670,7 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock) | |||
| 670 | { | 670 | { |
| 671 | static int version; | 671 | static int version; |
| 672 | struct pvclock_wall_clock wc; | 672 | struct pvclock_wall_clock wc; |
| 673 | struct timespec now, sys, boot; | 673 | struct timespec boot; |
| 674 | 674 | ||
| 675 | if (!wall_clock) | 675 | if (!wall_clock) |
| 676 | return; | 676 | return; |
| @@ -685,9 +685,7 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock) | |||
| 685 | * wall clock specified here. guest system time equals host | 685 | * wall clock specified here. guest system time equals host |
| 686 | * system time for us, thus we must fill in host boot time here. | 686 | * system time for us, thus we must fill in host boot time here. |
| 687 | */ | 687 | */ |
| 688 | now = current_kernel_time(); | 688 | getboottime(&boot); |
| 689 | ktime_get_ts(&sys); | ||
| 690 | boot = ns_to_timespec(timespec_to_ns(&now) - timespec_to_ns(&sys)); | ||
| 691 | 689 | ||
| 692 | wc.sec = boot.tv_sec; | 690 | wc.sec = boot.tv_sec; |
| 693 | wc.nsec = boot.tv_nsec; | 691 | wc.nsec = boot.tv_nsec; |
| @@ -762,6 +760,7 @@ static void kvm_write_guest_time(struct kvm_vcpu *v) | |||
| 762 | local_irq_save(flags); | 760 | local_irq_save(flags); |
| 763 | kvm_get_msr(v, MSR_IA32_TSC, &vcpu->hv_clock.tsc_timestamp); | 761 | kvm_get_msr(v, MSR_IA32_TSC, &vcpu->hv_clock.tsc_timestamp); |
| 764 | ktime_get_ts(&ts); | 762 | ktime_get_ts(&ts); |
| 763 | monotonic_to_bootbased(&ts); | ||
| 765 | local_irq_restore(flags); | 764 | local_irq_restore(flags); |
| 766 | 765 | ||
| 767 | /* With all the info we got, fill in the values */ | 766 | /* With all the info we got, fill in the values */ |
diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index 71da1bca13cb..738e6593799d 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c | |||
| @@ -18,7 +18,7 @@ static inline pte_t gup_get_pte(pte_t *ptep) | |||
| 18 | #else | 18 | #else |
| 19 | /* | 19 | /* |
| 20 | * With get_user_pages_fast, we walk down the pagetables without taking | 20 | * With get_user_pages_fast, we walk down the pagetables without taking |
| 21 | * any locks. For this we would like to load the pointers atoimcally, | 21 | * any locks. For this we would like to load the pointers atomically, |
| 22 | * but that is not possible (without expensive cmpxchg8b) on PAE. What | 22 | * but that is not possible (without expensive cmpxchg8b) on PAE. What |
| 23 | * we do have is the guarantee that a pte will only either go from not | 23 | * we do have is the guarantee that a pte will only either go from not |
| 24 | * present to present, or present to not present or both -- it will not | 24 | * present to present, or present to not present or both -- it will not |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 5198b9bb34ef..69ddfbd91135 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <asm/numa.h> | 49 | #include <asm/numa.h> |
| 50 | #include <asm/cacheflush.h> | 50 | #include <asm/cacheflush.h> |
| 51 | #include <asm/init.h> | 51 | #include <asm/init.h> |
| 52 | #include <linux/bootmem.h> | ||
| 52 | 53 | ||
| 53 | static unsigned long dma_reserve __initdata; | 54 | static unsigned long dma_reserve __initdata; |
| 54 | 55 | ||
| @@ -616,6 +617,21 @@ void __init paging_init(void) | |||
| 616 | */ | 617 | */ |
| 617 | #ifdef CONFIG_MEMORY_HOTPLUG | 618 | #ifdef CONFIG_MEMORY_HOTPLUG |
| 618 | /* | 619 | /* |
| 620 | * After memory hotplug the variables max_pfn, max_low_pfn and high_memory need | ||
| 621 | * updating. | ||
| 622 | */ | ||
| 623 | static void update_end_of_memory_vars(u64 start, u64 size) | ||
| 624 | { | ||
| 625 | unsigned long end_pfn = PFN_UP(start + size); | ||
| 626 | |||
| 627 | if (end_pfn > max_pfn) { | ||
| 628 | max_pfn = end_pfn; | ||
| 629 | max_low_pfn = end_pfn; | ||
| 630 | high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1; | ||
| 631 | } | ||
| 632 | } | ||
| 633 | |||
| 634 | /* | ||
| 619 | * Memory is added always to NORMAL zone. This means you will never get | 635 | * Memory is added always to NORMAL zone. This means you will never get |
| 620 | * additional DMA/DMA32 memory. | 636 | * additional DMA/DMA32 memory. |
| 621 | */ | 637 | */ |
| @@ -634,6 +650,9 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
| 634 | ret = __add_pages(nid, zone, start_pfn, nr_pages); | 650 | ret = __add_pages(nid, zone, start_pfn, nr_pages); |
| 635 | WARN_ON_ONCE(ret); | 651 | WARN_ON_ONCE(ret); |
| 636 | 652 | ||
| 653 | /* update max_pfn, max_low_pfn and high_memory */ | ||
| 654 | update_end_of_memory_vars(start, size); | ||
| 655 | |||
| 637 | return ret; | 656 | return ret; |
| 638 | } | 657 | } |
| 639 | EXPORT_SYMBOL_GPL(arch_add_memory); | 658 | EXPORT_SYMBOL_GPL(arch_add_memory); |
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 1fa2654db0a6..e7dbbaf5fb3e 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
| @@ -147,16 +147,16 @@ blkiocg_weight_write(struct cgroup *cgroup, struct cftype *cftype, u64 val) | |||
| 147 | return -EINVAL; | 147 | return -EINVAL; |
| 148 | 148 | ||
| 149 | blkcg = cgroup_to_blkio_cgroup(cgroup); | 149 | blkcg = cgroup_to_blkio_cgroup(cgroup); |
| 150 | spin_lock(&blkio_list_lock); | ||
| 150 | spin_lock_irq(&blkcg->lock); | 151 | spin_lock_irq(&blkcg->lock); |
| 151 | blkcg->weight = (unsigned int)val; | 152 | blkcg->weight = (unsigned int)val; |
| 152 | hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) { | 153 | hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) { |
| 153 | spin_lock(&blkio_list_lock); | ||
| 154 | list_for_each_entry(blkiop, &blkio_list, list) | 154 | list_for_each_entry(blkiop, &blkio_list, list) |
| 155 | blkiop->ops.blkio_update_group_weight_fn(blkg, | 155 | blkiop->ops.blkio_update_group_weight_fn(blkg, |
| 156 | blkcg->weight); | 156 | blkcg->weight); |
| 157 | spin_unlock(&blkio_list_lock); | ||
| 158 | } | 157 | } |
| 159 | spin_unlock_irq(&blkcg->lock); | 158 | spin_unlock_irq(&blkcg->lock); |
| 159 | spin_unlock(&blkio_list_lock); | ||
| 160 | return 0; | 160 | return 0; |
| 161 | } | 161 | } |
| 162 | 162 | ||
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index ee130f14d1fc..023f4e69a337 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -42,16 +42,13 @@ static const int cfq_hist_divisor = 4; | |||
| 42 | */ | 42 | */ |
| 43 | #define CFQ_MIN_TT (2) | 43 | #define CFQ_MIN_TT (2) |
| 44 | 44 | ||
| 45 | /* | ||
| 46 | * Allow merged cfqqs to perform this amount of seeky I/O before | ||
| 47 | * deciding to break the queues up again. | ||
| 48 | */ | ||
| 49 | #define CFQQ_COOP_TOUT (HZ) | ||
| 50 | |||
| 51 | #define CFQ_SLICE_SCALE (5) | 45 | #define CFQ_SLICE_SCALE (5) |
| 52 | #define CFQ_HW_QUEUE_MIN (5) | 46 | #define CFQ_HW_QUEUE_MIN (5) |
| 53 | #define CFQ_SERVICE_SHIFT 12 | 47 | #define CFQ_SERVICE_SHIFT 12 |
| 54 | 48 | ||
| 49 | #define CFQQ_SEEK_THR 8 * 1024 | ||
| 50 | #define CFQQ_SEEKY(cfqq) ((cfqq)->seek_mean > CFQQ_SEEK_THR) | ||
| 51 | |||
| 55 | #define RQ_CIC(rq) \ | 52 | #define RQ_CIC(rq) \ |
| 56 | ((struct cfq_io_context *) (rq)->elevator_private) | 53 | ((struct cfq_io_context *) (rq)->elevator_private) |
| 57 | #define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private2) | 54 | #define RQ_CFQQ(rq) (struct cfq_queue *) ((rq)->elevator_private2) |
| @@ -137,7 +134,6 @@ struct cfq_queue { | |||
| 137 | u64 seek_total; | 134 | u64 seek_total; |
| 138 | sector_t seek_mean; | 135 | sector_t seek_mean; |
| 139 | sector_t last_request_pos; | 136 | sector_t last_request_pos; |
| 140 | unsigned long seeky_start; | ||
| 141 | 137 | ||
| 142 | pid_t pid; | 138 | pid_t pid; |
| 143 | 139 | ||
| @@ -314,6 +310,7 @@ enum cfqq_state_flags { | |||
| 314 | CFQ_CFQQ_FLAG_slice_new, /* no requests dispatched in slice */ | 310 | CFQ_CFQQ_FLAG_slice_new, /* no requests dispatched in slice */ |
| 315 | CFQ_CFQQ_FLAG_sync, /* synchronous queue */ | 311 | CFQ_CFQQ_FLAG_sync, /* synchronous queue */ |
| 316 | CFQ_CFQQ_FLAG_coop, /* cfqq is shared */ | 312 | CFQ_CFQQ_FLAG_coop, /* cfqq is shared */ |
| 313 | CFQ_CFQQ_FLAG_split_coop, /* shared cfqq will be splitted */ | ||
| 317 | CFQ_CFQQ_FLAG_deep, /* sync cfqq experienced large depth */ | 314 | CFQ_CFQQ_FLAG_deep, /* sync cfqq experienced large depth */ |
| 318 | CFQ_CFQQ_FLAG_wait_busy, /* Waiting for next request */ | 315 | CFQ_CFQQ_FLAG_wait_busy, /* Waiting for next request */ |
| 319 | }; | 316 | }; |
| @@ -342,6 +339,7 @@ CFQ_CFQQ_FNS(prio_changed); | |||
| 342 | CFQ_CFQQ_FNS(slice_new); | 339 | CFQ_CFQQ_FNS(slice_new); |
| 343 | CFQ_CFQQ_FNS(sync); | 340 | CFQ_CFQQ_FNS(sync); |
| 344 | CFQ_CFQQ_FNS(coop); | 341 | CFQ_CFQQ_FNS(coop); |
| 342 | CFQ_CFQQ_FNS(split_coop); | ||
| 345 | CFQ_CFQQ_FNS(deep); | 343 | CFQ_CFQQ_FNS(deep); |
| 346 | CFQ_CFQQ_FNS(wait_busy); | 344 | CFQ_CFQQ_FNS(wait_busy); |
| 347 | #undef CFQ_CFQQ_FNS | 345 | #undef CFQ_CFQQ_FNS |
| @@ -1566,6 +1564,15 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 1566 | cfq_clear_cfqq_wait_busy(cfqq); | 1564 | cfq_clear_cfqq_wait_busy(cfqq); |
| 1567 | 1565 | ||
| 1568 | /* | 1566 | /* |
| 1567 | * If this cfqq is shared between multiple processes, check to | ||
| 1568 | * make sure that those processes are still issuing I/Os within | ||
| 1569 | * the mean seek distance. If not, it may be time to break the | ||
| 1570 | * queues apart again. | ||
| 1571 | */ | ||
| 1572 | if (cfq_cfqq_coop(cfqq) && CFQQ_SEEKY(cfqq)) | ||
| 1573 | cfq_mark_cfqq_split_coop(cfqq); | ||
| 1574 | |||
| 1575 | /* | ||
| 1569 | * store what was left of this slice, if the queue idled/timed out | 1576 | * store what was left of this slice, if the queue idled/timed out |
| 1570 | */ | 1577 | */ |
| 1571 | if (timed_out && !cfq_cfqq_slice_new(cfqq)) { | 1578 | if (timed_out && !cfq_cfqq_slice_new(cfqq)) { |
| @@ -1663,9 +1670,6 @@ static inline sector_t cfq_dist_from_last(struct cfq_data *cfqd, | |||
| 1663 | return cfqd->last_position - blk_rq_pos(rq); | 1670 | return cfqd->last_position - blk_rq_pos(rq); |
| 1664 | } | 1671 | } |
| 1665 | 1672 | ||
| 1666 | #define CFQQ_SEEK_THR 8 * 1024 | ||
| 1667 | #define CFQQ_SEEKY(cfqq) ((cfqq)->seek_mean > CFQQ_SEEK_THR) | ||
| 1668 | |||
| 1669 | static inline int cfq_rq_close(struct cfq_data *cfqd, struct cfq_queue *cfqq, | 1673 | static inline int cfq_rq_close(struct cfq_data *cfqd, struct cfq_queue *cfqq, |
| 1670 | struct request *rq, bool for_preempt) | 1674 | struct request *rq, bool for_preempt) |
| 1671 | { | 1675 | { |
| @@ -1803,7 +1807,7 @@ static bool cfq_should_idle(struct cfq_data *cfqd, struct cfq_queue *cfqq) | |||
| 1803 | * Otherwise, we do only if they are the last ones | 1807 | * Otherwise, we do only if they are the last ones |
| 1804 | * in their service tree. | 1808 | * in their service tree. |
| 1805 | */ | 1809 | */ |
| 1806 | return service_tree->count == 1; | 1810 | return service_tree->count == 1 && cfq_cfqq_sync(cfqq); |
| 1807 | } | 1811 | } |
| 1808 | 1812 | ||
| 1809 | static void cfq_arm_slice_timer(struct cfq_data *cfqd) | 1813 | static void cfq_arm_slice_timer(struct cfq_data *cfqd) |
| @@ -3000,19 +3004,6 @@ cfq_update_io_seektime(struct cfq_data *cfqd, struct cfq_queue *cfqq, | |||
| 3000 | total = cfqq->seek_total + (cfqq->seek_samples/2); | 3004 | total = cfqq->seek_total + (cfqq->seek_samples/2); |
| 3001 | do_div(total, cfqq->seek_samples); | 3005 | do_div(total, cfqq->seek_samples); |
| 3002 | cfqq->seek_mean = (sector_t)total; | 3006 | cfqq->seek_mean = (sector_t)total; |
| 3003 | |||
| 3004 | /* | ||
| 3005 | * If this cfqq is shared between multiple processes, check to | ||
| 3006 | * make sure that those processes are still issuing I/Os within | ||
| 3007 | * the mean seek distance. If not, it may be time to break the | ||
| 3008 | * queues apart again. | ||
| 3009 | */ | ||
| 3010 | if (cfq_cfqq_coop(cfqq)) { | ||
| 3011 | if (CFQQ_SEEKY(cfqq) && !cfqq->seeky_start) | ||
| 3012 | cfqq->seeky_start = jiffies; | ||
| 3013 | else if (!CFQQ_SEEKY(cfqq)) | ||
| 3014 | cfqq->seeky_start = 0; | ||
| 3015 | } | ||
| 3016 | } | 3007 | } |
| 3017 | 3008 | ||
| 3018 | /* | 3009 | /* |
| @@ -3453,14 +3444,6 @@ cfq_merge_cfqqs(struct cfq_data *cfqd, struct cfq_io_context *cic, | |||
| 3453 | return cic_to_cfqq(cic, 1); | 3444 | return cic_to_cfqq(cic, 1); |
| 3454 | } | 3445 | } |
| 3455 | 3446 | ||
| 3456 | static int should_split_cfqq(struct cfq_queue *cfqq) | ||
| 3457 | { | ||
| 3458 | if (cfqq->seeky_start && | ||
| 3459 | time_after(jiffies, cfqq->seeky_start + CFQQ_COOP_TOUT)) | ||
| 3460 | return 1; | ||
| 3461 | return 0; | ||
| 3462 | } | ||
| 3463 | |||
| 3464 | /* | 3447 | /* |
| 3465 | * Returns NULL if a new cfqq should be allocated, or the old cfqq if this | 3448 | * Returns NULL if a new cfqq should be allocated, or the old cfqq if this |
| 3466 | * was the last process referring to said cfqq. | 3449 | * was the last process referring to said cfqq. |
| @@ -3469,9 +3452,9 @@ static struct cfq_queue * | |||
| 3469 | split_cfqq(struct cfq_io_context *cic, struct cfq_queue *cfqq) | 3452 | split_cfqq(struct cfq_io_context *cic, struct cfq_queue *cfqq) |
| 3470 | { | 3453 | { |
| 3471 | if (cfqq_process_refs(cfqq) == 1) { | 3454 | if (cfqq_process_refs(cfqq) == 1) { |
| 3472 | cfqq->seeky_start = 0; | ||
| 3473 | cfqq->pid = current->pid; | 3455 | cfqq->pid = current->pid; |
| 3474 | cfq_clear_cfqq_coop(cfqq); | 3456 | cfq_clear_cfqq_coop(cfqq); |
| 3457 | cfq_clear_cfqq_split_coop(cfqq); | ||
| 3475 | return cfqq; | 3458 | return cfqq; |
| 3476 | } | 3459 | } |
| 3477 | 3460 | ||
| @@ -3510,7 +3493,7 @@ new_queue: | |||
| 3510 | /* | 3493 | /* |
| 3511 | * If the queue was seeky for too long, break it apart. | 3494 | * If the queue was seeky for too long, break it apart. |
| 3512 | */ | 3495 | */ |
| 3513 | if (cfq_cfqq_coop(cfqq) && should_split_cfqq(cfqq)) { | 3496 | if (cfq_cfqq_coop(cfqq) && cfq_cfqq_split_coop(cfqq)) { |
| 3514 | cfq_log_cfqq(cfqd, cfqq, "breaking apart cfqq"); | 3497 | cfq_log_cfqq(cfqd, cfqq, "breaking apart cfqq"); |
| 3515 | cfqq = split_cfqq(cic, cfqq); | 3498 | cfqq = split_cfqq(cic, cfqq); |
| 3516 | if (!cfqq) | 3499 | if (!cfqq) |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index b8bea100a160..b34390347c16 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -2868,6 +2868,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
| 2868 | }, | 2868 | }, |
| 2869 | .driver_data = "F.23", /* cutoff BIOS version */ | 2869 | .driver_data = "F.23", /* cutoff BIOS version */ |
| 2870 | }, | 2870 | }, |
| 2871 | /* | ||
| 2872 | * Acer eMachines G725 has the same problem. BIOS | ||
| 2873 | * V1.03 is known to be broken. V3.04 is known to | ||
| 2874 | * work. Inbetween, there are V1.06, V2.06 and V3.03 | ||
| 2875 | * that we don't have much idea about. For now, | ||
| 2876 | * blacklist anything older than V3.04. | ||
| 2877 | */ | ||
| 2878 | { | ||
| 2879 | .ident = "G725", | ||
| 2880 | .matches = { | ||
| 2881 | DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), | ||
| 2882 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), | ||
| 2883 | }, | ||
| 2884 | .driver_data = "V3.04", /* cutoff BIOS version */ | ||
| 2885 | }, | ||
| 2871 | { } /* terminate list */ | 2886 | { } /* terminate list */ |
| 2872 | }; | 2887 | }; |
| 2873 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | 2888 | const struct dmi_system_id *dmi = dmi_first_match(sysids); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index f4ea5a8c325b..d096fbcbc771 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -2875,7 +2875,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
| 2875 | * write indication (used for PIO/DMA setup), result TF is | 2875 | * write indication (used for PIO/DMA setup), result TF is |
| 2876 | * copied back and we don't whine too much about its failure. | 2876 | * copied back and we don't whine too much about its failure. |
| 2877 | */ | 2877 | */ |
| 2878 | tf->flags = ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 2878 | tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
| 2879 | if (scmd->sc_data_direction == DMA_TO_DEVICE) | 2879 | if (scmd->sc_data_direction == DMA_TO_DEVICE) |
| 2880 | tf->flags |= ATA_TFLAG_WRITE; | 2880 | tf->flags |= ATA_TFLAG_WRITE; |
| 2881 | 2881 | ||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 741065c9da67..730ef3c384ca 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -893,6 +893,9 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
| 893 | do_write); | 893 | do_write); |
| 894 | } | 894 | } |
| 895 | 895 | ||
| 896 | if (!do_write) | ||
| 897 | flush_dcache_page(page); | ||
| 898 | |||
| 896 | qc->curbytes += qc->sect_size; | 899 | qc->curbytes += qc->sect_size; |
| 897 | qc->cursg_ofs += qc->sect_size; | 900 | qc->cursg_ofs += qc->sect_size; |
| 898 | 901 | ||
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 873e594860d3..9291614ac6b7 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -337,6 +337,9 @@ static int cciss_seq_show(struct seq_file *seq, void *v) | |||
| 337 | if (*pos > h->highest_lun) | 337 | if (*pos > h->highest_lun) |
| 338 | return 0; | 338 | return 0; |
| 339 | 339 | ||
| 340 | if (drv == NULL) /* it's possible for h->drv[] to have holes. */ | ||
| 341 | return 0; | ||
| 342 | |||
| 340 | if (drv->heads == 0) | 343 | if (drv->heads == 0) |
| 341 | return 0; | 344 | return 0; |
| 342 | 345 | ||
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index e898ad9eb1c3..ab871e00ffc5 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -2973,7 +2973,6 @@ struct drbd_conf *drbd_new_device(unsigned int minor) | |||
| 2973 | goto out_no_q; | 2973 | goto out_no_q; |
| 2974 | mdev->rq_queue = q; | 2974 | mdev->rq_queue = q; |
| 2975 | q->queuedata = mdev; | 2975 | q->queuedata = mdev; |
| 2976 | blk_queue_max_segment_size(q, DRBD_MAX_SEGMENT_SIZE); | ||
| 2977 | 2976 | ||
| 2978 | disk = alloc_disk(1); | 2977 | disk = alloc_disk(1); |
| 2979 | if (!disk) | 2978 | if (!disk) |
| @@ -2997,6 +2996,7 @@ struct drbd_conf *drbd_new_device(unsigned int minor) | |||
| 2997 | q->backing_dev_info.congested_data = mdev; | 2996 | q->backing_dev_info.congested_data = mdev; |
| 2998 | 2997 | ||
| 2999 | blk_queue_make_request(q, drbd_make_request_26); | 2998 | blk_queue_make_request(q, drbd_make_request_26); |
| 2999 | blk_queue_max_segment_size(q, DRBD_MAX_SEGMENT_SIZE); | ||
| 3000 | blk_queue_bounce_limit(q, BLK_BOUNCE_ANY); | 3000 | blk_queue_bounce_limit(q, BLK_BOUNCE_ANY); |
| 3001 | blk_queue_merge_bvec(q, drbd_merge_bvec); | 3001 | blk_queue_merge_bvec(q, drbd_merge_bvec); |
| 3002 | q->queue_lock = &mdev->req_lock; /* needed since we use */ | 3002 | q->queue_lock = &mdev->req_lock; /* needed since we use */ |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index f22a5283128a..d065c646b35a 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
| @@ -1224,7 +1224,7 @@ static int receive_Barrier(struct drbd_conf *mdev, struct p_header *h) | |||
| 1224 | epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO); | 1224 | epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO); |
| 1225 | if (!epoch) { | 1225 | if (!epoch) { |
| 1226 | dev_warn(DEV, "Allocation of an epoch failed, slowing down\n"); | 1226 | dev_warn(DEV, "Allocation of an epoch failed, slowing down\n"); |
| 1227 | issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &epoch->flags); | 1227 | issue_flush = !test_and_set_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &mdev->current_epoch->flags); |
| 1228 | drbd_wait_ee_list_empty(mdev, &mdev->active_ee); | 1228 | drbd_wait_ee_list_empty(mdev, &mdev->active_ee); |
| 1229 | if (issue_flush) { | 1229 | if (issue_flush) { |
| 1230 | rv = drbd_flush_after_epoch(mdev, mdev->current_epoch); | 1230 | rv = drbd_flush_after_epoch(mdev, mdev->current_epoch); |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 2ddf03ae034e..68b5957f107c 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
| @@ -322,7 +322,7 @@ static void pkt_sysfs_dev_remove(struct pktcdvd_device *pd) | |||
| 322 | pkt_kobj_remove(pd->kobj_stat); | 322 | pkt_kobj_remove(pd->kobj_stat); |
| 323 | pkt_kobj_remove(pd->kobj_wqueue); | 323 | pkt_kobj_remove(pd->kobj_wqueue); |
| 324 | if (class_pktcdvd) | 324 | if (class_pktcdvd) |
| 325 | device_destroy(class_pktcdvd, pd->pkt_dev); | 325 | device_unregister(pd->dev); |
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | 328 | ||
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index 652367aa6546..058fbccf2f52 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
| @@ -195,5 +195,16 @@ config BT_MRVL_SDIO | |||
| 195 | Say Y here to compile support for Marvell BT-over-SDIO driver | 195 | Say Y here to compile support for Marvell BT-over-SDIO driver |
| 196 | into the kernel or say M to compile it as module. | 196 | into the kernel or say M to compile it as module. |
| 197 | 197 | ||
| 198 | endmenu | 198 | config BT_ATH3K |
| 199 | tristate "Atheros firmware download driver" | ||
| 200 | depends on BT_HCIBTUSB | ||
| 201 | select FW_LOADER | ||
| 202 | help | ||
| 203 | Bluetooth firmware download driver. | ||
| 204 | This driver loads the firmware into the Atheros Bluetooth | ||
| 205 | chipset. | ||
| 199 | 206 | ||
| 207 | Say Y here to compile support for "Atheros firmware download driver" | ||
| 208 | into the kernel or say M to compile it as module (ath3k). | ||
| 209 | |||
| 210 | endmenu | ||
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile index b3f57d2d4eb0..7e5aed598121 100644 --- a/drivers/bluetooth/Makefile +++ b/drivers/bluetooth/Makefile | |||
| @@ -15,6 +15,7 @@ obj-$(CONFIG_BT_HCIBTUART) += btuart_cs.o | |||
| 15 | obj-$(CONFIG_BT_HCIBTUSB) += btusb.o | 15 | obj-$(CONFIG_BT_HCIBTUSB) += btusb.o |
| 16 | obj-$(CONFIG_BT_HCIBTSDIO) += btsdio.o | 16 | obj-$(CONFIG_BT_HCIBTSDIO) += btsdio.o |
| 17 | 17 | ||
| 18 | obj-$(CONFIG_BT_ATH3K) += ath3k.o | ||
| 18 | obj-$(CONFIG_BT_MRVL) += btmrvl.o | 19 | obj-$(CONFIG_BT_MRVL) += btmrvl.o |
| 19 | obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o | 20 | obj-$(CONFIG_BT_MRVL_SDIO) += btmrvl_sdio.o |
| 20 | 21 | ||
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c new file mode 100644 index 000000000000..add9485ca5b6 --- /dev/null +++ b/drivers/bluetooth/ath3k.c | |||
| @@ -0,0 +1,187 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | |||
| 21 | #include <linux/module.h> | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/init.h> | ||
| 24 | #include <linux/slab.h> | ||
| 25 | #include <linux/types.h> | ||
| 26 | #include <linux/errno.h> | ||
| 27 | #include <linux/device.h> | ||
| 28 | #include <linux/firmware.h> | ||
| 29 | #include <linux/usb.h> | ||
| 30 | #include <net/bluetooth/bluetooth.h> | ||
| 31 | |||
| 32 | #define VERSION "1.0" | ||
| 33 | |||
| 34 | |||
| 35 | static struct usb_device_id ath3k_table[] = { | ||
| 36 | /* Atheros AR3011 */ | ||
| 37 | { USB_DEVICE(0x0CF3, 0x3000) }, | ||
| 38 | { } /* Terminating entry */ | ||
| 39 | }; | ||
| 40 | |||
| 41 | MODULE_DEVICE_TABLE(usb, ath3k_table); | ||
| 42 | |||
| 43 | #define USB_REQ_DFU_DNLOAD 1 | ||
| 44 | #define BULK_SIZE 4096 | ||
| 45 | |||
| 46 | struct ath3k_data { | ||
| 47 | struct usb_device *udev; | ||
| 48 | u8 *fw_data; | ||
| 49 | u32 fw_size; | ||
| 50 | u32 fw_sent; | ||
| 51 | }; | ||
| 52 | |||
| 53 | static int ath3k_load_firmware(struct ath3k_data *data, | ||
| 54 | unsigned char *firmware, | ||
| 55 | int count) | ||
| 56 | { | ||
| 57 | u8 *send_buf; | ||
| 58 | int err, pipe, len, size, sent = 0; | ||
| 59 | |||
| 60 | BT_DBG("ath3k %p udev %p", data, data->udev); | ||
| 61 | |||
| 62 | pipe = usb_sndctrlpipe(data->udev, 0); | ||
| 63 | |||
| 64 | if ((usb_control_msg(data->udev, pipe, | ||
| 65 | USB_REQ_DFU_DNLOAD, | ||
| 66 | USB_TYPE_VENDOR, 0, 0, | ||
| 67 | firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) { | ||
| 68 | BT_ERR("Can't change to loading configuration err"); | ||
| 69 | return -EBUSY; | ||
| 70 | } | ||
| 71 | sent += 20; | ||
| 72 | count -= 20; | ||
| 73 | |||
| 74 | send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC); | ||
| 75 | if (!send_buf) { | ||
| 76 | BT_ERR("Can't allocate memory chunk for firmware"); | ||
| 77 | return -ENOMEM; | ||
| 78 | } | ||
| 79 | |||
| 80 | while (count) { | ||
| 81 | size = min_t(uint, count, BULK_SIZE); | ||
| 82 | pipe = usb_sndbulkpipe(data->udev, 0x02); | ||
| 83 | memcpy(send_buf, firmware + sent, size); | ||
| 84 | |||
| 85 | err = usb_bulk_msg(data->udev, pipe, send_buf, size, | ||
| 86 | &len, 3000); | ||
| 87 | |||
| 88 | if (err || (len != size)) { | ||
| 89 | BT_ERR("Error in firmware loading err = %d," | ||
| 90 | "len = %d, size = %d", err, len, size); | ||
| 91 | goto error; | ||
| 92 | } | ||
| 93 | |||
| 94 | sent += size; | ||
| 95 | count -= size; | ||
| 96 | } | ||
| 97 | |||
| 98 | kfree(send_buf); | ||
| 99 | return 0; | ||
| 100 | |||
| 101 | error: | ||
| 102 | kfree(send_buf); | ||
| 103 | return err; | ||
| 104 | } | ||
| 105 | |||
| 106 | static int ath3k_probe(struct usb_interface *intf, | ||
| 107 | const struct usb_device_id *id) | ||
| 108 | { | ||
| 109 | const struct firmware *firmware; | ||
| 110 | struct usb_device *udev = interface_to_usbdev(intf); | ||
| 111 | struct ath3k_data *data; | ||
| 112 | int size; | ||
| 113 | |||
| 114 | BT_DBG("intf %p id %p", intf, id); | ||
| 115 | |||
| 116 | if (intf->cur_altsetting->desc.bInterfaceNumber != 0) | ||
| 117 | return -ENODEV; | ||
| 118 | |||
| 119 | data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
| 120 | if (!data) | ||
| 121 | return -ENOMEM; | ||
| 122 | |||
| 123 | data->udev = udev; | ||
| 124 | |||
| 125 | if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) { | ||
| 126 | kfree(data); | ||
| 127 | return -EIO; | ||
| 128 | } | ||
| 129 | |||
| 130 | size = max_t(uint, firmware->size, 4096); | ||
| 131 | data->fw_data = kmalloc(size, GFP_KERNEL); | ||
| 132 | if (!data->fw_data) { | ||
| 133 | release_firmware(firmware); | ||
| 134 | kfree(data); | ||
| 135 | return -ENOMEM; | ||
| 136 | } | ||
| 137 | |||
| 138 | memcpy(data->fw_data, firmware->data, firmware->size); | ||
| 139 | data->fw_size = firmware->size; | ||
| 140 | data->fw_sent = 0; | ||
| 141 | release_firmware(firmware); | ||
| 142 | |||
| 143 | usb_set_intfdata(intf, data); | ||
| 144 | if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) { | ||
| 145 | usb_set_intfdata(intf, NULL); | ||
| 146 | return -EIO; | ||
| 147 | } | ||
| 148 | |||
| 149 | return 0; | ||
| 150 | } | ||
| 151 | |||
| 152 | static void ath3k_disconnect(struct usb_interface *intf) | ||
| 153 | { | ||
| 154 | struct ath3k_data *data = usb_get_intfdata(intf); | ||
| 155 | |||
| 156 | BT_DBG("ath3k_disconnect intf %p", intf); | ||
| 157 | |||
| 158 | kfree(data->fw_data); | ||
| 159 | kfree(data); | ||
| 160 | } | ||
| 161 | |||
| 162 | static struct usb_driver ath3k_driver = { | ||
| 163 | .name = "ath3k", | ||
| 164 | .probe = ath3k_probe, | ||
| 165 | .disconnect = ath3k_disconnect, | ||
| 166 | .id_table = ath3k_table, | ||
| 167 | }; | ||
| 168 | |||
| 169 | static int __init ath3k_init(void) | ||
| 170 | { | ||
| 171 | BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION); | ||
| 172 | return usb_register(&ath3k_driver); | ||
| 173 | } | ||
| 174 | |||
| 175 | static void __exit ath3k_exit(void) | ||
| 176 | { | ||
| 177 | usb_deregister(&ath3k_driver); | ||
| 178 | } | ||
| 179 | |||
| 180 | module_init(ath3k_init); | ||
| 181 | module_exit(ath3k_exit); | ||
| 182 | |||
| 183 | MODULE_AUTHOR("Atheros Communications"); | ||
| 184 | MODULE_DESCRIPTION("Atheros AR30xx firmware driver"); | ||
| 185 | MODULE_VERSION(VERSION); | ||
| 186 | MODULE_LICENSE("GPL"); | ||
| 187 | MODULE_FIRMWARE("ath3k-1.fw"); | ||
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 2acdc605cb4b..c2cf81144715 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
| @@ -503,7 +503,9 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst) | |||
| 503 | unsigned int iobase; | 503 | unsigned int iobase; |
| 504 | unsigned char reg; | 504 | unsigned char reg; |
| 505 | 505 | ||
| 506 | BUG_ON(!info->hdev); | 506 | if (!info || !info->hdev) |
| 507 | /* our irq handler is shared */ | ||
| 508 | return IRQ_NONE; | ||
| 507 | 509 | ||
| 508 | if (!test_bit(CARD_READY, &(info->hw_state))) | 510 | if (!test_bit(CARD_READY, &(info->hw_state))) |
| 509 | return IRQ_HANDLED; | 511 | return IRQ_HANDLED; |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index d814a2755ccb..9f5926aaf57f 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
| @@ -345,7 +345,9 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) | |||
| 345 | int iir; | 345 | int iir; |
| 346 | irqreturn_t r = IRQ_NONE; | 346 | irqreturn_t r = IRQ_NONE; |
| 347 | 347 | ||
| 348 | BUG_ON(!info->hdev); | 348 | if (!info || !info->hdev) |
| 349 | /* our irq handler is shared */ | ||
| 350 | return IRQ_NONE; | ||
| 349 | 351 | ||
| 350 | iobase = info->p_dev->io.BasePort1; | 352 | iobase = info->p_dev->io.BasePort1; |
| 351 | 353 | ||
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c index f36defa37764..57d965b7f521 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c | |||
| @@ -808,6 +808,7 @@ static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv, | |||
| 808 | 808 | ||
| 809 | exit: | 809 | exit: |
| 810 | sdio_release_host(card->func); | 810 | sdio_release_host(card->func); |
| 811 | kfree(tmpbuf); | ||
| 811 | 812 | ||
| 812 | return ret; | 813 | return ret; |
| 813 | } | 814 | } |
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index d339464dc15e..91c523099804 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
| @@ -295,7 +295,9 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst) | |||
| 295 | int iir, lsr; | 295 | int iir, lsr; |
| 296 | irqreturn_t r = IRQ_NONE; | 296 | irqreturn_t r = IRQ_NONE; |
| 297 | 297 | ||
| 298 | BUG_ON(!info->hdev); | 298 | if (!info || !info->hdev) |
| 299 | /* our irq handler is shared */ | ||
| 300 | return IRQ_NONE; | ||
| 299 | 301 | ||
| 300 | iobase = info->p_dev->io.BasePort1; | 302 | iobase = info->p_dev->io.BasePort1; |
| 301 | 303 | ||
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index 4f02a6f3c980..697591941e17 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
| @@ -299,7 +299,9 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst) | |||
| 299 | int iir, lsr; | 299 | int iir, lsr; |
| 300 | irqreturn_t r = IRQ_NONE; | 300 | irqreturn_t r = IRQ_NONE; |
| 301 | 301 | ||
| 302 | BUG_ON(!info->hdev); | 302 | if (!info || !info->hdev) |
| 303 | /* our irq handler is shared */ | ||
| 304 | return IRQ_NONE; | ||
| 303 | 305 | ||
| 304 | iobase = info->p_dev->io.BasePort1; | 306 | iobase = info->p_dev->io.BasePort1; |
| 305 | 307 | ||
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 34cf04e21795..fd50ead59c79 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -767,16 +767,19 @@ int __init agp_amd64_init(void) | |||
| 767 | 767 | ||
| 768 | static int __init agp_amd64_mod_init(void) | 768 | static int __init agp_amd64_mod_init(void) |
| 769 | { | 769 | { |
| 770 | #ifndef MODULE | ||
| 770 | if (gart_iommu_aperture) | 771 | if (gart_iommu_aperture) |
| 771 | return agp_bridges_found ? 0 : -ENODEV; | 772 | return agp_bridges_found ? 0 : -ENODEV; |
| 772 | 773 | #endif | |
| 773 | return agp_amd64_init(); | 774 | return agp_amd64_init(); |
| 774 | } | 775 | } |
| 775 | 776 | ||
| 776 | static void __exit agp_amd64_cleanup(void) | 777 | static void __exit agp_amd64_cleanup(void) |
| 777 | { | 778 | { |
| 779 | #ifndef MODULE | ||
| 778 | if (gart_iommu_aperture) | 780 | if (gart_iommu_aperture) |
| 779 | return; | 781 | return; |
| 782 | #endif | ||
| 780 | if (aperture_resource) | 783 | if (aperture_resource) |
| 781 | release_resource(aperture_resource); | 784 | release_resource(aperture_resource); |
| 782 | pci_unregister_driver(&agp_amd64_pci_driver); | 785 | pci_unregister_driver(&agp_amd64_pci_driver); |
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index be832b6f8279..48788db4e280 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
| @@ -395,6 +395,7 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | |||
| 395 | unsigned long p = *ppos; | 395 | unsigned long p = *ppos; |
| 396 | ssize_t low_count, read, sz; | 396 | ssize_t low_count, read, sz; |
| 397 | char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */ | 397 | char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */ |
| 398 | int err = 0; | ||
| 398 | 399 | ||
| 399 | read = 0; | 400 | read = 0; |
| 400 | if (p < (unsigned long) high_memory) { | 401 | if (p < (unsigned long) high_memory) { |
| @@ -441,12 +442,16 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | |||
| 441 | return -ENOMEM; | 442 | return -ENOMEM; |
| 442 | while (count > 0) { | 443 | while (count > 0) { |
| 443 | sz = size_inside_page(p, count); | 444 | sz = size_inside_page(p, count); |
| 445 | if (!is_vmalloc_or_module_addr((void *)p)) { | ||
| 446 | err = -ENXIO; | ||
| 447 | break; | ||
| 448 | } | ||
| 444 | sz = vread(kbuf, (char *)p, sz); | 449 | sz = vread(kbuf, (char *)p, sz); |
| 445 | if (!sz) | 450 | if (!sz) |
| 446 | break; | 451 | break; |
| 447 | if (copy_to_user(buf, kbuf, sz)) { | 452 | if (copy_to_user(buf, kbuf, sz)) { |
| 448 | free_page((unsigned long)kbuf); | 453 | err = -EFAULT; |
| 449 | return -EFAULT; | 454 | break; |
| 450 | } | 455 | } |
| 451 | count -= sz; | 456 | count -= sz; |
| 452 | buf += sz; | 457 | buf += sz; |
| @@ -455,8 +460,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | |||
| 455 | } | 460 | } |
| 456 | free_page((unsigned long)kbuf); | 461 | free_page((unsigned long)kbuf); |
| 457 | } | 462 | } |
| 458 | *ppos = p; | 463 | *ppos = p; |
| 459 | return read; | 464 | return read ? read : err; |
| 460 | } | 465 | } |
| 461 | 466 | ||
| 462 | 467 | ||
| @@ -520,6 +525,7 @@ static ssize_t write_kmem(struct file * file, const char __user * buf, | |||
| 520 | ssize_t wrote = 0; | 525 | ssize_t wrote = 0; |
| 521 | ssize_t virtr = 0; | 526 | ssize_t virtr = 0; |
| 522 | char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */ | 527 | char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */ |
| 528 | int err = 0; | ||
| 523 | 529 | ||
| 524 | if (p < (unsigned long) high_memory) { | 530 | if (p < (unsigned long) high_memory) { |
| 525 | unsigned long to_write = min_t(unsigned long, count, | 531 | unsigned long to_write = min_t(unsigned long, count, |
| @@ -540,14 +546,16 @@ static ssize_t write_kmem(struct file * file, const char __user * buf, | |||
| 540 | unsigned long sz = size_inside_page(p, count); | 546 | unsigned long sz = size_inside_page(p, count); |
| 541 | unsigned long n; | 547 | unsigned long n; |
| 542 | 548 | ||
| 549 | if (!is_vmalloc_or_module_addr((void *)p)) { | ||
| 550 | err = -ENXIO; | ||
| 551 | break; | ||
| 552 | } | ||
| 543 | n = copy_from_user(kbuf, buf, sz); | 553 | n = copy_from_user(kbuf, buf, sz); |
| 544 | if (n) { | 554 | if (n) { |
| 545 | if (wrote + virtr) | 555 | err = -EFAULT; |
| 546 | break; | 556 | break; |
| 547 | free_page((unsigned long)kbuf); | ||
| 548 | return -EFAULT; | ||
| 549 | } | 557 | } |
| 550 | sz = vwrite(kbuf, (char *)p, sz); | 558 | vwrite(kbuf, (char *)p, sz); |
| 551 | count -= sz; | 559 | count -= sz; |
| 552 | buf += sz; | 560 | buf += sz; |
| 553 | virtr += sz; | 561 | virtr += sz; |
| @@ -556,8 +564,8 @@ static ssize_t write_kmem(struct file * file, const char __user * buf, | |||
| 556 | free_page((unsigned long)kbuf); | 564 | free_page((unsigned long)kbuf); |
| 557 | } | 565 | } |
| 558 | 566 | ||
| 559 | *ppos = p; | 567 | *ppos = p; |
| 560 | return virtr + wrote; | 568 | return virtr + wrote ? : err; |
| 561 | } | 569 | } |
| 562 | #endif | 570 | #endif |
| 563 | 571 | ||
diff --git a/drivers/char/random.c b/drivers/char/random.c index 8258982b49ec..2849713d2231 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
| @@ -1051,12 +1051,6 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||
| 1051 | /* like a named pipe */ | 1051 | /* like a named pipe */ |
| 1052 | } | 1052 | } |
| 1053 | 1053 | ||
| 1054 | /* | ||
| 1055 | * If we gave the user some bytes, update the access time. | ||
| 1056 | */ | ||
| 1057 | if (count) | ||
| 1058 | file_accessed(file); | ||
| 1059 | |||
| 1060 | return (count ? count : retval); | 1054 | return (count ? count : retval); |
| 1061 | } | 1055 | } |
| 1062 | 1056 | ||
| @@ -1107,7 +1101,6 @@ static ssize_t random_write(struct file *file, const char __user *buffer, | |||
| 1107 | size_t count, loff_t *ppos) | 1101 | size_t count, loff_t *ppos) |
| 1108 | { | 1102 | { |
| 1109 | size_t ret; | 1103 | size_t ret; |
| 1110 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 1111 | 1104 | ||
| 1112 | ret = write_pool(&blocking_pool, buffer, count); | 1105 | ret = write_pool(&blocking_pool, buffer, count); |
| 1113 | if (ret) | 1106 | if (ret) |
| @@ -1116,8 +1109,6 @@ static ssize_t random_write(struct file *file, const char __user *buffer, | |||
| 1116 | if (ret) | 1109 | if (ret) |
| 1117 | return ret; | 1110 | return ret; |
| 1118 | 1111 | ||
| 1119 | inode->i_mtime = current_fs_time(inode->i_sb); | ||
| 1120 | mark_inode_dirty(inode); | ||
| 1121 | return (ssize_t)count; | 1112 | return (ssize_t)count; |
| 1122 | } | 1113 | } |
| 1123 | 1114 | ||
diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c index ecba4942fc8e..f58440791e65 100644 --- a/drivers/char/tpm/tpm_infineon.c +++ b/drivers/char/tpm/tpm_infineon.c | |||
| @@ -39,12 +39,12 @@ | |||
| 39 | struct tpm_inf_dev { | 39 | struct tpm_inf_dev { |
| 40 | int iotype; | 40 | int iotype; |
| 41 | 41 | ||
| 42 | void __iomem *mem_base; /* MMIO ioremap'd addr */ | 42 | void __iomem *mem_base; /* MMIO ioremap'd addr */ |
| 43 | unsigned long map_base; /* phys MMIO base */ | 43 | unsigned long map_base; /* phys MMIO base */ |
| 44 | unsigned long map_size; /* MMIO region size */ | 44 | unsigned long map_size; /* MMIO region size */ |
| 45 | unsigned int index_off; /* index register offset */ | 45 | unsigned int index_off; /* index register offset */ |
| 46 | 46 | ||
| 47 | unsigned int data_regs; /* Data registers */ | 47 | unsigned int data_regs; /* Data registers */ |
| 48 | unsigned int data_size; | 48 | unsigned int data_size; |
| 49 | 49 | ||
| 50 | unsigned int config_port; /* IO Port config index reg */ | 50 | unsigned int config_port; /* IO Port config index reg */ |
| @@ -406,14 +406,14 @@ static const struct tpm_vendor_specific tpm_inf = { | |||
| 406 | .miscdev = {.fops = &inf_ops,}, | 406 | .miscdev = {.fops = &inf_ops,}, |
| 407 | }; | 407 | }; |
| 408 | 408 | ||
| 409 | static const struct pnp_device_id tpm_pnp_tbl[] = { | 409 | static const struct pnp_device_id tpm_inf_pnp_tbl[] = { |
| 410 | /* Infineon TPMs */ | 410 | /* Infineon TPMs */ |
| 411 | {"IFX0101", 0}, | 411 | {"IFX0101", 0}, |
| 412 | {"IFX0102", 0}, | 412 | {"IFX0102", 0}, |
| 413 | {"", 0} | 413 | {"", 0} |
| 414 | }; | 414 | }; |
| 415 | 415 | ||
| 416 | MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl); | 416 | MODULE_DEVICE_TABLE(pnp, tpm_inf_pnp_tbl); |
| 417 | 417 | ||
| 418 | static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | 418 | static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, |
| 419 | const struct pnp_device_id *dev_id) | 419 | const struct pnp_device_id *dev_id) |
| @@ -430,7 +430,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 430 | if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && | 430 | if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && |
| 431 | !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) { | 431 | !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) { |
| 432 | 432 | ||
| 433 | tpm_dev.iotype = TPM_INF_IO_PORT; | 433 | tpm_dev.iotype = TPM_INF_IO_PORT; |
| 434 | 434 | ||
| 435 | tpm_dev.config_port = pnp_port_start(dev, 0); | 435 | tpm_dev.config_port = pnp_port_start(dev, 0); |
| 436 | tpm_dev.config_size = pnp_port_len(dev, 0); | 436 | tpm_dev.config_size = pnp_port_len(dev, 0); |
| @@ -459,9 +459,9 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 459 | goto err_last; | 459 | goto err_last; |
| 460 | } | 460 | } |
| 461 | } else if (pnp_mem_valid(dev, 0) && | 461 | } else if (pnp_mem_valid(dev, 0) && |
| 462 | !(pnp_mem_flags(dev, 0) & IORESOURCE_DISABLED)) { | 462 | !(pnp_mem_flags(dev, 0) & IORESOURCE_DISABLED)) { |
| 463 | 463 | ||
| 464 | tpm_dev.iotype = TPM_INF_IO_MEM; | 464 | tpm_dev.iotype = TPM_INF_IO_MEM; |
| 465 | 465 | ||
| 466 | tpm_dev.map_base = pnp_mem_start(dev, 0); | 466 | tpm_dev.map_base = pnp_mem_start(dev, 0); |
| 467 | tpm_dev.map_size = pnp_mem_len(dev, 0); | 467 | tpm_dev.map_size = pnp_mem_len(dev, 0); |
| @@ -563,11 +563,11 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev, | |||
| 563 | "product id 0x%02x%02x" | 563 | "product id 0x%02x%02x" |
| 564 | "%s\n", | 564 | "%s\n", |
| 565 | tpm_dev.iotype == TPM_INF_IO_PORT ? | 565 | tpm_dev.iotype == TPM_INF_IO_PORT ? |
| 566 | tpm_dev.config_port : | 566 | tpm_dev.config_port : |
| 567 | tpm_dev.map_base + tpm_dev.index_off, | 567 | tpm_dev.map_base + tpm_dev.index_off, |
| 568 | tpm_dev.iotype == TPM_INF_IO_PORT ? | 568 | tpm_dev.iotype == TPM_INF_IO_PORT ? |
| 569 | tpm_dev.data_regs : | 569 | tpm_dev.data_regs : |
| 570 | tpm_dev.map_base + tpm_dev.data_regs, | 570 | tpm_dev.map_base + tpm_dev.data_regs, |
| 571 | version[0], version[1], | 571 | version[0], version[1], |
| 572 | vendorid[0], vendorid[1], | 572 | vendorid[0], vendorid[1], |
| 573 | productid[0], productid[1], chipname); | 573 | productid[0], productid[1], chipname); |
| @@ -607,20 +607,55 @@ static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev) | |||
| 607 | iounmap(tpm_dev.mem_base); | 607 | iounmap(tpm_dev.mem_base); |
| 608 | release_mem_region(tpm_dev.map_base, tpm_dev.map_size); | 608 | release_mem_region(tpm_dev.map_base, tpm_dev.map_size); |
| 609 | } | 609 | } |
| 610 | tpm_dev_vendor_release(chip); | ||
| 610 | tpm_remove_hardware(chip->dev); | 611 | tpm_remove_hardware(chip->dev); |
| 611 | } | 612 | } |
| 612 | } | 613 | } |
| 613 | 614 | ||
| 615 | static int tpm_inf_pnp_suspend(struct pnp_dev *dev, pm_message_t pm_state) | ||
| 616 | { | ||
| 617 | struct tpm_chip *chip = pnp_get_drvdata(dev); | ||
| 618 | int rc; | ||
| 619 | if (chip) { | ||
| 620 | u8 savestate[] = { | ||
| 621 | 0, 193, /* TPM_TAG_RQU_COMMAND */ | ||
| 622 | 0, 0, 0, 10, /* blob length (in bytes) */ | ||
| 623 | 0, 0, 0, 152 /* TPM_ORD_SaveState */ | ||
| 624 | }; | ||
| 625 | dev_info(&dev->dev, "saving TPM state\n"); | ||
| 626 | rc = tpm_inf_send(chip, savestate, sizeof(savestate)); | ||
| 627 | if (rc < 0) { | ||
| 628 | dev_err(&dev->dev, "error while saving TPM state\n"); | ||
| 629 | return rc; | ||
| 630 | } | ||
| 631 | } | ||
| 632 | return 0; | ||
| 633 | } | ||
| 634 | |||
| 635 | static int tpm_inf_pnp_resume(struct pnp_dev *dev) | ||
| 636 | { | ||
| 637 | /* Re-configure TPM after suspending */ | ||
| 638 | tpm_config_out(ENABLE_REGISTER_PAIR, TPM_INF_ADDR); | ||
| 639 | tpm_config_out(IOLIMH, TPM_INF_ADDR); | ||
| 640 | tpm_config_out((tpm_dev.data_regs >> 8) & 0xff, TPM_INF_DATA); | ||
| 641 | tpm_config_out(IOLIML, TPM_INF_ADDR); | ||
| 642 | tpm_config_out((tpm_dev.data_regs & 0xff), TPM_INF_DATA); | ||
| 643 | /* activate register */ | ||
| 644 | tpm_config_out(TPM_DAR, TPM_INF_ADDR); | ||
| 645 | tpm_config_out(0x01, TPM_INF_DATA); | ||
| 646 | tpm_config_out(DISABLE_REGISTER_PAIR, TPM_INF_ADDR); | ||
| 647 | /* disable RESET, LP and IRQC */ | ||
| 648 | tpm_data_out(RESET_LP_IRQC_DISABLE, CMD); | ||
| 649 | return tpm_pm_resume(&dev->dev); | ||
| 650 | } | ||
| 651 | |||
| 614 | static struct pnp_driver tpm_inf_pnp_driver = { | 652 | static struct pnp_driver tpm_inf_pnp_driver = { |
| 615 | .name = "tpm_inf_pnp", | 653 | .name = "tpm_inf_pnp", |
| 616 | .driver = { | 654 | .id_table = tpm_inf_pnp_tbl, |
| 617 | .owner = THIS_MODULE, | ||
| 618 | .suspend = tpm_pm_suspend, | ||
| 619 | .resume = tpm_pm_resume, | ||
| 620 | }, | ||
| 621 | .id_table = tpm_pnp_tbl, | ||
| 622 | .probe = tpm_inf_pnp_probe, | 655 | .probe = tpm_inf_pnp_probe, |
| 623 | .remove = __devexit_p(tpm_inf_pnp_remove), | 656 | .suspend = tpm_inf_pnp_suspend, |
| 657 | .resume = tpm_inf_pnp_resume, | ||
| 658 | .remove = __devexit_p(tpm_inf_pnp_remove) | ||
| 624 | }; | 659 | }; |
| 625 | 660 | ||
| 626 | static int __init init_inf(void) | 661 | static int __init init_inf(void) |
| @@ -638,5 +673,5 @@ module_exit(cleanup_inf); | |||
| 638 | 673 | ||
| 639 | MODULE_AUTHOR("Marcel Selhorst <m.selhorst@sirrix.com>"); | 674 | MODULE_AUTHOR("Marcel Selhorst <m.selhorst@sirrix.com>"); |
| 640 | MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); | 675 | MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); |
| 641 | MODULE_VERSION("1.9"); | 676 | MODULE_VERSION("1.9.2"); |
| 642 | MODULE_LICENSE("GPL"); | 677 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index c6f3b48be9dd..dcb9083ecde0 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -1951,8 +1951,10 @@ static int tty_fasync(int fd, struct file *filp, int on) | |||
| 1951 | pid = task_pid(current); | 1951 | pid = task_pid(current); |
| 1952 | type = PIDTYPE_PID; | 1952 | type = PIDTYPE_PID; |
| 1953 | } | 1953 | } |
| 1954 | retval = __f_setown(filp, pid, type, 0); | 1954 | get_pid(pid); |
| 1955 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); | 1955 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); |
| 1956 | retval = __f_setown(filp, pid, type, 0); | ||
| 1957 | put_pid(pid); | ||
| 1956 | if (retval) | 1958 | if (retval) |
| 1957 | goto out; | 1959 | goto out; |
| 1958 | } else { | 1960 | } else { |
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index f06024668f99..537c29ac4487 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -36,17 +36,6 @@ MODULE_LICENSE("GPL"); | |||
| 36 | MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); | 36 | MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); |
| 37 | MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); | 37 | MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector."); |
| 38 | 38 | ||
| 39 | static u32 cn_idx = CN_IDX_CONNECTOR; | ||
| 40 | static u32 cn_val = CN_VAL_CONNECTOR; | ||
| 41 | |||
| 42 | module_param(cn_idx, uint, 0); | ||
| 43 | module_param(cn_val, uint, 0); | ||
| 44 | MODULE_PARM_DESC(cn_idx, "Connector's main device idx."); | ||
| 45 | MODULE_PARM_DESC(cn_val, "Connector's main device val."); | ||
| 46 | |||
| 47 | static DEFINE_MUTEX(notify_lock); | ||
| 48 | static LIST_HEAD(notify_list); | ||
| 49 | |||
| 50 | static struct cn_dev cdev; | 39 | static struct cn_dev cdev; |
| 51 | 40 | ||
| 52 | static int cn_already_initialized; | 41 | static int cn_already_initialized; |
| @@ -210,54 +199,6 @@ static void cn_rx_skb(struct sk_buff *__skb) | |||
| 210 | } | 199 | } |
| 211 | 200 | ||
| 212 | /* | 201 | /* |
| 213 | * Notification routing. | ||
| 214 | * | ||
| 215 | * Gets id and checks if there are notification request for it's idx | ||
| 216 | * and val. If there are such requests notify the listeners with the | ||
| 217 | * given notify event. | ||
| 218 | * | ||
| 219 | */ | ||
| 220 | static void cn_notify(struct cb_id *id, u32 notify_event) | ||
| 221 | { | ||
| 222 | struct cn_ctl_entry *ent; | ||
| 223 | |||
| 224 | mutex_lock(¬ify_lock); | ||
| 225 | list_for_each_entry(ent, ¬ify_list, notify_entry) { | ||
| 226 | int i; | ||
| 227 | struct cn_notify_req *req; | ||
| 228 | struct cn_ctl_msg *ctl = ent->msg; | ||
| 229 | int idx_found, val_found; | ||
| 230 | |||
| 231 | idx_found = val_found = 0; | ||
| 232 | |||
| 233 | req = (struct cn_notify_req *)ctl->data; | ||
| 234 | for (i = 0; i < ctl->idx_notify_num; ++i, ++req) { | ||
| 235 | if (id->idx >= req->first && | ||
| 236 | id->idx < req->first + req->range) { | ||
| 237 | idx_found = 1; | ||
| 238 | break; | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 242 | for (i = 0; i < ctl->val_notify_num; ++i, ++req) { | ||
| 243 | if (id->val >= req->first && | ||
| 244 | id->val < req->first + req->range) { | ||
| 245 | val_found = 1; | ||
| 246 | break; | ||
| 247 | } | ||
| 248 | } | ||
| 249 | |||
| 250 | if (idx_found && val_found) { | ||
| 251 | struct cn_msg m = { .ack = notify_event, }; | ||
| 252 | |||
| 253 | memcpy(&m.id, id, sizeof(m.id)); | ||
| 254 | cn_netlink_send(&m, ctl->group, GFP_KERNEL); | ||
| 255 | } | ||
| 256 | } | ||
| 257 | mutex_unlock(¬ify_lock); | ||
| 258 | } | ||
| 259 | |||
| 260 | /* | ||
| 261 | * Callback add routing - adds callback with given ID and name. | 202 | * Callback add routing - adds callback with given ID and name. |
| 262 | * If there is registered callback with the same ID it will not be added. | 203 | * If there is registered callback with the same ID it will not be added. |
| 263 | * | 204 | * |
| @@ -276,8 +217,6 @@ int cn_add_callback(struct cb_id *id, char *name, | |||
| 276 | if (err) | 217 | if (err) |
| 277 | return err; | 218 | return err; |
| 278 | 219 | ||
| 279 | cn_notify(id, 0); | ||
| 280 | |||
| 281 | return 0; | 220 | return 0; |
| 282 | } | 221 | } |
| 283 | EXPORT_SYMBOL_GPL(cn_add_callback); | 222 | EXPORT_SYMBOL_GPL(cn_add_callback); |
| @@ -295,111 +234,9 @@ void cn_del_callback(struct cb_id *id) | |||
| 295 | struct cn_dev *dev = &cdev; | 234 | struct cn_dev *dev = &cdev; |
| 296 | 235 | ||
| 297 | cn_queue_del_callback(dev->cbdev, id); | 236 | cn_queue_del_callback(dev->cbdev, id); |
| 298 | cn_notify(id, 1); | ||
| 299 | } | 237 | } |
| 300 | EXPORT_SYMBOL_GPL(cn_del_callback); | 238 | EXPORT_SYMBOL_GPL(cn_del_callback); |
| 301 | 239 | ||
| 302 | /* | ||
| 303 | * Checks two connector's control messages to be the same. | ||
| 304 | * Returns 1 if they are the same or if the first one is corrupted. | ||
| 305 | */ | ||
| 306 | static int cn_ctl_msg_equals(struct cn_ctl_msg *m1, struct cn_ctl_msg *m2) | ||
| 307 | { | ||
| 308 | int i; | ||
| 309 | struct cn_notify_req *req1, *req2; | ||
| 310 | |||
| 311 | if (m1->idx_notify_num != m2->idx_notify_num) | ||
| 312 | return 0; | ||
| 313 | |||
| 314 | if (m1->val_notify_num != m2->val_notify_num) | ||
| 315 | return 0; | ||
| 316 | |||
| 317 | if (m1->len != m2->len) | ||
| 318 | return 0; | ||
| 319 | |||
| 320 | if ((m1->idx_notify_num + m1->val_notify_num) * sizeof(*req1) != | ||
| 321 | m1->len) | ||
| 322 | return 1; | ||
| 323 | |||
| 324 | req1 = (struct cn_notify_req *)m1->data; | ||
| 325 | req2 = (struct cn_notify_req *)m2->data; | ||
| 326 | |||
| 327 | for (i = 0; i < m1->idx_notify_num; ++i) { | ||
| 328 | if (req1->first != req2->first || req1->range != req2->range) | ||
| 329 | return 0; | ||
| 330 | req1++; | ||
| 331 | req2++; | ||
| 332 | } | ||
| 333 | |||
| 334 | for (i = 0; i < m1->val_notify_num; ++i) { | ||
| 335 | if (req1->first != req2->first || req1->range != req2->range) | ||
| 336 | return 0; | ||
| 337 | req1++; | ||
| 338 | req2++; | ||
| 339 | } | ||
| 340 | |||
| 341 | return 1; | ||
| 342 | } | ||
| 343 | |||
| 344 | /* | ||
| 345 | * Main connector device's callback. | ||
| 346 | * | ||
| 347 | * Used for notification of a request's processing. | ||
| 348 | */ | ||
| 349 | static void cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) | ||
| 350 | { | ||
| 351 | struct cn_ctl_msg *ctl; | ||
| 352 | struct cn_ctl_entry *ent; | ||
| 353 | u32 size; | ||
| 354 | |||
| 355 | if (msg->len < sizeof(*ctl)) | ||
| 356 | return; | ||
| 357 | |||
| 358 | ctl = (struct cn_ctl_msg *)msg->data; | ||
| 359 | |||
| 360 | size = (sizeof(*ctl) + ((ctl->idx_notify_num + | ||
| 361 | ctl->val_notify_num) * | ||
| 362 | sizeof(struct cn_notify_req))); | ||
| 363 | |||
| 364 | if (msg->len != size) | ||
| 365 | return; | ||
| 366 | |||
| 367 | if (ctl->len + sizeof(*ctl) != msg->len) | ||
| 368 | return; | ||
| 369 | |||
| 370 | /* | ||
| 371 | * Remove notification. | ||
| 372 | */ | ||
| 373 | if (ctl->group == 0) { | ||
| 374 | struct cn_ctl_entry *n; | ||
| 375 | |||
| 376 | mutex_lock(¬ify_lock); | ||
| 377 | list_for_each_entry_safe(ent, n, ¬ify_list, notify_entry) { | ||
| 378 | if (cn_ctl_msg_equals(ent->msg, ctl)) { | ||
| 379 | list_del(&ent->notify_entry); | ||
| 380 | kfree(ent); | ||
| 381 | } | ||
| 382 | } | ||
| 383 | mutex_unlock(¬ify_lock); | ||
| 384 | |||
| 385 | return; | ||
| 386 | } | ||
| 387 | |||
| 388 | size += sizeof(*ent); | ||
| 389 | |||
| 390 | ent = kzalloc(size, GFP_KERNEL); | ||
| 391 | if (!ent) | ||
| 392 | return; | ||
| 393 | |||
| 394 | ent->msg = (struct cn_ctl_msg *)(ent + 1); | ||
| 395 | |||
| 396 | memcpy(ent->msg, ctl, size - sizeof(*ent)); | ||
| 397 | |||
| 398 | mutex_lock(¬ify_lock); | ||
| 399 | list_add(&ent->notify_entry, ¬ify_list); | ||
| 400 | mutex_unlock(¬ify_lock); | ||
| 401 | } | ||
| 402 | |||
| 403 | static int cn_proc_show(struct seq_file *m, void *v) | 240 | static int cn_proc_show(struct seq_file *m, void *v) |
| 404 | { | 241 | { |
| 405 | struct cn_queue_dev *dev = cdev.cbdev; | 242 | struct cn_queue_dev *dev = cdev.cbdev; |
| @@ -437,11 +274,8 @@ static const struct file_operations cn_file_ops = { | |||
| 437 | static int __devinit cn_init(void) | 274 | static int __devinit cn_init(void) |
| 438 | { | 275 | { |
| 439 | struct cn_dev *dev = &cdev; | 276 | struct cn_dev *dev = &cdev; |
| 440 | int err; | ||
| 441 | 277 | ||
| 442 | dev->input = cn_rx_skb; | 278 | dev->input = cn_rx_skb; |
| 443 | dev->id.idx = cn_idx; | ||
| 444 | dev->id.val = cn_val; | ||
| 445 | 279 | ||
| 446 | dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, | 280 | dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, |
| 447 | CN_NETLINK_USERS + 0xf, | 281 | CN_NETLINK_USERS + 0xf, |
| @@ -457,14 +291,6 @@ static int __devinit cn_init(void) | |||
| 457 | 291 | ||
| 458 | cn_already_initialized = 1; | 292 | cn_already_initialized = 1; |
| 459 | 293 | ||
| 460 | err = cn_add_callback(&dev->id, "connector", &cn_callback); | ||
| 461 | if (err) { | ||
| 462 | cn_already_initialized = 0; | ||
| 463 | cn_queue_free_dev(dev->cbdev); | ||
| 464 | netlink_kernel_release(dev->nls); | ||
| 465 | return -EINVAL; | ||
| 466 | } | ||
| 467 | |||
| 468 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); | 294 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); |
| 469 | 295 | ||
| 470 | return 0; | 296 | return 0; |
| @@ -478,7 +304,6 @@ static void __devexit cn_fini(void) | |||
| 478 | 304 | ||
| 479 | proc_net_remove(&init_net, "connector"); | 305 | proc_net_remove(&init_net, "connector"); |
| 480 | 306 | ||
| 481 | cn_del_callback(&dev->id); | ||
| 482 | cn_queue_free_dev(dev->cbdev); | 307 | cn_queue_free_dev(dev->cbdev); |
| 483 | netlink_kernel_release(dev->nls); | 308 | netlink_kernel_release(dev->nls); |
| 484 | } | 309 | } |
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 4b34ade2332b..bd444dc93cf2 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
| @@ -554,6 +554,9 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) | |||
| 554 | (dbs_tuners_ins.up_threshold - | 554 | (dbs_tuners_ins.up_threshold - |
| 555 | dbs_tuners_ins.down_differential); | 555 | dbs_tuners_ins.down_differential); |
| 556 | 556 | ||
| 557 | if (freq_next < policy->min) | ||
| 558 | freq_next = policy->min; | ||
| 559 | |||
| 557 | if (!dbs_tuners_ins.powersave_bias) { | 560 | if (!dbs_tuners_ins.powersave_bias) { |
| 558 | __cpufreq_driver_target(policy, freq_next, | 561 | __cpufreq_driver_target(policy, freq_next, |
| 559 | CPUFREQ_RELATION_L); | 562 | CPUFREQ_RELATION_L); |
diff --git a/drivers/crypto/padlock-sha.c b/drivers/crypto/padlock-sha.c index 0af80577dc7b..d3a27e0119bc 100644 --- a/drivers/crypto/padlock-sha.c +++ b/drivers/crypto/padlock-sha.c | |||
| @@ -57,6 +57,23 @@ static int padlock_sha_update(struct shash_desc *desc, | |||
| 57 | return crypto_shash_update(&dctx->fallback, data, length); | 57 | return crypto_shash_update(&dctx->fallback, data, length); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static int padlock_sha_export(struct shash_desc *desc, void *out) | ||
| 61 | { | ||
| 62 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); | ||
| 63 | |||
| 64 | return crypto_shash_export(&dctx->fallback, out); | ||
| 65 | } | ||
| 66 | |||
| 67 | static int padlock_sha_import(struct shash_desc *desc, const void *in) | ||
| 68 | { | ||
| 69 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); | ||
| 70 | struct padlock_sha_ctx *ctx = crypto_shash_ctx(desc->tfm); | ||
| 71 | |||
| 72 | dctx->fallback.tfm = ctx->fallback; | ||
| 73 | dctx->fallback.flags = desc->flags & CRYPTO_TFM_REQ_MAY_SLEEP; | ||
| 74 | return crypto_shash_import(&dctx->fallback, in); | ||
| 75 | } | ||
| 76 | |||
| 60 | static inline void padlock_output_block(uint32_t *src, | 77 | static inline void padlock_output_block(uint32_t *src, |
| 61 | uint32_t *dst, size_t count) | 78 | uint32_t *dst, size_t count) |
| 62 | { | 79 | { |
| @@ -235,7 +252,10 @@ static struct shash_alg sha1_alg = { | |||
| 235 | .update = padlock_sha_update, | 252 | .update = padlock_sha_update, |
| 236 | .finup = padlock_sha1_finup, | 253 | .finup = padlock_sha1_finup, |
| 237 | .final = padlock_sha1_final, | 254 | .final = padlock_sha1_final, |
| 255 | .export = padlock_sha_export, | ||
| 256 | .import = padlock_sha_import, | ||
| 238 | .descsize = sizeof(struct padlock_sha_desc), | 257 | .descsize = sizeof(struct padlock_sha_desc), |
| 258 | .statesize = sizeof(struct sha1_state), | ||
| 239 | .base = { | 259 | .base = { |
| 240 | .cra_name = "sha1", | 260 | .cra_name = "sha1", |
| 241 | .cra_driver_name = "sha1-padlock", | 261 | .cra_driver_name = "sha1-padlock", |
| @@ -256,7 +276,10 @@ static struct shash_alg sha256_alg = { | |||
| 256 | .update = padlock_sha_update, | 276 | .update = padlock_sha_update, |
| 257 | .finup = padlock_sha256_finup, | 277 | .finup = padlock_sha256_finup, |
| 258 | .final = padlock_sha256_final, | 278 | .final = padlock_sha256_final, |
| 279 | .export = padlock_sha_export, | ||
| 280 | .import = padlock_sha_import, | ||
| 259 | .descsize = sizeof(struct padlock_sha_desc), | 281 | .descsize = sizeof(struct padlock_sha_desc), |
| 282 | .statesize = sizeof(struct sha256_state), | ||
| 260 | .base = { | 283 | .base = { |
| 261 | .cra_name = "sha256", | 284 | .cra_name = "sha256", |
| 262 | .cra_driver_name = "sha256-padlock", | 285 | .cra_driver_name = "sha256-padlock", |
diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c index b5f2ee0f8e2c..64a937262a40 100644 --- a/drivers/dma/coh901318.c +++ b/drivers/dma/coh901318.c | |||
| @@ -613,8 +613,6 @@ static void dma_tasklet(unsigned long data) | |||
| 613 | cohd_fin->pending_irqs--; | 613 | cohd_fin->pending_irqs--; |
| 614 | cohc->completed = cohd_fin->desc.cookie; | 614 | cohc->completed = cohd_fin->desc.cookie; |
| 615 | 615 | ||
| 616 | BUG_ON(cohc->nbr_active_done && cohd_fin == NULL); | ||
| 617 | |||
| 618 | if (cohc->nbr_active_done == 0) | 616 | if (cohc->nbr_active_done == 0) |
| 619 | return; | 617 | return; |
| 620 | 618 | ||
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 6f51a0a7a8bb..e7a3230fb7d5 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
| @@ -826,6 +826,7 @@ void dma_async_device_unregister(struct dma_device *device) | |||
| 826 | chan->dev->chan = NULL; | 826 | chan->dev->chan = NULL; |
| 827 | mutex_unlock(&dma_list_mutex); | 827 | mutex_unlock(&dma_list_mutex); |
| 828 | device_unregister(&chan->dev->device); | 828 | device_unregister(&chan->dev->device); |
| 829 | free_percpu(chan->local); | ||
| 829 | } | 830 | } |
| 830 | } | 831 | } |
| 831 | EXPORT_SYMBOL(dma_async_device_unregister); | 832 | EXPORT_SYMBOL(dma_async_device_unregister); |
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 8b905161fbf4..948d563941c9 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
| @@ -467,7 +467,7 @@ err_srcs: | |||
| 467 | 467 | ||
| 468 | if (iterations > 0) | 468 | if (iterations > 0) |
| 469 | while (!kthread_should_stop()) { | 469 | while (!kthread_should_stop()) { |
| 470 | DECLARE_WAIT_QUEUE_HEAD(wait_dmatest_exit); | 470 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wait_dmatest_exit); |
| 471 | interruptible_sleep_on(&wait_dmatest_exit); | 471 | interruptible_sleep_on(&wait_dmatest_exit); |
| 472 | } | 472 | } |
| 473 | 473 | ||
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index 5f7a500e18d0..5cc37afe2bc1 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c | |||
| @@ -249,7 +249,7 @@ int ioat2_quiesce(struct ioat_chan_common *chan, unsigned long tmo) | |||
| 249 | if (is_ioat_active(status) || is_ioat_idle(status)) | 249 | if (is_ioat_active(status) || is_ioat_idle(status)) |
| 250 | ioat_suspend(chan); | 250 | ioat_suspend(chan); |
| 251 | while (is_ioat_active(status) || is_ioat_idle(status)) { | 251 | while (is_ioat_active(status) || is_ioat_idle(status)) { |
| 252 | if (end && time_after(jiffies, end)) { | 252 | if (tmo && time_after(jiffies, end)) { |
| 253 | err = -ETIMEDOUT; | 253 | err = -ETIMEDOUT; |
| 254 | break; | 254 | break; |
| 255 | } | 255 | } |
diff --git a/drivers/dma/ipu/ipu_idmac.c b/drivers/dma/ipu/ipu_idmac.c index 9a5bc1a7389e..e80bae1673fa 100644 --- a/drivers/dma/ipu/ipu_idmac.c +++ b/drivers/dma/ipu/ipu_idmac.c | |||
| @@ -761,12 +761,10 @@ static void ipu_select_buffer(enum ipu_channel channel, int buffer_n) | |||
| 761 | * @buffer_n: buffer number to update. | 761 | * @buffer_n: buffer number to update. |
| 762 | * 0 or 1 are the only valid values. | 762 | * 0 or 1 are the only valid values. |
| 763 | * @phyaddr: buffer physical address. | 763 | * @phyaddr: buffer physical address. |
| 764 | * @return: Returns 0 on success or negative error code on failure. This | ||
| 765 | * function will fail if the buffer is set to ready. | ||
| 766 | */ | 764 | */ |
| 767 | /* Called under spin_lock(_irqsave)(&ichan->lock) */ | 765 | /* Called under spin_lock(_irqsave)(&ichan->lock) */ |
| 768 | static int ipu_update_channel_buffer(struct idmac_channel *ichan, | 766 | static void ipu_update_channel_buffer(struct idmac_channel *ichan, |
| 769 | int buffer_n, dma_addr_t phyaddr) | 767 | int buffer_n, dma_addr_t phyaddr) |
| 770 | { | 768 | { |
| 771 | enum ipu_channel channel = ichan->dma_chan.chan_id; | 769 | enum ipu_channel channel = ichan->dma_chan.chan_id; |
| 772 | uint32_t reg; | 770 | uint32_t reg; |
| @@ -806,8 +804,6 @@ static int ipu_update_channel_buffer(struct idmac_channel *ichan, | |||
| 806 | } | 804 | } |
| 807 | 805 | ||
| 808 | spin_unlock_irqrestore(&ipu_data.lock, flags); | 806 | spin_unlock_irqrestore(&ipu_data.lock, flags); |
| 809 | |||
| 810 | return 0; | ||
| 811 | } | 807 | } |
| 812 | 808 | ||
| 813 | /* Called under spin_lock_irqsave(&ichan->lock) */ | 809 | /* Called under spin_lock_irqsave(&ichan->lock) */ |
| @@ -816,7 +812,6 @@ static int ipu_submit_buffer(struct idmac_channel *ichan, | |||
| 816 | { | 812 | { |
| 817 | unsigned int chan_id = ichan->dma_chan.chan_id; | 813 | unsigned int chan_id = ichan->dma_chan.chan_id; |
| 818 | struct device *dev = &ichan->dma_chan.dev->device; | 814 | struct device *dev = &ichan->dma_chan.dev->device; |
| 819 | int ret; | ||
| 820 | 815 | ||
| 821 | if (async_tx_test_ack(&desc->txd)) | 816 | if (async_tx_test_ack(&desc->txd)) |
| 822 | return -EINTR; | 817 | return -EINTR; |
| @@ -827,14 +822,7 @@ static int ipu_submit_buffer(struct idmac_channel *ichan, | |||
| 827 | * could make it conditional on status >= IPU_CHANNEL_ENABLED, but | 822 | * could make it conditional on status >= IPU_CHANNEL_ENABLED, but |
| 828 | * doing it again shouldn't hurt either. | 823 | * doing it again shouldn't hurt either. |
| 829 | */ | 824 | */ |
| 830 | ret = ipu_update_channel_buffer(ichan, buf_idx, | 825 | ipu_update_channel_buffer(ichan, buf_idx, sg_dma_address(sg)); |
| 831 | sg_dma_address(sg)); | ||
| 832 | |||
| 833 | if (ret < 0) { | ||
| 834 | dev_err(dev, "Updating sg %p on channel 0x%x buffer %d failed!\n", | ||
| 835 | sg, chan_id, buf_idx); | ||
| 836 | return ret; | ||
| 837 | } | ||
| 838 | 826 | ||
| 839 | ipu_select_buffer(chan_id, buf_idx); | 827 | ipu_select_buffer(chan_id, buf_idx); |
| 840 | dev_dbg(dev, "Updated sg %p on channel 0x%x buffer %d\n", | 828 | dev_dbg(dev, "Updated sg %p on channel 0x%x buffer %d\n", |
| @@ -1379,10 +1367,11 @@ static irqreturn_t idmac_interrupt(int irq, void *dev_id) | |||
| 1379 | 1367 | ||
| 1380 | if (likely(sgnew) && | 1368 | if (likely(sgnew) && |
| 1381 | ipu_submit_buffer(ichan, descnew, sgnew, ichan->active_buffer) < 0) { | 1369 | ipu_submit_buffer(ichan, descnew, sgnew, ichan->active_buffer) < 0) { |
| 1382 | callback = desc->txd.callback; | 1370 | callback = descnew->txd.callback; |
| 1383 | callback_param = desc->txd.callback_param; | 1371 | callback_param = descnew->txd.callback_param; |
| 1384 | spin_unlock(&ichan->lock); | 1372 | spin_unlock(&ichan->lock); |
| 1385 | callback(callback_param); | 1373 | if (callback) |
| 1374 | callback(callback_param); | ||
| 1386 | spin_lock(&ichan->lock); | 1375 | spin_lock(&ichan->lock); |
| 1387 | } | 1376 | } |
| 1388 | 1377 | ||
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 000dc67b85b7..3391e6739d06 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
| @@ -2658,10 +2658,11 @@ static void amd64_restore_ecc_error_reporting(struct amd64_pvt *pvt) | |||
| 2658 | * the memory system completely. A command line option allows to force-enable | 2658 | * the memory system completely. A command line option allows to force-enable |
| 2659 | * hardware ECC later in amd64_enable_ecc_error_reporting(). | 2659 | * hardware ECC later in amd64_enable_ecc_error_reporting(). |
| 2660 | */ | 2660 | */ |
| 2661 | static const char *ecc_warning = | 2661 | static const char *ecc_msg = |
| 2662 | "WARNING: ECC is disabled by BIOS. Module will NOT be loaded.\n" | 2662 | "ECC disabled in the BIOS or no ECC capability, module will not load.\n" |
| 2663 | " Either Enable ECC in the BIOS, or set 'ecc_enable_override'.\n" | 2663 | " Either enable ECC checking or force module loading by setting " |
| 2664 | " Also, use of the override can cause unknown side effects.\n"; | 2664 | "'ecc_enable_override'.\n" |
| 2665 | " (Note that use of the override may cause unknown side effects.)\n"; | ||
| 2665 | 2666 | ||
| 2666 | static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) | 2667 | static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) |
| 2667 | { | 2668 | { |
| @@ -2673,7 +2674,7 @@ static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) | |||
| 2673 | 2674 | ||
| 2674 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); | 2675 | ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE); |
| 2675 | if (!ecc_enabled) | 2676 | if (!ecc_enabled) |
| 2676 | amd64_printk(KERN_WARNING, "This node reports that Memory ECC " | 2677 | amd64_printk(KERN_NOTICE, "This node reports that Memory ECC " |
| 2677 | "is currently disabled, set F3x%x[22] (%s).\n", | 2678 | "is currently disabled, set F3x%x[22] (%s).\n", |
| 2678 | K8_NBCFG, pci_name(pvt->misc_f3_ctl)); | 2679 | K8_NBCFG, pci_name(pvt->misc_f3_ctl)); |
| 2679 | else | 2680 | else |
| @@ -2681,13 +2682,13 @@ static int amd64_check_ecc_enabled(struct amd64_pvt *pvt) | |||
| 2681 | 2682 | ||
| 2682 | nb_mce_en = amd64_nb_mce_bank_enabled_on_node(pvt->mc_node_id); | 2683 | nb_mce_en = amd64_nb_mce_bank_enabled_on_node(pvt->mc_node_id); |
| 2683 | if (!nb_mce_en) | 2684 | if (!nb_mce_en) |
| 2684 | amd64_printk(KERN_WARNING, "NB MCE bank disabled, set MSR " | 2685 | amd64_printk(KERN_NOTICE, "NB MCE bank disabled, set MSR " |
| 2685 | "0x%08x[4] on node %d to enable.\n", | 2686 | "0x%08x[4] on node %d to enable.\n", |
| 2686 | MSR_IA32_MCG_CTL, pvt->mc_node_id); | 2687 | MSR_IA32_MCG_CTL, pvt->mc_node_id); |
| 2687 | 2688 | ||
| 2688 | if (!ecc_enabled || !nb_mce_en) { | 2689 | if (!ecc_enabled || !nb_mce_en) { |
| 2689 | if (!ecc_enable_override) { | 2690 | if (!ecc_enable_override) { |
| 2690 | amd64_printk(KERN_WARNING, "%s", ecc_warning); | 2691 | amd64_printk(KERN_NOTICE, "%s", ecc_msg); |
| 2691 | return -ENODEV; | 2692 | return -ENODEV; |
| 2692 | } | 2693 | } |
| 2693 | ecc_enable_override = 0; | 2694 | ecc_enable_override = 0; |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index cf27402af97b..ecd5928d7110 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
| @@ -804,8 +804,8 @@ static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci) | |||
| 804 | end <<= (24 - PAGE_SHIFT); | 804 | end <<= (24 - PAGE_SHIFT); |
| 805 | end |= (1 << (24 - PAGE_SHIFT)) - 1; | 805 | end |= (1 << (24 - PAGE_SHIFT)) - 1; |
| 806 | 806 | ||
| 807 | csrow->first_page = start >> PAGE_SHIFT; | 807 | csrow->first_page = start; |
| 808 | csrow->last_page = end >> PAGE_SHIFT; | 808 | csrow->last_page = end; |
| 809 | csrow->nr_pages = end + 1 - start; | 809 | csrow->nr_pages = end + 1 - start; |
| 810 | csrow->grain = 8; | 810 | csrow->grain = 8; |
| 811 | csrow->mtype = mtype; | 811 | csrow->mtype = mtype; |
| @@ -892,10 +892,6 @@ static int __devinit mpc85xx_mc_err_probe(struct of_device *op, | |||
| 892 | 892 | ||
| 893 | mpc85xx_init_csrows(mci); | 893 | mpc85xx_init_csrows(mci); |
| 894 | 894 | ||
| 895 | #ifdef CONFIG_EDAC_DEBUG | ||
| 896 | edac_mc_register_mcidev_debug((struct attribute **)debug_attr); | ||
| 897 | #endif | ||
| 898 | |||
| 899 | /* store the original error disable bits */ | 895 | /* store the original error disable bits */ |
| 900 | orig_ddr_err_disable = | 896 | orig_ddr_err_disable = |
| 901 | in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE); | 897 | in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE); |
diff --git a/drivers/gpu/drm/ati_pcigart.c b/drivers/gpu/drm/ati_pcigart.c index a1fce68e3bbe..17be051b7aa3 100644 --- a/drivers/gpu/drm/ati_pcigart.c +++ b/drivers/gpu/drm/ati_pcigart.c | |||
| @@ -113,7 +113,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga | |||
| 113 | 113 | ||
| 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { | 114 | if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) { |
| 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", | 115 | DRM_ERROR("fail to set dma mask to 0x%Lx\n", |
| 116 | gart_info->table_mask); | 116 | (unsigned long long)gart_info->table_mask); |
| 117 | ret = 1; | 117 | ret = 1; |
| 118 | goto done; | 118 | goto done; |
| 119 | } | 119 | } |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index e660ac07f3b2..2307f98349f7 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -735,8 +735,10 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, | |||
| 735 | if (cmdbuf->num_cliprects) { | 735 | if (cmdbuf->num_cliprects) { |
| 736 | cliprects = kcalloc(cmdbuf->num_cliprects, | 736 | cliprects = kcalloc(cmdbuf->num_cliprects, |
| 737 | sizeof(struct drm_clip_rect), GFP_KERNEL); | 737 | sizeof(struct drm_clip_rect), GFP_KERNEL); |
| 738 | if (cliprects == NULL) | 738 | if (cliprects == NULL) { |
| 739 | ret = -ENOMEM; | ||
| 739 | goto fail_batch_free; | 740 | goto fail_batch_free; |
| 741 | } | ||
| 740 | 742 | ||
| 741 | ret = copy_from_user(cliprects, cmdbuf->cliprects, | 743 | ret = copy_from_user(cliprects, cmdbuf->cliprects, |
| 742 | cmdbuf->num_cliprects * | 744 | cmdbuf->num_cliprects * |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 46d88965852a..79beffcf5936 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -120,7 +120,7 @@ const static struct intel_device_info intel_gm45_info = { | |||
| 120 | 120 | ||
| 121 | const static struct intel_device_info intel_pineview_info = { | 121 | const static struct intel_device_info intel_pineview_info = { |
| 122 | .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, | 122 | .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, |
| 123 | .has_pipe_cxsr = 1, | 123 | .need_gfx_hws = 1, |
| 124 | .has_hotplug = 1, | 124 | .has_hotplug = 1, |
| 125 | }; | 125 | }; |
| 126 | 126 | ||
| @@ -174,78 +174,100 @@ const static struct pci_device_id pciidlist[] = { | |||
| 174 | MODULE_DEVICE_TABLE(pci, pciidlist); | 174 | MODULE_DEVICE_TABLE(pci, pciidlist); |
| 175 | #endif | 175 | #endif |
| 176 | 176 | ||
| 177 | static int i915_suspend(struct drm_device *dev, pm_message_t state) | 177 | static int i915_drm_freeze(struct drm_device *dev) |
| 178 | { | 178 | { |
| 179 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 180 | |||
| 181 | if (!dev || !dev_priv) { | ||
| 182 | DRM_ERROR("dev: %p, dev_priv: %p\n", dev, dev_priv); | ||
| 183 | DRM_ERROR("DRM not initialized, aborting suspend.\n"); | ||
| 184 | return -ENODEV; | ||
| 185 | } | ||
| 186 | |||
| 187 | if (state.event == PM_EVENT_PRETHAW) | ||
| 188 | return 0; | ||
| 189 | |||
| 190 | pci_save_state(dev->pdev); | 179 | pci_save_state(dev->pdev); |
| 191 | 180 | ||
| 192 | /* If KMS is active, we do the leavevt stuff here */ | 181 | /* If KMS is active, we do the leavevt stuff here */ |
| 193 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 182 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
| 194 | if (i915_gem_idle(dev)) | 183 | int error = i915_gem_idle(dev); |
| 184 | if (error) { | ||
| 195 | dev_err(&dev->pdev->dev, | 185 | dev_err(&dev->pdev->dev, |
| 196 | "GEM idle failed, resume may fail\n"); | 186 | "GEM idle failed, resume might fail\n"); |
| 187 | return error; | ||
| 188 | } | ||
| 197 | drm_irq_uninstall(dev); | 189 | drm_irq_uninstall(dev); |
| 198 | } | 190 | } |
| 199 | 191 | ||
| 200 | i915_save_state(dev); | 192 | i915_save_state(dev); |
| 201 | 193 | ||
| 194 | return 0; | ||
| 195 | } | ||
| 196 | |||
| 197 | static void i915_drm_suspend(struct drm_device *dev) | ||
| 198 | { | ||
| 199 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 200 | |||
| 202 | intel_opregion_free(dev, 1); | 201 | intel_opregion_free(dev, 1); |
| 203 | 202 | ||
| 203 | /* Modeset on resume, not lid events */ | ||
| 204 | dev_priv->modeset_on_lid = 0; | ||
| 205 | } | ||
| 206 | |||
| 207 | static int i915_suspend(struct drm_device *dev, pm_message_t state) | ||
| 208 | { | ||
| 209 | int error; | ||
| 210 | |||
| 211 | if (!dev || !dev->dev_private) { | ||
| 212 | DRM_ERROR("dev: %p\n", dev); | ||
| 213 | DRM_ERROR("DRM not initialized, aborting suspend.\n"); | ||
| 214 | return -ENODEV; | ||
| 215 | } | ||
| 216 | |||
| 217 | if (state.event == PM_EVENT_PRETHAW) | ||
| 218 | return 0; | ||
| 219 | |||
| 220 | error = i915_drm_freeze(dev); | ||
| 221 | if (error) | ||
| 222 | return error; | ||
| 223 | |||
| 224 | i915_drm_suspend(dev); | ||
| 225 | |||
| 204 | if (state.event == PM_EVENT_SUSPEND) { | 226 | if (state.event == PM_EVENT_SUSPEND) { |
| 205 | /* Shut down the device */ | 227 | /* Shut down the device */ |
| 206 | pci_disable_device(dev->pdev); | 228 | pci_disable_device(dev->pdev); |
| 207 | pci_set_power_state(dev->pdev, PCI_D3hot); | 229 | pci_set_power_state(dev->pdev, PCI_D3hot); |
| 208 | } | 230 | } |
| 209 | 231 | ||
| 210 | /* Modeset on resume, not lid events */ | ||
| 211 | dev_priv->modeset_on_lid = 0; | ||
| 212 | |||
| 213 | return 0; | 232 | return 0; |
| 214 | } | 233 | } |
| 215 | 234 | ||
| 216 | static int i915_resume(struct drm_device *dev) | 235 | static int i915_drm_thaw(struct drm_device *dev) |
| 217 | { | 236 | { |
| 218 | struct drm_i915_private *dev_priv = dev->dev_private; | 237 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 219 | int ret = 0; | 238 | int error = 0; |
| 220 | |||
| 221 | if (pci_enable_device(dev->pdev)) | ||
| 222 | return -1; | ||
| 223 | pci_set_master(dev->pdev); | ||
| 224 | |||
| 225 | i915_restore_state(dev); | ||
| 226 | |||
| 227 | intel_opregion_init(dev, 1); | ||
| 228 | 239 | ||
| 229 | /* KMS EnterVT equivalent */ | 240 | /* KMS EnterVT equivalent */ |
| 230 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 241 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
| 231 | mutex_lock(&dev->struct_mutex); | 242 | mutex_lock(&dev->struct_mutex); |
| 232 | dev_priv->mm.suspended = 0; | 243 | dev_priv->mm.suspended = 0; |
| 233 | 244 | ||
| 234 | ret = i915_gem_init_ringbuffer(dev); | 245 | error = i915_gem_init_ringbuffer(dev); |
| 235 | if (ret != 0) | ||
| 236 | ret = -1; | ||
| 237 | mutex_unlock(&dev->struct_mutex); | 246 | mutex_unlock(&dev->struct_mutex); |
| 238 | 247 | ||
| 239 | drm_irq_install(dev); | 248 | drm_irq_install(dev); |
| 240 | } | 249 | |
| 241 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
| 242 | /* Resume the modeset for every activated CRTC */ | 250 | /* Resume the modeset for every activated CRTC */ |
| 243 | drm_helper_resume_force_mode(dev); | 251 | drm_helper_resume_force_mode(dev); |
| 244 | } | 252 | } |
| 245 | 253 | ||
| 246 | dev_priv->modeset_on_lid = 0; | 254 | dev_priv->modeset_on_lid = 0; |
| 247 | 255 | ||
| 248 | return ret; | 256 | return error; |
| 257 | } | ||
| 258 | |||
| 259 | static int i915_resume(struct drm_device *dev) | ||
| 260 | { | ||
| 261 | if (pci_enable_device(dev->pdev)) | ||
| 262 | return -EIO; | ||
| 263 | |||
| 264 | pci_set_master(dev->pdev); | ||
| 265 | |||
| 266 | i915_restore_state(dev); | ||
| 267 | |||
| 268 | intel_opregion_init(dev, 1); | ||
| 269 | |||
| 270 | return i915_drm_thaw(dev); | ||
| 249 | } | 271 | } |
| 250 | 272 | ||
| 251 | /** | 273 | /** |
| @@ -386,57 +408,69 @@ i915_pci_remove(struct pci_dev *pdev) | |||
| 386 | drm_put_dev(dev); | 408 | drm_put_dev(dev); |
| 387 | } | 409 | } |
| 388 | 410 | ||
| 389 | static int | 411 | static int i915_pm_suspend(struct device *dev) |
| 390 | i915_pci_suspend(struct pci_dev *pdev, pm_message_t state) | ||
| 391 | { | 412 | { |
| 392 | struct drm_device *dev = pci_get_drvdata(pdev); | 413 | struct pci_dev *pdev = to_pci_dev(dev); |
| 414 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
| 415 | int error; | ||
| 393 | 416 | ||
| 394 | return i915_suspend(dev, state); | 417 | if (!drm_dev || !drm_dev->dev_private) { |
| 395 | } | 418 | dev_err(dev, "DRM not initialized, aborting suspend.\n"); |
| 419 | return -ENODEV; | ||
| 420 | } | ||
| 396 | 421 | ||
| 397 | static int | 422 | error = i915_drm_freeze(drm_dev); |
| 398 | i915_pci_resume(struct pci_dev *pdev) | 423 | if (error) |
| 399 | { | 424 | return error; |
| 400 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
| 401 | 425 | ||
| 402 | return i915_resume(dev); | 426 | i915_drm_suspend(drm_dev); |
| 403 | } | ||
| 404 | 427 | ||
| 405 | static int | 428 | pci_disable_device(pdev); |
| 406 | i915_pm_suspend(struct device *dev) | 429 | pci_set_power_state(pdev, PCI_D3hot); |
| 407 | { | ||
| 408 | return i915_pci_suspend(to_pci_dev(dev), PMSG_SUSPEND); | ||
| 409 | } | ||
| 410 | 430 | ||
| 411 | static int | 431 | return 0; |
| 412 | i915_pm_resume(struct device *dev) | ||
| 413 | { | ||
| 414 | return i915_pci_resume(to_pci_dev(dev)); | ||
| 415 | } | 432 | } |
| 416 | 433 | ||
| 417 | static int | 434 | static int i915_pm_resume(struct device *dev) |
| 418 | i915_pm_freeze(struct device *dev) | ||
| 419 | { | 435 | { |
| 420 | return i915_pci_suspend(to_pci_dev(dev), PMSG_FREEZE); | 436 | struct pci_dev *pdev = to_pci_dev(dev); |
| 437 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
| 438 | |||
| 439 | return i915_resume(drm_dev); | ||
| 421 | } | 440 | } |
| 422 | 441 | ||
| 423 | static int | 442 | static int i915_pm_freeze(struct device *dev) |
| 424 | i915_pm_thaw(struct device *dev) | ||
| 425 | { | 443 | { |
| 426 | /* thaw during hibernate, do nothing! */ | 444 | struct pci_dev *pdev = to_pci_dev(dev); |
| 427 | return 0; | 445 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
| 446 | |||
| 447 | if (!drm_dev || !drm_dev->dev_private) { | ||
| 448 | dev_err(dev, "DRM not initialized, aborting suspend.\n"); | ||
| 449 | return -ENODEV; | ||
| 450 | } | ||
| 451 | |||
| 452 | return i915_drm_freeze(drm_dev); | ||
| 428 | } | 453 | } |
| 429 | 454 | ||
| 430 | static int | 455 | static int i915_pm_thaw(struct device *dev) |
| 431 | i915_pm_poweroff(struct device *dev) | ||
| 432 | { | 456 | { |
| 433 | return i915_pci_suspend(to_pci_dev(dev), PMSG_HIBERNATE); | 457 | struct pci_dev *pdev = to_pci_dev(dev); |
| 458 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
| 459 | |||
| 460 | return i915_drm_thaw(drm_dev); | ||
| 434 | } | 461 | } |
| 435 | 462 | ||
| 436 | static int | 463 | static int i915_pm_poweroff(struct device *dev) |
| 437 | i915_pm_restore(struct device *dev) | ||
| 438 | { | 464 | { |
| 439 | return i915_pci_resume(to_pci_dev(dev)); | 465 | struct pci_dev *pdev = to_pci_dev(dev); |
| 466 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
| 467 | int error; | ||
| 468 | |||
| 469 | error = i915_drm_freeze(drm_dev); | ||
| 470 | if (!error) | ||
| 471 | i915_drm_suspend(drm_dev); | ||
| 472 | |||
| 473 | return error; | ||
| 440 | } | 474 | } |
| 441 | 475 | ||
| 442 | const struct dev_pm_ops i915_pm_ops = { | 476 | const struct dev_pm_ops i915_pm_ops = { |
| @@ -445,7 +479,7 @@ const struct dev_pm_ops i915_pm_ops = { | |||
| 445 | .freeze = i915_pm_freeze, | 479 | .freeze = i915_pm_freeze, |
| 446 | .thaw = i915_pm_thaw, | 480 | .thaw = i915_pm_thaw, |
| 447 | .poweroff = i915_pm_poweroff, | 481 | .poweroff = i915_pm_poweroff, |
| 448 | .restore = i915_pm_restore, | 482 | .restore = i915_pm_resume, |
| 449 | }; | 483 | }; |
| 450 | 484 | ||
| 451 | static struct vm_operations_struct i915_gem_vm_ops = { | 485 | static struct vm_operations_struct i915_gem_vm_ops = { |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index aaf934d96f21..b99b6a841d95 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -493,6 +493,15 @@ typedef struct drm_i915_private { | |||
| 493 | struct list_head flushing_list; | 493 | struct list_head flushing_list; |
| 494 | 494 | ||
| 495 | /** | 495 | /** |
| 496 | * List of objects currently pending a GPU write flush. | ||
| 497 | * | ||
| 498 | * All elements on this list will belong to either the | ||
| 499 | * active_list or flushing_list, last_rendering_seqno can | ||
| 500 | * be used to differentiate between the two elements. | ||
| 501 | */ | ||
| 502 | struct list_head gpu_write_list; | ||
| 503 | |||
| 504 | /** | ||
| 496 | * LRU list of objects which are not in the ringbuffer and | 505 | * LRU list of objects which are not in the ringbuffer and |
| 497 | * are ready to unbind, but are still in the GTT. | 506 | * are ready to unbind, but are still in the GTT. |
| 498 | * | 507 | * |
| @@ -592,6 +601,8 @@ struct drm_i915_gem_object { | |||
| 592 | 601 | ||
| 593 | /** This object's place on the active/flushing/inactive lists */ | 602 | /** This object's place on the active/flushing/inactive lists */ |
| 594 | struct list_head list; | 603 | struct list_head list; |
| 604 | /** This object's place on GPU write list */ | ||
| 605 | struct list_head gpu_write_list; | ||
| 595 | 606 | ||
| 596 | /** This object's place on the fenced object LRU */ | 607 | /** This object's place on the fenced object LRU */ |
| 597 | struct list_head fence_list; | 608 | struct list_head fence_list; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index dda787aafcc6..ec8a0d7ffa39 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1552,6 +1552,8 @@ i915_gem_object_move_to_inactive(struct drm_gem_object *obj) | |||
| 1552 | else | 1552 | else |
| 1553 | list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list); | 1553 | list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list); |
| 1554 | 1554 | ||
| 1555 | BUG_ON(!list_empty(&obj_priv->gpu_write_list)); | ||
| 1556 | |||
| 1555 | obj_priv->last_rendering_seqno = 0; | 1557 | obj_priv->last_rendering_seqno = 0; |
| 1556 | if (obj_priv->active) { | 1558 | if (obj_priv->active) { |
| 1557 | obj_priv->active = 0; | 1559 | obj_priv->active = 0; |
| @@ -1622,7 +1624,8 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | |||
| 1622 | struct drm_i915_gem_object *obj_priv, *next; | 1624 | struct drm_i915_gem_object *obj_priv, *next; |
| 1623 | 1625 | ||
| 1624 | list_for_each_entry_safe(obj_priv, next, | 1626 | list_for_each_entry_safe(obj_priv, next, |
| 1625 | &dev_priv->mm.flushing_list, list) { | 1627 | &dev_priv->mm.gpu_write_list, |
| 1628 | gpu_write_list) { | ||
| 1626 | struct drm_gem_object *obj = obj_priv->obj; | 1629 | struct drm_gem_object *obj = obj_priv->obj; |
| 1627 | 1630 | ||
| 1628 | if ((obj->write_domain & flush_domains) == | 1631 | if ((obj->write_domain & flush_domains) == |
| @@ -1630,6 +1633,7 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | |||
| 1630 | uint32_t old_write_domain = obj->write_domain; | 1633 | uint32_t old_write_domain = obj->write_domain; |
| 1631 | 1634 | ||
| 1632 | obj->write_domain = 0; | 1635 | obj->write_domain = 0; |
| 1636 | list_del_init(&obj_priv->gpu_write_list); | ||
| 1633 | i915_gem_object_move_to_active(obj, seqno); | 1637 | i915_gem_object_move_to_active(obj, seqno); |
| 1634 | 1638 | ||
| 1635 | trace_i915_gem_object_change_domain(obj, | 1639 | trace_i915_gem_object_change_domain(obj, |
| @@ -2084,8 +2088,8 @@ static int | |||
| 2084 | i915_gem_evict_everything(struct drm_device *dev) | 2088 | i915_gem_evict_everything(struct drm_device *dev) |
| 2085 | { | 2089 | { |
| 2086 | drm_i915_private_t *dev_priv = dev->dev_private; | 2090 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 2087 | uint32_t seqno; | ||
| 2088 | int ret; | 2091 | int ret; |
| 2092 | uint32_t seqno; | ||
| 2089 | bool lists_empty; | 2093 | bool lists_empty; |
| 2090 | 2094 | ||
| 2091 | spin_lock(&dev_priv->mm.active_list_lock); | 2095 | spin_lock(&dev_priv->mm.active_list_lock); |
| @@ -2107,6 +2111,8 @@ i915_gem_evict_everything(struct drm_device *dev) | |||
| 2107 | if (ret) | 2111 | if (ret) |
| 2108 | return ret; | 2112 | return ret; |
| 2109 | 2113 | ||
| 2114 | BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); | ||
| 2115 | |||
| 2110 | ret = i915_gem_evict_from_inactive_list(dev); | 2116 | ret = i915_gem_evict_from_inactive_list(dev); |
| 2111 | if (ret) | 2117 | if (ret) |
| 2112 | return ret; | 2118 | return ret; |
| @@ -2701,7 +2707,7 @@ i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj) | |||
| 2701 | old_write_domain = obj->write_domain; | 2707 | old_write_domain = obj->write_domain; |
| 2702 | i915_gem_flush(dev, 0, obj->write_domain); | 2708 | i915_gem_flush(dev, 0, obj->write_domain); |
| 2703 | seqno = i915_add_request(dev, NULL, obj->write_domain); | 2709 | seqno = i915_add_request(dev, NULL, obj->write_domain); |
| 2704 | obj->write_domain = 0; | 2710 | BUG_ON(obj->write_domain); |
| 2705 | i915_gem_object_move_to_active(obj, seqno); | 2711 | i915_gem_object_move_to_active(obj, seqno); |
| 2706 | 2712 | ||
| 2707 | trace_i915_gem_object_change_domain(obj, | 2713 | trace_i915_gem_object_change_domain(obj, |
| @@ -3564,6 +3570,9 @@ i915_gem_put_relocs_to_user(struct drm_i915_gem_exec_object2 *exec_list, | |||
| 3564 | uint32_t reloc_count = 0, i; | 3570 | uint32_t reloc_count = 0, i; |
| 3565 | int ret = 0; | 3571 | int ret = 0; |
| 3566 | 3572 | ||
| 3573 | if (relocs == NULL) | ||
| 3574 | return 0; | ||
| 3575 | |||
| 3567 | for (i = 0; i < buffer_count; i++) { | 3576 | for (i = 0; i < buffer_count; i++) { |
| 3568 | struct drm_i915_gem_relocation_entry __user *user_relocs; | 3577 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
| 3569 | int unwritten; | 3578 | int unwritten; |
| @@ -3653,7 +3662,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3653 | struct drm_gem_object *batch_obj; | 3662 | struct drm_gem_object *batch_obj; |
| 3654 | struct drm_i915_gem_object *obj_priv; | 3663 | struct drm_i915_gem_object *obj_priv; |
| 3655 | struct drm_clip_rect *cliprects = NULL; | 3664 | struct drm_clip_rect *cliprects = NULL; |
| 3656 | struct drm_i915_gem_relocation_entry *relocs; | 3665 | struct drm_i915_gem_relocation_entry *relocs = NULL; |
| 3657 | int ret = 0, ret2, i, pinned = 0; | 3666 | int ret = 0, ret2, i, pinned = 0; |
| 3658 | uint64_t exec_offset; | 3667 | uint64_t exec_offset; |
| 3659 | uint32_t seqno, flush_domains, reloc_index; | 3668 | uint32_t seqno, flush_domains, reloc_index; |
| @@ -3679,8 +3688,10 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3679 | if (args->num_cliprects != 0) { | 3688 | if (args->num_cliprects != 0) { |
| 3680 | cliprects = kcalloc(args->num_cliprects, sizeof(*cliprects), | 3689 | cliprects = kcalloc(args->num_cliprects, sizeof(*cliprects), |
| 3681 | GFP_KERNEL); | 3690 | GFP_KERNEL); |
| 3682 | if (cliprects == NULL) | 3691 | if (cliprects == NULL) { |
| 3692 | ret = -ENOMEM; | ||
| 3683 | goto pre_mutex_err; | 3693 | goto pre_mutex_err; |
| 3694 | } | ||
| 3684 | 3695 | ||
| 3685 | ret = copy_from_user(cliprects, | 3696 | ret = copy_from_user(cliprects, |
| 3686 | (struct drm_clip_rect __user *) | 3697 | (struct drm_clip_rect __user *) |
| @@ -3722,6 +3733,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3722 | if (object_list[i] == NULL) { | 3733 | if (object_list[i] == NULL) { |
| 3723 | DRM_ERROR("Invalid object handle %d at index %d\n", | 3734 | DRM_ERROR("Invalid object handle %d at index %d\n", |
| 3724 | exec_list[i].handle, i); | 3735 | exec_list[i].handle, i); |
| 3736 | /* prevent error path from reading uninitialized data */ | ||
| 3737 | args->buffer_count = i + 1; | ||
| 3725 | ret = -EBADF; | 3738 | ret = -EBADF; |
| 3726 | goto err; | 3739 | goto err; |
| 3727 | } | 3740 | } |
| @@ -3730,6 +3743,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3730 | if (obj_priv->in_execbuffer) { | 3743 | if (obj_priv->in_execbuffer) { |
| 3731 | DRM_ERROR("Object %p appears more than once in object list\n", | 3744 | DRM_ERROR("Object %p appears more than once in object list\n", |
| 3732 | object_list[i]); | 3745 | object_list[i]); |
| 3746 | /* prevent error path from reading uninitialized data */ | ||
| 3747 | args->buffer_count = i + 1; | ||
| 3733 | ret = -EBADF; | 3748 | ret = -EBADF; |
| 3734 | goto err; | 3749 | goto err; |
| 3735 | } | 3750 | } |
| @@ -3843,16 +3858,23 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 3843 | i915_gem_flush(dev, | 3858 | i915_gem_flush(dev, |
| 3844 | dev->invalidate_domains, | 3859 | dev->invalidate_domains, |
| 3845 | dev->flush_domains); | 3860 | dev->flush_domains); |
| 3846 | if (dev->flush_domains) | 3861 | if (dev->flush_domains & I915_GEM_GPU_DOMAINS) |
| 3847 | (void)i915_add_request(dev, file_priv, | 3862 | (void)i915_add_request(dev, file_priv, |
| 3848 | dev->flush_domains); | 3863 | dev->flush_domains); |
| 3849 | } | 3864 | } |
| 3850 | 3865 | ||
| 3851 | for (i = 0; i < args->buffer_count; i++) { | 3866 | for (i = 0; i < args->buffer_count; i++) { |
| 3852 | struct drm_gem_object *obj = object_list[i]; | 3867 | struct drm_gem_object *obj = object_list[i]; |
| 3868 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 3853 | uint32_t old_write_domain = obj->write_domain; | 3869 | uint32_t old_write_domain = obj->write_domain; |
| 3854 | 3870 | ||
| 3855 | obj->write_domain = obj->pending_write_domain; | 3871 | obj->write_domain = obj->pending_write_domain; |
| 3872 | if (obj->write_domain) | ||
| 3873 | list_move_tail(&obj_priv->gpu_write_list, | ||
| 3874 | &dev_priv->mm.gpu_write_list); | ||
| 3875 | else | ||
| 3876 | list_del_init(&obj_priv->gpu_write_list); | ||
| 3877 | |||
| 3856 | trace_i915_gem_object_change_domain(obj, | 3878 | trace_i915_gem_object_change_domain(obj, |
| 3857 | obj->read_domains, | 3879 | obj->read_domains, |
| 3858 | old_write_domain); | 3880 | old_write_domain); |
| @@ -3926,6 +3948,7 @@ err: | |||
| 3926 | 3948 | ||
| 3927 | mutex_unlock(&dev->struct_mutex); | 3949 | mutex_unlock(&dev->struct_mutex); |
| 3928 | 3950 | ||
| 3951 | pre_mutex_err: | ||
| 3929 | /* Copy the updated relocations out regardless of current error | 3952 | /* Copy the updated relocations out regardless of current error |
| 3930 | * state. Failure to update the relocs would mean that the next | 3953 | * state. Failure to update the relocs would mean that the next |
| 3931 | * time userland calls execbuf, it would do so with presumed offset | 3954 | * time userland calls execbuf, it would do so with presumed offset |
| @@ -3940,7 +3963,6 @@ err: | |||
| 3940 | ret = ret2; | 3963 | ret = ret2; |
| 3941 | } | 3964 | } |
| 3942 | 3965 | ||
| 3943 | pre_mutex_err: | ||
| 3944 | drm_free_large(object_list); | 3966 | drm_free_large(object_list); |
| 3945 | kfree(cliprects); | 3967 | kfree(cliprects); |
| 3946 | 3968 | ||
| @@ -4363,6 +4385,7 @@ int i915_gem_init_object(struct drm_gem_object *obj) | |||
| 4363 | obj_priv->obj = obj; | 4385 | obj_priv->obj = obj; |
| 4364 | obj_priv->fence_reg = I915_FENCE_REG_NONE; | 4386 | obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 4365 | INIT_LIST_HEAD(&obj_priv->list); | 4387 | INIT_LIST_HEAD(&obj_priv->list); |
| 4388 | INIT_LIST_HEAD(&obj_priv->gpu_write_list); | ||
| 4366 | INIT_LIST_HEAD(&obj_priv->fence_list); | 4389 | INIT_LIST_HEAD(&obj_priv->fence_list); |
| 4367 | obj_priv->madv = I915_MADV_WILLNEED; | 4390 | obj_priv->madv = I915_MADV_WILLNEED; |
| 4368 | 4391 | ||
| @@ -4814,6 +4837,7 @@ i915_gem_load(struct drm_device *dev) | |||
| 4814 | spin_lock_init(&dev_priv->mm.active_list_lock); | 4837 | spin_lock_init(&dev_priv->mm.active_list_lock); |
| 4815 | INIT_LIST_HEAD(&dev_priv->mm.active_list); | 4838 | INIT_LIST_HEAD(&dev_priv->mm.active_list); |
| 4816 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); | 4839 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); |
| 4840 | INIT_LIST_HEAD(&dev_priv->mm.gpu_write_list); | ||
| 4817 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); | 4841 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); |
| 4818 | INIT_LIST_HEAD(&dev_priv->mm.request_list); | 4842 | INIT_LIST_HEAD(&dev_priv->mm.request_list); |
| 4819 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); | 4843 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 89a071a3e6fb..a17d6bdfe63e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -309,6 +309,22 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev) | |||
| 309 | if (de_iir & DE_GSE) | 309 | if (de_iir & DE_GSE) |
| 310 | ironlake_opregion_gse_intr(dev); | 310 | ironlake_opregion_gse_intr(dev); |
| 311 | 311 | ||
| 312 | if (de_iir & DE_PLANEA_FLIP_DONE) { | ||
| 313 | intel_prepare_page_flip(dev, 0); | ||
| 314 | intel_finish_page_flip(dev, 0); | ||
| 315 | } | ||
| 316 | |||
| 317 | if (de_iir & DE_PLANEB_FLIP_DONE) { | ||
| 318 | intel_prepare_page_flip(dev, 1); | ||
| 319 | intel_finish_page_flip(dev, 1); | ||
| 320 | } | ||
| 321 | |||
| 322 | if (de_iir & DE_PIPEA_VBLANK) | ||
| 323 | drm_handle_vblank(dev, 0); | ||
| 324 | |||
| 325 | if (de_iir & DE_PIPEB_VBLANK) | ||
| 326 | drm_handle_vblank(dev, 1); | ||
| 327 | |||
| 312 | /* check event from PCH */ | 328 | /* check event from PCH */ |
| 313 | if ((de_iir & DE_PCH_EVENT) && | 329 | if ((de_iir & DE_PCH_EVENT) && |
| 314 | (pch_iir & SDE_HOTPLUG_MASK)) { | 330 | (pch_iir & SDE_HOTPLUG_MASK)) { |
| @@ -844,11 +860,11 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
| 844 | if (!(pipeconf & PIPEACONF_ENABLE)) | 860 | if (!(pipeconf & PIPEACONF_ENABLE)) |
| 845 | return -EINVAL; | 861 | return -EINVAL; |
| 846 | 862 | ||
| 847 | if (IS_IRONLAKE(dev)) | ||
| 848 | return 0; | ||
| 849 | |||
| 850 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 863 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 851 | if (IS_I965G(dev)) | 864 | if (IS_IRONLAKE(dev)) |
| 865 | ironlake_enable_display_irq(dev_priv, (pipe == 0) ? | ||
| 866 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); | ||
| 867 | else if (IS_I965G(dev)) | ||
| 852 | i915_enable_pipestat(dev_priv, pipe, | 868 | i915_enable_pipestat(dev_priv, pipe, |
| 853 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | 869 | PIPE_START_VBLANK_INTERRUPT_ENABLE); |
| 854 | else | 870 | else |
| @@ -866,13 +882,14 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) | |||
| 866 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 882 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 867 | unsigned long irqflags; | 883 | unsigned long irqflags; |
| 868 | 884 | ||
| 869 | if (IS_IRONLAKE(dev)) | ||
| 870 | return; | ||
| 871 | |||
| 872 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | 885 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); |
| 873 | i915_disable_pipestat(dev_priv, pipe, | 886 | if (IS_IRONLAKE(dev)) |
| 874 | PIPE_VBLANK_INTERRUPT_ENABLE | | 887 | ironlake_disable_display_irq(dev_priv, (pipe == 0) ? |
| 875 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | 888 | DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); |
| 889 | else | ||
| 890 | i915_disable_pipestat(dev_priv, pipe, | ||
| 891 | PIPE_VBLANK_INTERRUPT_ENABLE | | ||
| 892 | PIPE_START_VBLANK_INTERRUPT_ENABLE); | ||
| 876 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 893 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 877 | } | 894 | } |
| 878 | 895 | ||
| @@ -1015,13 +1032,14 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
| 1015 | { | 1032 | { |
| 1016 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1033 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
| 1017 | /* enable kind of interrupts always enabled */ | 1034 | /* enable kind of interrupts always enabled */ |
| 1018 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT; | 1035 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
| 1036 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; | ||
| 1019 | u32 render_mask = GT_USER_INTERRUPT; | 1037 | u32 render_mask = GT_USER_INTERRUPT; |
| 1020 | u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | | 1038 | u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | |
| 1021 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; | 1039 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; |
| 1022 | 1040 | ||
| 1023 | dev_priv->irq_mask_reg = ~display_mask; | 1041 | dev_priv->irq_mask_reg = ~display_mask; |
| 1024 | dev_priv->de_irq_enable_reg = display_mask; | 1042 | dev_priv->de_irq_enable_reg = display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK; |
| 1025 | 1043 | ||
| 1026 | /* should always can generate irq */ | 1044 | /* should always can generate irq */ |
| 1027 | I915_WRITE(DEIIR, I915_READ(DEIIR)); | 1045 | I915_WRITE(DEIIR, I915_READ(DEIIR)); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 847006c5218e..ab1bd2d3d3b6 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -338,6 +338,7 @@ | |||
| 338 | #define FBC_CTL_PERIODIC (1<<30) | 338 | #define FBC_CTL_PERIODIC (1<<30) |
| 339 | #define FBC_CTL_INTERVAL_SHIFT (16) | 339 | #define FBC_CTL_INTERVAL_SHIFT (16) |
| 340 | #define FBC_CTL_UNCOMPRESSIBLE (1<<14) | 340 | #define FBC_CTL_UNCOMPRESSIBLE (1<<14) |
| 341 | #define FBC_C3_IDLE (1<<13) | ||
| 341 | #define FBC_CTL_STRIDE_SHIFT (5) | 342 | #define FBC_CTL_STRIDE_SHIFT (5) |
| 342 | #define FBC_CTL_FENCENO (1<<0) | 343 | #define FBC_CTL_FENCENO (1<<0) |
| 343 | #define FBC_COMMAND 0x0320c | 344 | #define FBC_COMMAND 0x0320c |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index ddefc871edfe..79dd4026586f 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -157,6 +157,9 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector) | |||
| 157 | adpa = I915_READ(PCH_ADPA); | 157 | adpa = I915_READ(PCH_ADPA); |
| 158 | 158 | ||
| 159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; | 159 | adpa &= ~ADPA_CRT_HOTPLUG_MASK; |
| 160 | /* disable HPD first */ | ||
| 161 | I915_WRITE(PCH_ADPA, adpa); | ||
| 162 | (void)I915_READ(PCH_ADPA); | ||
| 160 | 163 | ||
| 161 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | | 164 | adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | |
| 162 | ADPA_CRT_HOTPLUG_WARMUP_10MS | | 165 | ADPA_CRT_HOTPLUG_WARMUP_10MS | |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 45da78ef4a92..b27202d23ebc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -240,33 +240,86 @@ struct intel_limit { | |||
| 240 | #define IRONLAKE_DOT_MAX 350000 | 240 | #define IRONLAKE_DOT_MAX 350000 |
| 241 | #define IRONLAKE_VCO_MIN 1760000 | 241 | #define IRONLAKE_VCO_MIN 1760000 |
| 242 | #define IRONLAKE_VCO_MAX 3510000 | 242 | #define IRONLAKE_VCO_MAX 3510000 |
| 243 | #define IRONLAKE_N_MIN 1 | ||
| 244 | #define IRONLAKE_N_MAX 6 | ||
| 245 | #define IRONLAKE_M_MIN 79 | ||
| 246 | #define IRONLAKE_M_MAX 127 | ||
| 247 | #define IRONLAKE_M1_MIN 12 | 243 | #define IRONLAKE_M1_MIN 12 |
| 248 | #define IRONLAKE_M1_MAX 22 | 244 | #define IRONLAKE_M1_MAX 22 |
| 249 | #define IRONLAKE_M2_MIN 5 | 245 | #define IRONLAKE_M2_MIN 5 |
| 250 | #define IRONLAKE_M2_MAX 9 | 246 | #define IRONLAKE_M2_MAX 9 |
| 251 | #define IRONLAKE_P_SDVO_DAC_MIN 5 | ||
| 252 | #define IRONLAKE_P_SDVO_DAC_MAX 80 | ||
| 253 | #define IRONLAKE_P_LVDS_MIN 28 | ||
| 254 | #define IRONLAKE_P_LVDS_MAX 112 | ||
| 255 | #define IRONLAKE_P1_MIN 1 | ||
| 256 | #define IRONLAKE_P1_MAX 8 | ||
| 257 | #define IRONLAKE_P2_SDVO_DAC_SLOW 10 | ||
| 258 | #define IRONLAKE_P2_SDVO_DAC_FAST 5 | ||
| 259 | #define IRONLAKE_P2_LVDS_SLOW 14 /* single channel */ | ||
| 260 | #define IRONLAKE_P2_LVDS_FAST 7 /* double channel */ | ||
| 261 | #define IRONLAKE_P2_DOT_LIMIT 225000 /* 225Mhz */ | 247 | #define IRONLAKE_P2_DOT_LIMIT 225000 /* 225Mhz */ |
| 262 | 248 | ||
| 263 | #define IRONLAKE_P_DISPLAY_PORT_MIN 10 | 249 | /* We have parameter ranges for different type of outputs. */ |
| 264 | #define IRONLAKE_P_DISPLAY_PORT_MAX 20 | 250 | |
| 265 | #define IRONLAKE_P2_DISPLAY_PORT_FAST 10 | 251 | /* DAC & HDMI Refclk 120Mhz */ |
| 266 | #define IRONLAKE_P2_DISPLAY_PORT_SLOW 10 | 252 | #define IRONLAKE_DAC_N_MIN 1 |
| 267 | #define IRONLAKE_P2_DISPLAY_PORT_LIMIT 0 | 253 | #define IRONLAKE_DAC_N_MAX 5 |
| 268 | #define IRONLAKE_P1_DISPLAY_PORT_MIN 1 | 254 | #define IRONLAKE_DAC_M_MIN 79 |
| 269 | #define IRONLAKE_P1_DISPLAY_PORT_MAX 2 | 255 | #define IRONLAKE_DAC_M_MAX 127 |
| 256 | #define IRONLAKE_DAC_P_MIN 5 | ||
| 257 | #define IRONLAKE_DAC_P_MAX 80 | ||
| 258 | #define IRONLAKE_DAC_P1_MIN 1 | ||
| 259 | #define IRONLAKE_DAC_P1_MAX 8 | ||
| 260 | #define IRONLAKE_DAC_P2_SLOW 10 | ||
| 261 | #define IRONLAKE_DAC_P2_FAST 5 | ||
| 262 | |||
| 263 | /* LVDS single-channel 120Mhz refclk */ | ||
| 264 | #define IRONLAKE_LVDS_S_N_MIN 1 | ||
| 265 | #define IRONLAKE_LVDS_S_N_MAX 3 | ||
| 266 | #define IRONLAKE_LVDS_S_M_MIN 79 | ||
| 267 | #define IRONLAKE_LVDS_S_M_MAX 118 | ||
| 268 | #define IRONLAKE_LVDS_S_P_MIN 28 | ||
| 269 | #define IRONLAKE_LVDS_S_P_MAX 112 | ||
| 270 | #define IRONLAKE_LVDS_S_P1_MIN 2 | ||
| 271 | #define IRONLAKE_LVDS_S_P1_MAX 8 | ||
| 272 | #define IRONLAKE_LVDS_S_P2_SLOW 14 | ||
| 273 | #define IRONLAKE_LVDS_S_P2_FAST 14 | ||
| 274 | |||
| 275 | /* LVDS dual-channel 120Mhz refclk */ | ||
| 276 | #define IRONLAKE_LVDS_D_N_MIN 1 | ||
| 277 | #define IRONLAKE_LVDS_D_N_MAX 3 | ||
| 278 | #define IRONLAKE_LVDS_D_M_MIN 79 | ||
| 279 | #define IRONLAKE_LVDS_D_M_MAX 127 | ||
| 280 | #define IRONLAKE_LVDS_D_P_MIN 14 | ||
| 281 | #define IRONLAKE_LVDS_D_P_MAX 56 | ||
| 282 | #define IRONLAKE_LVDS_D_P1_MIN 2 | ||
| 283 | #define IRONLAKE_LVDS_D_P1_MAX 8 | ||
| 284 | #define IRONLAKE_LVDS_D_P2_SLOW 7 | ||
| 285 | #define IRONLAKE_LVDS_D_P2_FAST 7 | ||
| 286 | |||
| 287 | /* LVDS single-channel 100Mhz refclk */ | ||
| 288 | #define IRONLAKE_LVDS_S_SSC_N_MIN 1 | ||
| 289 | #define IRONLAKE_LVDS_S_SSC_N_MAX 2 | ||
| 290 | #define IRONLAKE_LVDS_S_SSC_M_MIN 79 | ||
| 291 | #define IRONLAKE_LVDS_S_SSC_M_MAX 126 | ||
| 292 | #define IRONLAKE_LVDS_S_SSC_P_MIN 28 | ||
| 293 | #define IRONLAKE_LVDS_S_SSC_P_MAX 112 | ||
| 294 | #define IRONLAKE_LVDS_S_SSC_P1_MIN 2 | ||
| 295 | #define IRONLAKE_LVDS_S_SSC_P1_MAX 8 | ||
| 296 | #define IRONLAKE_LVDS_S_SSC_P2_SLOW 14 | ||
| 297 | #define IRONLAKE_LVDS_S_SSC_P2_FAST 14 | ||
| 298 | |||
| 299 | /* LVDS dual-channel 100Mhz refclk */ | ||
| 300 | #define IRONLAKE_LVDS_D_SSC_N_MIN 1 | ||
| 301 | #define IRONLAKE_LVDS_D_SSC_N_MAX 3 | ||
| 302 | #define IRONLAKE_LVDS_D_SSC_M_MIN 79 | ||
| 303 | #define IRONLAKE_LVDS_D_SSC_M_MAX 126 | ||
| 304 | #define IRONLAKE_LVDS_D_SSC_P_MIN 14 | ||
| 305 | #define IRONLAKE_LVDS_D_SSC_P_MAX 42 | ||
| 306 | #define IRONLAKE_LVDS_D_SSC_P1_MIN 2 | ||
| 307 | #define IRONLAKE_LVDS_D_SSC_P1_MAX 6 | ||
| 308 | #define IRONLAKE_LVDS_D_SSC_P2_SLOW 7 | ||
| 309 | #define IRONLAKE_LVDS_D_SSC_P2_FAST 7 | ||
| 310 | |||
| 311 | /* DisplayPort */ | ||
| 312 | #define IRONLAKE_DP_N_MIN 1 | ||
| 313 | #define IRONLAKE_DP_N_MAX 2 | ||
| 314 | #define IRONLAKE_DP_M_MIN 81 | ||
| 315 | #define IRONLAKE_DP_M_MAX 90 | ||
| 316 | #define IRONLAKE_DP_P_MIN 10 | ||
| 317 | #define IRONLAKE_DP_P_MAX 20 | ||
| 318 | #define IRONLAKE_DP_P2_FAST 10 | ||
| 319 | #define IRONLAKE_DP_P2_SLOW 10 | ||
| 320 | #define IRONLAKE_DP_P2_LIMIT 0 | ||
| 321 | #define IRONLAKE_DP_P1_MIN 1 | ||
| 322 | #define IRONLAKE_DP_P1_MAX 2 | ||
| 270 | 323 | ||
| 271 | static bool | 324 | static bool |
| 272 | intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | 325 | intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, |
| @@ -474,33 +527,78 @@ static const intel_limit_t intel_limits_pineview_lvds = { | |||
| 474 | .find_pll = intel_find_best_PLL, | 527 | .find_pll = intel_find_best_PLL, |
| 475 | }; | 528 | }; |
| 476 | 529 | ||
| 477 | static const intel_limit_t intel_limits_ironlake_sdvo = { | 530 | static const intel_limit_t intel_limits_ironlake_dac = { |
| 478 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, | 531 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, |
| 479 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, | 532 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, |
| 480 | .n = { .min = IRONLAKE_N_MIN, .max = IRONLAKE_N_MAX }, | 533 | .n = { .min = IRONLAKE_DAC_N_MIN, .max = IRONLAKE_DAC_N_MAX }, |
| 481 | .m = { .min = IRONLAKE_M_MIN, .max = IRONLAKE_M_MAX }, | 534 | .m = { .min = IRONLAKE_DAC_M_MIN, .max = IRONLAKE_DAC_M_MAX }, |
| 482 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, | 535 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, |
| 483 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, | 536 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, |
| 484 | .p = { .min = IRONLAKE_P_SDVO_DAC_MIN, .max = IRONLAKE_P_SDVO_DAC_MAX }, | 537 | .p = { .min = IRONLAKE_DAC_P_MIN, .max = IRONLAKE_DAC_P_MAX }, |
| 485 | .p1 = { .min = IRONLAKE_P1_MIN, .max = IRONLAKE_P1_MAX }, | 538 | .p1 = { .min = IRONLAKE_DAC_P1_MIN, .max = IRONLAKE_DAC_P1_MAX }, |
| 486 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, | 539 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, |
| 487 | .p2_slow = IRONLAKE_P2_SDVO_DAC_SLOW, | 540 | .p2_slow = IRONLAKE_DAC_P2_SLOW, |
| 488 | .p2_fast = IRONLAKE_P2_SDVO_DAC_FAST }, | 541 | .p2_fast = IRONLAKE_DAC_P2_FAST }, |
| 489 | .find_pll = intel_g4x_find_best_PLL, | 542 | .find_pll = intel_g4x_find_best_PLL, |
| 490 | }; | 543 | }; |
| 491 | 544 | ||
| 492 | static const intel_limit_t intel_limits_ironlake_lvds = { | 545 | static const intel_limit_t intel_limits_ironlake_single_lvds = { |
| 493 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, | 546 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, |
| 494 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, | 547 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, |
| 495 | .n = { .min = IRONLAKE_N_MIN, .max = IRONLAKE_N_MAX }, | 548 | .n = { .min = IRONLAKE_LVDS_S_N_MIN, .max = IRONLAKE_LVDS_S_N_MAX }, |
| 496 | .m = { .min = IRONLAKE_M_MIN, .max = IRONLAKE_M_MAX }, | 549 | .m = { .min = IRONLAKE_LVDS_S_M_MIN, .max = IRONLAKE_LVDS_S_M_MAX }, |
| 497 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, | 550 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, |
| 498 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, | 551 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, |
| 499 | .p = { .min = IRONLAKE_P_LVDS_MIN, .max = IRONLAKE_P_LVDS_MAX }, | 552 | .p = { .min = IRONLAKE_LVDS_S_P_MIN, .max = IRONLAKE_LVDS_S_P_MAX }, |
| 500 | .p1 = { .min = IRONLAKE_P1_MIN, .max = IRONLAKE_P1_MAX }, | 553 | .p1 = { .min = IRONLAKE_LVDS_S_P1_MIN, .max = IRONLAKE_LVDS_S_P1_MAX }, |
| 501 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, | 554 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, |
| 502 | .p2_slow = IRONLAKE_P2_LVDS_SLOW, | 555 | .p2_slow = IRONLAKE_LVDS_S_P2_SLOW, |
| 503 | .p2_fast = IRONLAKE_P2_LVDS_FAST }, | 556 | .p2_fast = IRONLAKE_LVDS_S_P2_FAST }, |
| 557 | .find_pll = intel_g4x_find_best_PLL, | ||
| 558 | }; | ||
| 559 | |||
| 560 | static const intel_limit_t intel_limits_ironlake_dual_lvds = { | ||
| 561 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, | ||
| 562 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, | ||
| 563 | .n = { .min = IRONLAKE_LVDS_D_N_MIN, .max = IRONLAKE_LVDS_D_N_MAX }, | ||
| 564 | .m = { .min = IRONLAKE_LVDS_D_M_MIN, .max = IRONLAKE_LVDS_D_M_MAX }, | ||
| 565 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, | ||
| 566 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, | ||
| 567 | .p = { .min = IRONLAKE_LVDS_D_P_MIN, .max = IRONLAKE_LVDS_D_P_MAX }, | ||
| 568 | .p1 = { .min = IRONLAKE_LVDS_D_P1_MIN, .max = IRONLAKE_LVDS_D_P1_MAX }, | ||
| 569 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, | ||
| 570 | .p2_slow = IRONLAKE_LVDS_D_P2_SLOW, | ||
| 571 | .p2_fast = IRONLAKE_LVDS_D_P2_FAST }, | ||
| 572 | .find_pll = intel_g4x_find_best_PLL, | ||
| 573 | }; | ||
| 574 | |||
| 575 | static const intel_limit_t intel_limits_ironlake_single_lvds_100m = { | ||
| 576 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, | ||
| 577 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, | ||
| 578 | .n = { .min = IRONLAKE_LVDS_S_SSC_N_MIN, .max = IRONLAKE_LVDS_S_SSC_N_MAX }, | ||
| 579 | .m = { .min = IRONLAKE_LVDS_S_SSC_M_MIN, .max = IRONLAKE_LVDS_S_SSC_M_MAX }, | ||
| 580 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, | ||
| 581 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, | ||
| 582 | .p = { .min = IRONLAKE_LVDS_S_SSC_P_MIN, .max = IRONLAKE_LVDS_S_SSC_P_MAX }, | ||
| 583 | .p1 = { .min = IRONLAKE_LVDS_S_SSC_P1_MIN,.max = IRONLAKE_LVDS_S_SSC_P1_MAX }, | ||
| 584 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, | ||
| 585 | .p2_slow = IRONLAKE_LVDS_S_SSC_P2_SLOW, | ||
| 586 | .p2_fast = IRONLAKE_LVDS_S_SSC_P2_FAST }, | ||
| 587 | .find_pll = intel_g4x_find_best_PLL, | ||
| 588 | }; | ||
| 589 | |||
| 590 | static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = { | ||
| 591 | .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, | ||
| 592 | .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, | ||
| 593 | .n = { .min = IRONLAKE_LVDS_D_SSC_N_MIN, .max = IRONLAKE_LVDS_D_SSC_N_MAX }, | ||
| 594 | .m = { .min = IRONLAKE_LVDS_D_SSC_M_MIN, .max = IRONLAKE_LVDS_D_SSC_M_MAX }, | ||
| 595 | .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, | ||
| 596 | .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, | ||
| 597 | .p = { .min = IRONLAKE_LVDS_D_SSC_P_MIN, .max = IRONLAKE_LVDS_D_SSC_P_MAX }, | ||
| 598 | .p1 = { .min = IRONLAKE_LVDS_D_SSC_P1_MIN,.max = IRONLAKE_LVDS_D_SSC_P1_MAX }, | ||
| 599 | .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, | ||
| 600 | .p2_slow = IRONLAKE_LVDS_D_SSC_P2_SLOW, | ||
| 601 | .p2_fast = IRONLAKE_LVDS_D_SSC_P2_FAST }, | ||
| 504 | .find_pll = intel_g4x_find_best_PLL, | 602 | .find_pll = intel_g4x_find_best_PLL, |
| 505 | }; | 603 | }; |
| 506 | 604 | ||
| @@ -509,34 +607,53 @@ static const intel_limit_t intel_limits_ironlake_display_port = { | |||
| 509 | .max = IRONLAKE_DOT_MAX }, | 607 | .max = IRONLAKE_DOT_MAX }, |
| 510 | .vco = { .min = IRONLAKE_VCO_MIN, | 608 | .vco = { .min = IRONLAKE_VCO_MIN, |
| 511 | .max = IRONLAKE_VCO_MAX}, | 609 | .max = IRONLAKE_VCO_MAX}, |
| 512 | .n = { .min = IRONLAKE_N_MIN, | 610 | .n = { .min = IRONLAKE_DP_N_MIN, |
| 513 | .max = IRONLAKE_N_MAX }, | 611 | .max = IRONLAKE_DP_N_MAX }, |
| 514 | .m = { .min = IRONLAKE_M_MIN, | 612 | .m = { .min = IRONLAKE_DP_M_MIN, |
| 515 | .max = IRONLAKE_M_MAX }, | 613 | .max = IRONLAKE_DP_M_MAX }, |
| 516 | .m1 = { .min = IRONLAKE_M1_MIN, | 614 | .m1 = { .min = IRONLAKE_M1_MIN, |
| 517 | .max = IRONLAKE_M1_MAX }, | 615 | .max = IRONLAKE_M1_MAX }, |
| 518 | .m2 = { .min = IRONLAKE_M2_MIN, | 616 | .m2 = { .min = IRONLAKE_M2_MIN, |
| 519 | .max = IRONLAKE_M2_MAX }, | 617 | .max = IRONLAKE_M2_MAX }, |
| 520 | .p = { .min = IRONLAKE_P_DISPLAY_PORT_MIN, | 618 | .p = { .min = IRONLAKE_DP_P_MIN, |
| 521 | .max = IRONLAKE_P_DISPLAY_PORT_MAX }, | 619 | .max = IRONLAKE_DP_P_MAX }, |
| 522 | .p1 = { .min = IRONLAKE_P1_DISPLAY_PORT_MIN, | 620 | .p1 = { .min = IRONLAKE_DP_P1_MIN, |
| 523 | .max = IRONLAKE_P1_DISPLAY_PORT_MAX}, | 621 | .max = IRONLAKE_DP_P1_MAX}, |
| 524 | .p2 = { .dot_limit = IRONLAKE_P2_DISPLAY_PORT_LIMIT, | 622 | .p2 = { .dot_limit = IRONLAKE_DP_P2_LIMIT, |
| 525 | .p2_slow = IRONLAKE_P2_DISPLAY_PORT_SLOW, | 623 | .p2_slow = IRONLAKE_DP_P2_SLOW, |
| 526 | .p2_fast = IRONLAKE_P2_DISPLAY_PORT_FAST }, | 624 | .p2_fast = IRONLAKE_DP_P2_FAST }, |
| 527 | .find_pll = intel_find_pll_ironlake_dp, | 625 | .find_pll = intel_find_pll_ironlake_dp, |
| 528 | }; | 626 | }; |
| 529 | 627 | ||
| 530 | static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc) | 628 | static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc) |
| 531 | { | 629 | { |
| 630 | struct drm_device *dev = crtc->dev; | ||
| 631 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 532 | const intel_limit_t *limit; | 632 | const intel_limit_t *limit; |
| 533 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) | 633 | int refclk = 120; |
| 534 | limit = &intel_limits_ironlake_lvds; | 634 | |
| 535 | else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || | 635 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
| 636 | if (dev_priv->lvds_use_ssc && dev_priv->lvds_ssc_freq == 100) | ||
| 637 | refclk = 100; | ||
| 638 | |||
| 639 | if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == | ||
| 640 | LVDS_CLKB_POWER_UP) { | ||
| 641 | /* LVDS dual channel */ | ||
| 642 | if (refclk == 100) | ||
| 643 | limit = &intel_limits_ironlake_dual_lvds_100m; | ||
| 644 | else | ||
| 645 | limit = &intel_limits_ironlake_dual_lvds; | ||
| 646 | } else { | ||
| 647 | if (refclk == 100) | ||
| 648 | limit = &intel_limits_ironlake_single_lvds_100m; | ||
| 649 | else | ||
| 650 | limit = &intel_limits_ironlake_single_lvds; | ||
| 651 | } | ||
| 652 | } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) || | ||
| 536 | HAS_eDP) | 653 | HAS_eDP) |
| 537 | limit = &intel_limits_ironlake_display_port; | 654 | limit = &intel_limits_ironlake_display_port; |
| 538 | else | 655 | else |
| 539 | limit = &intel_limits_ironlake_sdvo; | 656 | limit = &intel_limits_ironlake_dac; |
| 540 | 657 | ||
| 541 | return limit; | 658 | return limit; |
| 542 | } | 659 | } |
| @@ -914,6 +1031,8 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | |||
| 914 | 1031 | ||
| 915 | /* enable it... */ | 1032 | /* enable it... */ |
| 916 | fbc_ctl = FBC_CTL_EN | FBC_CTL_PERIODIC; | 1033 | fbc_ctl = FBC_CTL_EN | FBC_CTL_PERIODIC; |
| 1034 | if (IS_I945GM(dev)) | ||
| 1035 | fbc_ctl |= FBC_C3_IDLE; /* 945 needs special SR handling */ | ||
| 917 | fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; | 1036 | fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; |
| 918 | fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT; | 1037 | fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT; |
| 919 | if (obj_priv->tiling_mode != I915_TILING_NONE) | 1038 | if (obj_priv->tiling_mode != I915_TILING_NONE) |
| @@ -1638,6 +1757,7 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1638 | case DRM_MODE_DPMS_OFF: | 1757 | case DRM_MODE_DPMS_OFF: |
| 1639 | DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); | 1758 | DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); |
| 1640 | 1759 | ||
| 1760 | drm_vblank_off(dev, pipe); | ||
| 1641 | /* Disable display plane */ | 1761 | /* Disable display plane */ |
| 1642 | temp = I915_READ(dspcntr_reg); | 1762 | temp = I915_READ(dspcntr_reg); |
| 1643 | if ((temp & DISPLAY_PLANE_ENABLE) != 0) { | 1763 | if ((temp & DISPLAY_PLANE_ENABLE) != 0) { |
| @@ -2519,6 +2639,10 @@ static void g4x_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2519 | sr_entries = roundup(sr_entries / cacheline_size, 1); | 2639 | sr_entries = roundup(sr_entries / cacheline_size, 1); |
| 2520 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | 2640 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); |
| 2521 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 2641 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); |
| 2642 | } else { | ||
| 2643 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2644 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2645 | & ~FW_BLC_SELF_EN); | ||
| 2522 | } | 2646 | } |
| 2523 | 2647 | ||
| 2524 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", | 2648 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", |
| @@ -2562,6 +2686,10 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2562 | srwm = 1; | 2686 | srwm = 1; |
| 2563 | srwm &= 0x3f; | 2687 | srwm &= 0x3f; |
| 2564 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 2688 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); |
| 2689 | } else { | ||
| 2690 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2691 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2692 | & ~FW_BLC_SELF_EN); | ||
| 2565 | } | 2693 | } |
| 2566 | 2694 | ||
| 2567 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", | 2695 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", |
| @@ -2630,6 +2758,10 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | |||
| 2630 | if (srwm < 0) | 2758 | if (srwm < 0) |
| 2631 | srwm = 1; | 2759 | srwm = 1; |
| 2632 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); | 2760 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); |
| 2761 | } else { | ||
| 2762 | /* Turn off self refresh if both pipes are enabled */ | ||
| 2763 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
| 2764 | & ~FW_BLC_SELF_EN); | ||
| 2633 | } | 2765 | } |
| 2634 | 2766 | ||
| 2635 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", | 2767 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", |
| @@ -3949,7 +4081,8 @@ static void intel_crtc_destroy(struct drm_crtc *crtc) | |||
| 3949 | struct intel_unpin_work { | 4081 | struct intel_unpin_work { |
| 3950 | struct work_struct work; | 4082 | struct work_struct work; |
| 3951 | struct drm_device *dev; | 4083 | struct drm_device *dev; |
| 3952 | struct drm_gem_object *obj; | 4084 | struct drm_gem_object *old_fb_obj; |
| 4085 | struct drm_gem_object *pending_flip_obj; | ||
| 3953 | struct drm_pending_vblank_event *event; | 4086 | struct drm_pending_vblank_event *event; |
| 3954 | int pending; | 4087 | int pending; |
| 3955 | }; | 4088 | }; |
| @@ -3960,8 +4093,9 @@ static void intel_unpin_work_fn(struct work_struct *__work) | |||
| 3960 | container_of(__work, struct intel_unpin_work, work); | 4093 | container_of(__work, struct intel_unpin_work, work); |
| 3961 | 4094 | ||
| 3962 | mutex_lock(&work->dev->struct_mutex); | 4095 | mutex_lock(&work->dev->struct_mutex); |
| 3963 | i915_gem_object_unpin(work->obj); | 4096 | i915_gem_object_unpin(work->old_fb_obj); |
| 3964 | drm_gem_object_unreference(work->obj); | 4097 | drm_gem_object_unreference(work->pending_flip_obj); |
| 4098 | drm_gem_object_unreference(work->old_fb_obj); | ||
| 3965 | mutex_unlock(&work->dev->struct_mutex); | 4099 | mutex_unlock(&work->dev->struct_mutex); |
| 3966 | kfree(work); | 4100 | kfree(work); |
| 3967 | } | 4101 | } |
| @@ -3984,6 +4118,12 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe) | |||
| 3984 | spin_lock_irqsave(&dev->event_lock, flags); | 4118 | spin_lock_irqsave(&dev->event_lock, flags); |
| 3985 | work = intel_crtc->unpin_work; | 4119 | work = intel_crtc->unpin_work; |
| 3986 | if (work == NULL || !work->pending) { | 4120 | if (work == NULL || !work->pending) { |
| 4121 | if (work && !work->pending) { | ||
| 4122 | obj_priv = work->pending_flip_obj->driver_private; | ||
| 4123 | DRM_DEBUG_DRIVER("flip finish: %p (%d) not pending?\n", | ||
| 4124 | obj_priv, | ||
| 4125 | atomic_read(&obj_priv->pending_flip)); | ||
| 4126 | } | ||
| 3987 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4127 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 3988 | return; | 4128 | return; |
| 3989 | } | 4129 | } |
| @@ -4004,8 +4144,11 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe) | |||
| 4004 | 4144 | ||
| 4005 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4145 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4006 | 4146 | ||
| 4007 | obj_priv = work->obj->driver_private; | 4147 | obj_priv = work->pending_flip_obj->driver_private; |
| 4008 | if (atomic_dec_and_test(&obj_priv->pending_flip)) | 4148 | |
| 4149 | /* Initial scanout buffer will have a 0 pending flip count */ | ||
| 4150 | if ((atomic_read(&obj_priv->pending_flip) == 0) || | ||
| 4151 | atomic_dec_and_test(&obj_priv->pending_flip)) | ||
| 4009 | DRM_WAKEUP(&dev_priv->pending_flip_queue); | 4152 | DRM_WAKEUP(&dev_priv->pending_flip_queue); |
| 4010 | schedule_work(&work->work); | 4153 | schedule_work(&work->work); |
| 4011 | } | 4154 | } |
| @@ -4018,8 +4161,11 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) | |||
| 4018 | unsigned long flags; | 4161 | unsigned long flags; |
| 4019 | 4162 | ||
| 4020 | spin_lock_irqsave(&dev->event_lock, flags); | 4163 | spin_lock_irqsave(&dev->event_lock, flags); |
| 4021 | if (intel_crtc->unpin_work) | 4164 | if (intel_crtc->unpin_work) { |
| 4022 | intel_crtc->unpin_work->pending = 1; | 4165 | intel_crtc->unpin_work->pending = 1; |
| 4166 | } else { | ||
| 4167 | DRM_DEBUG_DRIVER("preparing flip with no unpin work?\n"); | ||
| 4168 | } | ||
| 4023 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4169 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4024 | } | 4170 | } |
| 4025 | 4171 | ||
| @@ -4035,7 +4181,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4035 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 4181 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
| 4036 | struct intel_unpin_work *work; | 4182 | struct intel_unpin_work *work; |
| 4037 | unsigned long flags; | 4183 | unsigned long flags; |
| 4038 | int ret; | 4184 | int pipesrc_reg = (intel_crtc->pipe == 0) ? PIPEASRC : PIPEBSRC; |
| 4185 | int ret, pipesrc; | ||
| 4039 | RING_LOCALS; | 4186 | RING_LOCALS; |
| 4040 | 4187 | ||
| 4041 | work = kzalloc(sizeof *work, GFP_KERNEL); | 4188 | work = kzalloc(sizeof *work, GFP_KERNEL); |
| @@ -4047,12 +4194,13 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4047 | work->event = event; | 4194 | work->event = event; |
| 4048 | work->dev = crtc->dev; | 4195 | work->dev = crtc->dev; |
| 4049 | intel_fb = to_intel_framebuffer(crtc->fb); | 4196 | intel_fb = to_intel_framebuffer(crtc->fb); |
| 4050 | work->obj = intel_fb->obj; | 4197 | work->old_fb_obj = intel_fb->obj; |
| 4051 | INIT_WORK(&work->work, intel_unpin_work_fn); | 4198 | INIT_WORK(&work->work, intel_unpin_work_fn); |
| 4052 | 4199 | ||
| 4053 | /* We borrow the event spin lock for protecting unpin_work */ | 4200 | /* We borrow the event spin lock for protecting unpin_work */ |
| 4054 | spin_lock_irqsave(&dev->event_lock, flags); | 4201 | spin_lock_irqsave(&dev->event_lock, flags); |
| 4055 | if (intel_crtc->unpin_work) { | 4202 | if (intel_crtc->unpin_work) { |
| 4203 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); | ||
| 4056 | spin_unlock_irqrestore(&dev->event_lock, flags); | 4204 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 4057 | kfree(work); | 4205 | kfree(work); |
| 4058 | mutex_unlock(&dev->struct_mutex); | 4206 | mutex_unlock(&dev->struct_mutex); |
| @@ -4066,19 +4214,24 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4066 | 4214 | ||
| 4067 | ret = intel_pin_and_fence_fb_obj(dev, obj); | 4215 | ret = intel_pin_and_fence_fb_obj(dev, obj); |
| 4068 | if (ret != 0) { | 4216 | if (ret != 0) { |
| 4217 | DRM_DEBUG_DRIVER("flip queue: %p pin & fence failed\n", | ||
| 4218 | obj->driver_private); | ||
| 4069 | kfree(work); | 4219 | kfree(work); |
| 4220 | intel_crtc->unpin_work = NULL; | ||
| 4070 | mutex_unlock(&dev->struct_mutex); | 4221 | mutex_unlock(&dev->struct_mutex); |
| 4071 | return ret; | 4222 | return ret; |
| 4072 | } | 4223 | } |
| 4073 | 4224 | ||
| 4074 | /* Reference the old fb object for the scheduled work. */ | 4225 | /* Reference the objects for the scheduled work. */ |
| 4075 | drm_gem_object_reference(work->obj); | 4226 | drm_gem_object_reference(work->old_fb_obj); |
| 4227 | drm_gem_object_reference(obj); | ||
| 4076 | 4228 | ||
| 4077 | crtc->fb = fb; | 4229 | crtc->fb = fb; |
| 4078 | i915_gem_object_flush_write_domain(obj); | 4230 | i915_gem_object_flush_write_domain(obj); |
| 4079 | drm_vblank_get(dev, intel_crtc->pipe); | 4231 | drm_vblank_get(dev, intel_crtc->pipe); |
| 4080 | obj_priv = obj->driver_private; | 4232 | obj_priv = obj->driver_private; |
| 4081 | atomic_inc(&obj_priv->pending_flip); | 4233 | atomic_inc(&obj_priv->pending_flip); |
| 4234 | work->pending_flip_obj = obj; | ||
| 4082 | 4235 | ||
| 4083 | BEGIN_LP_RING(4); | 4236 | BEGIN_LP_RING(4); |
| 4084 | OUT_RING(MI_DISPLAY_FLIP | | 4237 | OUT_RING(MI_DISPLAY_FLIP | |
| @@ -4086,7 +4239,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 4086 | OUT_RING(fb->pitch); | 4239 | OUT_RING(fb->pitch); |
| 4087 | if (IS_I965G(dev)) { | 4240 | if (IS_I965G(dev)) { |
| 4088 | OUT_RING(obj_priv->gtt_offset | obj_priv->tiling_mode); | 4241 | OUT_RING(obj_priv->gtt_offset | obj_priv->tiling_mode); |
| 4089 | OUT_RING((fb->width << 16) | fb->height); | 4242 | pipesrc = I915_READ(pipesrc_reg); |
| 4243 | OUT_RING(pipesrc & 0x0fff0fff); | ||
| 4090 | } else { | 4244 | } else { |
| 4091 | OUT_RING(obj_priv->gtt_offset); | 4245 | OUT_RING(obj_priv->gtt_offset); |
| 4092 | OUT_RING(MI_NOOP); | 4246 | OUT_RING(MI_NOOP); |
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index 371d753e362b..aaabbcbe5905 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c | |||
| @@ -148,7 +148,7 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width, | |||
| 148 | 148 | ||
| 149 | mutex_lock(&dev->struct_mutex); | 149 | mutex_lock(&dev->struct_mutex); |
| 150 | 150 | ||
| 151 | ret = i915_gem_object_pin(fbo, PAGE_SIZE); | 151 | ret = i915_gem_object_pin(fbo, 64*1024); |
| 152 | if (ret) { | 152 | if (ret) { |
| 153 | DRM_ERROR("failed to pin fb: %d\n", ret); | 153 | DRM_ERROR("failed to pin fb: %d\n", ret); |
| 154 | goto out_unref; | 154 | goto out_unref; |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index aa74e59bec61..b1d0acbae4e4 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -611,7 +611,7 @@ static const struct dmi_system_id bad_lid_status[] = { | |||
| 611 | { | 611 | { |
| 612 | .ident = "Samsung SX20S", | 612 | .ident = "Samsung SX20S", |
| 613 | .matches = { | 613 | .matches = { |
| 614 | DMI_MATCH(DMI_SYS_VENDOR, "Phoenix Technologies LTD"), | 614 | DMI_MATCH(DMI_SYS_VENDOR, "Samsung Electronics"), |
| 615 | DMI_MATCH(DMI_BOARD_NAME, "SX20S"), | 615 | DMI_MATCH(DMI_BOARD_NAME, "SX20S"), |
| 616 | }, | 616 | }, |
| 617 | }, | 617 | }, |
| @@ -623,6 +623,13 @@ static const struct dmi_system_id bad_lid_status[] = { | |||
| 623 | }, | 623 | }, |
| 624 | }, | 624 | }, |
| 625 | { | 625 | { |
| 626 | .ident = "Aspire 1810T", | ||
| 627 | .matches = { | ||
| 628 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 629 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1810T"), | ||
| 630 | }, | ||
| 631 | }, | ||
| 632 | { | ||
| 626 | .ident = "PC-81005", | 633 | .ident = "PC-81005", |
| 627 | .matches = { | 634 | .matches = { |
| 628 | DMI_MATCH(DMI_SYS_VENDOR, "MALATA"), | 635 | DMI_MATCH(DMI_SYS_VENDOR, "MALATA"), |
| @@ -643,7 +650,7 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect | |||
| 643 | { | 650 | { |
| 644 | enum drm_connector_status status = connector_status_connected; | 651 | enum drm_connector_status status = connector_status_connected; |
| 645 | 652 | ||
| 646 | if (!acpi_lid_open() && !dmi_check_system(bad_lid_status)) | 653 | if (!dmi_check_system(bad_lid_status) && !acpi_lid_open()) |
| 647 | status = connector_status_disconnected; | 654 | status = connector_status_disconnected; |
| 648 | 655 | ||
| 649 | return status; | 656 | return status; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index eaacfd0920df..82678d30ab06 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2345,6 +2345,14 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 2345 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | 2345 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; |
| 2346 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | 2346 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | |
| 2347 | (1 << INTEL_ANALOG_CLONE_BIT); | 2347 | (1 << INTEL_ANALOG_CLONE_BIT); |
| 2348 | } else if (flags & SDVO_OUTPUT_CVBS0) { | ||
| 2349 | |||
| 2350 | sdvo_priv->controlled_output = SDVO_OUTPUT_CVBS0; | ||
| 2351 | encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; | ||
| 2352 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | ||
| 2353 | sdvo_priv->is_tv = true; | ||
| 2354 | intel_output->needs_tv_clock = true; | ||
| 2355 | intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; | ||
| 2348 | } else if (flags & SDVO_OUTPUT_LVDS0) { | 2356 | } else if (flags & SDVO_OUTPUT_LVDS0) { |
| 2349 | 2357 | ||
| 2350 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; | 2358 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index 1cf488247a16..48227e744753 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | |||
| @@ -90,21 +90,21 @@ int nouveau_hybrid_setup(struct drm_device *dev) | |||
| 90 | { | 90 | { |
| 91 | int result; | 91 | int result; |
| 92 | 92 | ||
| 93 | if (nouveau_dsm(dev, NOUVEAU_DSM_ACTIVE, NOUVEAU_DSM_ACTIVE_QUERY, | 93 | if (nouveau_dsm(dev, NOUVEAU_DSM_POWER, NOUVEAU_DSM_POWER_STATE, |
| 94 | &result)) | 94 | &result)) |
| 95 | return -ENODEV; | 95 | return -ENODEV; |
| 96 | 96 | ||
| 97 | NV_INFO(dev, "_DSM hardware status gave 0x%x\n", result); | 97 | NV_INFO(dev, "_DSM hardware status gave 0x%x\n", result); |
| 98 | 98 | ||
| 99 | if (result & 0x1) { /* Stamina mode - disable the external GPU */ | 99 | if (result) { /* Ensure that the external GPU is enabled */ |
| 100 | nouveau_dsm(dev, NOUVEAU_DSM_LED, NOUVEAU_DSM_LED_SPEED, NULL); | ||
| 101 | nouveau_dsm(dev, NOUVEAU_DSM_POWER, NOUVEAU_DSM_POWER_SPEED, | ||
| 102 | NULL); | ||
| 103 | } else { /* Stamina mode - disable the external GPU */ | ||
| 100 | nouveau_dsm(dev, NOUVEAU_DSM_LED, NOUVEAU_DSM_LED_STAMINA, | 104 | nouveau_dsm(dev, NOUVEAU_DSM_LED, NOUVEAU_DSM_LED_STAMINA, |
| 101 | NULL); | 105 | NULL); |
| 102 | nouveau_dsm(dev, NOUVEAU_DSM_POWER, NOUVEAU_DSM_POWER_STAMINA, | 106 | nouveau_dsm(dev, NOUVEAU_DSM_POWER, NOUVEAU_DSM_POWER_STAMINA, |
| 103 | NULL); | 107 | NULL); |
| 104 | } else { /* Ensure that the external GPU is enabled */ | ||
| 105 | nouveau_dsm(dev, NOUVEAU_DSM_LED, NOUVEAU_DSM_LED_SPEED, NULL); | ||
| 106 | nouveau_dsm(dev, NOUVEAU_DSM_POWER, NOUVEAU_DSM_POWER_SPEED, | ||
| 107 | NULL); | ||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | return 0; | 110 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index d7f8d8b4a4b8..2cd0fad17dac 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
| @@ -1865,7 +1865,7 @@ init_compute_mem(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) | |||
| 1865 | 1865 | ||
| 1866 | struct drm_nouveau_private *dev_priv = bios->dev->dev_private; | 1866 | struct drm_nouveau_private *dev_priv = bios->dev->dev_private; |
| 1867 | 1867 | ||
| 1868 | if (dev_priv->card_type >= NV_50) | 1868 | if (dev_priv->card_type >= NV_40) |
| 1869 | return 1; | 1869 | return 1; |
| 1870 | 1870 | ||
| 1871 | /* | 1871 | /* |
| @@ -3765,7 +3765,6 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3765 | */ | 3765 | */ |
| 3766 | 3766 | ||
| 3767 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 3767 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 3768 | struct init_exec iexec = {true, false}; | ||
| 3769 | struct nvbios *bios = &dev_priv->VBIOS; | 3768 | struct nvbios *bios = &dev_priv->VBIOS; |
| 3770 | uint8_t *table = &bios->data[bios->display.script_table_ptr]; | 3769 | uint8_t *table = &bios->data[bios->display.script_table_ptr]; |
| 3771 | uint8_t *otable = NULL; | 3770 | uint8_t *otable = NULL; |
| @@ -3845,8 +3844,6 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3845 | } | 3844 | } |
| 3846 | } | 3845 | } |
| 3847 | 3846 | ||
| 3848 | bios->display.output = dcbent; | ||
| 3849 | |||
| 3850 | if (pxclk == 0) { | 3847 | if (pxclk == 0) { |
| 3851 | script = ROM16(otable[6]); | 3848 | script = ROM16(otable[6]); |
| 3852 | if (!script) { | 3849 | if (!script) { |
| @@ -3855,7 +3852,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3855 | } | 3852 | } |
| 3856 | 3853 | ||
| 3857 | NV_TRACE(dev, "0x%04X: parsing output script 0\n", script); | 3854 | NV_TRACE(dev, "0x%04X: parsing output script 0\n", script); |
| 3858 | parse_init_table(bios, script, &iexec); | 3855 | nouveau_bios_run_init_table(dev, script, dcbent); |
| 3859 | } else | 3856 | } else |
| 3860 | if (pxclk == -1) { | 3857 | if (pxclk == -1) { |
| 3861 | script = ROM16(otable[8]); | 3858 | script = ROM16(otable[8]); |
| @@ -3865,7 +3862,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3865 | } | 3862 | } |
| 3866 | 3863 | ||
| 3867 | NV_TRACE(dev, "0x%04X: parsing output script 1\n", script); | 3864 | NV_TRACE(dev, "0x%04X: parsing output script 1\n", script); |
| 3868 | parse_init_table(bios, script, &iexec); | 3865 | nouveau_bios_run_init_table(dev, script, dcbent); |
| 3869 | } else | 3866 | } else |
| 3870 | if (pxclk == -2) { | 3867 | if (pxclk == -2) { |
| 3871 | if (table[4] >= 12) | 3868 | if (table[4] >= 12) |
| @@ -3878,7 +3875,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3878 | } | 3875 | } |
| 3879 | 3876 | ||
| 3880 | NV_TRACE(dev, "0x%04X: parsing output script 2\n", script); | 3877 | NV_TRACE(dev, "0x%04X: parsing output script 2\n", script); |
| 3881 | parse_init_table(bios, script, &iexec); | 3878 | nouveau_bios_run_init_table(dev, script, dcbent); |
| 3882 | } else | 3879 | } else |
| 3883 | if (pxclk > 0) { | 3880 | if (pxclk > 0) { |
| 3884 | script = ROM16(otable[table[4] + i*6 + 2]); | 3881 | script = ROM16(otable[table[4] + i*6 + 2]); |
| @@ -3890,7 +3887,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3890 | } | 3887 | } |
| 3891 | 3888 | ||
| 3892 | NV_TRACE(dev, "0x%04X: parsing clock script 0\n", script); | 3889 | NV_TRACE(dev, "0x%04X: parsing clock script 0\n", script); |
| 3893 | parse_init_table(bios, script, &iexec); | 3890 | nouveau_bios_run_init_table(dev, script, dcbent); |
| 3894 | } else | 3891 | } else |
| 3895 | if (pxclk < 0) { | 3892 | if (pxclk < 0) { |
| 3896 | script = ROM16(otable[table[4] + i*6 + 4]); | 3893 | script = ROM16(otable[table[4] + i*6 + 4]); |
| @@ -3902,7 +3899,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 3902 | } | 3899 | } |
| 3903 | 3900 | ||
| 3904 | NV_TRACE(dev, "0x%04X: parsing clock script 1\n", script); | 3901 | NV_TRACE(dev, "0x%04X: parsing clock script 1\n", script); |
| 3905 | parse_init_table(bios, script, &iexec); | 3902 | nouveau_bios_run_init_table(dev, script, dcbent); |
| 3906 | } | 3903 | } |
| 3907 | 3904 | ||
| 3908 | return 0; | 3905 | return 0; |
| @@ -5864,10 +5861,13 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table, | |||
| 5864 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 5861 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 5865 | struct nvbios *bios = &dev_priv->VBIOS; | 5862 | struct nvbios *bios = &dev_priv->VBIOS; |
| 5866 | struct init_exec iexec = { true, false }; | 5863 | struct init_exec iexec = { true, false }; |
| 5864 | unsigned long flags; | ||
| 5867 | 5865 | ||
| 5866 | spin_lock_irqsave(&bios->lock, flags); | ||
| 5868 | bios->display.output = dcbent; | 5867 | bios->display.output = dcbent; |
| 5869 | parse_init_table(bios, table, &iexec); | 5868 | parse_init_table(bios, table, &iexec); |
| 5870 | bios->display.output = NULL; | 5869 | bios->display.output = NULL; |
| 5870 | spin_unlock_irqrestore(&bios->lock, flags); | ||
| 5871 | } | 5871 | } |
| 5872 | 5872 | ||
| 5873 | static bool NVInitVBIOS(struct drm_device *dev) | 5873 | static bool NVInitVBIOS(struct drm_device *dev) |
| @@ -5876,6 +5876,7 @@ static bool NVInitVBIOS(struct drm_device *dev) | |||
| 5876 | struct nvbios *bios = &dev_priv->VBIOS; | 5876 | struct nvbios *bios = &dev_priv->VBIOS; |
| 5877 | 5877 | ||
| 5878 | memset(bios, 0, sizeof(struct nvbios)); | 5878 | memset(bios, 0, sizeof(struct nvbios)); |
| 5879 | spin_lock_init(&bios->lock); | ||
| 5879 | bios->dev = dev; | 5880 | bios->dev = dev; |
| 5880 | 5881 | ||
| 5881 | if (!NVShadowVBIOS(dev, bios->data)) | 5882 | if (!NVShadowVBIOS(dev, bios->data)) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h index 058e98c76d89..68446fd4146b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.h +++ b/drivers/gpu/drm/nouveau/nouveau_bios.h | |||
| @@ -205,6 +205,8 @@ struct nvbios { | |||
| 205 | struct drm_device *dev; | 205 | struct drm_device *dev; |
| 206 | struct nouveau_bios_info pub; | 206 | struct nouveau_bios_info pub; |
| 207 | 207 | ||
| 208 | spinlock_t lock; | ||
| 209 | |||
| 208 | uint8_t data[NV_PROM_SIZE]; | 210 | uint8_t data[NV_PROM_SIZE]; |
| 209 | unsigned int length; | 211 | unsigned int length; |
| 210 | bool execute; | 212 | bool execute; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index db0ed4c13f98..028719fddf76 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
| @@ -65,8 +65,10 @@ nouveau_bo_fixup_align(struct drm_device *dev, | |||
| 65 | 65 | ||
| 66 | /* | 66 | /* |
| 67 | * Some of the tile_flags have a periodic structure of N*4096 bytes, | 67 | * Some of the tile_flags have a periodic structure of N*4096 bytes, |
| 68 | * align to to that as well as the page size. Overallocate memory to | 68 | * align to to that as well as the page size. Align the size to the |
| 69 | * avoid corruption of other buffer objects. | 69 | * appropriate boundaries. This does imply that sizes are rounded up |
| 70 | * 3-7 pages, so be aware of this and do not waste memory by allocating | ||
| 71 | * many small buffers. | ||
| 70 | */ | 72 | */ |
| 71 | if (dev_priv->card_type == NV_50) { | 73 | if (dev_priv->card_type == NV_50) { |
| 72 | uint32_t block_size = nouveau_mem_fb_amount(dev) >> 15; | 74 | uint32_t block_size = nouveau_mem_fb_amount(dev) >> 15; |
| @@ -77,22 +79,20 @@ nouveau_bo_fixup_align(struct drm_device *dev, | |||
| 77 | case 0x2800: | 79 | case 0x2800: |
| 78 | case 0x4800: | 80 | case 0x4800: |
| 79 | case 0x7a00: | 81 | case 0x7a00: |
| 80 | *size = roundup(*size, block_size); | ||
| 81 | if (is_power_of_2(block_size)) { | 82 | if (is_power_of_2(block_size)) { |
| 82 | *size += 3 * block_size; | ||
| 83 | for (i = 1; i < 10; i++) { | 83 | for (i = 1; i < 10; i++) { |
| 84 | *align = 12 * i * block_size; | 84 | *align = 12 * i * block_size; |
| 85 | if (!(*align % 65536)) | 85 | if (!(*align % 65536)) |
| 86 | break; | 86 | break; |
| 87 | } | 87 | } |
| 88 | } else { | 88 | } else { |
| 89 | *size += 6 * block_size; | ||
| 90 | for (i = 1; i < 10; i++) { | 89 | for (i = 1; i < 10; i++) { |
| 91 | *align = 8 * i * block_size; | 90 | *align = 8 * i * block_size; |
| 92 | if (!(*align % 65536)) | 91 | if (!(*align % 65536)) |
| 93 | break; | 92 | break; |
| 94 | } | 93 | } |
| 95 | } | 94 | } |
| 95 | *size = roundup(*size, *align); | ||
| 96 | break; | 96 | break; |
| 97 | default: | 97 | default: |
| 98 | break; | 98 | break; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c index 343d718a9667..2281f99da7fc 100644 --- a/drivers/gpu/drm/nouveau/nouveau_channel.c +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c | |||
| @@ -278,12 +278,11 @@ nouveau_channel_free(struct nouveau_channel *chan) | |||
| 278 | /* Ensure the channel is no longer active on the GPU */ | 278 | /* Ensure the channel is no longer active on the GPU */ |
| 279 | pfifo->reassign(dev, false); | 279 | pfifo->reassign(dev, false); |
| 280 | 280 | ||
| 281 | if (pgraph->channel(dev) == chan) { | 281 | pgraph->fifo_access(dev, false); |
| 282 | pgraph->fifo_access(dev, false); | 282 | if (pgraph->channel(dev) == chan) |
| 283 | pgraph->unload_context(dev); | 283 | pgraph->unload_context(dev); |
| 284 | pgraph->fifo_access(dev, true); | ||
| 285 | } | ||
| 286 | pgraph->destroy_context(chan); | 284 | pgraph->destroy_context(chan); |
| 285 | pgraph->fifo_access(dev, true); | ||
| 287 | 286 | ||
| 288 | if (pfifo->channel_id(dev) == chan->id) { | 287 | if (pfifo->channel_id(dev) == chan->id) { |
| 289 | pfifo->disable(dev); | 288 | pfifo->disable(dev); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 7e6d673f3a23..d2f63353ea97 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | |||
| @@ -88,13 +88,14 @@ nouveau_connector_destroy(struct drm_connector *drm_connector) | |||
| 88 | { | 88 | { |
| 89 | struct nouveau_connector *nv_connector = | 89 | struct nouveau_connector *nv_connector = |
| 90 | nouveau_connector(drm_connector); | 90 | nouveau_connector(drm_connector); |
| 91 | struct drm_device *dev = nv_connector->base.dev; | 91 | struct drm_device *dev; |
| 92 | |||
| 93 | NV_DEBUG_KMS(dev, "\n"); | ||
| 94 | 92 | ||
| 95 | if (!nv_connector) | 93 | if (!nv_connector) |
| 96 | return; | 94 | return; |
| 97 | 95 | ||
| 96 | dev = nv_connector->base.dev; | ||
| 97 | NV_DEBUG_KMS(dev, "\n"); | ||
| 98 | |||
| 98 | kfree(nv_connector->edid); | 99 | kfree(nv_connector->edid); |
| 99 | drm_sysfs_connector_remove(drm_connector); | 100 | drm_sysfs_connector_remove(drm_connector); |
| 100 | drm_connector_cleanup(drm_connector); | 101 | drm_connector_cleanup(drm_connector); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c index dd4937224220..f954ad93e81f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dp.c +++ b/drivers/gpu/drm/nouveau/nouveau_dp.c | |||
| @@ -502,12 +502,12 @@ nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr, | |||
| 502 | break; | 502 | break; |
| 503 | } | 503 | } |
| 504 | 504 | ||
| 505 | if ((stat & NV50_AUXCH_STAT_COUNT) != data_nr) { | ||
| 506 | ret = -EREMOTEIO; | ||
| 507 | goto out; | ||
| 508 | } | ||
| 509 | |||
| 510 | if (cmd & 1) { | 505 | if (cmd & 1) { |
| 506 | if ((stat & NV50_AUXCH_STAT_COUNT) != data_nr) { | ||
| 507 | ret = -EREMOTEIO; | ||
| 508 | goto out; | ||
| 509 | } | ||
| 510 | |||
| 511 | for (i = 0; i < 4; i++) { | 511 | for (i = 0; i < 4; i++) { |
| 512 | data32[i] = nv_rd32(dev, NV50_AUXCH_DATA_IN(index, i)); | 512 | data32[i] = nv_rd32(dev, NV50_AUXCH_DATA_IN(index, i)); |
| 513 | NV_DEBUG_KMS(dev, "rd %d: 0x%08x\n", i, data32[i]); | 513 | NV_DEBUG_KMS(dev, "rd %d: 0x%08x\n", i, data32[i]); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c index 343ab7f17ccc..da3b93b84502 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c | |||
| @@ -56,7 +56,7 @@ int nouveau_vram_pushbuf; | |||
| 56 | module_param_named(vram_pushbuf, nouveau_vram_pushbuf, int, 0400); | 56 | module_param_named(vram_pushbuf, nouveau_vram_pushbuf, int, 0400); |
| 57 | 57 | ||
| 58 | MODULE_PARM_DESC(vram_notify, "Force DMA notifiers to be in VRAM"); | 58 | MODULE_PARM_DESC(vram_notify, "Force DMA notifiers to be in VRAM"); |
| 59 | int nouveau_vram_notify; | 59 | int nouveau_vram_notify = 1; |
| 60 | module_param_named(vram_notify, nouveau_vram_notify, int, 0400); | 60 | module_param_named(vram_notify, nouveau_vram_notify, int, 0400); |
| 61 | 61 | ||
| 62 | MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (>=GeForce 8)"); | 62 | MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (>=GeForce 8)"); |
| @@ -75,6 +75,14 @@ MODULE_PARM_DESC(ignorelid, "Ignore ACPI lid status"); | |||
| 75 | int nouveau_ignorelid = 0; | 75 | int nouveau_ignorelid = 0; |
| 76 | module_param_named(ignorelid, nouveau_ignorelid, int, 0400); | 76 | module_param_named(ignorelid, nouveau_ignorelid, int, 0400); |
| 77 | 77 | ||
| 78 | MODULE_PARM_DESC(noagp, "Disable all acceleration"); | ||
| 79 | int nouveau_noaccel = 0; | ||
| 80 | module_param_named(noaccel, nouveau_noaccel, int, 0400); | ||
| 81 | |||
| 82 | MODULE_PARM_DESC(noagp, "Disable fbcon acceleration"); | ||
| 83 | int nouveau_nofbaccel = 0; | ||
| 84 | module_param_named(nofbaccel, nouveau_nofbaccel, int, 0400); | ||
| 85 | |||
| 78 | MODULE_PARM_DESC(tv_norm, "Default TV norm.\n" | 86 | MODULE_PARM_DESC(tv_norm, "Default TV norm.\n" |
| 79 | "\t\tSupported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J,\n" | 87 | "\t\tSupported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J,\n" |
| 80 | "\t\t\thd480i, hd480p, hd576i, hd576p, hd720p, hd1080i.\n" | 88 | "\t\t\thd480i, hd480p, hd576i, hd576p, hd720p, hd1080i.\n" |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 6b9690418bc7..5445cefdd03e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -678,6 +678,8 @@ extern int nouveau_reg_debug; | |||
| 678 | extern char *nouveau_vbios; | 678 | extern char *nouveau_vbios; |
| 679 | extern int nouveau_ctxfw; | 679 | extern int nouveau_ctxfw; |
| 680 | extern int nouveau_ignorelid; | 680 | extern int nouveau_ignorelid; |
| 681 | extern int nouveau_nofbaccel; | ||
| 682 | extern int nouveau_noaccel; | ||
| 681 | 683 | ||
| 682 | /* nouveau_state.c */ | 684 | /* nouveau_state.c */ |
| 683 | extern void nouveau_preclose(struct drm_device *dev, struct drm_file *); | 685 | extern void nouveau_preclose(struct drm_device *dev, struct drm_file *); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 0b05c869e0e7..ea879a2efef3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
| @@ -107,6 +107,34 @@ static struct fb_ops nouveau_fbcon_ops = { | |||
| 107 | .fb_setcmap = drm_fb_helper_setcmap, | 107 | .fb_setcmap = drm_fb_helper_setcmap, |
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | static struct fb_ops nv04_fbcon_ops = { | ||
| 111 | .owner = THIS_MODULE, | ||
| 112 | .fb_check_var = drm_fb_helper_check_var, | ||
| 113 | .fb_set_par = drm_fb_helper_set_par, | ||
| 114 | .fb_setcolreg = drm_fb_helper_setcolreg, | ||
| 115 | .fb_fillrect = nv04_fbcon_fillrect, | ||
| 116 | .fb_copyarea = nv04_fbcon_copyarea, | ||
| 117 | .fb_imageblit = nv04_fbcon_imageblit, | ||
| 118 | .fb_sync = nouveau_fbcon_sync, | ||
| 119 | .fb_pan_display = drm_fb_helper_pan_display, | ||
| 120 | .fb_blank = drm_fb_helper_blank, | ||
| 121 | .fb_setcmap = drm_fb_helper_setcmap, | ||
| 122 | }; | ||
| 123 | |||
| 124 | static struct fb_ops nv50_fbcon_ops = { | ||
| 125 | .owner = THIS_MODULE, | ||
| 126 | .fb_check_var = drm_fb_helper_check_var, | ||
| 127 | .fb_set_par = drm_fb_helper_set_par, | ||
| 128 | .fb_setcolreg = drm_fb_helper_setcolreg, | ||
| 129 | .fb_fillrect = nv50_fbcon_fillrect, | ||
| 130 | .fb_copyarea = nv50_fbcon_copyarea, | ||
| 131 | .fb_imageblit = nv50_fbcon_imageblit, | ||
| 132 | .fb_sync = nouveau_fbcon_sync, | ||
| 133 | .fb_pan_display = drm_fb_helper_pan_display, | ||
| 134 | .fb_blank = drm_fb_helper_blank, | ||
| 135 | .fb_setcmap = drm_fb_helper_setcmap, | ||
| 136 | }; | ||
| 137 | |||
| 110 | static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 138 | static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
| 111 | u16 blue, int regno) | 139 | u16 blue, int regno) |
| 112 | { | 140 | { |
| @@ -267,8 +295,12 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width, | |||
| 267 | dev_priv->fbdev_info = info; | 295 | dev_priv->fbdev_info = info; |
| 268 | 296 | ||
| 269 | strcpy(info->fix.id, "nouveaufb"); | 297 | strcpy(info->fix.id, "nouveaufb"); |
| 270 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA | | 298 | if (nouveau_nofbaccel) |
| 271 | FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_IMAGEBLIT; | 299 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_DISABLED; |
| 300 | else | ||
| 301 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA | | ||
| 302 | FBINFO_HWACCEL_FILLRECT | | ||
| 303 | FBINFO_HWACCEL_IMAGEBLIT; | ||
| 272 | info->fbops = &nouveau_fbcon_ops; | 304 | info->fbops = &nouveau_fbcon_ops; |
| 273 | info->fix.smem_start = dev->mode_config.fb_base + nvbo->bo.offset - | 305 | info->fix.smem_start = dev->mode_config.fb_base + nvbo->bo.offset - |
| 274 | dev_priv->vm_vram_base; | 306 | dev_priv->vm_vram_base; |
| @@ -316,13 +348,15 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width, | |||
| 316 | par->nouveau_fb = nouveau_fb; | 348 | par->nouveau_fb = nouveau_fb; |
| 317 | par->dev = dev; | 349 | par->dev = dev; |
| 318 | 350 | ||
| 319 | if (dev_priv->channel) { | 351 | if (dev_priv->channel && !nouveau_nofbaccel) { |
| 320 | switch (dev_priv->card_type) { | 352 | switch (dev_priv->card_type) { |
| 321 | case NV_50: | 353 | case NV_50: |
| 322 | nv50_fbcon_accel_init(info); | 354 | nv50_fbcon_accel_init(info); |
| 355 | info->fbops = &nv50_fbcon_ops; | ||
| 323 | break; | 356 | break; |
| 324 | default: | 357 | default: |
| 325 | nv04_fbcon_accel_init(info); | 358 | nv04_fbcon_accel_init(info); |
| 359 | info->fbops = &nv04_fbcon_ops; | ||
| 326 | break; | 360 | break; |
| 327 | }; | 361 | }; |
| 328 | } | 362 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h index 462e0b87b4bd..f9c34e1a8c11 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h | |||
| @@ -40,7 +40,13 @@ int nouveau_fbcon_remove(struct drm_device *dev, struct drm_framebuffer *fb); | |||
| 40 | void nouveau_fbcon_restore(void); | 40 | void nouveau_fbcon_restore(void); |
| 41 | void nouveau_fbcon_zfill(struct drm_device *dev); | 41 | void nouveau_fbcon_zfill(struct drm_device *dev); |
| 42 | 42 | ||
| 43 | void nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region); | ||
| 44 | void nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect); | ||
| 45 | void nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image); | ||
| 43 | int nv04_fbcon_accel_init(struct fb_info *info); | 46 | int nv04_fbcon_accel_init(struct fb_info *info); |
| 47 | void nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect); | ||
| 48 | void nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region); | ||
| 49 | void nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image); | ||
| 44 | int nv50_fbcon_accel_init(struct fb_info *info); | 50 | int nv50_fbcon_accel_init(struct fb_info *info); |
| 45 | 51 | ||
| 46 | void nouveau_fbcon_gpu_lockup(struct fb_info *info); | 52 | void nouveau_fbcon_gpu_lockup(struct fb_info *info); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 6ac804b0c9f9..70cc30803e3b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
| @@ -925,7 +925,9 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data, | |||
| 925 | } | 925 | } |
| 926 | 926 | ||
| 927 | if (req->flags & NOUVEAU_GEM_CPU_PREP_NOBLOCK) { | 927 | if (req->flags & NOUVEAU_GEM_CPU_PREP_NOBLOCK) { |
| 928 | spin_lock(&nvbo->bo.lock); | ||
| 928 | ret = ttm_bo_wait(&nvbo->bo, false, false, no_wait); | 929 | ret = ttm_bo_wait(&nvbo->bo, false, false, no_wait); |
| 930 | spin_unlock(&nvbo->bo.lock); | ||
| 929 | } else { | 931 | } else { |
| 930 | ret = ttm_bo_synccpu_write_grab(&nvbo->bo, no_wait); | 932 | ret = ttm_bo_synccpu_write_grab(&nvbo->bo, no_wait); |
| 931 | if (ret == 0) | 933 | if (ret == 0) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_grctx.c b/drivers/gpu/drm/nouveau/nouveau_grctx.c index 419f4c2b3b89..c7ebec696747 100644 --- a/drivers/gpu/drm/nouveau/nouveau_grctx.c +++ b/drivers/gpu/drm/nouveau/nouveau_grctx.c | |||
| @@ -97,8 +97,8 @@ nouveau_grctx_prog_load(struct drm_device *dev) | |||
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | pgraph->ctxvals = kmalloc(fw->size, GFP_KERNEL); | 99 | pgraph->ctxvals = kmalloc(fw->size, GFP_KERNEL); |
| 100 | if (!pgraph->ctxprog) { | 100 | if (!pgraph->ctxvals) { |
| 101 | NV_ERROR(dev, "OOM copying ctxprog\n"); | 101 | NV_ERROR(dev, "OOM copying ctxvals\n"); |
| 102 | release_firmware(fw); | 102 | release_firmware(fw); |
| 103 | nouveau_grctx_fini(dev); | 103 | nouveau_grctx_fini(dev); |
| 104 | return -ENOMEM; | 104 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c index 3b9bad66162a..447f9f69d6b1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_irq.c +++ b/drivers/gpu/drm/nouveau/nouveau_irq.c | |||
| @@ -211,6 +211,20 @@ nouveau_fifo_irq_handler(struct drm_device *dev) | |||
| 211 | get + 4); | 211 | get + 4); |
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | if (status & NV_PFIFO_INTR_SEMAPHORE) { | ||
| 215 | uint32_t sem; | ||
| 216 | |||
| 217 | status &= ~NV_PFIFO_INTR_SEMAPHORE; | ||
| 218 | nv_wr32(dev, NV03_PFIFO_INTR_0, | ||
| 219 | NV_PFIFO_INTR_SEMAPHORE); | ||
| 220 | |||
| 221 | sem = nv_rd32(dev, NV10_PFIFO_CACHE1_SEMAPHORE); | ||
| 222 | nv_wr32(dev, NV10_PFIFO_CACHE1_SEMAPHORE, sem | 0x1); | ||
| 223 | |||
| 224 | nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4); | ||
| 225 | nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1); | ||
| 226 | } | ||
| 227 | |||
| 214 | if (status) { | 228 | if (status) { |
| 215 | NV_INFO(dev, "PFIFO_INTR 0x%08x - Ch %d\n", | 229 | NV_INFO(dev, "PFIFO_INTR 0x%08x - Ch %d\n", |
| 216 | status, chid); | 230 | status, chid); |
| @@ -566,86 +580,99 @@ nouveau_pgraph_irq_handler(struct drm_device *dev) | |||
| 566 | static void | 580 | static void |
| 567 | nv50_pgraph_irq_handler(struct drm_device *dev) | 581 | nv50_pgraph_irq_handler(struct drm_device *dev) |
| 568 | { | 582 | { |
| 569 | uint32_t status, nsource; | 583 | uint32_t status; |
| 570 | 584 | ||
| 571 | status = nv_rd32(dev, NV03_PGRAPH_INTR); | 585 | while ((status = nv_rd32(dev, NV03_PGRAPH_INTR))) { |
| 572 | nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE); | 586 | uint32_t nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE); |
| 573 | 587 | ||
| 574 | if (status & 0x00000001) { | 588 | if (status & 0x00000001) { |
| 575 | nouveau_pgraph_intr_notify(dev, nsource); | 589 | nouveau_pgraph_intr_notify(dev, nsource); |
| 576 | status &= ~0x00000001; | 590 | status &= ~0x00000001; |
| 577 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000001); | 591 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000001); |
| 578 | } | 592 | } |
| 579 | 593 | ||
| 580 | if (status & 0x00000010) { | 594 | if (status & 0x00000010) { |
| 581 | nouveau_pgraph_intr_error(dev, nsource | | 595 | nouveau_pgraph_intr_error(dev, nsource | |
| 582 | NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD); | 596 | NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD); |
| 583 | 597 | ||
| 584 | status &= ~0x00000010; | 598 | status &= ~0x00000010; |
| 585 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000010); | 599 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000010); |
| 586 | } | 600 | } |
| 587 | 601 | ||
| 588 | if (status & 0x00001000) { | 602 | if (status & 0x00001000) { |
| 589 | nv_wr32(dev, 0x400500, 0x00000000); | 603 | nv_wr32(dev, 0x400500, 0x00000000); |
| 590 | nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_CONTEXT_SWITCH); | 604 | nv_wr32(dev, NV03_PGRAPH_INTR, |
| 591 | nv_wr32(dev, NV40_PGRAPH_INTR_EN, nv_rd32(dev, | 605 | NV_PGRAPH_INTR_CONTEXT_SWITCH); |
| 592 | NV40_PGRAPH_INTR_EN) & ~NV_PGRAPH_INTR_CONTEXT_SWITCH); | 606 | nv_wr32(dev, NV40_PGRAPH_INTR_EN, nv_rd32(dev, |
| 593 | nv_wr32(dev, 0x400500, 0x00010001); | 607 | NV40_PGRAPH_INTR_EN) & |
| 608 | ~NV_PGRAPH_INTR_CONTEXT_SWITCH); | ||
| 609 | nv_wr32(dev, 0x400500, 0x00010001); | ||
| 594 | 610 | ||
| 595 | nv50_graph_context_switch(dev); | 611 | nv50_graph_context_switch(dev); |
| 596 | 612 | ||
| 597 | status &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH; | 613 | status &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH; |
| 598 | } | 614 | } |
| 599 | 615 | ||
| 600 | if (status & 0x00100000) { | 616 | if (status & 0x00100000) { |
| 601 | nouveau_pgraph_intr_error(dev, nsource | | 617 | nouveau_pgraph_intr_error(dev, nsource | |
| 602 | NV03_PGRAPH_NSOURCE_DATA_ERROR); | 618 | NV03_PGRAPH_NSOURCE_DATA_ERROR); |
| 603 | 619 | ||
| 604 | status &= ~0x00100000; | 620 | status &= ~0x00100000; |
| 605 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00100000); | 621 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00100000); |
| 606 | } | 622 | } |
| 607 | 623 | ||
| 608 | if (status & 0x00200000) { | 624 | if (status & 0x00200000) { |
| 609 | int r; | 625 | int r; |
| 610 | 626 | ||
| 611 | nouveau_pgraph_intr_error(dev, nsource | | 627 | nouveau_pgraph_intr_error(dev, nsource | |
| 612 | NV03_PGRAPH_NSOURCE_PROTECTION_ERROR); | 628 | NV03_PGRAPH_NSOURCE_PROTECTION_ERROR); |
| 613 | 629 | ||
| 614 | NV_ERROR(dev, "magic set 1:\n"); | 630 | NV_ERROR(dev, "magic set 1:\n"); |
| 615 | for (r = 0x408900; r <= 0x408910; r += 4) | 631 | for (r = 0x408900; r <= 0x408910; r += 4) |
| 616 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, nv_rd32(dev, r)); | 632 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, |
| 617 | nv_wr32(dev, 0x408900, nv_rd32(dev, 0x408904) | 0xc0000000); | 633 | nv_rd32(dev, r)); |
| 618 | for (r = 0x408e08; r <= 0x408e24; r += 4) | 634 | nv_wr32(dev, 0x408900, |
| 619 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, nv_rd32(dev, r)); | 635 | nv_rd32(dev, 0x408904) | 0xc0000000); |
| 620 | nv_wr32(dev, 0x408e08, nv_rd32(dev, 0x408e08) | 0xc0000000); | 636 | for (r = 0x408e08; r <= 0x408e24; r += 4) |
| 621 | 637 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, | |
| 622 | NV_ERROR(dev, "magic set 2:\n"); | 638 | nv_rd32(dev, r)); |
| 623 | for (r = 0x409900; r <= 0x409910; r += 4) | 639 | nv_wr32(dev, 0x408e08, |
| 624 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, nv_rd32(dev, r)); | 640 | nv_rd32(dev, 0x408e08) | 0xc0000000); |
| 625 | nv_wr32(dev, 0x409900, nv_rd32(dev, 0x409904) | 0xc0000000); | 641 | |
| 626 | for (r = 0x409e08; r <= 0x409e24; r += 4) | 642 | NV_ERROR(dev, "magic set 2:\n"); |
| 627 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, nv_rd32(dev, r)); | 643 | for (r = 0x409900; r <= 0x409910; r += 4) |
| 628 | nv_wr32(dev, 0x409e08, nv_rd32(dev, 0x409e08) | 0xc0000000); | 644 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, |
| 629 | 645 | nv_rd32(dev, r)); | |
| 630 | status &= ~0x00200000; | 646 | nv_wr32(dev, 0x409900, |
| 631 | nv_wr32(dev, NV03_PGRAPH_NSOURCE, nsource); | 647 | nv_rd32(dev, 0x409904) | 0xc0000000); |
| 632 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00200000); | 648 | for (r = 0x409e08; r <= 0x409e24; r += 4) |
| 633 | } | 649 | NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r, |
| 650 | nv_rd32(dev, r)); | ||
| 651 | nv_wr32(dev, 0x409e08, | ||
| 652 | nv_rd32(dev, 0x409e08) | 0xc0000000); | ||
| 653 | |||
| 654 | status &= ~0x00200000; | ||
| 655 | nv_wr32(dev, NV03_PGRAPH_NSOURCE, nsource); | ||
| 656 | nv_wr32(dev, NV03_PGRAPH_INTR, 0x00200000); | ||
| 657 | } | ||
| 634 | 658 | ||
| 635 | if (status) { | 659 | if (status) { |
| 636 | NV_INFO(dev, "Unhandled PGRAPH_INTR - 0x%08x\n", status); | 660 | NV_INFO(dev, "Unhandled PGRAPH_INTR - 0x%08x\n", |
| 637 | nv_wr32(dev, NV03_PGRAPH_INTR, status); | 661 | status); |
| 638 | } | 662 | nv_wr32(dev, NV03_PGRAPH_INTR, status); |
| 663 | } | ||
| 639 | 664 | ||
| 640 | { | 665 | { |
| 641 | const int isb = (1 << 16) | (1 << 0); | 666 | const int isb = (1 << 16) | (1 << 0); |
| 642 | 667 | ||
| 643 | if ((nv_rd32(dev, 0x400500) & isb) != isb) | 668 | if ((nv_rd32(dev, 0x400500) & isb) != isb) |
| 644 | nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | isb); | 669 | nv_wr32(dev, 0x400500, |
| 645 | nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31)); | 670 | nv_rd32(dev, 0x400500) | isb); |
| 671 | } | ||
| 646 | } | 672 | } |
| 647 | 673 | ||
| 648 | nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING); | 674 | nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING); |
| 675 | nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31)); | ||
| 649 | } | 676 | } |
| 650 | 677 | ||
| 651 | static void | 678 | static void |
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index 6c66a34b6345..d99dc087f9b1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
| @@ -34,15 +34,20 @@ nouveau_notifier_init_channel(struct nouveau_channel *chan) | |||
| 34 | { | 34 | { |
| 35 | struct drm_device *dev = chan->dev; | 35 | struct drm_device *dev = chan->dev; |
| 36 | struct nouveau_bo *ntfy = NULL; | 36 | struct nouveau_bo *ntfy = NULL; |
| 37 | uint32_t flags; | ||
| 37 | int ret; | 38 | int ret; |
| 38 | 39 | ||
| 39 | ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, nouveau_vram_notify ? | 40 | if (nouveau_vram_notify) |
| 40 | TTM_PL_FLAG_VRAM : TTM_PL_FLAG_TT, | 41 | flags = TTM_PL_FLAG_VRAM; |
| 42 | else | ||
| 43 | flags = TTM_PL_FLAG_TT; | ||
| 44 | |||
| 45 | ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, | ||
| 41 | 0, 0x0000, false, true, &ntfy); | 46 | 0, 0x0000, false, true, &ntfy); |
| 42 | if (ret) | 47 | if (ret) |
| 43 | return ret; | 48 | return ret; |
| 44 | 49 | ||
| 45 | ret = nouveau_bo_pin(ntfy, TTM_PL_FLAG_VRAM); | 50 | ret = nouveau_bo_pin(ntfy, flags); |
| 46 | if (ret) | 51 | if (ret) |
| 47 | goto out_err; | 52 | goto out_err; |
| 48 | 53 | ||
| @@ -128,6 +133,8 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | |||
| 128 | target = NV_DMA_TARGET_PCI; | 133 | target = NV_DMA_TARGET_PCI; |
| 129 | } else { | 134 | } else { |
| 130 | target = NV_DMA_TARGET_AGP; | 135 | target = NV_DMA_TARGET_AGP; |
| 136 | if (dev_priv->card_type >= NV_50) | ||
| 137 | offset += dev_priv->vm_gart_base; | ||
| 131 | } | 138 | } |
| 132 | } else { | 139 | } else { |
| 133 | NV_ERROR(dev, "Bad DMA target, mem_type %d!\n", | 140 | NV_ERROR(dev, "Bad DMA target, mem_type %d!\n", |
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c index 6c2cf81716df..e7c100ba63a1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_object.c | |||
| @@ -885,11 +885,12 @@ int | |||
| 885 | nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, | 885 | nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, |
| 886 | struct nouveau_gpuobj **gpuobj_ret) | 886 | struct nouveau_gpuobj **gpuobj_ret) |
| 887 | { | 887 | { |
| 888 | struct drm_nouveau_private *dev_priv = chan->dev->dev_private; | 888 | struct drm_nouveau_private *dev_priv; |
| 889 | struct nouveau_gpuobj *gpuobj; | 889 | struct nouveau_gpuobj *gpuobj; |
| 890 | 890 | ||
| 891 | if (!chan || !gpuobj_ret || *gpuobj_ret != NULL) | 891 | if (!chan || !gpuobj_ret || *gpuobj_ret != NULL) |
| 892 | return -EINVAL; | 892 | return -EINVAL; |
| 893 | dev_priv = chan->dev->dev_private; | ||
| 893 | 894 | ||
| 894 | gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL); | 895 | gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL); |
| 895 | if (!gpuobj) | 896 | if (!gpuobj) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h index 251f1b3b38b9..aa9b310e41be 100644 --- a/drivers/gpu/drm/nouveau/nouveau_reg.h +++ b/drivers/gpu/drm/nouveau/nouveau_reg.h | |||
| @@ -99,6 +99,7 @@ | |||
| 99 | * the card will hang early on in the X init process. | 99 | * the card will hang early on in the X init process. |
| 100 | */ | 100 | */ |
| 101 | # define NV_PMC_ENABLE_UNK13 (1<<13) | 101 | # define NV_PMC_ENABLE_UNK13 (1<<13) |
| 102 | #define NV40_PMC_GRAPH_UNITS 0x00001540 | ||
| 102 | #define NV40_PMC_BACKLIGHT 0x000015f0 | 103 | #define NV40_PMC_BACKLIGHT 0x000015f0 |
| 103 | # define NV40_PMC_BACKLIGHT_MASK 0x001f0000 | 104 | # define NV40_PMC_BACKLIGHT_MASK 0x001f0000 |
| 104 | #define NV40_PMC_1700 0x00001700 | 105 | #define NV40_PMC_1700 0x00001700 |
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index 4c7f1e403e80..ed1590577b6c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c | |||
| @@ -54,11 +54,12 @@ static void | |||
| 54 | nouveau_sgdma_clear(struct ttm_backend *be) | 54 | nouveau_sgdma_clear(struct ttm_backend *be) |
| 55 | { | 55 | { |
| 56 | struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; | 56 | struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; |
| 57 | struct drm_device *dev = nvbe->dev; | 57 | struct drm_device *dev; |
| 58 | |||
| 59 | NV_DEBUG(nvbe->dev, "\n"); | ||
| 60 | 58 | ||
| 61 | if (nvbe && nvbe->pages) { | 59 | if (nvbe && nvbe->pages) { |
| 60 | dev = nvbe->dev; | ||
| 61 | NV_DEBUG(dev, "\n"); | ||
| 62 | |||
| 62 | if (nvbe->bound) | 63 | if (nvbe->bound) |
| 63 | be->func->unbind(be); | 64 | be->func->unbind(be); |
| 64 | 65 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index f2d0187ba152..a4851af5b05e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -310,6 +310,14 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 310 | static unsigned int | 310 | static unsigned int |
| 311 | nouveau_vga_set_decode(void *priv, bool state) | 311 | nouveau_vga_set_decode(void *priv, bool state) |
| 312 | { | 312 | { |
| 313 | struct drm_device *dev = priv; | ||
| 314 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 315 | |||
| 316 | if (dev_priv->chipset >= 0x40) | ||
| 317 | nv_wr32(dev, 0x88054, state); | ||
| 318 | else | ||
| 319 | nv_wr32(dev, 0x1854, state); | ||
| 320 | |||
| 313 | if (state) | 321 | if (state) |
| 314 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | | 322 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | |
| 315 | VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; | 323 | VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; |
| @@ -427,15 +435,19 @@ nouveau_card_init(struct drm_device *dev) | |||
| 427 | if (ret) | 435 | if (ret) |
| 428 | goto out_timer; | 436 | goto out_timer; |
| 429 | 437 | ||
| 430 | /* PGRAPH */ | 438 | if (nouveau_noaccel) |
| 431 | ret = engine->graph.init(dev); | 439 | engine->graph.accel_blocked = true; |
| 432 | if (ret) | 440 | else { |
| 433 | goto out_fb; | 441 | /* PGRAPH */ |
| 442 | ret = engine->graph.init(dev); | ||
| 443 | if (ret) | ||
| 444 | goto out_fb; | ||
| 434 | 445 | ||
| 435 | /* PFIFO */ | 446 | /* PFIFO */ |
| 436 | ret = engine->fifo.init(dev); | 447 | ret = engine->fifo.init(dev); |
| 437 | if (ret) | 448 | if (ret) |
| 438 | goto out_graph; | 449 | goto out_graph; |
| 450 | } | ||
| 439 | 451 | ||
| 440 | /* this call irq_preinstall, register irq handler and | 452 | /* this call irq_preinstall, register irq handler and |
| 441 | * call irq_postinstall | 453 | * call irq_postinstall |
| @@ -479,9 +491,11 @@ nouveau_card_init(struct drm_device *dev) | |||
| 479 | out_irq: | 491 | out_irq: |
| 480 | drm_irq_uninstall(dev); | 492 | drm_irq_uninstall(dev); |
| 481 | out_fifo: | 493 | out_fifo: |
| 482 | engine->fifo.takedown(dev); | 494 | if (!nouveau_noaccel) |
| 495 | engine->fifo.takedown(dev); | ||
| 483 | out_graph: | 496 | out_graph: |
| 484 | engine->graph.takedown(dev); | 497 | if (!nouveau_noaccel) |
| 498 | engine->graph.takedown(dev); | ||
| 485 | out_fb: | 499 | out_fb: |
| 486 | engine->fb.takedown(dev); | 500 | engine->fb.takedown(dev); |
| 487 | out_timer: | 501 | out_timer: |
| @@ -518,8 +532,10 @@ static void nouveau_card_takedown(struct drm_device *dev) | |||
| 518 | dev_priv->channel = NULL; | 532 | dev_priv->channel = NULL; |
| 519 | } | 533 | } |
| 520 | 534 | ||
| 521 | engine->fifo.takedown(dev); | 535 | if (!nouveau_noaccel) { |
| 522 | engine->graph.takedown(dev); | 536 | engine->fifo.takedown(dev); |
| 537 | engine->graph.takedown(dev); | ||
| 538 | } | ||
| 523 | engine->fb.takedown(dev); | 539 | engine->fb.takedown(dev); |
| 524 | engine->timer.takedown(dev); | 540 | engine->timer.takedown(dev); |
| 525 | engine->mc.takedown(dev); | 541 | engine->mc.takedown(dev); |
| @@ -817,6 +833,15 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data, | |||
| 817 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: | 833 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: |
| 818 | getparam->value = dev_priv->vm_vram_base; | 834 | getparam->value = dev_priv->vm_vram_base; |
| 819 | break; | 835 | break; |
| 836 | case NOUVEAU_GETPARAM_GRAPH_UNITS: | ||
| 837 | /* NV40 and NV50 versions are quite different, but register | ||
| 838 | * address is the same. User is supposed to know the card | ||
| 839 | * family anyway... */ | ||
| 840 | if (dev_priv->chipset >= 0x40) { | ||
| 841 | getparam->value = nv_rd32(dev, NV40_PMC_GRAPH_UNITS); | ||
| 842 | break; | ||
| 843 | } | ||
| 844 | /* FALLTHRU */ | ||
| 820 | default: | 845 | default: |
| 821 | NV_ERROR(dev, "unknown parameter %lld\n", getparam->param); | 846 | NV_ERROR(dev, "unknown parameter %lld\n", getparam->param); |
| 822 | return -EINVAL; | 847 | return -EINVAL; |
diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c index d910873c1368..fd01caabd5c3 100644 --- a/drivers/gpu/drm/nouveau/nv04_fbcon.c +++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include "nouveau_dma.h" | 27 | #include "nouveau_dma.h" |
| 28 | #include "nouveau_fbcon.h" | 28 | #include "nouveau_fbcon.h" |
| 29 | 29 | ||
| 30 | static void | 30 | void |
| 31 | nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | 31 | nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) |
| 32 | { | 32 | { |
| 33 | struct nouveau_fbcon_par *par = info->par; | 33 | struct nouveau_fbcon_par *par = info->par; |
| @@ -54,7 +54,7 @@ nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | |||
| 54 | FIRE_RING(chan); | 54 | FIRE_RING(chan); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | static void | 57 | void |
| 58 | nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | 58 | nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) |
| 59 | { | 59 | { |
| 60 | struct nouveau_fbcon_par *par = info->par; | 60 | struct nouveau_fbcon_par *par = info->par; |
| @@ -88,7 +88,7 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 88 | FIRE_RING(chan); | 88 | FIRE_RING(chan); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static void | 91 | void |
| 92 | nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | 92 | nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) |
| 93 | { | 93 | { |
| 94 | struct nouveau_fbcon_par *par = info->par; | 94 | struct nouveau_fbcon_par *par = info->par; |
| @@ -307,9 +307,6 @@ nv04_fbcon_accel_init(struct fb_info *info) | |||
| 307 | 307 | ||
| 308 | FIRE_RING(chan); | 308 | FIRE_RING(chan); |
| 309 | 309 | ||
| 310 | info->fbops->fb_fillrect = nv04_fbcon_fillrect; | ||
| 311 | info->fbops->fb_copyarea = nv04_fbcon_copyarea; | ||
| 312 | info->fbops->fb_imageblit = nv04_fbcon_imageblit; | ||
| 313 | return 0; | 310 | return 0; |
| 314 | } | 311 | } |
| 315 | 312 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c index 40b7360841f8..d1a651e3400c 100644 --- a/drivers/gpu/drm/nouveau/nv50_crtc.c +++ b/drivers/gpu/drm/nouveau/nv50_crtc.c | |||
| @@ -298,14 +298,17 @@ nv50_crtc_set_clock(struct drm_device *dev, int head, int pclk) | |||
| 298 | static void | 298 | static void |
| 299 | nv50_crtc_destroy(struct drm_crtc *crtc) | 299 | nv50_crtc_destroy(struct drm_crtc *crtc) |
| 300 | { | 300 | { |
| 301 | struct drm_device *dev = crtc->dev; | 301 | struct drm_device *dev; |
| 302 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | 302 | struct nouveau_crtc *nv_crtc; |
| 303 | |||
| 304 | NV_DEBUG_KMS(dev, "\n"); | ||
| 305 | 303 | ||
| 306 | if (!crtc) | 304 | if (!crtc) |
| 307 | return; | 305 | return; |
| 308 | 306 | ||
| 307 | dev = crtc->dev; | ||
| 308 | nv_crtc = nouveau_crtc(crtc); | ||
| 309 | |||
| 310 | NV_DEBUG_KMS(dev, "\n"); | ||
| 311 | |||
| 309 | drm_crtc_cleanup(&nv_crtc->base); | 312 | drm_crtc_cleanup(&nv_crtc->base); |
| 310 | 313 | ||
| 311 | nv50_cursor_fini(nv_crtc); | 314 | nv50_cursor_fini(nv_crtc); |
diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c index e4f279ee61cf..0f57cdf7ccb2 100644 --- a/drivers/gpu/drm/nouveau/nv50_fbcon.c +++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | #include "nouveau_dma.h" | 3 | #include "nouveau_dma.h" |
| 4 | #include "nouveau_fbcon.h" | 4 | #include "nouveau_fbcon.h" |
| 5 | 5 | ||
| 6 | static void | 6 | void |
| 7 | nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | 7 | nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) |
| 8 | { | 8 | { |
| 9 | struct nouveau_fbcon_par *par = info->par; | 9 | struct nouveau_fbcon_par *par = info->par; |
| @@ -46,7 +46,7 @@ nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 46 | FIRE_RING(chan); | 46 | FIRE_RING(chan); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | static void | 49 | void |
| 50 | nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | 50 | nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) |
| 51 | { | 51 | { |
| 52 | struct nouveau_fbcon_par *par = info->par; | 52 | struct nouveau_fbcon_par *par = info->par; |
| @@ -81,7 +81,7 @@ nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | |||
| 81 | FIRE_RING(chan); | 81 | FIRE_RING(chan); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | static void | 84 | void |
| 85 | nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | 85 | nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) |
| 86 | { | 86 | { |
| 87 | struct nouveau_fbcon_par *par = info->par; | 87 | struct nouveau_fbcon_par *par = info->par; |
| @@ -262,9 +262,6 @@ nv50_fbcon_accel_init(struct fb_info *info) | |||
| 262 | OUT_RING(chan, info->fix.smem_start - dev_priv->fb_phys + | 262 | OUT_RING(chan, info->fix.smem_start - dev_priv->fb_phys + |
| 263 | dev_priv->vm_vram_base); | 263 | dev_priv->vm_vram_base); |
| 264 | 264 | ||
| 265 | info->fbops->fb_fillrect = nv50_fbcon_fillrect; | ||
| 266 | info->fbops->fb_copyarea = nv50_fbcon_copyarea; | ||
| 267 | info->fbops->fb_imageblit = nv50_fbcon_imageblit; | ||
| 268 | return 0; | 265 | return 0; |
| 269 | } | 266 | } |
| 270 | 267 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_fifo.c b/drivers/gpu/drm/nouveau/nv50_fifo.c index 32b244bcb482..204a79ff10f4 100644 --- a/drivers/gpu/drm/nouveau/nv50_fifo.c +++ b/drivers/gpu/drm/nouveau/nv50_fifo.c | |||
| @@ -317,17 +317,20 @@ void | |||
| 317 | nv50_fifo_destroy_context(struct nouveau_channel *chan) | 317 | nv50_fifo_destroy_context(struct nouveau_channel *chan) |
| 318 | { | 318 | { |
| 319 | struct drm_device *dev = chan->dev; | 319 | struct drm_device *dev = chan->dev; |
| 320 | struct nouveau_gpuobj_ref *ramfc = chan->ramfc; | ||
| 320 | 321 | ||
| 321 | NV_DEBUG(dev, "ch%d\n", chan->id); | 322 | NV_DEBUG(dev, "ch%d\n", chan->id); |
| 322 | 323 | ||
| 323 | nouveau_gpuobj_ref_del(dev, &chan->ramfc); | 324 | /* This will ensure the channel is seen as disabled. */ |
| 324 | nouveau_gpuobj_ref_del(dev, &chan->cache); | 325 | chan->ramfc = NULL; |
| 325 | |||
| 326 | nv50_fifo_channel_disable(dev, chan->id, false); | 326 | nv50_fifo_channel_disable(dev, chan->id, false); |
| 327 | 327 | ||
| 328 | /* Dummy channel, also used on ch 127 */ | 328 | /* Dummy channel, also used on ch 127 */ |
| 329 | if (chan->id == 0) | 329 | if (chan->id == 0) |
| 330 | nv50_fifo_channel_disable(dev, 127, false); | 330 | nv50_fifo_channel_disable(dev, 127, false); |
| 331 | |||
| 332 | nouveau_gpuobj_ref_del(dev, &ramfc); | ||
| 333 | nouveau_gpuobj_ref_del(dev, &chan->cache); | ||
| 331 | } | 334 | } |
| 332 | 335 | ||
| 333 | int | 336 | int |
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c index 20319e59d368..6d504801b514 100644 --- a/drivers/gpu/drm/nouveau/nv50_graph.c +++ b/drivers/gpu/drm/nouveau/nv50_graph.c | |||
| @@ -165,6 +165,12 @@ nv50_graph_channel(struct drm_device *dev) | |||
| 165 | uint32_t inst; | 165 | uint32_t inst; |
| 166 | int i; | 166 | int i; |
| 167 | 167 | ||
| 168 | /* Be sure we're not in the middle of a context switch or bad things | ||
| 169 | * will happen, such as unloading the wrong pgraph context. | ||
| 170 | */ | ||
| 171 | if (!nv_wait(0x400300, 0x00000001, 0x00000000)) | ||
| 172 | NV_ERROR(dev, "Ctxprog is still running\n"); | ||
| 173 | |||
| 168 | inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR); | 174 | inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR); |
| 169 | if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED)) | 175 | if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED)) |
| 170 | return NULL; | 176 | return NULL; |
| @@ -275,7 +281,7 @@ nv50_graph_load_context(struct nouveau_channel *chan) | |||
| 275 | int | 281 | int |
| 276 | nv50_graph_unload_context(struct drm_device *dev) | 282 | nv50_graph_unload_context(struct drm_device *dev) |
| 277 | { | 283 | { |
| 278 | uint32_t inst, fifo = nv_rd32(dev, 0x400500); | 284 | uint32_t inst; |
| 279 | 285 | ||
| 280 | inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR); | 286 | inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR); |
| 281 | if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED)) | 287 | if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED)) |
| @@ -283,12 +289,10 @@ nv50_graph_unload_context(struct drm_device *dev) | |||
| 283 | inst &= NV50_PGRAPH_CTXCTL_CUR_INSTANCE; | 289 | inst &= NV50_PGRAPH_CTXCTL_CUR_INSTANCE; |
| 284 | 290 | ||
| 285 | nouveau_wait_for_idle(dev); | 291 | nouveau_wait_for_idle(dev); |
| 286 | nv_wr32(dev, 0x400500, fifo & ~1); | ||
| 287 | nv_wr32(dev, 0x400784, inst); | 292 | nv_wr32(dev, 0x400784, inst); |
| 288 | nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x20); | 293 | nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x20); |
| 289 | nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 0x01); | 294 | nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 0x01); |
| 290 | nouveau_wait_for_idle(dev); | 295 | nouveau_wait_for_idle(dev); |
| 291 | nv_wr32(dev, 0x400500, fifo); | ||
| 292 | 296 | ||
| 293 | nv_wr32(dev, NV50_PGRAPH_CTXCTL_CUR, inst); | 297 | nv_wr32(dev, NV50_PGRAPH_CTXCTL_CUR, inst); |
| 294 | return 0; | 298 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nv50_sor.c b/drivers/gpu/drm/nouveau/nv50_sor.c index ecf1936b8224..c2fff543b06f 100644 --- a/drivers/gpu/drm/nouveau/nv50_sor.c +++ b/drivers/gpu/drm/nouveau/nv50_sor.c | |||
| @@ -101,6 +101,7 @@ nv50_sor_dpms(struct drm_encoder *encoder, int mode) | |||
| 101 | struct nouveau_encoder *nvenc = nouveau_encoder(enc); | 101 | struct nouveau_encoder *nvenc = nouveau_encoder(enc); |
| 102 | 102 | ||
| 103 | if (nvenc == nv_encoder || | 103 | if (nvenc == nv_encoder || |
| 104 | nvenc->disconnect != nv50_sor_disconnect || | ||
| 104 | nvenc->dcb->or != nv_encoder->dcb->or) | 105 | nvenc->dcb->or != nv_encoder->dcb->or) |
| 105 | continue; | 106 | continue; |
| 106 | 107 | ||
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig index 5982321be4d5..1c02d23f6fcc 100644 --- a/drivers/gpu/drm/radeon/Kconfig +++ b/drivers/gpu/drm/radeon/Kconfig | |||
| @@ -1,10 +1,14 @@ | |||
| 1 | config DRM_RADEON_KMS | 1 | config DRM_RADEON_KMS |
| 2 | bool "Enable modesetting on radeon by default" | 2 | bool "Enable modesetting on radeon by default - NEW DRIVER" |
| 3 | depends on DRM_RADEON | 3 | depends on DRM_RADEON |
| 4 | help | 4 | help |
| 5 | Choose this option if you want kernel modesetting enabled by default, | 5 | Choose this option if you want kernel modesetting enabled by default. |
| 6 | and you have a new enough userspace to support this. Running old | 6 | |
| 7 | userspaces with this enabled will cause pain. | 7 | This is a completely new driver. It's only part of the existing drm |
| 8 | for compatibility reasons. It requires an entirely different graphics | ||
| 9 | stack above it and works very differently from the old drm stack. | ||
| 10 | i.e. don't enable this unless you know what you are doing it may | ||
| 11 | cause issues or bugs compared to the previous userspace driver stack. | ||
| 8 | 12 | ||
| 9 | When kernel modesetting is enabled the IOCTL of radeon/drm | 13 | When kernel modesetting is enabled the IOCTL of radeon/drm |
| 10 | driver are considered as invalid and an error message is printed | 14 | driver are considered as invalid and an error message is printed |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 71060114d5de..b32eeea5bb8b 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -332,11 +332,13 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes, | |||
| 332 | PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION args; | 332 | PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION args; |
| 333 | int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction); | 333 | int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction); |
| 334 | unsigned char *base; | 334 | unsigned char *base; |
| 335 | int retry_count = 0; | ||
| 335 | 336 | ||
| 336 | memset(&args, 0, sizeof(args)); | 337 | memset(&args, 0, sizeof(args)); |
| 337 | 338 | ||
| 338 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; | 339 | base = (unsigned char *)rdev->mode_info.atom_context->scratch; |
| 339 | 340 | ||
| 341 | retry: | ||
| 340 | memcpy(base, req_bytes, num_bytes); | 342 | memcpy(base, req_bytes, num_bytes); |
| 341 | 343 | ||
| 342 | args.lpAuxRequest = 0; | 344 | args.lpAuxRequest = 0; |
| @@ -347,10 +349,12 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes, | |||
| 347 | 349 | ||
| 348 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 350 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
| 349 | 351 | ||
| 350 | if (args.ucReplyStatus) { | 352 | if (args.ucReplyStatus && !args.ucDataOutLen) { |
| 351 | DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x\n", | 353 | if (args.ucReplyStatus == 0x20 && retry_count < 10) |
| 354 | goto retry; | ||
| 355 | DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x after %d retries\n", | ||
| 352 | req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], | 356 | req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], |
| 353 | chan->rec.i2c_id, args.ucReplyStatus); | 357 | chan->rec.i2c_id, args.ucReplyStatus, retry_count); |
| 354 | return false; | 358 | return false; |
| 355 | } | 359 | } |
| 356 | 360 | ||
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 11c9a3fe6810..c0d4650cdb79 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -354,11 +354,17 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
| 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 354 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | /* Who ever call radeon_fence_emit should call ring_lock and ask | ||
| 358 | * for enough space (today caller are ib schedule and buffer move) */ | ||
| 357 | void r100_fence_ring_emit(struct radeon_device *rdev, | 359 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| 358 | struct radeon_fence *fence) | 360 | struct radeon_fence *fence) |
| 359 | { | 361 | { |
| 360 | /* Who ever call radeon_fence_emit should call ring_lock and ask | 362 | /* We have to make sure that caches are flushed before |
| 361 | * for enough space (today caller are ib schedule and buffer move) */ | 363 | * CPU might read something from VRAM. */ |
| 364 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 365 | radeon_ring_write(rdev, RADEON_RB3D_DC_FLUSH_ALL); | ||
| 366 | radeon_ring_write(rdev, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); | ||
| 367 | radeon_ring_write(rdev, RADEON_RB3D_ZC_FLUSH_ALL); | ||
| 362 | /* Wait until IDLE & CLEAN */ | 368 | /* Wait until IDLE & CLEAN */ |
| 363 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 369 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
| 364 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 370 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); |
| @@ -3369,7 +3375,6 @@ int r100_suspend(struct radeon_device *rdev) | |||
| 3369 | 3375 | ||
| 3370 | void r100_fini(struct radeon_device *rdev) | 3376 | void r100_fini(struct radeon_device *rdev) |
| 3371 | { | 3377 | { |
| 3372 | r100_suspend(rdev); | ||
| 3373 | r100_cp_fini(rdev); | 3378 | r100_cp_fini(rdev); |
| 3374 | r100_wb_fini(rdev); | 3379 | r100_wb_fini(rdev); |
| 3375 | r100_ib_fini(rdev); | 3380 | r100_ib_fini(rdev); |
| @@ -3481,13 +3486,12 @@ int r100_init(struct radeon_device *rdev) | |||
| 3481 | if (r) { | 3486 | if (r) { |
| 3482 | /* Somethings want wront with the accel init stop accel */ | 3487 | /* Somethings want wront with the accel init stop accel */ |
| 3483 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 3488 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 3484 | r100_suspend(rdev); | ||
| 3485 | r100_cp_fini(rdev); | 3489 | r100_cp_fini(rdev); |
| 3486 | r100_wb_fini(rdev); | 3490 | r100_wb_fini(rdev); |
| 3487 | r100_ib_fini(rdev); | 3491 | r100_ib_fini(rdev); |
| 3492 | radeon_irq_kms_fini(rdev); | ||
| 3488 | if (rdev->flags & RADEON_IS_PCI) | 3493 | if (rdev->flags & RADEON_IS_PCI) |
| 3489 | r100_pci_gart_fini(rdev); | 3494 | r100_pci_gart_fini(rdev); |
| 3490 | radeon_irq_kms_fini(rdev); | ||
| 3491 | rdev->accel_working = false; | 3495 | rdev->accel_working = false; |
| 3492 | } | 3496 | } |
| 3493 | return 0; | 3497 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 0051d11b907c..43b55a030b4d 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -506,11 +506,14 @@ void r300_vram_info(struct radeon_device *rdev) | |||
| 506 | 506 | ||
| 507 | /* DDR for all card after R300 & IGP */ | 507 | /* DDR for all card after R300 & IGP */ |
| 508 | rdev->mc.vram_is_ddr = true; | 508 | rdev->mc.vram_is_ddr = true; |
| 509 | |||
| 509 | tmp = RREG32(RADEON_MEM_CNTL); | 510 | tmp = RREG32(RADEON_MEM_CNTL); |
| 510 | if (tmp & R300_MEM_NUM_CHANNELS_MASK) { | 511 | tmp &= R300_MEM_NUM_CHANNELS_MASK; |
| 511 | rdev->mc.vram_width = 128; | 512 | switch (tmp) { |
| 512 | } else { | 513 | case 0: rdev->mc.vram_width = 64; break; |
| 513 | rdev->mc.vram_width = 64; | 514 | case 1: rdev->mc.vram_width = 128; break; |
| 515 | case 2: rdev->mc.vram_width = 256; break; | ||
| 516 | default: rdev->mc.vram_width = 128; break; | ||
| 514 | } | 517 | } |
| 515 | 518 | ||
| 516 | r100_vram_init_sizes(rdev); | 519 | r100_vram_init_sizes(rdev); |
| @@ -1327,7 +1330,6 @@ int r300_suspend(struct radeon_device *rdev) | |||
| 1327 | 1330 | ||
| 1328 | void r300_fini(struct radeon_device *rdev) | 1331 | void r300_fini(struct radeon_device *rdev) |
| 1329 | { | 1332 | { |
| 1330 | r300_suspend(rdev); | ||
| 1331 | r100_cp_fini(rdev); | 1333 | r100_cp_fini(rdev); |
| 1332 | r100_wb_fini(rdev); | 1334 | r100_wb_fini(rdev); |
| 1333 | r100_ib_fini(rdev); | 1335 | r100_ib_fini(rdev); |
| @@ -1418,15 +1420,15 @@ int r300_init(struct radeon_device *rdev) | |||
| 1418 | if (r) { | 1420 | if (r) { |
| 1419 | /* Somethings want wront with the accel init stop accel */ | 1421 | /* Somethings want wront with the accel init stop accel */ |
| 1420 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 1422 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 1421 | r300_suspend(rdev); | ||
| 1422 | r100_cp_fini(rdev); | 1423 | r100_cp_fini(rdev); |
| 1423 | r100_wb_fini(rdev); | 1424 | r100_wb_fini(rdev); |
| 1424 | r100_ib_fini(rdev); | 1425 | r100_ib_fini(rdev); |
| 1426 | radeon_irq_kms_fini(rdev); | ||
| 1425 | if (rdev->flags & RADEON_IS_PCIE) | 1427 | if (rdev->flags & RADEON_IS_PCIE) |
| 1426 | rv370_pcie_gart_fini(rdev); | 1428 | rv370_pcie_gart_fini(rdev); |
| 1427 | if (rdev->flags & RADEON_IS_PCI) | 1429 | if (rdev->flags & RADEON_IS_PCI) |
| 1428 | r100_pci_gart_fini(rdev); | 1430 | r100_pci_gart_fini(rdev); |
| 1429 | radeon_irq_kms_fini(rdev); | 1431 | radeon_agp_fini(rdev); |
| 1430 | rdev->accel_working = false; | 1432 | rdev->accel_working = false; |
| 1431 | } | 1433 | } |
| 1432 | return 0; | 1434 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 4526faaacca8..d9373246c97f 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -389,16 +389,15 @@ int r420_init(struct radeon_device *rdev) | |||
| 389 | if (r) { | 389 | if (r) { |
| 390 | /* Somethings want wront with the accel init stop accel */ | 390 | /* Somethings want wront with the accel init stop accel */ |
| 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 391 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 392 | r420_suspend(rdev); | ||
| 393 | r100_cp_fini(rdev); | 392 | r100_cp_fini(rdev); |
| 394 | r100_wb_fini(rdev); | 393 | r100_wb_fini(rdev); |
| 395 | r100_ib_fini(rdev); | 394 | r100_ib_fini(rdev); |
| 395 | radeon_irq_kms_fini(rdev); | ||
| 396 | if (rdev->flags & RADEON_IS_PCIE) | 396 | if (rdev->flags & RADEON_IS_PCIE) |
| 397 | rv370_pcie_gart_fini(rdev); | 397 | rv370_pcie_gart_fini(rdev); |
| 398 | if (rdev->flags & RADEON_IS_PCI) | 398 | if (rdev->flags & RADEON_IS_PCI) |
| 399 | r100_pci_gart_fini(rdev); | 399 | r100_pci_gart_fini(rdev); |
| 400 | radeon_agp_fini(rdev); | 400 | radeon_agp_fini(rdev); |
| 401 | radeon_irq_kms_fini(rdev); | ||
| 402 | rdev->accel_working = false; | 401 | rdev->accel_working = false; |
| 403 | } | 402 | } |
| 404 | return 0; | 403 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 9a189072f2b9..ddf5731eba0d 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -294,13 +294,12 @@ int r520_init(struct radeon_device *rdev) | |||
| 294 | if (r) { | 294 | if (r) { |
| 295 | /* Somethings want wront with the accel init stop accel */ | 295 | /* Somethings want wront with the accel init stop accel */ |
| 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 296 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 297 | rv515_suspend(rdev); | ||
| 298 | r100_cp_fini(rdev); | 297 | r100_cp_fini(rdev); |
| 299 | r100_wb_fini(rdev); | 298 | r100_wb_fini(rdev); |
| 300 | r100_ib_fini(rdev); | 299 | r100_ib_fini(rdev); |
| 300 | radeon_irq_kms_fini(rdev); | ||
| 301 | rv370_pcie_gart_fini(rdev); | 301 | rv370_pcie_gart_fini(rdev); |
| 302 | radeon_agp_fini(rdev); | 302 | radeon_agp_fini(rdev); |
| 303 | radeon_irq_kms_fini(rdev); | ||
| 304 | rdev->accel_working = false; | 303 | rdev->accel_working = false; |
| 305 | } | 304 | } |
| 306 | return 0; | 305 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1b6d0001b20e..2ffcf5a03551 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1654,6 +1654,12 @@ void r600_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1654 | rdev->cp.align_mask = 16 - 1; | 1654 | rdev->cp.align_mask = 16 - 1; |
| 1655 | } | 1655 | } |
| 1656 | 1656 | ||
| 1657 | void r600_cp_fini(struct radeon_device *rdev) | ||
| 1658 | { | ||
| 1659 | r600_cp_stop(rdev); | ||
| 1660 | radeon_ring_fini(rdev); | ||
| 1661 | } | ||
| 1662 | |||
| 1657 | 1663 | ||
| 1658 | /* | 1664 | /* |
| 1659 | * GPU scratch registers helpers function. | 1665 | * GPU scratch registers helpers function. |
| @@ -1861,6 +1867,12 @@ int r600_startup(struct radeon_device *rdev) | |||
| 1861 | return r; | 1867 | return r; |
| 1862 | } | 1868 | } |
| 1863 | r600_gpu_init(rdev); | 1869 | r600_gpu_init(rdev); |
| 1870 | r = r600_blit_init(rdev); | ||
| 1871 | if (r) { | ||
| 1872 | r600_blit_fini(rdev); | ||
| 1873 | rdev->asic->copy = NULL; | ||
| 1874 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1875 | } | ||
| 1864 | /* pin copy shader into vram */ | 1876 | /* pin copy shader into vram */ |
| 1865 | if (rdev->r600_blit.shader_obj) { | 1877 | if (rdev->r600_blit.shader_obj) { |
| 1866 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 1878 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -1938,6 +1950,13 @@ int r600_resume(struct radeon_device *rdev) | |||
| 1938 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1950 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
| 1939 | return r; | 1951 | return r; |
| 1940 | } | 1952 | } |
| 1953 | |||
| 1954 | r = r600_audio_init(rdev); | ||
| 1955 | if (r) { | ||
| 1956 | DRM_ERROR("radeon: audio resume failed\n"); | ||
| 1957 | return r; | ||
| 1958 | } | ||
| 1959 | |||
| 1941 | return r; | 1960 | return r; |
| 1942 | } | 1961 | } |
| 1943 | 1962 | ||
| @@ -1945,6 +1964,7 @@ int r600_suspend(struct radeon_device *rdev) | |||
| 1945 | { | 1964 | { |
| 1946 | int r; | 1965 | int r; |
| 1947 | 1966 | ||
| 1967 | r600_audio_fini(rdev); | ||
| 1948 | /* FIXME: we should wait for ring to be empty */ | 1968 | /* FIXME: we should wait for ring to be empty */ |
| 1949 | r600_cp_stop(rdev); | 1969 | r600_cp_stop(rdev); |
| 1950 | rdev->cp.ready = false; | 1970 | rdev->cp.ready = false; |
| @@ -2045,19 +2065,15 @@ int r600_init(struct radeon_device *rdev) | |||
| 2045 | r = r600_pcie_gart_init(rdev); | 2065 | r = r600_pcie_gart_init(rdev); |
| 2046 | if (r) | 2066 | if (r) |
| 2047 | return r; | 2067 | return r; |
| 2048 | r = r600_blit_init(rdev); | ||
| 2049 | if (r) { | ||
| 2050 | r600_blit_fini(rdev); | ||
| 2051 | rdev->asic->copy = NULL; | ||
| 2052 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 2053 | } | ||
| 2054 | 2068 | ||
| 2055 | rdev->accel_working = true; | 2069 | rdev->accel_working = true; |
| 2056 | r = r600_startup(rdev); | 2070 | r = r600_startup(rdev); |
| 2057 | if (r) { | 2071 | if (r) { |
| 2058 | r600_suspend(rdev); | 2072 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 2073 | r600_cp_fini(rdev); | ||
| 2059 | r600_wb_fini(rdev); | 2074 | r600_wb_fini(rdev); |
| 2060 | radeon_ring_fini(rdev); | 2075 | r600_irq_fini(rdev); |
| 2076 | radeon_irq_kms_fini(rdev); | ||
| 2061 | r600_pcie_gart_fini(rdev); | 2077 | r600_pcie_gart_fini(rdev); |
| 2062 | rdev->accel_working = false; | 2078 | rdev->accel_working = false; |
| 2063 | } | 2079 | } |
| @@ -2083,20 +2099,17 @@ int r600_init(struct radeon_device *rdev) | |||
| 2083 | 2099 | ||
| 2084 | void r600_fini(struct radeon_device *rdev) | 2100 | void r600_fini(struct radeon_device *rdev) |
| 2085 | { | 2101 | { |
| 2086 | /* Suspend operations */ | ||
| 2087 | r600_suspend(rdev); | ||
| 2088 | |||
| 2089 | r600_audio_fini(rdev); | 2102 | r600_audio_fini(rdev); |
| 2090 | r600_blit_fini(rdev); | 2103 | r600_blit_fini(rdev); |
| 2104 | r600_cp_fini(rdev); | ||
| 2105 | r600_wb_fini(rdev); | ||
| 2091 | r600_irq_fini(rdev); | 2106 | r600_irq_fini(rdev); |
| 2092 | radeon_irq_kms_fini(rdev); | 2107 | radeon_irq_kms_fini(rdev); |
| 2093 | radeon_ring_fini(rdev); | ||
| 2094 | r600_wb_fini(rdev); | ||
| 2095 | r600_pcie_gart_fini(rdev); | 2108 | r600_pcie_gart_fini(rdev); |
| 2109 | radeon_agp_fini(rdev); | ||
| 2096 | radeon_gem_fini(rdev); | 2110 | radeon_gem_fini(rdev); |
| 2097 | radeon_fence_driver_fini(rdev); | 2111 | radeon_fence_driver_fini(rdev); |
| 2098 | radeon_clocks_fini(rdev); | 2112 | radeon_clocks_fini(rdev); |
| 2099 | radeon_agp_fini(rdev); | ||
| 2100 | radeon_bo_fini(rdev); | 2113 | radeon_bo_fini(rdev); |
| 2101 | radeon_atombios_fini(rdev); | 2114 | radeon_atombios_fini(rdev); |
| 2102 | kfree(rdev->bios); | 2115 | kfree(rdev->bios); |
| @@ -2900,3 +2913,18 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev) | |||
| 2900 | return 0; | 2913 | return 0; |
| 2901 | #endif | 2914 | #endif |
| 2902 | } | 2915 | } |
| 2916 | |||
| 2917 | /** | ||
| 2918 | * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl | ||
| 2919 | * rdev: radeon device structure | ||
| 2920 | * bo: buffer object struct which userspace is waiting for idle | ||
| 2921 | * | ||
| 2922 | * Some R6XX/R7XX doesn't seems to take into account HDP flush performed | ||
| 2923 | * through ring buffer, this leads to corruption in rendering, see | ||
| 2924 | * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we | ||
| 2925 | * directly perform HDP flush by writing register through MMIO. | ||
| 2926 | */ | ||
| 2927 | void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) | ||
| 2928 | { | ||
| 2929 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
| 2930 | } | ||
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 99e2c3891a7d..0dcb6904c4ff 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | */ | 35 | */ |
| 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | 36 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
| 37 | { | 37 | { |
| 38 | return rdev->family >= CHIP_R600 | 38 | return (rdev->family >= CHIP_R600 && rdev->family < CHIP_RV710) |
| 39 | || rdev->family == CHIP_RS600 | 39 | || rdev->family == CHIP_RS600 |
| 40 | || rdev->family == CHIP_RS690 | 40 | || rdev->family == CHIP_RS690 |
| 41 | || rdev->family == CHIP_RS740; | 41 | || rdev->family == CHIP_RS740; |
| @@ -261,7 +261,6 @@ void r600_audio_fini(struct radeon_device *rdev) | |||
| 261 | if (!r600_audio_chipset_supported(rdev)) | 261 | if (!r600_audio_chipset_supported(rdev)) |
| 262 | return; | 262 | return; |
| 263 | 263 | ||
| 264 | WREG32_P(R600_AUDIO_ENABLE, 0x0, ~0x81000000); | ||
| 265 | |||
| 266 | del_timer(&rdev->audio_timer); | 264 | del_timer(&rdev->audio_timer); |
| 265 | WREG32_P(R600_AUDIO_ENABLE, 0x0, ~0x81000000); | ||
| 267 | } | 266 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2d5f2bfa7201..f57480ba1355 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -661,6 +661,13 @@ struct radeon_asic { | |||
| 661 | void (*hpd_fini)(struct radeon_device *rdev); | 661 | void (*hpd_fini)(struct radeon_device *rdev); |
| 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 662 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 663 | void (*hpd_set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 664 | /* ioctl hw specific callback. Some hw might want to perform special | ||
| 665 | * operation on specific ioctl. For instance on wait idle some hw | ||
| 666 | * might want to perform and HDP flush through MMIO as it seems that | ||
| 667 | * some R6XX/R7XX hw doesn't take HDP flush into account if programmed | ||
| 668 | * through ring. | ||
| 669 | */ | ||
| 670 | void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 664 | }; | 671 | }; |
| 665 | 672 | ||
| 666 | /* | 673 | /* |
| @@ -1143,6 +1150,7 @@ extern bool r600_card_posted(struct radeon_device *rdev); | |||
| 1143 | extern void r600_cp_stop(struct radeon_device *rdev); | 1150 | extern void r600_cp_stop(struct radeon_device *rdev); |
| 1144 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); | 1151 | extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); |
| 1145 | extern int r600_cp_resume(struct radeon_device *rdev); | 1152 | extern int r600_cp_resume(struct radeon_device *rdev); |
| 1153 | extern void r600_cp_fini(struct radeon_device *rdev); | ||
| 1146 | extern int r600_count_pipe_bits(uint32_t val); | 1154 | extern int r600_count_pipe_bits(uint32_t val); |
| 1147 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); | 1155 | extern int r600_gart_clear_page(struct radeon_device *rdev, int i); |
| 1148 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); | 1156 | extern int r600_mc_wait_for_idle(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index f2fbd2e4e9df..05ee1aeac3fd 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -117,6 +117,7 @@ static struct radeon_asic r100_asic = { | |||
| 117 | .hpd_fini = &r100_hpd_fini, | 117 | .hpd_fini = &r100_hpd_fini, |
| 118 | .hpd_sense = &r100_hpd_sense, | 118 | .hpd_sense = &r100_hpd_sense, |
| 119 | .hpd_set_polarity = &r100_hpd_set_polarity, | 119 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 120 | .ioctl_wait_idle = NULL, | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | 123 | ||
| @@ -176,6 +177,7 @@ static struct radeon_asic r300_asic = { | |||
| 176 | .hpd_fini = &r100_hpd_fini, | 177 | .hpd_fini = &r100_hpd_fini, |
| 177 | .hpd_sense = &r100_hpd_sense, | 178 | .hpd_sense = &r100_hpd_sense, |
| 178 | .hpd_set_polarity = &r100_hpd_set_polarity, | 179 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 180 | .ioctl_wait_idle = NULL, | ||
| 179 | }; | 181 | }; |
| 180 | 182 | ||
| 181 | /* | 183 | /* |
| @@ -219,6 +221,7 @@ static struct radeon_asic r420_asic = { | |||
| 219 | .hpd_fini = &r100_hpd_fini, | 221 | .hpd_fini = &r100_hpd_fini, |
| 220 | .hpd_sense = &r100_hpd_sense, | 222 | .hpd_sense = &r100_hpd_sense, |
| 221 | .hpd_set_polarity = &r100_hpd_set_polarity, | 223 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 224 | .ioctl_wait_idle = NULL, | ||
| 222 | }; | 225 | }; |
| 223 | 226 | ||
| 224 | 227 | ||
| @@ -267,6 +270,7 @@ static struct radeon_asic rs400_asic = { | |||
| 267 | .hpd_fini = &r100_hpd_fini, | 270 | .hpd_fini = &r100_hpd_fini, |
| 268 | .hpd_sense = &r100_hpd_sense, | 271 | .hpd_sense = &r100_hpd_sense, |
| 269 | .hpd_set_polarity = &r100_hpd_set_polarity, | 272 | .hpd_set_polarity = &r100_hpd_set_polarity, |
| 273 | .ioctl_wait_idle = NULL, | ||
| 270 | }; | 274 | }; |
| 271 | 275 | ||
| 272 | 276 | ||
| @@ -323,6 +327,7 @@ static struct radeon_asic rs600_asic = { | |||
| 323 | .hpd_fini = &rs600_hpd_fini, | 327 | .hpd_fini = &rs600_hpd_fini, |
| 324 | .hpd_sense = &rs600_hpd_sense, | 328 | .hpd_sense = &rs600_hpd_sense, |
| 325 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 329 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 330 | .ioctl_wait_idle = NULL, | ||
| 326 | }; | 331 | }; |
| 327 | 332 | ||
| 328 | 333 | ||
| @@ -370,6 +375,7 @@ static struct radeon_asic rs690_asic = { | |||
| 370 | .hpd_fini = &rs600_hpd_fini, | 375 | .hpd_fini = &rs600_hpd_fini, |
| 371 | .hpd_sense = &rs600_hpd_sense, | 376 | .hpd_sense = &rs600_hpd_sense, |
| 372 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 377 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 378 | .ioctl_wait_idle = NULL, | ||
| 373 | }; | 379 | }; |
| 374 | 380 | ||
| 375 | 381 | ||
| @@ -421,6 +427,7 @@ static struct radeon_asic rv515_asic = { | |||
| 421 | .hpd_fini = &rs600_hpd_fini, | 427 | .hpd_fini = &rs600_hpd_fini, |
| 422 | .hpd_sense = &rs600_hpd_sense, | 428 | .hpd_sense = &rs600_hpd_sense, |
| 423 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 429 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 430 | .ioctl_wait_idle = NULL, | ||
| 424 | }; | 431 | }; |
| 425 | 432 | ||
| 426 | 433 | ||
| @@ -463,6 +470,7 @@ static struct radeon_asic r520_asic = { | |||
| 463 | .hpd_fini = &rs600_hpd_fini, | 470 | .hpd_fini = &rs600_hpd_fini, |
| 464 | .hpd_sense = &rs600_hpd_sense, | 471 | .hpd_sense = &rs600_hpd_sense, |
| 465 | .hpd_set_polarity = &rs600_hpd_set_polarity, | 472 | .hpd_set_polarity = &rs600_hpd_set_polarity, |
| 473 | .ioctl_wait_idle = NULL, | ||
| 466 | }; | 474 | }; |
| 467 | 475 | ||
| 468 | /* | 476 | /* |
| @@ -504,6 +512,7 @@ void r600_hpd_fini(struct radeon_device *rdev); | |||
| 504 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 512 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| 505 | void r600_hpd_set_polarity(struct radeon_device *rdev, | 513 | void r600_hpd_set_polarity(struct radeon_device *rdev, |
| 506 | enum radeon_hpd_id hpd); | 514 | enum radeon_hpd_id hpd); |
| 515 | extern void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo); | ||
| 507 | 516 | ||
| 508 | static struct radeon_asic r600_asic = { | 517 | static struct radeon_asic r600_asic = { |
| 509 | .init = &r600_init, | 518 | .init = &r600_init, |
| @@ -538,6 +547,7 @@ static struct radeon_asic r600_asic = { | |||
| 538 | .hpd_fini = &r600_hpd_fini, | 547 | .hpd_fini = &r600_hpd_fini, |
| 539 | .hpd_sense = &r600_hpd_sense, | 548 | .hpd_sense = &r600_hpd_sense, |
| 540 | .hpd_set_polarity = &r600_hpd_set_polarity, | 549 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 550 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 541 | }; | 551 | }; |
| 542 | 552 | ||
| 543 | /* | 553 | /* |
| @@ -582,6 +592,7 @@ static struct radeon_asic rv770_asic = { | |||
| 582 | .hpd_fini = &r600_hpd_fini, | 592 | .hpd_fini = &r600_hpd_fini, |
| 583 | .hpd_sense = &r600_hpd_sense, | 593 | .hpd_sense = &r600_hpd_sense, |
| 584 | .hpd_set_polarity = &r600_hpd_set_polarity, | 594 | .hpd_set_polarity = &r600_hpd_set_polarity, |
| 595 | .ioctl_wait_idle = r600_ioctl_wait_idle, | ||
| 585 | }; | 596 | }; |
| 586 | 597 | ||
| 587 | #endif | 598 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index fa82ca74324e..2dcda6115874 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -287,6 +287,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
| 287 | *connector_type = DRM_MODE_CONNECTOR_DVID; | 287 | *connector_type = DRM_MODE_CONNECTOR_DVID; |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | /* XFX Pine Group device rv730 reports no VGA DDC lines | ||
| 291 | * even though they are wired up to record 0x93 | ||
| 292 | */ | ||
| 293 | if ((dev->pdev->device == 0x9498) && | ||
| 294 | (dev->pdev->subsystem_vendor == 0x1682) && | ||
| 295 | (dev->pdev->subsystem_device == 0x2452)) { | ||
| 296 | struct radeon_device *rdev = dev->dev_private; | ||
| 297 | *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93); | ||
| 298 | } | ||
| 290 | return true; | 299 | return true; |
| 291 | } | 300 | } |
| 292 | 301 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c index 4ddfd4b5bc51..7932dc4d6b90 100644 --- a/drivers/gpu/drm/radeon/radeon_benchmark.c +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c | |||
| @@ -65,31 +65,42 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize, | |||
| 65 | if (r) { | 65 | if (r) { |
| 66 | goto out_cleanup; | 66 | goto out_cleanup; |
| 67 | } | 67 | } |
| 68 | start_jiffies = jiffies; | 68 | |
| 69 | for (i = 0; i < n; i++) { | 69 | /* r100 doesn't have dma engine so skip the test */ |
| 70 | r = radeon_fence_create(rdev, &fence); | 70 | if (rdev->asic->copy_dma) { |
| 71 | if (r) { | 71 | |
| 72 | goto out_cleanup; | 72 | start_jiffies = jiffies; |
| 73 | for (i = 0; i < n; i++) { | ||
| 74 | r = radeon_fence_create(rdev, &fence); | ||
| 75 | if (r) { | ||
| 76 | goto out_cleanup; | ||
| 77 | } | ||
| 78 | |||
| 79 | r = radeon_copy_dma(rdev, saddr, daddr, | ||
| 80 | size / RADEON_GPU_PAGE_SIZE, fence); | ||
| 81 | |||
| 82 | if (r) { | ||
| 83 | goto out_cleanup; | ||
| 84 | } | ||
| 85 | r = radeon_fence_wait(fence, false); | ||
| 86 | if (r) { | ||
| 87 | goto out_cleanup; | ||
| 88 | } | ||
| 89 | radeon_fence_unref(&fence); | ||
| 73 | } | 90 | } |
| 74 | r = radeon_copy_dma(rdev, saddr, daddr, size / RADEON_GPU_PAGE_SIZE, fence); | 91 | end_jiffies = jiffies; |
| 75 | if (r) { | 92 | time = end_jiffies - start_jiffies; |
| 76 | goto out_cleanup; | 93 | time = jiffies_to_msecs(time); |
| 94 | if (time > 0) { | ||
| 95 | i = ((n * size) >> 10) / time; | ||
| 96 | printk(KERN_INFO "radeon: dma %u bo moves of %ukb from" | ||
| 97 | " %d to %d in %lums (%ukb/ms %ukb/s %uM/s)\n", | ||
| 98 | n, size >> 10, | ||
| 99 | sdomain, ddomain, time, | ||
| 100 | i, i * 1000, (i * 1000) / 1024); | ||
| 77 | } | 101 | } |
| 78 | r = radeon_fence_wait(fence, false); | ||
| 79 | if (r) { | ||
| 80 | goto out_cleanup; | ||
| 81 | } | ||
| 82 | radeon_fence_unref(&fence); | ||
| 83 | } | ||
| 84 | end_jiffies = jiffies; | ||
| 85 | time = end_jiffies - start_jiffies; | ||
| 86 | time = jiffies_to_msecs(time); | ||
| 87 | if (time > 0) { | ||
| 88 | i = ((n * size) >> 10) / time; | ||
| 89 | printk(KERN_INFO "radeon: dma %u bo moves of %ukb from %d to %d" | ||
| 90 | " in %lums (%ukb/ms %ukb/s %uM/s)\n", n, size >> 10, | ||
| 91 | sdomain, ddomain, time, i, i * 1000, (i * 1000) / 1024); | ||
| 92 | } | 102 | } |
| 103 | |||
| 93 | start_jiffies = jiffies; | 104 | start_jiffies = jiffies; |
| 94 | for (i = 0; i < n; i++) { | 105 | for (i = 0; i < n; i++) { |
| 95 | r = radeon_fence_create(rdev, &fence); | 106 | r = radeon_fence_create(rdev, &fence); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 579c8920e081..e7b19440102e 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -971,8 +971,7 @@ struct radeon_encoder_lvds *radeon_combios_get_lvds_info(struct radeon_encoder | |||
| 971 | lvds->native_mode.vdisplay); | 971 | lvds->native_mode.vdisplay); |
| 972 | 972 | ||
| 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); | 973 | lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); |
| 974 | if (lvds->panel_vcc_delay > 2000 || lvds->panel_vcc_delay < 0) | 974 | lvds->panel_vcc_delay = min_t(u16, lvds->panel_vcc_delay, 2000); |
| 975 | lvds->panel_vcc_delay = 2000; | ||
| 976 | 975 | ||
| 977 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); | 976 | lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); |
| 978 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; | 977 | lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 55266416fa47..238188540017 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -580,16 +580,18 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect | |||
| 580 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 580 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 581 | struct drm_encoder *encoder; | 581 | struct drm_encoder *encoder; |
| 582 | struct drm_encoder_helper_funcs *encoder_funcs; | 582 | struct drm_encoder_helper_funcs *encoder_funcs; |
| 583 | bool dret; | 583 | bool dret = false; |
| 584 | enum drm_connector_status ret = connector_status_disconnected; | 584 | enum drm_connector_status ret = connector_status_disconnected; |
| 585 | 585 | ||
| 586 | encoder = radeon_best_single_encoder(connector); | 586 | encoder = radeon_best_single_encoder(connector); |
| 587 | if (!encoder) | 587 | if (!encoder) |
| 588 | ret = connector_status_disconnected; | 588 | ret = connector_status_disconnected; |
| 589 | 589 | ||
| 590 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 1); | 590 | if (radeon_connector->ddc_bus) { |
| 591 | dret = radeon_ddc_probe(radeon_connector); | 591 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 1); |
| 592 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 0); | 592 | dret = radeon_ddc_probe(radeon_connector); |
| 593 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 0); | ||
| 594 | } | ||
| 593 | if (dret) { | 595 | if (dret) { |
| 594 | if (radeon_connector->edid) { | 596 | if (radeon_connector->edid) { |
| 595 | kfree(radeon_connector->edid); | 597 | kfree(radeon_connector->edid); |
| @@ -740,11 +742,13 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect | |||
| 740 | struct drm_mode_object *obj; | 742 | struct drm_mode_object *obj; |
| 741 | int i; | 743 | int i; |
| 742 | enum drm_connector_status ret = connector_status_disconnected; | 744 | enum drm_connector_status ret = connector_status_disconnected; |
| 743 | bool dret; | 745 | bool dret = false; |
| 744 | 746 | ||
| 745 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 1); | 747 | if (radeon_connector->ddc_bus) { |
| 746 | dret = radeon_ddc_probe(radeon_connector); | 748 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 1); |
| 747 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 0); | 749 | dret = radeon_ddc_probe(radeon_connector); |
| 750 | radeon_i2c_do_lock(radeon_connector->ddc_bus, 0); | ||
| 751 | } | ||
| 748 | if (dret) { | 752 | if (dret) { |
| 749 | if (radeon_connector->edid) { | 753 | if (radeon_connector->edid) { |
| 750 | kfree(radeon_connector->edid); | 754 | kfree(radeon_connector->edid); |
| @@ -1343,7 +1347,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
| 1343 | radeon_connector->dac_load_detect = false; | 1347 | radeon_connector->dac_load_detect = false; |
| 1344 | drm_connector_attach_property(&radeon_connector->base, | 1348 | drm_connector_attach_property(&radeon_connector->base, |
| 1345 | rdev->mode_info.load_detect_property, | 1349 | rdev->mode_info.load_detect_property, |
| 1346 | 1); | 1350 | radeon_connector->dac_load_detect); |
| 1347 | drm_connector_attach_property(&radeon_connector->base, | 1351 | drm_connector_attach_property(&radeon_connector->base, |
| 1348 | rdev->mode_info.tv_std_property, | 1352 | rdev->mode_info.tv_std_property, |
| 1349 | radeon_combios_get_tv_info(rdev)); | 1353 | radeon_combios_get_tv_info(rdev)); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 6a92f994cc26..7e17a362b54b 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -278,7 +278,7 @@ static void radeon_print_display_setup(struct drm_device *dev) | |||
| 278 | DRM_INFO(" %s\n", connector_names[connector->connector_type]); | 278 | DRM_INFO(" %s\n", connector_names[connector->connector_type]); |
| 279 | if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) | 279 | if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) |
| 280 | DRM_INFO(" %s\n", hpd_names[radeon_connector->hpd.hpd]); | 280 | DRM_INFO(" %s\n", hpd_names[radeon_connector->hpd.hpd]); |
| 281 | if (radeon_connector->ddc_bus) | 281 | if (radeon_connector->ddc_bus) { |
| 282 | DRM_INFO(" DDC: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", | 282 | DRM_INFO(" DDC: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", |
| 283 | radeon_connector->ddc_bus->rec.mask_clk_reg, | 283 | radeon_connector->ddc_bus->rec.mask_clk_reg, |
| 284 | radeon_connector->ddc_bus->rec.mask_data_reg, | 284 | radeon_connector->ddc_bus->rec.mask_data_reg, |
| @@ -288,6 +288,15 @@ static void radeon_print_display_setup(struct drm_device *dev) | |||
| 288 | radeon_connector->ddc_bus->rec.en_data_reg, | 288 | radeon_connector->ddc_bus->rec.en_data_reg, |
| 289 | radeon_connector->ddc_bus->rec.y_clk_reg, | 289 | radeon_connector->ddc_bus->rec.y_clk_reg, |
| 290 | radeon_connector->ddc_bus->rec.y_data_reg); | 290 | radeon_connector->ddc_bus->rec.y_data_reg); |
| 291 | } else { | ||
| 292 | if (connector->connector_type == DRM_MODE_CONNECTOR_VGA || | ||
| 293 | connector->connector_type == DRM_MODE_CONNECTOR_DVII || | ||
| 294 | connector->connector_type == DRM_MODE_CONNECTOR_DVID || | ||
| 295 | connector->connector_type == DRM_MODE_CONNECTOR_DVIA || | ||
| 296 | connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || | ||
| 297 | connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) | ||
| 298 | DRM_INFO(" DDC: no ddc bus - possible BIOS bug - please report to xorg-driver-ati@lists.x.org\n"); | ||
| 299 | } | ||
| 291 | DRM_INFO(" Encoders:\n"); | 300 | DRM_INFO(" Encoders:\n"); |
| 292 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | 301 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
| 293 | radeon_encoder = to_radeon_encoder(encoder); | 302 | radeon_encoder = to_radeon_encoder(encoder); |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 3ba213d1b06c..d71e346e9ab5 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
| @@ -248,7 +248,7 @@ int radeonfb_create(struct drm_device *dev, | |||
| 248 | if (ret) | 248 | if (ret) |
| 249 | goto out_unref; | 249 | goto out_unref; |
| 250 | 250 | ||
| 251 | memset_io(fbptr, 0xff, aligned_size); | 251 | memset_io(fbptr, 0x0, aligned_size); |
| 252 | 252 | ||
| 253 | strcpy(info->fix.id, "radeondrmfb"); | 253 | strcpy(info->fix.id, "radeondrmfb"); |
| 254 | 254 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 0e1325e18534..db8e9a355a01 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -308,6 +308,9 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | |||
| 308 | } | 308 | } |
| 309 | robj = gobj->driver_private; | 309 | robj = gobj->driver_private; |
| 310 | r = radeon_bo_wait(robj, NULL, false); | 310 | r = radeon_bo_wait(robj, NULL, false); |
| 311 | /* callback hw specific functions if any */ | ||
| 312 | if (robj->rdev->asic->ioctl_wait_idle) | ||
| 313 | robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); | ||
| 311 | mutex_lock(&dev->struct_mutex); | 314 | mutex_lock(&dev->struct_mutex); |
| 312 | drm_gem_object_unreference(gobj); | 315 | drm_gem_object_unreference(gobj); |
| 313 | mutex_unlock(&dev->struct_mutex); | 316 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 9f5418983e2a..287fcebfb4e6 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -223,15 +223,31 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | int rs400_mc_wait_for_idle(struct radeon_device *rdev) | ||
| 227 | { | ||
| 228 | unsigned i; | ||
| 229 | uint32_t tmp; | ||
| 230 | |||
| 231 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
| 232 | /* read MC_STATUS */ | ||
| 233 | tmp = RREG32(0x0150); | ||
| 234 | if (tmp & (1 << 2)) { | ||
| 235 | return 0; | ||
| 236 | } | ||
| 237 | DRM_UDELAY(1); | ||
| 238 | } | ||
| 239 | return -1; | ||
| 240 | } | ||
| 241 | |||
| 226 | void rs400_gpu_init(struct radeon_device *rdev) | 242 | void rs400_gpu_init(struct radeon_device *rdev) |
| 227 | { | 243 | { |
| 228 | /* FIXME: HDP same place on rs400 ? */ | 244 | /* FIXME: HDP same place on rs400 ? */ |
| 229 | r100_hdp_reset(rdev); | 245 | r100_hdp_reset(rdev); |
| 230 | /* FIXME: is this correct ? */ | 246 | /* FIXME: is this correct ? */ |
| 231 | r420_pipes_init(rdev); | 247 | r420_pipes_init(rdev); |
| 232 | if (r300_mc_wait_for_idle(rdev)) { | 248 | if (rs400_mc_wait_for_idle(rdev)) { |
| 233 | printk(KERN_WARNING "Failed to wait MC idle while " | 249 | printk(KERN_WARNING "rs400: Failed to wait MC idle while " |
| 234 | "programming pipes. Bad things might happen.\n"); | 250 | "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); |
| 235 | } | 251 | } |
| 236 | } | 252 | } |
| 237 | 253 | ||
| @@ -370,8 +386,8 @@ void rs400_mc_program(struct radeon_device *rdev) | |||
| 370 | r100_mc_stop(rdev, &save); | 386 | r100_mc_stop(rdev, &save); |
| 371 | 387 | ||
| 372 | /* Wait for mc idle */ | 388 | /* Wait for mc idle */ |
| 373 | if (r300_mc_wait_for_idle(rdev)) | 389 | if (rs400_mc_wait_for_idle(rdev)) |
| 374 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 390 | dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); |
| 375 | WREG32(R_000148_MC_FB_LOCATION, | 391 | WREG32(R_000148_MC_FB_LOCATION, |
| 376 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | 392 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
| 377 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 393 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
| @@ -448,7 +464,6 @@ int rs400_suspend(struct radeon_device *rdev) | |||
| 448 | 464 | ||
| 449 | void rs400_fini(struct radeon_device *rdev) | 465 | void rs400_fini(struct radeon_device *rdev) |
| 450 | { | 466 | { |
| 451 | rs400_suspend(rdev); | ||
| 452 | r100_cp_fini(rdev); | 467 | r100_cp_fini(rdev); |
| 453 | r100_wb_fini(rdev); | 468 | r100_wb_fini(rdev); |
| 454 | r100_ib_fini(rdev); | 469 | r100_ib_fini(rdev); |
| @@ -527,7 +542,6 @@ int rs400_init(struct radeon_device *rdev) | |||
| 527 | if (r) { | 542 | if (r) { |
| 528 | /* Somethings want wront with the accel init stop accel */ | 543 | /* Somethings want wront with the accel init stop accel */ |
| 529 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 544 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 530 | rs400_suspend(rdev); | ||
| 531 | r100_cp_fini(rdev); | 545 | r100_cp_fini(rdev); |
| 532 | r100_wb_fini(rdev); | 546 | r100_wb_fini(rdev); |
| 533 | r100_ib_fini(rdev); | 547 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index d5255751e7b3..c3818562a13e 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -610,7 +610,6 @@ int rs600_suspend(struct radeon_device *rdev) | |||
| 610 | 610 | ||
| 611 | void rs600_fini(struct radeon_device *rdev) | 611 | void rs600_fini(struct radeon_device *rdev) |
| 612 | { | 612 | { |
| 613 | rs600_suspend(rdev); | ||
| 614 | r100_cp_fini(rdev); | 613 | r100_cp_fini(rdev); |
| 615 | r100_wb_fini(rdev); | 614 | r100_wb_fini(rdev); |
| 616 | r100_ib_fini(rdev); | 615 | r100_ib_fini(rdev); |
| @@ -689,7 +688,6 @@ int rs600_init(struct radeon_device *rdev) | |||
| 689 | if (r) { | 688 | if (r) { |
| 690 | /* Somethings want wront with the accel init stop accel */ | 689 | /* Somethings want wront with the accel init stop accel */ |
| 691 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 690 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 692 | rs600_suspend(rdev); | ||
| 693 | r100_cp_fini(rdev); | 691 | r100_cp_fini(rdev); |
| 694 | r100_wb_fini(rdev); | 692 | r100_wb_fini(rdev); |
| 695 | r100_ib_fini(rdev); | 693 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index cd31da913771..06e2771aee5a 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -676,7 +676,6 @@ int rs690_suspend(struct radeon_device *rdev) | |||
| 676 | 676 | ||
| 677 | void rs690_fini(struct radeon_device *rdev) | 677 | void rs690_fini(struct radeon_device *rdev) |
| 678 | { | 678 | { |
| 679 | rs690_suspend(rdev); | ||
| 680 | r100_cp_fini(rdev); | 679 | r100_cp_fini(rdev); |
| 681 | r100_wb_fini(rdev); | 680 | r100_wb_fini(rdev); |
| 682 | r100_ib_fini(rdev); | 681 | r100_ib_fini(rdev); |
| @@ -756,7 +755,6 @@ int rs690_init(struct radeon_device *rdev) | |||
| 756 | if (r) { | 755 | if (r) { |
| 757 | /* Somethings want wront with the accel init stop accel */ | 756 | /* Somethings want wront with the accel init stop accel */ |
| 758 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 757 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 759 | rs690_suspend(rdev); | ||
| 760 | r100_cp_fini(rdev); | 758 | r100_cp_fini(rdev); |
| 761 | r100_wb_fini(rdev); | 759 | r100_wb_fini(rdev); |
| 762 | r100_ib_fini(rdev); | 760 | r100_ib_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 62756717b044..0e1e6b8632b8 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -537,7 +537,6 @@ void rv515_set_safe_registers(struct radeon_device *rdev) | |||
| 537 | 537 | ||
| 538 | void rv515_fini(struct radeon_device *rdev) | 538 | void rv515_fini(struct radeon_device *rdev) |
| 539 | { | 539 | { |
| 540 | rv515_suspend(rdev); | ||
| 541 | r100_cp_fini(rdev); | 540 | r100_cp_fini(rdev); |
| 542 | r100_wb_fini(rdev); | 541 | r100_wb_fini(rdev); |
| 543 | r100_ib_fini(rdev); | 542 | r100_ib_fini(rdev); |
| @@ -615,13 +614,12 @@ int rv515_init(struct radeon_device *rdev) | |||
| 615 | if (r) { | 614 | if (r) { |
| 616 | /* Somethings want wront with the accel init stop accel */ | 615 | /* Somethings want wront with the accel init stop accel */ |
| 617 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 616 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
| 618 | rv515_suspend(rdev); | ||
| 619 | r100_cp_fini(rdev); | 617 | r100_cp_fini(rdev); |
| 620 | r100_wb_fini(rdev); | 618 | r100_wb_fini(rdev); |
| 621 | r100_ib_fini(rdev); | 619 | r100_ib_fini(rdev); |
| 620 | radeon_irq_kms_fini(rdev); | ||
| 622 | rv370_pcie_gart_fini(rdev); | 621 | rv370_pcie_gart_fini(rdev); |
| 623 | radeon_agp_fini(rdev); | 622 | radeon_agp_fini(rdev); |
| 624 | radeon_irq_kms_fini(rdev); | ||
| 625 | rdev->accel_working = false; | 623 | rdev->accel_working = false; |
| 626 | } | 624 | } |
| 627 | return 0; | 625 | return 0; |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index afd9e8213c29..5943d561fd1e 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -887,6 +887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 887 | return r; | 887 | return r; |
| 888 | } | 888 | } |
| 889 | rv770_gpu_init(rdev); | 889 | rv770_gpu_init(rdev); |
| 890 | r = r600_blit_init(rdev); | ||
| 891 | if (r) { | ||
| 892 | r600_blit_fini(rdev); | ||
| 893 | rdev->asic->copy = NULL; | ||
| 894 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 895 | } | ||
| 890 | /* pin copy shader into vram */ | 896 | /* pin copy shader into vram */ |
| 891 | if (rdev->r600_blit.shader_obj) { | 897 | if (rdev->r600_blit.shader_obj) { |
| 892 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 898 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| @@ -1055,19 +1061,15 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1055 | r = r600_pcie_gart_init(rdev); | 1061 | r = r600_pcie_gart_init(rdev); |
| 1056 | if (r) | 1062 | if (r) |
| 1057 | return r; | 1063 | return r; |
| 1058 | r = r600_blit_init(rdev); | ||
| 1059 | if (r) { | ||
| 1060 | r600_blit_fini(rdev); | ||
| 1061 | rdev->asic->copy = NULL; | ||
| 1062 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
| 1063 | } | ||
| 1064 | 1064 | ||
| 1065 | rdev->accel_working = true; | 1065 | rdev->accel_working = true; |
| 1066 | r = rv770_startup(rdev); | 1066 | r = rv770_startup(rdev); |
| 1067 | if (r) { | 1067 | if (r) { |
| 1068 | rv770_suspend(rdev); | 1068 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
| 1069 | r600_cp_fini(rdev); | ||
| 1069 | r600_wb_fini(rdev); | 1070 | r600_wb_fini(rdev); |
| 1070 | radeon_ring_fini(rdev); | 1071 | r600_irq_fini(rdev); |
| 1072 | radeon_irq_kms_fini(rdev); | ||
| 1071 | rv770_pcie_gart_fini(rdev); | 1073 | rv770_pcie_gart_fini(rdev); |
| 1072 | rdev->accel_working = false; | 1074 | rdev->accel_working = false; |
| 1073 | } | 1075 | } |
| @@ -1089,13 +1091,11 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1089 | 1091 | ||
| 1090 | void rv770_fini(struct radeon_device *rdev) | 1092 | void rv770_fini(struct radeon_device *rdev) |
| 1091 | { | 1093 | { |
| 1092 | rv770_suspend(rdev); | ||
| 1093 | |||
| 1094 | r600_blit_fini(rdev); | 1094 | r600_blit_fini(rdev); |
| 1095 | r600_cp_fini(rdev); | ||
| 1096 | r600_wb_fini(rdev); | ||
| 1095 | r600_irq_fini(rdev); | 1097 | r600_irq_fini(rdev); |
| 1096 | radeon_irq_kms_fini(rdev); | 1098 | radeon_irq_kms_fini(rdev); |
| 1097 | radeon_ring_fini(rdev); | ||
| 1098 | r600_wb_fini(rdev); | ||
| 1099 | rv770_pcie_gart_fini(rdev); | 1099 | rv770_pcie_gart_fini(rdev); |
| 1100 | radeon_gem_fini(rdev); | 1100 | radeon_gem_fini(rdev); |
| 1101 | radeon_fence_driver_fini(rdev); | 1101 | radeon_fence_driver_fini(rdev); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 135be9688c90..356dc935ec13 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -39,10 +39,10 @@ | |||
| 39 | #include "ttm/ttm_execbuf_util.h" | 39 | #include "ttm/ttm_execbuf_util.h" |
| 40 | #include "ttm/ttm_module.h" | 40 | #include "ttm/ttm_module.h" |
| 41 | 41 | ||
| 42 | #define VMWGFX_DRIVER_DATE "20090724" | 42 | #define VMWGFX_DRIVER_DATE "20100209" |
| 43 | #define VMWGFX_DRIVER_MAJOR 0 | 43 | #define VMWGFX_DRIVER_MAJOR 1 |
| 44 | #define VMWGFX_DRIVER_MINOR 1 | 44 | #define VMWGFX_DRIVER_MINOR 0 |
| 45 | #define VMWGFX_DRIVER_PATCHLEVEL 2 | 45 | #define VMWGFX_DRIVER_PATCHLEVEL 0 |
| 46 | #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 | 46 | #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 |
| 47 | #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) | 47 | #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) |
| 48 | #define VMWGFX_MAX_RELOCATIONS 2048 | 48 | #define VMWGFX_MAX_RELOCATIONS 2048 |
| @@ -113,6 +113,7 @@ struct vmw_fifo_state { | |||
| 113 | unsigned long static_buffer_size; | 113 | unsigned long static_buffer_size; |
| 114 | bool using_bounce_buffer; | 114 | bool using_bounce_buffer; |
| 115 | uint32_t capabilities; | 115 | uint32_t capabilities; |
| 116 | struct mutex fifo_mutex; | ||
| 116 | struct rw_semaphore rwsem; | 117 | struct rw_semaphore rwsem; |
| 117 | }; | 118 | }; |
| 118 | 119 | ||
| @@ -213,7 +214,7 @@ struct vmw_private { | |||
| 213 | * Fencing and IRQs. | 214 | * Fencing and IRQs. |
| 214 | */ | 215 | */ |
| 215 | 216 | ||
| 216 | uint32_t fence_seq; | 217 | atomic_t fence_seq; |
| 217 | wait_queue_head_t fence_queue; | 218 | wait_queue_head_t fence_queue; |
| 218 | wait_queue_head_t fifo_queue; | 219 | wait_queue_head_t fifo_queue; |
| 219 | atomic_t fence_queue_waiters; | 220 | atomic_t fence_queue_waiters; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c index 4157547cc6e4..39d43a01d846 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | |||
| @@ -74,6 +74,7 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 74 | fifo->reserved_size = 0; | 74 | fifo->reserved_size = 0; |
| 75 | fifo->using_bounce_buffer = false; | 75 | fifo->using_bounce_buffer = false; |
| 76 | 76 | ||
| 77 | mutex_init(&fifo->fifo_mutex); | ||
| 77 | init_rwsem(&fifo->rwsem); | 78 | init_rwsem(&fifo->rwsem); |
| 78 | 79 | ||
| 79 | /* | 80 | /* |
| @@ -117,7 +118,7 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) | |||
| 117 | (unsigned int) min, | 118 | (unsigned int) min, |
| 118 | (unsigned int) fifo->capabilities); | 119 | (unsigned int) fifo->capabilities); |
| 119 | 120 | ||
| 120 | dev_priv->fence_seq = dev_priv->last_read_sequence; | 121 | atomic_set(&dev_priv->fence_seq, dev_priv->last_read_sequence); |
| 121 | iowrite32(dev_priv->last_read_sequence, fifo_mem + SVGA_FIFO_FENCE); | 122 | iowrite32(dev_priv->last_read_sequence, fifo_mem + SVGA_FIFO_FENCE); |
| 122 | 123 | ||
| 123 | return vmw_fifo_send_fence(dev_priv, &dummy); | 124 | return vmw_fifo_send_fence(dev_priv, &dummy); |
| @@ -283,7 +284,7 @@ void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes) | |||
| 283 | uint32_t reserveable = fifo_state->capabilities & SVGA_FIFO_CAP_RESERVE; | 284 | uint32_t reserveable = fifo_state->capabilities & SVGA_FIFO_CAP_RESERVE; |
| 284 | int ret; | 285 | int ret; |
| 285 | 286 | ||
| 286 | down_write(&fifo_state->rwsem); | 287 | mutex_lock(&fifo_state->fifo_mutex); |
| 287 | max = ioread32(fifo_mem + SVGA_FIFO_MAX); | 288 | max = ioread32(fifo_mem + SVGA_FIFO_MAX); |
| 288 | min = ioread32(fifo_mem + SVGA_FIFO_MIN); | 289 | min = ioread32(fifo_mem + SVGA_FIFO_MIN); |
| 289 | next_cmd = ioread32(fifo_mem + SVGA_FIFO_NEXT_CMD); | 290 | next_cmd = ioread32(fifo_mem + SVGA_FIFO_NEXT_CMD); |
| @@ -351,7 +352,7 @@ void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes) | |||
| 351 | } | 352 | } |
| 352 | out_err: | 353 | out_err: |
| 353 | fifo_state->reserved_size = 0; | 354 | fifo_state->reserved_size = 0; |
| 354 | up_write(&fifo_state->rwsem); | 355 | mutex_unlock(&fifo_state->fifo_mutex); |
| 355 | return NULL; | 356 | return NULL; |
| 356 | } | 357 | } |
| 357 | 358 | ||
| @@ -426,6 +427,7 @@ void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes) | |||
| 426 | 427 | ||
| 427 | } | 428 | } |
| 428 | 429 | ||
| 430 | down_write(&fifo_state->rwsem); | ||
| 429 | if (fifo_state->using_bounce_buffer || reserveable) { | 431 | if (fifo_state->using_bounce_buffer || reserveable) { |
| 430 | next_cmd += bytes; | 432 | next_cmd += bytes; |
| 431 | if (next_cmd >= max) | 433 | if (next_cmd >= max) |
| @@ -437,8 +439,9 @@ void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes) | |||
| 437 | if (reserveable) | 439 | if (reserveable) |
| 438 | iowrite32(0, fifo_mem + SVGA_FIFO_RESERVED); | 440 | iowrite32(0, fifo_mem + SVGA_FIFO_RESERVED); |
| 439 | mb(); | 441 | mb(); |
| 440 | vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC); | ||
| 441 | up_write(&fifo_state->rwsem); | 442 | up_write(&fifo_state->rwsem); |
| 443 | vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC); | ||
| 444 | mutex_unlock(&fifo_state->fifo_mutex); | ||
| 442 | } | 445 | } |
| 443 | 446 | ||
| 444 | int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *sequence) | 447 | int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *sequence) |
| @@ -451,9 +454,7 @@ int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *sequence) | |||
| 451 | 454 | ||
| 452 | fm = vmw_fifo_reserve(dev_priv, bytes); | 455 | fm = vmw_fifo_reserve(dev_priv, bytes); |
| 453 | if (unlikely(fm == NULL)) { | 456 | if (unlikely(fm == NULL)) { |
| 454 | down_write(&fifo_state->rwsem); | 457 | *sequence = atomic_read(&dev_priv->fence_seq); |
| 455 | *sequence = dev_priv->fence_seq; | ||
| 456 | up_write(&fifo_state->rwsem); | ||
| 457 | ret = -ENOMEM; | 458 | ret = -ENOMEM; |
| 458 | (void)vmw_fallback_wait(dev_priv, false, true, *sequence, | 459 | (void)vmw_fallback_wait(dev_priv, false, true, *sequence, |
| 459 | false, 3*HZ); | 460 | false, 3*HZ); |
| @@ -461,7 +462,7 @@ int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *sequence) | |||
| 461 | } | 462 | } |
| 462 | 463 | ||
| 463 | do { | 464 | do { |
| 464 | *sequence = dev_priv->fence_seq++; | 465 | *sequence = atomic_add_return(1, &dev_priv->fence_seq); |
| 465 | } while (*sequence == 0); | 466 | } while (*sequence == 0); |
| 466 | 467 | ||
| 467 | if (!(fifo_state->capabilities & SVGA_FIFO_CAP_FENCE)) { | 468 | if (!(fifo_state->capabilities & SVGA_FIFO_CAP_FENCE)) { |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index 778851f9f1d6..1c7a316454d8 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
| @@ -48,6 +48,12 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data, | |||
| 48 | case DRM_VMW_PARAM_FIFO_OFFSET: | 48 | case DRM_VMW_PARAM_FIFO_OFFSET: |
| 49 | param->value = dev_priv->mmio_start; | 49 | param->value = dev_priv->mmio_start; |
| 50 | break; | 50 | break; |
| 51 | case DRM_VMW_PARAM_HW_CAPS: | ||
| 52 | param->value = dev_priv->capabilities; | ||
| 53 | break; | ||
| 54 | case DRM_VMW_PARAM_FIFO_CAPS: | ||
| 55 | param->value = dev_priv->fifo.capabilities; | ||
| 56 | break; | ||
| 51 | default: | 57 | default: |
| 52 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", | 58 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", |
| 53 | param->param); | 59 | param->param); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c index d40086fc8647..4d7cb5393860 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | |||
| @@ -85,19 +85,12 @@ bool vmw_fence_signaled(struct vmw_private *dev_priv, | |||
| 85 | return true; | 85 | return true; |
| 86 | 86 | ||
| 87 | /** | 87 | /** |
| 88 | * Below is to signal stale fences that have wrapped. | ||
| 89 | * First, block fence submission. | ||
| 90 | */ | ||
| 91 | |||
| 92 | down_read(&fifo_state->rwsem); | ||
| 93 | |||
| 94 | /** | ||
| 95 | * Then check if the sequence is higher than what we've actually | 88 | * Then check if the sequence is higher than what we've actually |
| 96 | * emitted. Then the fence is stale and signaled. | 89 | * emitted. Then the fence is stale and signaled. |
| 97 | */ | 90 | */ |
| 98 | 91 | ||
| 99 | ret = ((dev_priv->fence_seq - sequence) > VMW_FENCE_WRAP); | 92 | ret = ((atomic_read(&dev_priv->fence_seq) - sequence) |
| 100 | up_read(&fifo_state->rwsem); | 93 | > VMW_FENCE_WRAP); |
| 101 | 94 | ||
| 102 | return ret; | 95 | return ret; |
| 103 | } | 96 | } |
| @@ -127,7 +120,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, | |||
| 127 | 120 | ||
| 128 | if (fifo_idle) | 121 | if (fifo_idle) |
| 129 | down_read(&fifo_state->rwsem); | 122 | down_read(&fifo_state->rwsem); |
| 130 | signal_seq = dev_priv->fence_seq; | 123 | signal_seq = atomic_read(&dev_priv->fence_seq); |
| 131 | ret = 0; | 124 | ret = 0; |
| 132 | 125 | ||
| 133 | for (;;) { | 126 | for (;;) { |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index eeba6d1d06e4..31f9afed0a63 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
| @@ -769,10 +769,10 @@ int vmw_kms_init(struct vmw_private *dev_priv) | |||
| 769 | 769 | ||
| 770 | drm_mode_config_init(dev); | 770 | drm_mode_config_init(dev); |
| 771 | dev->mode_config.funcs = &vmw_kms_funcs; | 771 | dev->mode_config.funcs = &vmw_kms_funcs; |
| 772 | dev->mode_config.min_width = 640; | 772 | dev->mode_config.min_width = 1; |
| 773 | dev->mode_config.min_height = 480; | 773 | dev->mode_config.min_height = 1; |
| 774 | dev->mode_config.max_width = 2048; | 774 | dev->mode_config.max_width = dev_priv->fb_max_width; |
| 775 | dev->mode_config.max_height = 2048; | 775 | dev->mode_config.max_height = dev_priv->fb_max_height; |
| 776 | 776 | ||
| 777 | ret = vmw_kms_init_legacy_display_system(dev_priv); | 777 | ret = vmw_kms_init_legacy_display_system(dev_priv); |
| 778 | 778 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index c7efbd47ab84..f8fbbc67a406 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -35,11 +35,6 @@ | |||
| 35 | #define VMW_RES_SURFACE ttm_driver_type1 | 35 | #define VMW_RES_SURFACE ttm_driver_type1 |
| 36 | #define VMW_RES_STREAM ttm_driver_type2 | 36 | #define VMW_RES_STREAM ttm_driver_type2 |
| 37 | 37 | ||
| 38 | /* XXX: This isn't a real hardware flag, but just a hack for kernel to | ||
| 39 | * know about primary surfaces. Find a better way to accomplish this. | ||
| 40 | */ | ||
| 41 | #define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9) | ||
| 42 | |||
| 43 | struct vmw_user_context { | 38 | struct vmw_user_context { |
| 44 | struct ttm_base_object base; | 39 | struct ttm_base_object base; |
| 45 | struct vmw_resource res; | 40 | struct vmw_resource res; |
| @@ -579,6 +574,7 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data, | |||
| 579 | 574 | ||
| 580 | srf->flags = req->flags; | 575 | srf->flags = req->flags; |
| 581 | srf->format = req->format; | 576 | srf->format = req->format; |
| 577 | srf->scanout = req->scanout; | ||
| 582 | memcpy(srf->mip_levels, req->mip_levels, sizeof(srf->mip_levels)); | 578 | memcpy(srf->mip_levels, req->mip_levels, sizeof(srf->mip_levels)); |
| 583 | srf->num_sizes = 0; | 579 | srf->num_sizes = 0; |
| 584 | for (i = 0; i < DRM_VMW_MAX_SURFACE_FACES; ++i) | 580 | for (i = 0; i < DRM_VMW_MAX_SURFACE_FACES; ++i) |
| @@ -604,16 +600,6 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data, | |||
| 604 | if (unlikely(ret != 0)) | 600 | if (unlikely(ret != 0)) |
| 605 | goto out_err1; | 601 | goto out_err1; |
| 606 | 602 | ||
| 607 | if (srf->flags & SVGA3D_SURFACE_HINT_SCANOUT) { | ||
| 608 | /* we should not send this flag down to hardware since | ||
| 609 | * its not a official one | ||
| 610 | */ | ||
| 611 | srf->flags &= ~SVGA3D_SURFACE_HINT_SCANOUT; | ||
| 612 | srf->scanout = true; | ||
| 613 | } else { | ||
| 614 | srf->scanout = false; | ||
| 615 | } | ||
| 616 | |||
| 617 | if (srf->scanout && | 603 | if (srf->scanout && |
| 618 | srf->num_sizes == 1 && | 604 | srf->num_sizes == 1 && |
| 619 | srf->sizes[0].width == 64 && | 605 | srf->sizes[0].width == 64 && |
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index 1ac0c93603c9..24b56dc54597 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
| @@ -961,7 +961,7 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf, | |||
| 961 | remaining -= 7; | 961 | remaining -= 7; |
| 962 | pr_devel("client 0x%p called 'target'\n", priv); | 962 | pr_devel("client 0x%p called 'target'\n", priv); |
| 963 | /* if target is default */ | 963 | /* if target is default */ |
| 964 | if (!strncmp(buf, "default", 7)) | 964 | if (!strncmp(kbuf, "default", 7)) |
| 965 | pdev = pci_dev_get(vga_default_device()); | 965 | pdev = pci_dev_get(vga_default_device()); |
| 966 | else { | 966 | else { |
| 967 | if (!vga_pci_str_to_vars(curr_pos, remaining, | 967 | if (!vga_pci_str_to_vars(curr_pos, remaining, |
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c index a31e77c776ae..b8156b4893bb 100644 --- a/drivers/hwmon/adt7462.c +++ b/drivers/hwmon/adt7462.c | |||
| @@ -179,7 +179,7 @@ static const unsigned short normal_i2c[] = { 0x58, 0x5C, I2C_CLIENT_END }; | |||
| 179 | * | 179 | * |
| 180 | * Some, but not all, of these voltages have low/high limits. | 180 | * Some, but not all, of these voltages have low/high limits. |
| 181 | */ | 181 | */ |
| 182 | #define ADT7462_VOLT_COUNT 12 | 182 | #define ADT7462_VOLT_COUNT 13 |
| 183 | 183 | ||
| 184 | #define ADT7462_VENDOR 0x41 | 184 | #define ADT7462_VENDOR 0x41 |
| 185 | #define ADT7462_DEVICE 0x62 | 185 | #define ADT7462_DEVICE 0x62 |
diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c index cadcbd90ff3b..72ff2c4e757d 100644 --- a/drivers/hwmon/lm78.c +++ b/drivers/hwmon/lm78.c | |||
| @@ -851,17 +851,16 @@ static struct lm78_data *lm78_update_device(struct device *dev) | |||
| 851 | static int __init lm78_isa_found(unsigned short address) | 851 | static int __init lm78_isa_found(unsigned short address) |
| 852 | { | 852 | { |
| 853 | int val, save, found = 0; | 853 | int val, save, found = 0; |
| 854 | 854 | int port; | |
| 855 | /* We have to request the region in two parts because some | 855 | |
| 856 | boards declare base+4 to base+7 as a PNP device */ | 856 | /* Some boards declare base+0 to base+7 as a PNP device, some base+4 |
| 857 | if (!request_region(address, 4, "lm78")) { | 857 | * to base+7 and some base+5 to base+6. So we better request each port |
| 858 | pr_debug("lm78: Failed to request low part of region\n"); | 858 | * individually for the probing phase. */ |
| 859 | return 0; | 859 | for (port = address; port < address + LM78_EXTENT; port++) { |
| 860 | } | 860 | if (!request_region(port, 1, "lm78")) { |
| 861 | if (!request_region(address + 4, 4, "lm78")) { | 861 | pr_debug("lm78: Failed to request port 0x%x\n", port); |
| 862 | pr_debug("lm78: Failed to request high part of region\n"); | 862 | goto release; |
| 863 | release_region(address, 4); | 863 | } |
| 864 | return 0; | ||
| 865 | } | 864 | } |
| 866 | 865 | ||
| 867 | #define REALLY_SLOW_IO | 866 | #define REALLY_SLOW_IO |
| @@ -925,8 +924,8 @@ static int __init lm78_isa_found(unsigned short address) | |||
| 925 | val & 0x80 ? "LM79" : "LM78", (int)address); | 924 | val & 0x80 ? "LM79" : "LM78", (int)address); |
| 926 | 925 | ||
| 927 | release: | 926 | release: |
| 928 | release_region(address + 4, 4); | 927 | for (port--; port >= address; port--) |
| 929 | release_region(address, 4); | 928 | release_region(port, 1); |
| 930 | return found; | 929 | return found; |
| 931 | } | 930 | } |
| 932 | 931 | ||
diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index 05f9225b6f94..32d4adee73db 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c | |||
| @@ -1793,17 +1793,17 @@ static int __init | |||
| 1793 | w83781d_isa_found(unsigned short address) | 1793 | w83781d_isa_found(unsigned short address) |
| 1794 | { | 1794 | { |
| 1795 | int val, save, found = 0; | 1795 | int val, save, found = 0; |
| 1796 | 1796 | int port; | |
| 1797 | /* We have to request the region in two parts because some | 1797 | |
| 1798 | boards declare base+4 to base+7 as a PNP device */ | 1798 | /* Some boards declare base+0 to base+7 as a PNP device, some base+4 |
| 1799 | if (!request_region(address, 4, "w83781d")) { | 1799 | * to base+7 and some base+5 to base+6. So we better request each port |
| 1800 | pr_debug("w83781d: Failed to request low part of region\n"); | 1800 | * individually for the probing phase. */ |
| 1801 | return 0; | 1801 | for (port = address; port < address + W83781D_EXTENT; port++) { |
| 1802 | } | 1802 | if (!request_region(port, 1, "w83781d")) { |
| 1803 | if (!request_region(address + 4, 4, "w83781d")) { | 1803 | pr_debug("w83781d: Failed to request port 0x%x\n", |
| 1804 | pr_debug("w83781d: Failed to request high part of region\n"); | 1804 | port); |
| 1805 | release_region(address, 4); | 1805 | goto release; |
| 1806 | return 0; | 1806 | } |
| 1807 | } | 1807 | } |
| 1808 | 1808 | ||
| 1809 | #define REALLY_SLOW_IO | 1809 | #define REALLY_SLOW_IO |
| @@ -1877,8 +1877,8 @@ w83781d_isa_found(unsigned short address) | |||
| 1877 | val == 0x30 ? "W83782D" : "W83781D", (int)address); | 1877 | val == 0x30 ? "W83782D" : "W83781D", (int)address); |
| 1878 | 1878 | ||
| 1879 | release: | 1879 | release: |
| 1880 | release_region(address + 4, 4); | 1880 | for (port--; port >= address; port--) |
| 1881 | release_region(address, 4); | 1881 | release_region(port, 1); |
| 1882 | return found; | 1882 | return found; |
| 1883 | } | 1883 | } |
| 1884 | 1884 | ||
diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index b1c050ff311d..e29b6d5ba8ef 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
| 15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 16 | #include <linux/types.h> | ||
| 16 | 17 | ||
| 17 | /* include interfaces to usb layer */ | 18 | /* include interfaces to usb layer */ |
| 18 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
| @@ -31,8 +32,8 @@ | |||
| 31 | #define CMD_I2C_IO_END (1<<1) | 32 | #define CMD_I2C_IO_END (1<<1) |
| 32 | 33 | ||
| 33 | /* i2c bit delay, default is 10us -> 100kHz */ | 34 | /* i2c bit delay, default is 10us -> 100kHz */ |
| 34 | static int delay = 10; | 35 | static unsigned short delay = 10; |
| 35 | module_param(delay, int, 0); | 36 | module_param(delay, ushort, 0); |
| 36 | MODULE_PARM_DESC(delay, "bit delay in microseconds, " | 37 | MODULE_PARM_DESC(delay, "bit delay in microseconds, " |
| 37 | "e.g. 10 for 100kHz (default is 100kHz)"); | 38 | "e.g. 10 for 100kHz (default is 100kHz)"); |
| 38 | 39 | ||
| @@ -109,7 +110,7 @@ static int usb_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num) | |||
| 109 | 110 | ||
| 110 | static u32 usb_func(struct i2c_adapter *adapter) | 111 | static u32 usb_func(struct i2c_adapter *adapter) |
| 111 | { | 112 | { |
| 112 | u32 func; | 113 | __le32 func; |
| 113 | 114 | ||
| 114 | /* get functionality from adapter */ | 115 | /* get functionality from adapter */ |
| 115 | if (usb_read(adapter, CMD_GET_FUNC, 0, 0, &func, sizeof(func)) != | 116 | if (usb_read(adapter, CMD_GET_FUNC, 0, 0, &func, sizeof(func)) != |
| @@ -118,7 +119,7 @@ static u32 usb_func(struct i2c_adapter *adapter) | |||
| 118 | return 0; | 119 | return 0; |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 121 | return func; | 122 | return le32_to_cpu(func); |
| 122 | } | 123 | } |
| 123 | 124 | ||
| 124 | /* This is the actual algorithm we define */ | 125 | /* This is the actual algorithm we define */ |
| @@ -216,8 +217,7 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface, | |||
| 216 | "i2c-tiny-usb at bus %03d device %03d", | 217 | "i2c-tiny-usb at bus %03d device %03d", |
| 217 | dev->usb_dev->bus->busnum, dev->usb_dev->devnum); | 218 | dev->usb_dev->bus->busnum, dev->usb_dev->devnum); |
| 218 | 219 | ||
| 219 | if (usb_write(&dev->adapter, CMD_SET_DELAY, | 220 | if (usb_write(&dev->adapter, CMD_SET_DELAY, delay, 0, NULL, 0) != 0) { |
| 220 | cpu_to_le16(delay), 0, NULL, 0) != 0) { | ||
| 221 | dev_err(&dev->adapter.dev, | 221 | dev_err(&dev->adapter.dev, |
| 222 | "failure setting delay to %dus\n", delay); | 222 | "failure setting delay to %dus\n", delay); |
| 223 | retval = -EIO; | 223 | retval = -EIO; |
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index cc9b5940fa97..875e34e0b235 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
| @@ -2115,9 +2115,7 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) | |||
| 2115 | if (ret) | 2115 | if (ret) |
| 2116 | goto err1; | 2116 | goto err1; |
| 2117 | 2117 | ||
| 2118 | if (cma_loopback_addr(addr)) { | 2118 | if (!cma_any_addr(addr)) { |
| 2119 | ret = cma_bind_loopback(id_priv); | ||
| 2120 | } else if (!cma_zero_addr(addr)) { | ||
| 2121 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); | 2119 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); |
| 2122 | if (ret) | 2120 | if (ret) |
| 2123 | goto err1; | 2121 | goto err1; |
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 9774bdfaa482..d8c0c8d6992c 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
| @@ -1141,7 +1141,14 @@ static void psmouse_cleanup(struct serio *serio) | |||
| 1141 | psmouse_deactivate(parent); | 1141 | psmouse_deactivate(parent); |
| 1142 | } | 1142 | } |
| 1143 | 1143 | ||
| 1144 | psmouse_deactivate(psmouse); | 1144 | psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); |
| 1145 | |||
| 1146 | /* | ||
| 1147 | * Disable stream mode so cleanup routine can proceed undisturbed. | ||
| 1148 | */ | ||
| 1149 | if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE)) | ||
| 1150 | printk(KERN_WARNING "psmouse.c: Failed to disable mouse on %s\n", | ||
| 1151 | psmouse->ps2dev.serio->phys); | ||
| 1145 | 1152 | ||
| 1146 | if (psmouse->cleanup) | 1153 | if (psmouse->cleanup) |
| 1147 | psmouse->cleanup(psmouse); | 1154 | psmouse->cleanup(psmouse); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index dd3dfe42d5a9..a20a71e5efd3 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -4075,8 +4075,10 @@ static void mddev_delayed_delete(struct work_struct *ws) | |||
| 4075 | { | 4075 | { |
| 4076 | mddev_t *mddev = container_of(ws, mddev_t, del_work); | 4076 | mddev_t *mddev = container_of(ws, mddev_t, del_work); |
| 4077 | 4077 | ||
| 4078 | if (mddev->private == &md_redundancy_group) { | 4078 | if (mddev->private) { |
| 4079 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); | 4079 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); |
| 4080 | if (mddev->private != (void*)1) | ||
| 4081 | sysfs_remove_group(&mddev->kobj, mddev->private); | ||
| 4080 | if (mddev->sysfs_action) | 4082 | if (mddev->sysfs_action) |
| 4081 | sysfs_put(mddev->sysfs_action); | 4083 | sysfs_put(mddev->sysfs_action); |
| 4082 | mddev->sysfs_action = NULL; | 4084 | mddev->sysfs_action = NULL; |
| @@ -4287,10 +4289,7 @@ static int do_md_run(mddev_t * mddev) | |||
| 4287 | sysfs_notify_dirent(rdev->sysfs_state); | 4289 | sysfs_notify_dirent(rdev->sysfs_state); |
| 4288 | } | 4290 | } |
| 4289 | 4291 | ||
| 4290 | md_probe(mddev->unit, NULL, NULL); | ||
| 4291 | disk = mddev->gendisk; | 4292 | disk = mddev->gendisk; |
| 4292 | if (!disk) | ||
| 4293 | return -ENOMEM; | ||
| 4294 | 4293 | ||
| 4295 | spin_lock(&pers_lock); | 4294 | spin_lock(&pers_lock); |
| 4296 | pers = find_pers(mddev->level, mddev->clevel); | 4295 | pers = find_pers(mddev->level, mddev->clevel); |
| @@ -4530,8 +4529,8 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4530 | mddev->queue->unplug_fn = NULL; | 4529 | mddev->queue->unplug_fn = NULL; |
| 4531 | mddev->queue->backing_dev_info.congested_fn = NULL; | 4530 | mddev->queue->backing_dev_info.congested_fn = NULL; |
| 4532 | module_put(mddev->pers->owner); | 4531 | module_put(mddev->pers->owner); |
| 4533 | if (mddev->pers->sync_request) | 4532 | if (mddev->pers->sync_request && mddev->private == NULL) |
| 4534 | mddev->private = &md_redundancy_group; | 4533 | mddev->private = (void*)1; |
| 4535 | mddev->pers = NULL; | 4534 | mddev->pers = NULL; |
| 4536 | /* tell userspace to handle 'inactive' */ | 4535 | /* tell userspace to handle 'inactive' */ |
| 4537 | sysfs_notify_dirent(mddev->sysfs_state); | 4536 | sysfs_notify_dirent(mddev->sysfs_state); |
| @@ -4578,9 +4577,6 @@ out: | |||
| 4578 | } | 4577 | } |
| 4579 | mddev->bitmap_info.offset = 0; | 4578 | mddev->bitmap_info.offset = 0; |
| 4580 | 4579 | ||
| 4581 | /* make sure all md_delayed_delete calls have finished */ | ||
| 4582 | flush_scheduled_work(); | ||
| 4583 | |||
| 4584 | export_array(mddev); | 4580 | export_array(mddev); |
| 4585 | 4581 | ||
| 4586 | mddev->array_sectors = 0; | 4582 | mddev->array_sectors = 0; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index e84204eb12df..ceb24afdc147 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -5136,9 +5136,8 @@ static int stop(mddev_t *mddev) | |||
| 5136 | mddev->thread = NULL; | 5136 | mddev->thread = NULL; |
| 5137 | mddev->queue->backing_dev_info.congested_fn = NULL; | 5137 | mddev->queue->backing_dev_info.congested_fn = NULL; |
| 5138 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ | 5138 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ |
| 5139 | sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); | ||
| 5140 | free_conf(conf); | 5139 | free_conf(conf); |
| 5141 | mddev->private = NULL; | 5140 | mddev->private = &raid5_attrs_group; |
| 5142 | return 0; | 5141 | return 0; |
| 5143 | } | 5142 | } |
| 5144 | 5143 | ||
| @@ -5464,11 +5463,11 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
| 5464 | !test_bit(Faulty, &rdev->flags)) { | 5463 | !test_bit(Faulty, &rdev->flags)) { |
| 5465 | if (raid5_add_disk(mddev, rdev) == 0) { | 5464 | if (raid5_add_disk(mddev, rdev) == 0) { |
| 5466 | char nm[20]; | 5465 | char nm[20]; |
| 5467 | if (rdev->raid_disk >= conf->previous_raid_disks) | 5466 | if (rdev->raid_disk >= conf->previous_raid_disks) { |
| 5468 | set_bit(In_sync, &rdev->flags); | 5467 | set_bit(In_sync, &rdev->flags); |
| 5469 | else | 5468 | added_devices++; |
| 5469 | } else | ||
| 5470 | rdev->recovery_offset = 0; | 5470 | rdev->recovery_offset = 0; |
| 5471 | added_devices++; | ||
| 5472 | sprintf(nm, "rd%d", rdev->raid_disk); | 5471 | sprintf(nm, "rd%d", rdev->raid_disk); |
| 5473 | if (sysfs_create_link(&mddev->kobj, | 5472 | if (sysfs_create_link(&mddev->kobj, |
| 5474 | &rdev->kobj, nm)) | 5473 | &rdev->kobj, nm)) |
| @@ -5480,9 +5479,12 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
| 5480 | break; | 5479 | break; |
| 5481 | } | 5480 | } |
| 5482 | 5481 | ||
| 5482 | /* When a reshape changes the number of devices, ->degraded | ||
| 5483 | * is measured against the large of the pre and post number of | ||
| 5484 | * devices.*/ | ||
| 5483 | if (mddev->delta_disks > 0) { | 5485 | if (mddev->delta_disks > 0) { |
| 5484 | spin_lock_irqsave(&conf->device_lock, flags); | 5486 | spin_lock_irqsave(&conf->device_lock, flags); |
| 5485 | mddev->degraded = (conf->raid_disks - conf->previous_raid_disks) | 5487 | mddev->degraded += (conf->raid_disks - conf->previous_raid_disks) |
| 5486 | - added_devices; | 5488 | - added_devices; |
| 5487 | spin_unlock_irqrestore(&conf->device_lock, flags); | 5489 | spin_unlock_irqrestore(&conf->device_lock, flags); |
| 5488 | } | 5490 | } |
diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c index becbaadb3b77..5ed75263340a 100644 --- a/drivers/media/common/saa7146_video.c +++ b/drivers/media/common/saa7146_video.c | |||
| @@ -1333,9 +1333,9 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) | |||
| 1333 | 1333 | ||
| 1334 | DEB_CAP(("vbuf:%p\n",vb)); | 1334 | DEB_CAP(("vbuf:%p\n",vb)); |
| 1335 | 1335 | ||
| 1336 | release_all_pagetables(dev, buf); | ||
| 1337 | |||
| 1338 | saa7146_dma_free(dev,q,buf); | 1336 | saa7146_dma_free(dev,q,buf); |
| 1337 | |||
| 1338 | release_all_pagetables(dev, buf); | ||
| 1339 | } | 1339 | } |
| 1340 | 1340 | ||
| 1341 | static struct videobuf_queue_ops video_qops = { | 1341 | static struct videobuf_queue_ops video_qops = { |
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index c37790ad92d0..9ddc57909d49 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c | |||
| @@ -761,7 +761,6 @@ static int dvb_demux_open(struct inode *inode, struct file *file) | |||
| 761 | dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); | 761 | dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); |
| 762 | dmxdevfilter->type = DMXDEV_TYPE_NONE; | 762 | dmxdevfilter->type = DMXDEV_TYPE_NONE; |
| 763 | dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED); | 763 | dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED); |
| 764 | INIT_LIST_HEAD(&dmxdevfilter->feed.ts); | ||
| 765 | init_timer(&dmxdevfilter->timer); | 764 | init_timer(&dmxdevfilter->timer); |
| 766 | 765 | ||
| 767 | dvbdev->users++; | 766 | dvbdev->users++; |
| @@ -887,6 +886,7 @@ static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, | |||
| 887 | dmxdevfilter->type = DMXDEV_TYPE_PES; | 886 | dmxdevfilter->type = DMXDEV_TYPE_PES; |
| 888 | memcpy(&dmxdevfilter->params, params, | 887 | memcpy(&dmxdevfilter->params, params, |
| 889 | sizeof(struct dmx_pes_filter_params)); | 888 | sizeof(struct dmx_pes_filter_params)); |
| 889 | INIT_LIST_HEAD(&dmxdevfilter->feed.ts); | ||
| 890 | 890 | ||
| 891 | dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); | 891 | dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET); |
| 892 | 892 | ||
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index b78cfb7d1897..67f189b7aa1f 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c | |||
| @@ -426,16 +426,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
| 426 | }; | 426 | }; |
| 427 | }; | 427 | }; |
| 428 | 428 | ||
| 429 | if (dvb_demux_tscheck) { | 429 | if (demux->cnt_storage) { |
| 430 | if (!demux->cnt_storage) | ||
| 431 | demux->cnt_storage = vmalloc(MAX_PID + 1); | ||
| 432 | |||
| 433 | if (!demux->cnt_storage) { | ||
| 434 | printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n"); | ||
| 435 | dvb_demux_tscheck = 0; | ||
| 436 | goto no_dvb_demux_tscheck; | ||
| 437 | } | ||
| 438 | |||
| 439 | /* check pkt counter */ | 430 | /* check pkt counter */ |
| 440 | if (pid < MAX_PID) { | 431 | if (pid < MAX_PID) { |
| 441 | if (buf[1] & 0x80) | 432 | if (buf[1] & 0x80) |
| @@ -454,7 +445,6 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
| 454 | }; | 445 | }; |
| 455 | /* end check */ | 446 | /* end check */ |
| 456 | }; | 447 | }; |
| 457 | no_dvb_demux_tscheck: | ||
| 458 | 448 | ||
| 459 | list_for_each_entry(feed, &demux->feed_list, list_head) { | 449 | list_for_each_entry(feed, &demux->feed_list, list_head) { |
| 460 | if ((feed->pid != pid) && (feed->pid != 0x2000)) | 450 | if ((feed->pid != pid) && (feed->pid != 0x2000)) |
| @@ -1246,6 +1236,7 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux) | |||
| 1246 | dvbdemux->feed = vmalloc(dvbdemux->feednum * sizeof(struct dvb_demux_feed)); | 1236 | dvbdemux->feed = vmalloc(dvbdemux->feednum * sizeof(struct dvb_demux_feed)); |
| 1247 | if (!dvbdemux->feed) { | 1237 | if (!dvbdemux->feed) { |
| 1248 | vfree(dvbdemux->filter); | 1238 | vfree(dvbdemux->filter); |
| 1239 | dvbdemux->filter = NULL; | ||
| 1249 | return -ENOMEM; | 1240 | return -ENOMEM; |
| 1250 | } | 1241 | } |
| 1251 | for (i = 0; i < dvbdemux->filternum; i++) { | 1242 | for (i = 0; i < dvbdemux->filternum; i++) { |
| @@ -1257,6 +1248,13 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux) | |||
| 1257 | dvbdemux->feed[i].index = i; | 1248 | dvbdemux->feed[i].index = i; |
| 1258 | } | 1249 | } |
| 1259 | 1250 | ||
| 1251 | if (dvb_demux_tscheck) { | ||
| 1252 | dvbdemux->cnt_storage = vmalloc(MAX_PID + 1); | ||
| 1253 | |||
| 1254 | if (!dvbdemux->cnt_storage) | ||
| 1255 | printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n"); | ||
| 1256 | } | ||
| 1257 | |||
| 1260 | INIT_LIST_HEAD(&dvbdemux->frontend_list); | 1258 | INIT_LIST_HEAD(&dvbdemux->frontend_list); |
| 1261 | 1259 | ||
| 1262 | for (i = 0; i < DMX_TS_PES_OTHER; i++) { | 1260 | for (i = 0; i < DMX_TS_PES_OTHER; i++) { |
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 7dfecfc6017c..ee5bff02a92c 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
| @@ -93,9 +93,9 @@ static int ts_open(struct file *file) | |||
| 93 | dprintk("open dev=%s\n", video_device_node_name(vdev)); | 93 | dprintk("open dev=%s\n", video_device_node_name(vdev)); |
| 94 | err = -EBUSY; | 94 | err = -EBUSY; |
| 95 | if (!mutex_trylock(&dev->empress_tsq.vb_lock)) | 95 | if (!mutex_trylock(&dev->empress_tsq.vb_lock)) |
| 96 | goto done; | 96 | return err; |
| 97 | if (atomic_read(&dev->empress_users)) | 97 | if (atomic_read(&dev->empress_users)) |
| 98 | goto done_up; | 98 | goto done; |
| 99 | 99 | ||
| 100 | /* Unmute audio */ | 100 | /* Unmute audio */ |
| 101 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | 101 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, |
| @@ -105,10 +105,8 @@ static int ts_open(struct file *file) | |||
| 105 | file->private_data = dev; | 105 | file->private_data = dev; |
| 106 | err = 0; | 106 | err = 0; |
| 107 | 107 | ||
| 108 | done_up: | ||
| 109 | mutex_unlock(&dev->empress_tsq.vb_lock); | ||
| 110 | done: | 108 | done: |
| 111 | unlock_kernel(); | 109 | mutex_unlock(&dev->empress_tsq.vb_lock); |
| 112 | return err; | 110 | return err; |
| 113 | } | 111 | } |
| 114 | 112 | ||
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 57752751712b..81279b3d694c 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
| @@ -1796,7 +1796,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) | |||
| 1796 | dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: " | 1796 | dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: " |
| 1797 | "Command not in the active list! (sc=%p)\n", ioc->name, | 1797 | "Command not in the active list! (sc=%p)\n", ioc->name, |
| 1798 | SCpnt)); | 1798 | SCpnt)); |
| 1799 | retval = 0; | 1799 | retval = SUCCESS; |
| 1800 | goto out; | 1800 | goto out; |
| 1801 | } | 1801 | } |
| 1802 | 1802 | ||
diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c index b9f1e84897cc..e7f8027165e6 100644 --- a/drivers/mmc/card/mmc_test.c +++ b/drivers/mmc/card/mmc_test.c | |||
| @@ -74,6 +74,9 @@ static void mmc_test_prepare_mrq(struct mmc_test_card *test, | |||
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | mrq->cmd->arg = dev_addr; | 76 | mrq->cmd->arg = dev_addr; |
| 77 | if (!mmc_card_blockaddr(test->card)) | ||
| 78 | mrq->cmd->arg <<= 9; | ||
| 79 | |||
| 77 | mrq->cmd->flags = MMC_RSP_R1 | MMC_CMD_ADTC; | 80 | mrq->cmd->flags = MMC_RSP_R1 | MMC_CMD_ADTC; |
| 78 | 81 | ||
| 79 | if (blocks == 1) | 82 | if (blocks == 1) |
| @@ -190,7 +193,7 @@ static int __mmc_test_prepare(struct mmc_test_card *test, int write) | |||
| 190 | } | 193 | } |
| 191 | 194 | ||
| 192 | for (i = 0;i < BUFFER_SIZE / 512;i++) { | 195 | for (i = 0;i < BUFFER_SIZE / 512;i++) { |
| 193 | ret = mmc_test_buffer_transfer(test, test->buffer, i * 512, 512, 1); | 196 | ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1); |
| 194 | if (ret) | 197 | if (ret) |
| 195 | return ret; | 198 | return ret; |
| 196 | } | 199 | } |
| @@ -219,7 +222,7 @@ static int mmc_test_cleanup(struct mmc_test_card *test) | |||
| 219 | memset(test->buffer, 0, 512); | 222 | memset(test->buffer, 0, 512); |
| 220 | 223 | ||
| 221 | for (i = 0;i < BUFFER_SIZE / 512;i++) { | 224 | for (i = 0;i < BUFFER_SIZE / 512;i++) { |
| 222 | ret = mmc_test_buffer_transfer(test, test->buffer, i * 512, 512, 1); | 225 | ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1); |
| 223 | if (ret) | 226 | if (ret) |
| 224 | return ret; | 227 | return ret; |
| 225 | } | 228 | } |
| @@ -426,7 +429,7 @@ static int mmc_test_transfer(struct mmc_test_card *test, | |||
| 426 | for (i = 0;i < sectors;i++) { | 429 | for (i = 0;i < sectors;i++) { |
| 427 | ret = mmc_test_buffer_transfer(test, | 430 | ret = mmc_test_buffer_transfer(test, |
| 428 | test->buffer + i * 512, | 431 | test->buffer + i * 512, |
| 429 | dev_addr + i * 512, 512, 0); | 432 | dev_addr + i, 512, 0); |
| 430 | if (ret) | 433 | if (ret) |
| 431 | return ret; | 434 | return ret; |
| 432 | } | 435 | } |
diff --git a/drivers/net/ax88796.c b/drivers/net/ax88796.c index 62d9c9cc5671..1dd4403247ca 100644 --- a/drivers/net/ax88796.c +++ b/drivers/net/ax88796.c | |||
| @@ -921,7 +921,7 @@ static int ax_probe(struct platform_device *pdev) | |||
| 921 | size = (res->end - res->start) + 1; | 921 | size = (res->end - res->start) + 1; |
| 922 | 922 | ||
| 923 | ax->mem2 = request_mem_region(res->start, size, pdev->name); | 923 | ax->mem2 = request_mem_region(res->start, size, pdev->name); |
| 924 | if (ax->mem == NULL) { | 924 | if (ax->mem2 == NULL) { |
| 925 | dev_err(&pdev->dev, "cannot reserve registers\n"); | 925 | dev_err(&pdev->dev, "cannot reserve registers\n"); |
| 926 | ret = -ENXIO; | 926 | ret = -ENXIO; |
| 927 | goto exit_mem1; | 927 | goto exit_mem1; |
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index 9fd8e5ecd5d7..5bc74590c73e 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
| @@ -276,8 +276,13 @@ struct be_adapter { | |||
| 276 | int link_speed; | 276 | int link_speed; |
| 277 | u8 port_type; | 277 | u8 port_type; |
| 278 | u8 transceiver; | 278 | u8 transceiver; |
| 279 | u8 generation; /* BladeEngine ASIC generation */ | ||
| 279 | }; | 280 | }; |
| 280 | 281 | ||
| 282 | /* BladeEngine Generation numbers */ | ||
| 283 | #define BE_GEN2 2 | ||
| 284 | #define BE_GEN3 3 | ||
| 285 | |||
| 281 | extern const struct ethtool_ops be_ethtool_ops; | 286 | extern const struct ethtool_ops be_ethtool_ops; |
| 282 | 287 | ||
| 283 | #define drvr_stats(adapter) (&adapter->stats.drvr_stats) | 288 | #define drvr_stats(adapter) (&adapter->stats.drvr_stats) |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index c002b8391b4d..13b33c841083 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -164,7 +164,8 @@ struct be_cmd_req_hdr { | |||
| 164 | u8 domain; /* dword 0 */ | 164 | u8 domain; /* dword 0 */ |
| 165 | u32 timeout; /* dword 1 */ | 165 | u32 timeout; /* dword 1 */ |
| 166 | u32 request_length; /* dword 2 */ | 166 | u32 request_length; /* dword 2 */ |
| 167 | u32 rsvd; /* dword 3 */ | 167 | u8 version; /* dword 3 */ |
| 168 | u8 rsvd[3]; /* dword 3 */ | ||
| 168 | }; | 169 | }; |
| 169 | 170 | ||
| 170 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ | 171 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 33ab8c7f14fe..626b76c0ebc7 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -1350,7 +1350,7 @@ static irqreturn_t be_intx(int irq, void *dev) | |||
| 1350 | int isr; | 1350 | int isr; |
| 1351 | 1351 | ||
| 1352 | isr = ioread32(adapter->csr + CEV_ISR0_OFFSET + | 1352 | isr = ioread32(adapter->csr + CEV_ISR0_OFFSET + |
| 1353 | be_pci_func(adapter) * CEV_ISR_SIZE); | 1353 | (adapter->tx_eq.q.id/ 8) * CEV_ISR_SIZE); |
| 1354 | if (!isr) | 1354 | if (!isr) |
| 1355 | return IRQ_NONE; | 1355 | return IRQ_NONE; |
| 1356 | 1356 | ||
| @@ -2051,6 +2051,7 @@ static void be_unmap_pci_bars(struct be_adapter *adapter) | |||
| 2051 | static int be_map_pci_bars(struct be_adapter *adapter) | 2051 | static int be_map_pci_bars(struct be_adapter *adapter) |
| 2052 | { | 2052 | { |
| 2053 | u8 __iomem *addr; | 2053 | u8 __iomem *addr; |
| 2054 | int pcicfg_reg; | ||
| 2054 | 2055 | ||
| 2055 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), | 2056 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), |
| 2056 | pci_resource_len(adapter->pdev, 2)); | 2057 | pci_resource_len(adapter->pdev, 2)); |
| @@ -2064,8 +2065,13 @@ static int be_map_pci_bars(struct be_adapter *adapter) | |||
| 2064 | goto pci_map_err; | 2065 | goto pci_map_err; |
| 2065 | adapter->db = addr; | 2066 | adapter->db = addr; |
| 2066 | 2067 | ||
| 2067 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1), | 2068 | if (adapter->generation == BE_GEN2) |
| 2068 | pci_resource_len(adapter->pdev, 1)); | 2069 | pcicfg_reg = 1; |
| 2070 | else | ||
| 2071 | pcicfg_reg = 0; | ||
| 2072 | |||
| 2073 | addr = ioremap_nocache(pci_resource_start(adapter->pdev, pcicfg_reg), | ||
| 2074 | pci_resource_len(adapter->pdev, pcicfg_reg)); | ||
| 2069 | if (addr == NULL) | 2075 | if (addr == NULL) |
| 2070 | goto pci_map_err; | 2076 | goto pci_map_err; |
| 2071 | adapter->pcicfg = addr; | 2077 | adapter->pcicfg = addr; |
| @@ -2162,6 +2168,7 @@ static int be_stats_init(struct be_adapter *adapter) | |||
| 2162 | cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma); | 2168 | cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma); |
| 2163 | if (cmd->va == NULL) | 2169 | if (cmd->va == NULL) |
| 2164 | return -1; | 2170 | return -1; |
| 2171 | memset(cmd->va, 0, cmd->size); | ||
| 2165 | return 0; | 2172 | return 0; |
| 2166 | } | 2173 | } |
| 2167 | 2174 | ||
| @@ -2240,6 +2247,20 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
| 2240 | goto rel_reg; | 2247 | goto rel_reg; |
| 2241 | } | 2248 | } |
| 2242 | adapter = netdev_priv(netdev); | 2249 | adapter = netdev_priv(netdev); |
| 2250 | |||
| 2251 | switch (pdev->device) { | ||
| 2252 | case BE_DEVICE_ID1: | ||
| 2253 | case OC_DEVICE_ID1: | ||
| 2254 | adapter->generation = BE_GEN2; | ||
| 2255 | break; | ||
| 2256 | case BE_DEVICE_ID2: | ||
| 2257 | case OC_DEVICE_ID2: | ||
| 2258 | adapter->generation = BE_GEN3; | ||
| 2259 | break; | ||
| 2260 | default: | ||
| 2261 | adapter->generation = 0; | ||
| 2262 | } | ||
| 2263 | |||
| 2243 | adapter->pdev = pdev; | 2264 | adapter->pdev = pdev; |
| 2244 | pci_set_drvdata(pdev, adapter); | 2265 | pci_set_drvdata(pdev, adapter); |
| 2245 | adapter->netdev = netdev; | 2266 | adapter->netdev = netdev; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 3f0071cfe56b..efa0e41bf3ec 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -3639,7 +3639,7 @@ static int bond_open(struct net_device *bond_dev) | |||
| 3639 | */ | 3639 | */ |
| 3640 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) { | 3640 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) { |
| 3641 | /* something went wrong - fail the open operation */ | 3641 | /* something went wrong - fail the open operation */ |
| 3642 | return -1; | 3642 | return -ENOMEM; |
| 3643 | } | 3643 | } |
| 3644 | 3644 | ||
| 3645 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); | 3645 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index bdbd14727e4b..318a018ca7c5 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
| @@ -2079,6 +2079,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2079 | struct sge_fl *fl, int len, int complete) | 2079 | struct sge_fl *fl, int len, int complete) |
| 2080 | { | 2080 | { |
| 2081 | struct rx_sw_desc *sd = &fl->sdesc[fl->cidx]; | 2081 | struct rx_sw_desc *sd = &fl->sdesc[fl->cidx]; |
| 2082 | struct port_info *pi = netdev_priv(qs->netdev); | ||
| 2082 | struct sk_buff *skb = NULL; | 2083 | struct sk_buff *skb = NULL; |
| 2083 | struct cpl_rx_pkt *cpl; | 2084 | struct cpl_rx_pkt *cpl; |
| 2084 | struct skb_frag_struct *rx_frag; | 2085 | struct skb_frag_struct *rx_frag; |
| @@ -2116,11 +2117,18 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2116 | 2117 | ||
| 2117 | if (!nr_frags) { | 2118 | if (!nr_frags) { |
| 2118 | offset = 2 + sizeof(struct cpl_rx_pkt); | 2119 | offset = 2 + sizeof(struct cpl_rx_pkt); |
| 2119 | qs->lro_va = sd->pg_chunk.va + 2; | 2120 | cpl = qs->lro_va = sd->pg_chunk.va + 2; |
| 2120 | } | ||
| 2121 | len -= offset; | ||
| 2122 | 2121 | ||
| 2123 | prefetch(qs->lro_va); | 2122 | if ((pi->rx_offload & T3_RX_CSUM) && |
| 2123 | cpl->csum_valid && cpl->csum == htons(0xffff)) { | ||
| 2124 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 2125 | qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; | ||
| 2126 | } else | ||
| 2127 | skb->ip_summed = CHECKSUM_NONE; | ||
| 2128 | } else | ||
| 2129 | cpl = qs->lro_va; | ||
| 2130 | |||
| 2131 | len -= offset; | ||
| 2124 | 2132 | ||
| 2125 | rx_frag += nr_frags; | 2133 | rx_frag += nr_frags; |
| 2126 | rx_frag->page = sd->pg_chunk.page; | 2134 | rx_frag->page = sd->pg_chunk.page; |
| @@ -2136,12 +2144,8 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, | |||
| 2136 | return; | 2144 | return; |
| 2137 | 2145 | ||
| 2138 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); | 2146 | skb_record_rx_queue(skb, qs - &adap->sge.qs[0]); |
| 2139 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 2140 | cpl = qs->lro_va; | ||
| 2141 | 2147 | ||
| 2142 | if (unlikely(cpl->vlan_valid)) { | 2148 | if (unlikely(cpl->vlan_valid)) { |
| 2143 | struct net_device *dev = qs->netdev; | ||
| 2144 | struct port_info *pi = netdev_priv(dev); | ||
| 2145 | struct vlan_group *grp = pi->vlan_grp; | 2149 | struct vlan_group *grp = pi->vlan_grp; |
| 2146 | 2150 | ||
| 2147 | if (likely(grp != NULL)) { | 2151 | if (likely(grp != NULL)) { |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 997124d2992a..c881347cb26d 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -421,6 +421,8 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector) | |||
| 421 | msixbm = E1000_EICR_RX_QUEUE0 << rx_queue; | 421 | msixbm = E1000_EICR_RX_QUEUE0 << rx_queue; |
| 422 | if (tx_queue > IGB_N0_QUEUE) | 422 | if (tx_queue > IGB_N0_QUEUE) |
| 423 | msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue; | 423 | msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue; |
| 424 | if (!adapter->msix_entries && msix_vector == 0) | ||
| 425 | msixbm |= E1000_EIMS_OTHER; | ||
| 424 | array_wr32(E1000_MSIXBM(0), msix_vector, msixbm); | 426 | array_wr32(E1000_MSIXBM(0), msix_vector, msixbm); |
| 425 | q_vector->eims_value = msixbm; | 427 | q_vector->eims_value = msixbm; |
| 426 | break; | 428 | break; |
| @@ -877,7 +879,6 @@ static int igb_request_irq(struct igb_adapter *adapter) | |||
| 877 | { | 879 | { |
| 878 | struct net_device *netdev = adapter->netdev; | 880 | struct net_device *netdev = adapter->netdev; |
| 879 | struct pci_dev *pdev = adapter->pdev; | 881 | struct pci_dev *pdev = adapter->pdev; |
| 880 | struct e1000_hw *hw = &adapter->hw; | ||
| 881 | int err = 0; | 882 | int err = 0; |
| 882 | 883 | ||
| 883 | if (adapter->msix_entries) { | 884 | if (adapter->msix_entries) { |
| @@ -909,20 +910,7 @@ static int igb_request_irq(struct igb_adapter *adapter) | |||
| 909 | igb_setup_all_tx_resources(adapter); | 910 | igb_setup_all_tx_resources(adapter); |
| 910 | igb_setup_all_rx_resources(adapter); | 911 | igb_setup_all_rx_resources(adapter); |
| 911 | } else { | 912 | } else { |
| 912 | switch (hw->mac.type) { | 913 | igb_assign_vector(adapter->q_vector[0], 0); |
| 913 | case e1000_82575: | ||
| 914 | wr32(E1000_MSIXBM(0), | ||
| 915 | (E1000_EICR_RX_QUEUE0 | | ||
| 916 | E1000_EICR_TX_QUEUE0 | | ||
| 917 | E1000_EIMS_OTHER)); | ||
| 918 | break; | ||
| 919 | case e1000_82580: | ||
| 920 | case e1000_82576: | ||
| 921 | wr32(E1000_IVAR0, E1000_IVAR_VALID); | ||
| 922 | break; | ||
| 923 | default: | ||
| 924 | break; | ||
| 925 | } | ||
| 926 | } | 914 | } |
| 927 | 915 | ||
| 928 | if (adapter->flags & IGB_FLAG_HAS_MSI) { | 916 | if (adapter->flags & IGB_FLAG_HAS_MSI) { |
| @@ -1140,6 +1128,8 @@ int igb_up(struct igb_adapter *adapter) | |||
| 1140 | } | 1128 | } |
| 1141 | if (adapter->msix_entries) | 1129 | if (adapter->msix_entries) |
| 1142 | igb_configure_msix(adapter); | 1130 | igb_configure_msix(adapter); |
| 1131 | else | ||
| 1132 | igb_assign_vector(adapter->q_vector[0], 0); | ||
| 1143 | 1133 | ||
| 1144 | /* Clear any pending interrupts. */ | 1134 | /* Clear any pending interrupts. */ |
| 1145 | rd32(E1000_ICR); | 1135 | rd32(E1000_ICR); |
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c index 297a5ddd77f0..2aa71a766c35 100644 --- a/drivers/net/igbvf/netdev.c +++ b/drivers/net/igbvf/netdev.c | |||
| @@ -2117,6 +2117,7 @@ static inline int igbvf_tx_map_adv(struct igbvf_adapter *adapter, | |||
| 2117 | /* set time_stamp *before* dma to help avoid a possible race */ | 2117 | /* set time_stamp *before* dma to help avoid a possible race */ |
| 2118 | buffer_info->time_stamp = jiffies; | 2118 | buffer_info->time_stamp = jiffies; |
| 2119 | buffer_info->next_to_watch = i; | 2119 | buffer_info->next_to_watch = i; |
| 2120 | buffer_info->mapped_as_page = false; | ||
| 2120 | buffer_info->dma = pci_map_single(pdev, skb->data, len, | 2121 | buffer_info->dma = pci_map_single(pdev, skb->data, len, |
| 2121 | PCI_DMA_TODEVICE); | 2122 | PCI_DMA_TODEVICE); |
| 2122 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) | 2123 | if (pci_dma_mapping_error(pdev, buffer_info->dma)) |
diff --git a/drivers/net/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ixgbe/ixgbe_dcb_nl.c index 56f37f66b696..dd4883f642be 100644 --- a/drivers/net/ixgbe/ixgbe_dcb_nl.c +++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c | |||
| @@ -223,7 +223,7 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | |||
| 223 | 223 | ||
| 224 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != | 224 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != |
| 225 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) { | 225 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) { |
| 226 | adapter->dcb_set_bitmap |= BIT_PG_RX; | 226 | adapter->dcb_set_bitmap |= BIT_PG_TX; |
| 227 | adapter->dcb_set_bitmap |= BIT_RESETLINK; | 227 | adapter->dcb_set_bitmap |= BIT_RESETLINK; |
| 228 | } | 228 | } |
| 229 | } | 229 | } |
| @@ -341,6 +341,12 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 341 | if (!adapter->dcb_set_bitmap) | 341 | if (!adapter->dcb_set_bitmap) |
| 342 | return DCB_NO_HW_CHG; | 342 | return DCB_NO_HW_CHG; |
| 343 | 343 | ||
| 344 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | ||
| 345 | adapter->ring_feature[RING_F_DCB].indices); | ||
| 346 | |||
| 347 | if (ret) | ||
| 348 | return DCB_NO_HW_CHG; | ||
| 349 | |||
| 344 | /* | 350 | /* |
| 345 | * Only take down the adapter if the configuration change | 351 | * Only take down the adapter if the configuration change |
| 346 | * requires a reset. | 352 | * requires a reset. |
| @@ -359,14 +365,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 359 | } | 365 | } |
| 360 | } | 366 | } |
| 361 | 367 | ||
| 362 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | ||
| 363 | adapter->ring_feature[RING_F_DCB].indices); | ||
| 364 | if (ret) { | ||
| 365 | if (adapter->dcb_set_bitmap & BIT_RESETLINK) | ||
| 366 | clear_bit(__IXGBE_RESETTING, &adapter->state); | ||
| 367 | return DCB_NO_HW_CHG; | ||
| 368 | } | ||
| 369 | |||
| 370 | if (adapter->dcb_cfg.pfc_mode_enable) { | 368 | if (adapter->dcb_cfg.pfc_mode_enable) { |
| 371 | if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && | 369 | if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && |
| 372 | (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) | 370 | (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index b5f64ad67975..7b7c8486c0bf 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -5179,7 +5179,7 @@ dma_error: | |||
| 5179 | ixgbe_unmap_and_free_tx_resource(adapter, tx_buffer_info); | 5179 | ixgbe_unmap_and_free_tx_resource(adapter, tx_buffer_info); |
| 5180 | } | 5180 | } |
| 5181 | 5181 | ||
| 5182 | return count; | 5182 | return 0; |
| 5183 | } | 5183 | } |
| 5184 | 5184 | ||
| 5185 | static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, | 5185 | static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, |
| @@ -5329,8 +5329,11 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
| 5329 | struct ixgbe_adapter *adapter = netdev_priv(dev); | 5329 | struct ixgbe_adapter *adapter = netdev_priv(dev); |
| 5330 | int txq = smp_processor_id(); | 5330 | int txq = smp_processor_id(); |
| 5331 | 5331 | ||
| 5332 | if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) | 5332 | if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) { |
| 5333 | while (unlikely(txq >= dev->real_num_tx_queues)) | ||
| 5334 | txq -= dev->real_num_tx_queues; | ||
| 5333 | return txq; | 5335 | return txq; |
| 5336 | } | ||
| 5334 | 5337 | ||
| 5335 | #ifdef IXGBE_FCOE | 5338 | #ifdef IXGBE_FCOE |
| 5336 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && | 5339 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && |
diff --git a/drivers/net/ks8851_mll.c b/drivers/net/ks8851_mll.c index c146304d8d6c..c0ceebccaa49 100644 --- a/drivers/net/ks8851_mll.c +++ b/drivers/net/ks8851_mll.c | |||
| @@ -854,8 +854,8 @@ static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks) | |||
| 854 | 854 | ||
| 855 | static irqreturn_t ks_irq(int irq, void *pw) | 855 | static irqreturn_t ks_irq(int irq, void *pw) |
| 856 | { | 856 | { |
| 857 | struct ks_net *ks = pw; | 857 | struct net_device *netdev = pw; |
| 858 | struct net_device *netdev = ks->netdev; | 858 | struct ks_net *ks = netdev_priv(netdev); |
| 859 | u16 status; | 859 | u16 status; |
| 860 | 860 | ||
| 861 | /*this should be the first in IRQ handler */ | 861 | /*this should be the first in IRQ handler */ |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 9f9d6081959b..24279e6e55f5 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -1941,7 +1941,7 @@ static void netxen_tx_timeout_task(struct work_struct *work) | |||
| 1941 | netif_wake_queue(adapter->netdev); | 1941 | netif_wake_queue(adapter->netdev); |
| 1942 | 1942 | ||
| 1943 | clear_bit(__NX_RESETTING, &adapter->state); | 1943 | clear_bit(__NX_RESETTING, &adapter->state); |
| 1944 | 1944 | return; | |
| 1945 | } else { | 1945 | } else { |
| 1946 | clear_bit(__NX_RESETTING, &adapter->state); | 1946 | clear_bit(__NX_RESETTING, &adapter->state); |
| 1947 | if (!netxen_nic_reset_context(adapter)) { | 1947 | if (!netxen_nic_reset_context(adapter)) { |
| @@ -2240,7 +2240,9 @@ netxen_detach_work(struct work_struct *work) | |||
| 2240 | 2240 | ||
| 2241 | netxen_nic_down(adapter, netdev); | 2241 | netxen_nic_down(adapter, netdev); |
| 2242 | 2242 | ||
| 2243 | rtnl_lock(); | ||
| 2243 | netxen_nic_detach(adapter); | 2244 | netxen_nic_detach(adapter); |
| 2245 | rtnl_unlock(); | ||
| 2244 | 2246 | ||
| 2245 | status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1); | 2247 | status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1); |
| 2246 | 2248 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index d760650c5c04..67249c3c9f50 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -1025,11 +1025,8 @@ static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr, | |||
| 1025 | static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) | 1025 | static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) |
| 1026 | { | 1026 | { |
| 1027 | struct sky2_tx_le *le = sky2->tx_le + *slot; | 1027 | struct sky2_tx_le *le = sky2->tx_le + *slot; |
| 1028 | struct tx_ring_info *re = sky2->tx_ring + *slot; | ||
| 1029 | 1028 | ||
| 1030 | *slot = RING_NEXT(*slot, sky2->tx_ring_size); | 1029 | *slot = RING_NEXT(*slot, sky2->tx_ring_size); |
| 1031 | re->flags = 0; | ||
| 1032 | re->skb = NULL; | ||
| 1033 | le->ctrl = 0; | 1030 | le->ctrl = 0; |
| 1034 | return le; | 1031 | return le; |
| 1035 | } | 1032 | } |
| @@ -1622,8 +1619,7 @@ static unsigned tx_le_req(const struct sk_buff *skb) | |||
| 1622 | return count; | 1619 | return count; |
| 1623 | } | 1620 | } |
| 1624 | 1621 | ||
| 1625 | static void sky2_tx_unmap(struct pci_dev *pdev, | 1622 | static void sky2_tx_unmap(struct pci_dev *pdev, struct tx_ring_info *re) |
| 1626 | const struct tx_ring_info *re) | ||
| 1627 | { | 1623 | { |
| 1628 | if (re->flags & TX_MAP_SINGLE) | 1624 | if (re->flags & TX_MAP_SINGLE) |
| 1629 | pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr), | 1625 | pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr), |
| @@ -1633,6 +1629,7 @@ static void sky2_tx_unmap(struct pci_dev *pdev, | |||
| 1633 | pci_unmap_page(pdev, pci_unmap_addr(re, mapaddr), | 1629 | pci_unmap_page(pdev, pci_unmap_addr(re, mapaddr), |
| 1634 | pci_unmap_len(re, maplen), | 1630 | pci_unmap_len(re, maplen), |
| 1635 | PCI_DMA_TODEVICE); | 1631 | PCI_DMA_TODEVICE); |
| 1632 | re->flags = 0; | ||
| 1636 | } | 1633 | } |
| 1637 | 1634 | ||
| 1638 | /* | 1635 | /* |
| @@ -1839,6 +1836,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) | |||
| 1839 | dev->stats.tx_packets++; | 1836 | dev->stats.tx_packets++; |
| 1840 | dev->stats.tx_bytes += skb->len; | 1837 | dev->stats.tx_bytes += skb->len; |
| 1841 | 1838 | ||
| 1839 | re->skb = NULL; | ||
| 1842 | dev_kfree_skb_any(skb); | 1840 | dev_kfree_skb_any(skb); |
| 1843 | 1841 | ||
| 1844 | sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size); | 1842 | sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size); |
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 95db60adde41..f9521136a869 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
| @@ -1063,7 +1063,7 @@ static int netdev_open(struct net_device *dev) | |||
| 1063 | if (retval) { | 1063 | if (retval) { |
| 1064 | printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", | 1064 | printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n", |
| 1065 | FIRMWARE_RX); | 1065 | FIRMWARE_RX); |
| 1066 | return retval; | 1066 | goto out_init; |
| 1067 | } | 1067 | } |
| 1068 | if (fw_rx->size % 4) { | 1068 | if (fw_rx->size % 4) { |
| 1069 | printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", | 1069 | printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n", |
| @@ -1108,6 +1108,9 @@ out_tx: | |||
| 1108 | release_firmware(fw_tx); | 1108 | release_firmware(fw_tx); |
| 1109 | out_rx: | 1109 | out_rx: |
| 1110 | release_firmware(fw_rx); | 1110 | release_firmware(fw_rx); |
| 1111 | out_init: | ||
| 1112 | if (retval) | ||
| 1113 | netdev_close(dev); | ||
| 1111 | return retval; | 1114 | return retval; |
| 1112 | } | 1115 | } |
| 1113 | 1116 | ||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 21e183a83b99..4f27f022fbf7 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -419,7 +419,7 @@ static int cdc_manage_power(struct usbnet *dev, int on) | |||
| 419 | 419 | ||
| 420 | static const struct driver_info cdc_info = { | 420 | static const struct driver_info cdc_info = { |
| 421 | .description = "CDC Ethernet Device", | 421 | .description = "CDC Ethernet Device", |
| 422 | .flags = FLAG_ETHER | FLAG_LINK_INTR, | 422 | .flags = FLAG_ETHER, |
| 423 | // .check_connect = cdc_check_connect, | 423 | // .check_connect = cdc_check_connect, |
| 424 | .bind = cdc_bind, | 424 | .bind = cdc_bind, |
| 425 | .unbind = usbnet_cdc_unbind, | 425 | .unbind = usbnet_cdc_unbind, |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 2ec61f08cfdb..ae371448b5a0 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -855,12 +855,11 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) | |||
| 855 | } | 855 | } |
| 856 | } | 856 | } |
| 857 | 857 | ||
| 858 | static void ath9k_hw_init_11a_eeprom_fix(struct ath_hw *ah) | 858 | static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah) |
| 859 | { | 859 | { |
| 860 | u32 i, j; | 860 | u32 i, j; |
| 861 | 861 | ||
| 862 | if ((ah->hw_version.devid == AR9280_DEVID_PCI) && | 862 | if (ah->hw_version.devid == AR9280_DEVID_PCI) { |
| 863 | test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) { | ||
| 864 | 863 | ||
| 865 | /* EEPROM Fixup */ | 864 | /* EEPROM Fixup */ |
| 866 | for (i = 0; i < ah->iniModes.ia_rows; i++) { | 865 | for (i = 0; i < ah->iniModes.ia_rows; i++) { |
| @@ -980,7 +979,7 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
| 980 | if (r) | 979 | if (r) |
| 981 | return r; | 980 | return r; |
| 982 | 981 | ||
| 983 | ath9k_hw_init_11a_eeprom_fix(ah); | 982 | ath9k_hw_init_eeprom_fix(ah); |
| 984 | 983 | ||
| 985 | r = ath9k_hw_init_macaddr(ah); | 984 | r = ath9k_hw_init_macaddr(ah); |
| 986 | if (r) { | 985 | if (r) { |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 996eb90263cc..643bea35686f 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -2655,10 +2655,10 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
| 2655 | (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) { | 2655 | (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) { |
| 2656 | ath9k_ps_wakeup(sc); | 2656 | ath9k_ps_wakeup(sc); |
| 2657 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); | 2657 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); |
| 2658 | ath_beacon_return(sc, avp); | ||
| 2659 | ath9k_ps_restore(sc); | 2658 | ath9k_ps_restore(sc); |
| 2660 | } | 2659 | } |
| 2661 | 2660 | ||
| 2661 | ath_beacon_return(sc, avp); | ||
| 2662 | sc->sc_flags &= ~SC_OP_BEACONS; | 2662 | sc->sc_flags &= ~SC_OP_BEACONS; |
| 2663 | 2663 | ||
| 2664 | for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) { | 2664 | for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index cde09a890b73..90fbdb25399e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
| @@ -297,7 +297,7 @@ u8 iwl_add_station(struct iwl_priv *priv, const u8 *addr, bool is_ap, u8 flags, | |||
| 297 | } | 297 | } |
| 298 | EXPORT_SYMBOL(iwl_add_station); | 298 | EXPORT_SYMBOL(iwl_add_station); |
| 299 | 299 | ||
| 300 | static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const char *addr) | 300 | static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, const u8 *addr) |
| 301 | { | 301 | { |
| 302 | unsigned long flags; | 302 | unsigned long flags; |
| 303 | u8 sta_id = iwl_find_station(priv, addr); | 303 | u8 sta_id = iwl_find_station(priv, addr); |
| @@ -324,7 +324,7 @@ static void iwl_remove_sta_callback(struct iwl_priv *priv, | |||
| 324 | { | 324 | { |
| 325 | struct iwl_rem_sta_cmd *rm_sta = | 325 | struct iwl_rem_sta_cmd *rm_sta = |
| 326 | (struct iwl_rem_sta_cmd *)cmd->cmd.payload; | 326 | (struct iwl_rem_sta_cmd *)cmd->cmd.payload; |
| 327 | const char *addr = rm_sta->addr; | 327 | const u8 *addr = rm_sta->addr; |
| 328 | 328 | ||
| 329 | if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) { | 329 | if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) { |
| 330 | IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n", | 330 | IWL_ERR(priv, "Bad return from REPLY_REMOVE_STA (0x%08X)\n", |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index c74694345b6e..d58b94030ef3 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -338,6 +338,23 @@ static void __devinit quirk_s3_64M(struct pci_dev *dev) | |||
| 338 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); | 338 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); |
| 339 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); | 339 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); |
| 340 | 340 | ||
| 341 | /* | ||
| 342 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS | ||
| 343 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. | ||
| 344 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k | ||
| 345 | * (which conflicts w/ BAR1's memory range). | ||
| 346 | */ | ||
| 347 | static void __devinit quirk_cs5536_vsa(struct pci_dev *dev) | ||
| 348 | { | ||
| 349 | if (pci_resource_len(dev, 0) != 8) { | ||
| 350 | struct resource *res = &dev->resource[0]; | ||
| 351 | res->end = res->start + 8 - 1; | ||
| 352 | dev_info(&dev->dev, "CS5536 ISA bridge bug detected " | ||
| 353 | "(incorrect header); workaround applied.\n"); | ||
| 354 | } | ||
| 355 | } | ||
| 356 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); | ||
| 357 | |||
| 341 | static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, | 358 | static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, |
| 342 | unsigned size, int nr, const char *name) | 359 | unsigned size, int nr, const char *name) |
| 343 | { | 360 | { |
diff --git a/drivers/power/wm97xx_battery.c b/drivers/power/wm97xx_battery.c index fa39e759a275..6ea3cb5837c7 100644 --- a/drivers/power/wm97xx_battery.c +++ b/drivers/power/wm97xx_battery.c | |||
| @@ -175,8 +175,14 @@ static int __devinit wm97xx_bat_probe(struct platform_device *dev) | |||
| 175 | dev_err(&dev->dev, "Do not pass platform_data through " | 175 | dev_err(&dev->dev, "Do not pass platform_data through " |
| 176 | "wm97xx_bat_set_pdata!\n"); | 176 | "wm97xx_bat_set_pdata!\n"); |
| 177 | return -EINVAL; | 177 | return -EINVAL; |
| 178 | } else | 178 | } |
| 179 | pdata = wmdata->batt_pdata; | 179 | |
| 180 | if (!wmdata) { | ||
| 181 | dev_err(&dev->dev, "No platform data supplied\n"); | ||
| 182 | return -EINVAL; | ||
| 183 | } | ||
| 184 | |||
| 185 | pdata = wmdata->batt_pdata; | ||
| 180 | 186 | ||
| 181 | if (dev->id != -1) | 187 | if (dev->id != -1) |
| 182 | return -EINVAL; | 188 | return -EINVAL; |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 686ef270ecf7..b60a4c9f8f16 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -661,7 +661,7 @@ static int suspend_prepare(struct regulator_dev *rdev, suspend_state_t state) | |||
| 661 | static void print_constraints(struct regulator_dev *rdev) | 661 | static void print_constraints(struct regulator_dev *rdev) |
| 662 | { | 662 | { |
| 663 | struct regulation_constraints *constraints = rdev->constraints; | 663 | struct regulation_constraints *constraints = rdev->constraints; |
| 664 | char buf[80]; | 664 | char buf[80] = ""; |
| 665 | int count = 0; | 665 | int count = 0; |
| 666 | int ret; | 666 | int ret; |
| 667 | 667 | ||
diff --git a/drivers/regulator/lp3971.c b/drivers/regulator/lp3971.c index 76d08c282f9c..4f33a0f4a179 100644 --- a/drivers/regulator/lp3971.c +++ b/drivers/regulator/lp3971.c | |||
| @@ -183,7 +183,7 @@ static int lp3971_ldo_set_voltage(struct regulator_dev *dev, | |||
| 183 | if (vol_map[val] >= min_vol) | 183 | if (vol_map[val] >= min_vol) |
| 184 | break; | 184 | break; |
| 185 | 185 | ||
| 186 | if (vol_map[val] > max_vol) | 186 | if (val > LDO_VOL_MAX_IDX || vol_map[val] > max_vol) |
| 187 | return -EINVAL; | 187 | return -EINVAL; |
| 188 | 188 | ||
| 189 | return lp3971_set_bits(lp3971, LP3971_LDO_VOL_CONTR_REG(ldo), | 189 | return lp3971_set_bits(lp3971, LP3971_LDO_VOL_CONTR_REG(ldo), |
| @@ -272,7 +272,7 @@ static int lp3971_dcdc_set_voltage(struct regulator_dev *dev, | |||
| 272 | if (vol_map[val] >= min_vol) | 272 | if (vol_map[val] >= min_vol) |
| 273 | break; | 273 | break; |
| 274 | 274 | ||
| 275 | if (vol_map[val] > max_vol) | 275 | if (val > BUCK_TARGET_VOL_MAX_IDX || vol_map[val] > max_vol) |
| 276 | return -EINVAL; | 276 | return -EINVAL; |
| 277 | 277 | ||
| 278 | ret = lp3971_set_bits(lp3971, LP3971_BUCK_TARGET_VOL1_REG(buck), | 278 | ret = lp3971_set_bits(lp3971, LP3971_BUCK_TARGET_VOL1_REG(buck), |
diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c index 3a7be11cc6b9..812c66755083 100644 --- a/drivers/rtc/rtc-fm3130.c +++ b/drivers/rtc/rtc-fm3130.c | |||
| @@ -376,20 +376,22 @@ static int __devinit fm3130_probe(struct i2c_client *client, | |||
| 376 | } | 376 | } |
| 377 | 377 | ||
| 378 | /* Disabling calibration mode */ | 378 | /* Disabling calibration mode */ |
| 379 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) | 379 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) { |
| 380 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, | 380 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, |
| 381 | fm3130->regs[FM3130_RTC_CONTROL] & | 381 | fm3130->regs[FM3130_RTC_CONTROL] & |
| 382 | ~(FM3130_RTC_CONTROL_BIT_CAL)); | 382 | ~(FM3130_RTC_CONTROL_BIT_CAL)); |
| 383 | dev_warn(&client->dev, "Disabling calibration mode!\n"); | 383 | dev_warn(&client->dev, "Disabling calibration mode!\n"); |
| 384 | } | ||
| 384 | 385 | ||
| 385 | /* Disabling read and write modes */ | 386 | /* Disabling read and write modes */ |
| 386 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE || | 387 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE || |
| 387 | fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) | 388 | fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) { |
| 388 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, | 389 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, |
| 389 | fm3130->regs[FM3130_RTC_CONTROL] & | 390 | fm3130->regs[FM3130_RTC_CONTROL] & |
| 390 | ~(FM3130_RTC_CONTROL_BIT_READ | | 391 | ~(FM3130_RTC_CONTROL_BIT_READ | |
| 391 | FM3130_RTC_CONTROL_BIT_WRITE)); | 392 | FM3130_RTC_CONTROL_BIT_WRITE)); |
| 392 | dev_warn(&client->dev, "Disabling READ or WRITE mode!\n"); | 393 | dev_warn(&client->dev, "Disabling READ or WRITE mode!\n"); |
| 394 | } | ||
| 393 | 395 | ||
| 394 | /* oscillator off? turn it on, so clock can tick. */ | 396 | /* oscillator off? turn it on, so clock can tick. */ |
| 395 | if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN) | 397 | if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN) |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 999fe80c4051..62b654af9237 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
| @@ -531,7 +531,7 @@ static inline int qdio_inbound_q_done(struct qdio_q *q) | |||
| 531 | qdio_siga_sync_q(q); | 531 | qdio_siga_sync_q(q); |
| 532 | get_buf_state(q, q->first_to_check, &state, 0); | 532 | get_buf_state(q, q->first_to_check, &state, 0); |
| 533 | 533 | ||
| 534 | if (state == SLSB_P_INPUT_PRIMED) | 534 | if (state == SLSB_P_INPUT_PRIMED || state == SLSB_P_INPUT_ERROR) |
| 535 | /* more work coming */ | 535 | /* more work coming */ |
| 536 | return 0; | 536 | return 0; |
| 537 | 537 | ||
| @@ -960,6 +960,8 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 960 | qdio_handle_activate_check(cdev, intparm, cstat, | 960 | qdio_handle_activate_check(cdev, intparm, cstat, |
| 961 | dstat); | 961 | dstat); |
| 962 | break; | 962 | break; |
| 963 | case QDIO_IRQ_STATE_STOPPED: | ||
| 964 | break; | ||
| 963 | default: | 965 | default: |
| 964 | WARN_ON(1); | 966 | WARN_ON(1); |
| 965 | } | 967 | } |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index 0f7b493fb105..271399f62f1b 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -671,12 +671,11 @@ static void zfcp_fc_ct_els_job_handler(void *data) | |||
| 671 | { | 671 | { |
| 672 | struct fc_bsg_job *job = data; | 672 | struct fc_bsg_job *job = data; |
| 673 | struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data; | 673 | struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data; |
| 674 | int status = zfcp_ct_els->status; | 674 | struct fc_bsg_reply *jr = job->reply; |
| 675 | int reply_status; | ||
| 676 | 675 | ||
| 677 | reply_status = status ? FC_CTELS_STATUS_REJECT : FC_CTELS_STATUS_OK; | 676 | jr->reply_payload_rcv_len = job->reply_payload.payload_len; |
| 678 | job->reply->reply_data.ctels_reply.status = reply_status; | 677 | jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; |
| 679 | job->reply->reply_payload_rcv_len = job->reply_payload.payload_len; | 678 | jr->result = zfcp_ct_els->status ? -EIO : 0; |
| 680 | job->job_done(job); | 679 | job->job_done(job); |
| 681 | } | 680 | } |
| 682 | 681 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index f61fb8d01330..8bc6f53691e9 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
| @@ -453,6 +453,5 @@ extern void qla24xx_wrt_req_reg(struct qla_hw_data *, uint16_t, uint16_t); | |||
| 453 | extern void qla25xx_wrt_req_reg(struct qla_hw_data *, uint16_t, uint16_t); | 453 | extern void qla25xx_wrt_req_reg(struct qla_hw_data *, uint16_t, uint16_t); |
| 454 | extern void qla25xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); | 454 | extern void qla25xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); |
| 455 | extern void qla24xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); | 455 | extern void qla24xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); |
| 456 | extern struct scsi_qla_host * qla25xx_get_host(struct rsp_que *); | ||
| 457 | 456 | ||
| 458 | #endif /* _QLA_GBL_H */ | 457 | #endif /* _QLA_GBL_H */ |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index ffd0efdff40e..6fc63b98818c 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -1917,6 +1917,7 @@ qla24xx_msix_rsp_q(int irq, void *dev_id) | |||
| 1917 | struct rsp_que *rsp; | 1917 | struct rsp_que *rsp; |
| 1918 | struct device_reg_24xx __iomem *reg; | 1918 | struct device_reg_24xx __iomem *reg; |
| 1919 | struct scsi_qla_host *vha; | 1919 | struct scsi_qla_host *vha; |
| 1920 | unsigned long flags; | ||
| 1920 | 1921 | ||
| 1921 | rsp = (struct rsp_que *) dev_id; | 1922 | rsp = (struct rsp_que *) dev_id; |
| 1922 | if (!rsp) { | 1923 | if (!rsp) { |
| @@ -1927,15 +1928,15 @@ qla24xx_msix_rsp_q(int irq, void *dev_id) | |||
| 1927 | ha = rsp->hw; | 1928 | ha = rsp->hw; |
| 1928 | reg = &ha->iobase->isp24; | 1929 | reg = &ha->iobase->isp24; |
| 1929 | 1930 | ||
| 1930 | spin_lock_irq(&ha->hardware_lock); | 1931 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 1931 | 1932 | ||
| 1932 | vha = qla25xx_get_host(rsp); | 1933 | vha = pci_get_drvdata(ha->pdev); |
| 1933 | qla24xx_process_response_queue(vha, rsp); | 1934 | qla24xx_process_response_queue(vha, rsp); |
| 1934 | if (!ha->flags.disable_msix_handshake) { | 1935 | if (!ha->flags.disable_msix_handshake) { |
| 1935 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1936 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
| 1936 | RD_REG_DWORD_RELAXED(®->hccr); | 1937 | RD_REG_DWORD_RELAXED(®->hccr); |
| 1937 | } | 1938 | } |
| 1938 | spin_unlock_irq(&ha->hardware_lock); | 1939 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 1939 | 1940 | ||
| 1940 | return IRQ_HANDLED; | 1941 | return IRQ_HANDLED; |
| 1941 | } | 1942 | } |
| @@ -1946,6 +1947,7 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) | |||
| 1946 | struct qla_hw_data *ha; | 1947 | struct qla_hw_data *ha; |
| 1947 | struct rsp_que *rsp; | 1948 | struct rsp_que *rsp; |
| 1948 | struct device_reg_24xx __iomem *reg; | 1949 | struct device_reg_24xx __iomem *reg; |
| 1950 | unsigned long flags; | ||
| 1949 | 1951 | ||
| 1950 | rsp = (struct rsp_que *) dev_id; | 1952 | rsp = (struct rsp_que *) dev_id; |
| 1951 | if (!rsp) { | 1953 | if (!rsp) { |
| @@ -1958,10 +1960,10 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) | |||
| 1958 | /* Clear the interrupt, if enabled, for this response queue */ | 1960 | /* Clear the interrupt, if enabled, for this response queue */ |
| 1959 | if (rsp->options & ~BIT_6) { | 1961 | if (rsp->options & ~BIT_6) { |
| 1960 | reg = &ha->iobase->isp24; | 1962 | reg = &ha->iobase->isp24; |
| 1961 | spin_lock_irq(&ha->hardware_lock); | 1963 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 1962 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1964 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
| 1963 | RD_REG_DWORD_RELAXED(®->hccr); | 1965 | RD_REG_DWORD_RELAXED(®->hccr); |
| 1964 | spin_unlock_irq(&ha->hardware_lock); | 1966 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 1965 | } | 1967 | } |
| 1966 | queue_work_on((int) (rsp->id - 1), ha->wq, &rsp->q_work); | 1968 | queue_work_on((int) (rsp->id - 1), ha->wq, &rsp->q_work); |
| 1967 | 1969 | ||
| @@ -1979,6 +1981,7 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
| 1979 | uint32_t stat; | 1981 | uint32_t stat; |
| 1980 | uint32_t hccr; | 1982 | uint32_t hccr; |
| 1981 | uint16_t mb[4]; | 1983 | uint16_t mb[4]; |
| 1984 | unsigned long flags; | ||
| 1982 | 1985 | ||
| 1983 | rsp = (struct rsp_que *) dev_id; | 1986 | rsp = (struct rsp_que *) dev_id; |
| 1984 | if (!rsp) { | 1987 | if (!rsp) { |
| @@ -1990,7 +1993,7 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
| 1990 | reg = &ha->iobase->isp24; | 1993 | reg = &ha->iobase->isp24; |
| 1991 | status = 0; | 1994 | status = 0; |
| 1992 | 1995 | ||
| 1993 | spin_lock_irq(&ha->hardware_lock); | 1996 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 1994 | vha = pci_get_drvdata(ha->pdev); | 1997 | vha = pci_get_drvdata(ha->pdev); |
| 1995 | do { | 1998 | do { |
| 1996 | stat = RD_REG_DWORD(®->host_status); | 1999 | stat = RD_REG_DWORD(®->host_status); |
| @@ -2039,7 +2042,7 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
| 2039 | } | 2042 | } |
| 2040 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 2043 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
| 2041 | } while (0); | 2044 | } while (0); |
| 2042 | spin_unlock_irq(&ha->hardware_lock); | 2045 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
| 2043 | 2046 | ||
| 2044 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && | 2047 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && |
| 2045 | (status & MBX_INTERRUPT) && ha->flags.mbox_int) { | 2048 | (status & MBX_INTERRUPT) && ha->flags.mbox_int) { |
| @@ -2277,30 +2280,3 @@ int qla25xx_request_irq(struct rsp_que *rsp) | |||
| 2277 | msix->rsp = rsp; | 2280 | msix->rsp = rsp; |
| 2278 | return ret; | 2281 | return ret; |
| 2279 | } | 2282 | } |
| 2280 | |||
| 2281 | struct scsi_qla_host * | ||
| 2282 | qla25xx_get_host(struct rsp_que *rsp) | ||
| 2283 | { | ||
| 2284 | srb_t *sp; | ||
| 2285 | struct qla_hw_data *ha = rsp->hw; | ||
| 2286 | struct scsi_qla_host *vha = NULL; | ||
| 2287 | struct sts_entry_24xx *pkt; | ||
| 2288 | struct req_que *req; | ||
| 2289 | uint16_t que; | ||
| 2290 | uint32_t handle; | ||
| 2291 | |||
| 2292 | pkt = (struct sts_entry_24xx *) rsp->ring_ptr; | ||
| 2293 | que = MSW(pkt->handle); | ||
| 2294 | handle = (uint32_t) LSW(pkt->handle); | ||
| 2295 | req = ha->req_q_map[que]; | ||
| 2296 | if (handle < MAX_OUTSTANDING_COMMANDS) { | ||
| 2297 | sp = req->outstanding_cmds[handle]; | ||
| 2298 | if (sp) | ||
| 2299 | return sp->fcport->vha; | ||
| 2300 | else | ||
| 2301 | goto base_que; | ||
| 2302 | } | ||
| 2303 | base_que: | ||
| 2304 | vha = pci_get_drvdata(ha->pdev); | ||
| 2305 | return vha; | ||
| 2306 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index b901aa267e7d..ff17dee28613 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
| @@ -636,13 +636,15 @@ failed: | |||
| 636 | 636 | ||
| 637 | static void qla_do_work(struct work_struct *work) | 637 | static void qla_do_work(struct work_struct *work) |
| 638 | { | 638 | { |
| 639 | unsigned long flags; | ||
| 639 | struct rsp_que *rsp = container_of(work, struct rsp_que, q_work); | 640 | struct rsp_que *rsp = container_of(work, struct rsp_que, q_work); |
| 640 | struct scsi_qla_host *vha; | 641 | struct scsi_qla_host *vha; |
| 642 | struct qla_hw_data *ha = rsp->hw; | ||
| 641 | 643 | ||
| 642 | spin_lock_irq(&rsp->hw->hardware_lock); | 644 | spin_lock_irqsave(&rsp->hw->hardware_lock, flags); |
| 643 | vha = qla25xx_get_host(rsp); | 645 | vha = pci_get_drvdata(ha->pdev); |
| 644 | qla24xx_process_response_queue(vha, rsp); | 646 | qla24xx_process_response_queue(vha, rsp); |
| 645 | spin_unlock_irq(&rsp->hw->hardware_lock); | 647 | spin_unlock_irqrestore(&rsp->hw->hardware_lock, flags); |
| 646 | } | 648 | } |
| 647 | 649 | ||
| 648 | /* create response queue */ | 650 | /* create response queue */ |
diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c index 377f2712289e..ab2ab3c81834 100644 --- a/drivers/serial/uartlite.c +++ b/drivers/serial/uartlite.c | |||
| @@ -394,7 +394,7 @@ static void ulite_console_write(struct console *co, const char *s, | |||
| 394 | spin_unlock_irqrestore(&port->lock, flags); | 394 | spin_unlock_irqrestore(&port->lock, flags); |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | static int __init ulite_console_setup(struct console *co, char *options) | 397 | static int __devinit ulite_console_setup(struct console *co, char *options) |
| 398 | { | 398 | { |
| 399 | struct uart_port *port; | 399 | struct uart_port *port; |
| 400 | int baud = 9600; | 400 | int baud = 9600; |
diff --git a/drivers/spi/spi_sh_msiof.c b/drivers/spi/spi_sh_msiof.c index 51e5e1dfa6e5..30973ec16a93 100644 --- a/drivers/spi/spi_sh_msiof.c +++ b/drivers/spi/spi_sh_msiof.c | |||
| @@ -173,15 +173,12 @@ static void sh_msiof_spi_set_pin_regs(struct sh_msiof_spi_priv *p, | |||
| 173 | int edge; | 173 | int edge; |
| 174 | 174 | ||
| 175 | /* | 175 | /* |
| 176 | * CPOL CPHA TSCKIZ RSCKIZ TEDG REDG(!) | 176 | * CPOL CPHA TSCKIZ RSCKIZ TEDG REDG |
| 177 | * 0 0 10 10 1 0 | 177 | * 0 0 10 10 1 1 |
| 178 | * 0 1 10 10 0 1 | 178 | * 0 1 10 10 0 0 |
| 179 | * 1 0 11 11 0 1 | 179 | * 1 0 11 11 0 0 |
| 180 | * 1 1 11 11 1 0 | 180 | * 1 1 11 11 1 1 |
| 181 | * | ||
| 182 | * (!) Note: REDG is inverted recommended data sheet setting | ||
| 183 | */ | 181 | */ |
| 184 | |||
| 185 | sh_msiof_write(p, FCTR, 0); | 182 | sh_msiof_write(p, FCTR, 0); |
| 186 | sh_msiof_write(p, TMDR1, 0xe2000005 | (lsb_first << 24)); | 183 | sh_msiof_write(p, TMDR1, 0xe2000005 | (lsb_first << 24)); |
| 187 | sh_msiof_write(p, RMDR1, 0x22000005 | (lsb_first << 24)); | 184 | sh_msiof_write(p, RMDR1, 0x22000005 | (lsb_first << 24)); |
| @@ -193,7 +190,7 @@ static void sh_msiof_spi_set_pin_regs(struct sh_msiof_spi_priv *p, | |||
| 193 | edge = cpol ? cpha : !cpha; | 190 | edge = cpol ? cpha : !cpha; |
| 194 | 191 | ||
| 195 | tmp |= edge << 27; /* TEDG */ | 192 | tmp |= edge << 27; /* TEDG */ |
| 196 | tmp |= !edge << 26; /* REDG */ | 193 | tmp |= edge << 26; /* REDG */ |
| 197 | tmp |= (tx_hi_z ? 2 : 0) << 22; /* TXDIZ */ | 194 | tmp |= (tx_hi_z ? 2 : 0) << 22; /* TXDIZ */ |
| 198 | sh_msiof_write(p, CTR, tmp); | 195 | sh_msiof_write(p, CTR, tmp); |
| 199 | } | 196 | } |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index b7a661c02bcd..bee558aed427 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
| @@ -35,7 +35,9 @@ | |||
| 35 | #include <linux/usb.h> | 35 | #include <linux/usb.h> |
| 36 | #include <linux/platform_device.h> | 36 | #include <linux/platform_device.h> |
| 37 | #include <linux/io.h> | 37 | #include <linux/io.h> |
| 38 | #include <linux/mm.h> | ||
| 38 | #include <linux/irq.h> | 39 | #include <linux/irq.h> |
| 40 | #include <asm/cacheflush.h> | ||
| 39 | 41 | ||
| 40 | #include "../core/hcd.h" | 42 | #include "../core/hcd.h" |
| 41 | #include "r8a66597.h" | 43 | #include "r8a66597.h" |
| @@ -216,8 +218,17 @@ static void disable_controller(struct r8a66597 *r8a66597) | |||
| 216 | { | 218 | { |
| 217 | int port; | 219 | int port; |
| 218 | 220 | ||
| 221 | /* disable interrupts */ | ||
| 219 | r8a66597_write(r8a66597, 0, INTENB0); | 222 | r8a66597_write(r8a66597, 0, INTENB0); |
| 220 | r8a66597_write(r8a66597, 0, INTSTS0); | 223 | r8a66597_write(r8a66597, 0, INTENB1); |
| 224 | r8a66597_write(r8a66597, 0, BRDYENB); | ||
| 225 | r8a66597_write(r8a66597, 0, BEMPENB); | ||
| 226 | r8a66597_write(r8a66597, 0, NRDYENB); | ||
| 227 | |||
| 228 | /* clear status */ | ||
| 229 | r8a66597_write(r8a66597, 0, BRDYSTS); | ||
| 230 | r8a66597_write(r8a66597, 0, NRDYSTS); | ||
| 231 | r8a66597_write(r8a66597, 0, BEMPSTS); | ||
| 221 | 232 | ||
| 222 | for (port = 0; port < r8a66597->max_root_hub; port++) | 233 | for (port = 0; port < r8a66597->max_root_hub; port++) |
| 223 | r8a66597_disable_port(r8a66597, port); | 234 | r8a66597_disable_port(r8a66597, port); |
| @@ -811,6 +822,26 @@ static void enable_r8a66597_pipe(struct r8a66597 *r8a66597, struct urb *urb, | |||
| 811 | enable_r8a66597_pipe_dma(r8a66597, dev, pipe, urb); | 822 | enable_r8a66597_pipe_dma(r8a66597, dev, pipe, urb); |
| 812 | } | 823 | } |
| 813 | 824 | ||
| 825 | static void r8a66597_urb_done(struct r8a66597 *r8a66597, struct urb *urb, | ||
| 826 | int status) | ||
| 827 | __releases(r8a66597->lock) | ||
| 828 | __acquires(r8a66597->lock) | ||
| 829 | { | ||
| 830 | if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) { | ||
| 831 | void *ptr; | ||
| 832 | |||
| 833 | for (ptr = urb->transfer_buffer; | ||
| 834 | ptr < urb->transfer_buffer + urb->transfer_buffer_length; | ||
| 835 | ptr += PAGE_SIZE) | ||
| 836 | flush_dcache_page(virt_to_page(ptr)); | ||
| 837 | } | ||
| 838 | |||
| 839 | usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb); | ||
| 840 | spin_unlock(&r8a66597->lock); | ||
| 841 | usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb, status); | ||
| 842 | spin_lock(&r8a66597->lock); | ||
| 843 | } | ||
| 844 | |||
| 814 | /* this function must be called with interrupt disabled */ | 845 | /* this function must be called with interrupt disabled */ |
| 815 | static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) | 846 | static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) |
| 816 | { | 847 | { |
| @@ -829,15 +860,9 @@ static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) | |||
| 829 | list_del(&td->queue); | 860 | list_del(&td->queue); |
| 830 | kfree(td); | 861 | kfree(td); |
| 831 | 862 | ||
| 832 | if (urb) { | 863 | if (urb) |
| 833 | usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), | 864 | r8a66597_urb_done(r8a66597, urb, -ENODEV); |
| 834 | urb); | ||
| 835 | 865 | ||
| 836 | spin_unlock(&r8a66597->lock); | ||
| 837 | usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb, | ||
| 838 | -ENODEV); | ||
| 839 | spin_lock(&r8a66597->lock); | ||
| 840 | } | ||
| 841 | break; | 866 | break; |
| 842 | } | 867 | } |
| 843 | } | 868 | } |
| @@ -997,6 +1022,8 @@ static void start_root_hub_sampling(struct r8a66597 *r8a66597, int port, | |||
| 997 | /* this function must be called with interrupt disabled */ | 1022 | /* this function must be called with interrupt disabled */ |
| 998 | static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, | 1023 | static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, |
| 999 | u16 syssts) | 1024 | u16 syssts) |
| 1025 | __releases(r8a66597->lock) | ||
| 1026 | __acquires(r8a66597->lock) | ||
| 1000 | { | 1027 | { |
| 1001 | if (syssts == SE0) { | 1028 | if (syssts == SE0) { |
| 1002 | r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); | 1029 | r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); |
| @@ -1014,7 +1041,9 @@ static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, | |||
| 1014 | usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); | 1041 | usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); |
| 1015 | } | 1042 | } |
| 1016 | 1043 | ||
| 1044 | spin_unlock(&r8a66597->lock); | ||
| 1017 | usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597)); | 1045 | usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597)); |
| 1046 | spin_lock(&r8a66597->lock); | ||
| 1018 | } | 1047 | } |
| 1019 | 1048 | ||
| 1020 | /* this function must be called with interrupt disabled */ | 1049 | /* this function must be called with interrupt disabled */ |
| @@ -1274,10 +1303,7 @@ __releases(r8a66597->lock) __acquires(r8a66597->lock) | |||
| 1274 | if (usb_pipeisoc(urb->pipe)) | 1303 | if (usb_pipeisoc(urb->pipe)) |
| 1275 | urb->start_frame = r8a66597_get_frame(hcd); | 1304 | urb->start_frame = r8a66597_get_frame(hcd); |
| 1276 | 1305 | ||
| 1277 | usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb); | 1306 | r8a66597_urb_done(r8a66597, urb, status); |
| 1278 | spin_unlock(&r8a66597->lock); | ||
| 1279 | usb_hcd_giveback_urb(hcd, urb, status); | ||
| 1280 | spin_lock(&r8a66597->lock); | ||
| 1281 | } | 1307 | } |
| 1282 | 1308 | ||
| 1283 | if (restart) { | 1309 | if (restart) { |
| @@ -2466,6 +2492,12 @@ static int __devinit r8a66597_probe(struct platform_device *pdev) | |||
| 2466 | r8a66597->rh_timer.data = (unsigned long)r8a66597; | 2492 | r8a66597->rh_timer.data = (unsigned long)r8a66597; |
| 2467 | r8a66597->reg = (unsigned long)reg; | 2493 | r8a66597->reg = (unsigned long)reg; |
| 2468 | 2494 | ||
| 2495 | /* make sure no interrupts are pending */ | ||
| 2496 | ret = r8a66597_clock_enable(r8a66597); | ||
| 2497 | if (ret < 0) | ||
| 2498 | goto clean_up3; | ||
| 2499 | disable_controller(r8a66597); | ||
| 2500 | |||
| 2469 | for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) { | 2501 | for (i = 0; i < R8A66597_MAX_NUM_PIPE; i++) { |
| 2470 | INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); | 2502 | INIT_LIST_HEAD(&r8a66597->pipe_queue[i]); |
| 2471 | init_timer(&r8a66597->td_timer[i]); | 2503 | init_timer(&r8a66597->td_timer[i]); |
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c index 66358fa825f3..b4b6deceed15 100644 --- a/drivers/video/imxfb.c +++ b/drivers/video/imxfb.c | |||
| @@ -593,7 +593,8 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf | |||
| 593 | */ | 593 | */ |
| 594 | static int imxfb_suspend(struct platform_device *dev, pm_message_t state) | 594 | static int imxfb_suspend(struct platform_device *dev, pm_message_t state) |
| 595 | { | 595 | { |
| 596 | struct imxfb_info *fbi = platform_get_drvdata(dev); | 596 | struct fb_info *info = platform_get_drvdata(dev); |
| 597 | struct imxfb_info *fbi = info->par; | ||
| 597 | 598 | ||
| 598 | pr_debug("%s\n", __func__); | 599 | pr_debug("%s\n", __func__); |
| 599 | 600 | ||
| @@ -603,7 +604,8 @@ static int imxfb_suspend(struct platform_device *dev, pm_message_t state) | |||
| 603 | 604 | ||
| 604 | static int imxfb_resume(struct platform_device *dev) | 605 | static int imxfb_resume(struct platform_device *dev) |
| 605 | { | 606 | { |
| 606 | struct imxfb_info *fbi = platform_get_drvdata(dev); | 607 | struct fb_info *info = platform_get_drvdata(dev); |
| 608 | struct imxfb_info *fbi = info->par; | ||
| 607 | 609 | ||
| 608 | pr_debug("%s\n", __func__); | 610 | pr_debug("%s\n", __func__); |
| 609 | 611 | ||
diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c index 054ef29be479..772ba3f45e6f 100644 --- a/drivers/video/mx3fb.c +++ b/drivers/video/mx3fb.c | |||
| @@ -324,8 +324,11 @@ static void sdc_enable_channel(struct mx3fb_info *mx3_fbi) | |||
| 324 | unsigned long flags; | 324 | unsigned long flags; |
| 325 | dma_cookie_t cookie; | 325 | dma_cookie_t cookie; |
| 326 | 326 | ||
| 327 | dev_dbg(mx3fb->dev, "mx3fbi %p, desc %p, sg %p\n", mx3_fbi, | 327 | if (mx3_fbi->txd) |
| 328 | to_tx_desc(mx3_fbi->txd), to_tx_desc(mx3_fbi->txd)->sg); | 328 | dev_dbg(mx3fb->dev, "mx3fbi %p, desc %p, sg %p\n", mx3_fbi, |
| 329 | to_tx_desc(mx3_fbi->txd), to_tx_desc(mx3_fbi->txd)->sg); | ||
| 330 | else | ||
| 331 | dev_dbg(mx3fb->dev, "mx3fbi %p, txd = NULL\n", mx3_fbi); | ||
| 329 | 332 | ||
| 330 | /* This enables the channel */ | 333 | /* This enables the channel */ |
| 331 | if (mx3_fbi->cookie < 0) { | 334 | if (mx3_fbi->cookie < 0) { |
| @@ -646,6 +649,7 @@ static int sdc_set_global_alpha(struct mx3fb_data *mx3fb, bool enable, uint8_t a | |||
| 646 | 649 | ||
| 647 | static void sdc_set_brightness(struct mx3fb_data *mx3fb, uint8_t value) | 650 | static void sdc_set_brightness(struct mx3fb_data *mx3fb, uint8_t value) |
| 648 | { | 651 | { |
| 652 | dev_dbg(mx3fb->dev, "%s: value = %d\n", __func__, value); | ||
| 649 | /* This might be board-specific */ | 653 | /* This might be board-specific */ |
| 650 | mx3fb_write_reg(mx3fb, 0x03000000UL | value << 16, SDC_PWM_CTRL); | 654 | mx3fb_write_reg(mx3fb, 0x03000000UL | value << 16, SDC_PWM_CTRL); |
| 651 | return; | 655 | return; |
| @@ -1486,12 +1490,12 @@ static int mx3fb_probe(struct platform_device *pdev) | |||
| 1486 | goto ersdc0; | 1490 | goto ersdc0; |
| 1487 | } | 1491 | } |
| 1488 | 1492 | ||
| 1493 | mx3fb->backlight_level = 255; | ||
| 1494 | |||
| 1489 | ret = init_fb_chan(mx3fb, to_idmac_chan(chan)); | 1495 | ret = init_fb_chan(mx3fb, to_idmac_chan(chan)); |
| 1490 | if (ret < 0) | 1496 | if (ret < 0) |
| 1491 | goto eisdc0; | 1497 | goto eisdc0; |
| 1492 | 1498 | ||
| 1493 | mx3fb->backlight_level = 255; | ||
| 1494 | |||
| 1495 | return 0; | 1499 | return 0; |
| 1496 | 1500 | ||
| 1497 | eisdc0: | 1501 | eisdc0: |
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index cf62b05e296a..7d6c2139891d 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
| @@ -84,7 +84,7 @@ static const match_table_t tokens = { | |||
| 84 | 84 | ||
| 85 | static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | 85 | static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) |
| 86 | { | 86 | { |
| 87 | char *options; | 87 | char *options, *tmp_options; |
| 88 | substring_t args[MAX_OPT_ARGS]; | 88 | substring_t args[MAX_OPT_ARGS]; |
| 89 | char *p; | 89 | char *p; |
| 90 | int option = 0; | 90 | int option = 0; |
| @@ -102,9 +102,12 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | |||
| 102 | if (!opts) | 102 | if (!opts) |
| 103 | return 0; | 103 | return 0; |
| 104 | 104 | ||
| 105 | options = kstrdup(opts, GFP_KERNEL); | 105 | tmp_options = kstrdup(opts, GFP_KERNEL); |
| 106 | if (!options) | 106 | if (!tmp_options) { |
| 107 | ret = -ENOMEM; | ||
| 107 | goto fail_option_alloc; | 108 | goto fail_option_alloc; |
| 109 | } | ||
| 110 | options = tmp_options; | ||
| 108 | 111 | ||
| 109 | while ((p = strsep(&options, ",")) != NULL) { | 112 | while ((p = strsep(&options, ",")) != NULL) { |
| 110 | int token; | 113 | int token; |
| @@ -159,8 +162,12 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | |||
| 159 | break; | 162 | break; |
| 160 | case Opt_cache: | 163 | case Opt_cache: |
| 161 | s = match_strdup(&args[0]); | 164 | s = match_strdup(&args[0]); |
| 162 | if (!s) | 165 | if (!s) { |
| 163 | goto fail_option_alloc; | 166 | ret = -ENOMEM; |
| 167 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 168 | "problem allocating copy of cache arg\n"); | ||
| 169 | goto free_and_return; | ||
| 170 | } | ||
| 164 | 171 | ||
| 165 | if (strcmp(s, "loose") == 0) | 172 | if (strcmp(s, "loose") == 0) |
| 166 | v9ses->cache = CACHE_LOOSE; | 173 | v9ses->cache = CACHE_LOOSE; |
| @@ -173,8 +180,12 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | |||
| 173 | 180 | ||
| 174 | case Opt_access: | 181 | case Opt_access: |
| 175 | s = match_strdup(&args[0]); | 182 | s = match_strdup(&args[0]); |
| 176 | if (!s) | 183 | if (!s) { |
| 177 | goto fail_option_alloc; | 184 | ret = -ENOMEM; |
| 185 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 186 | "problem allocating copy of access arg\n"); | ||
| 187 | goto free_and_return; | ||
| 188 | } | ||
| 178 | 189 | ||
| 179 | v9ses->flags &= ~V9FS_ACCESS_MASK; | 190 | v9ses->flags &= ~V9FS_ACCESS_MASK; |
| 180 | if (strcmp(s, "user") == 0) | 191 | if (strcmp(s, "user") == 0) |
| @@ -194,13 +205,11 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | |||
| 194 | continue; | 205 | continue; |
| 195 | } | 206 | } |
| 196 | } | 207 | } |
| 197 | kfree(options); | ||
| 198 | return ret; | ||
| 199 | 208 | ||
| 209 | free_and_return: | ||
| 210 | kfree(tmp_options); | ||
| 200 | fail_option_alloc: | 211 | fail_option_alloc: |
| 201 | P9_DPRINTK(P9_DEBUG_ERROR, | 212 | return ret; |
| 202 | "failed to allocate copy of option argument\n"); | ||
| 203 | return -ENOMEM; | ||
| 204 | } | 213 | } |
| 205 | 214 | ||
| 206 | /** | 215 | /** |
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index 3a7560e35865..ed835836e0dc 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h | |||
| @@ -60,3 +60,4 @@ void v9fs_dentry_release(struct dentry *); | |||
| 60 | int v9fs_uflags2omode(int uflags, int extended); | 60 | int v9fs_uflags2omode(int uflags, int extended); |
| 61 | 61 | ||
| 62 | ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64); | 62 | ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64); |
| 63 | void v9fs_blank_wstat(struct p9_wstat *wstat); | ||
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 3902bf43a088..74a0461a9ac0 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
| @@ -257,6 +257,23 @@ v9fs_file_write(struct file *filp, const char __user * data, | |||
| 257 | return total; | 257 | return total; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | static int v9fs_file_fsync(struct file *filp, struct dentry *dentry, | ||
| 261 | int datasync) | ||
| 262 | { | ||
| 263 | struct p9_fid *fid; | ||
| 264 | struct p9_wstat wstat; | ||
| 265 | int retval; | ||
| 266 | |||
| 267 | P9_DPRINTK(P9_DEBUG_VFS, "filp %p dentry %p datasync %x\n", filp, | ||
| 268 | dentry, datasync); | ||
| 269 | |||
| 270 | fid = filp->private_data; | ||
| 271 | v9fs_blank_wstat(&wstat); | ||
| 272 | |||
| 273 | retval = p9_client_wstat(fid, &wstat); | ||
| 274 | return retval; | ||
| 275 | } | ||
| 276 | |||
| 260 | static const struct file_operations v9fs_cached_file_operations = { | 277 | static const struct file_operations v9fs_cached_file_operations = { |
| 261 | .llseek = generic_file_llseek, | 278 | .llseek = generic_file_llseek, |
| 262 | .read = do_sync_read, | 279 | .read = do_sync_read, |
| @@ -266,6 +283,7 @@ static const struct file_operations v9fs_cached_file_operations = { | |||
| 266 | .release = v9fs_dir_release, | 283 | .release = v9fs_dir_release, |
| 267 | .lock = v9fs_file_lock, | 284 | .lock = v9fs_file_lock, |
| 268 | .mmap = generic_file_readonly_mmap, | 285 | .mmap = generic_file_readonly_mmap, |
| 286 | .fsync = v9fs_file_fsync, | ||
| 269 | }; | 287 | }; |
| 270 | 288 | ||
| 271 | const struct file_operations v9fs_file_operations = { | 289 | const struct file_operations v9fs_file_operations = { |
| @@ -276,4 +294,5 @@ const struct file_operations v9fs_file_operations = { | |||
| 276 | .release = v9fs_dir_release, | 294 | .release = v9fs_dir_release, |
| 277 | .lock = v9fs_file_lock, | 295 | .lock = v9fs_file_lock, |
| 278 | .mmap = generic_file_readonly_mmap, | 296 | .mmap = generic_file_readonly_mmap, |
| 297 | .fsync = v9fs_file_fsync, | ||
| 279 | }; | 298 | }; |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 9d03d1ebca6f..a407fa3388c0 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -176,7 +176,7 @@ int v9fs_uflags2omode(int uflags, int extended) | |||
| 176 | * | 176 | * |
| 177 | */ | 177 | */ |
| 178 | 178 | ||
| 179 | static void | 179 | void |
| 180 | v9fs_blank_wstat(struct p9_wstat *wstat) | 180 | v9fs_blank_wstat(struct p9_wstat *wstat) |
| 181 | { | 181 | { |
| 182 | wstat->type = ~0; | 182 | wstat->type = ~0; |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 33baf27fac78..34ddda888e63 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
| @@ -873,6 +873,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 873 | brelse(bh); | 873 | brelse(bh); |
| 874 | 874 | ||
| 875 | unacquire_priv_sbp: | 875 | unacquire_priv_sbp: |
| 876 | kfree(befs_sb->mount_opts.iocharset); | ||
| 876 | kfree(sb->s_fs_info); | 877 | kfree(sb->s_fs_info); |
| 877 | 878 | ||
| 878 | unacquire_none: | 879 | unacquire_none: |
diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index 49a34e7f7306..a16f29e888cd 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c | |||
| @@ -61,7 +61,7 @@ static inline unsigned int vecs_to_idx(unsigned int nr) | |||
| 61 | 61 | ||
| 62 | static inline int use_bip_pool(unsigned int idx) | 62 | static inline int use_bip_pool(unsigned int idx) |
| 63 | { | 63 | { |
| 64 | if (idx == BIOVEC_NR_POOLS) | 64 | if (idx == BIOVEC_MAX_IDX) |
| 65 | return 1; | 65 | return 1; |
| 66 | 66 | ||
| 67 | return 0; | 67 | return 0; |
| @@ -95,6 +95,7 @@ struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio, | |||
| 95 | 95 | ||
| 96 | /* Use mempool if lower order alloc failed or max vecs were requested */ | 96 | /* Use mempool if lower order alloc failed or max vecs were requested */ |
| 97 | if (bip == NULL) { | 97 | if (bip == NULL) { |
| 98 | idx = BIOVEC_MAX_IDX; /* so we free the payload properly later */ | ||
| 98 | bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask); | 99 | bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask); |
| 99 | 100 | ||
| 100 | if (unlikely(bip == NULL)) { | 101 | if (unlikely(bip == NULL)) { |
| @@ -542,13 +542,18 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 542 | 542 | ||
| 543 | if (page == prev->bv_page && | 543 | if (page == prev->bv_page && |
| 544 | offset == prev->bv_offset + prev->bv_len) { | 544 | offset == prev->bv_offset + prev->bv_len) { |
| 545 | unsigned int prev_bv_len = prev->bv_len; | ||
| 545 | prev->bv_len += len; | 546 | prev->bv_len += len; |
| 546 | 547 | ||
| 547 | if (q->merge_bvec_fn) { | 548 | if (q->merge_bvec_fn) { |
| 548 | struct bvec_merge_data bvm = { | 549 | struct bvec_merge_data bvm = { |
| 550 | /* prev_bvec is already charged in | ||
| 551 | bi_size, discharge it in order to | ||
| 552 | simulate merging updated prev_bvec | ||
| 553 | as new bvec. */ | ||
| 549 | .bi_bdev = bio->bi_bdev, | 554 | .bi_bdev = bio->bi_bdev, |
| 550 | .bi_sector = bio->bi_sector, | 555 | .bi_sector = bio->bi_sector, |
| 551 | .bi_size = bio->bi_size, | 556 | .bi_size = bio->bi_size - prev_bv_len, |
| 552 | .bi_rw = bio->bi_rw, | 557 | .bi_rw = bio->bi_rw, |
| 553 | }; | 558 | }; |
| 554 | 559 | ||
diff --git a/fs/block_dev.c b/fs/block_dev.c index 73d6a735b8f3..d11d0289f3d2 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -246,7 +246,8 @@ struct super_block *freeze_bdev(struct block_device *bdev) | |||
| 246 | if (!sb) | 246 | if (!sb) |
| 247 | goto out; | 247 | goto out; |
| 248 | if (sb->s_flags & MS_RDONLY) { | 248 | if (sb->s_flags & MS_RDONLY) { |
| 249 | deactivate_locked_super(sb); | 249 | sb->s_frozen = SB_FREEZE_TRANS; |
| 250 | up_write(&sb->s_umount); | ||
| 250 | mutex_unlock(&bdev->bd_fsfreeze_mutex); | 251 | mutex_unlock(&bdev->bd_fsfreeze_mutex); |
| 251 | return sb; | 252 | return sb; |
| 252 | } | 253 | } |
| @@ -307,7 +308,7 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb) | |||
| 307 | BUG_ON(sb->s_bdev != bdev); | 308 | BUG_ON(sb->s_bdev != bdev); |
| 308 | down_write(&sb->s_umount); | 309 | down_write(&sb->s_umount); |
| 309 | if (sb->s_flags & MS_RDONLY) | 310 | if (sb->s_flags & MS_RDONLY) |
| 310 | goto out_deactivate; | 311 | goto out_unfrozen; |
| 311 | 312 | ||
| 312 | if (sb->s_op->unfreeze_fs) { | 313 | if (sb->s_op->unfreeze_fs) { |
| 313 | error = sb->s_op->unfreeze_fs(sb); | 314 | error = sb->s_op->unfreeze_fs(sb); |
| @@ -321,11 +322,11 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb) | |||
| 321 | } | 322 | } |
| 322 | } | 323 | } |
| 323 | 324 | ||
| 325 | out_unfrozen: | ||
| 324 | sb->s_frozen = SB_UNFROZEN; | 326 | sb->s_frozen = SB_UNFROZEN; |
| 325 | smp_wmb(); | 327 | smp_wmb(); |
| 326 | wake_up(&sb->s_wait_unfrozen); | 328 | wake_up(&sb->s_wait_unfrozen); |
| 327 | 329 | ||
| 328 | out_deactivate: | ||
| 329 | if (sb) | 330 | if (sb) |
| 330 | deactivate_locked_super(sb); | 331 | deactivate_locked_super(sb); |
| 331 | out_unlock: | 332 | out_unlock: |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 87b25543d7d1..2b59201b955c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1982,7 +1982,12 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1982 | 1982 | ||
| 1983 | if (!(sb->s_flags & MS_RDONLY)) { | 1983 | if (!(sb->s_flags & MS_RDONLY)) { |
| 1984 | ret = btrfs_recover_relocation(tree_root); | 1984 | ret = btrfs_recover_relocation(tree_root); |
| 1985 | BUG_ON(ret); | 1985 | if (ret < 0) { |
| 1986 | printk(KERN_WARNING | ||
| 1987 | "btrfs: failed to recover relocation\n"); | ||
| 1988 | err = -EINVAL; | ||
| 1989 | goto fail_trans_kthread; | ||
| 1990 | } | ||
| 1986 | } | 1991 | } |
| 1987 | 1992 | ||
| 1988 | location.objectid = BTRFS_FS_TREE_OBJECTID; | 1993 | location.objectid = BTRFS_FS_TREE_OBJECTID; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 432a2da4641e..559f72489b3b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -5402,10 +5402,6 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, | |||
| 5402 | int ret; | 5402 | int ret; |
| 5403 | 5403 | ||
| 5404 | while (level >= 0) { | 5404 | while (level >= 0) { |
| 5405 | if (path->slots[level] >= | ||
| 5406 | btrfs_header_nritems(path->nodes[level])) | ||
| 5407 | break; | ||
| 5408 | |||
| 5409 | ret = walk_down_proc(trans, root, path, wc, lookup_info); | 5405 | ret = walk_down_proc(trans, root, path, wc, lookup_info); |
| 5410 | if (ret > 0) | 5406 | if (ret > 0) |
| 5411 | break; | 5407 | break; |
| @@ -5413,6 +5409,10 @@ static noinline int walk_down_tree(struct btrfs_trans_handle *trans, | |||
| 5413 | if (level == 0) | 5409 | if (level == 0) |
| 5414 | break; | 5410 | break; |
| 5415 | 5411 | ||
| 5412 | if (path->slots[level] >= | ||
| 5413 | btrfs_header_nritems(path->nodes[level])) | ||
| 5414 | break; | ||
| 5415 | |||
| 5416 | ret = do_walk_down(trans, root, path, wc, &lookup_info); | 5416 | ret = do_walk_down(trans, root, path, wc, &lookup_info); |
| 5417 | if (ret > 0) { | 5417 | if (ret > 0) { |
| 5418 | path->slots[level]++; | 5418 | path->slots[level]++; |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 96577e8bf9fd..b177ed319612 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -3165,10 +3165,9 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, | |||
| 3165 | spin_unlock(&tree->buffer_lock); | 3165 | spin_unlock(&tree->buffer_lock); |
| 3166 | goto free_eb; | 3166 | goto free_eb; |
| 3167 | } | 3167 | } |
| 3168 | spin_unlock(&tree->buffer_lock); | ||
| 3169 | |||
| 3170 | /* add one reference for the tree */ | 3168 | /* add one reference for the tree */ |
| 3171 | atomic_inc(&eb->refs); | 3169 | atomic_inc(&eb->refs); |
| 3170 | spin_unlock(&tree->buffer_lock); | ||
| 3172 | return eb; | 3171 | return eb; |
| 3173 | 3172 | ||
| 3174 | free_eb: | 3173 | free_eb: |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c02033596f02..9d0809629967 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1133,7 +1133,7 @@ int btrfs_sync_file(struct file *file, struct dentry *dentry, int datasync) | |||
| 1133 | } | 1133 | } |
| 1134 | mutex_lock(&dentry->d_inode->i_mutex); | 1134 | mutex_lock(&dentry->d_inode->i_mutex); |
| 1135 | out: | 1135 | out: |
| 1136 | return ret > 0 ? EIO : ret; | 1136 | return ret > 0 ? -EIO : ret; |
| 1137 | } | 1137 | } |
| 1138 | 1138 | ||
| 1139 | static const struct vm_operations_struct btrfs_file_vm_ops = { | 1139 | static const struct vm_operations_struct btrfs_file_vm_ops = { |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8cd109972fa6..4deb280f8969 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1681,24 +1681,6 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
| 1681 | * before we start the transaction. It limits the amount of btree | 1681 | * before we start the transaction. It limits the amount of btree |
| 1682 | * reads required while inside the transaction. | 1682 | * reads required while inside the transaction. |
| 1683 | */ | 1683 | */ |
| 1684 | static noinline void reada_csum(struct btrfs_root *root, | ||
| 1685 | struct btrfs_path *path, | ||
| 1686 | struct btrfs_ordered_extent *ordered_extent) | ||
| 1687 | { | ||
| 1688 | struct btrfs_ordered_sum *sum; | ||
| 1689 | u64 bytenr; | ||
| 1690 | |||
| 1691 | sum = list_entry(ordered_extent->list.next, struct btrfs_ordered_sum, | ||
| 1692 | list); | ||
| 1693 | bytenr = sum->sums[0].bytenr; | ||
| 1694 | |||
| 1695 | /* | ||
| 1696 | * we don't care about the results, the point of this search is | ||
| 1697 | * just to get the btree leaves into ram | ||
| 1698 | */ | ||
| 1699 | btrfs_lookup_csum(NULL, root->fs_info->csum_root, path, bytenr, 0); | ||
| 1700 | } | ||
| 1701 | |||
| 1702 | /* as ordered data IO finishes, this gets called so we can finish | 1684 | /* as ordered data IO finishes, this gets called so we can finish |
| 1703 | * an ordered extent if the range of bytes in the file it covers are | 1685 | * an ordered extent if the range of bytes in the file it covers are |
| 1704 | * fully written. | 1686 | * fully written. |
| @@ -1709,7 +1691,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1709 | struct btrfs_trans_handle *trans; | 1691 | struct btrfs_trans_handle *trans; |
| 1710 | struct btrfs_ordered_extent *ordered_extent = NULL; | 1692 | struct btrfs_ordered_extent *ordered_extent = NULL; |
| 1711 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 1693 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 1712 | struct btrfs_path *path; | ||
| 1713 | int compressed = 0; | 1694 | int compressed = 0; |
| 1714 | int ret; | 1695 | int ret; |
| 1715 | 1696 | ||
| @@ -1717,32 +1698,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1717 | if (!ret) | 1698 | if (!ret) |
| 1718 | return 0; | 1699 | return 0; |
| 1719 | 1700 | ||
| 1720 | /* | 1701 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); |
| 1721 | * before we join the transaction, try to do some of our IO. | ||
| 1722 | * This will limit the amount of IO that we have to do with | ||
| 1723 | * the transaction running. We're unlikely to need to do any | ||
| 1724 | * IO if the file extents are new, the disk_i_size checks | ||
| 1725 | * covers the most common case. | ||
| 1726 | */ | ||
| 1727 | if (start < BTRFS_I(inode)->disk_i_size) { | ||
| 1728 | path = btrfs_alloc_path(); | ||
| 1729 | if (path) { | ||
| 1730 | ret = btrfs_lookup_file_extent(NULL, root, path, | ||
| 1731 | inode->i_ino, | ||
| 1732 | start, 0); | ||
| 1733 | ordered_extent = btrfs_lookup_ordered_extent(inode, | ||
| 1734 | start); | ||
| 1735 | if (!list_empty(&ordered_extent->list)) { | ||
| 1736 | btrfs_release_path(root, path); | ||
| 1737 | reada_csum(root, path, ordered_extent); | ||
| 1738 | } | ||
| 1739 | btrfs_free_path(path); | ||
| 1740 | } | ||
| 1741 | } | ||
| 1742 | |||
| 1743 | if (!ordered_extent) | ||
| 1744 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); | ||
| 1745 | BUG_ON(!ordered_extent); | 1702 | BUG_ON(!ordered_extent); |
| 1703 | |||
| 1746 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1704 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
| 1747 | BUG_ON(!list_empty(&ordered_extent->list)); | 1705 | BUG_ON(!list_empty(&ordered_extent->list)); |
| 1748 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1706 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
| @@ -5841,7 +5799,9 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, | |||
| 5841 | inode->i_ctime = CURRENT_TIME; | 5799 | inode->i_ctime = CURRENT_TIME; |
| 5842 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; | 5800 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; |
| 5843 | if (!(mode & FALLOC_FL_KEEP_SIZE) && | 5801 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
| 5844 | cur_offset > inode->i_size) { | 5802 | (actual_len > inode->i_size) && |
| 5803 | (cur_offset > inode->i_size)) { | ||
| 5804 | |||
| 5845 | if (cur_offset > actual_len) | 5805 | if (cur_offset > actual_len) |
| 5846 | i_size = actual_len; | 5806 | i_size = actual_len; |
| 5847 | else | 5807 | else |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index ed3e4a2ec2c8..ab7ab5318745 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -3764,7 +3764,8 @@ out: | |||
| 3764 | BTRFS_DATA_RELOC_TREE_OBJECTID); | 3764 | BTRFS_DATA_RELOC_TREE_OBJECTID); |
| 3765 | if (IS_ERR(fs_root)) | 3765 | if (IS_ERR(fs_root)) |
| 3766 | err = PTR_ERR(fs_root); | 3766 | err = PTR_ERR(fs_root); |
| 3767 | btrfs_orphan_cleanup(fs_root); | 3767 | else |
| 3768 | btrfs_orphan_cleanup(fs_root); | ||
| 3768 | } | 3769 | } |
| 3769 | return err; | 3770 | return err; |
| 3770 | } | 3771 | } |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 7b2600b380d7..49503d2edc7e 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | Version 1.62 | ||
| 2 | ------------ | ||
| 3 | Add sockopt=TCP_NODELAY mount option. | ||
| 4 | |||
| 1 | Version 1.61 | 5 | Version 1.61 |
| 2 | ------------ | 6 | ------------ |
| 3 | Fix append problem to Samba servers (files opened with O_APPEND could | 7 | Fix append problem to Samba servers (files opened with O_APPEND could |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index ac2b24c192f8..78c1b86d55f6 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
| @@ -113,5 +113,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); | |||
| 113 | extern const struct export_operations cifs_export_ops; | 113 | extern const struct export_operations cifs_export_ops; |
| 114 | #endif /* EXPERIMENTAL */ | 114 | #endif /* EXPERIMENTAL */ |
| 115 | 115 | ||
| 116 | #define CIFS_VERSION "1.61" | 116 | #define CIFS_VERSION "1.62" |
| 117 | #endif /* _CIFSFS_H */ | 117 | #endif /* _CIFSFS_H */ |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 4b35f7ec0583..ed751bb657db 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -149,6 +149,7 @@ struct TCP_Server_Info { | |||
| 149 | bool svlocal:1; /* local server or remote */ | 149 | bool svlocal:1; /* local server or remote */ |
| 150 | bool noblocksnd; /* use blocking sendmsg */ | 150 | bool noblocksnd; /* use blocking sendmsg */ |
| 151 | bool noautotune; /* do not autotune send buf sizes */ | 151 | bool noautotune; /* do not autotune send buf sizes */ |
| 152 | bool tcp_nodelay; | ||
| 152 | atomic_t inFlight; /* number of requests on the wire to server */ | 153 | atomic_t inFlight; /* number of requests on the wire to server */ |
| 153 | #ifdef CONFIG_CIFS_STATS2 | 154 | #ifdef CONFIG_CIFS_STATS2 |
| 154 | atomic_t inSend; /* requests trying to send */ | 155 | atomic_t inSend; /* requests trying to send */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 3bbcaa716b3c..2e9e09ca0e30 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -98,7 +98,7 @@ struct smb_vol { | |||
| 98 | bool nostrictsync:1; /* do not force expensive SMBflush on every sync */ | 98 | bool nostrictsync:1; /* do not force expensive SMBflush on every sync */ |
| 99 | unsigned int rsize; | 99 | unsigned int rsize; |
| 100 | unsigned int wsize; | 100 | unsigned int wsize; |
| 101 | unsigned int sockopt; | 101 | bool sockopt_tcp_nodelay:1; |
| 102 | unsigned short int port; | 102 | unsigned short int port; |
| 103 | char *prepath; | 103 | char *prepath; |
| 104 | }; | 104 | }; |
| @@ -1142,9 +1142,11 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
| 1142 | simple_strtoul(value, &value, 0); | 1142 | simple_strtoul(value, &value, 0); |
| 1143 | } | 1143 | } |
| 1144 | } else if (strnicmp(data, "sockopt", 5) == 0) { | 1144 | } else if (strnicmp(data, "sockopt", 5) == 0) { |
| 1145 | if (value && *value) { | 1145 | if (!value || !*value) { |
| 1146 | vol->sockopt = | 1146 | cERROR(1, ("no socket option specified")); |
| 1147 | simple_strtoul(value, &value, 0); | 1147 | continue; |
| 1148 | } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) { | ||
| 1149 | vol->sockopt_tcp_nodelay = 1; | ||
| 1148 | } | 1150 | } |
| 1149 | } else if (strnicmp(data, "netbiosname", 4) == 0) { | 1151 | } else if (strnicmp(data, "netbiosname", 4) == 0) { |
| 1150 | if (!value || !*value || (*value == ' ')) { | 1152 | if (!value || !*value || (*value == ' ')) { |
| @@ -1514,6 +1516,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
| 1514 | 1516 | ||
| 1515 | tcp_ses->noblocksnd = volume_info->noblocksnd; | 1517 | tcp_ses->noblocksnd = volume_info->noblocksnd; |
| 1516 | tcp_ses->noautotune = volume_info->noautotune; | 1518 | tcp_ses->noautotune = volume_info->noautotune; |
| 1519 | tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay; | ||
| 1517 | atomic_set(&tcp_ses->inFlight, 0); | 1520 | atomic_set(&tcp_ses->inFlight, 0); |
| 1518 | init_waitqueue_head(&tcp_ses->response_q); | 1521 | init_waitqueue_head(&tcp_ses->response_q); |
| 1519 | init_waitqueue_head(&tcp_ses->request_q); | 1522 | init_waitqueue_head(&tcp_ses->request_q); |
| @@ -1764,6 +1767,7 @@ static int | |||
| 1764 | ipv4_connect(struct TCP_Server_Info *server) | 1767 | ipv4_connect(struct TCP_Server_Info *server) |
| 1765 | { | 1768 | { |
| 1766 | int rc = 0; | 1769 | int rc = 0; |
| 1770 | int val; | ||
| 1767 | bool connected = false; | 1771 | bool connected = false; |
| 1768 | __be16 orig_port = 0; | 1772 | __be16 orig_port = 0; |
| 1769 | struct socket *socket = server->ssocket; | 1773 | struct socket *socket = server->ssocket; |
| @@ -1845,6 +1849,14 @@ ipv4_connect(struct TCP_Server_Info *server) | |||
| 1845 | socket->sk->sk_rcvbuf = 140 * 1024; | 1849 | socket->sk->sk_rcvbuf = 140 * 1024; |
| 1846 | } | 1850 | } |
| 1847 | 1851 | ||
| 1852 | if (server->tcp_nodelay) { | ||
| 1853 | val = 1; | ||
| 1854 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, | ||
| 1855 | (char *)&val, sizeof(val)); | ||
| 1856 | if (rc) | ||
| 1857 | cFYI(1, ("set TCP_NODELAY socket option error %d", rc)); | ||
| 1858 | } | ||
| 1859 | |||
| 1848 | cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx", | 1860 | cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx", |
| 1849 | socket->sk->sk_sndbuf, | 1861 | socket->sk->sk_sndbuf, |
| 1850 | socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo)); | 1862 | socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo)); |
| @@ -1916,6 +1928,7 @@ static int | |||
| 1916 | ipv6_connect(struct TCP_Server_Info *server) | 1928 | ipv6_connect(struct TCP_Server_Info *server) |
| 1917 | { | 1929 | { |
| 1918 | int rc = 0; | 1930 | int rc = 0; |
| 1931 | int val; | ||
| 1919 | bool connected = false; | 1932 | bool connected = false; |
| 1920 | __be16 orig_port = 0; | 1933 | __be16 orig_port = 0; |
| 1921 | struct socket *socket = server->ssocket; | 1934 | struct socket *socket = server->ssocket; |
| @@ -1987,6 +2000,15 @@ ipv6_connect(struct TCP_Server_Info *server) | |||
| 1987 | */ | 2000 | */ |
| 1988 | socket->sk->sk_rcvtimeo = 7 * HZ; | 2001 | socket->sk->sk_rcvtimeo = 7 * HZ; |
| 1989 | socket->sk->sk_sndtimeo = 5 * HZ; | 2002 | socket->sk->sk_sndtimeo = 5 * HZ; |
| 2003 | |||
| 2004 | if (server->tcp_nodelay) { | ||
| 2005 | val = 1; | ||
| 2006 | rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY, | ||
| 2007 | (char *)&val, sizeof(val)); | ||
| 2008 | if (rc) | ||
| 2009 | cFYI(1, ("set TCP_NODELAY socket option error %d", rc)); | ||
| 2010 | } | ||
| 2011 | |||
| 1990 | server->ssocket = socket; | 2012 | server->ssocket = socket; |
| 1991 | 2013 | ||
| 1992 | return rc; | 2014 | return rc; |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index cf18ee765590..e3fda978f481 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -1762,8 +1762,18 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) | |||
| 1762 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 1762 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 1763 | } | 1763 | } |
| 1764 | 1764 | ||
| 1765 | if (!rc) | 1765 | if (!rc) { |
| 1766 | rc = inode_setattr(inode, attrs); | 1766 | rc = inode_setattr(inode, attrs); |
| 1767 | |||
| 1768 | /* force revalidate when any of these times are set since some | ||
| 1769 | of the fs types (eg ext3, fat) do not have fine enough | ||
| 1770 | time granularity to match protocol, and we do not have a | ||
| 1771 | a way (yet) to query the server fs's time granularity (and | ||
| 1772 | whether it rounds times down). | ||
| 1773 | */ | ||
| 1774 | if (!rc && (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME))) | ||
| 1775 | cifsInode->time = 0; | ||
| 1776 | } | ||
| 1767 | out: | 1777 | out: |
| 1768 | kfree(args); | 1778 | kfree(args); |
| 1769 | kfree(full_path); | 1779 | kfree(full_path); |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index f84062f9a985..c343b14ba2d3 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -77,6 +77,11 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, | |||
| 77 | 77 | ||
| 78 | cFYI(1, ("For %s", name->name)); | 78 | cFYI(1, ("For %s", name->name)); |
| 79 | 79 | ||
| 80 | if (parent->d_op && parent->d_op->d_hash) | ||
| 81 | parent->d_op->d_hash(parent, name); | ||
| 82 | else | ||
| 83 | name->hash = full_name_hash(name->name, name->len); | ||
| 84 | |||
| 80 | dentry = d_lookup(parent, name); | 85 | dentry = d_lookup(parent, name); |
| 81 | if (dentry) { | 86 | if (dentry) { |
| 82 | /* FIXME: check for inode number changes? */ | 87 | /* FIXME: check for inode number changes? */ |
| @@ -666,12 +671,11 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst, | |||
| 666 | min(len, max_len), nlt, | 671 | min(len, max_len), nlt, |
| 667 | cifs_sb->mnt_cifs_flags & | 672 | cifs_sb->mnt_cifs_flags & |
| 668 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 673 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 674 | pqst->len -= nls_nullsize(nlt); | ||
| 669 | } else { | 675 | } else { |
| 670 | pqst->name = filename; | 676 | pqst->name = filename; |
| 671 | pqst->len = len; | 677 | pqst->len = len; |
| 672 | } | 678 | } |
| 673 | pqst->hash = full_name_hash(pqst->name, pqst->len); | ||
| 674 | /* cFYI(1, ("filldir on %s",pqst->name)); */ | ||
| 675 | return rc; | 679 | return rc; |
| 676 | } | 680 | } |
| 677 | 681 | ||
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 7085a6275c4c..aaa9c1c5a5bd 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
| @@ -223,9 +223,9 @@ static void unicode_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses, | |||
| 223 | /* null user mount */ | 223 | /* null user mount */ |
| 224 | *bcc_ptr = 0; | 224 | *bcc_ptr = 0; |
| 225 | *(bcc_ptr+1) = 0; | 225 | *(bcc_ptr+1) = 0; |
| 226 | } else { /* 300 should be long enough for any conceivable user name */ | 226 | } else { |
| 227 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName, | 227 | bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName, |
| 228 | 300, nls_cp); | 228 | MAX_USERNAME_SIZE, nls_cp); |
| 229 | } | 229 | } |
| 230 | bcc_ptr += 2 * bytes_ret; | 230 | bcc_ptr += 2 * bytes_ret; |
| 231 | bcc_ptr += 2; /* account for null termination */ | 231 | bcc_ptr += 2; /* account for null termination */ |
| @@ -246,11 +246,10 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses, | |||
| 246 | /* copy user */ | 246 | /* copy user */ |
| 247 | if (ses->userName == NULL) { | 247 | if (ses->userName == NULL) { |
| 248 | /* BB what about null user mounts - check that we do this BB */ | 248 | /* BB what about null user mounts - check that we do this BB */ |
| 249 | } else { /* 300 should be long enough for any conceivable user name */ | 249 | } else { |
| 250 | strncpy(bcc_ptr, ses->userName, 300); | 250 | strncpy(bcc_ptr, ses->userName, MAX_USERNAME_SIZE); |
| 251 | } | 251 | } |
| 252 | /* BB improve check for overflow */ | 252 | bcc_ptr += strnlen(ses->userName, MAX_USERNAME_SIZE); |
| 253 | bcc_ptr += strnlen(ses->userName, 300); | ||
| 254 | *bcc_ptr = 0; | 253 | *bcc_ptr = 0; |
| 255 | bcc_ptr++; /* account for null termination */ | 254 | bcc_ptr++; /* account for null termination */ |
| 256 | 255 | ||
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index c5c45de1a2ee..0ca9ec4a79c3 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
| @@ -301,6 +301,12 @@ static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, | |||
| 301 | u32 data; | 301 | u32 data; |
| 302 | void __user *dxferp; | 302 | void __user *dxferp; |
| 303 | int err; | 303 | int err; |
| 304 | int interface_id; | ||
| 305 | |||
| 306 | if (get_user(interface_id, &sgio32->interface_id)) | ||
| 307 | return -EFAULT; | ||
| 308 | if (interface_id != 'S') | ||
| 309 | return sys_ioctl(fd, cmd, (unsigned long)sgio32); | ||
| 304 | 310 | ||
| 305 | if (get_user(iovec_count, &sgio32->iovec_count)) | 311 | if (get_user(iovec_count, &sgio32->iovec_count)) |
| 306 | return -EFAULT; | 312 | return -EFAULT; |
| @@ -936,6 +942,7 @@ COMPATIBLE_IOCTL(TCSETSF) | |||
| 936 | COMPATIBLE_IOCTL(TIOCLINUX) | 942 | COMPATIBLE_IOCTL(TIOCLINUX) |
| 937 | COMPATIBLE_IOCTL(TIOCSBRK) | 943 | COMPATIBLE_IOCTL(TIOCSBRK) |
| 938 | COMPATIBLE_IOCTL(TIOCCBRK) | 944 | COMPATIBLE_IOCTL(TIOCCBRK) |
| 945 | COMPATIBLE_IOCTL(TIOCGSID) | ||
| 939 | COMPATIBLE_IOCTL(TIOCGICOUNT) | 946 | COMPATIBLE_IOCTL(TIOCGICOUNT) |
| 940 | /* Little t */ | 947 | /* Little t */ |
| 941 | COMPATIBLE_IOCTL(TIOCGETD) | 948 | COMPATIBLE_IOCTL(TIOCGETD) |
| @@ -1038,6 +1045,8 @@ COMPATIBLE_IOCTL(FIOQSIZE) | |||
| 1038 | #ifdef CONFIG_BLOCK | 1045 | #ifdef CONFIG_BLOCK |
| 1039 | /* loop */ | 1046 | /* loop */ |
| 1040 | IGNORE_IOCTL(LOOP_CLR_FD) | 1047 | IGNORE_IOCTL(LOOP_CLR_FD) |
| 1048 | /* md calls this on random blockdevs */ | ||
| 1049 | IGNORE_IOCTL(RAID_VERSION) | ||
| 1041 | /* SG stuff */ | 1050 | /* SG stuff */ |
| 1042 | COMPATIBLE_IOCTL(SG_SET_TIMEOUT) | 1051 | COMPATIBLE_IOCTL(SG_SET_TIMEOUT) |
| 1043 | COMPATIBLE_IOCTL(SG_GET_TIMEOUT) | 1052 | COMPATIBLE_IOCTL(SG_GET_TIMEOUT) |
| @@ -571,6 +571,9 @@ int setup_arg_pages(struct linux_binprm *bprm, | |||
| 571 | struct vm_area_struct *prev = NULL; | 571 | struct vm_area_struct *prev = NULL; |
| 572 | unsigned long vm_flags; | 572 | unsigned long vm_flags; |
| 573 | unsigned long stack_base; | 573 | unsigned long stack_base; |
| 574 | unsigned long stack_size; | ||
| 575 | unsigned long stack_expand; | ||
| 576 | unsigned long rlim_stack; | ||
| 574 | 577 | ||
| 575 | #ifdef CONFIG_STACK_GROWSUP | 578 | #ifdef CONFIG_STACK_GROWSUP |
| 576 | /* Limit stack size to 1GB */ | 579 | /* Limit stack size to 1GB */ |
| @@ -627,10 +630,24 @@ int setup_arg_pages(struct linux_binprm *bprm, | |||
| 627 | goto out_unlock; | 630 | goto out_unlock; |
| 628 | } | 631 | } |
| 629 | 632 | ||
| 633 | stack_expand = EXTRA_STACK_VM_PAGES * PAGE_SIZE; | ||
| 634 | stack_size = vma->vm_end - vma->vm_start; | ||
| 635 | /* | ||
| 636 | * Align this down to a page boundary as expand_stack | ||
| 637 | * will align it up. | ||
| 638 | */ | ||
| 639 | rlim_stack = rlimit(RLIMIT_STACK) & PAGE_MASK; | ||
| 640 | rlim_stack = min(rlim_stack, stack_size); | ||
| 630 | #ifdef CONFIG_STACK_GROWSUP | 641 | #ifdef CONFIG_STACK_GROWSUP |
| 631 | stack_base = vma->vm_end + EXTRA_STACK_VM_PAGES * PAGE_SIZE; | 642 | if (stack_size + stack_expand > rlim_stack) |
| 643 | stack_base = vma->vm_start + rlim_stack; | ||
| 644 | else | ||
| 645 | stack_base = vma->vm_end + stack_expand; | ||
| 632 | #else | 646 | #else |
| 633 | stack_base = vma->vm_start - EXTRA_STACK_VM_PAGES * PAGE_SIZE; | 647 | if (stack_size + stack_expand > rlim_stack) |
| 648 | stack_base = vma->vm_end - rlim_stack; | ||
| 649 | else | ||
| 650 | stack_base = vma->vm_start - stack_expand; | ||
| 634 | #endif | 651 | #endif |
| 635 | ret = expand_stack(vma, stack_base); | 652 | ret = expand_stack(vma, stack_base); |
| 636 | if (ret) | 653 | if (ret) |
| @@ -961,6 +978,11 @@ int flush_old_exec(struct linux_binprm * bprm) | |||
| 961 | goto out; | 978 | goto out; |
| 962 | 979 | ||
| 963 | bprm->mm = NULL; /* We're using it now */ | 980 | bprm->mm = NULL; /* We're using it now */ |
| 981 | |||
| 982 | current->flags &= ~PF_RANDOMIZE; | ||
| 983 | flush_thread(); | ||
| 984 | current->personality &= ~bprm->per_clear; | ||
| 985 | |||
| 964 | return 0; | 986 | return 0; |
| 965 | 987 | ||
| 966 | out: | 988 | out: |
| @@ -997,9 +1019,6 @@ void setup_new_exec(struct linux_binprm * bprm) | |||
| 997 | tcomm[i] = '\0'; | 1019 | tcomm[i] = '\0'; |
| 998 | set_task_comm(current, tcomm); | 1020 | set_task_comm(current, tcomm); |
| 999 | 1021 | ||
| 1000 | current->flags &= ~PF_RANDOMIZE; | ||
| 1001 | flush_thread(); | ||
| 1002 | |||
| 1003 | /* Set the new mm task size. We have to do that late because it may | 1022 | /* Set the new mm task size. We have to do that late because it may |
| 1004 | * depend on TIF_32BIT which is only updated in flush_thread() on | 1023 | * depend on TIF_32BIT which is only updated in flush_thread() on |
| 1005 | * some architectures like powerpc | 1024 | * some architectures like powerpc |
| @@ -1015,8 +1034,6 @@ void setup_new_exec(struct linux_binprm * bprm) | |||
| 1015 | set_dumpable(current->mm, suid_dumpable); | 1034 | set_dumpable(current->mm, suid_dumpable); |
| 1016 | } | 1035 | } |
| 1017 | 1036 | ||
| 1018 | current->personality &= ~bprm->per_clear; | ||
| 1019 | |||
| 1020 | /* | 1037 | /* |
| 1021 | * Flush performance counters when crossing a | 1038 | * Flush performance counters when crossing a |
| 1022 | * security domain: | 1039 | * security domain: |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 5ef953e6f908..97e01dc0d95f 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -199,9 +199,7 @@ static int setfl(int fd, struct file * filp, unsigned long arg) | |||
| 199 | static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, | 199 | static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, |
| 200 | int force) | 200 | int force) |
| 201 | { | 201 | { |
| 202 | unsigned long flags; | 202 | write_lock_irq(&filp->f_owner.lock); |
| 203 | |||
| 204 | write_lock_irqsave(&filp->f_owner.lock, flags); | ||
| 205 | if (force || !filp->f_owner.pid) { | 203 | if (force || !filp->f_owner.pid) { |
| 206 | put_pid(filp->f_owner.pid); | 204 | put_pid(filp->f_owner.pid); |
| 207 | filp->f_owner.pid = get_pid(pid); | 205 | filp->f_owner.pid = get_pid(pid); |
| @@ -213,7 +211,7 @@ static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, | |||
| 213 | filp->f_owner.euid = cred->euid; | 211 | filp->f_owner.euid = cred->euid; |
| 214 | } | 212 | } |
| 215 | } | 213 | } |
| 216 | write_unlock_irqrestore(&filp->f_owner.lock, flags); | 214 | write_unlock_irq(&filp->f_owner.lock); |
| 217 | } | 215 | } |
| 218 | 216 | ||
| 219 | int __f_setown(struct file *filp, struct pid *pid, enum pid_type type, | 217 | int __f_setown(struct file *filp, struct pid *pid, enum pid_type type, |
diff --git a/fs/file_table.c b/fs/file_table.c index 69652c5bd5f0..b98404b54383 100644 --- a/fs/file_table.c +++ b/fs/file_table.c | |||
| @@ -253,6 +253,7 @@ void __fput(struct file *file) | |||
| 253 | if (file->f_op && file->f_op->release) | 253 | if (file->f_op && file->f_op->release) |
| 254 | file->f_op->release(inode, file); | 254 | file->f_op->release(inode, file); |
| 255 | security_file_free(file); | 255 | security_file_free(file); |
| 256 | ima_file_free(file); | ||
| 256 | if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL)) | 257 | if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL)) |
| 257 | cdev_put(inode->i_cdev); | 258 | cdev_put(inode->i_cdev); |
| 258 | fops_put(file->f_op); | 259 | fops_put(file->f_op); |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index c18913a777ae..a9f5e137f1d3 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -828,6 +828,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_req *req, | |||
| 828 | if (!page) | 828 | if (!page) |
| 829 | break; | 829 | break; |
| 830 | 830 | ||
| 831 | if (mapping_writably_mapped(mapping)) | ||
| 832 | flush_dcache_page(page); | ||
| 833 | |||
| 831 | pagefault_disable(); | 834 | pagefault_disable(); |
| 832 | tmp = iov_iter_copy_from_user_atomic(page, ii, offset, bytes); | 835 | tmp = iov_iter_copy_from_user_atomic(page, ii, offset, bytes); |
| 833 | pagefault_enable(); | 836 | pagefault_enable(); |
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 6d47379e794b..583e823307ae 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
| @@ -541,7 +541,7 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock, | |||
| 541 | *ptr++ = cpu_to_be64(bn++); | 541 | *ptr++ = cpu_to_be64(bn++); |
| 542 | break; | 542 | break; |
| 543 | } | 543 | } |
| 544 | } while (state != ALLOC_DATA); | 544 | } while ((state != ALLOC_DATA) || !dblock); |
| 545 | 545 | ||
| 546 | ip->i_height = height; | 546 | ip->i_height = height; |
| 547 | gfs2_add_inode_blocks(&ip->i_inode, alloced); | 547 | gfs2_add_inode_blocks(&ip->i_inode, alloced); |
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index f455a03a09e2..f42663325931 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -769,6 +769,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, | |||
| 769 | if (!gl) | 769 | if (!gl) |
| 770 | return -ENOMEM; | 770 | return -ENOMEM; |
| 771 | 771 | ||
| 772 | atomic_inc(&sdp->sd_glock_disposal); | ||
| 772 | gl->gl_flags = 0; | 773 | gl->gl_flags = 0; |
| 773 | gl->gl_name = name; | 774 | gl->gl_name = name; |
| 774 | atomic_set(&gl->gl_ref, 1); | 775 | atomic_set(&gl->gl_ref, 1); |
| @@ -1538,6 +1539,9 @@ void gfs2_gl_hash_clear(struct gfs2_sbd *sdp) | |||
| 1538 | up_write(&gfs2_umount_flush_sem); | 1539 | up_write(&gfs2_umount_flush_sem); |
| 1539 | msleep(10); | 1540 | msleep(10); |
| 1540 | } | 1541 | } |
| 1542 | flush_workqueue(glock_workqueue); | ||
| 1543 | wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0); | ||
| 1544 | gfs2_dump_lockstate(sdp); | ||
| 1541 | } | 1545 | } |
| 1542 | 1546 | ||
| 1543 | void gfs2_glock_finish_truncate(struct gfs2_inode *ip) | 1547 | void gfs2_glock_finish_truncate(struct gfs2_inode *ip) |
diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h index 13f0bd228132..c0262faf4725 100644 --- a/fs/gfs2/glock.h +++ b/fs/gfs2/glock.h | |||
| @@ -123,7 +123,7 @@ struct lm_lockops { | |||
| 123 | int (*lm_mount) (struct gfs2_sbd *sdp, const char *fsname); | 123 | int (*lm_mount) (struct gfs2_sbd *sdp, const char *fsname); |
| 124 | void (*lm_unmount) (struct gfs2_sbd *sdp); | 124 | void (*lm_unmount) (struct gfs2_sbd *sdp); |
| 125 | void (*lm_withdraw) (struct gfs2_sbd *sdp); | 125 | void (*lm_withdraw) (struct gfs2_sbd *sdp); |
| 126 | void (*lm_put_lock) (struct kmem_cache *cachep, void *gl); | 126 | void (*lm_put_lock) (struct kmem_cache *cachep, struct gfs2_glock *gl); |
| 127 | unsigned int (*lm_lock) (struct gfs2_glock *gl, | 127 | unsigned int (*lm_lock) (struct gfs2_glock *gl, |
| 128 | unsigned int req_state, unsigned int flags); | 128 | unsigned int req_state, unsigned int flags); |
| 129 | void (*lm_cancel) (struct gfs2_glock *gl); | 129 | void (*lm_cancel) (struct gfs2_glock *gl); |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 4792200978c8..bc0ad158e6b4 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
| @@ -544,6 +544,8 @@ struct gfs2_sbd { | |||
| 544 | struct gfs2_holder sd_live_gh; | 544 | struct gfs2_holder sd_live_gh; |
| 545 | struct gfs2_glock *sd_rename_gl; | 545 | struct gfs2_glock *sd_rename_gl; |
| 546 | struct gfs2_glock *sd_trans_gl; | 546 | struct gfs2_glock *sd_trans_gl; |
| 547 | wait_queue_head_t sd_glock_wait; | ||
| 548 | atomic_t sd_glock_disposal; | ||
| 547 | 549 | ||
| 548 | /* Inode Stuff */ | 550 | /* Inode Stuff */ |
| 549 | 551 | ||
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 46df988323bc..0e5e0e7022e5 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c | |||
| @@ -21,6 +21,7 @@ static void gdlm_ast(void *arg) | |||
| 21 | { | 21 | { |
| 22 | struct gfs2_glock *gl = arg; | 22 | struct gfs2_glock *gl = arg; |
| 23 | unsigned ret = gl->gl_state; | 23 | unsigned ret = gl->gl_state; |
| 24 | struct gfs2_sbd *sdp = gl->gl_sbd; | ||
| 24 | 25 | ||
| 25 | BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); | 26 | BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); |
| 26 | 27 | ||
| @@ -30,6 +31,8 @@ static void gdlm_ast(void *arg) | |||
| 30 | switch (gl->gl_lksb.sb_status) { | 31 | switch (gl->gl_lksb.sb_status) { |
| 31 | case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */ | 32 | case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */ |
| 32 | kmem_cache_free(gfs2_glock_cachep, gl); | 33 | kmem_cache_free(gfs2_glock_cachep, gl); |
| 34 | if (atomic_dec_and_test(&sdp->sd_glock_disposal)) | ||
| 35 | wake_up(&sdp->sd_glock_wait); | ||
| 33 | return; | 36 | return; |
| 34 | case -DLM_ECANCEL: /* Cancel while getting lock */ | 37 | case -DLM_ECANCEL: /* Cancel while getting lock */ |
| 35 | ret |= LM_OUT_CANCELED; | 38 | ret |= LM_OUT_CANCELED; |
| @@ -164,14 +167,16 @@ static unsigned int gdlm_lock(struct gfs2_glock *gl, | |||
| 164 | return LM_OUT_ASYNC; | 167 | return LM_OUT_ASYNC; |
| 165 | } | 168 | } |
| 166 | 169 | ||
| 167 | static void gdlm_put_lock(struct kmem_cache *cachep, void *ptr) | 170 | static void gdlm_put_lock(struct kmem_cache *cachep, struct gfs2_glock *gl) |
| 168 | { | 171 | { |
| 169 | struct gfs2_glock *gl = ptr; | 172 | struct gfs2_sbd *sdp = gl->gl_sbd; |
| 170 | struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct; | 173 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
| 171 | int error; | 174 | int error; |
| 172 | 175 | ||
| 173 | if (gl->gl_lksb.sb_lkid == 0) { | 176 | if (gl->gl_lksb.sb_lkid == 0) { |
| 174 | kmem_cache_free(cachep, gl); | 177 | kmem_cache_free(cachep, gl); |
| 178 | if (atomic_dec_and_test(&sdp->sd_glock_disposal)) | ||
| 179 | wake_up(&sdp->sd_glock_wait); | ||
| 175 | return; | 180 | return; |
| 176 | } | 181 | } |
| 177 | 182 | ||
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index edfee24f3636..a86ed6381566 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
| @@ -82,6 +82,8 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb) | |||
| 82 | 82 | ||
| 83 | gfs2_tune_init(&sdp->sd_tune); | 83 | gfs2_tune_init(&sdp->sd_tune); |
| 84 | 84 | ||
| 85 | init_waitqueue_head(&sdp->sd_glock_wait); | ||
| 86 | atomic_set(&sdp->sd_glock_disposal, 0); | ||
| 85 | spin_lock_init(&sdp->sd_statfs_spin); | 87 | spin_lock_init(&sdp->sd_statfs_spin); |
| 86 | 88 | ||
| 87 | spin_lock_init(&sdp->sd_rindex_spin); | 89 | spin_lock_init(&sdp->sd_rindex_spin); |
| @@ -723,7 +725,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo) | |||
| 723 | goto fail; | 725 | goto fail; |
| 724 | } | 726 | } |
| 725 | 727 | ||
| 726 | error = -EINVAL; | 728 | error = -EUSERS; |
| 727 | if (!gfs2_jindex_size(sdp)) { | 729 | if (!gfs2_jindex_size(sdp)) { |
| 728 | fs_err(sdp, "no journals!\n"); | 730 | fs_err(sdp, "no journals!\n"); |
| 729 | goto fail_jindex; | 731 | goto fail_jindex; |
| @@ -983,9 +985,17 @@ static const match_table_t nolock_tokens = { | |||
| 983 | { Opt_err, NULL }, | 985 | { Opt_err, NULL }, |
| 984 | }; | 986 | }; |
| 985 | 987 | ||
| 988 | static void nolock_put_lock(struct kmem_cache *cachep, struct gfs2_glock *gl) | ||
| 989 | { | ||
| 990 | struct gfs2_sbd *sdp = gl->gl_sbd; | ||
| 991 | kmem_cache_free(cachep, gl); | ||
| 992 | if (atomic_dec_and_test(&sdp->sd_glock_disposal)) | ||
| 993 | wake_up(&sdp->sd_glock_wait); | ||
| 994 | } | ||
| 995 | |||
| 986 | static const struct lm_lockops nolock_ops = { | 996 | static const struct lm_lockops nolock_ops = { |
| 987 | .lm_proto_name = "lock_nolock", | 997 | .lm_proto_name = "lock_nolock", |
| 988 | .lm_put_lock = kmem_cache_free, | 998 | .lm_put_lock = nolock_put_lock, |
| 989 | .lm_tokens = &nolock_tokens, | 999 | .lm_tokens = &nolock_tokens, |
| 990 | }; | 1000 | }; |
| 991 | 1001 | ||
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 78f73ca1ef3e..84350e1be66d 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
| @@ -1088,7 +1088,8 @@ static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 1088 | error = vfs_follow_link(nd, buf); | 1088 | error = vfs_follow_link(nd, buf); |
| 1089 | if (buf != array) | 1089 | if (buf != array) |
| 1090 | kfree(buf); | 1090 | kfree(buf); |
| 1091 | } | 1091 | } else |
| 1092 | path_put(&nd->path); | ||
| 1092 | 1093 | ||
| 1093 | return ERR_PTR(error); | 1094 | return ERR_PTR(error); |
| 1094 | } | 1095 | } |
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 0608f490c295..503b842f3ba2 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
| @@ -591,11 +591,7 @@ static int gfs2_ri_update(struct gfs2_inode *ip) | |||
| 591 | u64 rgrp_count = ip->i_disksize; | 591 | u64 rgrp_count = ip->i_disksize; |
| 592 | int error; | 592 | int error; |
| 593 | 593 | ||
| 594 | if (do_div(rgrp_count, sizeof(struct gfs2_rindex))) { | 594 | do_div(rgrp_count, sizeof(struct gfs2_rindex)); |
| 595 | gfs2_consist_inode(ip); | ||
| 596 | return -EIO; | ||
| 597 | } | ||
| 598 | |||
| 599 | clear_rgrpdi(sdp); | 595 | clear_rgrpdi(sdp); |
| 600 | 596 | ||
| 601 | file_ra_state_init(&ra_state, inode->i_mapping); | 597 | file_ra_state_init(&ra_state, inode->i_mapping); |
| @@ -915,7 +911,7 @@ void gfs2_rgrp_repolish_clones(struct gfs2_rgrpd *rgd) | |||
| 915 | struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip) | 911 | struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip) |
| 916 | { | 912 | { |
| 917 | BUG_ON(ip->i_alloc != NULL); | 913 | BUG_ON(ip->i_alloc != NULL); |
| 918 | ip->i_alloc = kzalloc(sizeof(struct gfs2_alloc), GFP_KERNEL); | 914 | ip->i_alloc = kzalloc(sizeof(struct gfs2_alloc), GFP_NOFS); |
| 919 | return ip->i_alloc; | 915 | return ip->i_alloc; |
| 920 | } | 916 | } |
| 921 | 917 | ||
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index c282ad41f3d1..b9dd3da22c0a 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/gfs2_ondisk.h> | 21 | #include <linux/gfs2_ondisk.h> |
| 22 | #include <linux/crc32.h> | 22 | #include <linux/crc32.h> |
| 23 | #include <linux/time.h> | 23 | #include <linux/time.h> |
| 24 | #include <linux/wait.h> | ||
| 24 | 25 | ||
| 25 | #include "gfs2.h" | 26 | #include "gfs2.h" |
| 26 | #include "incore.h" | 27 | #include "incore.h" |
diff --git a/fs/namei.c b/fs/namei.c index 94a5e60779f9..d62fdc875f22 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1736,8 +1736,7 @@ do_last: | |||
| 1736 | if (nd.root.mnt) | 1736 | if (nd.root.mnt) |
| 1737 | path_put(&nd.root); | 1737 | path_put(&nd.root); |
| 1738 | if (!IS_ERR(filp)) { | 1738 | if (!IS_ERR(filp)) { |
| 1739 | error = ima_path_check(&filp->f_path, filp->f_mode & | 1739 | error = ima_file_check(filp, acc_mode); |
| 1740 | (MAY_READ | MAY_WRITE | MAY_EXEC)); | ||
| 1741 | if (error) { | 1740 | if (error) { |
| 1742 | fput(filp); | 1741 | fput(filp); |
| 1743 | filp = ERR_PTR(error); | 1742 | filp = ERR_PTR(error); |
| @@ -1797,8 +1796,7 @@ ok: | |||
| 1797 | } | 1796 | } |
| 1798 | filp = nameidata_to_filp(&nd); | 1797 | filp = nameidata_to_filp(&nd); |
| 1799 | if (!IS_ERR(filp)) { | 1798 | if (!IS_ERR(filp)) { |
| 1800 | error = ima_path_check(&filp->f_path, filp->f_mode & | 1799 | error = ima_file_check(filp, acc_mode); |
| 1801 | (MAY_READ | MAY_WRITE | MAY_EXEC)); | ||
| 1802 | if (error) { | 1800 | if (error) { |
| 1803 | fput(filp); | 1801 | fput(filp); |
| 1804 | filp = ERR_PTR(error); | 1802 | filp = ERR_PTR(error); |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 6b891328f332..63f2071d6445 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -486,6 +486,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp) | |||
| 486 | { | 486 | { |
| 487 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); | 487 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); |
| 488 | 488 | ||
| 489 | if (gfp & __GFP_WAIT) | ||
| 490 | nfs_wb_page(page->mapping->host, page); | ||
| 489 | /* If PagePrivate() is set, then the page is not freeable */ | 491 | /* If PagePrivate() is set, then the page is not freeable */ |
| 490 | if (PagePrivate(page)) | 492 | if (PagePrivate(page)) |
| 491 | return 0; | 493 | return 0; |
diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c index fa588006588d..237874f1af23 100644 --- a/fs/nfs/fscache.c +++ b/fs/nfs/fscache.c | |||
| @@ -354,12 +354,11 @@ void nfs_fscache_reset_inode_cookie(struct inode *inode) | |||
| 354 | */ | 354 | */ |
| 355 | int nfs_fscache_release_page(struct page *page, gfp_t gfp) | 355 | int nfs_fscache_release_page(struct page *page, gfp_t gfp) |
| 356 | { | 356 | { |
| 357 | struct nfs_inode *nfsi = NFS_I(page->mapping->host); | ||
| 358 | struct fscache_cookie *cookie = nfsi->fscache; | ||
| 359 | |||
| 360 | BUG_ON(!cookie); | ||
| 361 | |||
| 362 | if (PageFsCache(page)) { | 357 | if (PageFsCache(page)) { |
| 358 | struct nfs_inode *nfsi = NFS_I(page->mapping->host); | ||
| 359 | struct fscache_cookie *cookie = nfsi->fscache; | ||
| 360 | |||
| 361 | BUG_ON(!cookie); | ||
| 363 | dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n", | 362 | dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n", |
| 364 | cookie, page, nfsi); | 363 | cookie, page, nfsi); |
| 365 | 364 | ||
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index faa091865ad0..f141bde7756a 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -1261,8 +1261,10 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
| 1261 | 1261 | ||
| 1262 | if (fattr->valid & NFS_ATTR_FATTR_MODE) { | 1262 | if (fattr->valid & NFS_ATTR_FATTR_MODE) { |
| 1263 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) { | 1263 | if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) { |
| 1264 | umode_t newmode = inode->i_mode & S_IFMT; | ||
| 1265 | newmode |= fattr->mode & S_IALLUGO; | ||
| 1266 | inode->i_mode = newmode; | ||
| 1264 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; | 1267 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; |
| 1265 | inode->i_mode = fattr->mode; | ||
| 1266 | } | 1268 | } |
| 1267 | } else if (server->caps & NFS_CAP_MODE) | 1269 | } else if (server->caps & NFS_CAP_MODE) |
| 1268 | invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR | 1270 | invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR |
diff --git a/fs/nfs/mount_clnt.c b/fs/nfs/mount_clnt.c index 0adefc40cc89..59047f8d7d72 100644 --- a/fs/nfs/mount_clnt.c +++ b/fs/nfs/mount_clnt.c | |||
| @@ -120,7 +120,7 @@ static struct { | |||
| 120 | { .status = MNT3ERR_INVAL, .errno = -EINVAL, }, | 120 | { .status = MNT3ERR_INVAL, .errno = -EINVAL, }, |
| 121 | { .status = MNT3ERR_NAMETOOLONG, .errno = -ENAMETOOLONG, }, | 121 | { .status = MNT3ERR_NAMETOOLONG, .errno = -ENAMETOOLONG, }, |
| 122 | { .status = MNT3ERR_NOTSUPP, .errno = -ENOTSUPP, }, | 122 | { .status = MNT3ERR_NOTSUPP, .errno = -ENOTSUPP, }, |
| 123 | { .status = MNT3ERR_SERVERFAULT, .errno = -ESERVERFAULT, }, | 123 | { .status = MNT3ERR_SERVERFAULT, .errno = -EREMOTEIO, }, |
| 124 | }; | 124 | }; |
| 125 | 125 | ||
| 126 | struct mountres { | 126 | struct mountres { |
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c index 5e078b222b4e..7bc2da8efd4a 100644 --- a/fs/nfs/nfs2xdr.c +++ b/fs/nfs/nfs2xdr.c | |||
| @@ -699,7 +699,7 @@ static struct { | |||
| 699 | { NFSERR_BAD_COOKIE, -EBADCOOKIE }, | 699 | { NFSERR_BAD_COOKIE, -EBADCOOKIE }, |
| 700 | { NFSERR_NOTSUPP, -ENOTSUPP }, | 700 | { NFSERR_NOTSUPP, -ENOTSUPP }, |
| 701 | { NFSERR_TOOSMALL, -ETOOSMALL }, | 701 | { NFSERR_TOOSMALL, -ETOOSMALL }, |
| 702 | { NFSERR_SERVERFAULT, -ESERVERFAULT }, | 702 | { NFSERR_SERVERFAULT, -EREMOTEIO }, |
| 703 | { NFSERR_BADTYPE, -EBADTYPE }, | 703 | { NFSERR_BADTYPE, -EBADTYPE }, |
| 704 | { NFSERR_JUKEBOX, -EJUKEBOX }, | 704 | { NFSERR_JUKEBOX, -EJUKEBOX }, |
| 705 | { -1, -EIO } | 705 | { -1, -EIO } |
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 865265bdca03..0c6fda33d66e 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
| @@ -146,6 +146,7 @@ enum { | |||
| 146 | NFS_O_RDWR_STATE, /* OPEN stateid has read/write state */ | 146 | NFS_O_RDWR_STATE, /* OPEN stateid has read/write state */ |
| 147 | NFS_STATE_RECLAIM_REBOOT, /* OPEN stateid server rebooted */ | 147 | NFS_STATE_RECLAIM_REBOOT, /* OPEN stateid server rebooted */ |
| 148 | NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to recover state */ | 148 | NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to recover state */ |
| 149 | NFS_STATE_POSIX_LOCKS, /* Posix locks are supported */ | ||
| 149 | }; | 150 | }; |
| 150 | 151 | ||
| 151 | struct nfs4_state { | 152 | struct nfs4_state { |
| @@ -277,6 +278,7 @@ extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t); | |||
| 277 | extern void nfs4_schedule_state_recovery(struct nfs_client *); | 278 | extern void nfs4_schedule_state_recovery(struct nfs_client *); |
| 278 | extern void nfs4_schedule_state_manager(struct nfs_client *); | 279 | extern void nfs4_schedule_state_manager(struct nfs_client *); |
| 279 | extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state); | 280 | extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state); |
| 281 | extern int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state); | ||
| 280 | extern void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags); | 282 | extern void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags); |
| 281 | extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); | 283 | extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); |
| 282 | extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); | 284 | extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 198d51d17c13..375f0fae2c6a 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -249,19 +249,15 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 249 | if (state == NULL) | 249 | if (state == NULL) |
| 250 | break; | 250 | break; |
| 251 | nfs4_state_mark_reclaim_nograce(clp, state); | 251 | nfs4_state_mark_reclaim_nograce(clp, state); |
| 252 | case -NFS4ERR_STALE_CLIENTID: | 252 | goto do_state_recovery; |
| 253 | case -NFS4ERR_STALE_STATEID: | 253 | case -NFS4ERR_STALE_STATEID: |
| 254 | case -NFS4ERR_EXPIRED: | 254 | if (state == NULL) |
| 255 | nfs4_schedule_state_recovery(clp); | ||
| 256 | ret = nfs4_wait_clnt_recover(clp); | ||
| 257 | if (ret == 0) | ||
| 258 | exception->retry = 1; | ||
| 259 | #if !defined(CONFIG_NFS_V4_1) | ||
| 260 | break; | ||
| 261 | #else /* !defined(CONFIG_NFS_V4_1) */ | ||
| 262 | if (!nfs4_has_session(server->nfs_client)) | ||
| 263 | break; | 255 | break; |
| 264 | /* FALLTHROUGH */ | 256 | nfs4_state_mark_reclaim_reboot(clp, state); |
| 257 | case -NFS4ERR_STALE_CLIENTID: | ||
| 258 | case -NFS4ERR_EXPIRED: | ||
| 259 | goto do_state_recovery; | ||
| 260 | #if defined(CONFIG_NFS_V4_1) | ||
| 265 | case -NFS4ERR_BADSESSION: | 261 | case -NFS4ERR_BADSESSION: |
| 266 | case -NFS4ERR_BADSLOT: | 262 | case -NFS4ERR_BADSLOT: |
| 267 | case -NFS4ERR_BAD_HIGH_SLOT: | 263 | case -NFS4ERR_BAD_HIGH_SLOT: |
| @@ -274,7 +270,7 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 274 | nfs4_schedule_state_recovery(clp); | 270 | nfs4_schedule_state_recovery(clp); |
| 275 | exception->retry = 1; | 271 | exception->retry = 1; |
| 276 | break; | 272 | break; |
| 277 | #endif /* !defined(CONFIG_NFS_V4_1) */ | 273 | #endif /* defined(CONFIG_NFS_V4_1) */ |
| 278 | case -NFS4ERR_FILE_OPEN: | 274 | case -NFS4ERR_FILE_OPEN: |
| 279 | if (exception->timeout > HZ) { | 275 | if (exception->timeout > HZ) { |
| 280 | /* We have retried a decent amount, time to | 276 | /* We have retried a decent amount, time to |
| @@ -293,6 +289,12 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 293 | } | 289 | } |
| 294 | /* We failed to handle the error */ | 290 | /* We failed to handle the error */ |
| 295 | return nfs4_map_errors(ret); | 291 | return nfs4_map_errors(ret); |
| 292 | do_state_recovery: | ||
| 293 | nfs4_schedule_state_recovery(clp); | ||
| 294 | ret = nfs4_wait_clnt_recover(clp); | ||
| 295 | if (ret == 0) | ||
| 296 | exception->retry = 1; | ||
| 297 | return ret; | ||
| 296 | } | 298 | } |
| 297 | 299 | ||
| 298 | 300 | ||
| @@ -1658,6 +1660,8 @@ static int _nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, in | |||
| 1658 | status = PTR_ERR(state); | 1660 | status = PTR_ERR(state); |
| 1659 | if (IS_ERR(state)) | 1661 | if (IS_ERR(state)) |
| 1660 | goto err_opendata_put; | 1662 | goto err_opendata_put; |
| 1663 | if ((opendata->o_res.rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) != 0) | ||
| 1664 | set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); | ||
| 1661 | nfs4_opendata_put(opendata); | 1665 | nfs4_opendata_put(opendata); |
| 1662 | nfs4_put_state_owner(sp); | 1666 | nfs4_put_state_owner(sp); |
| 1663 | *res = state; | 1667 | *res = state; |
| @@ -3422,15 +3426,14 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 3422 | if (state == NULL) | 3426 | if (state == NULL) |
| 3423 | break; | 3427 | break; |
| 3424 | nfs4_state_mark_reclaim_nograce(clp, state); | 3428 | nfs4_state_mark_reclaim_nograce(clp, state); |
| 3425 | case -NFS4ERR_STALE_CLIENTID: | 3429 | goto do_state_recovery; |
| 3426 | case -NFS4ERR_STALE_STATEID: | 3430 | case -NFS4ERR_STALE_STATEID: |
| 3431 | if (state == NULL) | ||
| 3432 | break; | ||
| 3433 | nfs4_state_mark_reclaim_reboot(clp, state); | ||
| 3434 | case -NFS4ERR_STALE_CLIENTID: | ||
| 3427 | case -NFS4ERR_EXPIRED: | 3435 | case -NFS4ERR_EXPIRED: |
| 3428 | rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); | 3436 | goto do_state_recovery; |
| 3429 | nfs4_schedule_state_recovery(clp); | ||
| 3430 | if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) | ||
| 3431 | rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); | ||
| 3432 | task->tk_status = 0; | ||
| 3433 | return -EAGAIN; | ||
| 3434 | #if defined(CONFIG_NFS_V4_1) | 3437 | #if defined(CONFIG_NFS_V4_1) |
| 3435 | case -NFS4ERR_BADSESSION: | 3438 | case -NFS4ERR_BADSESSION: |
| 3436 | case -NFS4ERR_BADSLOT: | 3439 | case -NFS4ERR_BADSLOT: |
| @@ -3458,6 +3461,13 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 3458 | } | 3461 | } |
| 3459 | task->tk_status = nfs4_map_errors(task->tk_status); | 3462 | task->tk_status = nfs4_map_errors(task->tk_status); |
| 3460 | return 0; | 3463 | return 0; |
| 3464 | do_state_recovery: | ||
| 3465 | rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); | ||
| 3466 | nfs4_schedule_state_recovery(clp); | ||
| 3467 | if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) | ||
| 3468 | rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); | ||
| 3469 | task->tk_status = 0; | ||
| 3470 | return -EAGAIN; | ||
| 3461 | } | 3471 | } |
| 3462 | 3472 | ||
| 3463 | static int | 3473 | static int |
| @@ -4088,6 +4098,28 @@ static const struct rpc_call_ops nfs4_recover_lock_ops = { | |||
| 4088 | .rpc_release = nfs4_lock_release, | 4098 | .rpc_release = nfs4_lock_release, |
| 4089 | }; | 4099 | }; |
| 4090 | 4100 | ||
| 4101 | static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error) | ||
| 4102 | { | ||
| 4103 | struct nfs_client *clp = server->nfs_client; | ||
| 4104 | struct nfs4_state *state = lsp->ls_state; | ||
| 4105 | |||
| 4106 | switch (error) { | ||
| 4107 | case -NFS4ERR_ADMIN_REVOKED: | ||
| 4108 | case -NFS4ERR_BAD_STATEID: | ||
| 4109 | case -NFS4ERR_EXPIRED: | ||
| 4110 | if (new_lock_owner != 0 || | ||
| 4111 | (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) | ||
| 4112 | nfs4_state_mark_reclaim_nograce(clp, state); | ||
| 4113 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; | ||
| 4114 | break; | ||
| 4115 | case -NFS4ERR_STALE_STATEID: | ||
| 4116 | if (new_lock_owner != 0 || | ||
| 4117 | (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) | ||
| 4118 | nfs4_state_mark_reclaim_reboot(clp, state); | ||
| 4119 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; | ||
| 4120 | }; | ||
| 4121 | } | ||
| 4122 | |||
| 4091 | static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type) | 4123 | static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type) |
| 4092 | { | 4124 | { |
| 4093 | struct nfs4_lockdata *data; | 4125 | struct nfs4_lockdata *data; |
| @@ -4126,6 +4158,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f | |||
| 4126 | ret = nfs4_wait_for_completion_rpc_task(task); | 4158 | ret = nfs4_wait_for_completion_rpc_task(task); |
| 4127 | if (ret == 0) { | 4159 | if (ret == 0) { |
| 4128 | ret = data->rpc_status; | 4160 | ret = data->rpc_status; |
| 4161 | if (ret) | ||
| 4162 | nfs4_handle_setlk_error(data->server, data->lsp, | ||
| 4163 | data->arg.new_lock_owner, ret); | ||
| 4129 | } else | 4164 | } else |
| 4130 | data->cancelled = 1; | 4165 | data->cancelled = 1; |
| 4131 | rpc_put_task(task); | 4166 | rpc_put_task(task); |
| @@ -4181,8 +4216,11 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock | |||
| 4181 | { | 4216 | { |
| 4182 | struct nfs_inode *nfsi = NFS_I(state->inode); | 4217 | struct nfs_inode *nfsi = NFS_I(state->inode); |
| 4183 | unsigned char fl_flags = request->fl_flags; | 4218 | unsigned char fl_flags = request->fl_flags; |
| 4184 | int status; | 4219 | int status = -ENOLCK; |
| 4185 | 4220 | ||
| 4221 | if ((fl_flags & FL_POSIX) && | ||
| 4222 | !test_bit(NFS_STATE_POSIX_LOCKS, &state->flags)) | ||
| 4223 | goto out; | ||
| 4186 | /* Is this a delegated open? */ | 4224 | /* Is this a delegated open? */ |
| 4187 | status = nfs4_set_lock_state(state, request); | 4225 | status = nfs4_set_lock_state(state, request); |
| 4188 | if (status != 0) | 4226 | if (status != 0) |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 6d263ed79e92..c1e2733f4fa4 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -901,7 +901,7 @@ void nfs4_schedule_state_recovery(struct nfs_client *clp) | |||
| 901 | nfs4_schedule_state_manager(clp); | 901 | nfs4_schedule_state_manager(clp); |
| 902 | } | 902 | } |
| 903 | 903 | ||
| 904 | static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state) | 904 | int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state) |
| 905 | { | 905 | { |
| 906 | 906 | ||
| 907 | set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags); | 907 | set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags); |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index e437fd6a819f..5cd5184b56db 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -4631,7 +4631,7 @@ static int decode_sequence(struct xdr_stream *xdr, | |||
| 4631 | * If the server returns different values for sessionID, slotID or | 4631 | * If the server returns different values for sessionID, slotID or |
| 4632 | * sequence number, the server is looney tunes. | 4632 | * sequence number, the server is looney tunes. |
| 4633 | */ | 4633 | */ |
| 4634 | status = -ESERVERFAULT; | 4634 | status = -EREMOTEIO; |
| 4635 | 4635 | ||
| 4636 | if (memcmp(id.data, res->sr_session->sess_id.data, | 4636 | if (memcmp(id.data, res->sr_session->sess_id.data, |
| 4637 | NFS4_MAX_SESSIONID_LEN)) { | 4637 | NFS4_MAX_SESSIONID_LEN)) { |
| @@ -5774,7 +5774,7 @@ static struct { | |||
| 5774 | { NFS4ERR_BAD_COOKIE, -EBADCOOKIE }, | 5774 | { NFS4ERR_BAD_COOKIE, -EBADCOOKIE }, |
| 5775 | { NFS4ERR_NOTSUPP, -ENOTSUPP }, | 5775 | { NFS4ERR_NOTSUPP, -ENOTSUPP }, |
| 5776 | { NFS4ERR_TOOSMALL, -ETOOSMALL }, | 5776 | { NFS4ERR_TOOSMALL, -ETOOSMALL }, |
| 5777 | { NFS4ERR_SERVERFAULT, -ESERVERFAULT }, | 5777 | { NFS4ERR_SERVERFAULT, -EREMOTEIO }, |
| 5778 | { NFS4ERR_BADTYPE, -EBADTYPE }, | 5778 | { NFS4ERR_BADTYPE, -EBADTYPE }, |
| 5779 | { NFS4ERR_LOCKED, -EAGAIN }, | 5779 | { NFS4ERR_LOCKED, -EAGAIN }, |
| 5780 | { NFS4ERR_SYMLINK, -ELOOP }, | 5780 | { NFS4ERR_SYMLINK, -ELOOP }, |
| @@ -5801,7 +5801,7 @@ nfs4_stat_to_errno(int stat) | |||
| 5801 | } | 5801 | } |
| 5802 | if (stat <= 10000 || stat > 10100) { | 5802 | if (stat <= 10000 || stat > 10100) { |
| 5803 | /* The server is looney tunes. */ | 5803 | /* The server is looney tunes. */ |
| 5804 | return -ESERVERFAULT; | 5804 | return -EREMOTEIO; |
| 5805 | } | 5805 | } |
| 5806 | /* If we cannot translate the error, the recovery routines should | 5806 | /* If we cannot translate the error, the recovery routines should |
| 5807 | * handle it. | 5807 | * handle it. |
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index e2975939126a..a12c45b65dd4 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c | |||
| @@ -176,6 +176,12 @@ void nfs_release_request(struct nfs_page *req) | |||
| 176 | kref_put(&req->wb_kref, nfs_free_request); | 176 | kref_put(&req->wb_kref, nfs_free_request); |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | static int nfs_wait_bit_uninterruptible(void *word) | ||
| 180 | { | ||
| 181 | io_schedule(); | ||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | |||
| 179 | /** | 185 | /** |
| 180 | * nfs_wait_on_request - Wait for a request to complete. | 186 | * nfs_wait_on_request - Wait for a request to complete. |
| 181 | * @req: request to wait upon. | 187 | * @req: request to wait upon. |
| @@ -186,14 +192,9 @@ void nfs_release_request(struct nfs_page *req) | |||
| 186 | int | 192 | int |
| 187 | nfs_wait_on_request(struct nfs_page *req) | 193 | nfs_wait_on_request(struct nfs_page *req) |
| 188 | { | 194 | { |
| 189 | int ret = 0; | 195 | return wait_on_bit(&req->wb_flags, PG_BUSY, |
| 190 | 196 | nfs_wait_bit_uninterruptible, | |
| 191 | if (!test_bit(PG_BUSY, &req->wb_flags)) | 197 | TASK_UNINTERRUPTIBLE); |
| 192 | goto out; | ||
| 193 | ret = out_of_line_wait_on_bit(&req->wb_flags, PG_BUSY, | ||
| 194 | nfs_wait_bit_killable, TASK_KILLABLE); | ||
| 195 | out: | ||
| 196 | return ret; | ||
| 197 | } | 198 | } |
| 198 | 199 | ||
| 199 | /** | 200 | /** |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index ce907efc5508..f1afee4eea77 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -243,6 +243,7 @@ static int nfs_show_stats(struct seq_file *, struct vfsmount *); | |||
| 243 | static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *); | 243 | static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *); |
| 244 | static int nfs_xdev_get_sb(struct file_system_type *fs_type, | 244 | static int nfs_xdev_get_sb(struct file_system_type *fs_type, |
| 245 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); | 245 | int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); |
| 246 | static void nfs_put_super(struct super_block *); | ||
| 246 | static void nfs_kill_super(struct super_block *); | 247 | static void nfs_kill_super(struct super_block *); |
| 247 | static int nfs_remount(struct super_block *sb, int *flags, char *raw_data); | 248 | static int nfs_remount(struct super_block *sb, int *flags, char *raw_data); |
| 248 | 249 | ||
| @@ -266,6 +267,7 @@ static const struct super_operations nfs_sops = { | |||
| 266 | .alloc_inode = nfs_alloc_inode, | 267 | .alloc_inode = nfs_alloc_inode, |
| 267 | .destroy_inode = nfs_destroy_inode, | 268 | .destroy_inode = nfs_destroy_inode, |
| 268 | .write_inode = nfs_write_inode, | 269 | .write_inode = nfs_write_inode, |
| 270 | .put_super = nfs_put_super, | ||
| 269 | .statfs = nfs_statfs, | 271 | .statfs = nfs_statfs, |
| 270 | .clear_inode = nfs_clear_inode, | 272 | .clear_inode = nfs_clear_inode, |
| 271 | .umount_begin = nfs_umount_begin, | 273 | .umount_begin = nfs_umount_begin, |
| @@ -335,6 +337,7 @@ static const struct super_operations nfs4_sops = { | |||
| 335 | .alloc_inode = nfs_alloc_inode, | 337 | .alloc_inode = nfs_alloc_inode, |
| 336 | .destroy_inode = nfs_destroy_inode, | 338 | .destroy_inode = nfs_destroy_inode, |
| 337 | .write_inode = nfs_write_inode, | 339 | .write_inode = nfs_write_inode, |
| 340 | .put_super = nfs_put_super, | ||
| 338 | .statfs = nfs_statfs, | 341 | .statfs = nfs_statfs, |
| 339 | .clear_inode = nfs4_clear_inode, | 342 | .clear_inode = nfs4_clear_inode, |
| 340 | .umount_begin = nfs_umount_begin, | 343 | .umount_begin = nfs_umount_begin, |
| @@ -2258,6 +2261,17 @@ error_splat_super: | |||
| 2258 | } | 2261 | } |
| 2259 | 2262 | ||
| 2260 | /* | 2263 | /* |
| 2264 | * Ensure that we unregister the bdi before kill_anon_super | ||
| 2265 | * releases the device name | ||
| 2266 | */ | ||
| 2267 | static void nfs_put_super(struct super_block *s) | ||
| 2268 | { | ||
| 2269 | struct nfs_server *server = NFS_SB(s); | ||
| 2270 | |||
| 2271 | bdi_unregister(&server->backing_dev_info); | ||
| 2272 | } | ||
| 2273 | |||
| 2274 | /* | ||
| 2261 | * Destroy an NFS2/3 superblock | 2275 | * Destroy an NFS2/3 superblock |
| 2262 | */ | 2276 | */ |
| 2263 | static void nfs_kill_super(struct super_block *s) | 2277 | static void nfs_kill_super(struct super_block *s) |
| @@ -2265,7 +2279,6 @@ static void nfs_kill_super(struct super_block *s) | |||
| 2265 | struct nfs_server *server = NFS_SB(s); | 2279 | struct nfs_server *server = NFS_SB(s); |
| 2266 | 2280 | ||
| 2267 | kill_anon_super(s); | 2281 | kill_anon_super(s); |
| 2268 | bdi_unregister(&server->backing_dev_info); | ||
| 2269 | nfs_fscache_release_super_cookie(s); | 2282 | nfs_fscache_release_super_cookie(s); |
| 2270 | nfs_free_server(server); | 2283 | nfs_free_server(server); |
| 2271 | } | 2284 | } |
diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c index 70e1fbbaaeab..ad4d2e787b20 100644 --- a/fs/nfs/sysctl.c +++ b/fs/nfs/sysctl.c | |||
| @@ -15,8 +15,10 @@ | |||
| 15 | 15 | ||
| 16 | #include "callback.h" | 16 | #include "callback.h" |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_NFS_V4 | ||
| 18 | static const int nfs_set_port_min = 0; | 19 | static const int nfs_set_port_min = 0; |
| 19 | static const int nfs_set_port_max = 65535; | 20 | static const int nfs_set_port_max = 65535; |
| 21 | #endif | ||
| 20 | static struct ctl_table_header *nfs_callback_sysctl_table; | 22 | static struct ctl_table_header *nfs_callback_sysctl_table; |
| 21 | 23 | ||
| 22 | static ctl_table nfs_cb_sysctls[] = { | 24 | static ctl_table nfs_cb_sysctls[] = { |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index d171696017f4..d63d964a0392 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -1233,7 +1233,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data) | |||
| 1233 | 1233 | ||
| 1234 | 1234 | ||
| 1235 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | 1235 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
| 1236 | void nfs_commitdata_release(void *data) | 1236 | static void nfs_commitdata_release(void *data) |
| 1237 | { | 1237 | { |
| 1238 | struct nfs_write_data *wdata = data; | 1238 | struct nfs_write_data *wdata = data; |
| 1239 | 1239 | ||
| @@ -1541,6 +1541,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page) | |||
| 1541 | break; | 1541 | break; |
| 1542 | } | 1542 | } |
| 1543 | ret = nfs_wait_on_request(req); | 1543 | ret = nfs_wait_on_request(req); |
| 1544 | nfs_release_request(req); | ||
| 1544 | if (ret < 0) | 1545 | if (ret < 0) |
| 1545 | goto out; | 1546 | goto out; |
| 1546 | } | 1547 | } |
| @@ -1597,8 +1598,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage, | |||
| 1597 | struct nfs_page *req; | 1598 | struct nfs_page *req; |
| 1598 | int ret; | 1599 | int ret; |
| 1599 | 1600 | ||
| 1600 | if (PageFsCache(page)) | 1601 | nfs_fscache_release_page(page, GFP_KERNEL); |
| 1601 | nfs_fscache_release_page(page, GFP_KERNEL); | ||
| 1602 | 1602 | ||
| 1603 | req = nfs_find_and_lock_request(page); | 1603 | req = nfs_find_and_lock_request(page); |
| 1604 | ret = PTR_ERR(req); | 1604 | ret = PTR_ERR(req); |
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index c487810a2366..a0c4016413f1 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c | |||
| @@ -1316,19 +1316,11 @@ rqst_exp_parent(struct svc_rqst *rqstp, struct path *path) | |||
| 1316 | 1316 | ||
| 1317 | static struct svc_export *find_fsidzero_export(struct svc_rqst *rqstp) | 1317 | static struct svc_export *find_fsidzero_export(struct svc_rqst *rqstp) |
| 1318 | { | 1318 | { |
| 1319 | struct svc_export *exp; | ||
| 1320 | u32 fsidv[2]; | 1319 | u32 fsidv[2]; |
| 1321 | 1320 | ||
| 1322 | mk_fsid(FSID_NUM, fsidv, 0, 0, 0, NULL); | 1321 | mk_fsid(FSID_NUM, fsidv, 0, 0, 0, NULL); |
| 1323 | 1322 | ||
| 1324 | exp = rqst_exp_find(rqstp, FSID_NUM, fsidv); | 1323 | return rqst_exp_find(rqstp, FSID_NUM, fsidv); |
| 1325 | /* | ||
| 1326 | * We shouldn't have accepting an nfsv4 request at all if we | ||
| 1327 | * don't have a pseudoexport!: | ||
| 1328 | */ | ||
| 1329 | if (IS_ERR(exp) && PTR_ERR(exp) == -ENOENT) | ||
| 1330 | exp = ERR_PTR(-ESERVERFAULT); | ||
| 1331 | return exp; | ||
| 1332 | } | 1324 | } |
| 1333 | 1325 | ||
| 1334 | /* | 1326 | /* |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index c194793b642b..97d79eff6b7f 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
| @@ -752,6 +752,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
| 752 | flags, current_cred()); | 752 | flags, current_cred()); |
| 753 | if (IS_ERR(*filp)) | 753 | if (IS_ERR(*filp)) |
| 754 | host_err = PTR_ERR(*filp); | 754 | host_err = PTR_ERR(*filp); |
| 755 | host_err = ima_file_check(*filp, access); | ||
| 755 | out_nfserr: | 756 | out_nfserr: |
| 756 | err = nfserrno(host_err); | 757 | err = nfserrno(host_err); |
| 757 | out: | 758 | out: |
| @@ -2127,7 +2128,6 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp, | |||
| 2127 | */ | 2128 | */ |
| 2128 | path.mnt = exp->ex_path.mnt; | 2129 | path.mnt = exp->ex_path.mnt; |
| 2129 | path.dentry = dentry; | 2130 | path.dentry = dentry; |
| 2130 | err = ima_path_check(&path, acc & (MAY_READ | MAY_WRITE | MAY_EXEC)); | ||
| 2131 | nfsd_out: | 2131 | nfsd_out: |
| 2132 | return err? nfserrno(err) : 0; | 2132 | return err? nfserrno(err) : 0; |
| 2133 | } | 2133 | } |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 17584c524486..105b508b47a8 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
| @@ -2829,7 +2829,7 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
| 2829 | || sci->sc_seq_request != sci->sc_seq_done); | 2829 | || sci->sc_seq_request != sci->sc_seq_done); |
| 2830 | spin_unlock(&sci->sc_state_lock); | 2830 | spin_unlock(&sci->sc_state_lock); |
| 2831 | 2831 | ||
| 2832 | if (flag || nilfs_segctor_confirm(sci)) | 2832 | if (flag || !nilfs_segctor_confirm(sci)) |
| 2833 | nilfs_segctor_write_out(sci); | 2833 | nilfs_segctor_write_out(sci); |
| 2834 | 2834 | ||
| 2835 | WARN_ON(!list_empty(&sci->sc_copied_buffers)); | 2835 | WARN_ON(!list_empty(&sci->sc_copied_buffers)); |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 3dae4a13f6e4..7e9df11260f4 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -599,7 +599,7 @@ bail: | |||
| 599 | return ret; | 599 | return ret; |
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | /* | 602 | /* |
| 603 | * ocfs2_dio_end_io is called by the dio core when a dio is finished. We're | 603 | * ocfs2_dio_end_io is called by the dio core when a dio is finished. We're |
| 604 | * particularly interested in the aio/dio case. Like the core uses | 604 | * particularly interested in the aio/dio case. Like the core uses |
| 605 | * i_alloc_sem, we use the rw_lock DLM lock to protect io on one node from | 605 | * i_alloc_sem, we use the rw_lock DLM lock to protect io on one node from |
| @@ -670,7 +670,7 @@ static ssize_t ocfs2_direct_IO(int rw, | |||
| 670 | 670 | ||
| 671 | ret = blockdev_direct_IO_no_locking(rw, iocb, inode, | 671 | ret = blockdev_direct_IO_no_locking(rw, iocb, inode, |
| 672 | inode->i_sb->s_bdev, iov, offset, | 672 | inode->i_sb->s_bdev, iov, offset, |
| 673 | nr_segs, | 673 | nr_segs, |
| 674 | ocfs2_direct_IO_get_blocks, | 674 | ocfs2_direct_IO_get_blocks, |
| 675 | ocfs2_dio_end_io); | 675 | ocfs2_dio_end_io); |
| 676 | 676 | ||
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index d43d34a1dd31..21c808f752d8 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c | |||
| @@ -368,7 +368,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, | |||
| 368 | } | 368 | } |
| 369 | ocfs2_metadata_cache_io_unlock(ci); | 369 | ocfs2_metadata_cache_io_unlock(ci); |
| 370 | 370 | ||
| 371 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", | 371 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", |
| 372 | (unsigned long long)block, nr, | 372 | (unsigned long long)block, nr, |
| 373 | ((flags & OCFS2_BH_IGNORE_CACHE) || ignore_cache) ? "no" : "yes", | 373 | ((flags & OCFS2_BH_IGNORE_CACHE) || ignore_cache) ? "no" : "yes", |
| 374 | flags); | 374 | flags); |
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index eda5b8bcddd5..5c9890006708 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
| @@ -78,7 +78,7 @@ static struct o2hb_callback *hbcall_from_type(enum o2hb_callback_type type); | |||
| 78 | 78 | ||
| 79 | unsigned int o2hb_dead_threshold = O2HB_DEFAULT_DEAD_THRESHOLD; | 79 | unsigned int o2hb_dead_threshold = O2HB_DEFAULT_DEAD_THRESHOLD; |
| 80 | 80 | ||
| 81 | /* Only sets a new threshold if there are no active regions. | 81 | /* Only sets a new threshold if there are no active regions. |
| 82 | * | 82 | * |
| 83 | * No locking or otherwise interesting code is required for reading | 83 | * No locking or otherwise interesting code is required for reading |
| 84 | * o2hb_dead_threshold as it can't change once regions are active and | 84 | * o2hb_dead_threshold as it can't change once regions are active and |
| @@ -170,7 +170,7 @@ static void o2hb_write_timeout(struct work_struct *work) | |||
| 170 | 170 | ||
| 171 | mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u " | 171 | mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u " |
| 172 | "milliseconds\n", reg->hr_dev_name, | 172 | "milliseconds\n", reg->hr_dev_name, |
| 173 | jiffies_to_msecs(jiffies - reg->hr_last_timeout_start)); | 173 | jiffies_to_msecs(jiffies - reg->hr_last_timeout_start)); |
| 174 | o2quo_disk_timeout(); | 174 | o2quo_disk_timeout(); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| @@ -624,7 +624,7 @@ static int o2hb_check_slot(struct o2hb_region *reg, | |||
| 624 | "seq %llu last %llu changed %u equal %u\n", | 624 | "seq %llu last %llu changed %u equal %u\n", |
| 625 | slot->ds_node_num, (long long)slot->ds_last_generation, | 625 | slot->ds_node_num, (long long)slot->ds_last_generation, |
| 626 | le32_to_cpu(hb_block->hb_cksum), | 626 | le32_to_cpu(hb_block->hb_cksum), |
| 627 | (unsigned long long)le64_to_cpu(hb_block->hb_seq), | 627 | (unsigned long long)le64_to_cpu(hb_block->hb_seq), |
| 628 | (unsigned long long)slot->ds_last_time, slot->ds_changed_samples, | 628 | (unsigned long long)slot->ds_last_time, slot->ds_changed_samples, |
| 629 | slot->ds_equal_samples); | 629 | slot->ds_equal_samples); |
| 630 | 630 | ||
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 334f231a422c..d8d0c65ac03c 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
| @@ -485,7 +485,7 @@ static void o2net_set_nn_state(struct o2net_node *nn, | |||
| 485 | } | 485 | } |
| 486 | 486 | ||
| 487 | if (was_valid && !valid) { | 487 | if (was_valid && !valid) { |
| 488 | printk(KERN_INFO "o2net: no longer connected to " | 488 | printk(KERN_NOTICE "o2net: no longer connected to " |
| 489 | SC_NODEF_FMT "\n", SC_NODEF_ARGS(old_sc)); | 489 | SC_NODEF_FMT "\n", SC_NODEF_ARGS(old_sc)); |
| 490 | o2net_complete_nodes_nsw(nn); | 490 | o2net_complete_nodes_nsw(nn); |
| 491 | } | 491 | } |
| @@ -493,7 +493,7 @@ static void o2net_set_nn_state(struct o2net_node *nn, | |||
| 493 | if (!was_valid && valid) { | 493 | if (!was_valid && valid) { |
| 494 | o2quo_conn_up(o2net_num_from_nn(nn)); | 494 | o2quo_conn_up(o2net_num_from_nn(nn)); |
| 495 | cancel_delayed_work(&nn->nn_connect_expired); | 495 | cancel_delayed_work(&nn->nn_connect_expired); |
| 496 | printk(KERN_INFO "o2net: %s " SC_NODEF_FMT "\n", | 496 | printk(KERN_NOTICE "o2net: %s " SC_NODEF_FMT "\n", |
| 497 | o2nm_this_node() > sc->sc_node->nd_num ? | 497 | o2nm_this_node() > sc->sc_node->nd_num ? |
| 498 | "connected to" : "accepted connection from", | 498 | "connected to" : "accepted connection from", |
| 499 | SC_NODEF_ARGS(sc)); | 499 | SC_NODEF_ARGS(sc)); |
| @@ -930,7 +930,7 @@ static void o2net_sendpage(struct o2net_sock_container *sc, | |||
| 930 | cond_resched(); | 930 | cond_resched(); |
| 931 | continue; | 931 | continue; |
| 932 | } | 932 | } |
| 933 | mlog(ML_ERROR, "sendpage of size %zu to " SC_NODEF_FMT | 933 | mlog(ML_ERROR, "sendpage of size %zu to " SC_NODEF_FMT |
| 934 | " failed with %zd\n", size, SC_NODEF_ARGS(sc), ret); | 934 | " failed with %zd\n", size, SC_NODEF_ARGS(sc), ret); |
| 935 | o2net_ensure_shutdown(nn, sc, 0); | 935 | o2net_ensure_shutdown(nn, sc, 0); |
| 936 | break; | 936 | break; |
| @@ -1476,14 +1476,14 @@ static void o2net_idle_timer(unsigned long data) | |||
| 1476 | 1476 | ||
| 1477 | do_gettimeofday(&now); | 1477 | do_gettimeofday(&now); |
| 1478 | 1478 | ||
| 1479 | printk(KERN_INFO "o2net: connection to " SC_NODEF_FMT " has been idle for %u.%u " | 1479 | printk(KERN_NOTICE "o2net: connection to " SC_NODEF_FMT " has been idle for %u.%u " |
| 1480 | "seconds, shutting it down.\n", SC_NODEF_ARGS(sc), | 1480 | "seconds, shutting it down.\n", SC_NODEF_ARGS(sc), |
| 1481 | o2net_idle_timeout() / 1000, | 1481 | o2net_idle_timeout() / 1000, |
| 1482 | o2net_idle_timeout() % 1000); | 1482 | o2net_idle_timeout() % 1000); |
| 1483 | mlog(ML_NOTICE, "here are some times that might help debug the " | 1483 | mlog(ML_NOTICE, "here are some times that might help debug the " |
| 1484 | "situation: (tmr %ld.%ld now %ld.%ld dr %ld.%ld adv " | 1484 | "situation: (tmr %ld.%ld now %ld.%ld dr %ld.%ld adv " |
| 1485 | "%ld.%ld:%ld.%ld func (%08x:%u) %ld.%ld:%ld.%ld)\n", | 1485 | "%ld.%ld:%ld.%ld func (%08x:%u) %ld.%ld:%ld.%ld)\n", |
| 1486 | sc->sc_tv_timer.tv_sec, (long) sc->sc_tv_timer.tv_usec, | 1486 | sc->sc_tv_timer.tv_sec, (long) sc->sc_tv_timer.tv_usec, |
| 1487 | now.tv_sec, (long) now.tv_usec, | 1487 | now.tv_sec, (long) now.tv_usec, |
| 1488 | sc->sc_tv_data_ready.tv_sec, (long) sc->sc_tv_data_ready.tv_usec, | 1488 | sc->sc_tv_data_ready.tv_sec, (long) sc->sc_tv_data_ready.tv_usec, |
| 1489 | sc->sc_tv_advance_start.tv_sec, | 1489 | sc->sc_tv_advance_start.tv_sec, |
diff --git a/fs/ocfs2/cluster/tcp_internal.h b/fs/ocfs2/cluster/tcp_internal.h index 8d58cfe410b1..96fa7ebc530c 100644 --- a/fs/ocfs2/cluster/tcp_internal.h +++ b/fs/ocfs2/cluster/tcp_internal.h | |||
| @@ -32,10 +32,10 @@ | |||
| 32 | * on their number */ | 32 | * on their number */ |
| 33 | #define O2NET_QUORUM_DELAY_MS ((o2hb_dead_threshold + 2) * O2HB_REGION_TIMEOUT_MS) | 33 | #define O2NET_QUORUM_DELAY_MS ((o2hb_dead_threshold + 2) * O2HB_REGION_TIMEOUT_MS) |
| 34 | 34 | ||
| 35 | /* | 35 | /* |
| 36 | * This version number represents quite a lot, unfortunately. It not | 36 | * This version number represents quite a lot, unfortunately. It not |
| 37 | * only represents the raw network message protocol on the wire but also | 37 | * only represents the raw network message protocol on the wire but also |
| 38 | * locking semantics of the file system using the protocol. It should | 38 | * locking semantics of the file system using the protocol. It should |
| 39 | * be somewhere else, I'm sure, but right now it isn't. | 39 | * be somewhere else, I'm sure, but right now it isn't. |
| 40 | * | 40 | * |
| 41 | * With version 11, we separate out the filesystem locking portion. The | 41 | * With version 11, we separate out the filesystem locking portion. The |
diff --git a/fs/ocfs2/dlm/dlmapi.h b/fs/ocfs2/dlm/dlmapi.h index b5786a787fab..3cfa114aa391 100644 --- a/fs/ocfs2/dlm/dlmapi.h +++ b/fs/ocfs2/dlm/dlmapi.h | |||
| @@ -95,7 +95,7 @@ const char *dlm_errname(enum dlm_status err); | |||
| 95 | mlog(ML_ERROR, "dlm status = %s\n", dlm_errname((st))); \ | 95 | mlog(ML_ERROR, "dlm status = %s\n", dlm_errname((st))); \ |
| 96 | } while (0) | 96 | } while (0) |
| 97 | 97 | ||
| 98 | #define DLM_LKSB_UNUSED1 0x01 | 98 | #define DLM_LKSB_UNUSED1 0x01 |
| 99 | #define DLM_LKSB_PUT_LVB 0x02 | 99 | #define DLM_LKSB_PUT_LVB 0x02 |
| 100 | #define DLM_LKSB_GET_LVB 0x04 | 100 | #define DLM_LKSB_GET_LVB 0x04 |
| 101 | #define DLM_LKSB_UNUSED2 0x08 | 101 | #define DLM_LKSB_UNUSED2 0x08 |
diff --git a/fs/ocfs2/dlm/dlmast.c b/fs/ocfs2/dlm/dlmast.c index 01cf8cc3d286..dccc439fa087 100644 --- a/fs/ocfs2/dlm/dlmast.c +++ b/fs/ocfs2/dlm/dlmast.c | |||
| @@ -123,7 +123,7 @@ static void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) | |||
| 123 | dlm_lock_put(lock); | 123 | dlm_lock_put(lock); |
| 124 | /* free up the reserved bast that we are cancelling. | 124 | /* free up the reserved bast that we are cancelling. |
| 125 | * guaranteed that this will not be the last reserved | 125 | * guaranteed that this will not be the last reserved |
| 126 | * ast because *both* an ast and a bast were reserved | 126 | * ast because *both* an ast and a bast were reserved |
| 127 | * to get to this point. the res->spinlock will not be | 127 | * to get to this point. the res->spinlock will not be |
| 128 | * taken here */ | 128 | * taken here */ |
| 129 | dlm_lockres_release_ast(dlm, res); | 129 | dlm_lockres_release_ast(dlm, res); |
diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c index ca96bce50e18..f283bce776b4 100644 --- a/fs/ocfs2/dlm/dlmconvert.c +++ b/fs/ocfs2/dlm/dlmconvert.c | |||
| @@ -396,7 +396,7 @@ static enum dlm_status dlm_send_remote_convert_request(struct dlm_ctxt *dlm, | |||
| 396 | /* instead of logging the same network error over | 396 | /* instead of logging the same network error over |
| 397 | * and over, sleep here and wait for the heartbeat | 397 | * and over, sleep here and wait for the heartbeat |
| 398 | * to notice the node is dead. times out after 5s. */ | 398 | * to notice the node is dead. times out after 5s. */ |
| 399 | dlm_wait_for_node_death(dlm, res->owner, | 399 | dlm_wait_for_node_death(dlm, res->owner, |
| 400 | DLM_NODE_DEATH_WAIT_MAX); | 400 | DLM_NODE_DEATH_WAIT_MAX); |
| 401 | ret = DLM_RECOVERING; | 401 | ret = DLM_RECOVERING; |
| 402 | mlog(0, "node %u died so returning DLM_RECOVERING " | 402 | mlog(0, "node %u died so returning DLM_RECOVERING " |
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index 42b0bad7a612..0cd24cf54396 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
| @@ -102,7 +102,7 @@ void __dlm_print_one_lock_resource(struct dlm_lock_resource *res) | |||
| 102 | assert_spin_locked(&res->spinlock); | 102 | assert_spin_locked(&res->spinlock); |
| 103 | 103 | ||
| 104 | stringify_lockname(res->lockname.name, res->lockname.len, | 104 | stringify_lockname(res->lockname.name, res->lockname.len, |
| 105 | buf, sizeof(buf) - 1); | 105 | buf, sizeof(buf)); |
| 106 | printk("lockres: %s, owner=%u, state=%u\n", | 106 | printk("lockres: %s, owner=%u, state=%u\n", |
| 107 | buf, res->owner, res->state); | 107 | buf, res->owner, res->state); |
| 108 | printk(" last used: %lu, refcnt: %u, on purge list: %s\n", | 108 | printk(" last used: %lu, refcnt: %u, on purge list: %s\n", |
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 0334000676d3..988c9055fd4e 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
| @@ -816,7 +816,7 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | |||
| 816 | } | 816 | } |
| 817 | 817 | ||
| 818 | /* Once the dlm ctxt is marked as leaving then we don't want | 818 | /* Once the dlm ctxt is marked as leaving then we don't want |
| 819 | * to be put in someone's domain map. | 819 | * to be put in someone's domain map. |
| 820 | * Also, explicitly disallow joining at certain troublesome | 820 | * Also, explicitly disallow joining at certain troublesome |
| 821 | * times (ie. during recovery). */ | 821 | * times (ie. during recovery). */ |
| 822 | if (dlm && dlm->dlm_state != DLM_CTXT_LEAVING) { | 822 | if (dlm && dlm->dlm_state != DLM_CTXT_LEAVING) { |
diff --git a/fs/ocfs2/dlm/dlmlock.c b/fs/ocfs2/dlm/dlmlock.c index 437698e9465f..733337772671 100644 --- a/fs/ocfs2/dlm/dlmlock.c +++ b/fs/ocfs2/dlm/dlmlock.c | |||
| @@ -269,7 +269,7 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm, | |||
| 269 | } | 269 | } |
| 270 | dlm_revert_pending_lock(res, lock); | 270 | dlm_revert_pending_lock(res, lock); |
| 271 | dlm_lock_put(lock); | 271 | dlm_lock_put(lock); |
| 272 | } else if (dlm_is_recovery_lock(res->lockname.name, | 272 | } else if (dlm_is_recovery_lock(res->lockname.name, |
| 273 | res->lockname.len)) { | 273 | res->lockname.len)) { |
| 274 | /* special case for the $RECOVERY lock. | 274 | /* special case for the $RECOVERY lock. |
| 275 | * there will never be an AST delivered to put | 275 | * there will never be an AST delivered to put |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 03ccf9a7b1f4..a659606dcb95 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -366,7 +366,7 @@ void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up) | |||
| 366 | struct dlm_master_list_entry *mle; | 366 | struct dlm_master_list_entry *mle; |
| 367 | 367 | ||
| 368 | assert_spin_locked(&dlm->spinlock); | 368 | assert_spin_locked(&dlm->spinlock); |
| 369 | 369 | ||
| 370 | list_for_each_entry(mle, &dlm->mle_hb_events, hb_events) { | 370 | list_for_each_entry(mle, &dlm->mle_hb_events, hb_events) { |
| 371 | if (node_up) | 371 | if (node_up) |
| 372 | dlm_mle_node_up(dlm, mle, NULL, idx); | 372 | dlm_mle_node_up(dlm, mle, NULL, idx); |
| @@ -833,7 +833,7 @@ lookup: | |||
| 833 | __dlm_insert_mle(dlm, mle); | 833 | __dlm_insert_mle(dlm, mle); |
| 834 | 834 | ||
| 835 | /* still holding the dlm spinlock, check the recovery map | 835 | /* still holding the dlm spinlock, check the recovery map |
| 836 | * to see if there are any nodes that still need to be | 836 | * to see if there are any nodes that still need to be |
| 837 | * considered. these will not appear in the mle nodemap | 837 | * considered. these will not appear in the mle nodemap |
| 838 | * but they might own this lockres. wait on them. */ | 838 | * but they might own this lockres. wait on them. */ |
| 839 | bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); | 839 | bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); |
| @@ -883,7 +883,7 @@ redo_request: | |||
| 883 | msleep(500); | 883 | msleep(500); |
| 884 | } | 884 | } |
| 885 | continue; | 885 | continue; |
| 886 | } | 886 | } |
| 887 | 887 | ||
| 888 | dlm_kick_recovery_thread(dlm); | 888 | dlm_kick_recovery_thread(dlm); |
| 889 | msleep(1000); | 889 | msleep(1000); |
| @@ -939,8 +939,8 @@ wait: | |||
| 939 | res->lockname.name, blocked); | 939 | res->lockname.name, blocked); |
| 940 | if (++tries > 20) { | 940 | if (++tries > 20) { |
| 941 | mlog(ML_ERROR, "%s:%.*s: spinning on " | 941 | mlog(ML_ERROR, "%s:%.*s: spinning on " |
| 942 | "dlm_wait_for_lock_mastery, blocked=%d\n", | 942 | "dlm_wait_for_lock_mastery, blocked=%d\n", |
| 943 | dlm->name, res->lockname.len, | 943 | dlm->name, res->lockname.len, |
| 944 | res->lockname.name, blocked); | 944 | res->lockname.name, blocked); |
| 945 | dlm_print_one_lock_resource(res); | 945 | dlm_print_one_lock_resource(res); |
| 946 | dlm_print_one_mle(mle); | 946 | dlm_print_one_mle(mle); |
| @@ -1029,7 +1029,7 @@ recheck: | |||
| 1029 | ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); | 1029 | ret = dlm_restart_lock_mastery(dlm, res, mle, *blocked); |
| 1030 | b = (mle->type == DLM_MLE_BLOCK); | 1030 | b = (mle->type == DLM_MLE_BLOCK); |
| 1031 | if ((*blocked && !b) || (!*blocked && b)) { | 1031 | if ((*blocked && !b) || (!*blocked && b)) { |
| 1032 | mlog(0, "%s:%.*s: status change: old=%d new=%d\n", | 1032 | mlog(0, "%s:%.*s: status change: old=%d new=%d\n", |
| 1033 | dlm->name, res->lockname.len, res->lockname.name, | 1033 | dlm->name, res->lockname.len, res->lockname.name, |
| 1034 | *blocked, b); | 1034 | *blocked, b); |
| 1035 | *blocked = b; | 1035 | *blocked = b; |
| @@ -1602,7 +1602,7 @@ send_response: | |||
| 1602 | } | 1602 | } |
| 1603 | mlog(0, "%u is the owner of %.*s, cleaning everyone else\n", | 1603 | mlog(0, "%u is the owner of %.*s, cleaning everyone else\n", |
| 1604 | dlm->node_num, res->lockname.len, res->lockname.name); | 1604 | dlm->node_num, res->lockname.len, res->lockname.name); |
| 1605 | ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, | 1605 | ret = dlm_dispatch_assert_master(dlm, res, 0, request->node_idx, |
| 1606 | DLM_ASSERT_MASTER_MLE_CLEANUP); | 1606 | DLM_ASSERT_MASTER_MLE_CLEANUP); |
| 1607 | if (ret < 0) { | 1607 | if (ret < 0) { |
| 1608 | mlog(ML_ERROR, "failed to dispatch assert master work\n"); | 1608 | mlog(ML_ERROR, "failed to dispatch assert master work\n"); |
| @@ -1701,7 +1701,7 @@ again: | |||
| 1701 | 1701 | ||
| 1702 | if (r & DLM_ASSERT_RESPONSE_REASSERT) { | 1702 | if (r & DLM_ASSERT_RESPONSE_REASSERT) { |
| 1703 | mlog(0, "%.*s: node %u create mles on other " | 1703 | mlog(0, "%.*s: node %u create mles on other " |
| 1704 | "nodes and requests a re-assert\n", | 1704 | "nodes and requests a re-assert\n", |
| 1705 | namelen, lockname, to); | 1705 | namelen, lockname, to); |
| 1706 | reassert = 1; | 1706 | reassert = 1; |
| 1707 | } | 1707 | } |
| @@ -1812,7 +1812,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data, | |||
| 1812 | spin_unlock(&dlm->master_lock); | 1812 | spin_unlock(&dlm->master_lock); |
| 1813 | spin_unlock(&dlm->spinlock); | 1813 | spin_unlock(&dlm->spinlock); |
| 1814 | goto done; | 1814 | goto done; |
| 1815 | } | 1815 | } |
| 1816 | } | 1816 | } |
| 1817 | } | 1817 | } |
| 1818 | spin_unlock(&dlm->master_lock); | 1818 | spin_unlock(&dlm->master_lock); |
| @@ -1883,7 +1883,7 @@ ok: | |||
| 1883 | int extra_ref = 0; | 1883 | int extra_ref = 0; |
| 1884 | int nn = -1; | 1884 | int nn = -1; |
| 1885 | int rr, err = 0; | 1885 | int rr, err = 0; |
| 1886 | 1886 | ||
| 1887 | spin_lock(&mle->spinlock); | 1887 | spin_lock(&mle->spinlock); |
| 1888 | if (mle->type == DLM_MLE_BLOCK || mle->type == DLM_MLE_MIGRATION) | 1888 | if (mle->type == DLM_MLE_BLOCK || mle->type == DLM_MLE_MIGRATION) |
| 1889 | extra_ref = 1; | 1889 | extra_ref = 1; |
| @@ -1891,7 +1891,7 @@ ok: | |||
| 1891 | /* MASTER mle: if any bits set in the response map | 1891 | /* MASTER mle: if any bits set in the response map |
| 1892 | * then the calling node needs to re-assert to clear | 1892 | * then the calling node needs to re-assert to clear |
| 1893 | * up nodes that this node contacted */ | 1893 | * up nodes that this node contacted */ |
| 1894 | while ((nn = find_next_bit (mle->response_map, O2NM_MAX_NODES, | 1894 | while ((nn = find_next_bit (mle->response_map, O2NM_MAX_NODES, |
| 1895 | nn+1)) < O2NM_MAX_NODES) { | 1895 | nn+1)) < O2NM_MAX_NODES) { |
| 1896 | if (nn != dlm->node_num && nn != assert->node_idx) | 1896 | if (nn != dlm->node_num && nn != assert->node_idx) |
| 1897 | master_request = 1; | 1897 | master_request = 1; |
| @@ -2002,7 +2002,7 @@ kill: | |||
| 2002 | __dlm_print_one_lock_resource(res); | 2002 | __dlm_print_one_lock_resource(res); |
| 2003 | spin_unlock(&res->spinlock); | 2003 | spin_unlock(&res->spinlock); |
| 2004 | spin_unlock(&dlm->spinlock); | 2004 | spin_unlock(&dlm->spinlock); |
| 2005 | *ret_data = (void *)res; | 2005 | *ret_data = (void *)res; |
| 2006 | dlm_put(dlm); | 2006 | dlm_put(dlm); |
| 2007 | return -EINVAL; | 2007 | return -EINVAL; |
| 2008 | } | 2008 | } |
| @@ -2040,10 +2040,10 @@ int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, | |||
| 2040 | item->u.am.request_from = request_from; | 2040 | item->u.am.request_from = request_from; |
| 2041 | item->u.am.flags = flags; | 2041 | item->u.am.flags = flags; |
| 2042 | 2042 | ||
| 2043 | if (ignore_higher) | 2043 | if (ignore_higher) |
| 2044 | mlog(0, "IGNORE HIGHER: %.*s\n", res->lockname.len, | 2044 | mlog(0, "IGNORE HIGHER: %.*s\n", res->lockname.len, |
| 2045 | res->lockname.name); | 2045 | res->lockname.name); |
| 2046 | 2046 | ||
| 2047 | spin_lock(&dlm->work_lock); | 2047 | spin_lock(&dlm->work_lock); |
| 2048 | list_add_tail(&item->list, &dlm->work_list); | 2048 | list_add_tail(&item->list, &dlm->work_list); |
| 2049 | spin_unlock(&dlm->work_lock); | 2049 | spin_unlock(&dlm->work_lock); |
| @@ -2133,7 +2133,7 @@ put: | |||
| 2133 | * think that $RECOVERY is currently mastered by a dead node. If so, | 2133 | * think that $RECOVERY is currently mastered by a dead node. If so, |
| 2134 | * we wait a short time to allow that node to get notified by its own | 2134 | * we wait a short time to allow that node to get notified by its own |
| 2135 | * heartbeat stack, then check again. All $RECOVERY lock resources | 2135 | * heartbeat stack, then check again. All $RECOVERY lock resources |
| 2136 | * mastered by dead nodes are purged when the hearbeat callback is | 2136 | * mastered by dead nodes are purged when the hearbeat callback is |
| 2137 | * fired, so we can know for sure that it is safe to continue once | 2137 | * fired, so we can know for sure that it is safe to continue once |
| 2138 | * the node returns a live node or no node. */ | 2138 | * the node returns a live node or no node. */ |
| 2139 | static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, | 2139 | static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, |
| @@ -2174,7 +2174,7 @@ static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, | |||
| 2174 | ret = -EAGAIN; | 2174 | ret = -EAGAIN; |
| 2175 | } | 2175 | } |
| 2176 | spin_unlock(&dlm->spinlock); | 2176 | spin_unlock(&dlm->spinlock); |
| 2177 | mlog(0, "%s: reco lock master is %u\n", dlm->name, | 2177 | mlog(0, "%s: reco lock master is %u\n", dlm->name, |
| 2178 | master); | 2178 | master); |
| 2179 | break; | 2179 | break; |
| 2180 | } | 2180 | } |
| @@ -2602,7 +2602,7 @@ fail: | |||
| 2602 | 2602 | ||
| 2603 | mlog(0, "%s:%.*s: timed out during migration\n", | 2603 | mlog(0, "%s:%.*s: timed out during migration\n", |
| 2604 | dlm->name, res->lockname.len, res->lockname.name); | 2604 | dlm->name, res->lockname.len, res->lockname.name); |
| 2605 | /* avoid hang during shutdown when migrating lockres | 2605 | /* avoid hang during shutdown when migrating lockres |
| 2606 | * to a node which also goes down */ | 2606 | * to a node which also goes down */ |
| 2607 | if (dlm_is_node_dead(dlm, target)) { | 2607 | if (dlm_is_node_dead(dlm, target)) { |
| 2608 | mlog(0, "%s:%.*s: expected migration " | 2608 | mlog(0, "%s:%.*s: expected migration " |
| @@ -2738,7 +2738,7 @@ static int dlm_migration_can_proceed(struct dlm_ctxt *dlm, | |||
| 2738 | can_proceed = !!(res->state & DLM_LOCK_RES_MIGRATING); | 2738 | can_proceed = !!(res->state & DLM_LOCK_RES_MIGRATING); |
| 2739 | spin_unlock(&res->spinlock); | 2739 | spin_unlock(&res->spinlock); |
| 2740 | 2740 | ||
| 2741 | /* target has died, so make the caller break out of the | 2741 | /* target has died, so make the caller break out of the |
| 2742 | * wait_event, but caller must recheck the domain_map */ | 2742 | * wait_event, but caller must recheck the domain_map */ |
| 2743 | spin_lock(&dlm->spinlock); | 2743 | spin_lock(&dlm->spinlock); |
| 2744 | if (!test_bit(mig_target, dlm->domain_map)) | 2744 | if (!test_bit(mig_target, dlm->domain_map)) |
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index 2f9e4e19a4f2..344bcf90cbf4 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
| @@ -1050,7 +1050,7 @@ static void dlm_move_reco_locks_to_list(struct dlm_ctxt *dlm, | |||
| 1050 | if (lock->ml.node == dead_node) { | 1050 | if (lock->ml.node == dead_node) { |
| 1051 | mlog(0, "AHA! there was " | 1051 | mlog(0, "AHA! there was " |
| 1052 | "a $RECOVERY lock for dead " | 1052 | "a $RECOVERY lock for dead " |
| 1053 | "node %u (%s)!\n", | 1053 | "node %u (%s)!\n", |
| 1054 | dead_node, dlm->name); | 1054 | dead_node, dlm->name); |
| 1055 | list_del_init(&lock->list); | 1055 | list_del_init(&lock->list); |
| 1056 | dlm_lock_put(lock); | 1056 | dlm_lock_put(lock); |
| @@ -1164,6 +1164,39 @@ static void dlm_init_migratable_lockres(struct dlm_migratable_lockres *mres, | |||
| 1164 | mres->master = master; | 1164 | mres->master = master; |
| 1165 | } | 1165 | } |
| 1166 | 1166 | ||
| 1167 | static void dlm_prepare_lvb_for_migration(struct dlm_lock *lock, | ||
| 1168 | struct dlm_migratable_lockres *mres, | ||
| 1169 | int queue) | ||
| 1170 | { | ||
| 1171 | if (!lock->lksb) | ||
| 1172 | return; | ||
| 1173 | |||
| 1174 | /* Ignore lvb in all locks in the blocked list */ | ||
| 1175 | if (queue == DLM_BLOCKED_LIST) | ||
| 1176 | return; | ||
| 1177 | |||
| 1178 | /* Only consider lvbs in locks with granted EX or PR lock levels */ | ||
| 1179 | if (lock->ml.type != LKM_EXMODE && lock->ml.type != LKM_PRMODE) | ||
| 1180 | return; | ||
| 1181 | |||
| 1182 | if (dlm_lvb_is_empty(mres->lvb)) { | ||
| 1183 | memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN); | ||
| 1184 | return; | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | /* Ensure the lvb copied for migration matches in other valid locks */ | ||
| 1188 | if (!memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN)) | ||
| 1189 | return; | ||
| 1190 | |||
| 1191 | mlog(ML_ERROR, "Mismatched lvb in lock cookie=%u:%llu, name=%.*s, " | ||
| 1192 | "node=%u\n", | ||
| 1193 | dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), | ||
| 1194 | dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)), | ||
| 1195 | lock->lockres->lockname.len, lock->lockres->lockname.name, | ||
| 1196 | lock->ml.node); | ||
| 1197 | dlm_print_one_lock_resource(lock->lockres); | ||
| 1198 | BUG(); | ||
| 1199 | } | ||
| 1167 | 1200 | ||
| 1168 | /* returns 1 if this lock fills the network structure, | 1201 | /* returns 1 if this lock fills the network structure, |
| 1169 | * 0 otherwise */ | 1202 | * 0 otherwise */ |
| @@ -1181,20 +1214,7 @@ static int dlm_add_lock_to_array(struct dlm_lock *lock, | |||
| 1181 | ml->list = queue; | 1214 | ml->list = queue; |
| 1182 | if (lock->lksb) { | 1215 | if (lock->lksb) { |
| 1183 | ml->flags = lock->lksb->flags; | 1216 | ml->flags = lock->lksb->flags; |
| 1184 | /* send our current lvb */ | 1217 | dlm_prepare_lvb_for_migration(lock, mres, queue); |
| 1185 | if (ml->type == LKM_EXMODE || | ||
| 1186 | ml->type == LKM_PRMODE) { | ||
| 1187 | /* if it is already set, this had better be a PR | ||
| 1188 | * and it has to match */ | ||
| 1189 | if (!dlm_lvb_is_empty(mres->lvb) && | ||
| 1190 | (ml->type == LKM_EXMODE || | ||
| 1191 | memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { | ||
| 1192 | mlog(ML_ERROR, "mismatched lvbs!\n"); | ||
| 1193 | dlm_print_one_lock_resource(lock->lockres); | ||
| 1194 | BUG(); | ||
| 1195 | } | ||
| 1196 | memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN); | ||
| 1197 | } | ||
| 1198 | } | 1218 | } |
| 1199 | ml->node = lock->ml.node; | 1219 | ml->node = lock->ml.node; |
| 1200 | mres->num_locks++; | 1220 | mres->num_locks++; |
| @@ -1730,6 +1750,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, | |||
| 1730 | struct dlm_lock *lock = NULL; | 1750 | struct dlm_lock *lock = NULL; |
| 1731 | u8 from = O2NM_MAX_NODES; | 1751 | u8 from = O2NM_MAX_NODES; |
| 1732 | unsigned int added = 0; | 1752 | unsigned int added = 0; |
| 1753 | __be64 c; | ||
| 1733 | 1754 | ||
| 1734 | mlog(0, "running %d locks for this lockres\n", mres->num_locks); | 1755 | mlog(0, "running %d locks for this lockres\n", mres->num_locks); |
| 1735 | for (i=0; i<mres->num_locks; i++) { | 1756 | for (i=0; i<mres->num_locks; i++) { |
| @@ -1777,19 +1798,48 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, | |||
| 1777 | /* lock is always created locally first, and | 1798 | /* lock is always created locally first, and |
| 1778 | * destroyed locally last. it must be on the list */ | 1799 | * destroyed locally last. it must be on the list */ |
| 1779 | if (!lock) { | 1800 | if (!lock) { |
| 1780 | __be64 c = ml->cookie; | 1801 | c = ml->cookie; |
| 1781 | mlog(ML_ERROR, "could not find local lock " | 1802 | mlog(ML_ERROR, "Could not find local lock " |
| 1782 | "with cookie %u:%llu!\n", | 1803 | "with cookie %u:%llu, node %u, " |
| 1804 | "list %u, flags 0x%x, type %d, " | ||
| 1805 | "conv %d, highest blocked %d\n", | ||
| 1783 | dlm_get_lock_cookie_node(be64_to_cpu(c)), | 1806 | dlm_get_lock_cookie_node(be64_to_cpu(c)), |
| 1784 | dlm_get_lock_cookie_seq(be64_to_cpu(c))); | 1807 | dlm_get_lock_cookie_seq(be64_to_cpu(c)), |
| 1808 | ml->node, ml->list, ml->flags, ml->type, | ||
| 1809 | ml->convert_type, ml->highest_blocked); | ||
| 1810 | __dlm_print_one_lock_resource(res); | ||
| 1811 | BUG(); | ||
| 1812 | } | ||
| 1813 | |||
| 1814 | if (lock->ml.node != ml->node) { | ||
| 1815 | c = lock->ml.cookie; | ||
| 1816 | mlog(ML_ERROR, "Mismatched node# in lock " | ||
| 1817 | "cookie %u:%llu, name %.*s, node %u\n", | ||
| 1818 | dlm_get_lock_cookie_node(be64_to_cpu(c)), | ||
| 1819 | dlm_get_lock_cookie_seq(be64_to_cpu(c)), | ||
| 1820 | res->lockname.len, res->lockname.name, | ||
| 1821 | lock->ml.node); | ||
| 1822 | c = ml->cookie; | ||
| 1823 | mlog(ML_ERROR, "Migrate lock cookie %u:%llu, " | ||
| 1824 | "node %u, list %u, flags 0x%x, type %d, " | ||
| 1825 | "conv %d, highest blocked %d\n", | ||
| 1826 | dlm_get_lock_cookie_node(be64_to_cpu(c)), | ||
| 1827 | dlm_get_lock_cookie_seq(be64_to_cpu(c)), | ||
| 1828 | ml->node, ml->list, ml->flags, ml->type, | ||
| 1829 | ml->convert_type, ml->highest_blocked); | ||
| 1785 | __dlm_print_one_lock_resource(res); | 1830 | __dlm_print_one_lock_resource(res); |
| 1786 | BUG(); | 1831 | BUG(); |
| 1787 | } | 1832 | } |
| 1788 | BUG_ON(lock->ml.node != ml->node); | ||
| 1789 | 1833 | ||
| 1790 | if (tmpq != queue) { | 1834 | if (tmpq != queue) { |
| 1791 | mlog(0, "lock was on %u instead of %u for %.*s\n", | 1835 | c = ml->cookie; |
| 1792 | j, ml->list, res->lockname.len, res->lockname.name); | 1836 | mlog(0, "Lock cookie %u:%llu was on list %u " |
| 1837 | "instead of list %u for %.*s\n", | ||
| 1838 | dlm_get_lock_cookie_node(be64_to_cpu(c)), | ||
| 1839 | dlm_get_lock_cookie_seq(be64_to_cpu(c)), | ||
| 1840 | j, ml->list, res->lockname.len, | ||
| 1841 | res->lockname.name); | ||
| 1842 | __dlm_print_one_lock_resource(res); | ||
| 1793 | spin_unlock(&res->spinlock); | 1843 | spin_unlock(&res->spinlock); |
| 1794 | continue; | 1844 | continue; |
| 1795 | } | 1845 | } |
| @@ -1839,7 +1889,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, | |||
| 1839 | * the lvb. */ | 1889 | * the lvb. */ |
| 1840 | memcpy(res->lvb, mres->lvb, DLM_LVB_LEN); | 1890 | memcpy(res->lvb, mres->lvb, DLM_LVB_LEN); |
| 1841 | } else { | 1891 | } else { |
| 1842 | /* otherwise, the node is sending its | 1892 | /* otherwise, the node is sending its |
| 1843 | * most recent valid lvb info */ | 1893 | * most recent valid lvb info */ |
| 1844 | BUG_ON(ml->type != LKM_EXMODE && | 1894 | BUG_ON(ml->type != LKM_EXMODE && |
| 1845 | ml->type != LKM_PRMODE); | 1895 | ml->type != LKM_PRMODE); |
| @@ -1886,7 +1936,7 @@ skip_lvb: | |||
| 1886 | spin_lock(&res->spinlock); | 1936 | spin_lock(&res->spinlock); |
| 1887 | list_for_each_entry(lock, queue, list) { | 1937 | list_for_each_entry(lock, queue, list) { |
| 1888 | if (lock->ml.cookie == ml->cookie) { | 1938 | if (lock->ml.cookie == ml->cookie) { |
| 1889 | __be64 c = lock->ml.cookie; | 1939 | c = lock->ml.cookie; |
| 1890 | mlog(ML_ERROR, "%s:%.*s: %u:%llu: lock already " | 1940 | mlog(ML_ERROR, "%s:%.*s: %u:%llu: lock already " |
| 1891 | "exists on this lockres!\n", dlm->name, | 1941 | "exists on this lockres!\n", dlm->name, |
| 1892 | res->lockname.len, res->lockname.name, | 1942 | res->lockname.len, res->lockname.name, |
| @@ -2114,7 +2164,7 @@ static void dlm_revalidate_lvb(struct dlm_ctxt *dlm, | |||
| 2114 | assert_spin_locked(&res->spinlock); | 2164 | assert_spin_locked(&res->spinlock); |
| 2115 | 2165 | ||
| 2116 | if (res->owner == dlm->node_num) | 2166 | if (res->owner == dlm->node_num) |
| 2117 | /* if this node owned the lockres, and if the dead node | 2167 | /* if this node owned the lockres, and if the dead node |
| 2118 | * had an EX when he died, blank out the lvb */ | 2168 | * had an EX when he died, blank out the lvb */ |
| 2119 | search_node = dead_node; | 2169 | search_node = dead_node; |
| 2120 | else { | 2170 | else { |
| @@ -2152,7 +2202,7 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm, | |||
| 2152 | 2202 | ||
| 2153 | /* this node is the lockres master: | 2203 | /* this node is the lockres master: |
| 2154 | * 1) remove any stale locks for the dead node | 2204 | * 1) remove any stale locks for the dead node |
| 2155 | * 2) if the dead node had an EX when he died, blank out the lvb | 2205 | * 2) if the dead node had an EX when he died, blank out the lvb |
| 2156 | */ | 2206 | */ |
| 2157 | assert_spin_locked(&dlm->spinlock); | 2207 | assert_spin_locked(&dlm->spinlock); |
| 2158 | assert_spin_locked(&res->spinlock); | 2208 | assert_spin_locked(&res->spinlock); |
| @@ -2193,7 +2243,12 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm, | |||
| 2193 | mlog(0, "%s:%.*s: freed %u locks for dead node %u, " | 2243 | mlog(0, "%s:%.*s: freed %u locks for dead node %u, " |
| 2194 | "dropping ref from lockres\n", dlm->name, | 2244 | "dropping ref from lockres\n", dlm->name, |
| 2195 | res->lockname.len, res->lockname.name, freed, dead_node); | 2245 | res->lockname.len, res->lockname.name, freed, dead_node); |
| 2196 | BUG_ON(!test_bit(dead_node, res->refmap)); | 2246 | if(!test_bit(dead_node, res->refmap)) { |
| 2247 | mlog(ML_ERROR, "%s:%.*s: freed %u locks for dead node %u, " | ||
| 2248 | "but ref was not set\n", dlm->name, | ||
| 2249 | res->lockname.len, res->lockname.name, freed, dead_node); | ||
| 2250 | __dlm_print_one_lock_resource(res); | ||
| 2251 | } | ||
| 2197 | dlm_lockres_clear_refmap_bit(dead_node, res); | 2252 | dlm_lockres_clear_refmap_bit(dead_node, res); |
| 2198 | } else if (test_bit(dead_node, res->refmap)) { | 2253 | } else if (test_bit(dead_node, res->refmap)) { |
| 2199 | mlog(0, "%s:%.*s: dead node %u had a ref, but had " | 2254 | mlog(0, "%s:%.*s: dead node %u had a ref, but had " |
| @@ -2260,7 +2315,7 @@ static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node) | |||
| 2260 | } | 2315 | } |
| 2261 | spin_unlock(&res->spinlock); | 2316 | spin_unlock(&res->spinlock); |
| 2262 | continue; | 2317 | continue; |
| 2263 | } | 2318 | } |
| 2264 | spin_lock(&res->spinlock); | 2319 | spin_lock(&res->spinlock); |
| 2265 | /* zero the lvb if necessary */ | 2320 | /* zero the lvb if necessary */ |
| 2266 | dlm_revalidate_lvb(dlm, res, dead_node); | 2321 | dlm_revalidate_lvb(dlm, res, dead_node); |
| @@ -2411,7 +2466,7 @@ static void dlm_reco_unlock_ast(void *astdata, enum dlm_status st) | |||
| 2411 | * this function on each node racing to become the recovery | 2466 | * this function on each node racing to become the recovery |
| 2412 | * master will not stop attempting this until either: | 2467 | * master will not stop attempting this until either: |
| 2413 | * a) this node gets the EX (and becomes the recovery master), | 2468 | * a) this node gets the EX (and becomes the recovery master), |
| 2414 | * or b) dlm->reco.new_master gets set to some nodenum | 2469 | * or b) dlm->reco.new_master gets set to some nodenum |
| 2415 | * != O2NM_INVALID_NODE_NUM (another node will do the reco). | 2470 | * != O2NM_INVALID_NODE_NUM (another node will do the reco). |
| 2416 | * so each time a recovery master is needed, the entire cluster | 2471 | * so each time a recovery master is needed, the entire cluster |
| 2417 | * will sync at this point. if the new master dies, that will | 2472 | * will sync at this point. if the new master dies, that will |
| @@ -2424,7 +2479,7 @@ static int dlm_pick_recovery_master(struct dlm_ctxt *dlm) | |||
| 2424 | 2479 | ||
| 2425 | mlog(0, "starting recovery of %s at %lu, dead=%u, this=%u\n", | 2480 | mlog(0, "starting recovery of %s at %lu, dead=%u, this=%u\n", |
| 2426 | dlm->name, jiffies, dlm->reco.dead_node, dlm->node_num); | 2481 | dlm->name, jiffies, dlm->reco.dead_node, dlm->node_num); |
| 2427 | again: | 2482 | again: |
| 2428 | memset(&lksb, 0, sizeof(lksb)); | 2483 | memset(&lksb, 0, sizeof(lksb)); |
| 2429 | 2484 | ||
| 2430 | ret = dlmlock(dlm, LKM_EXMODE, &lksb, LKM_NOQUEUE|LKM_RECOVERY, | 2485 | ret = dlmlock(dlm, LKM_EXMODE, &lksb, LKM_NOQUEUE|LKM_RECOVERY, |
| @@ -2437,8 +2492,8 @@ again: | |||
| 2437 | if (ret == DLM_NORMAL) { | 2492 | if (ret == DLM_NORMAL) { |
| 2438 | mlog(0, "dlm=%s dlmlock says I got it (this=%u)\n", | 2493 | mlog(0, "dlm=%s dlmlock says I got it (this=%u)\n", |
| 2439 | dlm->name, dlm->node_num); | 2494 | dlm->name, dlm->node_num); |
| 2440 | 2495 | ||
| 2441 | /* got the EX lock. check to see if another node | 2496 | /* got the EX lock. check to see if another node |
| 2442 | * just became the reco master */ | 2497 | * just became the reco master */ |
| 2443 | if (dlm_reco_master_ready(dlm)) { | 2498 | if (dlm_reco_master_ready(dlm)) { |
| 2444 | mlog(0, "%s: got reco EX lock, but %u will " | 2499 | mlog(0, "%s: got reco EX lock, but %u will " |
| @@ -2451,12 +2506,12 @@ again: | |||
| 2451 | /* see if recovery was already finished elsewhere */ | 2506 | /* see if recovery was already finished elsewhere */ |
| 2452 | spin_lock(&dlm->spinlock); | 2507 | spin_lock(&dlm->spinlock); |
| 2453 | if (dlm->reco.dead_node == O2NM_INVALID_NODE_NUM) { | 2508 | if (dlm->reco.dead_node == O2NM_INVALID_NODE_NUM) { |
| 2454 | status = -EINVAL; | 2509 | status = -EINVAL; |
| 2455 | mlog(0, "%s: got reco EX lock, but " | 2510 | mlog(0, "%s: got reco EX lock, but " |
| 2456 | "node got recovered already\n", dlm->name); | 2511 | "node got recovered already\n", dlm->name); |
| 2457 | if (dlm->reco.new_master != O2NM_INVALID_NODE_NUM) { | 2512 | if (dlm->reco.new_master != O2NM_INVALID_NODE_NUM) { |
| 2458 | mlog(ML_ERROR, "%s: new master is %u " | 2513 | mlog(ML_ERROR, "%s: new master is %u " |
| 2459 | "but no dead node!\n", | 2514 | "but no dead node!\n", |
| 2460 | dlm->name, dlm->reco.new_master); | 2515 | dlm->name, dlm->reco.new_master); |
| 2461 | BUG(); | 2516 | BUG(); |
| 2462 | } | 2517 | } |
| @@ -2468,7 +2523,7 @@ again: | |||
| 2468 | * set the master and send the messages to begin recovery */ | 2523 | * set the master and send the messages to begin recovery */ |
| 2469 | if (!status) { | 2524 | if (!status) { |
| 2470 | mlog(0, "%s: dead=%u, this=%u, sending " | 2525 | mlog(0, "%s: dead=%u, this=%u, sending " |
| 2471 | "begin_reco now\n", dlm->name, | 2526 | "begin_reco now\n", dlm->name, |
| 2472 | dlm->reco.dead_node, dlm->node_num); | 2527 | dlm->reco.dead_node, dlm->node_num); |
| 2473 | status = dlm_send_begin_reco_message(dlm, | 2528 | status = dlm_send_begin_reco_message(dlm, |
| 2474 | dlm->reco.dead_node); | 2529 | dlm->reco.dead_node); |
| @@ -2501,7 +2556,7 @@ again: | |||
| 2501 | mlog(0, "dlm=%s dlmlock says another node got it (this=%u)\n", | 2556 | mlog(0, "dlm=%s dlmlock says another node got it (this=%u)\n", |
| 2502 | dlm->name, dlm->node_num); | 2557 | dlm->name, dlm->node_num); |
| 2503 | /* another node is master. wait on | 2558 | /* another node is master. wait on |
| 2504 | * reco.new_master != O2NM_INVALID_NODE_NUM | 2559 | * reco.new_master != O2NM_INVALID_NODE_NUM |
| 2505 | * for at most one second */ | 2560 | * for at most one second */ |
| 2506 | wait_event_timeout(dlm->dlm_reco_thread_wq, | 2561 | wait_event_timeout(dlm->dlm_reco_thread_wq, |
| 2507 | dlm_reco_master_ready(dlm), | 2562 | dlm_reco_master_ready(dlm), |
| @@ -2589,7 +2644,13 @@ retry: | |||
| 2589 | "begin reco msg (%d)\n", dlm->name, nodenum, ret); | 2644 | "begin reco msg (%d)\n", dlm->name, nodenum, ret); |
| 2590 | ret = 0; | 2645 | ret = 0; |
| 2591 | } | 2646 | } |
| 2592 | if (ret == -EAGAIN) { | 2647 | |
| 2648 | /* | ||
| 2649 | * Prior to commit aad1b15310b9bcd59fa81ab8f2b1513b59553ea8, | ||
| 2650 | * dlm_begin_reco_handler() returned EAGAIN and not -EAGAIN. | ||
| 2651 | * We are handling both for compatibility reasons. | ||
| 2652 | */ | ||
| 2653 | if (ret == -EAGAIN || ret == EAGAIN) { | ||
| 2593 | mlog(0, "%s: trying to start recovery of node " | 2654 | mlog(0, "%s: trying to start recovery of node " |
| 2594 | "%u, but node %u is waiting for last recovery " | 2655 | "%u, but node %u is waiting for last recovery " |
| 2595 | "to complete, backoff for a bit\n", dlm->name, | 2656 | "to complete, backoff for a bit\n", dlm->name, |
| @@ -2599,7 +2660,7 @@ retry: | |||
| 2599 | } | 2660 | } |
| 2600 | if (ret < 0) { | 2661 | if (ret < 0) { |
| 2601 | struct dlm_lock_resource *res; | 2662 | struct dlm_lock_resource *res; |
| 2602 | /* this is now a serious problem, possibly ENOMEM | 2663 | /* this is now a serious problem, possibly ENOMEM |
| 2603 | * in the network stack. must retry */ | 2664 | * in the network stack. must retry */ |
| 2604 | mlog_errno(ret); | 2665 | mlog_errno(ret); |
| 2605 | mlog(ML_ERROR, "begin reco of dlm %s to node %u " | 2666 | mlog(ML_ERROR, "begin reco of dlm %s to node %u " |
| @@ -2612,7 +2673,7 @@ retry: | |||
| 2612 | } else { | 2673 | } else { |
| 2613 | mlog(ML_ERROR, "recovery lock not found\n"); | 2674 | mlog(ML_ERROR, "recovery lock not found\n"); |
| 2614 | } | 2675 | } |
| 2615 | /* sleep for a bit in hopes that we can avoid | 2676 | /* sleep for a bit in hopes that we can avoid |
| 2616 | * another ENOMEM */ | 2677 | * another ENOMEM */ |
| 2617 | msleep(100); | 2678 | msleep(100); |
| 2618 | goto retry; | 2679 | goto retry; |
| @@ -2664,7 +2725,7 @@ int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data, | |||
| 2664 | } | 2725 | } |
| 2665 | if (dlm->reco.dead_node != O2NM_INVALID_NODE_NUM) { | 2726 | if (dlm->reco.dead_node != O2NM_INVALID_NODE_NUM) { |
| 2666 | mlog(ML_NOTICE, "%s: dead_node previously set to %u, " | 2727 | mlog(ML_NOTICE, "%s: dead_node previously set to %u, " |
| 2667 | "node %u changing it to %u\n", dlm->name, | 2728 | "node %u changing it to %u\n", dlm->name, |
| 2668 | dlm->reco.dead_node, br->node_idx, br->dead_node); | 2729 | dlm->reco.dead_node, br->node_idx, br->dead_node); |
| 2669 | } | 2730 | } |
| 2670 | dlm_set_reco_master(dlm, br->node_idx); | 2731 | dlm_set_reco_master(dlm, br->node_idx); |
| @@ -2730,8 +2791,8 @@ stage2: | |||
| 2730 | if (ret < 0) { | 2791 | if (ret < 0) { |
| 2731 | mlog_errno(ret); | 2792 | mlog_errno(ret); |
| 2732 | if (dlm_is_host_down(ret)) { | 2793 | if (dlm_is_host_down(ret)) { |
| 2733 | /* this has no effect on this recovery | 2794 | /* this has no effect on this recovery |
| 2734 | * session, so set the status to zero to | 2795 | * session, so set the status to zero to |
| 2735 | * finish out the last recovery */ | 2796 | * finish out the last recovery */ |
| 2736 | mlog(ML_ERROR, "node %u went down after this " | 2797 | mlog(ML_ERROR, "node %u went down after this " |
| 2737 | "node finished recovery.\n", nodenum); | 2798 | "node finished recovery.\n", nodenum); |
| @@ -2768,7 +2829,7 @@ int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data, | |||
| 2768 | mlog(0, "%s: node %u finalizing recovery stage%d of " | 2829 | mlog(0, "%s: node %u finalizing recovery stage%d of " |
| 2769 | "node %u (%u:%u)\n", dlm->name, fr->node_idx, stage, | 2830 | "node %u (%u:%u)\n", dlm->name, fr->node_idx, stage, |
| 2770 | fr->dead_node, dlm->reco.dead_node, dlm->reco.new_master); | 2831 | fr->dead_node, dlm->reco.dead_node, dlm->reco.new_master); |
| 2771 | 2832 | ||
| 2772 | spin_lock(&dlm->spinlock); | 2833 | spin_lock(&dlm->spinlock); |
| 2773 | 2834 | ||
| 2774 | if (dlm->reco.new_master != fr->node_idx) { | 2835 | if (dlm->reco.new_master != fr->node_idx) { |
diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c index 00f53b2aea76..49e29ecd0201 100644 --- a/fs/ocfs2/dlm/dlmunlock.c +++ b/fs/ocfs2/dlm/dlmunlock.c | |||
| @@ -190,8 +190,8 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, | |||
| 190 | actions &= ~(DLM_UNLOCK_REMOVE_LOCK| | 190 | actions &= ~(DLM_UNLOCK_REMOVE_LOCK| |
| 191 | DLM_UNLOCK_REGRANT_LOCK| | 191 | DLM_UNLOCK_REGRANT_LOCK| |
| 192 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); | 192 | DLM_UNLOCK_CLEAR_CONVERT_TYPE); |
| 193 | } else if (status == DLM_RECOVERING || | 193 | } else if (status == DLM_RECOVERING || |
| 194 | status == DLM_MIGRATING || | 194 | status == DLM_MIGRATING || |
| 195 | status == DLM_FORWARD) { | 195 | status == DLM_FORWARD) { |
| 196 | /* must clear the actions because this unlock | 196 | /* must clear the actions because this unlock |
| 197 | * is about to be retried. cannot free or do | 197 | * is about to be retried. cannot free or do |
| @@ -661,14 +661,14 @@ retry: | |||
| 661 | if (call_ast) { | 661 | if (call_ast) { |
| 662 | mlog(0, "calling unlockast(%p, %d)\n", data, status); | 662 | mlog(0, "calling unlockast(%p, %d)\n", data, status); |
| 663 | if (is_master) { | 663 | if (is_master) { |
| 664 | /* it is possible that there is one last bast | 664 | /* it is possible that there is one last bast |
| 665 | * pending. make sure it is flushed, then | 665 | * pending. make sure it is flushed, then |
| 666 | * call the unlockast. | 666 | * call the unlockast. |
| 667 | * not an issue if this is a mastered remotely, | 667 | * not an issue if this is a mastered remotely, |
| 668 | * since this lock has been removed from the | 668 | * since this lock has been removed from the |
| 669 | * lockres queues and cannot be found. */ | 669 | * lockres queues and cannot be found. */ |
| 670 | dlm_kick_thread(dlm, NULL); | 670 | dlm_kick_thread(dlm, NULL); |
| 671 | wait_event(dlm->ast_wq, | 671 | wait_event(dlm->ast_wq, |
| 672 | dlm_lock_basts_flushed(dlm, lock)); | 672 | dlm_lock_basts_flushed(dlm, lock)); |
| 673 | } | 673 | } |
| 674 | (*unlockast)(data, status); | 674 | (*unlockast)(data, status); |
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index c5e4a49e3a12..e044019cb3b1 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
| @@ -875,6 +875,14 @@ static inline void ocfs2_generic_handle_convert_action(struct ocfs2_lock_res *lo | |||
| 875 | lockres_or_flags(lockres, OCFS2_LOCK_NEEDS_REFRESH); | 875 | lockres_or_flags(lockres, OCFS2_LOCK_NEEDS_REFRESH); |
| 876 | 876 | ||
| 877 | lockres->l_level = lockres->l_requested; | 877 | lockres->l_level = lockres->l_requested; |
| 878 | |||
| 879 | /* | ||
| 880 | * We set the OCFS2_LOCK_UPCONVERT_FINISHING flag before clearing | ||
| 881 | * the OCFS2_LOCK_BUSY flag to prevent the dc thread from | ||
| 882 | * downconverting the lock before the upconvert has fully completed. | ||
| 883 | */ | ||
| 884 | lockres_or_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING); | ||
| 885 | |||
| 878 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); | 886 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); |
| 879 | 887 | ||
| 880 | mlog_exit_void(); | 888 | mlog_exit_void(); |
| @@ -907,8 +915,6 @@ static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres, | |||
| 907 | 915 | ||
| 908 | assert_spin_locked(&lockres->l_lock); | 916 | assert_spin_locked(&lockres->l_lock); |
| 909 | 917 | ||
| 910 | lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED); | ||
| 911 | |||
| 912 | if (level > lockres->l_blocking) { | 918 | if (level > lockres->l_blocking) { |
| 913 | /* only schedule a downconvert if we haven't already scheduled | 919 | /* only schedule a downconvert if we haven't already scheduled |
| 914 | * one that goes low enough to satisfy the level we're | 920 | * one that goes low enough to satisfy the level we're |
| @@ -921,6 +927,9 @@ static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres, | |||
| 921 | lockres->l_blocking = level; | 927 | lockres->l_blocking = level; |
| 922 | } | 928 | } |
| 923 | 929 | ||
| 930 | if (needs_downconvert) | ||
| 931 | lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED); | ||
| 932 | |||
| 924 | mlog_exit(needs_downconvert); | 933 | mlog_exit(needs_downconvert); |
| 925 | return needs_downconvert; | 934 | return needs_downconvert; |
| 926 | } | 935 | } |
| @@ -1133,6 +1142,7 @@ static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres, | |||
| 1133 | mlog_entry_void(); | 1142 | mlog_entry_void(); |
| 1134 | spin_lock_irqsave(&lockres->l_lock, flags); | 1143 | spin_lock_irqsave(&lockres->l_lock, flags); |
| 1135 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); | 1144 | lockres_clear_flags(lockres, OCFS2_LOCK_BUSY); |
| 1145 | lockres_clear_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING); | ||
| 1136 | if (convert) | 1146 | if (convert) |
| 1137 | lockres->l_action = OCFS2_AST_INVALID; | 1147 | lockres->l_action = OCFS2_AST_INVALID; |
| 1138 | else | 1148 | else |
| @@ -1323,13 +1333,13 @@ static int __ocfs2_cluster_lock(struct ocfs2_super *osb, | |||
| 1323 | again: | 1333 | again: |
| 1324 | wait = 0; | 1334 | wait = 0; |
| 1325 | 1335 | ||
| 1336 | spin_lock_irqsave(&lockres->l_lock, flags); | ||
| 1337 | |||
| 1326 | if (catch_signals && signal_pending(current)) { | 1338 | if (catch_signals && signal_pending(current)) { |
| 1327 | ret = -ERESTARTSYS; | 1339 | ret = -ERESTARTSYS; |
| 1328 | goto out; | 1340 | goto unlock; |
| 1329 | } | 1341 | } |
| 1330 | 1342 | ||
| 1331 | spin_lock_irqsave(&lockres->l_lock, flags); | ||
| 1332 | |||
| 1333 | mlog_bug_on_msg(lockres->l_flags & OCFS2_LOCK_FREEING, | 1343 | mlog_bug_on_msg(lockres->l_flags & OCFS2_LOCK_FREEING, |
| 1334 | "Cluster lock called on freeing lockres %s! flags " | 1344 | "Cluster lock called on freeing lockres %s! flags " |
| 1335 | "0x%lx\n", lockres->l_name, lockres->l_flags); | 1345 | "0x%lx\n", lockres->l_name, lockres->l_flags); |
| @@ -1346,6 +1356,25 @@ again: | |||
| 1346 | goto unlock; | 1356 | goto unlock; |
| 1347 | } | 1357 | } |
| 1348 | 1358 | ||
| 1359 | if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) { | ||
| 1360 | /* | ||
| 1361 | * We've upconverted. If the lock now has a level we can | ||
| 1362 | * work with, we take it. If, however, the lock is not at the | ||
| 1363 | * required level, we go thru the full cycle. One way this could | ||
| 1364 | * happen is if a process requesting an upconvert to PR is | ||
| 1365 | * closely followed by another requesting upconvert to an EX. | ||
| 1366 | * If the process requesting EX lands here, we want it to | ||
| 1367 | * continue attempting to upconvert and let the process | ||
| 1368 | * requesting PR take the lock. | ||
| 1369 | * If multiple processes request upconvert to PR, the first one | ||
| 1370 | * here will take the lock. The others will have to go thru the | ||
| 1371 | * OCFS2_LOCK_BLOCKED check to ensure that there is no pending | ||
| 1372 | * downconvert request. | ||
| 1373 | */ | ||
| 1374 | if (level <= lockres->l_level) | ||
| 1375 | goto update_holders; | ||
| 1376 | } | ||
| 1377 | |||
| 1349 | if (lockres->l_flags & OCFS2_LOCK_BLOCKED && | 1378 | if (lockres->l_flags & OCFS2_LOCK_BLOCKED && |
| 1350 | !ocfs2_may_continue_on_blocked_lock(lockres, level)) { | 1379 | !ocfs2_may_continue_on_blocked_lock(lockres, level)) { |
| 1351 | /* is the lock is currently blocked on behalf of | 1380 | /* is the lock is currently blocked on behalf of |
| @@ -1416,11 +1445,14 @@ again: | |||
| 1416 | goto again; | 1445 | goto again; |
| 1417 | } | 1446 | } |
| 1418 | 1447 | ||
| 1448 | update_holders: | ||
| 1419 | /* Ok, if we get here then we're good to go. */ | 1449 | /* Ok, if we get here then we're good to go. */ |
| 1420 | ocfs2_inc_holders(lockres, level); | 1450 | ocfs2_inc_holders(lockres, level); |
| 1421 | 1451 | ||
| 1422 | ret = 0; | 1452 | ret = 0; |
| 1423 | unlock: | 1453 | unlock: |
| 1454 | lockres_clear_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING); | ||
| 1455 | |||
| 1424 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 1456 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 1425 | out: | 1457 | out: |
| 1426 | /* | 1458 | /* |
| @@ -3155,7 +3187,7 @@ out: | |||
| 3155 | /* Mark the lockres as being dropped. It will no longer be | 3187 | /* Mark the lockres as being dropped. It will no longer be |
| 3156 | * queued if blocking, but we still may have to wait on it | 3188 | * queued if blocking, but we still may have to wait on it |
| 3157 | * being dequeued from the downconvert thread before we can consider | 3189 | * being dequeued from the downconvert thread before we can consider |
| 3158 | * it safe to drop. | 3190 | * it safe to drop. |
| 3159 | * | 3191 | * |
| 3160 | * You can *not* attempt to call cluster_lock on this lockres anymore. */ | 3192 | * You can *not* attempt to call cluster_lock on this lockres anymore. */ |
| 3161 | void ocfs2_mark_lockres_freeing(struct ocfs2_lock_res *lockres) | 3193 | void ocfs2_mark_lockres_freeing(struct ocfs2_lock_res *lockres) |
| @@ -3352,6 +3384,7 @@ static int ocfs2_unblock_lock(struct ocfs2_super *osb, | |||
| 3352 | unsigned long flags; | 3384 | unsigned long flags; |
| 3353 | int blocking; | 3385 | int blocking; |
| 3354 | int new_level; | 3386 | int new_level; |
| 3387 | int level; | ||
| 3355 | int ret = 0; | 3388 | int ret = 0; |
| 3356 | int set_lvb = 0; | 3389 | int set_lvb = 0; |
| 3357 | unsigned int gen; | 3390 | unsigned int gen; |
| @@ -3360,9 +3393,17 @@ static int ocfs2_unblock_lock(struct ocfs2_super *osb, | |||
| 3360 | 3393 | ||
| 3361 | spin_lock_irqsave(&lockres->l_lock, flags); | 3394 | spin_lock_irqsave(&lockres->l_lock, flags); |
| 3362 | 3395 | ||
| 3363 | BUG_ON(!(lockres->l_flags & OCFS2_LOCK_BLOCKED)); | ||
| 3364 | |||
| 3365 | recheck: | 3396 | recheck: |
| 3397 | /* | ||
| 3398 | * Is it still blocking? If not, we have no more work to do. | ||
| 3399 | */ | ||
| 3400 | if (!(lockres->l_flags & OCFS2_LOCK_BLOCKED)) { | ||
| 3401 | BUG_ON(lockres->l_blocking != DLM_LOCK_NL); | ||
| 3402 | spin_unlock_irqrestore(&lockres->l_lock, flags); | ||
| 3403 | ret = 0; | ||
| 3404 | goto leave; | ||
| 3405 | } | ||
| 3406 | |||
| 3366 | if (lockres->l_flags & OCFS2_LOCK_BUSY) { | 3407 | if (lockres->l_flags & OCFS2_LOCK_BUSY) { |
| 3367 | /* XXX | 3408 | /* XXX |
| 3368 | * This is a *big* race. The OCFS2_LOCK_PENDING flag | 3409 | * This is a *big* race. The OCFS2_LOCK_PENDING flag |
| @@ -3401,6 +3442,31 @@ recheck: | |||
| 3401 | goto leave; | 3442 | goto leave; |
| 3402 | } | 3443 | } |
| 3403 | 3444 | ||
| 3445 | /* | ||
| 3446 | * This prevents livelocks. OCFS2_LOCK_UPCONVERT_FINISHING flag is | ||
| 3447 | * set when the ast is received for an upconvert just before the | ||
| 3448 | * OCFS2_LOCK_BUSY flag is cleared. Now if the fs received a bast | ||
| 3449 | * on the heels of the ast, we want to delay the downconvert just | ||
| 3450 | * enough to allow the up requestor to do its task. Because this | ||
| 3451 | * lock is in the blocked queue, the lock will be downconverted | ||
| 3452 | * as soon as the requestor is done with the lock. | ||
| 3453 | */ | ||
| 3454 | if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING) | ||
| 3455 | goto leave_requeue; | ||
| 3456 | |||
| 3457 | /* | ||
| 3458 | * How can we block and yet be at NL? We were trying to upconvert | ||
| 3459 | * from NL and got canceled. The code comes back here, and now | ||
| 3460 | * we notice and clear BLOCKING. | ||
| 3461 | */ | ||
| 3462 | if (lockres->l_level == DLM_LOCK_NL) { | ||
| 3463 | BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders); | ||
| 3464 | lockres->l_blocking = DLM_LOCK_NL; | ||
| 3465 | lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED); | ||
| 3466 | spin_unlock_irqrestore(&lockres->l_lock, flags); | ||
| 3467 | goto leave; | ||
| 3468 | } | ||
| 3469 | |||
| 3404 | /* if we're blocking an exclusive and we have *any* holders, | 3470 | /* if we're blocking an exclusive and we have *any* holders, |
| 3405 | * then requeue. */ | 3471 | * then requeue. */ |
| 3406 | if ((lockres->l_blocking == DLM_LOCK_EX) | 3472 | if ((lockres->l_blocking == DLM_LOCK_EX) |
| @@ -3438,6 +3504,7 @@ recheck: | |||
| 3438 | * may sleep, so we save off a copy of what we're blocking as | 3504 | * may sleep, so we save off a copy of what we're blocking as |
| 3439 | * it may change while we're not holding the spin lock. */ | 3505 | * it may change while we're not holding the spin lock. */ |
| 3440 | blocking = lockres->l_blocking; | 3506 | blocking = lockres->l_blocking; |
| 3507 | level = lockres->l_level; | ||
| 3441 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 3508 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 3442 | 3509 | ||
| 3443 | ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking); | 3510 | ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking); |
| @@ -3446,7 +3513,7 @@ recheck: | |||
| 3446 | goto leave; | 3513 | goto leave; |
| 3447 | 3514 | ||
| 3448 | spin_lock_irqsave(&lockres->l_lock, flags); | 3515 | spin_lock_irqsave(&lockres->l_lock, flags); |
| 3449 | if (blocking != lockres->l_blocking) { | 3516 | if ((blocking != lockres->l_blocking) || (level != lockres->l_level)) { |
| 3450 | /* If this changed underneath us, then we can't drop | 3517 | /* If this changed underneath us, then we can't drop |
| 3451 | * it just yet. */ | 3518 | * it just yet. */ |
| 3452 | goto recheck; | 3519 | goto recheck; |
diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index 15713cbb865c..19ad145d2af3 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c | |||
| @@ -239,7 +239,7 @@ static int ocfs2_encode_fh(struct dentry *dentry, u32 *fh_in, int *max_len, | |||
| 239 | mlog(0, "Encoding parent: blkno: %llu, generation: %u\n", | 239 | mlog(0, "Encoding parent: blkno: %llu, generation: %u\n", |
| 240 | (unsigned long long)blkno, generation); | 240 | (unsigned long long)blkno, generation); |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | *max_len = len; | 243 | *max_len = len; |
| 244 | 244 | ||
| 245 | bail: | 245 | bail: |
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index d35a27f4523e..5328529e7fd2 100644 --- a/fs/ocfs2/extent_map.c +++ b/fs/ocfs2/extent_map.c | |||
| @@ -192,7 +192,7 @@ static int ocfs2_try_to_merge_extent_map(struct ocfs2_extent_map_item *emi, | |||
| 192 | emi->ei_clusters += ins->ei_clusters; | 192 | emi->ei_clusters += ins->ei_clusters; |
| 193 | return 1; | 193 | return 1; |
| 194 | } else if ((ins->ei_phys + ins->ei_clusters) == emi->ei_phys && | 194 | } else if ((ins->ei_phys + ins->ei_clusters) == emi->ei_phys && |
| 195 | (ins->ei_cpos + ins->ei_clusters) == emi->ei_phys && | 195 | (ins->ei_cpos + ins->ei_clusters) == emi->ei_cpos && |
| 196 | ins->ei_flags == emi->ei_flags) { | 196 | ins->ei_flags == emi->ei_flags) { |
| 197 | emi->ei_phys = ins->ei_phys; | 197 | emi->ei_phys = ins->ei_phys; |
| 198 | emi->ei_cpos = ins->ei_cpos; | 198 | emi->ei_cpos = ins->ei_cpos; |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 06ccf6a86d35..558ce0312421 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -749,7 +749,7 @@ static int ocfs2_write_zero_page(struct inode *inode, | |||
| 749 | int ret; | 749 | int ret; |
| 750 | 750 | ||
| 751 | offset = (size & (PAGE_CACHE_SIZE-1)); /* Within page */ | 751 | offset = (size & (PAGE_CACHE_SIZE-1)); /* Within page */ |
| 752 | /* ugh. in prepare/commit_write, if from==to==start of block, we | 752 | /* ugh. in prepare/commit_write, if from==to==start of block, we |
| 753 | ** skip the prepare. make sure we never send an offset for the start | 753 | ** skip the prepare. make sure we never send an offset for the start |
| 754 | ** of a block | 754 | ** of a block |
| 755 | */ | 755 | */ |
| @@ -1779,7 +1779,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
| 1779 | struct inode *inode = dentry->d_inode; | 1779 | struct inode *inode = dentry->d_inode; |
| 1780 | loff_t saved_pos, end; | 1780 | loff_t saved_pos, end; |
| 1781 | 1781 | ||
| 1782 | /* | 1782 | /* |
| 1783 | * We start with a read level meta lock and only jump to an ex | 1783 | * We start with a read level meta lock and only jump to an ex |
| 1784 | * if we need to make modifications here. | 1784 | * if we need to make modifications here. |
| 1785 | */ | 1785 | */ |
| @@ -2013,8 +2013,8 @@ out_dio: | |||
| 2013 | /* buffered aio wouldn't have proper lock coverage today */ | 2013 | /* buffered aio wouldn't have proper lock coverage today */ |
| 2014 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); | 2014 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); |
| 2015 | 2015 | ||
| 2016 | if ((file->f_flags & O_DSYNC && !direct_io) || IS_SYNC(inode) || | 2016 | if (((file->f_flags & O_DSYNC) && !direct_io) || IS_SYNC(inode) || |
| 2017 | (file->f_flags & O_DIRECT && has_refcount)) { | 2017 | ((file->f_flags & O_DIRECT) && has_refcount)) { |
| 2018 | ret = filemap_fdatawrite_range(file->f_mapping, pos, | 2018 | ret = filemap_fdatawrite_range(file->f_mapping, pos, |
| 2019 | pos + count - 1); | 2019 | pos + count - 1); |
| 2020 | if (ret < 0) | 2020 | if (ret < 0) |
| @@ -2033,7 +2033,7 @@ out_dio: | |||
| 2033 | pos + count - 1); | 2033 | pos + count - 1); |
| 2034 | } | 2034 | } |
| 2035 | 2035 | ||
| 2036 | /* | 2036 | /* |
| 2037 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io | 2037 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io |
| 2038 | * function pointer which is called when o_direct io completes so that | 2038 | * function pointer which is called when o_direct io completes so that |
| 2039 | * it can unlock our rw lock. (it's the clustered equivalent of | 2039 | * it can unlock our rw lock. (it's the clustered equivalent of |
| @@ -2198,7 +2198,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
| 2198 | goto bail; | 2198 | goto bail; |
| 2199 | } | 2199 | } |
| 2200 | 2200 | ||
| 2201 | /* | 2201 | /* |
| 2202 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads | 2202 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads |
| 2203 | * need locks to protect pending reads from racing with truncate. | 2203 | * need locks to protect pending reads from racing with truncate. |
| 2204 | */ | 2204 | */ |
| @@ -2220,10 +2220,10 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
| 2220 | * We're fine letting folks race truncates and extending | 2220 | * We're fine letting folks race truncates and extending |
| 2221 | * writes with read across the cluster, just like they can | 2221 | * writes with read across the cluster, just like they can |
| 2222 | * locally. Hence no rw_lock during read. | 2222 | * locally. Hence no rw_lock during read. |
| 2223 | * | 2223 | * |
| 2224 | * Take and drop the meta data lock to update inode fields | 2224 | * Take and drop the meta data lock to update inode fields |
| 2225 | * like i_size. This allows the checks down below | 2225 | * like i_size. This allows the checks down below |
| 2226 | * generic_file_aio_read() a chance of actually working. | 2226 | * generic_file_aio_read() a chance of actually working. |
| 2227 | */ | 2227 | */ |
| 2228 | ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); | 2228 | ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); |
| 2229 | if (ret < 0) { | 2229 | if (ret < 0) { |
| @@ -2248,7 +2248,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
| 2248 | bail: | 2248 | bail: |
| 2249 | if (have_alloc_sem) | 2249 | if (have_alloc_sem) |
| 2250 | up_read(&inode->i_alloc_sem); | 2250 | up_read(&inode->i_alloc_sem); |
| 2251 | if (rw_level != -1) | 2251 | if (rw_level != -1) |
| 2252 | ocfs2_rw_unlock(inode, rw_level); | 2252 | ocfs2_rw_unlock(inode, rw_level); |
| 2253 | mlog_exit(ret); | 2253 | mlog_exit(ret); |
| 2254 | 2254 | ||
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 0297fb8982b8..88459bdd1ff3 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
| @@ -475,7 +475,7 @@ static int ocfs2_read_locked_inode(struct inode *inode, | |||
| 475 | if (args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY) { | 475 | if (args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY) { |
| 476 | status = ocfs2_try_open_lock(inode, 0); | 476 | status = ocfs2_try_open_lock(inode, 0); |
| 477 | if (status) { | 477 | if (status) { |
| 478 | make_bad_inode(inode); | 478 | make_bad_inode(inode); |
| 479 | return status; | 479 | return status; |
| 480 | } | 480 | } |
| 481 | } | 481 | } |
| @@ -684,7 +684,7 @@ bail: | |||
| 684 | return status; | 684 | return status; |
| 685 | } | 685 | } |
| 686 | 686 | ||
| 687 | /* | 687 | /* |
| 688 | * Serialize with orphan dir recovery. If the process doing | 688 | * Serialize with orphan dir recovery. If the process doing |
| 689 | * recovery on this orphan dir does an iget() with the dir | 689 | * recovery on this orphan dir does an iget() with the dir |
| 690 | * i_mutex held, we'll deadlock here. Instead we detect this | 690 | * i_mutex held, we'll deadlock here. Instead we detect this |
diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c index 31fbb0619510..7d9d9c132cef 100644 --- a/fs/ocfs2/ioctl.c +++ b/fs/ocfs2/ioctl.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #include <linux/fs.h> | 8 | #include <linux/fs.h> |
| 9 | #include <linux/mount.h> | 9 | #include <linux/mount.h> |
| 10 | #include <linux/compat.h> | ||
| 10 | 11 | ||
| 11 | #define MLOG_MASK_PREFIX ML_INODE | 12 | #define MLOG_MASK_PREFIX ML_INODE |
| 12 | #include <cluster/masklog.h> | 13 | #include <cluster/masklog.h> |
| @@ -181,6 +182,10 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 181 | #ifdef CONFIG_COMPAT | 182 | #ifdef CONFIG_COMPAT |
| 182 | long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg) | 183 | long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg) |
| 183 | { | 184 | { |
| 185 | bool preserve; | ||
| 186 | struct reflink_arguments args; | ||
| 187 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 188 | |||
| 184 | switch (cmd) { | 189 | switch (cmd) { |
| 185 | case OCFS2_IOC32_GETFLAGS: | 190 | case OCFS2_IOC32_GETFLAGS: |
| 186 | cmd = OCFS2_IOC_GETFLAGS; | 191 | cmd = OCFS2_IOC_GETFLAGS; |
| @@ -195,8 +200,15 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
| 195 | case OCFS2_IOC_GROUP_EXTEND: | 200 | case OCFS2_IOC_GROUP_EXTEND: |
| 196 | case OCFS2_IOC_GROUP_ADD: | 201 | case OCFS2_IOC_GROUP_ADD: |
| 197 | case OCFS2_IOC_GROUP_ADD64: | 202 | case OCFS2_IOC_GROUP_ADD64: |
| 198 | case OCFS2_IOC_REFLINK: | ||
| 199 | break; | 203 | break; |
| 204 | case OCFS2_IOC_REFLINK: | ||
| 205 | if (copy_from_user(&args, (struct reflink_arguments *)arg, | ||
| 206 | sizeof(args))) | ||
| 207 | return -EFAULT; | ||
| 208 | preserve = (args.preserve != 0); | ||
| 209 | |||
| 210 | return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path), | ||
| 211 | compat_ptr(args.new_path), preserve); | ||
| 200 | default: | 212 | default: |
| 201 | return -ENOIOCTLCMD; | 213 | return -ENOIOCTLCMD; |
| 202 | } | 214 | } |
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index bf34c491ae96..9336c60e3a36 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
| @@ -2034,7 +2034,7 @@ static int ocfs2_queue_orphans(struct ocfs2_super *osb, | |||
| 2034 | status = -ENOENT; | 2034 | status = -ENOENT; |
| 2035 | mlog_errno(status); | 2035 | mlog_errno(status); |
| 2036 | return status; | 2036 | return status; |
| 2037 | } | 2037 | } |
| 2038 | 2038 | ||
| 2039 | mutex_lock(&orphan_dir_inode->i_mutex); | 2039 | mutex_lock(&orphan_dir_inode->i_mutex); |
| 2040 | status = ocfs2_inode_lock(orphan_dir_inode, NULL, 0); | 2040 | status = ocfs2_inode_lock(orphan_dir_inode, NULL, 0); |
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index 9362eea7424b..740f448041e2 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
| @@ -136,6 +136,10 @@ enum ocfs2_unlock_action { | |||
| 136 | #define OCFS2_LOCK_PENDING (0x00000400) /* This lockres is pending a | 136 | #define OCFS2_LOCK_PENDING (0x00000400) /* This lockres is pending a |
| 137 | call to dlm_lock. Only | 137 | call to dlm_lock. Only |
| 138 | exists with BUSY set. */ | 138 | exists with BUSY set. */ |
| 139 | #define OCFS2_LOCK_UPCONVERT_FINISHING (0x00000800) /* blocks the dc thread | ||
| 140 | * from downconverting | ||
| 141 | * before the upconvert | ||
| 142 | * has completed */ | ||
| 139 | 143 | ||
| 140 | struct ocfs2_lock_res_ops; | 144 | struct ocfs2_lock_res_ops; |
| 141 | 145 | ||
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index 1a1a679e51b5..7638a38c32bc 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h | |||
| @@ -1417,9 +1417,16 @@ static inline int ocfs2_fast_symlink_chars(int blocksize) | |||
| 1417 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink); | 1417 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink); |
| 1418 | } | 1418 | } |
| 1419 | 1419 | ||
| 1420 | static inline int ocfs2_max_inline_data(int blocksize) | 1420 | static inline int ocfs2_max_inline_data_with_xattr(int blocksize, |
| 1421 | struct ocfs2_dinode *di) | ||
| 1421 | { | 1422 | { |
| 1422 | return blocksize - offsetof(struct ocfs2_dinode, id2.i_data.id_data); | 1423 | if (di && (di->i_dyn_features & OCFS2_INLINE_XATTR_FL)) |
| 1424 | return blocksize - | ||
| 1425 | offsetof(struct ocfs2_dinode, id2.i_data.id_data) - | ||
| 1426 | di->i_xattr_inline_size; | ||
| 1427 | else | ||
| 1428 | return blocksize - | ||
| 1429 | offsetof(struct ocfs2_dinode, id2.i_data.id_data); | ||
| 1423 | } | 1430 | } |
| 1424 | 1431 | ||
| 1425 | static inline int ocfs2_extent_recs_per_inode(int blocksize) | 1432 | static inline int ocfs2_extent_recs_per_inode(int blocksize) |
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 74db2be75dd6..8ae65c9c020c 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
| @@ -2945,7 +2945,7 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle, | |||
| 2945 | 2945 | ||
| 2946 | while (offset < end) { | 2946 | while (offset < end) { |
| 2947 | page_index = offset >> PAGE_CACHE_SHIFT; | 2947 | page_index = offset >> PAGE_CACHE_SHIFT; |
| 2948 | map_end = (page_index + 1) << PAGE_CACHE_SHIFT; | 2948 | map_end = ((loff_t)page_index + 1) << PAGE_CACHE_SHIFT; |
| 2949 | if (map_end > end) | 2949 | if (map_end > end) |
| 2950 | map_end = end; | 2950 | map_end = end; |
| 2951 | 2951 | ||
| @@ -2957,8 +2957,12 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle, | |||
| 2957 | 2957 | ||
| 2958 | page = grab_cache_page(mapping, page_index); | 2958 | page = grab_cache_page(mapping, page_index); |
| 2959 | 2959 | ||
| 2960 | /* This page can't be dirtied before we CoW it out. */ | 2960 | /* |
| 2961 | BUG_ON(PageDirty(page)); | 2961 | * In case PAGE_CACHE_SIZE <= CLUSTER_SIZE, This page |
| 2962 | * can't be dirtied before we CoW it out. | ||
| 2963 | */ | ||
| 2964 | if (PAGE_CACHE_SIZE <= OCFS2_SB(sb)->s_clustersize) | ||
| 2965 | BUG_ON(PageDirty(page)); | ||
| 2962 | 2966 | ||
| 2963 | if (!PageUptodate(page)) { | 2967 | if (!PageUptodate(page)) { |
| 2964 | ret = block_read_full_page(page, ocfs2_get_block); | 2968 | ret = block_read_full_page(page, ocfs2_get_block); |
| @@ -3170,7 +3174,7 @@ static int ocfs2_cow_sync_writeback(struct super_block *sb, | |||
| 3170 | 3174 | ||
| 3171 | while (offset < end) { | 3175 | while (offset < end) { |
| 3172 | page_index = offset >> PAGE_CACHE_SHIFT; | 3176 | page_index = offset >> PAGE_CACHE_SHIFT; |
| 3173 | map_end = (page_index + 1) << PAGE_CACHE_SHIFT; | 3177 | map_end = ((loff_t)page_index + 1) << PAGE_CACHE_SHIFT; |
| 3174 | if (map_end > end) | 3178 | if (map_end > end) |
| 3175 | map_end = end; | 3179 | map_end = end; |
| 3176 | 3180 | ||
diff --git a/fs/ocfs2/stack_o2cb.c b/fs/ocfs2/stack_o2cb.c index e49c41050264..3038c92af493 100644 --- a/fs/ocfs2/stack_o2cb.c +++ b/fs/ocfs2/stack_o2cb.c | |||
| @@ -277,7 +277,7 @@ static int o2cb_cluster_connect(struct ocfs2_cluster_connection *conn) | |||
| 277 | u32 dlm_key; | 277 | u32 dlm_key; |
| 278 | struct dlm_ctxt *dlm; | 278 | struct dlm_ctxt *dlm; |
| 279 | struct o2dlm_private *priv; | 279 | struct o2dlm_private *priv; |
| 280 | struct dlm_protocol_version dlm_version; | 280 | struct dlm_protocol_version fs_version; |
| 281 | 281 | ||
| 282 | BUG_ON(conn == NULL); | 282 | BUG_ON(conn == NULL); |
| 283 | BUG_ON(o2cb_stack.sp_proto == NULL); | 283 | BUG_ON(o2cb_stack.sp_proto == NULL); |
| @@ -304,18 +304,18 @@ static int o2cb_cluster_connect(struct ocfs2_cluster_connection *conn) | |||
| 304 | /* used by the dlm code to make message headers unique, each | 304 | /* used by the dlm code to make message headers unique, each |
| 305 | * node in this domain must agree on this. */ | 305 | * node in this domain must agree on this. */ |
| 306 | dlm_key = crc32_le(0, conn->cc_name, conn->cc_namelen); | 306 | dlm_key = crc32_le(0, conn->cc_name, conn->cc_namelen); |
| 307 | dlm_version.pv_major = conn->cc_version.pv_major; | 307 | fs_version.pv_major = conn->cc_version.pv_major; |
| 308 | dlm_version.pv_minor = conn->cc_version.pv_minor; | 308 | fs_version.pv_minor = conn->cc_version.pv_minor; |
| 309 | 309 | ||
| 310 | dlm = dlm_register_domain(conn->cc_name, dlm_key, &dlm_version); | 310 | dlm = dlm_register_domain(conn->cc_name, dlm_key, &fs_version); |
| 311 | if (IS_ERR(dlm)) { | 311 | if (IS_ERR(dlm)) { |
| 312 | rc = PTR_ERR(dlm); | 312 | rc = PTR_ERR(dlm); |
| 313 | mlog_errno(rc); | 313 | mlog_errno(rc); |
| 314 | goto out_free; | 314 | goto out_free; |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | conn->cc_version.pv_major = dlm_version.pv_major; | 317 | conn->cc_version.pv_major = fs_version.pv_major; |
| 318 | conn->cc_version.pv_minor = dlm_version.pv_minor; | 318 | conn->cc_version.pv_minor = fs_version.pv_minor; |
| 319 | conn->cc_lockspace = dlm; | 319 | conn->cc_lockspace = dlm; |
| 320 | 320 | ||
| 321 | dlm_register_eviction_cb(dlm, &priv->op_eviction_cb); | 321 | dlm_register_eviction_cb(dlm, &priv->op_eviction_cb); |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 26069917a9f5..755cd49a5ef3 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -1062,7 +1062,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1062 | "file system, but write access is " | 1062 | "file system, but write access is " |
| 1063 | "unavailable.\n"); | 1063 | "unavailable.\n"); |
| 1064 | else | 1064 | else |
| 1065 | mlog_errno(status); | 1065 | mlog_errno(status); |
| 1066 | goto read_super_error; | 1066 | goto read_super_error; |
| 1067 | } | 1067 | } |
| 1068 | 1068 | ||
diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c index 49b133ccbf11..32499d213fc4 100644 --- a/fs/ocfs2/symlink.c +++ b/fs/ocfs2/symlink.c | |||
| @@ -137,20 +137,20 @@ static void *ocfs2_fast_follow_link(struct dentry *dentry, | |||
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | memcpy(link, target, len); | 139 | memcpy(link, target, len); |
| 140 | nd_set_link(nd, link); | ||
| 141 | 140 | ||
| 142 | bail: | 141 | bail: |
| 142 | nd_set_link(nd, status ? ERR_PTR(status) : link); | ||
| 143 | brelse(bh); | 143 | brelse(bh); |
| 144 | 144 | ||
| 145 | mlog_exit(status); | 145 | mlog_exit(status); |
| 146 | return status ? ERR_PTR(status) : link; | 146 | return NULL; |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | static void ocfs2_fast_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) | 149 | static void ocfs2_fast_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) |
| 150 | { | 150 | { |
| 151 | char *link = cookie; | 151 | char *link = nd_get_link(nd); |
| 152 | 152 | if (!IS_ERR(link)) | |
| 153 | kfree(link); | 153 | kfree(link); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | const struct inode_operations ocfs2_symlink_inode_operations = { | 156 | const struct inode_operations ocfs2_symlink_inode_operations = { |
diff --git a/fs/ocfs2/uptodate.c b/fs/ocfs2/uptodate.c index c61369342a27..a0a120e82b97 100644 --- a/fs/ocfs2/uptodate.c +++ b/fs/ocfs2/uptodate.c | |||
| @@ -267,8 +267,8 @@ static int ocfs2_buffer_cached(struct ocfs2_caching_info *ci, | |||
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | /* Warning: even if it returns true, this does *not* guarantee that | 269 | /* Warning: even if it returns true, this does *not* guarantee that |
| 270 | * the block is stored in our inode metadata cache. | 270 | * the block is stored in our inode metadata cache. |
| 271 | * | 271 | * |
| 272 | * This can be called under lock_buffer() | 272 | * This can be called under lock_buffer() |
| 273 | */ | 273 | */ |
| 274 | int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci, | 274 | int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci, |
diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h index 1e67c441ea82..f745948b61e4 100644 --- a/include/drm/nouveau_drm.h +++ b/include/drm/nouveau_drm.h | |||
| @@ -77,6 +77,7 @@ struct drm_nouveau_gpuobj_free { | |||
| 77 | #define NOUVEAU_GETPARAM_PCI_PHYSICAL 10 | 77 | #define NOUVEAU_GETPARAM_PCI_PHYSICAL 10 |
| 78 | #define NOUVEAU_GETPARAM_CHIPSET_ID 11 | 78 | #define NOUVEAU_GETPARAM_CHIPSET_ID 11 |
| 79 | #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 | 79 | #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 |
| 80 | #define NOUVEAU_GETPARAM_GRAPH_UNITS 13 | ||
| 80 | struct drm_nouveau_getparam { | 81 | struct drm_nouveau_getparam { |
| 81 | uint64_t param; | 82 | uint64_t param; |
| 82 | uint64_t value; | 83 | uint64_t value; |
diff --git a/include/drm/vmwgfx_drm.h b/include/drm/vmwgfx_drm.h index 2be7e1249b6f..c7645f480d12 100644 --- a/include/drm/vmwgfx_drm.h +++ b/include/drm/vmwgfx_drm.h | |||
| @@ -68,7 +68,8 @@ | |||
| 68 | #define DRM_VMW_PARAM_NUM_FREE_STREAMS 1 | 68 | #define DRM_VMW_PARAM_NUM_FREE_STREAMS 1 |
| 69 | #define DRM_VMW_PARAM_3D 2 | 69 | #define DRM_VMW_PARAM_3D 2 |
| 70 | #define DRM_VMW_PARAM_FIFO_OFFSET 3 | 70 | #define DRM_VMW_PARAM_FIFO_OFFSET 3 |
| 71 | 71 | #define DRM_VMW_PARAM_HW_CAPS 4 | |
| 72 | #define DRM_VMW_PARAM_FIFO_CAPS 5 | ||
| 72 | 73 | ||
| 73 | /** | 74 | /** |
| 74 | * struct drm_vmw_getparam_arg | 75 | * struct drm_vmw_getparam_arg |
| @@ -181,6 +182,8 @@ struct drm_vmw_context_arg { | |||
| 181 | * The size of the array should equal the total number of mipmap levels. | 182 | * The size of the array should equal the total number of mipmap levels. |
| 182 | * @shareable: Boolean whether other clients (as identified by file descriptors) | 183 | * @shareable: Boolean whether other clients (as identified by file descriptors) |
| 183 | * may reference this surface. | 184 | * may reference this surface. |
| 185 | * @scanout: Boolean whether the surface is intended to be used as a | ||
| 186 | * scanout. | ||
| 184 | * | 187 | * |
| 185 | * Input data to the DRM_VMW_CREATE_SURFACE Ioctl. | 188 | * Input data to the DRM_VMW_CREATE_SURFACE Ioctl. |
| 186 | * Output data from the DRM_VMW_REF_SURFACE Ioctl. | 189 | * Output data from the DRM_VMW_REF_SURFACE Ioctl. |
| @@ -192,7 +195,7 @@ struct drm_vmw_surface_create_req { | |||
| 192 | uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; | 195 | uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; |
| 193 | uint64_t size_addr; | 196 | uint64_t size_addr; |
| 194 | int32_t shareable; | 197 | int32_t shareable; |
| 195 | uint32_t pad64; | 198 | int32_t scanout; |
| 196 | }; | 199 | }; |
| 197 | 200 | ||
| 198 | /** | 201 | /** |
| @@ -295,17 +298,28 @@ union drm_vmw_surface_reference_arg { | |||
| 295 | * | 298 | * |
| 296 | * @commands: User-space address of a command buffer cast to an uint64_t. | 299 | * @commands: User-space address of a command buffer cast to an uint64_t. |
| 297 | * @command-size: Size in bytes of the command buffer. | 300 | * @command-size: Size in bytes of the command buffer. |
| 301 | * @throttle-us: Sleep until software is less than @throttle_us | ||
| 302 | * microseconds ahead of hardware. The driver may round this value | ||
| 303 | * to the nearest kernel tick. | ||
| 298 | * @fence_rep: User-space address of a struct drm_vmw_fence_rep cast to an | 304 | * @fence_rep: User-space address of a struct drm_vmw_fence_rep cast to an |
| 299 | * uint64_t. | 305 | * uint64_t. |
| 306 | * @version: Allows expanding the execbuf ioctl parameters without breaking | ||
| 307 | * backwards compatibility, since user-space will always tell the kernel | ||
| 308 | * which version it uses. | ||
| 309 | * @flags: Execbuf flags. None currently. | ||
| 300 | * | 310 | * |
| 301 | * Argument to the DRM_VMW_EXECBUF Ioctl. | 311 | * Argument to the DRM_VMW_EXECBUF Ioctl. |
| 302 | */ | 312 | */ |
| 303 | 313 | ||
| 314 | #define DRM_VMW_EXECBUF_VERSION 0 | ||
| 315 | |||
| 304 | struct drm_vmw_execbuf_arg { | 316 | struct drm_vmw_execbuf_arg { |
| 305 | uint64_t commands; | 317 | uint64_t commands; |
| 306 | uint32_t command_size; | 318 | uint32_t command_size; |
| 307 | uint32_t pad64; | 319 | uint32_t throttle_us; |
| 308 | uint64_t fence_rep; | 320 | uint64_t fence_rep; |
| 321 | uint32_t version; | ||
| 322 | uint32_t flags; | ||
| 309 | }; | 323 | }; |
| 310 | 324 | ||
| 311 | /** | 325 | /** |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 38a6948ce0c2..20f31567ccee 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -647,9 +647,9 @@ static inline int ata_id_has_large_logical_sectors(const u16 *id) | |||
| 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); |
| 648 | } | 648 | } |
| 649 | 649 | ||
| 650 | static inline u8 ata_id_logical_per_physical_sectors(const u16 *id) | 650 | static inline u16 ata_id_logical_per_physical_sectors(const u16 *id) |
| 651 | { | 651 | { |
| 652 | return id[ATA_ID_SECTOR_SIZE] & 0xf; | 652 | return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf); |
| 653 | } | 653 | } |
| 654 | 654 | ||
| 655 | static inline int ata_id_has_lba48(const u16 *id) | 655 | static inline int ata_id_has_lba48(const u16 *id) |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 5be3dab4a695..188fcae10a99 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | # define __acquire(x) __context__(x,1) | 15 | # define __acquire(x) __context__(x,1) |
| 16 | # define __release(x) __context__(x,-1) | 16 | # define __release(x) __context__(x,-1) |
| 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) | 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) |
| 18 | # define __percpu __attribute__((noderef, address_space(3))) | ||
| 18 | extern void __chk_user_ptr(const volatile void __user *); | 19 | extern void __chk_user_ptr(const volatile void __user *); |
| 19 | extern void __chk_io_ptr(const volatile void __iomem *); | 20 | extern void __chk_io_ptr(const volatile void __iomem *); |
| 20 | #else | 21 | #else |
| @@ -32,6 +33,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); | |||
| 32 | # define __acquire(x) (void)0 | 33 | # define __acquire(x) (void)0 |
| 33 | # define __release(x) (void)0 | 34 | # define __release(x) (void)0 |
| 34 | # define __cond_lock(x,c) (c) | 35 | # define __cond_lock(x,c) (c) |
| 36 | # define __percpu | ||
| 35 | #endif | 37 | #endif |
| 36 | 38 | ||
| 37 | #ifdef __KERNEL__ | 39 | #ifdef __KERNEL__ |
diff --git a/include/linux/connector.h b/include/linux/connector.h index 72ba63eb83c5..3a779ffba60b 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h | |||
| @@ -24,9 +24,6 @@ | |||
| 24 | 24 | ||
| 25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 26 | 26 | ||
| 27 | #define CN_IDX_CONNECTOR 0xffffffff | ||
| 28 | #define CN_VAL_CONNECTOR 0xffffffff | ||
| 29 | |||
| 30 | /* | 27 | /* |
| 31 | * Process Events connector unique ids -- used for message routing | 28 | * Process Events connector unique ids -- used for message routing |
| 32 | */ | 29 | */ |
| @@ -75,30 +72,6 @@ struct cn_msg { | |||
| 75 | __u8 data[0]; | 72 | __u8 data[0]; |
| 76 | }; | 73 | }; |
| 77 | 74 | ||
| 78 | /* | ||
| 79 | * Notify structure - requests notification about | ||
| 80 | * registering/unregistering idx/val in range [first, first+range]. | ||
| 81 | */ | ||
| 82 | struct cn_notify_req { | ||
| 83 | __u32 first; | ||
| 84 | __u32 range; | ||
| 85 | }; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * Main notification control message | ||
| 89 | * *_notify_num - number of appropriate cn_notify_req structures after | ||
| 90 | * this struct. | ||
| 91 | * group - notification receiver's idx. | ||
| 92 | * len - total length of the attached data. | ||
| 93 | */ | ||
| 94 | struct cn_ctl_msg { | ||
| 95 | __u32 idx_notify_num; | ||
| 96 | __u32 val_notify_num; | ||
| 97 | __u32 group; | ||
| 98 | __u32 len; | ||
| 99 | __u8 data[0]; | ||
| 100 | }; | ||
| 101 | |||
| 102 | #ifdef __KERNEL__ | 75 | #ifdef __KERNEL__ |
| 103 | 76 | ||
| 104 | #include <asm/atomic.h> | 77 | #include <asm/atomic.h> |
| @@ -151,11 +124,6 @@ struct cn_callback_entry { | |||
| 151 | u32 seq, group; | 124 | u32 seq, group; |
| 152 | }; | 125 | }; |
| 153 | 126 | ||
| 154 | struct cn_ctl_entry { | ||
| 155 | struct list_head notify_entry; | ||
| 156 | struct cn_ctl_msg *msg; | ||
| 157 | }; | ||
| 158 | |||
| 159 | struct cn_dev { | 127 | struct cn_dev { |
| 160 | struct cb_id id; | 128 | struct cb_id id; |
| 161 | 129 | ||
diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index 070ba0621738..5977b724f7c6 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h | |||
| @@ -44,7 +44,7 @@ static inline int hw_breakpoint_type(struct perf_event *bp) | |||
| 44 | return bp->attr.bp_type; | 44 | return bp->attr.bp_type; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline int hw_breakpoint_len(struct perf_event *bp) | 47 | static inline unsigned long hw_breakpoint_len(struct perf_event *bp) |
| 48 | { | 48 | { |
| 49 | return bp->attr.bp_len; | 49 | return bp->attr.bp_len; |
| 50 | } | 50 | } |
diff --git a/include/linux/ima.h b/include/linux/ima.h index 99dc6d5cf7e5..975837e7d6c0 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h | |||
| @@ -17,7 +17,7 @@ struct linux_binprm; | |||
| 17 | extern int ima_bprm_check(struct linux_binprm *bprm); | 17 | extern int ima_bprm_check(struct linux_binprm *bprm); |
| 18 | extern int ima_inode_alloc(struct inode *inode); | 18 | extern int ima_inode_alloc(struct inode *inode); |
| 19 | extern void ima_inode_free(struct inode *inode); | 19 | extern void ima_inode_free(struct inode *inode); |
| 20 | extern int ima_path_check(struct path *path, int mask); | 20 | extern int ima_file_check(struct file *file, int mask); |
| 21 | extern void ima_file_free(struct file *file); | 21 | extern void ima_file_free(struct file *file); |
| 22 | extern int ima_file_mmap(struct file *file, unsigned long prot); | 22 | extern int ima_file_mmap(struct file *file, unsigned long prot); |
| 23 | extern void ima_counts_get(struct file *file); | 23 | extern void ima_counts_get(struct file *file); |
| @@ -38,7 +38,7 @@ static inline void ima_inode_free(struct inode *inode) | |||
| 38 | return; | 38 | return; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static inline int ima_path_check(struct path *path, int mask) | 41 | static inline int ima_file_check(struct file *file, int mask) |
| 42 | { | 42 | { |
| 43 | return 0; | 43 | return 0; |
| 44 | } | 44 | } |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 8fa71874113f..a177698d95e2 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -211,11 +211,9 @@ struct perf_event_attr { | |||
| 211 | __u32 wakeup_watermark; /* bytes before wakeup */ | 211 | __u32 wakeup_watermark; /* bytes before wakeup */ |
| 212 | }; | 212 | }; |
| 213 | 213 | ||
| 214 | __u32 __reserved_2; | ||
| 215 | |||
| 216 | __u64 bp_addr; | ||
| 217 | __u32 bp_type; | 214 | __u32 bp_type; |
| 218 | __u32 bp_len; | 215 | __u64 bp_addr; |
| 216 | __u64 bp_len; | ||
| 219 | }; | 217 | }; |
| 220 | 218 | ||
| 221 | /* | 219 | /* |
diff --git a/include/linux/sched.h b/include/linux/sched.h index abdfacc58653..78efe7c485ac 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -310,6 +310,7 @@ extern void sched_show_task(struct task_struct *p); | |||
| 310 | #ifdef CONFIG_DETECT_SOFTLOCKUP | 310 | #ifdef CONFIG_DETECT_SOFTLOCKUP |
| 311 | extern void softlockup_tick(void); | 311 | extern void softlockup_tick(void); |
| 312 | extern void touch_softlockup_watchdog(void); | 312 | extern void touch_softlockup_watchdog(void); |
| 313 | extern void touch_softlockup_watchdog_sync(void); | ||
| 313 | extern void touch_all_softlockup_watchdogs(void); | 314 | extern void touch_all_softlockup_watchdogs(void); |
| 314 | extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write, | 315 | extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write, |
| 315 | void __user *buffer, | 316 | void __user *buffer, |
| @@ -323,6 +324,9 @@ static inline void softlockup_tick(void) | |||
| 323 | static inline void touch_softlockup_watchdog(void) | 324 | static inline void touch_softlockup_watchdog(void) |
| 324 | { | 325 | { |
| 325 | } | 326 | } |
| 327 | static inline void touch_softlockup_watchdog_sync(void) | ||
| 328 | { | ||
| 329 | } | ||
| 326 | static inline void touch_all_softlockup_watchdogs(void) | 330 | static inline void touch_all_softlockup_watchdogs(void) |
| 327 | { | 331 | { |
| 328 | } | 332 | } |
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h index ba1ba0c5efd1..63d449807d9b 100644 --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h | |||
| @@ -11,6 +11,8 @@ struct nf_conntrack_ecache; | |||
| 11 | struct netns_ct { | 11 | struct netns_ct { |
| 12 | atomic_t count; | 12 | atomic_t count; |
| 13 | unsigned int expect_count; | 13 | unsigned int expect_count; |
| 14 | unsigned int htable_size; | ||
| 15 | struct kmem_cache *nf_conntrack_cachep; | ||
| 14 | struct hlist_nulls_head *hash; | 16 | struct hlist_nulls_head *hash; |
| 15 | struct hlist_head *expect_hash; | 17 | struct hlist_head *expect_hash; |
| 16 | struct hlist_nulls_head unconfirmed; | 18 | struct hlist_nulls_head unconfirmed; |
| @@ -28,5 +30,6 @@ struct netns_ct { | |||
| 28 | #endif | 30 | #endif |
| 29 | int hash_vmalloc; | 31 | int hash_vmalloc; |
| 30 | int expect_vmalloc; | 32 | int expect_vmalloc; |
| 33 | char *slabname; | ||
| 31 | }; | 34 | }; |
| 32 | #endif | 35 | #endif |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 2eb3814d6258..9a4b8b714079 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -40,6 +40,7 @@ struct netns_ipv4 { | |||
| 40 | struct xt_table *iptable_security; | 40 | struct xt_table *iptable_security; |
| 41 | struct xt_table *nat_table; | 41 | struct xt_table *nat_table; |
| 42 | struct hlist_head *nat_bysource; | 42 | struct hlist_head *nat_bysource; |
| 43 | unsigned int nat_htable_size; | ||
| 43 | int nat_vmalloced; | 44 | int nat_vmalloced; |
| 44 | #endif | 45 | #endif |
| 45 | 46 | ||
diff --git a/init/main.c b/init/main.c index dac44a9356a5..4cb47a159f02 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -657,9 +657,9 @@ asmlinkage void __init start_kernel(void) | |||
| 657 | proc_caches_init(); | 657 | proc_caches_init(); |
| 658 | buffer_init(); | 658 | buffer_init(); |
| 659 | key_init(); | 659 | key_init(); |
| 660 | radix_tree_init(); | ||
| 660 | security_init(); | 661 | security_init(); |
| 661 | vfs_caches_init(totalram_pages); | 662 | vfs_caches_init(totalram_pages); |
| 662 | radix_tree_init(); | ||
| 663 | signals_init(); | 663 | signals_init(); |
| 664 | /* rootfs populating might need page-writeback */ | 664 | /* rootfs populating might need page-writeback */ |
| 665 | page_writeback_init(); | 665 | page_writeback_init(); |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 1fbcc748044a..aa3bee566446 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2936,14 +2936,17 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
| 2936 | 2936 | ||
| 2937 | for_each_subsys(root, ss) { | 2937 | for_each_subsys(root, ss) { |
| 2938 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); | 2938 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); |
| 2939 | |||
| 2939 | if (IS_ERR(css)) { | 2940 | if (IS_ERR(css)) { |
| 2940 | err = PTR_ERR(css); | 2941 | err = PTR_ERR(css); |
| 2941 | goto err_destroy; | 2942 | goto err_destroy; |
| 2942 | } | 2943 | } |
| 2943 | init_cgroup_css(css, ss, cgrp); | 2944 | init_cgroup_css(css, ss, cgrp); |
| 2944 | if (ss->use_id) | 2945 | if (ss->use_id) { |
| 2945 | if (alloc_css_id(ss, parent, cgrp)) | 2946 | err = alloc_css_id(ss, parent, cgrp); |
| 2947 | if (err) | ||
| 2946 | goto err_destroy; | 2948 | goto err_destroy; |
| 2949 | } | ||
| 2947 | /* At error, ->destroy() callback has to free assigned ID. */ | 2950 | /* At error, ->destroy() callback has to free assigned ID. */ |
| 2948 | } | 2951 | } |
| 2949 | 2952 | ||
diff --git a/kernel/cred.c b/kernel/cred.c index dd76cfe5f5b0..1ed8ca18790c 100644 --- a/kernel/cred.c +++ b/kernel/cred.c | |||
| @@ -224,7 +224,7 @@ struct cred *cred_alloc_blank(void) | |||
| 224 | #ifdef CONFIG_KEYS | 224 | #ifdef CONFIG_KEYS |
| 225 | new->tgcred = kzalloc(sizeof(*new->tgcred), GFP_KERNEL); | 225 | new->tgcred = kzalloc(sizeof(*new->tgcred), GFP_KERNEL); |
| 226 | if (!new->tgcred) { | 226 | if (!new->tgcred) { |
| 227 | kfree(new); | 227 | kmem_cache_free(cred_jar, new); |
| 228 | return NULL; | 228 | return NULL; |
| 229 | } | 229 | } |
| 230 | atomic_set(&new->tgcred->usage, 1); | 230 | atomic_set(&new->tgcred->usage, 1); |
diff --git a/kernel/futex.c b/kernel/futex.c index d9b3a2228f9d..e7a35f1039e7 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -530,8 +530,25 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, | |||
| 530 | return -EINVAL; | 530 | return -EINVAL; |
| 531 | 531 | ||
| 532 | WARN_ON(!atomic_read(&pi_state->refcount)); | 532 | WARN_ON(!atomic_read(&pi_state->refcount)); |
| 533 | WARN_ON(pid && pi_state->owner && | 533 | |
| 534 | pi_state->owner->pid != pid); | 534 | /* |
| 535 | * When pi_state->owner is NULL then the owner died | ||
| 536 | * and another waiter is on the fly. pi_state->owner | ||
| 537 | * is fixed up by the task which acquires | ||
| 538 | * pi_state->rt_mutex. | ||
| 539 | * | ||
| 540 | * We do not check for pid == 0 which can happen when | ||
| 541 | * the owner died and robust_list_exit() cleared the | ||
| 542 | * TID. | ||
| 543 | */ | ||
| 544 | if (pid && pi_state->owner) { | ||
| 545 | /* | ||
| 546 | * Bail out if user space manipulated the | ||
| 547 | * futex value. | ||
| 548 | */ | ||
| 549 | if (pid != task_pid_vnr(pi_state->owner)) | ||
| 550 | return -EINVAL; | ||
| 551 | } | ||
| 535 | 552 | ||
| 536 | atomic_inc(&pi_state->refcount); | 553 | atomic_inc(&pi_state->refcount); |
| 537 | *ps = pi_state; | 554 | *ps = pi_state; |
| @@ -758,6 +775,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
| 758 | if (!pi_state) | 775 | if (!pi_state) |
| 759 | return -EINVAL; | 776 | return -EINVAL; |
| 760 | 777 | ||
| 778 | /* | ||
| 779 | * If current does not own the pi_state then the futex is | ||
| 780 | * inconsistent and user space fiddled with the futex value. | ||
| 781 | */ | ||
| 782 | if (pi_state->owner != current) | ||
| 783 | return -EINVAL; | ||
| 784 | |||
| 761 | raw_spin_lock(&pi_state->pi_mutex.wait_lock); | 785 | raw_spin_lock(&pi_state->pi_mutex.wait_lock); |
| 762 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); | 786 | new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); |
| 763 | 787 | ||
| @@ -1971,7 +1995,7 @@ retry_private: | |||
| 1971 | /* Unqueue and drop the lock */ | 1995 | /* Unqueue and drop the lock */ |
| 1972 | unqueue_me_pi(&q); | 1996 | unqueue_me_pi(&q); |
| 1973 | 1997 | ||
| 1974 | goto out; | 1998 | goto out_put_key; |
| 1975 | 1999 | ||
| 1976 | out_unlock_put_key: | 2000 | out_unlock_put_key: |
| 1977 | queue_unlock(&q, hb); | 2001 | queue_unlock(&q, hb); |
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index 8a5c7d55ac9f..967e66143e11 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
| @@ -360,8 +360,8 @@ EXPORT_SYMBOL_GPL(register_user_hw_breakpoint); | |||
| 360 | int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr) | 360 | int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr) |
| 361 | { | 361 | { |
| 362 | u64 old_addr = bp->attr.bp_addr; | 362 | u64 old_addr = bp->attr.bp_addr; |
| 363 | u64 old_len = bp->attr.bp_len; | ||
| 363 | int old_type = bp->attr.bp_type; | 364 | int old_type = bp->attr.bp_type; |
| 364 | int old_len = bp->attr.bp_len; | ||
| 365 | int err = 0; | 365 | int err = 0; |
| 366 | 366 | ||
| 367 | perf_event_disable(bp); | 367 | perf_event_disable(bp); |
diff --git a/kernel/kfifo.c b/kernel/kfifo.c index 32c5c15d750d..498cabba225e 100644 --- a/kernel/kfifo.c +++ b/kernel/kfifo.c | |||
| @@ -349,6 +349,7 @@ EXPORT_SYMBOL(__kfifo_from_user_n); | |||
| 349 | * @fifo: the fifo to be used. | 349 | * @fifo: the fifo to be used. |
| 350 | * @from: pointer to the data to be added. | 350 | * @from: pointer to the data to be added. |
| 351 | * @len: the length of the data to be added. | 351 | * @len: the length of the data to be added. |
| 352 | * @total: the actual returned data length. | ||
| 352 | * | 353 | * |
| 353 | * This function copies at most @len bytes from the @from into the | 354 | * This function copies at most @len bytes from the @from into the |
| 354 | * FIFO depending and returns -EFAULT/0. | 355 | * FIFO depending and returns -EFAULT/0. |
| @@ -399,7 +400,7 @@ EXPORT_SYMBOL(__kfifo_to_user_n); | |||
| 399 | * @fifo: the fifo to be used. | 400 | * @fifo: the fifo to be used. |
| 400 | * @to: where the data must be copied. | 401 | * @to: where the data must be copied. |
| 401 | * @len: the size of the destination buffer. | 402 | * @len: the size of the destination buffer. |
| 402 | @ @lenout: pointer to output variable with copied data | 403 | * @lenout: pointer to output variable with copied data |
| 403 | * | 404 | * |
| 404 | * This function copies at most @len bytes from the FIFO into the | 405 | * This function copies at most @len bytes from the FIFO into the |
| 405 | * @to buffer and 0 or -EFAULT. | 406 | * @to buffer and 0 or -EFAULT. |
diff --git a/kernel/kgdb.c b/kernel/kgdb.c index c7ade62e4ef0..761fdd2b3034 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c | |||
| @@ -599,7 +599,7 @@ static void kgdb_wait(struct pt_regs *regs) | |||
| 599 | 599 | ||
| 600 | /* Signal the primary CPU that we are done: */ | 600 | /* Signal the primary CPU that we are done: */ |
| 601 | atomic_set(&cpu_in_kgdb[cpu], 0); | 601 | atomic_set(&cpu_in_kgdb[cpu], 0); |
| 602 | touch_softlockup_watchdog(); | 602 | touch_softlockup_watchdog_sync(); |
| 603 | clocksource_touch_watchdog(); | 603 | clocksource_touch_watchdog(); |
| 604 | local_irq_restore(flags); | 604 | local_irq_restore(flags); |
| 605 | } | 605 | } |
| @@ -1453,7 +1453,7 @@ acquirelock: | |||
| 1453 | (kgdb_info[cpu].task && | 1453 | (kgdb_info[cpu].task && |
| 1454 | kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) { | 1454 | kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) { |
| 1455 | atomic_set(&kgdb_active, -1); | 1455 | atomic_set(&kgdb_active, -1); |
| 1456 | touch_softlockup_watchdog(); | 1456 | touch_softlockup_watchdog_sync(); |
| 1457 | clocksource_touch_watchdog(); | 1457 | clocksource_touch_watchdog(); |
| 1458 | local_irq_restore(flags); | 1458 | local_irq_restore(flags); |
| 1459 | 1459 | ||
| @@ -1553,7 +1553,7 @@ kgdb_restore: | |||
| 1553 | } | 1553 | } |
| 1554 | /* Free kgdb_active */ | 1554 | /* Free kgdb_active */ |
| 1555 | atomic_set(&kgdb_active, -1); | 1555 | atomic_set(&kgdb_active, -1); |
| 1556 | touch_softlockup_watchdog(); | 1556 | touch_softlockup_watchdog_sync(); |
| 1557 | clocksource_touch_watchdog(); | 1557 | clocksource_touch_watchdog(); |
| 1558 | local_irq_restore(flags); | 1558 | local_irq_restore(flags); |
| 1559 | 1559 | ||
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index d27746bd3a06..2b19297742cb 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -4580,7 +4580,7 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr, | |||
| 4580 | if (attr->type >= PERF_TYPE_MAX) | 4580 | if (attr->type >= PERF_TYPE_MAX) |
| 4581 | return -EINVAL; | 4581 | return -EINVAL; |
| 4582 | 4582 | ||
| 4583 | if (attr->__reserved_1 || attr->__reserved_2) | 4583 | if (attr->__reserved_1) |
| 4584 | return -EINVAL; | 4584 | return -EINVAL; |
| 4585 | 4585 | ||
| 4586 | if (attr->sample_type & ~(PERF_SAMPLE_MAX-1)) | 4586 | if (attr->sample_type & ~(PERF_SAMPLE_MAX-1)) |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index d22579087e27..0d4c7898ab80 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
| @@ -25,6 +25,7 @@ static DEFINE_SPINLOCK(print_lock); | |||
| 25 | static DEFINE_PER_CPU(unsigned long, softlockup_touch_ts); /* touch timestamp */ | 25 | static DEFINE_PER_CPU(unsigned long, softlockup_touch_ts); /* touch timestamp */ |
| 26 | static DEFINE_PER_CPU(unsigned long, softlockup_print_ts); /* print timestamp */ | 26 | static DEFINE_PER_CPU(unsigned long, softlockup_print_ts); /* print timestamp */ |
| 27 | static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog); | 27 | static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog); |
| 28 | static DEFINE_PER_CPU(bool, softlock_touch_sync); | ||
| 28 | 29 | ||
| 29 | static int __read_mostly did_panic; | 30 | static int __read_mostly did_panic; |
| 30 | int __read_mostly softlockup_thresh = 60; | 31 | int __read_mostly softlockup_thresh = 60; |
| @@ -79,6 +80,12 @@ void touch_softlockup_watchdog(void) | |||
| 79 | } | 80 | } |
| 80 | EXPORT_SYMBOL(touch_softlockup_watchdog); | 81 | EXPORT_SYMBOL(touch_softlockup_watchdog); |
| 81 | 82 | ||
| 83 | void touch_softlockup_watchdog_sync(void) | ||
| 84 | { | ||
| 85 | __raw_get_cpu_var(softlock_touch_sync) = true; | ||
| 86 | __raw_get_cpu_var(softlockup_touch_ts) = 0; | ||
| 87 | } | ||
| 88 | |||
| 82 | void touch_all_softlockup_watchdogs(void) | 89 | void touch_all_softlockup_watchdogs(void) |
| 83 | { | 90 | { |
| 84 | int cpu; | 91 | int cpu; |
| @@ -118,6 +125,14 @@ void softlockup_tick(void) | |||
| 118 | } | 125 | } |
| 119 | 126 | ||
| 120 | if (touch_ts == 0) { | 127 | if (touch_ts == 0) { |
| 128 | if (unlikely(per_cpu(softlock_touch_sync, this_cpu))) { | ||
| 129 | /* | ||
| 130 | * If the time stamp was touched atomically | ||
| 131 | * make sure the scheduler tick is up to date. | ||
| 132 | */ | ||
| 133 | per_cpu(softlock_touch_sync, this_cpu) = false; | ||
| 134 | sched_clock_tick(); | ||
| 135 | } | ||
| 121 | __touch_softlockup_watchdog(); | 136 | __touch_softlockup_watchdog(); |
| 122 | return; | 137 | return; |
| 123 | } | 138 | } |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 7faaa32fbf4f..e2ab064c6d41 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -880,6 +880,7 @@ void getboottime(struct timespec *ts) | |||
| 880 | 880 | ||
| 881 | set_normalized_timespec(ts, -boottime.tv_sec, -boottime.tv_nsec); | 881 | set_normalized_timespec(ts, -boottime.tv_sec, -boottime.tv_nsec); |
| 882 | } | 882 | } |
| 883 | EXPORT_SYMBOL_GPL(getboottime); | ||
| 883 | 884 | ||
| 884 | /** | 885 | /** |
| 885 | * monotonic_to_bootbased - Convert the monotonic time to boot based. | 886 | * monotonic_to_bootbased - Convert the monotonic time to boot based. |
| @@ -889,6 +890,7 @@ void monotonic_to_bootbased(struct timespec *ts) | |||
| 889 | { | 890 | { |
| 890 | *ts = timespec_add_safe(*ts, total_sleep_time); | 891 | *ts = timespec_add_safe(*ts, total_sleep_time); |
| 891 | } | 892 | } |
| 893 | EXPORT_SYMBOL_GPL(monotonic_to_bootbased); | ||
| 892 | 894 | ||
| 893 | unsigned long get_seconds(void) | 895 | unsigned long get_seconds(void) |
| 894 | { | 896 | { |
diff --git a/mm/filemap.c b/mm/filemap.c index e3736923220e..698ea80f2102 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -2232,6 +2232,9 @@ again: | |||
| 2232 | if (unlikely(status)) | 2232 | if (unlikely(status)) |
| 2233 | break; | 2233 | break; |
| 2234 | 2234 | ||
| 2235 | if (mapping_writably_mapped(mapping)) | ||
| 2236 | flush_dcache_page(page); | ||
| 2237 | |||
| 2235 | pagefault_disable(); | 2238 | pagefault_disable(); |
| 2236 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); | 2239 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); |
| 2237 | pagefault_enable(); | 2240 | pagefault_enable(); |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index e91b81b63670..2d16fa6b8c2d 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -1515,10 +1515,9 @@ static struct attribute_group hstate_attr_group = { | |||
| 1515 | .attrs = hstate_attrs, | 1515 | .attrs = hstate_attrs, |
| 1516 | }; | 1516 | }; |
| 1517 | 1517 | ||
| 1518 | static int __init hugetlb_sysfs_add_hstate(struct hstate *h, | 1518 | static int hugetlb_sysfs_add_hstate(struct hstate *h, struct kobject *parent, |
| 1519 | struct kobject *parent, | 1519 | struct kobject **hstate_kobjs, |
| 1520 | struct kobject **hstate_kobjs, | 1520 | struct attribute_group *hstate_attr_group) |
| 1521 | struct attribute_group *hstate_attr_group) | ||
| 1522 | { | 1521 | { |
| 1523 | int retval; | 1522 | int retval; |
| 1524 | int hi = h - hstates; | 1523 | int hi = h - hstates; |
diff --git a/mm/migrate.c b/mm/migrate.c index efddbf0926b2..9a0db5bbabe4 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -912,6 +912,9 @@ static int do_pages_move(struct mm_struct *mm, struct task_struct *task, | |||
| 912 | goto out_pm; | 912 | goto out_pm; |
| 913 | 913 | ||
| 914 | err = -ENODEV; | 914 | err = -ENODEV; |
| 915 | if (node < 0 || node >= MAX_NUMNODES) | ||
| 916 | goto out_pm; | ||
| 917 | |||
| 915 | if (!node_state(node, N_HIGH_MEMORY)) | 918 | if (!node_state(node, N_HIGH_MEMORY)) |
| 916 | goto out_pm; | 919 | goto out_pm; |
| 917 | 920 | ||
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index d55d905463eb..ae007462b7f6 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -509,6 +509,9 @@ static unsigned long lazy_max_pages(void) | |||
| 509 | 509 | ||
| 510 | static atomic_t vmap_lazy_nr = ATOMIC_INIT(0); | 510 | static atomic_t vmap_lazy_nr = ATOMIC_INIT(0); |
| 511 | 511 | ||
| 512 | /* for per-CPU blocks */ | ||
| 513 | static void purge_fragmented_blocks_allcpus(void); | ||
| 514 | |||
| 512 | /* | 515 | /* |
| 513 | * Purges all lazily-freed vmap areas. | 516 | * Purges all lazily-freed vmap areas. |
| 514 | * | 517 | * |
| @@ -539,6 +542,9 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end, | |||
| 539 | } else | 542 | } else |
| 540 | spin_lock(&purge_lock); | 543 | spin_lock(&purge_lock); |
| 541 | 544 | ||
| 545 | if (sync) | ||
| 546 | purge_fragmented_blocks_allcpus(); | ||
| 547 | |||
| 542 | rcu_read_lock(); | 548 | rcu_read_lock(); |
| 543 | list_for_each_entry_rcu(va, &vmap_area_list, list) { | 549 | list_for_each_entry_rcu(va, &vmap_area_list, list) { |
| 544 | if (va->flags & VM_LAZY_FREE) { | 550 | if (va->flags & VM_LAZY_FREE) { |
| @@ -667,8 +673,6 @@ static bool vmap_initialized __read_mostly = false; | |||
| 667 | struct vmap_block_queue { | 673 | struct vmap_block_queue { |
| 668 | spinlock_t lock; | 674 | spinlock_t lock; |
| 669 | struct list_head free; | 675 | struct list_head free; |
| 670 | struct list_head dirty; | ||
| 671 | unsigned int nr_dirty; | ||
| 672 | }; | 676 | }; |
| 673 | 677 | ||
| 674 | struct vmap_block { | 678 | struct vmap_block { |
| @@ -678,10 +682,9 @@ struct vmap_block { | |||
| 678 | unsigned long free, dirty; | 682 | unsigned long free, dirty; |
| 679 | DECLARE_BITMAP(alloc_map, VMAP_BBMAP_BITS); | 683 | DECLARE_BITMAP(alloc_map, VMAP_BBMAP_BITS); |
| 680 | DECLARE_BITMAP(dirty_map, VMAP_BBMAP_BITS); | 684 | DECLARE_BITMAP(dirty_map, VMAP_BBMAP_BITS); |
| 681 | union { | 685 | struct list_head free_list; |
| 682 | struct list_head free_list; | 686 | struct rcu_head rcu_head; |
| 683 | struct rcu_head rcu_head; | 687 | struct list_head purge; |
| 684 | }; | ||
| 685 | }; | 688 | }; |
| 686 | 689 | ||
| 687 | /* Queue of free and dirty vmap blocks, for allocation and flushing purposes */ | 690 | /* Queue of free and dirty vmap blocks, for allocation and flushing purposes */ |
| @@ -757,7 +760,7 @@ static struct vmap_block *new_vmap_block(gfp_t gfp_mask) | |||
| 757 | vbq = &get_cpu_var(vmap_block_queue); | 760 | vbq = &get_cpu_var(vmap_block_queue); |
| 758 | vb->vbq = vbq; | 761 | vb->vbq = vbq; |
| 759 | spin_lock(&vbq->lock); | 762 | spin_lock(&vbq->lock); |
| 760 | list_add(&vb->free_list, &vbq->free); | 763 | list_add_rcu(&vb->free_list, &vbq->free); |
| 761 | spin_unlock(&vbq->lock); | 764 | spin_unlock(&vbq->lock); |
| 762 | put_cpu_var(vmap_block_queue); | 765 | put_cpu_var(vmap_block_queue); |
| 763 | 766 | ||
| @@ -776,8 +779,6 @@ static void free_vmap_block(struct vmap_block *vb) | |||
| 776 | struct vmap_block *tmp; | 779 | struct vmap_block *tmp; |
| 777 | unsigned long vb_idx; | 780 | unsigned long vb_idx; |
| 778 | 781 | ||
| 779 | BUG_ON(!list_empty(&vb->free_list)); | ||
| 780 | |||
| 781 | vb_idx = addr_to_vb_idx(vb->va->va_start); | 782 | vb_idx = addr_to_vb_idx(vb->va->va_start); |
| 782 | spin_lock(&vmap_block_tree_lock); | 783 | spin_lock(&vmap_block_tree_lock); |
| 783 | tmp = radix_tree_delete(&vmap_block_tree, vb_idx); | 784 | tmp = radix_tree_delete(&vmap_block_tree, vb_idx); |
| @@ -788,12 +789,61 @@ static void free_vmap_block(struct vmap_block *vb) | |||
| 788 | call_rcu(&vb->rcu_head, rcu_free_vb); | 789 | call_rcu(&vb->rcu_head, rcu_free_vb); |
| 789 | } | 790 | } |
| 790 | 791 | ||
| 792 | static void purge_fragmented_blocks(int cpu) | ||
| 793 | { | ||
| 794 | LIST_HEAD(purge); | ||
| 795 | struct vmap_block *vb; | ||
| 796 | struct vmap_block *n_vb; | ||
| 797 | struct vmap_block_queue *vbq = &per_cpu(vmap_block_queue, cpu); | ||
| 798 | |||
| 799 | rcu_read_lock(); | ||
| 800 | list_for_each_entry_rcu(vb, &vbq->free, free_list) { | ||
| 801 | |||
| 802 | if (!(vb->free + vb->dirty == VMAP_BBMAP_BITS && vb->dirty != VMAP_BBMAP_BITS)) | ||
| 803 | continue; | ||
| 804 | |||
| 805 | spin_lock(&vb->lock); | ||
| 806 | if (vb->free + vb->dirty == VMAP_BBMAP_BITS && vb->dirty != VMAP_BBMAP_BITS) { | ||
| 807 | vb->free = 0; /* prevent further allocs after releasing lock */ | ||
| 808 | vb->dirty = VMAP_BBMAP_BITS; /* prevent purging it again */ | ||
| 809 | bitmap_fill(vb->alloc_map, VMAP_BBMAP_BITS); | ||
| 810 | bitmap_fill(vb->dirty_map, VMAP_BBMAP_BITS); | ||
| 811 | spin_lock(&vbq->lock); | ||
| 812 | list_del_rcu(&vb->free_list); | ||
| 813 | spin_unlock(&vbq->lock); | ||
| 814 | spin_unlock(&vb->lock); | ||
| 815 | list_add_tail(&vb->purge, &purge); | ||
| 816 | } else | ||
| 817 | spin_unlock(&vb->lock); | ||
| 818 | } | ||
| 819 | rcu_read_unlock(); | ||
| 820 | |||
| 821 | list_for_each_entry_safe(vb, n_vb, &purge, purge) { | ||
| 822 | list_del(&vb->purge); | ||
| 823 | free_vmap_block(vb); | ||
| 824 | } | ||
| 825 | } | ||
| 826 | |||
| 827 | static void purge_fragmented_blocks_thiscpu(void) | ||
| 828 | { | ||
| 829 | purge_fragmented_blocks(smp_processor_id()); | ||
| 830 | } | ||
| 831 | |||
| 832 | static void purge_fragmented_blocks_allcpus(void) | ||
| 833 | { | ||
| 834 | int cpu; | ||
| 835 | |||
| 836 | for_each_possible_cpu(cpu) | ||
| 837 | purge_fragmented_blocks(cpu); | ||
| 838 | } | ||
| 839 | |||
| 791 | static void *vb_alloc(unsigned long size, gfp_t gfp_mask) | 840 | static void *vb_alloc(unsigned long size, gfp_t gfp_mask) |
| 792 | { | 841 | { |
| 793 | struct vmap_block_queue *vbq; | 842 | struct vmap_block_queue *vbq; |
| 794 | struct vmap_block *vb; | 843 | struct vmap_block *vb; |
| 795 | unsigned long addr = 0; | 844 | unsigned long addr = 0; |
| 796 | unsigned int order; | 845 | unsigned int order; |
| 846 | int purge = 0; | ||
| 797 | 847 | ||
| 798 | BUG_ON(size & ~PAGE_MASK); | 848 | BUG_ON(size & ~PAGE_MASK); |
| 799 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); | 849 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); |
| @@ -806,24 +856,38 @@ again: | |||
| 806 | int i; | 856 | int i; |
| 807 | 857 | ||
| 808 | spin_lock(&vb->lock); | 858 | spin_lock(&vb->lock); |
| 859 | if (vb->free < 1UL << order) | ||
| 860 | goto next; | ||
| 861 | |||
| 809 | i = bitmap_find_free_region(vb->alloc_map, | 862 | i = bitmap_find_free_region(vb->alloc_map, |
| 810 | VMAP_BBMAP_BITS, order); | 863 | VMAP_BBMAP_BITS, order); |
| 811 | 864 | ||
| 812 | if (i >= 0) { | 865 | if (i < 0) { |
| 813 | addr = vb->va->va_start + (i << PAGE_SHIFT); | 866 | if (vb->free + vb->dirty == VMAP_BBMAP_BITS) { |
| 814 | BUG_ON(addr_to_vb_idx(addr) != | 867 | /* fragmented and no outstanding allocations */ |
| 815 | addr_to_vb_idx(vb->va->va_start)); | 868 | BUG_ON(vb->dirty != VMAP_BBMAP_BITS); |
| 816 | vb->free -= 1UL << order; | 869 | purge = 1; |
| 817 | if (vb->free == 0) { | ||
| 818 | spin_lock(&vbq->lock); | ||
| 819 | list_del_init(&vb->free_list); | ||
| 820 | spin_unlock(&vbq->lock); | ||
| 821 | } | 870 | } |
| 822 | spin_unlock(&vb->lock); | 871 | goto next; |
| 823 | break; | ||
| 824 | } | 872 | } |
| 873 | addr = vb->va->va_start + (i << PAGE_SHIFT); | ||
| 874 | BUG_ON(addr_to_vb_idx(addr) != | ||
| 875 | addr_to_vb_idx(vb->va->va_start)); | ||
| 876 | vb->free -= 1UL << order; | ||
| 877 | if (vb->free == 0) { | ||
| 878 | spin_lock(&vbq->lock); | ||
| 879 | list_del_rcu(&vb->free_list); | ||
| 880 | spin_unlock(&vbq->lock); | ||
| 881 | } | ||
| 882 | spin_unlock(&vb->lock); | ||
| 883 | break; | ||
| 884 | next: | ||
| 825 | spin_unlock(&vb->lock); | 885 | spin_unlock(&vb->lock); |
| 826 | } | 886 | } |
| 887 | |||
| 888 | if (purge) | ||
| 889 | purge_fragmented_blocks_thiscpu(); | ||
| 890 | |||
| 827 | put_cpu_var(vmap_block_queue); | 891 | put_cpu_var(vmap_block_queue); |
| 828 | rcu_read_unlock(); | 892 | rcu_read_unlock(); |
| 829 | 893 | ||
| @@ -860,11 +924,11 @@ static void vb_free(const void *addr, unsigned long size) | |||
| 860 | BUG_ON(!vb); | 924 | BUG_ON(!vb); |
| 861 | 925 | ||
| 862 | spin_lock(&vb->lock); | 926 | spin_lock(&vb->lock); |
| 863 | bitmap_allocate_region(vb->dirty_map, offset >> PAGE_SHIFT, order); | 927 | BUG_ON(bitmap_allocate_region(vb->dirty_map, offset >> PAGE_SHIFT, order)); |
| 864 | 928 | ||
| 865 | vb->dirty += 1UL << order; | 929 | vb->dirty += 1UL << order; |
| 866 | if (vb->dirty == VMAP_BBMAP_BITS) { | 930 | if (vb->dirty == VMAP_BBMAP_BITS) { |
| 867 | BUG_ON(vb->free || !list_empty(&vb->free_list)); | 931 | BUG_ON(vb->free); |
| 868 | spin_unlock(&vb->lock); | 932 | spin_unlock(&vb->lock); |
| 869 | free_vmap_block(vb); | 933 | free_vmap_block(vb); |
| 870 | } else | 934 | } else |
| @@ -1033,8 +1097,6 @@ void __init vmalloc_init(void) | |||
| 1033 | vbq = &per_cpu(vmap_block_queue, i); | 1097 | vbq = &per_cpu(vmap_block_queue, i); |
| 1034 | spin_lock_init(&vbq->lock); | 1098 | spin_lock_init(&vbq->lock); |
| 1035 | INIT_LIST_HEAD(&vbq->free); | 1099 | INIT_LIST_HEAD(&vbq->free); |
| 1036 | INIT_LIST_HEAD(&vbq->dirty); | ||
| 1037 | vbq->nr_dirty = 0; | ||
| 1038 | } | 1100 | } |
| 1039 | 1101 | ||
| 1040 | /* Import existing vmlist entries. */ | 1102 | /* Import existing vmlist entries. */ |
diff --git a/net/9p/client.c b/net/9p/client.c index 8af95b2dddd6..09d4f1e2e4a8 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -69,7 +69,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); | |||
| 69 | 69 | ||
| 70 | static int parse_opts(char *opts, struct p9_client *clnt) | 70 | static int parse_opts(char *opts, struct p9_client *clnt) |
| 71 | { | 71 | { |
| 72 | char *options; | 72 | char *options, *tmp_options; |
| 73 | char *p; | 73 | char *p; |
| 74 | substring_t args[MAX_OPT_ARGS]; | 74 | substring_t args[MAX_OPT_ARGS]; |
| 75 | int option; | 75 | int option; |
| @@ -81,12 +81,13 @@ static int parse_opts(char *opts, struct p9_client *clnt) | |||
| 81 | if (!opts) | 81 | if (!opts) |
| 82 | return 0; | 82 | return 0; |
| 83 | 83 | ||
| 84 | options = kstrdup(opts, GFP_KERNEL); | 84 | tmp_options = kstrdup(opts, GFP_KERNEL); |
| 85 | if (!options) { | 85 | if (!tmp_options) { |
| 86 | P9_DPRINTK(P9_DEBUG_ERROR, | 86 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 87 | "failed to allocate copy of option string\n"); | 87 | "failed to allocate copy of option string\n"); |
| 88 | return -ENOMEM; | 88 | return -ENOMEM; |
| 89 | } | 89 | } |
| 90 | options = tmp_options; | ||
| 90 | 91 | ||
| 91 | while ((p = strsep(&options, ",")) != NULL) { | 92 | while ((p = strsep(&options, ",")) != NULL) { |
| 92 | int token; | 93 | int token; |
| @@ -108,6 +109,13 @@ static int parse_opts(char *opts, struct p9_client *clnt) | |||
| 108 | break; | 109 | break; |
| 109 | case Opt_trans: | 110 | case Opt_trans: |
| 110 | clnt->trans_mod = v9fs_get_trans_by_name(&args[0]); | 111 | clnt->trans_mod = v9fs_get_trans_by_name(&args[0]); |
| 112 | if(clnt->trans_mod == NULL) { | ||
| 113 | P9_DPRINTK(P9_DEBUG_ERROR, | ||
| 114 | "Could not find request transport: %s\n", | ||
| 115 | (char *) &args[0]); | ||
| 116 | ret = -EINVAL; | ||
| 117 | goto free_and_return; | ||
| 118 | } | ||
| 111 | break; | 119 | break; |
| 112 | case Opt_legacy: | 120 | case Opt_legacy: |
| 113 | clnt->dotu = 0; | 121 | clnt->dotu = 0; |
| @@ -117,7 +125,8 @@ static int parse_opts(char *opts, struct p9_client *clnt) | |||
| 117 | } | 125 | } |
| 118 | } | 126 | } |
| 119 | 127 | ||
| 120 | kfree(options); | 128 | free_and_return: |
| 129 | kfree(tmp_options); | ||
| 121 | return ret; | 130 | return ret; |
| 122 | } | 131 | } |
| 123 | 132 | ||
| @@ -667,18 +676,12 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) | |||
| 667 | clnt->trans = NULL; | 676 | clnt->trans = NULL; |
| 668 | spin_lock_init(&clnt->lock); | 677 | spin_lock_init(&clnt->lock); |
| 669 | INIT_LIST_HEAD(&clnt->fidlist); | 678 | INIT_LIST_HEAD(&clnt->fidlist); |
| 670 | clnt->fidpool = p9_idpool_create(); | ||
| 671 | if (IS_ERR(clnt->fidpool)) { | ||
| 672 | err = PTR_ERR(clnt->fidpool); | ||
| 673 | clnt->fidpool = NULL; | ||
| 674 | goto error; | ||
| 675 | } | ||
| 676 | 679 | ||
| 677 | p9_tag_init(clnt); | 680 | p9_tag_init(clnt); |
| 678 | 681 | ||
| 679 | err = parse_opts(options, clnt); | 682 | err = parse_opts(options, clnt); |
| 680 | if (err < 0) | 683 | if (err < 0) |
| 681 | goto error; | 684 | goto free_client; |
| 682 | 685 | ||
| 683 | if (!clnt->trans_mod) | 686 | if (!clnt->trans_mod) |
| 684 | clnt->trans_mod = v9fs_get_default_trans(); | 687 | clnt->trans_mod = v9fs_get_default_trans(); |
| @@ -687,7 +690,14 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) | |||
| 687 | err = -EPROTONOSUPPORT; | 690 | err = -EPROTONOSUPPORT; |
| 688 | P9_DPRINTK(P9_DEBUG_ERROR, | 691 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 689 | "No transport defined or default transport\n"); | 692 | "No transport defined or default transport\n"); |
| 690 | goto error; | 693 | goto free_client; |
| 694 | } | ||
| 695 | |||
| 696 | clnt->fidpool = p9_idpool_create(); | ||
| 697 | if (IS_ERR(clnt->fidpool)) { | ||
| 698 | err = PTR_ERR(clnt->fidpool); | ||
| 699 | clnt->fidpool = NULL; | ||
| 700 | goto put_trans; | ||
| 691 | } | 701 | } |
| 692 | 702 | ||
| 693 | P9_DPRINTK(P9_DEBUG_MUX, "clnt %p trans %p msize %d dotu %d\n", | 703 | P9_DPRINTK(P9_DEBUG_MUX, "clnt %p trans %p msize %d dotu %d\n", |
| @@ -695,19 +705,25 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) | |||
| 695 | 705 | ||
| 696 | err = clnt->trans_mod->create(clnt, dev_name, options); | 706 | err = clnt->trans_mod->create(clnt, dev_name, options); |
| 697 | if (err) | 707 | if (err) |
| 698 | goto error; | 708 | goto destroy_fidpool; |
| 699 | 709 | ||
| 700 | if ((clnt->msize+P9_IOHDRSZ) > clnt->trans_mod->maxsize) | 710 | if ((clnt->msize+P9_IOHDRSZ) > clnt->trans_mod->maxsize) |
| 701 | clnt->msize = clnt->trans_mod->maxsize-P9_IOHDRSZ; | 711 | clnt->msize = clnt->trans_mod->maxsize-P9_IOHDRSZ; |
| 702 | 712 | ||
| 703 | err = p9_client_version(clnt); | 713 | err = p9_client_version(clnt); |
| 704 | if (err) | 714 | if (err) |
| 705 | goto error; | 715 | goto close_trans; |
| 706 | 716 | ||
| 707 | return clnt; | 717 | return clnt; |
| 708 | 718 | ||
| 709 | error: | 719 | close_trans: |
| 710 | p9_client_destroy(clnt); | 720 | clnt->trans_mod->close(clnt); |
| 721 | destroy_fidpool: | ||
| 722 | p9_idpool_destroy(clnt->fidpool); | ||
| 723 | put_trans: | ||
| 724 | v9fs_put_trans(clnt->trans_mod); | ||
| 725 | free_client: | ||
| 726 | kfree(clnt); | ||
| 711 | return ERR_PTR(err); | 727 | return ERR_PTR(err); |
| 712 | } | 728 | } |
| 713 | EXPORT_SYMBOL(p9_client_create); | 729 | EXPORT_SYMBOL(p9_client_create); |
| @@ -1214,10 +1230,11 @@ static int p9_client_statsize(struct p9_wstat *wst, int optional) | |||
| 1214 | { | 1230 | { |
| 1215 | int ret; | 1231 | int ret; |
| 1216 | 1232 | ||
| 1233 | /* NOTE: size shouldn't include its own length */ | ||
| 1217 | /* size[2] type[2] dev[4] qid[13] */ | 1234 | /* size[2] type[2] dev[4] qid[13] */ |
| 1218 | /* mode[4] atime[4] mtime[4] length[8]*/ | 1235 | /* mode[4] atime[4] mtime[4] length[8]*/ |
| 1219 | /* name[s] uid[s] gid[s] muid[s] */ | 1236 | /* name[s] uid[s] gid[s] muid[s] */ |
| 1220 | ret = 2+2+4+13+4+4+4+8+2+2+2+2; | 1237 | ret = 2+4+13+4+4+4+8+2+2+2+2; |
| 1221 | 1238 | ||
| 1222 | if (wst->name) | 1239 | if (wst->name) |
| 1223 | ret += strlen(wst->name); | 1240 | ret += strlen(wst->name); |
| @@ -1258,7 +1275,7 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst) | |||
| 1258 | wst->name, wst->uid, wst->gid, wst->muid, wst->extension, | 1275 | wst->name, wst->uid, wst->gid, wst->muid, wst->extension, |
| 1259 | wst->n_uid, wst->n_gid, wst->n_muid); | 1276 | wst->n_uid, wst->n_gid, wst->n_muid); |
| 1260 | 1277 | ||
| 1261 | req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, wst->size, wst); | 1278 | req = p9_client_rpc(clnt, P9_TWSTAT, "dwS", fid->fid, wst->size+2, wst); |
| 1262 | if (IS_ERR(req)) { | 1279 | if (IS_ERR(req)) { |
| 1263 | err = PTR_ERR(req); | 1280 | err = PTR_ERR(req); |
| 1264 | goto error; | 1281 | goto error; |
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index be1cb909d8c0..31d0b05582a9 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c | |||
| @@ -714,7 +714,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts) | |||
| 714 | char *p; | 714 | char *p; |
| 715 | substring_t args[MAX_OPT_ARGS]; | 715 | substring_t args[MAX_OPT_ARGS]; |
| 716 | int option; | 716 | int option; |
| 717 | char *options; | 717 | char *options, *tmp_options; |
| 718 | int ret; | 718 | int ret; |
| 719 | 719 | ||
| 720 | opts->port = P9_PORT; | 720 | opts->port = P9_PORT; |
| @@ -724,12 +724,13 @@ static int parse_opts(char *params, struct p9_fd_opts *opts) | |||
| 724 | if (!params) | 724 | if (!params) |
| 725 | return 0; | 725 | return 0; |
| 726 | 726 | ||
| 727 | options = kstrdup(params, GFP_KERNEL); | 727 | tmp_options = kstrdup(params, GFP_KERNEL); |
| 728 | if (!options) { | 728 | if (!tmp_options) { |
| 729 | P9_DPRINTK(P9_DEBUG_ERROR, | 729 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 730 | "failed to allocate copy of option string\n"); | 730 | "failed to allocate copy of option string\n"); |
| 731 | return -ENOMEM; | 731 | return -ENOMEM; |
| 732 | } | 732 | } |
| 733 | options = tmp_options; | ||
| 733 | 734 | ||
| 734 | while ((p = strsep(&options, ",")) != NULL) { | 735 | while ((p = strsep(&options, ",")) != NULL) { |
| 735 | int token; | 736 | int token; |
| @@ -760,7 +761,8 @@ static int parse_opts(char *params, struct p9_fd_opts *opts) | |||
| 760 | continue; | 761 | continue; |
| 761 | } | 762 | } |
| 762 | } | 763 | } |
| 763 | kfree(options); | 764 | |
| 765 | kfree(tmp_options); | ||
| 764 | return 0; | 766 | return 0; |
| 765 | } | 767 | } |
| 766 | 768 | ||
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index 65cb29db03f8..2c95a89c0f46 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c | |||
| @@ -166,7 +166,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts) | |||
| 166 | char *p; | 166 | char *p; |
| 167 | substring_t args[MAX_OPT_ARGS]; | 167 | substring_t args[MAX_OPT_ARGS]; |
| 168 | int option; | 168 | int option; |
| 169 | char *options; | 169 | char *options, *tmp_options; |
| 170 | int ret; | 170 | int ret; |
| 171 | 171 | ||
| 172 | opts->port = P9_PORT; | 172 | opts->port = P9_PORT; |
| @@ -177,12 +177,13 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts) | |||
| 177 | if (!params) | 177 | if (!params) |
| 178 | return 0; | 178 | return 0; |
| 179 | 179 | ||
| 180 | options = kstrdup(params, GFP_KERNEL); | 180 | tmp_options = kstrdup(params, GFP_KERNEL); |
| 181 | if (!options) { | 181 | if (!tmp_options) { |
| 182 | P9_DPRINTK(P9_DEBUG_ERROR, | 182 | P9_DPRINTK(P9_DEBUG_ERROR, |
| 183 | "failed to allocate copy of option string\n"); | 183 | "failed to allocate copy of option string\n"); |
| 184 | return -ENOMEM; | 184 | return -ENOMEM; |
| 185 | } | 185 | } |
| 186 | options = tmp_options; | ||
| 186 | 187 | ||
| 187 | while ((p = strsep(&options, ",")) != NULL) { | 188 | while ((p = strsep(&options, ",")) != NULL) { |
| 188 | int token; | 189 | int token; |
| @@ -216,7 +217,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts) | |||
| 216 | } | 217 | } |
| 217 | /* RQ must be at least as large as the SQ */ | 218 | /* RQ must be at least as large as the SQ */ |
| 218 | opts->rq_depth = max(opts->rq_depth, opts->sq_depth); | 219 | opts->rq_depth = max(opts->rq_depth, opts->sq_depth); |
| 219 | kfree(options); | 220 | kfree(tmp_options); |
| 220 | return 0; | 221 | return 0; |
| 221 | } | 222 | } |
| 222 | 223 | ||
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index ea1e3daabefe..cb50f4ae5eef 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
| @@ -102,7 +102,8 @@ static void p9_virtio_close(struct p9_client *client) | |||
| 102 | struct virtio_chan *chan = client->trans; | 102 | struct virtio_chan *chan = client->trans; |
| 103 | 103 | ||
| 104 | mutex_lock(&virtio_9p_lock); | 104 | mutex_lock(&virtio_9p_lock); |
| 105 | chan->inuse = false; | 105 | if (chan) |
| 106 | chan->inuse = false; | ||
| 106 | mutex_unlock(&virtio_9p_lock); | 107 | mutex_unlock(&virtio_9p_lock); |
| 107 | } | 108 | } |
| 108 | 109 | ||
| @@ -311,6 +312,7 @@ p9_virtio_create(struct p9_client *client, const char *devname, char *args) | |||
| 311 | } | 312 | } |
| 312 | 313 | ||
| 313 | client->trans = (void *)chan; | 314 | client->trans = (void *)chan; |
| 315 | client->status = Connected; | ||
| 314 | chan->client = client; | 316 | chan->client = client; |
| 315 | 317 | ||
| 316 | return 0; | 318 | return 0; |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index b7c4224f4e7d..b10e3cdb08f8 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -377,6 +377,9 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 | |||
| 377 | 377 | ||
| 378 | if (acl->state == BT_CONNECTED && | 378 | if (acl->state == BT_CONNECTED && |
| 379 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { | 379 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { |
| 380 | acl->power_save = 1; | ||
| 381 | hci_conn_enter_active_mode(acl); | ||
| 382 | |||
| 380 | if (lmp_esco_capable(hdev)) | 383 | if (lmp_esco_capable(hdev)) |
| 381 | hci_setup_sync(sco, acl->handle); | 384 | hci_setup_sync(sco, acl->handle); |
| 382 | else | 385 | else |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 28517bad796c..592da5c909c1 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -1699,6 +1699,7 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu | |||
| 1699 | break; | 1699 | break; |
| 1700 | 1700 | ||
| 1701 | case 0x1c: /* SCO interval rejected */ | 1701 | case 0x1c: /* SCO interval rejected */ |
| 1702 | case 0x1a: /* Unsupported Remote Feature */ | ||
| 1702 | case 0x1f: /* Unspecified error */ | 1703 | case 0x1f: /* Unspecified error */ |
| 1703 | if (conn->out && conn->attempt < 2) { | 1704 | if (conn->out && conn->attempt < 2) { |
| 1704 | conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | | 1705 | conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | |
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 18e7f5a43dc4..fc6ec1e72652 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
| @@ -243,6 +243,39 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
| 243 | input_sync(dev); | 243 | input_sync(dev); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 247 | unsigned char hdr, unsigned char *data, int size) | ||
| 248 | { | ||
| 249 | struct sk_buff *skb; | ||
| 250 | |||
| 251 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 252 | |||
| 253 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 254 | BT_ERR("Can't allocate memory for new frame"); | ||
| 255 | return -ENOMEM; | ||
| 256 | } | ||
| 257 | |||
| 258 | *skb_put(skb, 1) = hdr; | ||
| 259 | if (data && size > 0) | ||
| 260 | memcpy(skb_put(skb, size), data, size); | ||
| 261 | |||
| 262 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 263 | |||
| 264 | return 0; | ||
| 265 | } | ||
| 266 | |||
| 267 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 268 | unsigned char hdr, unsigned char *data, int size) | ||
| 269 | { | ||
| 270 | int err; | ||
| 271 | |||
| 272 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 273 | |||
| 274 | hidp_schedule(session); | ||
| 275 | |||
| 276 | return err; | ||
| 277 | } | ||
| 278 | |||
| 246 | static int hidp_queue_report(struct hidp_session *session, | 279 | static int hidp_queue_report(struct hidp_session *session, |
| 247 | unsigned char *data, int size) | 280 | unsigned char *data, int size) |
| 248 | { | 281 | { |
| @@ -282,7 +315,9 @@ static int hidp_send_report(struct hidp_session *session, struct hid_report *rep | |||
| 282 | 315 | ||
| 283 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) | 316 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) |
| 284 | { | 317 | { |
| 285 | if (hidp_queue_report(hid->driver_data, data, count)) | 318 | if (hidp_send_ctrl_message(hid->driver_data, |
| 319 | HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE, | ||
| 320 | data, count)) | ||
| 286 | return -ENOMEM; | 321 | return -ENOMEM; |
| 287 | return count; | 322 | return count; |
| 288 | } | 323 | } |
| @@ -307,39 +342,6 @@ static inline void hidp_del_timer(struct hidp_session *session) | |||
| 307 | del_timer(&session->timer); | 342 | del_timer(&session->timer); |
| 308 | } | 343 | } |
| 309 | 344 | ||
| 310 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 311 | unsigned char hdr, unsigned char *data, int size) | ||
| 312 | { | ||
| 313 | struct sk_buff *skb; | ||
| 314 | |||
| 315 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 316 | |||
| 317 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 318 | BT_ERR("Can't allocate memory for new frame"); | ||
| 319 | return -ENOMEM; | ||
| 320 | } | ||
| 321 | |||
| 322 | *skb_put(skb, 1) = hdr; | ||
| 323 | if (data && size > 0) | ||
| 324 | memcpy(skb_put(skb, size), data, size); | ||
| 325 | |||
| 326 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 327 | |||
| 328 | return 0; | ||
| 329 | } | ||
| 330 | |||
| 331 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 332 | unsigned char hdr, unsigned char *data, int size) | ||
| 333 | { | ||
| 334 | int err; | ||
| 335 | |||
| 336 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 337 | |||
| 338 | hidp_schedule(session); | ||
| 339 | |||
| 340 | return err; | ||
| 341 | } | ||
| 342 | |||
| 343 | static void hidp_process_handshake(struct hidp_session *session, | 345 | static void hidp_process_handshake(struct hidp_session *session, |
| 344 | unsigned char param) | 346 | unsigned char param) |
| 345 | { | 347 | { |
| @@ -701,29 +703,9 @@ static void hidp_close(struct hid_device *hid) | |||
| 701 | static int hidp_parse(struct hid_device *hid) | 703 | static int hidp_parse(struct hid_device *hid) |
| 702 | { | 704 | { |
| 703 | struct hidp_session *session = hid->driver_data; | 705 | struct hidp_session *session = hid->driver_data; |
| 704 | struct hidp_connadd_req *req = session->req; | ||
| 705 | unsigned char *buf; | ||
| 706 | int ret; | ||
| 707 | |||
| 708 | buf = kmalloc(req->rd_size, GFP_KERNEL); | ||
| 709 | if (!buf) | ||
| 710 | return -ENOMEM; | ||
| 711 | |||
| 712 | if (copy_from_user(buf, req->rd_data, req->rd_size)) { | ||
| 713 | kfree(buf); | ||
| 714 | return -EFAULT; | ||
| 715 | } | ||
| 716 | |||
| 717 | ret = hid_parse_report(session->hid, buf, req->rd_size); | ||
| 718 | |||
| 719 | kfree(buf); | ||
| 720 | |||
| 721 | if (ret) | ||
| 722 | return ret; | ||
| 723 | 706 | ||
| 724 | session->req = NULL; | 707 | return hid_parse_report(session->hid, session->rd_data, |
| 725 | 708 | session->rd_size); | |
| 726 | return 0; | ||
| 727 | } | 709 | } |
| 728 | 710 | ||
| 729 | static int hidp_start(struct hid_device *hid) | 711 | static int hidp_start(struct hid_device *hid) |
| @@ -768,12 +750,24 @@ static int hidp_setup_hid(struct hidp_session *session, | |||
| 768 | bdaddr_t src, dst; | 750 | bdaddr_t src, dst; |
| 769 | int err; | 751 | int err; |
| 770 | 752 | ||
| 753 | session->rd_data = kzalloc(req->rd_size, GFP_KERNEL); | ||
| 754 | if (!session->rd_data) | ||
| 755 | return -ENOMEM; | ||
| 756 | |||
| 757 | if (copy_from_user(session->rd_data, req->rd_data, req->rd_size)) { | ||
| 758 | err = -EFAULT; | ||
| 759 | goto fault; | ||
| 760 | } | ||
| 761 | session->rd_size = req->rd_size; | ||
| 762 | |||
| 771 | hid = hid_allocate_device(); | 763 | hid = hid_allocate_device(); |
| 772 | if (IS_ERR(hid)) | 764 | if (IS_ERR(hid)) { |
| 773 | return PTR_ERR(hid); | 765 | err = PTR_ERR(hid); |
| 766 | goto fault; | ||
| 767 | } | ||
| 774 | 768 | ||
| 775 | session->hid = hid; | 769 | session->hid = hid; |
| 776 | session->req = req; | 770 | |
| 777 | hid->driver_data = session; | 771 | hid->driver_data = session; |
| 778 | 772 | ||
| 779 | baswap(&src, &bt_sk(session->ctrl_sock->sk)->src); | 773 | baswap(&src, &bt_sk(session->ctrl_sock->sk)->src); |
| @@ -804,6 +798,10 @@ failed: | |||
| 804 | hid_destroy_device(hid); | 798 | hid_destroy_device(hid); |
| 805 | session->hid = NULL; | 799 | session->hid = NULL; |
| 806 | 800 | ||
| 801 | fault: | ||
| 802 | kfree(session->rd_data); | ||
| 803 | session->rd_data = NULL; | ||
| 804 | |||
| 807 | return err; | 805 | return err; |
| 808 | } | 806 | } |
| 809 | 807 | ||
| @@ -898,6 +896,9 @@ unlink: | |||
| 898 | session->hid = NULL; | 896 | session->hid = NULL; |
| 899 | } | 897 | } |
| 900 | 898 | ||
| 899 | kfree(session->rd_data); | ||
| 900 | session->rd_data = NULL; | ||
| 901 | |||
| 901 | purge: | 902 | purge: |
| 902 | skb_queue_purge(&session->ctrl_transmit); | 903 | skb_queue_purge(&session->ctrl_transmit); |
| 903 | skb_queue_purge(&session->intr_transmit); | 904 | skb_queue_purge(&session->intr_transmit); |
diff --git a/net/bluetooth/hidp/hidp.h b/net/bluetooth/hidp/hidp.h index faf3d74c3586..a4e215d50c10 100644 --- a/net/bluetooth/hidp/hidp.h +++ b/net/bluetooth/hidp/hidp.h | |||
| @@ -154,7 +154,9 @@ struct hidp_session { | |||
| 154 | struct sk_buff_head ctrl_transmit; | 154 | struct sk_buff_head ctrl_transmit; |
| 155 | struct sk_buff_head intr_transmit; | 155 | struct sk_buff_head intr_transmit; |
| 156 | 156 | ||
| 157 | struct hidp_connadd_req *req; | 157 | /* Report descriptor */ |
| 158 | __u8 *rd_data; | ||
| 159 | uint rd_size; | ||
| 158 | }; | 160 | }; |
| 159 | 161 | ||
| 160 | static inline void hidp_schedule(struct hidp_session *session) | 162 | static inline void hidp_schedule(struct hidp_session *session) |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1120cf14a548..400efa26ddba 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -1368,7 +1368,6 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1368 | 1368 | ||
| 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && | 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && |
| 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { | 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { |
| 1371 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1372 | 1371 | ||
| 1373 | if (pi->remote_max_tx && | 1372 | if (pi->remote_max_tx && |
| 1374 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1373 | bt_cb(skb)->retries == pi->remote_max_tx) { |
| @@ -1376,6 +1375,8 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1376 | break; | 1375 | break; |
| 1377 | } | 1376 | } |
| 1378 | 1377 | ||
| 1378 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1379 | |||
| 1379 | bt_cb(skb)->retries++; | 1380 | bt_cb(skb)->retries++; |
| 1380 | 1381 | ||
| 1381 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1382 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
| @@ -3518,7 +3519,6 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3518 | struct l2cap_pinfo *pi; | 3519 | struct l2cap_pinfo *pi; |
| 3519 | u16 control, len; | 3520 | u16 control, len; |
| 3520 | u8 tx_seq; | 3521 | u8 tx_seq; |
| 3521 | int err; | ||
| 3522 | 3522 | ||
| 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); |
| 3524 | if (!sk) { | 3524 | if (!sk) { |
| @@ -3570,13 +3570,11 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3570 | goto drop; | 3570 | goto drop; |
| 3571 | 3571 | ||
| 3572 | if (__is_iframe(control)) | 3572 | if (__is_iframe(control)) |
| 3573 | err = l2cap_data_channel_iframe(sk, control, skb); | 3573 | l2cap_data_channel_iframe(sk, control, skb); |
| 3574 | else | 3574 | else |
| 3575 | err = l2cap_data_channel_sframe(sk, control, skb); | 3575 | l2cap_data_channel_sframe(sk, control, skb); |
| 3576 | 3576 | ||
| 3577 | if (!err) | 3577 | goto done; |
| 3578 | goto done; | ||
| 3579 | break; | ||
| 3580 | 3578 | ||
| 3581 | case L2CAP_MODE_STREAMING: | 3579 | case L2CAP_MODE_STREAMING: |
| 3582 | control = get_unaligned_le16(skb->data); | 3580 | control = get_unaligned_le16(skb->data); |
| @@ -3602,7 +3600,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3602 | else | 3600 | else |
| 3603 | pi->expected_tx_seq = tx_seq + 1; | 3601 | pi->expected_tx_seq = tx_seq + 1; |
| 3604 | 3602 | ||
| 3605 | err = l2cap_sar_reassembly_sdu(sk, skb, control); | 3603 | l2cap_sar_reassembly_sdu(sk, skb, control); |
| 3606 | 3604 | ||
| 3607 | goto done; | 3605 | goto done; |
| 3608 | 3606 | ||
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index fc5ee3296e22..89f4a59eb82b 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -252,7 +252,6 @@ static void rfcomm_session_timeout(unsigned long arg) | |||
| 252 | BT_DBG("session %p state %ld", s, s->state); | 252 | BT_DBG("session %p state %ld", s, s->state); |
| 253 | 253 | ||
| 254 | set_bit(RFCOMM_TIMED_OUT, &s->flags); | 254 | set_bit(RFCOMM_TIMED_OUT, &s->flags); |
| 255 | rfcomm_session_put(s); | ||
| 256 | rfcomm_schedule(RFCOMM_SCHED_TIMEO); | 255 | rfcomm_schedule(RFCOMM_SCHED_TIMEO); |
| 257 | } | 256 | } |
| 258 | 257 | ||
| @@ -1151,7 +1150,11 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci) | |||
| 1151 | break; | 1150 | break; |
| 1152 | 1151 | ||
| 1153 | case BT_DISCONN: | 1152 | case BT_DISCONN: |
| 1154 | rfcomm_session_put(s); | 1153 | /* When socket is closed and we are not RFCOMM |
| 1154 | * initiator rfcomm_process_rx already calls | ||
| 1155 | * rfcomm_session_put() */ | ||
| 1156 | if (s->sock->sk->sk_state != BT_CLOSED) | ||
| 1157 | rfcomm_session_put(s); | ||
| 1155 | break; | 1158 | break; |
| 1156 | } | 1159 | } |
| 1157 | } | 1160 | } |
| @@ -1920,6 +1923,7 @@ static inline void rfcomm_process_sessions(void) | |||
| 1920 | if (test_and_clear_bit(RFCOMM_TIMED_OUT, &s->flags)) { | 1923 | if (test_and_clear_bit(RFCOMM_TIMED_OUT, &s->flags)) { |
| 1921 | s->state = BT_DISCONN; | 1924 | s->state = BT_DISCONN; |
| 1922 | rfcomm_send_disc(s, 0); | 1925 | rfcomm_send_disc(s, 0); |
| 1926 | rfcomm_session_put(s); | ||
| 1923 | continue; | 1927 | continue; |
| 1924 | } | 1928 | } |
| 1925 | 1929 | ||
diff --git a/net/core/dst.c b/net/core/dst.c index 57bc4d5b8d08..cb1b3488b739 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/string.h> | 17 | #include <linux/string.h> |
| 18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 19 | #include <net/net_namespace.h> | 19 | #include <net/net_namespace.h> |
| 20 | #include <linux/sched.h> | ||
| 20 | 21 | ||
| 21 | #include <net/dst.h> | 22 | #include <net/dst.h> |
| 22 | 23 | ||
| @@ -79,6 +80,7 @@ loop: | |||
| 79 | while ((dst = next) != NULL) { | 80 | while ((dst = next) != NULL) { |
| 80 | next = dst->next; | 81 | next = dst->next; |
| 81 | prefetch(&next->next); | 82 | prefetch(&next->next); |
| 83 | cond_resched(); | ||
| 82 | if (likely(atomic_read(&dst->__refcnt))) { | 84 | if (likely(atomic_read(&dst->__refcnt))) { |
| 83 | last->next = dst; | 85 | last->next = dst; |
| 84 | last = dst; | 86 | last = dst; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index de0c2c726420..2e692afdc55d 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -3524,6 +3524,7 @@ static int pktgen_thread_worker(void *arg) | |||
| 3524 | wait_event_interruptible_timeout(t->queue, | 3524 | wait_event_interruptible_timeout(t->queue, |
| 3525 | t->control != 0, | 3525 | t->control != 0, |
| 3526 | HZ/10); | 3526 | HZ/10); |
| 3527 | try_to_freeze(); | ||
| 3527 | continue; | 3528 | continue; |
| 3528 | } | 3529 | } |
| 3529 | 3530 | ||
diff --git a/net/dccp/ccid.c b/net/dccp/ccid.c index 57dfb9c8c4f2..ff16e9df1969 100644 --- a/net/dccp/ccid.c +++ b/net/dccp/ccid.c | |||
| @@ -83,7 +83,7 @@ static struct kmem_cache *ccid_kmem_cache_create(int obj_size, char *slab_name_f | |||
| 83 | va_list args; | 83 | va_list args; |
| 84 | 84 | ||
| 85 | va_start(args, fmt); | 85 | va_start(args, fmt); |
| 86 | vsnprintf(slab_name_fmt, sizeof(slab_name_fmt), fmt, args); | 86 | vsnprintf(slab_name_fmt, CCID_SLAB_NAME_LENGTH, fmt, args); |
| 87 | va_end(args); | 87 | va_end(args); |
| 88 | 88 | ||
| 89 | slab = kmem_cache_create(slab_name_fmt, sizeof(struct ccid) + obj_size, 0, | 89 | slab = kmem_cache_create(slab_name_fmt, sizeof(struct ccid) + obj_size, 0, |
diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h index 269958bf7fe9..6df6f8ac9636 100644 --- a/net/dccp/ccid.h +++ b/net/dccp/ccid.h | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | #include <linux/list.h> | 19 | #include <linux/list.h> |
| 20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 21 | 21 | ||
| 22 | #define CCID_MAX 255 | 22 | /* maximum value for a CCID (RFC 4340, 19.5) */ |
| 23 | #define CCID_MAX 255 | ||
| 24 | #define CCID_SLAB_NAME_LENGTH 32 | ||
| 23 | 25 | ||
| 24 | struct tcp_info; | 26 | struct tcp_info; |
| 25 | 27 | ||
| @@ -49,8 +51,8 @@ struct ccid_operations { | |||
| 49 | const char *ccid_name; | 51 | const char *ccid_name; |
| 50 | struct kmem_cache *ccid_hc_rx_slab, | 52 | struct kmem_cache *ccid_hc_rx_slab, |
| 51 | *ccid_hc_tx_slab; | 53 | *ccid_hc_tx_slab; |
| 52 | char ccid_hc_rx_slab_name[32]; | 54 | char ccid_hc_rx_slab_name[CCID_SLAB_NAME_LENGTH]; |
| 53 | char ccid_hc_tx_slab_name[32]; | 55 | char ccid_hc_tx_slab_name[CCID_SLAB_NAME_LENGTH]; |
| 54 | __u32 ccid_hc_rx_obj_size, | 56 | __u32 ccid_hc_rx_obj_size, |
| 55 | ccid_hc_tx_obj_size; | 57 | ccid_hc_tx_obj_size; |
| 56 | /* Interface Routines */ | 58 | /* Interface Routines */ |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index bace1d8cbcfd..f5b3464f1242 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
| @@ -161,8 +161,8 @@ static __init int dccpprobe_init(void) | |||
| 161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) | 161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) |
| 162 | goto err0; | 162 | goto err0; |
| 163 | 163 | ||
| 164 | ret = try_then_request_module((register_jprobe(&dccp_send_probe) == 0), | 164 | try_then_request_module((ret = register_jprobe(&dccp_send_probe)) == 0, |
| 165 | "dccp"); | 165 | "dccp"); |
| 166 | if (ret) | 166 | if (ret) |
| 167 | goto err1; | 167 | goto err1; |
| 168 | 168 | ||
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 06632762ba5f..90203e1b9187 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -925,10 +925,10 @@ static int get_info(struct net *net, void __user *user, int *len, int compat) | |||
| 925 | if (t && !IS_ERR(t)) { | 925 | if (t && !IS_ERR(t)) { |
| 926 | struct arpt_getinfo info; | 926 | struct arpt_getinfo info; |
| 927 | const struct xt_table_info *private = t->private; | 927 | const struct xt_table_info *private = t->private; |
| 928 | |||
| 929 | #ifdef CONFIG_COMPAT | 928 | #ifdef CONFIG_COMPAT |
| 929 | struct xt_table_info tmp; | ||
| 930 | |||
| 930 | if (compat) { | 931 | if (compat) { |
| 931 | struct xt_table_info tmp; | ||
| 932 | ret = compat_table_info(private, &tmp); | 932 | ret = compat_table_info(private, &tmp); |
| 933 | xt_compat_flush_offsets(NFPROTO_ARP); | 933 | xt_compat_flush_offsets(NFPROTO_ARP); |
| 934 | private = &tmp; | 934 | private = &tmp; |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 572330a552ef..3ce53cf13d5a 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
| @@ -1132,10 +1132,10 @@ static int get_info(struct net *net, void __user *user, int *len, int compat) | |||
| 1132 | if (t && !IS_ERR(t)) { | 1132 | if (t && !IS_ERR(t)) { |
| 1133 | struct ipt_getinfo info; | 1133 | struct ipt_getinfo info; |
| 1134 | const struct xt_table_info *private = t->private; | 1134 | const struct xt_table_info *private = t->private; |
| 1135 | |||
| 1136 | #ifdef CONFIG_COMPAT | 1135 | #ifdef CONFIG_COMPAT |
| 1136 | struct xt_table_info tmp; | ||
| 1137 | |||
| 1137 | if (compat) { | 1138 | if (compat) { |
| 1138 | struct xt_table_info tmp; | ||
| 1139 | ret = compat_table_info(private, &tmp); | 1139 | ret = compat_table_info(private, &tmp); |
| 1140 | xt_compat_flush_offsets(AF_INET); | 1140 | xt_compat_flush_offsets(AF_INET); |
| 1141 | private = &tmp; | 1141 | private = &tmp; |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index d171b123a656..d1ea38a7c490 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -210,7 +210,7 @@ static ctl_table ip_ct_sysctl_table[] = { | |||
| 210 | }, | 210 | }, |
| 211 | { | 211 | { |
| 212 | .procname = "ip_conntrack_buckets", | 212 | .procname = "ip_conntrack_buckets", |
| 213 | .data = &nf_conntrack_htable_size, | 213 | .data = &init_net.ct.htable_size, |
| 214 | .maxlen = sizeof(unsigned int), | 214 | .maxlen = sizeof(unsigned int), |
| 215 | .mode = 0444, | 215 | .mode = 0444, |
| 216 | .proc_handler = proc_dointvec, | 216 | .proc_handler = proc_dointvec, |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c index 8668a3defda6..2fb7b76da94f 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c | |||
| @@ -32,7 +32,7 @@ static struct hlist_nulls_node *ct_get_first(struct seq_file *seq) | |||
| 32 | struct hlist_nulls_node *n; | 32 | struct hlist_nulls_node *n; |
| 33 | 33 | ||
| 34 | for (st->bucket = 0; | 34 | for (st->bucket = 0; |
| 35 | st->bucket < nf_conntrack_htable_size; | 35 | st->bucket < net->ct.htable_size; |
| 36 | st->bucket++) { | 36 | st->bucket++) { |
| 37 | n = rcu_dereference(net->ct.hash[st->bucket].first); | 37 | n = rcu_dereference(net->ct.hash[st->bucket].first); |
| 38 | if (!is_a_nulls(n)) | 38 | if (!is_a_nulls(n)) |
| @@ -50,7 +50,7 @@ static struct hlist_nulls_node *ct_get_next(struct seq_file *seq, | |||
| 50 | head = rcu_dereference(head->next); | 50 | head = rcu_dereference(head->next); |
| 51 | while (is_a_nulls(head)) { | 51 | while (is_a_nulls(head)) { |
| 52 | if (likely(get_nulls_value(head) == st->bucket)) { | 52 | if (likely(get_nulls_value(head) == st->bucket)) { |
| 53 | if (++st->bucket >= nf_conntrack_htable_size) | 53 | if (++st->bucket >= net->ct.htable_size) |
| 54 | return NULL; | 54 | return NULL; |
| 55 | } | 55 | } |
| 56 | head = rcu_dereference(net->ct.hash[st->bucket].first); | 56 | head = rcu_dereference(net->ct.hash[st->bucket].first); |
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index fe1a64479dd0..26066a2327ad 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
| @@ -35,9 +35,6 @@ static DEFINE_SPINLOCK(nf_nat_lock); | |||
| 35 | 35 | ||
| 36 | static struct nf_conntrack_l3proto *l3proto __read_mostly; | 36 | static struct nf_conntrack_l3proto *l3proto __read_mostly; |
| 37 | 37 | ||
| 38 | /* Calculated at init based on memory size */ | ||
| 39 | static unsigned int nf_nat_htable_size __read_mostly; | ||
| 40 | |||
| 41 | #define MAX_IP_NAT_PROTO 256 | 38 | #define MAX_IP_NAT_PROTO 256 |
| 42 | static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO] | 39 | static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO] |
| 43 | __read_mostly; | 40 | __read_mostly; |
| @@ -72,7 +69,7 @@ EXPORT_SYMBOL_GPL(nf_nat_proto_put); | |||
| 72 | 69 | ||
| 73 | /* We keep an extra hash for each conntrack, for fast searching. */ | 70 | /* We keep an extra hash for each conntrack, for fast searching. */ |
| 74 | static inline unsigned int | 71 | static inline unsigned int |
| 75 | hash_by_src(const struct nf_conntrack_tuple *tuple) | 72 | hash_by_src(const struct net *net, const struct nf_conntrack_tuple *tuple) |
| 76 | { | 73 | { |
| 77 | unsigned int hash; | 74 | unsigned int hash; |
| 78 | 75 | ||
| @@ -80,7 +77,7 @@ hash_by_src(const struct nf_conntrack_tuple *tuple) | |||
| 80 | hash = jhash_3words((__force u32)tuple->src.u3.ip, | 77 | hash = jhash_3words((__force u32)tuple->src.u3.ip, |
| 81 | (__force u32)tuple->src.u.all, | 78 | (__force u32)tuple->src.u.all, |
| 82 | tuple->dst.protonum, 0); | 79 | tuple->dst.protonum, 0); |
| 83 | return ((u64)hash * nf_nat_htable_size) >> 32; | 80 | return ((u64)hash * net->ipv4.nat_htable_size) >> 32; |
| 84 | } | 81 | } |
| 85 | 82 | ||
| 86 | /* Is this tuple already taken? (not by us) */ | 83 | /* Is this tuple already taken? (not by us) */ |
| @@ -147,7 +144,7 @@ find_appropriate_src(struct net *net, | |||
| 147 | struct nf_conntrack_tuple *result, | 144 | struct nf_conntrack_tuple *result, |
| 148 | const struct nf_nat_range *range) | 145 | const struct nf_nat_range *range) |
| 149 | { | 146 | { |
| 150 | unsigned int h = hash_by_src(tuple); | 147 | unsigned int h = hash_by_src(net, tuple); |
| 151 | const struct nf_conn_nat *nat; | 148 | const struct nf_conn_nat *nat; |
| 152 | const struct nf_conn *ct; | 149 | const struct nf_conn *ct; |
| 153 | const struct hlist_node *n; | 150 | const struct hlist_node *n; |
| @@ -330,7 +327,7 @@ nf_nat_setup_info(struct nf_conn *ct, | |||
| 330 | if (have_to_hash) { | 327 | if (have_to_hash) { |
| 331 | unsigned int srchash; | 328 | unsigned int srchash; |
| 332 | 329 | ||
| 333 | srchash = hash_by_src(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); | 330 | srchash = hash_by_src(net, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); |
| 334 | spin_lock_bh(&nf_nat_lock); | 331 | spin_lock_bh(&nf_nat_lock); |
| 335 | /* nf_conntrack_alter_reply might re-allocate exntension aera */ | 332 | /* nf_conntrack_alter_reply might re-allocate exntension aera */ |
| 336 | nat = nfct_nat(ct); | 333 | nat = nfct_nat(ct); |
| @@ -679,8 +676,10 @@ nfnetlink_parse_nat_setup(struct nf_conn *ct, | |||
| 679 | 676 | ||
| 680 | static int __net_init nf_nat_net_init(struct net *net) | 677 | static int __net_init nf_nat_net_init(struct net *net) |
| 681 | { | 678 | { |
| 682 | net->ipv4.nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size, | 679 | /* Leave them the same for the moment. */ |
| 683 | &net->ipv4.nat_vmalloced, 0); | 680 | net->ipv4.nat_htable_size = net->ct.htable_size; |
| 681 | net->ipv4.nat_bysource = nf_ct_alloc_hashtable(&net->ipv4.nat_htable_size, | ||
| 682 | &net->ipv4.nat_vmalloced, 0); | ||
| 684 | if (!net->ipv4.nat_bysource) | 683 | if (!net->ipv4.nat_bysource) |
| 685 | return -ENOMEM; | 684 | return -ENOMEM; |
| 686 | return 0; | 685 | return 0; |
| @@ -703,7 +702,7 @@ static void __net_exit nf_nat_net_exit(struct net *net) | |||
| 703 | nf_ct_iterate_cleanup(net, &clean_nat, NULL); | 702 | nf_ct_iterate_cleanup(net, &clean_nat, NULL); |
| 704 | synchronize_rcu(); | 703 | synchronize_rcu(); |
| 705 | nf_ct_free_hashtable(net->ipv4.nat_bysource, net->ipv4.nat_vmalloced, | 704 | nf_ct_free_hashtable(net->ipv4.nat_bysource, net->ipv4.nat_vmalloced, |
| 706 | nf_nat_htable_size); | 705 | net->ipv4.nat_htable_size); |
| 707 | } | 706 | } |
| 708 | 707 | ||
| 709 | static struct pernet_operations nf_nat_net_ops = { | 708 | static struct pernet_operations nf_nat_net_ops = { |
| @@ -724,9 +723,6 @@ static int __init nf_nat_init(void) | |||
| 724 | return ret; | 723 | return ret; |
| 725 | } | 724 | } |
| 726 | 725 | ||
| 727 | /* Leave them the same for the moment. */ | ||
| 728 | nf_nat_htable_size = nf_conntrack_htable_size; | ||
| 729 | |||
| 730 | ret = register_pernet_subsys(&nf_nat_net_ops); | 726 | ret = register_pernet_subsys(&nf_nat_net_ops); |
| 731 | if (ret < 0) | 727 | if (ret < 0) |
| 732 | goto cleanup_extend; | 728 | goto cleanup_extend; |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 480d7f8c9802..8a7e0f52e177 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -1164,10 +1164,10 @@ static int get_info(struct net *net, void __user *user, int *len, int compat) | |||
| 1164 | if (t && !IS_ERR(t)) { | 1164 | if (t && !IS_ERR(t)) { |
| 1165 | struct ip6t_getinfo info; | 1165 | struct ip6t_getinfo info; |
| 1166 | const struct xt_table_info *private = t->private; | 1166 | const struct xt_table_info *private = t->private; |
| 1167 | |||
| 1168 | #ifdef CONFIG_COMPAT | 1167 | #ifdef CONFIG_COMPAT |
| 1168 | struct xt_table_info tmp; | ||
| 1169 | |||
| 1169 | if (compat) { | 1170 | if (compat) { |
| 1170 | struct xt_table_info tmp; | ||
| 1171 | ret = compat_table_info(private, &tmp); | 1171 | ret = compat_table_info(private, &tmp); |
| 1172 | xt_compat_flush_offsets(AF_INET6); | 1172 | xt_compat_flush_offsets(AF_INET6); |
| 1173 | private = &tmp; | 1173 | private = &tmp; |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 312c20adc83f..624a54832a7c 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -63,6 +63,7 @@ struct nf_ct_frag6_queue | |||
| 63 | struct inet_frag_queue q; | 63 | struct inet_frag_queue q; |
| 64 | 64 | ||
| 65 | __be32 id; /* fragment id */ | 65 | __be32 id; /* fragment id */ |
| 66 | u32 user; | ||
| 66 | struct in6_addr saddr; | 67 | struct in6_addr saddr; |
| 67 | struct in6_addr daddr; | 68 | struct in6_addr daddr; |
| 68 | 69 | ||
diff --git a/net/irda/irnet/irnet_ppp.c b/net/irda/irnet/irnet_ppp.c index 156020d138b5..6b3602de359a 100644 --- a/net/irda/irnet/irnet_ppp.c +++ b/net/irda/irnet/irnet_ppp.c | |||
| @@ -698,15 +698,18 @@ dev_irnet_ioctl( | |||
| 698 | 698 | ||
| 699 | /* Query PPP channel and unit number */ | 699 | /* Query PPP channel and unit number */ |
| 700 | case PPPIOCGCHAN: | 700 | case PPPIOCGCHAN: |
| 701 | lock_kernel(); | ||
| 701 | if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan), | 702 | if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan), |
| 702 | (int __user *)argp)) | 703 | (int __user *)argp)) |
| 703 | err = 0; | 704 | err = 0; |
| 705 | unlock_kernel(); | ||
| 704 | break; | 706 | break; |
| 705 | case PPPIOCGUNIT: | 707 | case PPPIOCGUNIT: |
| 706 | lock_kernel(); | 708 | lock_kernel(); |
| 707 | if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan), | 709 | if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan), |
| 708 | (int __user *)argp)) | 710 | (int __user *)argp)) |
| 709 | err = 0; | 711 | err = 0; |
| 712 | unlock_kernel(); | ||
| 710 | break; | 713 | break; |
| 711 | 714 | ||
| 712 | /* All these ioctls can be passed both directly and from ppp_generic, | 715 | /* All these ioctls can be passed both directly and from ppp_generic, |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 76fa6fef6473..539f43bc97db 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -3794,9 +3794,9 @@ static struct pernet_operations pfkey_net_ops = { | |||
| 3794 | 3794 | ||
| 3795 | static void __exit ipsec_pfkey_exit(void) | 3795 | static void __exit ipsec_pfkey_exit(void) |
| 3796 | { | 3796 | { |
| 3797 | unregister_pernet_subsys(&pfkey_net_ops); | ||
| 3798 | xfrm_unregister_km(&pfkeyv2_mgr); | 3797 | xfrm_unregister_km(&pfkeyv2_mgr); |
| 3799 | sock_unregister(PF_KEY); | 3798 | sock_unregister(PF_KEY); |
| 3799 | unregister_pernet_subsys(&pfkey_net_ops); | ||
| 3800 | proto_unregister(&key_proto); | 3800 | proto_unregister(&key_proto); |
| 3801 | } | 3801 | } |
| 3802 | 3802 | ||
| @@ -3807,21 +3807,22 @@ static int __init ipsec_pfkey_init(void) | |||
| 3807 | if (err != 0) | 3807 | if (err != 0) |
| 3808 | goto out; | 3808 | goto out; |
| 3809 | 3809 | ||
| 3810 | err = sock_register(&pfkey_family_ops); | 3810 | err = register_pernet_subsys(&pfkey_net_ops); |
| 3811 | if (err != 0) | 3811 | if (err != 0) |
| 3812 | goto out_unregister_key_proto; | 3812 | goto out_unregister_key_proto; |
| 3813 | err = sock_register(&pfkey_family_ops); | ||
| 3814 | if (err != 0) | ||
| 3815 | goto out_unregister_pernet; | ||
| 3813 | err = xfrm_register_km(&pfkeyv2_mgr); | 3816 | err = xfrm_register_km(&pfkeyv2_mgr); |
| 3814 | if (err != 0) | 3817 | if (err != 0) |
| 3815 | goto out_sock_unregister; | 3818 | goto out_sock_unregister; |
| 3816 | err = register_pernet_subsys(&pfkey_net_ops); | ||
| 3817 | if (err != 0) | ||
| 3818 | goto out_xfrm_unregister_km; | ||
| 3819 | out: | 3819 | out: |
| 3820 | return err; | 3820 | return err; |
| 3821 | out_xfrm_unregister_km: | 3821 | |
| 3822 | xfrm_unregister_km(&pfkeyv2_mgr); | ||
| 3823 | out_sock_unregister: | 3822 | out_sock_unregister: |
| 3824 | sock_unregister(PF_KEY); | 3823 | sock_unregister(PF_KEY); |
| 3824 | out_unregister_pernet: | ||
| 3825 | unregister_pernet_subsys(&pfkey_net_ops); | ||
| 3825 | out_unregister_key_proto: | 3826 | out_unregister_key_proto: |
| 3826 | proto_unregister(&key_proto); | 3827 | proto_unregister(&key_proto); |
| 3827 | goto out; | 3828 | goto out; |
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h index ee94ea0c67e9..da8497ef7063 100644 --- a/net/mac80211/driver-trace.h +++ b/net/mac80211/driver-trace.h | |||
| @@ -680,7 +680,7 @@ TRACE_EVENT(drv_ampdu_action, | |||
| 680 | __entry->ret = ret; | 680 | __entry->ret = ret; |
| 681 | __entry->action = action; | 681 | __entry->action = action; |
| 682 | __entry->tid = tid; | 682 | __entry->tid = tid; |
| 683 | __entry->ssn = *ssn; | 683 | __entry->ssn = ssn ? *ssn : 0; |
| 684 | ), | 684 | ), |
| 685 | 685 | ||
| 686 | TP_printk( | 686 | TP_printk( |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 0e98c3282d42..4d79e3c1616c 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/netdevice.h> | 30 | #include <linux/netdevice.h> |
| 31 | #include <linux/socket.h> | 31 | #include <linux/socket.h> |
| 32 | #include <linux/mm.h> | 32 | #include <linux/mm.h> |
| 33 | #include <linux/nsproxy.h> | ||
| 33 | #include <linux/rculist_nulls.h> | 34 | #include <linux/rculist_nulls.h> |
| 34 | 35 | ||
| 35 | #include <net/netfilter/nf_conntrack.h> | 36 | #include <net/netfilter/nf_conntrack.h> |
| @@ -63,8 +64,6 @@ EXPORT_SYMBOL_GPL(nf_conntrack_max); | |||
| 63 | struct nf_conn nf_conntrack_untracked __read_mostly; | 64 | struct nf_conn nf_conntrack_untracked __read_mostly; |
| 64 | EXPORT_SYMBOL_GPL(nf_conntrack_untracked); | 65 | EXPORT_SYMBOL_GPL(nf_conntrack_untracked); |
| 65 | 66 | ||
| 66 | static struct kmem_cache *nf_conntrack_cachep __read_mostly; | ||
| 67 | |||
| 68 | static int nf_conntrack_hash_rnd_initted; | 67 | static int nf_conntrack_hash_rnd_initted; |
| 69 | static unsigned int nf_conntrack_hash_rnd; | 68 | static unsigned int nf_conntrack_hash_rnd; |
| 70 | 69 | ||
| @@ -86,9 +85,10 @@ static u_int32_t __hash_conntrack(const struct nf_conntrack_tuple *tuple, | |||
| 86 | return ((u64)h * size) >> 32; | 85 | return ((u64)h * size) >> 32; |
| 87 | } | 86 | } |
| 88 | 87 | ||
| 89 | static inline u_int32_t hash_conntrack(const struct nf_conntrack_tuple *tuple) | 88 | static inline u_int32_t hash_conntrack(const struct net *net, |
| 89 | const struct nf_conntrack_tuple *tuple) | ||
| 90 | { | 90 | { |
| 91 | return __hash_conntrack(tuple, nf_conntrack_htable_size, | 91 | return __hash_conntrack(tuple, net->ct.htable_size, |
| 92 | nf_conntrack_hash_rnd); | 92 | nf_conntrack_hash_rnd); |
| 93 | } | 93 | } |
| 94 | 94 | ||
| @@ -296,7 +296,7 @@ __nf_conntrack_find(struct net *net, const struct nf_conntrack_tuple *tuple) | |||
| 296 | { | 296 | { |
| 297 | struct nf_conntrack_tuple_hash *h; | 297 | struct nf_conntrack_tuple_hash *h; |
| 298 | struct hlist_nulls_node *n; | 298 | struct hlist_nulls_node *n; |
| 299 | unsigned int hash = hash_conntrack(tuple); | 299 | unsigned int hash = hash_conntrack(net, tuple); |
| 300 | 300 | ||
| 301 | /* Disable BHs the entire time since we normally need to disable them | 301 | /* Disable BHs the entire time since we normally need to disable them |
| 302 | * at least once for the stats anyway. | 302 | * at least once for the stats anyway. |
| @@ -366,10 +366,11 @@ static void __nf_conntrack_hash_insert(struct nf_conn *ct, | |||
| 366 | 366 | ||
| 367 | void nf_conntrack_hash_insert(struct nf_conn *ct) | 367 | void nf_conntrack_hash_insert(struct nf_conn *ct) |
| 368 | { | 368 | { |
| 369 | struct net *net = nf_ct_net(ct); | ||
| 369 | unsigned int hash, repl_hash; | 370 | unsigned int hash, repl_hash; |
| 370 | 371 | ||
| 371 | hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); | 372 | hash = hash_conntrack(net, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); |
| 372 | repl_hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); | 373 | repl_hash = hash_conntrack(net, &ct->tuplehash[IP_CT_DIR_REPLY].tuple); |
| 373 | 374 | ||
| 374 | __nf_conntrack_hash_insert(ct, hash, repl_hash); | 375 | __nf_conntrack_hash_insert(ct, hash, repl_hash); |
| 375 | } | 376 | } |
| @@ -397,8 +398,8 @@ __nf_conntrack_confirm(struct sk_buff *skb) | |||
| 397 | if (CTINFO2DIR(ctinfo) != IP_CT_DIR_ORIGINAL) | 398 | if (CTINFO2DIR(ctinfo) != IP_CT_DIR_ORIGINAL) |
| 398 | return NF_ACCEPT; | 399 | return NF_ACCEPT; |
| 399 | 400 | ||
| 400 | hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); | 401 | hash = hash_conntrack(net, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); |
| 401 | repl_hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); | 402 | repl_hash = hash_conntrack(net, &ct->tuplehash[IP_CT_DIR_REPLY].tuple); |
| 402 | 403 | ||
| 403 | /* We're not in hash table, and we refuse to set up related | 404 | /* We're not in hash table, and we refuse to set up related |
| 404 | connections for unconfirmed conns. But packet copies and | 405 | connections for unconfirmed conns. But packet copies and |
| @@ -468,7 +469,7 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple, | |||
| 468 | struct net *net = nf_ct_net(ignored_conntrack); | 469 | struct net *net = nf_ct_net(ignored_conntrack); |
| 469 | struct nf_conntrack_tuple_hash *h; | 470 | struct nf_conntrack_tuple_hash *h; |
| 470 | struct hlist_nulls_node *n; | 471 | struct hlist_nulls_node *n; |
| 471 | unsigned int hash = hash_conntrack(tuple); | 472 | unsigned int hash = hash_conntrack(net, tuple); |
| 472 | 473 | ||
| 473 | /* Disable BHs the entire time since we need to disable them at | 474 | /* Disable BHs the entire time since we need to disable them at |
| 474 | * least once for the stats anyway. | 475 | * least once for the stats anyway. |
| @@ -503,7 +504,7 @@ static noinline int early_drop(struct net *net, unsigned int hash) | |||
| 503 | int dropped = 0; | 504 | int dropped = 0; |
| 504 | 505 | ||
| 505 | rcu_read_lock(); | 506 | rcu_read_lock(); |
| 506 | for (i = 0; i < nf_conntrack_htable_size; i++) { | 507 | for (i = 0; i < net->ct.htable_size; i++) { |
| 507 | hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[hash], | 508 | hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[hash], |
| 508 | hnnode) { | 509 | hnnode) { |
| 509 | tmp = nf_ct_tuplehash_to_ctrack(h); | 510 | tmp = nf_ct_tuplehash_to_ctrack(h); |
| @@ -523,7 +524,7 @@ static noinline int early_drop(struct net *net, unsigned int hash) | |||
| 523 | if (cnt >= NF_CT_EVICTION_RANGE) | 524 | if (cnt >= NF_CT_EVICTION_RANGE) |
| 524 | break; | 525 | break; |
| 525 | 526 | ||
| 526 | hash = (hash + 1) % nf_conntrack_htable_size; | 527 | hash = (hash + 1) % net->ct.htable_size; |
| 527 | } | 528 | } |
| 528 | rcu_read_unlock(); | 529 | rcu_read_unlock(); |
| 529 | 530 | ||
| @@ -557,7 +558,7 @@ struct nf_conn *nf_conntrack_alloc(struct net *net, | |||
| 557 | 558 | ||
| 558 | if (nf_conntrack_max && | 559 | if (nf_conntrack_max && |
| 559 | unlikely(atomic_read(&net->ct.count) > nf_conntrack_max)) { | 560 | unlikely(atomic_read(&net->ct.count) > nf_conntrack_max)) { |
| 560 | unsigned int hash = hash_conntrack(orig); | 561 | unsigned int hash = hash_conntrack(net, orig); |
| 561 | if (!early_drop(net, hash)) { | 562 | if (!early_drop(net, hash)) { |
| 562 | atomic_dec(&net->ct.count); | 563 | atomic_dec(&net->ct.count); |
| 563 | if (net_ratelimit()) | 564 | if (net_ratelimit()) |
| @@ -572,7 +573,7 @@ struct nf_conn *nf_conntrack_alloc(struct net *net, | |||
| 572 | * Do not use kmem_cache_zalloc(), as this cache uses | 573 | * Do not use kmem_cache_zalloc(), as this cache uses |
| 573 | * SLAB_DESTROY_BY_RCU. | 574 | * SLAB_DESTROY_BY_RCU. |
| 574 | */ | 575 | */ |
| 575 | ct = kmem_cache_alloc(nf_conntrack_cachep, gfp); | 576 | ct = kmem_cache_alloc(net->ct.nf_conntrack_cachep, gfp); |
| 576 | if (ct == NULL) { | 577 | if (ct == NULL) { |
| 577 | pr_debug("nf_conntrack_alloc: Can't alloc conntrack.\n"); | 578 | pr_debug("nf_conntrack_alloc: Can't alloc conntrack.\n"); |
| 578 | atomic_dec(&net->ct.count); | 579 | atomic_dec(&net->ct.count); |
| @@ -611,7 +612,7 @@ void nf_conntrack_free(struct nf_conn *ct) | |||
| 611 | nf_ct_ext_destroy(ct); | 612 | nf_ct_ext_destroy(ct); |
| 612 | atomic_dec(&net->ct.count); | 613 | atomic_dec(&net->ct.count); |
| 613 | nf_ct_ext_free(ct); | 614 | nf_ct_ext_free(ct); |
| 614 | kmem_cache_free(nf_conntrack_cachep, ct); | 615 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); |
| 615 | } | 616 | } |
| 616 | EXPORT_SYMBOL_GPL(nf_conntrack_free); | 617 | EXPORT_SYMBOL_GPL(nf_conntrack_free); |
| 617 | 618 | ||
| @@ -1014,7 +1015,7 @@ get_next_corpse(struct net *net, int (*iter)(struct nf_conn *i, void *data), | |||
| 1014 | struct hlist_nulls_node *n; | 1015 | struct hlist_nulls_node *n; |
| 1015 | 1016 | ||
| 1016 | spin_lock_bh(&nf_conntrack_lock); | 1017 | spin_lock_bh(&nf_conntrack_lock); |
| 1017 | for (; *bucket < nf_conntrack_htable_size; (*bucket)++) { | 1018 | for (; *bucket < net->ct.htable_size; (*bucket)++) { |
| 1018 | hlist_nulls_for_each_entry(h, n, &net->ct.hash[*bucket], hnnode) { | 1019 | hlist_nulls_for_each_entry(h, n, &net->ct.hash[*bucket], hnnode) { |
| 1019 | ct = nf_ct_tuplehash_to_ctrack(h); | 1020 | ct = nf_ct_tuplehash_to_ctrack(h); |
| 1020 | if (iter(ct, data)) | 1021 | if (iter(ct, data)) |
| @@ -1113,9 +1114,12 @@ static void nf_ct_release_dying_list(struct net *net) | |||
| 1113 | 1114 | ||
| 1114 | static void nf_conntrack_cleanup_init_net(void) | 1115 | static void nf_conntrack_cleanup_init_net(void) |
| 1115 | { | 1116 | { |
| 1117 | /* wait until all references to nf_conntrack_untracked are dropped */ | ||
| 1118 | while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1) | ||
| 1119 | schedule(); | ||
| 1120 | |||
| 1116 | nf_conntrack_helper_fini(); | 1121 | nf_conntrack_helper_fini(); |
| 1117 | nf_conntrack_proto_fini(); | 1122 | nf_conntrack_proto_fini(); |
| 1118 | kmem_cache_destroy(nf_conntrack_cachep); | ||
| 1119 | } | 1123 | } |
| 1120 | 1124 | ||
| 1121 | static void nf_conntrack_cleanup_net(struct net *net) | 1125 | static void nf_conntrack_cleanup_net(struct net *net) |
| @@ -1127,15 +1131,14 @@ static void nf_conntrack_cleanup_net(struct net *net) | |||
| 1127 | schedule(); | 1131 | schedule(); |
| 1128 | goto i_see_dead_people; | 1132 | goto i_see_dead_people; |
| 1129 | } | 1133 | } |
| 1130 | /* wait until all references to nf_conntrack_untracked are dropped */ | ||
| 1131 | while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1) | ||
| 1132 | schedule(); | ||
| 1133 | 1134 | ||
| 1134 | nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc, | 1135 | nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc, |
| 1135 | nf_conntrack_htable_size); | 1136 | net->ct.htable_size); |
| 1136 | nf_conntrack_ecache_fini(net); | 1137 | nf_conntrack_ecache_fini(net); |
| 1137 | nf_conntrack_acct_fini(net); | 1138 | nf_conntrack_acct_fini(net); |
| 1138 | nf_conntrack_expect_fini(net); | 1139 | nf_conntrack_expect_fini(net); |
| 1140 | kmem_cache_destroy(net->ct.nf_conntrack_cachep); | ||
| 1141 | kfree(net->ct.slabname); | ||
| 1139 | free_percpu(net->ct.stat); | 1142 | free_percpu(net->ct.stat); |
| 1140 | } | 1143 | } |
| 1141 | 1144 | ||
| @@ -1190,10 +1193,12 @@ int nf_conntrack_set_hashsize(const char *val, struct kernel_param *kp) | |||
| 1190 | { | 1193 | { |
| 1191 | int i, bucket, vmalloced, old_vmalloced; | 1194 | int i, bucket, vmalloced, old_vmalloced; |
| 1192 | unsigned int hashsize, old_size; | 1195 | unsigned int hashsize, old_size; |
| 1193 | int rnd; | ||
| 1194 | struct hlist_nulls_head *hash, *old_hash; | 1196 | struct hlist_nulls_head *hash, *old_hash; |
| 1195 | struct nf_conntrack_tuple_hash *h; | 1197 | struct nf_conntrack_tuple_hash *h; |
| 1196 | 1198 | ||
| 1199 | if (current->nsproxy->net_ns != &init_net) | ||
| 1200 | return -EOPNOTSUPP; | ||
| 1201 | |||
| 1197 | /* On boot, we can set this without any fancy locking. */ | 1202 | /* On boot, we can set this without any fancy locking. */ |
| 1198 | if (!nf_conntrack_htable_size) | 1203 | if (!nf_conntrack_htable_size) |
| 1199 | return param_set_uint(val, kp); | 1204 | return param_set_uint(val, kp); |
| @@ -1206,33 +1211,29 @@ int nf_conntrack_set_hashsize(const char *val, struct kernel_param *kp) | |||
| 1206 | if (!hash) | 1211 | if (!hash) |
| 1207 | return -ENOMEM; | 1212 | return -ENOMEM; |
| 1208 | 1213 | ||
| 1209 | /* We have to rehahs for the new table anyway, so we also can | ||
| 1210 | * use a newrandom seed */ | ||
| 1211 | get_random_bytes(&rnd, sizeof(rnd)); | ||
| 1212 | |||
| 1213 | /* Lookups in the old hash might happen in parallel, which means we | 1214 | /* Lookups in the old hash might happen in parallel, which means we |
| 1214 | * might get false negatives during connection lookup. New connections | 1215 | * might get false negatives during connection lookup. New connections |
| 1215 | * created because of a false negative won't make it into the hash | 1216 | * created because of a false negative won't make it into the hash |
| 1216 | * though since that required taking the lock. | 1217 | * though since that required taking the lock. |
| 1217 | */ | 1218 | */ |
| 1218 | spin_lock_bh(&nf_conntrack_lock); | 1219 | spin_lock_bh(&nf_conntrack_lock); |
| 1219 | for (i = 0; i < nf_conntrack_htable_size; i++) { | 1220 | for (i = 0; i < init_net.ct.htable_size; i++) { |
| 1220 | while (!hlist_nulls_empty(&init_net.ct.hash[i])) { | 1221 | while (!hlist_nulls_empty(&init_net.ct.hash[i])) { |
| 1221 | h = hlist_nulls_entry(init_net.ct.hash[i].first, | 1222 | h = hlist_nulls_entry(init_net.ct.hash[i].first, |
| 1222 | struct nf_conntrack_tuple_hash, hnnode); | 1223 | struct nf_conntrack_tuple_hash, hnnode); |
| 1223 | hlist_nulls_del_rcu(&h->hnnode); | 1224 | hlist_nulls_del_rcu(&h->hnnode); |
| 1224 | bucket = __hash_conntrack(&h->tuple, hashsize, rnd); | 1225 | bucket = __hash_conntrack(&h->tuple, hashsize, |
| 1226 | nf_conntrack_hash_rnd); | ||
| 1225 | hlist_nulls_add_head_rcu(&h->hnnode, &hash[bucket]); | 1227 | hlist_nulls_add_head_rcu(&h->hnnode, &hash[bucket]); |
| 1226 | } | 1228 | } |
| 1227 | } | 1229 | } |
| 1228 | old_size = nf_conntrack_htable_size; | 1230 | old_size = init_net.ct.htable_size; |
| 1229 | old_vmalloced = init_net.ct.hash_vmalloc; | 1231 | old_vmalloced = init_net.ct.hash_vmalloc; |
| 1230 | old_hash = init_net.ct.hash; | 1232 | old_hash = init_net.ct.hash; |
| 1231 | 1233 | ||
| 1232 | nf_conntrack_htable_size = hashsize; | 1234 | init_net.ct.htable_size = nf_conntrack_htable_size = hashsize; |
| 1233 | init_net.ct.hash_vmalloc = vmalloced; | 1235 | init_net.ct.hash_vmalloc = vmalloced; |
| 1234 | init_net.ct.hash = hash; | 1236 | init_net.ct.hash = hash; |
| 1235 | nf_conntrack_hash_rnd = rnd; | ||
| 1236 | spin_unlock_bh(&nf_conntrack_lock); | 1237 | spin_unlock_bh(&nf_conntrack_lock); |
| 1237 | 1238 | ||
| 1238 | nf_ct_free_hashtable(old_hash, old_vmalloced, old_size); | 1239 | nf_ct_free_hashtable(old_hash, old_vmalloced, old_size); |
| @@ -1271,15 +1272,6 @@ static int nf_conntrack_init_init_net(void) | |||
| 1271 | NF_CONNTRACK_VERSION, nf_conntrack_htable_size, | 1272 | NF_CONNTRACK_VERSION, nf_conntrack_htable_size, |
| 1272 | nf_conntrack_max); | 1273 | nf_conntrack_max); |
| 1273 | 1274 | ||
| 1274 | nf_conntrack_cachep = kmem_cache_create("nf_conntrack", | ||
| 1275 | sizeof(struct nf_conn), | ||
| 1276 | 0, SLAB_DESTROY_BY_RCU, NULL); | ||
| 1277 | if (!nf_conntrack_cachep) { | ||
| 1278 | printk(KERN_ERR "Unable to create nf_conn slab cache\n"); | ||
| 1279 | ret = -ENOMEM; | ||
| 1280 | goto err_cache; | ||
| 1281 | } | ||
| 1282 | |||
| 1283 | ret = nf_conntrack_proto_init(); | 1275 | ret = nf_conntrack_proto_init(); |
| 1284 | if (ret < 0) | 1276 | if (ret < 0) |
| 1285 | goto err_proto; | 1277 | goto err_proto; |
| @@ -1288,13 +1280,19 @@ static int nf_conntrack_init_init_net(void) | |||
| 1288 | if (ret < 0) | 1280 | if (ret < 0) |
| 1289 | goto err_helper; | 1281 | goto err_helper; |
| 1290 | 1282 | ||
| 1283 | /* Set up fake conntrack: to never be deleted, not in any hashes */ | ||
| 1284 | #ifdef CONFIG_NET_NS | ||
| 1285 | nf_conntrack_untracked.ct_net = &init_net; | ||
| 1286 | #endif | ||
| 1287 | atomic_set(&nf_conntrack_untracked.ct_general.use, 1); | ||
| 1288 | /* - and look it like as a confirmed connection */ | ||
| 1289 | set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status); | ||
| 1290 | |||
| 1291 | return 0; | 1291 | return 0; |
| 1292 | 1292 | ||
| 1293 | err_helper: | 1293 | err_helper: |
| 1294 | nf_conntrack_proto_fini(); | 1294 | nf_conntrack_proto_fini(); |
| 1295 | err_proto: | 1295 | err_proto: |
| 1296 | kmem_cache_destroy(nf_conntrack_cachep); | ||
| 1297 | err_cache: | ||
| 1298 | return ret; | 1296 | return ret; |
| 1299 | } | 1297 | } |
| 1300 | 1298 | ||
| @@ -1316,7 +1314,24 @@ static int nf_conntrack_init_net(struct net *net) | |||
| 1316 | ret = -ENOMEM; | 1314 | ret = -ENOMEM; |
| 1317 | goto err_stat; | 1315 | goto err_stat; |
| 1318 | } | 1316 | } |
| 1319 | net->ct.hash = nf_ct_alloc_hashtable(&nf_conntrack_htable_size, | 1317 | |
| 1318 | net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); | ||
| 1319 | if (!net->ct.slabname) { | ||
| 1320 | ret = -ENOMEM; | ||
| 1321 | goto err_slabname; | ||
| 1322 | } | ||
| 1323 | |||
| 1324 | net->ct.nf_conntrack_cachep = kmem_cache_create(net->ct.slabname, | ||
| 1325 | sizeof(struct nf_conn), 0, | ||
| 1326 | SLAB_DESTROY_BY_RCU, NULL); | ||
| 1327 | if (!net->ct.nf_conntrack_cachep) { | ||
| 1328 | printk(KERN_ERR "Unable to create nf_conn slab cache\n"); | ||
| 1329 | ret = -ENOMEM; | ||
| 1330 | goto err_cache; | ||
| 1331 | } | ||
| 1332 | |||
| 1333 | net->ct.htable_size = nf_conntrack_htable_size; | ||
| 1334 | net->ct.hash = nf_ct_alloc_hashtable(&net->ct.htable_size, | ||
| 1320 | &net->ct.hash_vmalloc, 1); | 1335 | &net->ct.hash_vmalloc, 1); |
| 1321 | if (!net->ct.hash) { | 1336 | if (!net->ct.hash) { |
| 1322 | ret = -ENOMEM; | 1337 | ret = -ENOMEM; |
| @@ -1333,15 +1348,6 @@ static int nf_conntrack_init_net(struct net *net) | |||
| 1333 | if (ret < 0) | 1348 | if (ret < 0) |
| 1334 | goto err_ecache; | 1349 | goto err_ecache; |
| 1335 | 1350 | ||
| 1336 | /* Set up fake conntrack: | ||
| 1337 | - to never be deleted, not in any hashes */ | ||
| 1338 | #ifdef CONFIG_NET_NS | ||
| 1339 | nf_conntrack_untracked.ct_net = &init_net; | ||
| 1340 | #endif | ||
| 1341 | atomic_set(&nf_conntrack_untracked.ct_general.use, 1); | ||
| 1342 | /* - and look it like as a confirmed connection */ | ||
| 1343 | set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status); | ||
| 1344 | |||
| 1345 | return 0; | 1351 | return 0; |
| 1346 | 1352 | ||
| 1347 | err_ecache: | 1353 | err_ecache: |
| @@ -1350,8 +1356,12 @@ err_acct: | |||
| 1350 | nf_conntrack_expect_fini(net); | 1356 | nf_conntrack_expect_fini(net); |
| 1351 | err_expect: | 1357 | err_expect: |
| 1352 | nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc, | 1358 | nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc, |
| 1353 | nf_conntrack_htable_size); | 1359 | net->ct.htable_size); |
| 1354 | err_hash: | 1360 | err_hash: |
| 1361 | kmem_cache_destroy(net->ct.nf_conntrack_cachep); | ||
| 1362 | err_cache: | ||
| 1363 | kfree(net->ct.slabname); | ||
| 1364 | err_slabname: | ||
| 1355 | free_percpu(net->ct.stat); | 1365 | free_percpu(net->ct.stat); |
| 1356 | err_stat: | 1366 | err_stat: |
| 1357 | return ret; | 1367 | return ret; |
diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c index fdf5d2a1d9b4..2f25ff610982 100644 --- a/net/netfilter/nf_conntrack_expect.c +++ b/net/netfilter/nf_conntrack_expect.c | |||
| @@ -569,7 +569,7 @@ static void exp_proc_remove(struct net *net) | |||
| 569 | #endif /* CONFIG_PROC_FS */ | 569 | #endif /* CONFIG_PROC_FS */ |
| 570 | } | 570 | } |
| 571 | 571 | ||
| 572 | module_param_named(expect_hashsize, nf_ct_expect_hsize, uint, 0600); | 572 | module_param_named(expect_hashsize, nf_ct_expect_hsize, uint, 0400); |
| 573 | 573 | ||
| 574 | int nf_conntrack_expect_init(struct net *net) | 574 | int nf_conntrack_expect_init(struct net *net) |
| 575 | { | 575 | { |
| @@ -577,7 +577,7 @@ int nf_conntrack_expect_init(struct net *net) | |||
| 577 | 577 | ||
| 578 | if (net_eq(net, &init_net)) { | 578 | if (net_eq(net, &init_net)) { |
| 579 | if (!nf_ct_expect_hsize) { | 579 | if (!nf_ct_expect_hsize) { |
| 580 | nf_ct_expect_hsize = nf_conntrack_htable_size / 256; | 580 | nf_ct_expect_hsize = net->ct.htable_size / 256; |
| 581 | if (!nf_ct_expect_hsize) | 581 | if (!nf_ct_expect_hsize) |
| 582 | nf_ct_expect_hsize = 1; | 582 | nf_ct_expect_hsize = 1; |
| 583 | } | 583 | } |
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 65c2a7bc3afc..4b1a56bd074c 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
| @@ -192,7 +192,7 @@ static void __nf_conntrack_helper_unregister(struct nf_conntrack_helper *me, | |||
| 192 | /* Get rid of expecteds, set helpers to NULL. */ | 192 | /* Get rid of expecteds, set helpers to NULL. */ |
| 193 | hlist_nulls_for_each_entry(h, nn, &net->ct.unconfirmed, hnnode) | 193 | hlist_nulls_for_each_entry(h, nn, &net->ct.unconfirmed, hnnode) |
| 194 | unhelp(h, me); | 194 | unhelp(h, me); |
| 195 | for (i = 0; i < nf_conntrack_htable_size; i++) { | 195 | for (i = 0; i < net->ct.htable_size; i++) { |
| 196 | hlist_nulls_for_each_entry(h, nn, &net->ct.hash[i], hnnode) | 196 | hlist_nulls_for_each_entry(h, nn, &net->ct.hash[i], hnnode) |
| 197 | unhelp(h, me); | 197 | unhelp(h, me); |
| 198 | } | 198 | } |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 59d8064eb522..0ffe689dfe97 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -594,7 +594,7 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 594 | 594 | ||
| 595 | rcu_read_lock(); | 595 | rcu_read_lock(); |
| 596 | last = (struct nf_conn *)cb->args[1]; | 596 | last = (struct nf_conn *)cb->args[1]; |
| 597 | for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++) { | 597 | for (; cb->args[0] < init_net.ct.htable_size; cb->args[0]++) { |
| 598 | restart: | 598 | restart: |
| 599 | hlist_nulls_for_each_entry_rcu(h, n, &init_net.ct.hash[cb->args[0]], | 599 | hlist_nulls_for_each_entry_rcu(h, n, &init_net.ct.hash[cb->args[0]], |
| 600 | hnnode) { | 600 | hnnode) { |
| @@ -1437,8 +1437,9 @@ ctnetlink_exp_dump_mask(struct sk_buff *skb, | |||
| 1437 | struct nlattr *nest_parms; | 1437 | struct nlattr *nest_parms; |
| 1438 | 1438 | ||
| 1439 | memset(&m, 0xFF, sizeof(m)); | 1439 | memset(&m, 0xFF, sizeof(m)); |
| 1440 | m.src.u.all = mask->src.u.all; | ||
| 1441 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); | 1440 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); |
| 1441 | m.src.u.all = mask->src.u.all; | ||
| 1442 | m.dst.protonum = tuple->dst.protonum; | ||
| 1442 | 1443 | ||
| 1443 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); | 1444 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); |
| 1444 | if (!nest_parms) | 1445 | if (!nest_parms) |
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c index 4b572163784b..023966b569bf 100644 --- a/net/netfilter/nf_conntrack_sip.c +++ b/net/netfilter/nf_conntrack_sip.c | |||
| @@ -376,7 +376,7 @@ int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, | |||
| 376 | dptr += hdr->len; | 376 | dptr += hdr->len; |
| 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && | 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && |
| 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && | 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && |
| 379 | !isalpha(*(dptr + hdr->clen + 1))) | 379 | !isalpha(*(dptr + hdr->clen))) |
| 380 | dptr += hdr->clen; | 380 | dptr += hdr->clen; |
| 381 | else | 381 | else |
| 382 | continue; | 382 | continue; |
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 028aba667ef7..e310f1561bb2 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
| @@ -51,7 +51,7 @@ static struct hlist_nulls_node *ct_get_first(struct seq_file *seq) | |||
| 51 | struct hlist_nulls_node *n; | 51 | struct hlist_nulls_node *n; |
| 52 | 52 | ||
| 53 | for (st->bucket = 0; | 53 | for (st->bucket = 0; |
| 54 | st->bucket < nf_conntrack_htable_size; | 54 | st->bucket < net->ct.htable_size; |
| 55 | st->bucket++) { | 55 | st->bucket++) { |
| 56 | n = rcu_dereference(net->ct.hash[st->bucket].first); | 56 | n = rcu_dereference(net->ct.hash[st->bucket].first); |
| 57 | if (!is_a_nulls(n)) | 57 | if (!is_a_nulls(n)) |
| @@ -69,7 +69,7 @@ static struct hlist_nulls_node *ct_get_next(struct seq_file *seq, | |||
| 69 | head = rcu_dereference(head->next); | 69 | head = rcu_dereference(head->next); |
| 70 | while (is_a_nulls(head)) { | 70 | while (is_a_nulls(head)) { |
| 71 | if (likely(get_nulls_value(head) == st->bucket)) { | 71 | if (likely(get_nulls_value(head) == st->bucket)) { |
| 72 | if (++st->bucket >= nf_conntrack_htable_size) | 72 | if (++st->bucket >= net->ct.htable_size) |
| 73 | return NULL; | 73 | return NULL; |
| 74 | } | 74 | } |
| 75 | head = rcu_dereference(net->ct.hash[st->bucket].first); | 75 | head = rcu_dereference(net->ct.hash[st->bucket].first); |
| @@ -355,7 +355,7 @@ static ctl_table nf_ct_sysctl_table[] = { | |||
| 355 | }, | 355 | }, |
| 356 | { | 356 | { |
| 357 | .procname = "nf_conntrack_buckets", | 357 | .procname = "nf_conntrack_buckets", |
| 358 | .data = &nf_conntrack_htable_size, | 358 | .data = &init_net.ct.htable_size, |
| 359 | .maxlen = sizeof(unsigned int), | 359 | .maxlen = sizeof(unsigned int), |
| 360 | .mode = 0444, | 360 | .mode = 0444, |
| 361 | .proc_handler = proc_dointvec, | 361 | .proc_handler = proc_dointvec, |
| @@ -421,6 +421,7 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) | |||
| 421 | goto out_kmemdup; | 421 | goto out_kmemdup; |
| 422 | 422 | ||
| 423 | table[1].data = &net->ct.count; | 423 | table[1].data = &net->ct.count; |
| 424 | table[2].data = &net->ct.htable_size; | ||
| 424 | table[3].data = &net->ct.sysctl_checksum; | 425 | table[3].data = &net->ct.sysctl_checksum; |
| 425 | table[4].data = &net->ct.sysctl_log_invalid; | 426 | table[4].data = &net->ct.sysctl_log_invalid; |
| 426 | 427 | ||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index a4957bf2ca60..4c5972ba8c78 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -455,9 +455,14 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, | |||
| 455 | if (nl_table[protocol].registered && | 455 | if (nl_table[protocol].registered && |
| 456 | try_module_get(nl_table[protocol].module)) | 456 | try_module_get(nl_table[protocol].module)) |
| 457 | module = nl_table[protocol].module; | 457 | module = nl_table[protocol].module; |
| 458 | else | ||
| 459 | err = -EPROTONOSUPPORT; | ||
| 458 | cb_mutex = nl_table[protocol].cb_mutex; | 460 | cb_mutex = nl_table[protocol].cb_mutex; |
| 459 | netlink_unlock_table(); | 461 | netlink_unlock_table(); |
| 460 | 462 | ||
| 463 | if (err < 0) | ||
| 464 | goto out; | ||
| 465 | |||
| 461 | err = __netlink_create(net, sock, cb_mutex, protocol); | 466 | err = __netlink_create(net, sock, cb_mutex, protocol); |
| 462 | if (err < 0) | 467 | if (err < 0) |
| 463 | goto out_module; | 468 | goto out_module; |
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 929218a47620..21f9c7678aa3 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
| @@ -433,7 +433,7 @@ config NET_ACT_POLICE | |||
| 433 | module. | 433 | module. |
| 434 | 434 | ||
| 435 | To compile this code as a module, choose M here: the | 435 | To compile this code as a module, choose M here: the |
| 436 | module will be called police. | 436 | module will be called act_police. |
| 437 | 437 | ||
| 438 | config NET_ACT_GACT | 438 | config NET_ACT_GACT |
| 439 | tristate "Generic actions" | 439 | tristate "Generic actions" |
| @@ -443,7 +443,7 @@ config NET_ACT_GACT | |||
| 443 | accepting packets. | 443 | accepting packets. |
| 444 | 444 | ||
| 445 | To compile this code as a module, choose M here: the | 445 | To compile this code as a module, choose M here: the |
| 446 | module will be called gact. | 446 | module will be called act_gact. |
| 447 | 447 | ||
| 448 | config GACT_PROB | 448 | config GACT_PROB |
| 449 | bool "Probability support" | 449 | bool "Probability support" |
| @@ -459,7 +459,7 @@ config NET_ACT_MIRRED | |||
| 459 | other devices. | 459 | other devices. |
| 460 | 460 | ||
| 461 | To compile this code as a module, choose M here: the | 461 | To compile this code as a module, choose M here: the |
| 462 | module will be called mirred. | 462 | module will be called act_mirred. |
| 463 | 463 | ||
| 464 | config NET_ACT_IPT | 464 | config NET_ACT_IPT |
| 465 | tristate "IPtables targets" | 465 | tristate "IPtables targets" |
| @@ -469,7 +469,7 @@ config NET_ACT_IPT | |||
| 469 | classification. | 469 | classification. |
| 470 | 470 | ||
| 471 | To compile this code as a module, choose M here: the | 471 | To compile this code as a module, choose M here: the |
| 472 | module will be called ipt. | 472 | module will be called act_ipt. |
| 473 | 473 | ||
| 474 | config NET_ACT_NAT | 474 | config NET_ACT_NAT |
| 475 | tristate "Stateless NAT" | 475 | tristate "Stateless NAT" |
| @@ -479,7 +479,7 @@ config NET_ACT_NAT | |||
| 479 | netfilter for NAT unless you know what you are doing. | 479 | netfilter for NAT unless you know what you are doing. |
| 480 | 480 | ||
| 481 | To compile this code as a module, choose M here: the | 481 | To compile this code as a module, choose M here: the |
| 482 | module will be called nat. | 482 | module will be called act_nat. |
| 483 | 483 | ||
| 484 | config NET_ACT_PEDIT | 484 | config NET_ACT_PEDIT |
| 485 | tristate "Packet Editing" | 485 | tristate "Packet Editing" |
| @@ -488,7 +488,7 @@ config NET_ACT_PEDIT | |||
| 488 | Say Y here if you want to mangle the content of packets. | 488 | Say Y here if you want to mangle the content of packets. |
| 489 | 489 | ||
| 490 | To compile this code as a module, choose M here: the | 490 | To compile this code as a module, choose M here: the |
| 491 | module will be called pedit. | 491 | module will be called act_pedit. |
| 492 | 492 | ||
| 493 | config NET_ACT_SIMP | 493 | config NET_ACT_SIMP |
| 494 | tristate "Simple Example (Debug)" | 494 | tristate "Simple Example (Debug)" |
| @@ -502,7 +502,7 @@ config NET_ACT_SIMP | |||
| 502 | If unsure, say N. | 502 | If unsure, say N. |
| 503 | 503 | ||
| 504 | To compile this code as a module, choose M here: the | 504 | To compile this code as a module, choose M here: the |
| 505 | module will be called simple. | 505 | module will be called act_simple. |
| 506 | 506 | ||
| 507 | config NET_ACT_SKBEDIT | 507 | config NET_ACT_SKBEDIT |
| 508 | tristate "SKB Editing" | 508 | tristate "SKB Editing" |
| @@ -513,7 +513,7 @@ config NET_ACT_SKBEDIT | |||
| 513 | If unsure, say N. | 513 | If unsure, say N. |
| 514 | 514 | ||
| 515 | To compile this code as a module, choose M here: the | 515 | To compile this code as a module, choose M here: the |
| 516 | module will be called skbedit. | 516 | module will be called act_skbedit. |
| 517 | 517 | ||
| 518 | config NET_CLS_IND | 518 | config NET_CLS_IND |
| 519 | bool "Incoming device classification" | 519 | bool "Incoming device classification" |
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 090f24839700..2f3230db7ffb 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl | |||
| @@ -74,8 +74,8 @@ my %VCS_cmds; | |||
| 74 | my %VCS_cmds_git = ( | 74 | my %VCS_cmds_git = ( |
| 75 | "execute_cmd" => \&git_execute_cmd, | 75 | "execute_cmd" => \&git_execute_cmd, |
| 76 | "available" => '(which("git") ne "") && (-d ".git")', | 76 | "available" => '(which("git") ne "") && (-d ".git")', |
| 77 | "find_signers_cmd" => "git log --since=\$email_git_since -- \$file", | 77 | "find_signers_cmd" => "git log --no-color --since=\$email_git_since -- \$file", |
| 78 | "find_commit_signers_cmd" => "git log -1 \$commit", | 78 | "find_commit_signers_cmd" => "git log --no-color -1 \$commit", |
| 79 | "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file", | 79 | "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file", |
| 80 | "blame_file_cmd" => "git blame -l \$file", | 80 | "blame_file_cmd" => "git blame -l \$file", |
| 81 | "commit_pattern" => "^commit [0-9a-f]{40,40}", | 81 | "commit_pattern" => "^commit [0-9a-f]{40,40}", |
diff --git a/scripts/markup_oops.pl b/scripts/markup_oops.pl index ce3e40b01e48..e950f9cde019 100644 --- a/scripts/markup_oops.pl +++ b/scripts/markup_oops.pl | |||
| @@ -158,7 +158,7 @@ while (<STDIN>) { | |||
| 158 | $function = $1; | 158 | $function = $1; |
| 159 | $func_offset = $2; | 159 | $func_offset = $2; |
| 160 | } | 160 | } |
| 161 | if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) { | 161 | if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+0x([0-9a-f]+)\/0x[a-f0-9]/) { |
| 162 | $function = $1; | 162 | $function = $1; |
| 163 | $func_offset = $2; | 163 | $func_offset = $2; |
| 164 | } | 164 | } |
diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index c41afe6639a0..47fb65d1fcbd 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h | |||
| @@ -65,7 +65,6 @@ void integrity_audit_msg(int audit_msgno, struct inode *inode, | |||
| 65 | const char *cause, int result, int info); | 65 | const char *cause, int result, int info); |
| 66 | 66 | ||
| 67 | /* Internal IMA function definitions */ | 67 | /* Internal IMA function definitions */ |
| 68 | void ima_iintcache_init(void); | ||
| 69 | int ima_init(void); | 68 | int ima_init(void); |
| 70 | void ima_cleanup(void); | 69 | void ima_cleanup(void); |
| 71 | int ima_fs_init(void); | 70 | int ima_fs_init(void); |
| @@ -131,7 +130,7 @@ void iint_free(struct kref *kref); | |||
| 131 | void iint_rcu_free(struct rcu_head *rcu); | 130 | void iint_rcu_free(struct rcu_head *rcu); |
| 132 | 131 | ||
| 133 | /* IMA policy related functions */ | 132 | /* IMA policy related functions */ |
| 134 | enum ima_hooks { PATH_CHECK = 1, FILE_MMAP, BPRM_CHECK }; | 133 | enum ima_hooks { FILE_CHECK = 1, FILE_MMAP, BPRM_CHECK }; |
| 135 | 134 | ||
| 136 | int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask); | 135 | int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask); |
| 137 | void ima_init_policy(void); | 136 | void ima_init_policy(void); |
diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index 3cd58b60afd2..2a5e0bcf3887 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c | |||
| @@ -95,12 +95,12 @@ err_out: | |||
| 95 | * ima_must_measure - measure decision based on policy. | 95 | * ima_must_measure - measure decision based on policy. |
| 96 | * @inode: pointer to inode to measure | 96 | * @inode: pointer to inode to measure |
| 97 | * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE) | 97 | * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE) |
| 98 | * @function: calling function (PATH_CHECK, BPRM_CHECK, FILE_MMAP) | 98 | * @function: calling function (FILE_CHECK, BPRM_CHECK, FILE_MMAP) |
| 99 | * | 99 | * |
| 100 | * The policy is defined in terms of keypairs: | 100 | * The policy is defined in terms of keypairs: |
| 101 | * subj=, obj=, type=, func=, mask=, fsmagic= | 101 | * subj=, obj=, type=, func=, mask=, fsmagic= |
| 102 | * subj,obj, and type: are LSM specific. | 102 | * subj,obj, and type: are LSM specific. |
| 103 | * func: PATH_CHECK | BPRM_CHECK | FILE_MMAP | 103 | * func: FILE_CHECK | BPRM_CHECK | FILE_MMAP |
| 104 | * mask: contains the permission mask | 104 | * mask: contains the permission mask |
| 105 | * fsmagic: hex value | 105 | * fsmagic: hex value |
| 106 | * | 106 | * |
diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c index fa592ff1ac1c..0d83edcfc402 100644 --- a/security/integrity/ima/ima_iint.c +++ b/security/integrity/ima/ima_iint.c | |||
| @@ -52,9 +52,6 @@ int ima_inode_alloc(struct inode *inode) | |||
| 52 | struct ima_iint_cache *iint = NULL; | 52 | struct ima_iint_cache *iint = NULL; |
| 53 | int rc = 0; | 53 | int rc = 0; |
| 54 | 54 | ||
| 55 | if (!ima_initialized) | ||
| 56 | return 0; | ||
| 57 | |||
| 58 | iint = kmem_cache_alloc(iint_cache, GFP_NOFS); | 55 | iint = kmem_cache_alloc(iint_cache, GFP_NOFS); |
| 59 | if (!iint) | 56 | if (!iint) |
| 60 | return -ENOMEM; | 57 | return -ENOMEM; |
| @@ -118,8 +115,6 @@ void ima_inode_free(struct inode *inode) | |||
| 118 | { | 115 | { |
| 119 | struct ima_iint_cache *iint; | 116 | struct ima_iint_cache *iint; |
| 120 | 117 | ||
| 121 | if (!ima_initialized) | ||
| 122 | return; | ||
| 123 | spin_lock(&ima_iint_lock); | 118 | spin_lock(&ima_iint_lock); |
| 124 | iint = radix_tree_delete(&ima_iint_store, (unsigned long)inode); | 119 | iint = radix_tree_delete(&ima_iint_store, (unsigned long)inode); |
| 125 | spin_unlock(&ima_iint_lock); | 120 | spin_unlock(&ima_iint_lock); |
| @@ -141,9 +136,11 @@ static void init_once(void *foo) | |||
| 141 | kref_set(&iint->refcount, 1); | 136 | kref_set(&iint->refcount, 1); |
| 142 | } | 137 | } |
| 143 | 138 | ||
| 144 | void __init ima_iintcache_init(void) | 139 | static int __init ima_iintcache_init(void) |
| 145 | { | 140 | { |
| 146 | iint_cache = | 141 | iint_cache = |
| 147 | kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0, | 142 | kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0, |
| 148 | SLAB_PANIC, init_once); | 143 | SLAB_PANIC, init_once); |
| 144 | return 0; | ||
| 149 | } | 145 | } |
| 146 | security_initcall(ima_iintcache_init); | ||
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index a89f44d5e030..294b005d6520 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | * | 14 | * |
| 15 | * File: ima_main.c | 15 | * File: ima_main.c |
| 16 | * implements the IMA hooks: ima_bprm_check, ima_file_mmap, | 16 | * implements the IMA hooks: ima_bprm_check, ima_file_mmap, |
| 17 | * and ima_path_check. | 17 | * and ima_file_check. |
| 18 | */ | 18 | */ |
| 19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
| 20 | #include <linux/file.h> | 20 | #include <linux/file.h> |
| @@ -84,6 +84,36 @@ out: | |||
| 84 | return found; | 84 | return found; |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | /* ima_read_write_check - reflect possible reading/writing errors in the PCR. | ||
| 88 | * | ||
| 89 | * When opening a file for read, if the file is already open for write, | ||
| 90 | * the file could change, resulting in a file measurement error. | ||
| 91 | * | ||
| 92 | * Opening a file for write, if the file is already open for read, results | ||
| 93 | * in a time of measure, time of use (ToMToU) error. | ||
| 94 | * | ||
| 95 | * In either case invalidate the PCR. | ||
| 96 | */ | ||
| 97 | enum iint_pcr_error { TOMTOU, OPEN_WRITERS }; | ||
| 98 | static void ima_read_write_check(enum iint_pcr_error error, | ||
| 99 | struct ima_iint_cache *iint, | ||
| 100 | struct inode *inode, | ||
| 101 | const unsigned char *filename) | ||
| 102 | { | ||
| 103 | switch (error) { | ||
| 104 | case TOMTOU: | ||
| 105 | if (iint->readcount > 0) | ||
| 106 | ima_add_violation(inode, filename, "invalid_pcr", | ||
| 107 | "ToMToU"); | ||
| 108 | break; | ||
| 109 | case OPEN_WRITERS: | ||
| 110 | if (iint->writecount > 0) | ||
| 111 | ima_add_violation(inode, filename, "invalid_pcr", | ||
| 112 | "open_writers"); | ||
| 113 | break; | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 87 | /* | 117 | /* |
| 88 | * Update the counts given an fmode_t | 118 | * Update the counts given an fmode_t |
| 89 | */ | 119 | */ |
| @@ -99,6 +129,47 @@ static void ima_inc_counts(struct ima_iint_cache *iint, fmode_t mode) | |||
| 99 | } | 129 | } |
| 100 | 130 | ||
| 101 | /* | 131 | /* |
| 132 | * ima_counts_get - increment file counts | ||
| 133 | * | ||
| 134 | * Maintain read/write counters for all files, but only | ||
| 135 | * invalidate the PCR for measured files: | ||
| 136 | * - Opening a file for write when already open for read, | ||
| 137 | * results in a time of measure, time of use (ToMToU) error. | ||
| 138 | * - Opening a file for read when already open for write, | ||
| 139 | * could result in a file measurement error. | ||
| 140 | * | ||
| 141 | */ | ||
| 142 | void ima_counts_get(struct file *file) | ||
| 143 | { | ||
| 144 | struct dentry *dentry = file->f_path.dentry; | ||
| 145 | struct inode *inode = dentry->d_inode; | ||
| 146 | fmode_t mode = file->f_mode; | ||
| 147 | struct ima_iint_cache *iint; | ||
| 148 | int rc; | ||
| 149 | |||
| 150 | if (!ima_initialized || !S_ISREG(inode->i_mode)) | ||
| 151 | return; | ||
| 152 | iint = ima_iint_find_get(inode); | ||
| 153 | if (!iint) | ||
| 154 | return; | ||
| 155 | mutex_lock(&iint->mutex); | ||
| 156 | rc = ima_must_measure(iint, inode, MAY_READ, FILE_CHECK); | ||
| 157 | if (rc < 0) | ||
| 158 | goto out; | ||
| 159 | |||
| 160 | if (mode & FMODE_WRITE) { | ||
| 161 | ima_read_write_check(TOMTOU, iint, inode, dentry->d_name.name); | ||
| 162 | goto out; | ||
| 163 | } | ||
| 164 | ima_read_write_check(OPEN_WRITERS, iint, inode, dentry->d_name.name); | ||
| 165 | out: | ||
| 166 | ima_inc_counts(iint, file->f_mode); | ||
| 167 | mutex_unlock(&iint->mutex); | ||
| 168 | |||
| 169 | kref_put(&iint->refcount, iint_free); | ||
| 170 | } | ||
| 171 | |||
| 172 | /* | ||
| 102 | * Decrement ima counts | 173 | * Decrement ima counts |
| 103 | */ | 174 | */ |
| 104 | static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode, | 175 | static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode, |
| @@ -153,123 +224,6 @@ void ima_file_free(struct file *file) | |||
| 153 | kref_put(&iint->refcount, iint_free); | 224 | kref_put(&iint->refcount, iint_free); |
| 154 | } | 225 | } |
| 155 | 226 | ||
| 156 | /* ima_read_write_check - reflect possible reading/writing errors in the PCR. | ||
| 157 | * | ||
| 158 | * When opening a file for read, if the file is already open for write, | ||
| 159 | * the file could change, resulting in a file measurement error. | ||
| 160 | * | ||
| 161 | * Opening a file for write, if the file is already open for read, results | ||
| 162 | * in a time of measure, time of use (ToMToU) error. | ||
| 163 | * | ||
| 164 | * In either case invalidate the PCR. | ||
| 165 | */ | ||
| 166 | enum iint_pcr_error { TOMTOU, OPEN_WRITERS }; | ||
| 167 | static void ima_read_write_check(enum iint_pcr_error error, | ||
| 168 | struct ima_iint_cache *iint, | ||
| 169 | struct inode *inode, | ||
| 170 | const unsigned char *filename) | ||
| 171 | { | ||
| 172 | switch (error) { | ||
| 173 | case TOMTOU: | ||
| 174 | if (iint->readcount > 0) | ||
| 175 | ima_add_violation(inode, filename, "invalid_pcr", | ||
| 176 | "ToMToU"); | ||
| 177 | break; | ||
| 178 | case OPEN_WRITERS: | ||
| 179 | if (iint->writecount > 0) | ||
| 180 | ima_add_violation(inode, filename, "invalid_pcr", | ||
| 181 | "open_writers"); | ||
| 182 | break; | ||
| 183 | } | ||
| 184 | } | ||
| 185 | |||
| 186 | static int get_path_measurement(struct ima_iint_cache *iint, struct file *file, | ||
| 187 | const unsigned char *filename) | ||
| 188 | { | ||
| 189 | int rc = 0; | ||
| 190 | |||
| 191 | ima_inc_counts(iint, file->f_mode); | ||
| 192 | |||
| 193 | rc = ima_collect_measurement(iint, file); | ||
| 194 | if (!rc) | ||
| 195 | ima_store_measurement(iint, file, filename); | ||
| 196 | return rc; | ||
| 197 | } | ||
| 198 | |||
| 199 | /** | ||
| 200 | * ima_path_check - based on policy, collect/store measurement. | ||
| 201 | * @path: contains a pointer to the path to be measured | ||
| 202 | * @mask: contains MAY_READ, MAY_WRITE or MAY_EXECUTE | ||
| 203 | * | ||
| 204 | * Measure the file being open for readonly, based on the | ||
| 205 | * ima_must_measure() policy decision. | ||
| 206 | * | ||
| 207 | * Keep read/write counters for all files, but only | ||
| 208 | * invalidate the PCR for measured files: | ||
| 209 | * - Opening a file for write when already open for read, | ||
| 210 | * results in a time of measure, time of use (ToMToU) error. | ||
| 211 | * - Opening a file for read when already open for write, | ||
| 212 | * could result in a file measurement error. | ||
| 213 | * | ||
| 214 | * Always return 0 and audit dentry_open failures. | ||
| 215 | * (Return code will be based upon measurement appraisal.) | ||
| 216 | */ | ||
| 217 | int ima_path_check(struct path *path, int mask) | ||
| 218 | { | ||
| 219 | struct inode *inode = path->dentry->d_inode; | ||
| 220 | struct ima_iint_cache *iint; | ||
| 221 | struct file *file = NULL; | ||
| 222 | int rc; | ||
| 223 | |||
| 224 | if (!ima_initialized || !S_ISREG(inode->i_mode)) | ||
| 225 | return 0; | ||
| 226 | iint = ima_iint_find_get(inode); | ||
| 227 | if (!iint) | ||
| 228 | return 0; | ||
| 229 | |||
| 230 | mutex_lock(&iint->mutex); | ||
| 231 | |||
| 232 | rc = ima_must_measure(iint, inode, MAY_READ, PATH_CHECK); | ||
| 233 | if (rc < 0) | ||
| 234 | goto out; | ||
| 235 | |||
| 236 | if ((mask & MAY_WRITE) || (mask == 0)) | ||
| 237 | ima_read_write_check(TOMTOU, iint, inode, | ||
| 238 | path->dentry->d_name.name); | ||
| 239 | |||
| 240 | if ((mask & (MAY_WRITE | MAY_READ | MAY_EXEC)) != MAY_READ) | ||
| 241 | goto out; | ||
| 242 | |||
| 243 | ima_read_write_check(OPEN_WRITERS, iint, inode, | ||
| 244 | path->dentry->d_name.name); | ||
| 245 | if (!(iint->flags & IMA_MEASURED)) { | ||
| 246 | struct dentry *dentry = dget(path->dentry); | ||
| 247 | struct vfsmount *mnt = mntget(path->mnt); | ||
| 248 | |||
| 249 | file = dentry_open(dentry, mnt, O_RDONLY | O_LARGEFILE, | ||
| 250 | current_cred()); | ||
| 251 | if (IS_ERR(file)) { | ||
| 252 | int audit_info = 0; | ||
| 253 | |||
| 254 | integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode, | ||
| 255 | dentry->d_name.name, | ||
| 256 | "add_measurement", | ||
| 257 | "dentry_open failed", | ||
| 258 | 1, audit_info); | ||
| 259 | file = NULL; | ||
| 260 | goto out; | ||
| 261 | } | ||
| 262 | rc = get_path_measurement(iint, file, dentry->d_name.name); | ||
| 263 | } | ||
| 264 | out: | ||
| 265 | mutex_unlock(&iint->mutex); | ||
| 266 | if (file) | ||
| 267 | fput(file); | ||
| 268 | kref_put(&iint->refcount, iint_free); | ||
| 269 | return 0; | ||
| 270 | } | ||
| 271 | EXPORT_SYMBOL_GPL(ima_path_check); | ||
| 272 | |||
| 273 | static int process_measurement(struct file *file, const unsigned char *filename, | 227 | static int process_measurement(struct file *file, const unsigned char *filename, |
| 274 | int mask, int function) | 228 | int mask, int function) |
| 275 | { | 229 | { |
| @@ -297,33 +251,6 @@ out: | |||
| 297 | return rc; | 251 | return rc; |
| 298 | } | 252 | } |
| 299 | 253 | ||
| 300 | /* | ||
| 301 | * ima_counts_get - increment file counts | ||
| 302 | * | ||
| 303 | * - for IPC shm and shmat file. | ||
| 304 | * - for nfsd exported files. | ||
| 305 | * | ||
| 306 | * Increment the counts for these files to prevent unnecessary | ||
| 307 | * imbalance messages. | ||
| 308 | */ | ||
| 309 | void ima_counts_get(struct file *file) | ||
| 310 | { | ||
| 311 | struct inode *inode = file->f_dentry->d_inode; | ||
| 312 | struct ima_iint_cache *iint; | ||
| 313 | |||
| 314 | if (!ima_initialized || !S_ISREG(inode->i_mode)) | ||
| 315 | return; | ||
| 316 | iint = ima_iint_find_get(inode); | ||
| 317 | if (!iint) | ||
| 318 | return; | ||
| 319 | mutex_lock(&iint->mutex); | ||
| 320 | ima_inc_counts(iint, file->f_mode); | ||
| 321 | mutex_unlock(&iint->mutex); | ||
| 322 | |||
| 323 | kref_put(&iint->refcount, iint_free); | ||
| 324 | } | ||
| 325 | EXPORT_SYMBOL_GPL(ima_counts_get); | ||
| 326 | |||
| 327 | /** | 254 | /** |
| 328 | * ima_file_mmap - based on policy, collect/store measurement. | 255 | * ima_file_mmap - based on policy, collect/store measurement. |
| 329 | * @file: pointer to the file to be measured (May be NULL) | 256 | * @file: pointer to the file to be measured (May be NULL) |
| @@ -369,11 +296,31 @@ int ima_bprm_check(struct linux_binprm *bprm) | |||
| 369 | return 0; | 296 | return 0; |
| 370 | } | 297 | } |
| 371 | 298 | ||
| 299 | /** | ||
| 300 | * ima_path_check - based on policy, collect/store measurement. | ||
| 301 | * @file: pointer to the file to be measured | ||
| 302 | * @mask: contains MAY_READ, MAY_WRITE or MAY_EXECUTE | ||
| 303 | * | ||
| 304 | * Measure files based on the ima_must_measure() policy decision. | ||
| 305 | * | ||
| 306 | * Always return 0 and audit dentry_open failures. | ||
| 307 | * (Return code will be based upon measurement appraisal.) | ||
| 308 | */ | ||
| 309 | int ima_file_check(struct file *file, int mask) | ||
| 310 | { | ||
| 311 | int rc; | ||
| 312 | |||
| 313 | rc = process_measurement(file, file->f_dentry->d_name.name, | ||
| 314 | mask & (MAY_READ | MAY_WRITE | MAY_EXEC), | ||
| 315 | FILE_CHECK); | ||
| 316 | return 0; | ||
| 317 | } | ||
| 318 | EXPORT_SYMBOL_GPL(ima_file_check); | ||
| 319 | |||
| 372 | static int __init init_ima(void) | 320 | static int __init init_ima(void) |
| 373 | { | 321 | { |
| 374 | int error; | 322 | int error; |
| 375 | 323 | ||
| 376 | ima_iintcache_init(); | ||
| 377 | error = ima_init(); | 324 | error = ima_init(); |
| 378 | ima_initialized = 1; | 325 | ima_initialized = 1; |
| 379 | return error; | 326 | return error; |
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c index e1278399b345..4759d0f99335 100644 --- a/security/integrity/ima/ima_policy.c +++ b/security/integrity/ima/ima_policy.c | |||
| @@ -67,7 +67,7 @@ static struct ima_measure_rule_entry default_rules[] = { | |||
| 67 | .flags = IMA_FUNC | IMA_MASK}, | 67 | .flags = IMA_FUNC | IMA_MASK}, |
| 68 | {.action = MEASURE,.func = BPRM_CHECK,.mask = MAY_EXEC, | 68 | {.action = MEASURE,.func = BPRM_CHECK,.mask = MAY_EXEC, |
| 69 | .flags = IMA_FUNC | IMA_MASK}, | 69 | .flags = IMA_FUNC | IMA_MASK}, |
| 70 | {.action = MEASURE,.func = PATH_CHECK,.mask = MAY_READ,.uid = 0, | 70 | {.action = MEASURE,.func = FILE_CHECK,.mask = MAY_READ,.uid = 0, |
| 71 | .flags = IMA_FUNC | IMA_MASK | IMA_UID}, | 71 | .flags = IMA_FUNC | IMA_MASK | IMA_UID}, |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| @@ -282,8 +282,11 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry) | |||
| 282 | break; | 282 | break; |
| 283 | case Opt_func: | 283 | case Opt_func: |
| 284 | audit_log_format(ab, "func=%s ", args[0].from); | 284 | audit_log_format(ab, "func=%s ", args[0].from); |
| 285 | if (strcmp(args[0].from, "PATH_CHECK") == 0) | 285 | if (strcmp(args[0].from, "FILE_CHECK") == 0) |
| 286 | entry->func = PATH_CHECK; | 286 | entry->func = FILE_CHECK; |
| 287 | /* PATH_CHECK is for backwards compat */ | ||
| 288 | else if (strcmp(args[0].from, "PATH_CHECK") == 0) | ||
| 289 | entry->func = FILE_CHECK; | ||
| 287 | else if (strcmp(args[0].from, "FILE_MMAP") == 0) | 290 | else if (strcmp(args[0].from, "FILE_MMAP") == 0) |
| 288 | entry->func = FILE_MMAP; | 291 | entry->func = FILE_MMAP; |
| 289 | else if (strcmp(args[0].from, "BPRM_CHECK") == 0) | 292 | else if (strcmp(args[0].from, "BPRM_CHECK") == 0) |
diff --git a/security/security.c b/security/security.c index 24e060be9fa5..122b748d0f4c 100644 --- a/security/security.c +++ b/security/security.c | |||
| @@ -666,8 +666,6 @@ int security_file_alloc(struct file *file) | |||
| 666 | void security_file_free(struct file *file) | 666 | void security_file_free(struct file *file) |
| 667 | { | 667 | { |
| 668 | security_ops->file_free_security(file); | 668 | security_ops->file_free_security(file); |
| 669 | if (file->f_dentry) | ||
| 670 | ima_file_free(file); | ||
| 671 | } | 669 | } |
| 672 | 670 | ||
| 673 | int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 671 | int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
diff --git a/sound/pci/ctxfi/ctatc.c b/sound/pci/ctxfi/ctatc.c index cb65bd0dd35b..459c1f62783b 100644 --- a/sound/pci/ctxfi/ctatc.c +++ b/sound/pci/ctxfi/ctatc.c | |||
| @@ -166,18 +166,7 @@ static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm) | |||
| 166 | 166 | ||
| 167 | static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index) | 167 | static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index) |
| 168 | { | 168 | { |
| 169 | struct ct_vm *vm; | 169 | return atc->vm->get_ptp_phys(atc->vm, index); |
| 170 | void *kvirt_addr; | ||
| 171 | unsigned long phys_addr; | ||
| 172 | |||
| 173 | vm = atc->vm; | ||
| 174 | kvirt_addr = vm->get_ptp_virt(vm, index); | ||
| 175 | if (kvirt_addr == NULL) | ||
| 176 | phys_addr = (~0UL); | ||
| 177 | else | ||
| 178 | phys_addr = virt_to_phys(kvirt_addr); | ||
| 179 | |||
| 180 | return phys_addr; | ||
| 181 | } | 170 | } |
| 182 | 171 | ||
| 183 | static unsigned int convert_format(snd_pcm_format_t snd_format) | 172 | static unsigned int convert_format(snd_pcm_format_t snd_format) |
| @@ -1669,7 +1658,7 @@ int __devinit ct_atc_create(struct snd_card *card, struct pci_dev *pci, | |||
| 1669 | } | 1658 | } |
| 1670 | 1659 | ||
| 1671 | /* Set up device virtual memory management object */ | 1660 | /* Set up device virtual memory management object */ |
| 1672 | err = ct_vm_create(&atc->vm); | 1661 | err = ct_vm_create(&atc->vm, pci); |
| 1673 | if (err < 0) | 1662 | if (err < 0) |
| 1674 | goto error1; | 1663 | goto error1; |
| 1675 | 1664 | ||
diff --git a/sound/pci/ctxfi/ctvmem.c b/sound/pci/ctxfi/ctvmem.c index 6b78752e9503..65da6e466f80 100644 --- a/sound/pci/ctxfi/ctvmem.c +++ b/sound/pci/ctxfi/ctvmem.c | |||
| @@ -138,7 +138,7 @@ ct_vm_map(struct ct_vm *vm, struct snd_pcm_substream *substream, int size) | |||
| 138 | return NULL; | 138 | return NULL; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | ptp = vm->ptp[0]; | 141 | ptp = (unsigned long *)vm->ptp[0].area; |
| 142 | pte_start = (block->addr >> CT_PAGE_SHIFT); | 142 | pte_start = (block->addr >> CT_PAGE_SHIFT); |
| 143 | pages = block->size >> CT_PAGE_SHIFT; | 143 | pages = block->size >> CT_PAGE_SHIFT; |
| 144 | for (i = 0; i < pages; i++) { | 144 | for (i = 0; i < pages; i++) { |
| @@ -158,25 +158,25 @@ static void ct_vm_unmap(struct ct_vm *vm, struct ct_vm_block *block) | |||
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | /* * | 160 | /* * |
| 161 | * return the host (kmalloced) addr of the @index-th device | 161 | * return the host physical addr of the @index-th device |
| 162 | * page talbe page on success, or NULL on failure. | 162 | * page table page on success, or ~0UL on failure. |
| 163 | * The first returned NULL indicates the termination. | 163 | * The first returned ~0UL indicates the termination. |
| 164 | * */ | 164 | * */ |
| 165 | static void * | 165 | static dma_addr_t |
| 166 | ct_get_ptp_virt(struct ct_vm *vm, int index) | 166 | ct_get_ptp_phys(struct ct_vm *vm, int index) |
| 167 | { | 167 | { |
| 168 | void *addr; | 168 | dma_addr_t addr; |
| 169 | 169 | ||
| 170 | addr = (index >= CT_PTP_NUM) ? NULL : vm->ptp[index]; | 170 | addr = (index >= CT_PTP_NUM) ? ~0UL : vm->ptp[index].addr; |
| 171 | 171 | ||
| 172 | return addr; | 172 | return addr; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | int ct_vm_create(struct ct_vm **rvm) | 175 | int ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci) |
| 176 | { | 176 | { |
| 177 | struct ct_vm *vm; | 177 | struct ct_vm *vm; |
| 178 | struct ct_vm_block *block; | 178 | struct ct_vm_block *block; |
| 179 | int i; | 179 | int i, err = 0; |
| 180 | 180 | ||
| 181 | *rvm = NULL; | 181 | *rvm = NULL; |
| 182 | 182 | ||
| @@ -188,23 +188,21 @@ int ct_vm_create(struct ct_vm **rvm) | |||
| 188 | 188 | ||
| 189 | /* Allocate page table pages */ | 189 | /* Allocate page table pages */ |
| 190 | for (i = 0; i < CT_PTP_NUM; i++) { | 190 | for (i = 0; i < CT_PTP_NUM; i++) { |
| 191 | vm->ptp[i] = kmalloc(PAGE_SIZE, GFP_KERNEL); | 191 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, |
| 192 | if (!vm->ptp[i]) | 192 | snd_dma_pci_data(pci), |
| 193 | PAGE_SIZE, &vm->ptp[i]); | ||
| 194 | if (err < 0) | ||
| 193 | break; | 195 | break; |
| 194 | } | 196 | } |
| 195 | if (!i) { | 197 | if (err < 0) { |
| 196 | /* no page table pages are allocated */ | 198 | /* no page table pages are allocated */ |
| 197 | kfree(vm); | 199 | ct_vm_destroy(vm); |
| 198 | return -ENOMEM; | 200 | return -ENOMEM; |
| 199 | } | 201 | } |
| 200 | vm->size = CT_ADDRS_PER_PAGE * i; | 202 | vm->size = CT_ADDRS_PER_PAGE * i; |
| 201 | /* Initialise remaining ptps */ | ||
| 202 | for (; i < CT_PTP_NUM; i++) | ||
| 203 | vm->ptp[i] = NULL; | ||
| 204 | |||
| 205 | vm->map = ct_vm_map; | 203 | vm->map = ct_vm_map; |
| 206 | vm->unmap = ct_vm_unmap; | 204 | vm->unmap = ct_vm_unmap; |
| 207 | vm->get_ptp_virt = ct_get_ptp_virt; | 205 | vm->get_ptp_phys = ct_get_ptp_phys; |
| 208 | INIT_LIST_HEAD(&vm->unused); | 206 | INIT_LIST_HEAD(&vm->unused); |
| 209 | INIT_LIST_HEAD(&vm->used); | 207 | INIT_LIST_HEAD(&vm->used); |
| 210 | block = kzalloc(sizeof(*block), GFP_KERNEL); | 208 | block = kzalloc(sizeof(*block), GFP_KERNEL); |
| @@ -242,7 +240,7 @@ void ct_vm_destroy(struct ct_vm *vm) | |||
| 242 | 240 | ||
| 243 | /* free allocated page table pages */ | 241 | /* free allocated page table pages */ |
| 244 | for (i = 0; i < CT_PTP_NUM; i++) | 242 | for (i = 0; i < CT_PTP_NUM; i++) |
| 245 | kfree(vm->ptp[i]); | 243 | snd_dma_free_pages(&vm->ptp[i]); |
| 246 | 244 | ||
| 247 | vm->size = 0; | 245 | vm->size = 0; |
| 248 | 246 | ||
diff --git a/sound/pci/ctxfi/ctvmem.h b/sound/pci/ctxfi/ctvmem.h index 01e4fd0386a3..b23adfca4de6 100644 --- a/sound/pci/ctxfi/ctvmem.h +++ b/sound/pci/ctxfi/ctvmem.h | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | 22 | ||
| 23 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | #include <linux/pci.h> | ||
| 26 | #include <sound/memalloc.h> | ||
| 25 | 27 | ||
| 26 | /* The chip can handle the page table of 4k pages | 28 | /* The chip can handle the page table of 4k pages |
| 27 | * (emu20k1 can handle even 8k pages, but we don't use it right now) | 29 | * (emu20k1 can handle even 8k pages, but we don't use it right now) |
| @@ -41,7 +43,7 @@ struct snd_pcm_substream; | |||
| 41 | 43 | ||
| 42 | /* Virtual memory management object for card device */ | 44 | /* Virtual memory management object for card device */ |
| 43 | struct ct_vm { | 45 | struct ct_vm { |
| 44 | void *ptp[CT_PTP_NUM]; /* Device page table pages */ | 46 | struct snd_dma_buffer ptp[CT_PTP_NUM]; /* Device page table pages */ |
| 45 | unsigned int size; /* Available addr space in bytes */ | 47 | unsigned int size; /* Available addr space in bytes */ |
| 46 | struct list_head unused; /* List of unused blocks */ | 48 | struct list_head unused; /* List of unused blocks */ |
| 47 | struct list_head used; /* List of used blocks */ | 49 | struct list_head used; /* List of used blocks */ |
| @@ -52,10 +54,10 @@ struct ct_vm { | |||
| 52 | int size); | 54 | int size); |
| 53 | /* Unmap device logical addr area. */ | 55 | /* Unmap device logical addr area. */ |
| 54 | void (*unmap)(struct ct_vm *, struct ct_vm_block *block); | 56 | void (*unmap)(struct ct_vm *, struct ct_vm_block *block); |
| 55 | void *(*get_ptp_virt)(struct ct_vm *vm, int index); | 57 | dma_addr_t (*get_ptp_phys)(struct ct_vm *vm, int index); |
| 56 | }; | 58 | }; |
| 57 | 59 | ||
| 58 | int ct_vm_create(struct ct_vm **rvm); | 60 | int ct_vm_create(struct ct_vm **rvm, struct pci_dev *pci); |
| 59 | void ct_vm_destroy(struct ct_vm *vm); | 61 | void ct_vm_destroy(struct ct_vm *vm); |
| 60 | 62 | ||
| 61 | #endif /* CTVMEM_H */ | 63 | #endif /* CTVMEM_H */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 565de38a3fc7..3600e9cc9bc6 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -426,6 +426,7 @@ struct azx { | |||
| 426 | 426 | ||
| 427 | /* flags */ | 427 | /* flags */ |
| 428 | int position_fix; | 428 | int position_fix; |
| 429 | int poll_count; | ||
| 429 | unsigned int running :1; | 430 | unsigned int running :1; |
| 430 | unsigned int initialized :1; | 431 | unsigned int initialized :1; |
| 431 | unsigned int single_cmd :1; | 432 | unsigned int single_cmd :1; |
| @@ -506,7 +507,7 @@ static char *driver_short_names[] __devinitdata = { | |||
| 506 | #define get_azx_dev(substream) (substream->runtime->private_data) | 507 | #define get_azx_dev(substream) (substream->runtime->private_data) |
| 507 | 508 | ||
| 508 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); | 509 | static int azx_acquire_irq(struct azx *chip, int do_disconnect); |
| 509 | 510 | static int azx_send_cmd(struct hda_bus *bus, unsigned int val); | |
| 510 | /* | 511 | /* |
| 511 | * Interface for HD codec | 512 | * Interface for HD codec |
| 512 | */ | 513 | */ |
| @@ -664,11 +665,12 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 664 | { | 665 | { |
| 665 | struct azx *chip = bus->private_data; | 666 | struct azx *chip = bus->private_data; |
| 666 | unsigned long timeout; | 667 | unsigned long timeout; |
| 668 | int do_poll = 0; | ||
| 667 | 669 | ||
| 668 | again: | 670 | again: |
| 669 | timeout = jiffies + msecs_to_jiffies(1000); | 671 | timeout = jiffies + msecs_to_jiffies(1000); |
| 670 | for (;;) { | 672 | for (;;) { |
| 671 | if (chip->polling_mode) { | 673 | if (chip->polling_mode || do_poll) { |
| 672 | spin_lock_irq(&chip->reg_lock); | 674 | spin_lock_irq(&chip->reg_lock); |
| 673 | azx_update_rirb(chip); | 675 | azx_update_rirb(chip); |
| 674 | spin_unlock_irq(&chip->reg_lock); | 676 | spin_unlock_irq(&chip->reg_lock); |
| @@ -676,6 +678,9 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 676 | if (!chip->rirb.cmds[addr]) { | 678 | if (!chip->rirb.cmds[addr]) { |
| 677 | smp_rmb(); | 679 | smp_rmb(); |
| 678 | bus->rirb_error = 0; | 680 | bus->rirb_error = 0; |
| 681 | |||
| 682 | if (!do_poll) | ||
| 683 | chip->poll_count = 0; | ||
| 679 | return chip->rirb.res[addr]; /* the last value */ | 684 | return chip->rirb.res[addr]; /* the last value */ |
| 680 | } | 685 | } |
| 681 | if (time_after(jiffies, timeout)) | 686 | if (time_after(jiffies, timeout)) |
| @@ -688,6 +693,16 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | |||
| 688 | } | 693 | } |
| 689 | } | 694 | } |
| 690 | 695 | ||
| 696 | if (!chip->polling_mode && chip->poll_count < 2) { | ||
| 697 | snd_printdd(SFX "azx_get_response timeout, " | ||
| 698 | "polling the codec once: last cmd=0x%08x\n", | ||
| 699 | chip->last_cmd[addr]); | ||
| 700 | do_poll = 1; | ||
| 701 | chip->poll_count++; | ||
| 702 | goto again; | ||
| 703 | } | ||
| 704 | |||
| 705 | |||
| 691 | if (!chip->polling_mode) { | 706 | if (!chip->polling_mode) { |
| 692 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " | 707 | snd_printk(KERN_WARNING SFX "azx_get_response timeout, " |
| 693 | "switching to polling mode: last cmd=0x%08x\n", | 708 | "switching to polling mode: last cmd=0x%08x\n", |
| @@ -1878,6 +1893,9 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) | |||
| 1878 | 1893 | ||
| 1879 | if (!bdl_pos_adj[chip->dev_index]) | 1894 | if (!bdl_pos_adj[chip->dev_index]) |
| 1880 | return 1; /* no delayed ack */ | 1895 | return 1; /* no delayed ack */ |
| 1896 | if (WARN_ONCE(!azx_dev->period_bytes, | ||
| 1897 | "hda-intel: zero azx_dev->period_bytes")) | ||
| 1898 | return 0; /* this shouldn't happen! */ | ||
| 1881 | if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) | 1899 | if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) |
| 1882 | return 0; /* NG - it's below the period boundary */ | 1900 | return 0; /* NG - it's below the period boundary */ |
| 1883 | return 1; /* OK, it's fine */ | 1901 | return 1; /* OK, it's fine */ |
| @@ -2043,7 +2061,7 @@ static int azx_acquire_irq(struct azx *chip, int do_disconnect) | |||
| 2043 | { | 2061 | { |
| 2044 | if (request_irq(chip->pci->irq, azx_interrupt, | 2062 | if (request_irq(chip->pci->irq, azx_interrupt, |
| 2045 | chip->msi ? 0 : IRQF_SHARED, | 2063 | chip->msi ? 0 : IRQF_SHARED, |
| 2046 | "HDA Intel", chip)) { | 2064 | "hda_intel", chip)) { |
| 2047 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " | 2065 | printk(KERN_ERR "hda-intel: unable to grab IRQ %d, " |
| 2048 | "disabling device\n", chip->pci->irq); | 2066 | "disabling device\n", chip->pci->irq); |
| 2049 | if (do_disconnect) | 2067 | if (do_disconnect) |
diff --git a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c index 765d7bd4c3d4..9e66f6d306f8 100644 --- a/sound/pci/ice1712/aureon.c +++ b/sound/pci/ice1712/aureon.c | |||
| @@ -703,11 +703,13 @@ static void wm_set_vol(struct snd_ice1712 *ice, unsigned int index, unsigned sho | |||
| 703 | { | 703 | { |
| 704 | unsigned char nvol; | 704 | unsigned char nvol; |
| 705 | 705 | ||
| 706 | if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE)) | 706 | if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE)) { |
| 707 | nvol = 0; | 707 | nvol = 0; |
| 708 | else | 708 | } else { |
| 709 | nvol = ((vol % WM_VOL_CNT) * (master % WM_VOL_CNT)) / | 709 | nvol = ((vol % WM_VOL_CNT) * (master % WM_VOL_CNT)) / |
| 710 | WM_VOL_MAX; | 710 | WM_VOL_MAX; |
| 711 | nvol += 0x1b; | ||
| 712 | } | ||
| 711 | 713 | ||
| 712 | wm_put(ice, index, nvol); | 714 | wm_put(ice, index, nvol); |
| 713 | wm_put_nocache(ice, index, 0x180 | nvol); | 715 | wm_put_nocache(ice, index, 0x180 | nvol); |
| @@ -778,7 +780,7 @@ static int wm_master_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ | |||
| 778 | for (ch = 0; ch < 2; ch++) { | 780 | for (ch = 0; ch < 2; ch++) { |
| 779 | unsigned int vol = ucontrol->value.integer.value[ch]; | 781 | unsigned int vol = ucontrol->value.integer.value[ch]; |
| 780 | if (vol > WM_VOL_MAX) | 782 | if (vol > WM_VOL_MAX) |
| 781 | continue; | 783 | vol = WM_VOL_MAX; |
| 782 | vol |= spec->master[ch] & WM_VOL_MUTE; | 784 | vol |= spec->master[ch] & WM_VOL_MUTE; |
| 783 | if (vol != spec->master[ch]) { | 785 | if (vol != spec->master[ch]) { |
| 784 | int dac; | 786 | int dac; |
| @@ -834,8 +836,8 @@ static int wm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value * | |||
| 834 | for (i = 0; i < voices; i++) { | 836 | for (i = 0; i < voices; i++) { |
| 835 | unsigned int vol = ucontrol->value.integer.value[i]; | 837 | unsigned int vol = ucontrol->value.integer.value[i]; |
| 836 | if (vol > WM_VOL_MAX) | 838 | if (vol > WM_VOL_MAX) |
| 837 | continue; | 839 | vol = WM_VOL_MAX; |
| 838 | vol |= spec->vol[ofs+i]; | 840 | vol |= spec->vol[ofs+i] & WM_VOL_MUTE; |
| 839 | if (vol != spec->vol[ofs+i]) { | 841 | if (vol != spec->vol[ofs+i]) { |
| 840 | spec->vol[ofs+i] = vol; | 842 | spec->vol[ofs+i] = vol; |
| 841 | idx = WM_DAC_ATTEN + ofs + i; | 843 | idx = WM_DAC_ATTEN + ofs + i; |
diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c index 71b2c161158d..68980c19a3bc 100644 --- a/sound/soc/omap/omap3pandora.c +++ b/sound/soc/omap/omap3pandora.c | |||
| @@ -145,6 +145,7 @@ static const struct snd_soc_dapm_widget omap3pandora_in_dapm_widgets[] = { | |||
| 145 | }; | 145 | }; |
| 146 | 146 | ||
| 147 | static const struct snd_soc_dapm_route omap3pandora_out_map[] = { | 147 | static const struct snd_soc_dapm_route omap3pandora_out_map[] = { |
| 148 | {"PCM DAC", NULL, "APLL Enable"}, | ||
| 148 | {"Headphone Amplifier", NULL, "PCM DAC"}, | 149 | {"Headphone Amplifier", NULL, "PCM DAC"}, |
| 149 | {"Line Out", NULL, "PCM DAC"}, | 150 | {"Line Out", NULL, "PCM DAC"}, |
| 150 | {"Headphone Jack", NULL, "Headphone Amplifier"}, | 151 | {"Headphone Jack", NULL, "Headphone Amplifier"}, |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index ddc584b64871..4b91d8cf00ec 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -705,7 +705,7 @@ static void print_mapped_keys(void) | |||
| 705 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); | 705 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); |
| 706 | 706 | ||
| 707 | fprintf(stdout, | 707 | fprintf(stdout, |
| 708 | "\t[K] hide kernel_symbols symbols. \t(%s)\n", | 708 | "\t[K] hide kernel_symbols symbols. \t(%s)\n", |
| 709 | hide_kernel_symbols ? "yes" : "no"); | 709 | hide_kernel_symbols ? "yes" : "no"); |
| 710 | fprintf(stdout, | 710 | fprintf(stdout, |
| 711 | "\t[U] hide user symbols. \t(%s)\n", | 711 | "\t[U] hide user symbols. \t(%s)\n", |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index bb0fd6da2d56..8a9e6baa3099 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -295,10 +295,10 @@ void thread__find_addr_location(struct thread *self, | |||
| 295 | al->thread = self; | 295 | al->thread = self; |
| 296 | al->addr = addr; | 296 | al->addr = addr; |
| 297 | 297 | ||
| 298 | if (cpumode & PERF_RECORD_MISC_KERNEL) { | 298 | if (cpumode == PERF_RECORD_MISC_KERNEL) { |
| 299 | al->level = 'k'; | 299 | al->level = 'k'; |
| 300 | mg = &session->kmaps; | 300 | mg = &session->kmaps; |
| 301 | } else if (cpumode & PERF_RECORD_MISC_USER) | 301 | } else if (cpumode == PERF_RECORD_MISC_USER) |
| 302 | al->level = '.'; | 302 | al->level = '.'; |
| 303 | else { | 303 | else { |
| 304 | al->level = 'H'; | 304 | al->level = 'H'; |
