Annotation of /trunk/kernel-magellan/patches-4.8/0110-4.8.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2850 -
(hide annotations)
(download)
Fri Jan 6 09:45:08 2017 UTC (7 years, 8 months ago) by niro
File size: 79029 byte(s)
Fri Jan 6 09:45:08 2017 UTC (7 years, 8 months ago) by niro
File size: 79029 byte(s)
-linux-4.8.11
1 | niro | 2850 | diff --git a/Makefile b/Makefile |
2 | index 7cf2b4985703..2b1bcbacebcd 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 8 | ||
8 | -SUBLEVEL = 10 | ||
9 | +SUBLEVEL = 11 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Psychotic Stoned Sheep | ||
12 | |||
13 | @@ -399,11 +399,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ | ||
14 | -fno-strict-aliasing -fno-common \ | ||
15 | -Werror-implicit-function-declaration \ | ||
16 | -Wno-format-security \ | ||
17 | - -std=gnu89 | ||
18 | + -std=gnu89 $(call cc-option,-fno-PIE) | ||
19 | + | ||
20 | |||
21 | KBUILD_AFLAGS_KERNEL := | ||
22 | KBUILD_CFLAGS_KERNEL := | ||
23 | -KBUILD_AFLAGS := -D__ASSEMBLY__ | ||
24 | +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) | ||
25 | KBUILD_AFLAGS_MODULE := -DMODULE | ||
26 | KBUILD_CFLAGS_MODULE := -DMODULE | ||
27 | KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds | ||
28 | @@ -621,6 +622,7 @@ include arch/$(SRCARCH)/Makefile | ||
29 | |||
30 | KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) | ||
31 | KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) | ||
32 | +KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) | ||
33 | |||
34 | ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE | ||
35 | KBUILD_CFLAGS += -Os | ||
36 | diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts | ||
37 | index dec4b073ceb1..379939699164 100644 | ||
38 | --- a/arch/arm/boot/dts/imx53-qsb.dts | ||
39 | +++ b/arch/arm/boot/dts/imx53-qsb.dts | ||
40 | @@ -64,8 +64,8 @@ | ||
41 | }; | ||
42 | |||
43 | ldo3_reg: ldo3 { | ||
44 | - regulator-min-microvolt = <600000>; | ||
45 | - regulator-max-microvolt = <1800000>; | ||
46 | + regulator-min-microvolt = <1725000>; | ||
47 | + regulator-max-microvolt = <3300000>; | ||
48 | regulator-always-on; | ||
49 | }; | ||
50 | |||
51 | @@ -76,8 +76,8 @@ | ||
52 | }; | ||
53 | |||
54 | ldo5_reg: ldo5 { | ||
55 | - regulator-min-microvolt = <1725000>; | ||
56 | - regulator-max-microvolt = <3300000>; | ||
57 | + regulator-min-microvolt = <1200000>; | ||
58 | + regulator-max-microvolt = <3600000>; | ||
59 | regulator-always-on; | ||
60 | }; | ||
61 | |||
62 | @@ -100,14 +100,14 @@ | ||
63 | }; | ||
64 | |||
65 | ldo9_reg: ldo9 { | ||
66 | - regulator-min-microvolt = <1200000>; | ||
67 | + regulator-min-microvolt = <1250000>; | ||
68 | regulator-max-microvolt = <3600000>; | ||
69 | regulator-always-on; | ||
70 | }; | ||
71 | |||
72 | ldo10_reg: ldo10 { | ||
73 | - regulator-min-microvolt = <1250000>; | ||
74 | - regulator-max-microvolt = <3650000>; | ||
75 | + regulator-min-microvolt = <1200000>; | ||
76 | + regulator-max-microvolt = <3600000>; | ||
77 | regulator-always-on; | ||
78 | }; | ||
79 | }; | ||
80 | diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h | ||
81 | index 2065f46fa740..38b6a2b49d68 100644 | ||
82 | --- a/arch/arm64/include/asm/perf_event.h | ||
83 | +++ b/arch/arm64/include/asm/perf_event.h | ||
84 | @@ -46,7 +46,15 @@ | ||
85 | #define ARMV8_PMU_EVTYPE_MASK 0xc800ffff /* Mask for writable bits */ | ||
86 | #define ARMV8_PMU_EVTYPE_EVENT 0xffff /* Mask for EVENT bits */ | ||
87 | |||
88 | -#define ARMV8_PMU_EVTYPE_EVENT_SW_INCR 0 /* Software increment event */ | ||
89 | +/* | ||
90 | + * PMUv3 event types: required events | ||
91 | + */ | ||
92 | +#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00 | ||
93 | +#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03 | ||
94 | +#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04 | ||
95 | +#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10 | ||
96 | +#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11 | ||
97 | +#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12 | ||
98 | |||
99 | /* | ||
100 | * Event filters for PMUv3 | ||
101 | diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c | ||
102 | index 838ccf123307..2c4df1520c45 100644 | ||
103 | --- a/arch/arm64/kernel/perf_event.c | ||
104 | +++ b/arch/arm64/kernel/perf_event.c | ||
105 | @@ -30,17 +30,9 @@ | ||
106 | |||
107 | /* | ||
108 | * ARMv8 PMUv3 Performance Events handling code. | ||
109 | - * Common event types. | ||
110 | + * Common event types (some are defined in asm/perf_event.h). | ||
111 | */ | ||
112 | |||
113 | -/* Required events. */ | ||
114 | -#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00 | ||
115 | -#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03 | ||
116 | -#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04 | ||
117 | -#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10 | ||
118 | -#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11 | ||
119 | -#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12 | ||
120 | - | ||
121 | /* At least one of the following is required. */ | ||
122 | #define ARMV8_PMUV3_PERFCTR_INST_RETIRED 0x08 | ||
123 | #define ARMV8_PMUV3_PERFCTR_INST_SPEC 0x1B | ||
124 | diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c | ||
125 | index e51367d159d0..31c144f7339a 100644 | ||
126 | --- a/arch/arm64/kvm/sys_regs.c | ||
127 | +++ b/arch/arm64/kvm/sys_regs.c | ||
128 | @@ -602,8 +602,14 @@ static bool access_pmu_evcntr(struct kvm_vcpu *vcpu, | ||
129 | |||
130 | idx = ARMV8_PMU_CYCLE_IDX; | ||
131 | } else { | ||
132 | - BUG(); | ||
133 | + return false; | ||
134 | } | ||
135 | + } else if (r->CRn == 0 && r->CRm == 9) { | ||
136 | + /* PMCCNTR */ | ||
137 | + if (pmu_access_event_counter_el0_disabled(vcpu)) | ||
138 | + return false; | ||
139 | + | ||
140 | + idx = ARMV8_PMU_CYCLE_IDX; | ||
141 | } else if (r->CRn == 14 && (r->CRm & 12) == 8) { | ||
142 | /* PMEVCNTRn_EL0 */ | ||
143 | if (pmu_access_event_counter_el0_disabled(vcpu)) | ||
144 | @@ -611,7 +617,7 @@ static bool access_pmu_evcntr(struct kvm_vcpu *vcpu, | ||
145 | |||
146 | idx = ((r->CRm & 3) << 3) | (r->Op2 & 7); | ||
147 | } else { | ||
148 | - BUG(); | ||
149 | + return false; | ||
150 | } | ||
151 | |||
152 | if (!pmu_counter_idx_valid(vcpu, idx)) | ||
153 | diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c | ||
154 | index 7ac8e6eaab5b..8d586cff8a41 100644 | ||
155 | --- a/arch/powerpc/kernel/setup_64.c | ||
156 | +++ b/arch/powerpc/kernel/setup_64.c | ||
157 | @@ -226,17 +226,25 @@ static void __init configure_exceptions(void) | ||
158 | if (firmware_has_feature(FW_FEATURE_OPAL)) | ||
159 | opal_configure_cores(); | ||
160 | |||
161 | - /* Enable AIL if supported, and we are in hypervisor mode */ | ||
162 | - if (early_cpu_has_feature(CPU_FTR_HVMODE) && | ||
163 | - early_cpu_has_feature(CPU_FTR_ARCH_207S)) { | ||
164 | - unsigned long lpcr = mfspr(SPRN_LPCR); | ||
165 | - mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3); | ||
166 | - } | ||
167 | + /* AIL on native is done in cpu_ready_for_interrupts() */ | ||
168 | } | ||
169 | } | ||
170 | |||
171 | static void cpu_ready_for_interrupts(void) | ||
172 | { | ||
173 | + /* | ||
174 | + * Enable AIL if supported, and we are in hypervisor mode. This | ||
175 | + * is called once for every processor. | ||
176 | + * | ||
177 | + * If we are not in hypervisor mode the job is done once for | ||
178 | + * the whole partition in configure_exceptions(). | ||
179 | + */ | ||
180 | + if (early_cpu_has_feature(CPU_FTR_HVMODE) && | ||
181 | + early_cpu_has_feature(CPU_FTR_ARCH_207S)) { | ||
182 | + unsigned long lpcr = mfspr(SPRN_LPCR); | ||
183 | + mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3); | ||
184 | + } | ||
185 | + | ||
186 | /* Set IR and DR in PACA MSR */ | ||
187 | get_paca()->kernel_msr = MSR_KERNEL; | ||
188 | } | ||
189 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c | ||
190 | index b81fe2d63e15..1e81a37c034e 100644 | ||
191 | --- a/arch/x86/kernel/cpu/amd.c | ||
192 | +++ b/arch/x86/kernel/cpu/amd.c | ||
193 | @@ -347,7 +347,6 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c) | ||
194 | #ifdef CONFIG_SMP | ||
195 | unsigned bits; | ||
196 | int cpu = smp_processor_id(); | ||
197 | - unsigned int socket_id, core_complex_id; | ||
198 | |||
199 | bits = c->x86_coreid_bits; | ||
200 | /* Low order bits define the core id (index of core in socket) */ | ||
201 | @@ -365,10 +364,7 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c) | ||
202 | if (c->x86 != 0x17 || !cpuid_edx(0x80000006)) | ||
203 | return; | ||
204 | |||
205 | - socket_id = (c->apicid >> bits) - 1; | ||
206 | - core_complex_id = (c->apicid & ((1 << bits) - 1)) >> 3; | ||
207 | - | ||
208 | - per_cpu(cpu_llc_id, cpu) = (socket_id << 3) | core_complex_id; | ||
209 | + per_cpu(cpu_llc_id, cpu) = c->apicid >> 3; | ||
210 | #endif | ||
211 | } | ||
212 | |||
213 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
214 | index 46f74d461f3f..2fff65794f46 100644 | ||
215 | --- a/arch/x86/kvm/x86.c | ||
216 | +++ b/arch/x86/kvm/x86.c | ||
217 | @@ -210,7 +210,18 @@ static void kvm_on_user_return(struct user_return_notifier *urn) | ||
218 | struct kvm_shared_msrs *locals | ||
219 | = container_of(urn, struct kvm_shared_msrs, urn); | ||
220 | struct kvm_shared_msr_values *values; | ||
221 | + unsigned long flags; | ||
222 | |||
223 | + /* | ||
224 | + * Disabling irqs at this point since the following code could be | ||
225 | + * interrupted and executed through kvm_arch_hardware_disable() | ||
226 | + */ | ||
227 | + local_irq_save(flags); | ||
228 | + if (locals->registered) { | ||
229 | + locals->registered = false; | ||
230 | + user_return_notifier_unregister(urn); | ||
231 | + } | ||
232 | + local_irq_restore(flags); | ||
233 | for (slot = 0; slot < shared_msrs_global.nr; ++slot) { | ||
234 | values = &locals->values[slot]; | ||
235 | if (values->host != values->curr) { | ||
236 | @@ -218,8 +229,6 @@ static void kvm_on_user_return(struct user_return_notifier *urn) | ||
237 | values->curr = values->host; | ||
238 | } | ||
239 | } | ||
240 | - locals->registered = false; | ||
241 | - user_return_notifier_unregister(urn); | ||
242 | } | ||
243 | |||
244 | static void shared_msr_update(unsigned slot, u32 msr) | ||
245 | @@ -3372,6 +3381,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | ||
246 | }; | ||
247 | case KVM_SET_VAPIC_ADDR: { | ||
248 | struct kvm_vapic_addr va; | ||
249 | + int idx; | ||
250 | |||
251 | r = -EINVAL; | ||
252 | if (!lapic_in_kernel(vcpu)) | ||
253 | @@ -3379,7 +3389,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | ||
254 | r = -EFAULT; | ||
255 | if (copy_from_user(&va, argp, sizeof va)) | ||
256 | goto out; | ||
257 | + idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
258 | r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); | ||
259 | + srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
260 | break; | ||
261 | } | ||
262 | case KVM_X86_SETUP_MCE: { | ||
263 | diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile | ||
264 | index ac58c1616408..555b9fa0ad43 100644 | ||
265 | --- a/arch/x86/purgatory/Makefile | ||
266 | +++ b/arch/x86/purgatory/Makefile | ||
267 | @@ -16,6 +16,7 @@ KCOV_INSTRUMENT := n | ||
268 | |||
269 | KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large | ||
270 | KBUILD_CFLAGS += -m$(BITS) | ||
271 | +KBUILD_CFLAGS += $(call cc-option,-fno-PIE) | ||
272 | |||
273 | $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE | ||
274 | $(call if_changed,ld) | ||
275 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c | ||
276 | index e44944f4be77..2932a5bd892f 100644 | ||
277 | --- a/drivers/base/power/main.c | ||
278 | +++ b/drivers/base/power/main.c | ||
279 | @@ -1027,6 +1027,8 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a | ||
280 | TRACE_DEVICE(dev); | ||
281 | TRACE_SUSPEND(0); | ||
282 | |||
283 | + dpm_wait_for_children(dev, async); | ||
284 | + | ||
285 | if (async_error) | ||
286 | goto Complete; | ||
287 | |||
288 | @@ -1038,8 +1040,6 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a | ||
289 | if (dev->power.syscore || dev->power.direct_complete) | ||
290 | goto Complete; | ||
291 | |||
292 | - dpm_wait_for_children(dev, async); | ||
293 | - | ||
294 | if (dev->pm_domain) { | ||
295 | info = "noirq power domain "; | ||
296 | callback = pm_noirq_op(&dev->pm_domain->ops, state); | ||
297 | @@ -1174,6 +1174,8 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as | ||
298 | |||
299 | __pm_runtime_disable(dev, false); | ||
300 | |||
301 | + dpm_wait_for_children(dev, async); | ||
302 | + | ||
303 | if (async_error) | ||
304 | goto Complete; | ||
305 | |||
306 | @@ -1185,8 +1187,6 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as | ||
307 | if (dev->power.syscore || dev->power.direct_complete) | ||
308 | goto Complete; | ||
309 | |||
310 | - dpm_wait_for_children(dev, async); | ||
311 | - | ||
312 | if (dev->pm_domain) { | ||
313 | info = "late power domain "; | ||
314 | callback = pm_late_early_op(&dev->pm_domain->ops, state); | ||
315 | diff --git a/drivers/clk/imx/clk-pllv3.c b/drivers/clk/imx/clk-pllv3.c | ||
316 | index 19f9b622981a..7a6acc3e4a92 100644 | ||
317 | --- a/drivers/clk/imx/clk-pllv3.c | ||
318 | +++ b/drivers/clk/imx/clk-pllv3.c | ||
319 | @@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc_rate(struct clk_hw *hw, | ||
320 | temp64 *= mfn; | ||
321 | do_div(temp64, mfd); | ||
322 | |||
323 | - return (parent_rate * div) + (u32)temp64; | ||
324 | + return parent_rate * div + (unsigned long)temp64; | ||
325 | } | ||
326 | |||
327 | static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, | ||
328 | @@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, | ||
329 | do_div(temp64, parent_rate); | ||
330 | mfn = temp64; | ||
331 | |||
332 | - return parent_rate * div + parent_rate * mfn / mfd; | ||
333 | + temp64 = (u64)parent_rate; | ||
334 | + temp64 *= mfn; | ||
335 | + do_div(temp64, mfd); | ||
336 | + | ||
337 | + return parent_rate * div + (unsigned long)temp64; | ||
338 | } | ||
339 | |||
340 | static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate, | ||
341 | diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c | ||
342 | index 3a51fff1b0e7..9adaf48aea23 100644 | ||
343 | --- a/drivers/clk/mmp/clk-of-mmp2.c | ||
344 | +++ b/drivers/clk/mmp/clk-of-mmp2.c | ||
345 | @@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct device_node *np) | ||
346 | } | ||
347 | |||
348 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
349 | - if (!pxa_unit->mpmu_base) { | ||
350 | + if (!pxa_unit->apmu_base) { | ||
351 | pr_err("failed to map apmu registers\n"); | ||
352 | return; | ||
353 | } | ||
354 | diff --git a/drivers/clk/mmp/clk-of-pxa168.c b/drivers/clk/mmp/clk-of-pxa168.c | ||
355 | index 87f2317b2a00..f110c02e83cb 100644 | ||
356 | --- a/drivers/clk/mmp/clk-of-pxa168.c | ||
357 | +++ b/drivers/clk/mmp/clk-of-pxa168.c | ||
358 | @@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struct device_node *np) | ||
359 | } | ||
360 | |||
361 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
362 | - if (!pxa_unit->mpmu_base) { | ||
363 | + if (!pxa_unit->apmu_base) { | ||
364 | pr_err("failed to map apmu registers\n"); | ||
365 | return; | ||
366 | } | ||
367 | diff --git a/drivers/clk/mmp/clk-of-pxa910.c b/drivers/clk/mmp/clk-of-pxa910.c | ||
368 | index e22a67f76d93..64d1ef49caeb 100644 | ||
369 | --- a/drivers/clk/mmp/clk-of-pxa910.c | ||
370 | +++ b/drivers/clk/mmp/clk-of-pxa910.c | ||
371 | @@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struct device_node *np) | ||
372 | } | ||
373 | |||
374 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
375 | - if (!pxa_unit->mpmu_base) { | ||
376 | + if (!pxa_unit->apmu_base) { | ||
377 | pr_err("failed to map apmu registers\n"); | ||
378 | return; | ||
379 | } | ||
380 | @@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struct device_node *np) | ||
381 | } | ||
382 | |||
383 | pxa_unit->apbcp_base = of_iomap(np, 3); | ||
384 | - if (!pxa_unit->mpmu_base) { | ||
385 | + if (!pxa_unit->apbcp_base) { | ||
386 | pr_err("failed to map apbcp registers\n"); | ||
387 | return; | ||
388 | } | ||
389 | diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c | ||
390 | index b3044219772c..2cde3796cb82 100644 | ||
391 | --- a/drivers/crypto/caam/caamalg.c | ||
392 | +++ b/drivers/crypto/caam/caamalg.c | ||
393 | @@ -4542,6 +4542,15 @@ static int __init caam_algapi_init(void) | ||
394 | if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) | ||
395 | continue; | ||
396 | |||
397 | + /* | ||
398 | + * Check support for AES modes not available | ||
399 | + * on LP devices. | ||
400 | + */ | ||
401 | + if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP) | ||
402 | + if ((alg->class1_alg_type & OP_ALG_AAI_MASK) == | ||
403 | + OP_ALG_AAI_XTS) | ||
404 | + continue; | ||
405 | + | ||
406 | t_alg = caam_alg_alloc(alg); | ||
407 | if (IS_ERR(t_alg)) { | ||
408 | err = PTR_ERR(t_alg); | ||
409 | diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c | ||
410 | index 02f2a5621bb0..47d08b9da60d 100644 | ||
411 | --- a/drivers/gpio/gpio-pca953x.c | ||
412 | +++ b/drivers/gpio/gpio-pca953x.c | ||
413 | @@ -372,14 +372,15 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc, | ||
414 | break; | ||
415 | } | ||
416 | |||
417 | - memcpy(reg_val, chip->reg_output, NBANK(chip)); | ||
418 | mutex_lock(&chip->i2c_lock); | ||
419 | + memcpy(reg_val, chip->reg_output, NBANK(chip)); | ||
420 | for(bank=0; bank<NBANK(chip); bank++) { | ||
421 | unsigned bankmask = mask[bank / sizeof(*mask)] >> | ||
422 | ((bank % sizeof(*mask)) * 8); | ||
423 | if(bankmask) { | ||
424 | unsigned bankval = bits[bank / sizeof(*bits)] >> | ||
425 | ((bank % sizeof(*bits)) * 8); | ||
426 | + bankval &= bankmask; | ||
427 | reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval; | ||
428 | } | ||
429 | } | ||
430 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c | ||
431 | index b2dee1024166..15704aaf9e4e 100644 | ||
432 | --- a/drivers/gpio/gpiolib.c | ||
433 | +++ b/drivers/gpio/gpiolib.c | ||
434 | @@ -2667,8 +2667,11 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset) | ||
435 | if (IS_ERR(desc)) | ||
436 | return PTR_ERR(desc); | ||
437 | |||
438 | - /* Flush direction if something changed behind our back */ | ||
439 | - if (chip->get_direction) { | ||
440 | + /* | ||
441 | + * If it's fast: flush the direction setting if something changed | ||
442 | + * behind our back | ||
443 | + */ | ||
444 | + if (!chip->can_sleep && chip->get_direction) { | ||
445 | int dir = chip->get_direction(chip, offset); | ||
446 | |||
447 | if (dir) | ||
448 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | ||
449 | index 700c56baf2de..e443073f6ece 100644 | ||
450 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h | ||
451 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | ||
452 | @@ -492,6 +492,7 @@ struct amdgpu_bo { | ||
453 | u64 metadata_flags; | ||
454 | void *metadata; | ||
455 | u32 metadata_size; | ||
456 | + unsigned prime_shared_count; | ||
457 | /* list of all virtual address to which this bo | ||
458 | * is associated to | ||
459 | */ | ||
460 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | ||
461 | index 651115dcce12..c02db01f6583 100644 | ||
462 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | ||
463 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | ||
464 | @@ -132,7 +132,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, | ||
465 | entry->priority = min(info[i].bo_priority, | ||
466 | AMDGPU_BO_LIST_MAX_PRIORITY); | ||
467 | entry->tv.bo = &entry->robj->tbo; | ||
468 | - entry->tv.shared = true; | ||
469 | + entry->tv.shared = !entry->robj->prime_shared_count; | ||
470 | |||
471 | if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GDS) | ||
472 | gds_obj = entry->robj; | ||
473 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | ||
474 | index 7700dc22f243..3826d5aea0a6 100644 | ||
475 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | ||
476 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | ||
477 | @@ -74,20 +74,36 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev, | ||
478 | if (ret) | ||
479 | return ERR_PTR(ret); | ||
480 | |||
481 | + bo->prime_shared_count = 1; | ||
482 | return &bo->gem_base; | ||
483 | } | ||
484 | |||
485 | int amdgpu_gem_prime_pin(struct drm_gem_object *obj) | ||
486 | { | ||
487 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); | ||
488 | - int ret = 0; | ||
489 | + long ret = 0; | ||
490 | |||
491 | ret = amdgpu_bo_reserve(bo, false); | ||
492 | if (unlikely(ret != 0)) | ||
493 | return ret; | ||
494 | |||
495 | + /* | ||
496 | + * Wait for all shared fences to complete before we switch to future | ||
497 | + * use of exclusive fence on this prime shared bo. | ||
498 | + */ | ||
499 | + ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false, | ||
500 | + MAX_SCHEDULE_TIMEOUT); | ||
501 | + if (unlikely(ret < 0)) { | ||
502 | + DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret); | ||
503 | + amdgpu_bo_unreserve(bo); | ||
504 | + return ret; | ||
505 | + } | ||
506 | + | ||
507 | /* pin buffer into GTT */ | ||
508 | ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL); | ||
509 | + if (likely(ret == 0)) | ||
510 | + bo->prime_shared_count++; | ||
511 | + | ||
512 | amdgpu_bo_unreserve(bo); | ||
513 | return ret; | ||
514 | } | ||
515 | @@ -102,6 +118,8 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj) | ||
516 | return; | ||
517 | |||
518 | amdgpu_bo_unpin(bo); | ||
519 | + if (bo->prime_shared_count) | ||
520 | + bo->prime_shared_count--; | ||
521 | amdgpu_bo_unreserve(bo); | ||
522 | } | ||
523 | |||
524 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c | ||
525 | index 1f8af87c6294..cf2560708e03 100644 | ||
526 | --- a/drivers/gpu/drm/i915/intel_bios.c | ||
527 | +++ b/drivers/gpu/drm/i915/intel_bios.c | ||
528 | @@ -1143,7 +1143,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, | ||
529 | if (!child) | ||
530 | return; | ||
531 | |||
532 | - aux_channel = child->raw[25]; | ||
533 | + aux_channel = child->common.aux_channel; | ||
534 | ddc_pin = child->common.ddc_pin; | ||
535 | |||
536 | is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; | ||
537 | @@ -1673,7 +1673,8 @@ bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port) | ||
538 | return false; | ||
539 | } | ||
540 | |||
541 | -bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port) | ||
542 | +static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child, | ||
543 | + enum port port) | ||
544 | { | ||
545 | static const struct { | ||
546 | u16 dp, hdmi; | ||
547 | @@ -1687,22 +1688,35 @@ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum por | ||
548 | [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, }, | ||
549 | [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, }, | ||
550 | }; | ||
551 | - int i; | ||
552 | |||
553 | if (port == PORT_A || port >= ARRAY_SIZE(port_mapping)) | ||
554 | return false; | ||
555 | |||
556 | - if (!dev_priv->vbt.child_dev_num) | ||
557 | + if ((p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) != | ||
558 | + (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS)) | ||
559 | return false; | ||
560 | |||
561 | + if (p_child->common.dvo_port == port_mapping[port].dp) | ||
562 | + return true; | ||
563 | + | ||
564 | + /* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */ | ||
565 | + if (p_child->common.dvo_port == port_mapping[port].hdmi && | ||
566 | + p_child->common.aux_channel != 0) | ||
567 | + return true; | ||
568 | + | ||
569 | + return false; | ||
570 | +} | ||
571 | + | ||
572 | +bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, | ||
573 | + enum port port) | ||
574 | +{ | ||
575 | + int i; | ||
576 | + | ||
577 | for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { | ||
578 | const union child_device_config *p_child = | ||
579 | &dev_priv->vbt.child_dev[i]; | ||
580 | |||
581 | - if ((p_child->common.dvo_port == port_mapping[port].dp || | ||
582 | - p_child->common.dvo_port == port_mapping[port].hdmi) && | ||
583 | - (p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) == | ||
584 | - (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS)) | ||
585 | + if (child_dev_is_dp_dual_mode(p_child, port)) | ||
586 | return true; | ||
587 | } | ||
588 | |||
589 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c | ||
590 | index 3051182cf483..b8aeb28e14d7 100644 | ||
591 | --- a/drivers/gpu/drm/i915/intel_dp.c | ||
592 | +++ b/drivers/gpu/drm/i915/intel_dp.c | ||
593 | @@ -4323,21 +4323,11 @@ static enum drm_connector_status | ||
594 | intel_dp_detect(struct drm_connector *connector, bool force) | ||
595 | { | ||
596 | struct intel_dp *intel_dp = intel_attached_dp(connector); | ||
597 | - struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
598 | - struct intel_encoder *intel_encoder = &intel_dig_port->base; | ||
599 | enum drm_connector_status status = connector->status; | ||
600 | |||
601 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | ||
602 | connector->base.id, connector->name); | ||
603 | |||
604 | - if (intel_dp->is_mst) { | ||
605 | - /* MST devices are disconnected from a monitor POV */ | ||
606 | - intel_dp_unset_edid(intel_dp); | ||
607 | - if (intel_encoder->type != INTEL_OUTPUT_EDP) | ||
608 | - intel_encoder->type = INTEL_OUTPUT_DP; | ||
609 | - return connector_status_disconnected; | ||
610 | - } | ||
611 | - | ||
612 | /* If full detect is not performed yet, do a full detect */ | ||
613 | if (!intel_dp->detect_done) | ||
614 | status = intel_dp_long_pulse(intel_dp->attached_connector); | ||
615 | diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h | ||
616 | index 68db9621f1f0..8886cab19f98 100644 | ||
617 | --- a/drivers/gpu/drm/i915/intel_vbt_defs.h | ||
618 | +++ b/drivers/gpu/drm/i915/intel_vbt_defs.h | ||
619 | @@ -280,7 +280,8 @@ struct common_child_dev_config { | ||
620 | u8 dp_support:1; | ||
621 | u8 tmds_support:1; | ||
622 | u8 support_reserved:5; | ||
623 | - u8 not_common3[12]; | ||
624 | + u8 aux_channel; | ||
625 | + u8 not_common3[11]; | ||
626 | u8 iboost_level; | ||
627 | } __packed; | ||
628 | |||
629 | diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig | ||
630 | index d223650a97e4..11edabf425ae 100644 | ||
631 | --- a/drivers/i2c/Kconfig | ||
632 | +++ b/drivers/i2c/Kconfig | ||
633 | @@ -59,7 +59,6 @@ config I2C_CHARDEV | ||
634 | |||
635 | config I2C_MUX | ||
636 | tristate "I2C bus multiplexing support" | ||
637 | - depends on HAS_IOMEM | ||
638 | help | ||
639 | Say Y here if you want the I2C core to support the ability to | ||
640 | handle multiplexed I2C bus topologies, by presenting each | ||
641 | diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig | ||
642 | index e280c8ecc0b5..96de9ce5669b 100644 | ||
643 | --- a/drivers/i2c/muxes/Kconfig | ||
644 | +++ b/drivers/i2c/muxes/Kconfig | ||
645 | @@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL | ||
646 | |||
647 | config I2C_MUX_REG | ||
648 | tristate "Register-based I2C multiplexer" | ||
649 | + depends on HAS_IOMEM | ||
650 | help | ||
651 | If you say yes to this option, support will be included for a | ||
652 | register based I2C multiplexer. This driver provides access to | ||
653 | diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c | ||
654 | index 3278ebf1cc5c..7e6f300009c5 100644 | ||
655 | --- a/drivers/i2c/muxes/i2c-mux-pca954x.c | ||
656 | +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c | ||
657 | @@ -247,9 +247,9 @@ static int pca954x_probe(struct i2c_client *client, | ||
658 | /* discard unconfigured channels */ | ||
659 | break; | ||
660 | idle_disconnect_pd = pdata->modes[num].deselect_on_exit; | ||
661 | - data->deselect |= (idle_disconnect_pd | ||
662 | - || idle_disconnect_dt) << num; | ||
663 | } | ||
664 | + data->deselect |= (idle_disconnect_pd || | ||
665 | + idle_disconnect_dt) << num; | ||
666 | |||
667 | ret = i2c_mux_add_adapter(muxc, force, num, class); | ||
668 | |||
669 | diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c | ||
670 | index c99525512b34..71c7c4c328ef 100644 | ||
671 | --- a/drivers/infiniband/core/cm.c | ||
672 | +++ b/drivers/infiniband/core/cm.c | ||
673 | @@ -80,6 +80,8 @@ static struct ib_cm { | ||
674 | __be32 random_id_operand; | ||
675 | struct list_head timewait_list; | ||
676 | struct workqueue_struct *wq; | ||
677 | + /* Sync on cm change port state */ | ||
678 | + spinlock_t state_lock; | ||
679 | } cm; | ||
680 | |||
681 | /* Counter indexes ordered by attribute ID */ | ||
682 | @@ -161,6 +163,8 @@ struct cm_port { | ||
683 | struct ib_mad_agent *mad_agent; | ||
684 | struct kobject port_obj; | ||
685 | u8 port_num; | ||
686 | + struct list_head cm_priv_prim_list; | ||
687 | + struct list_head cm_priv_altr_list; | ||
688 | struct cm_counter_group counter_group[CM_COUNTER_GROUPS]; | ||
689 | }; | ||
690 | |||
691 | @@ -241,6 +245,12 @@ struct cm_id_private { | ||
692 | u8 service_timeout; | ||
693 | u8 target_ack_delay; | ||
694 | |||
695 | + struct list_head prim_list; | ||
696 | + struct list_head altr_list; | ||
697 | + /* Indicates that the send port mad is registered and av is set */ | ||
698 | + int prim_send_port_not_ready; | ||
699 | + int altr_send_port_not_ready; | ||
700 | + | ||
701 | struct list_head work_list; | ||
702 | atomic_t work_count; | ||
703 | }; | ||
704 | @@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv, | ||
705 | struct ib_mad_agent *mad_agent; | ||
706 | struct ib_mad_send_buf *m; | ||
707 | struct ib_ah *ah; | ||
708 | + struct cm_av *av; | ||
709 | + unsigned long flags, flags2; | ||
710 | + int ret = 0; | ||
711 | |||
712 | + /* don't let the port to be released till the agent is down */ | ||
713 | + spin_lock_irqsave(&cm.state_lock, flags2); | ||
714 | + spin_lock_irqsave(&cm.lock, flags); | ||
715 | + if (!cm_id_priv->prim_send_port_not_ready) | ||
716 | + av = &cm_id_priv->av; | ||
717 | + else if (!cm_id_priv->altr_send_port_not_ready && | ||
718 | + (cm_id_priv->alt_av.port)) | ||
719 | + av = &cm_id_priv->alt_av; | ||
720 | + else { | ||
721 | + pr_info("%s: not valid CM id\n", __func__); | ||
722 | + ret = -ENODEV; | ||
723 | + spin_unlock_irqrestore(&cm.lock, flags); | ||
724 | + goto out; | ||
725 | + } | ||
726 | + spin_unlock_irqrestore(&cm.lock, flags); | ||
727 | + /* Make sure the port haven't released the mad yet */ | ||
728 | mad_agent = cm_id_priv->av.port->mad_agent; | ||
729 | - ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr); | ||
730 | - if (IS_ERR(ah)) | ||
731 | - return PTR_ERR(ah); | ||
732 | + if (!mad_agent) { | ||
733 | + pr_info("%s: not a valid MAD agent\n", __func__); | ||
734 | + ret = -ENODEV; | ||
735 | + goto out; | ||
736 | + } | ||
737 | + ah = ib_create_ah(mad_agent->qp->pd, &av->ah_attr); | ||
738 | + if (IS_ERR(ah)) { | ||
739 | + ret = PTR_ERR(ah); | ||
740 | + goto out; | ||
741 | + } | ||
742 | |||
743 | m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn, | ||
744 | - cm_id_priv->av.pkey_index, | ||
745 | + av->pkey_index, | ||
746 | 0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA, | ||
747 | GFP_ATOMIC, | ||
748 | IB_MGMT_BASE_VERSION); | ||
749 | if (IS_ERR(m)) { | ||
750 | ib_destroy_ah(ah); | ||
751 | - return PTR_ERR(m); | ||
752 | + ret = PTR_ERR(m); | ||
753 | + goto out; | ||
754 | } | ||
755 | |||
756 | /* Timeout set by caller if response is expected. */ | ||
757 | @@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv, | ||
758 | atomic_inc(&cm_id_priv->refcount); | ||
759 | m->context[0] = cm_id_priv; | ||
760 | *msg = m; | ||
761 | - return 0; | ||
762 | + | ||
763 | +out: | ||
764 | + spin_unlock_irqrestore(&cm.state_lock, flags2); | ||
765 | + return ret; | ||
766 | } | ||
767 | |||
768 | static int cm_alloc_response_msg(struct cm_port *port, | ||
769 | @@ -352,7 +392,8 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc, | ||
770 | grh, &av->ah_attr); | ||
771 | } | ||
772 | |||
773 | -static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av) | ||
774 | +static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av, | ||
775 | + struct cm_id_private *cm_id_priv) | ||
776 | { | ||
777 | struct cm_device *cm_dev; | ||
778 | struct cm_port *port = NULL; | ||
779 | @@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av) | ||
780 | &av->ah_attr); | ||
781 | av->timeout = path->packet_life_time + 1; | ||
782 | |||
783 | - return 0; | ||
784 | + spin_lock_irqsave(&cm.lock, flags); | ||
785 | + if (&cm_id_priv->av == av) | ||
786 | + list_add_tail(&cm_id_priv->prim_list, &port->cm_priv_prim_list); | ||
787 | + else if (&cm_id_priv->alt_av == av) | ||
788 | + list_add_tail(&cm_id_priv->altr_list, &port->cm_priv_altr_list); | ||
789 | + else | ||
790 | + ret = -EINVAL; | ||
791 | + | ||
792 | + spin_unlock_irqrestore(&cm.lock, flags); | ||
793 | + | ||
794 | + return ret; | ||
795 | } | ||
796 | |||
797 | static int cm_alloc_id(struct cm_id_private *cm_id_priv) | ||
798 | @@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device, | ||
799 | spin_lock_init(&cm_id_priv->lock); | ||
800 | init_completion(&cm_id_priv->comp); | ||
801 | INIT_LIST_HEAD(&cm_id_priv->work_list); | ||
802 | + INIT_LIST_HEAD(&cm_id_priv->prim_list); | ||
803 | + INIT_LIST_HEAD(&cm_id_priv->altr_list); | ||
804 | atomic_set(&cm_id_priv->work_count, -1); | ||
805 | atomic_set(&cm_id_priv->refcount, 1); | ||
806 | return &cm_id_priv->id; | ||
807 | @@ -892,6 +945,15 @@ retest: | ||
808 | break; | ||
809 | } | ||
810 | |||
811 | + spin_lock_irq(&cm.lock); | ||
812 | + if (!list_empty(&cm_id_priv->altr_list) && | ||
813 | + (!cm_id_priv->altr_send_port_not_ready)) | ||
814 | + list_del(&cm_id_priv->altr_list); | ||
815 | + if (!list_empty(&cm_id_priv->prim_list) && | ||
816 | + (!cm_id_priv->prim_send_port_not_ready)) | ||
817 | + list_del(&cm_id_priv->prim_list); | ||
818 | + spin_unlock_irq(&cm.lock); | ||
819 | + | ||
820 | cm_free_id(cm_id->local_id); | ||
821 | cm_deref_id(cm_id_priv); | ||
822 | wait_for_completion(&cm_id_priv->comp); | ||
823 | @@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_id, | ||
824 | goto out; | ||
825 | } | ||
826 | |||
827 | - ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); | ||
828 | + ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av, | ||
829 | + cm_id_priv); | ||
830 | if (ret) | ||
831 | goto error1; | ||
832 | if (param->alternate_path) { | ||
833 | ret = cm_init_av_by_path(param->alternate_path, | ||
834 | - &cm_id_priv->alt_av); | ||
835 | + &cm_id_priv->alt_av, cm_id_priv); | ||
836 | if (ret) | ||
837 | goto error1; | ||
838 | } | ||
839 | @@ -1653,7 +1716,8 @@ static int cm_req_handler(struct cm_work *work) | ||
840 | dev_put(gid_attr.ndev); | ||
841 | } | ||
842 | work->path[0].gid_type = gid_attr.gid_type; | ||
843 | - ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av); | ||
844 | + ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av, | ||
845 | + cm_id_priv); | ||
846 | } | ||
847 | if (ret) { | ||
848 | int err = ib_get_cached_gid(work->port->cm_dev->ib_device, | ||
849 | @@ -1672,7 +1736,8 @@ static int cm_req_handler(struct cm_work *work) | ||
850 | goto rejected; | ||
851 | } | ||
852 | if (req_msg->alt_local_lid) { | ||
853 | - ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av); | ||
854 | + ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av, | ||
855 | + cm_id_priv); | ||
856 | if (ret) { | ||
857 | ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID, | ||
858 | &work->path[0].sgid, | ||
859 | @@ -2727,7 +2792,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_id, | ||
860 | goto out; | ||
861 | } | ||
862 | |||
863 | - ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av); | ||
864 | + ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av, | ||
865 | + cm_id_priv); | ||
866 | if (ret) | ||
867 | goto out; | ||
868 | cm_id_priv->alt_av.timeout = | ||
869 | @@ -2839,7 +2905,8 @@ static int cm_lap_handler(struct cm_work *work) | ||
870 | cm_init_av_for_response(work->port, work->mad_recv_wc->wc, | ||
871 | work->mad_recv_wc->recv_buf.grh, | ||
872 | &cm_id_priv->av); | ||
873 | - cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av); | ||
874 | + cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av, | ||
875 | + cm_id_priv); | ||
876 | ret = atomic_inc_and_test(&cm_id_priv->work_count); | ||
877 | if (!ret) | ||
878 | list_add_tail(&work->list, &cm_id_priv->work_list); | ||
879 | @@ -3031,7 +3098,7 @@ int ib_send_cm_sidr_req(struct ib_cm_id *cm_id, | ||
880 | return -EINVAL; | ||
881 | |||
882 | cm_id_priv = container_of(cm_id, struct cm_id_private, id); | ||
883 | - ret = cm_init_av_by_path(param->path, &cm_id_priv->av); | ||
884 | + ret = cm_init_av_by_path(param->path, &cm_id_priv->av, cm_id_priv); | ||
885 | if (ret) | ||
886 | goto out; | ||
887 | |||
888 | @@ -3468,7 +3535,9 @@ out: | ||
889 | static int cm_migrate(struct ib_cm_id *cm_id) | ||
890 | { | ||
891 | struct cm_id_private *cm_id_priv; | ||
892 | + struct cm_av tmp_av; | ||
893 | unsigned long flags; | ||
894 | + int tmp_send_port_not_ready; | ||
895 | int ret = 0; | ||
896 | |||
897 | cm_id_priv = container_of(cm_id, struct cm_id_private, id); | ||
898 | @@ -3477,7 +3546,14 @@ static int cm_migrate(struct ib_cm_id *cm_id) | ||
899 | (cm_id->lap_state == IB_CM_LAP_UNINIT || | ||
900 | cm_id->lap_state == IB_CM_LAP_IDLE)) { | ||
901 | cm_id->lap_state = IB_CM_LAP_IDLE; | ||
902 | + /* Swap address vector */ | ||
903 | + tmp_av = cm_id_priv->av; | ||
904 | cm_id_priv->av = cm_id_priv->alt_av; | ||
905 | + cm_id_priv->alt_av = tmp_av; | ||
906 | + /* Swap port send ready state */ | ||
907 | + tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready; | ||
908 | + cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready; | ||
909 | + cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready; | ||
910 | } else | ||
911 | ret = -EINVAL; | ||
912 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | ||
913 | @@ -3888,6 +3964,9 @@ static void cm_add_one(struct ib_device *ib_device) | ||
914 | port->cm_dev = cm_dev; | ||
915 | port->port_num = i; | ||
916 | |||
917 | + INIT_LIST_HEAD(&port->cm_priv_prim_list); | ||
918 | + INIT_LIST_HEAD(&port->cm_priv_altr_list); | ||
919 | + | ||
920 | ret = cm_create_port_fs(port); | ||
921 | if (ret) | ||
922 | goto error1; | ||
923 | @@ -3945,6 +4024,8 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) | ||
924 | { | ||
925 | struct cm_device *cm_dev = client_data; | ||
926 | struct cm_port *port; | ||
927 | + struct cm_id_private *cm_id_priv; | ||
928 | + struct ib_mad_agent *cur_mad_agent; | ||
929 | struct ib_port_modify port_modify = { | ||
930 | .clr_port_cap_mask = IB_PORT_CM_SUP | ||
931 | }; | ||
932 | @@ -3968,15 +4049,27 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) | ||
933 | |||
934 | port = cm_dev->port[i-1]; | ||
935 | ib_modify_port(ib_device, port->port_num, 0, &port_modify); | ||
936 | + /* Mark all the cm_id's as not valid */ | ||
937 | + spin_lock_irq(&cm.lock); | ||
938 | + list_for_each_entry(cm_id_priv, &port->cm_priv_altr_list, altr_list) | ||
939 | + cm_id_priv->altr_send_port_not_ready = 1; | ||
940 | + list_for_each_entry(cm_id_priv, &port->cm_priv_prim_list, prim_list) | ||
941 | + cm_id_priv->prim_send_port_not_ready = 1; | ||
942 | + spin_unlock_irq(&cm.lock); | ||
943 | /* | ||
944 | * We flush the queue here after the going_down set, this | ||
945 | * verify that no new works will be queued in the recv handler, | ||
946 | * after that we can call the unregister_mad_agent | ||
947 | */ | ||
948 | flush_workqueue(cm.wq); | ||
949 | - ib_unregister_mad_agent(port->mad_agent); | ||
950 | + spin_lock_irq(&cm.state_lock); | ||
951 | + cur_mad_agent = port->mad_agent; | ||
952 | + port->mad_agent = NULL; | ||
953 | + spin_unlock_irq(&cm.state_lock); | ||
954 | + ib_unregister_mad_agent(cur_mad_agent); | ||
955 | cm_remove_port_fs(port); | ||
956 | } | ||
957 | + | ||
958 | device_unregister(cm_dev->device); | ||
959 | kfree(cm_dev); | ||
960 | } | ||
961 | @@ -3989,6 +4082,7 @@ static int __init ib_cm_init(void) | ||
962 | INIT_LIST_HEAD(&cm.device_list); | ||
963 | rwlock_init(&cm.device_lock); | ||
964 | spin_lock_init(&cm.lock); | ||
965 | + spin_lock_init(&cm.state_lock); | ||
966 | cm.listen_service_table = RB_ROOT; | ||
967 | cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID); | ||
968 | cm.remote_id_table = RB_ROOT; | ||
969 | diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c | ||
970 | index c68746ce6624..bdab61d9103c 100644 | ||
971 | --- a/drivers/infiniband/core/umem.c | ||
972 | +++ b/drivers/infiniband/core/umem.c | ||
973 | @@ -174,7 +174,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | ||
974 | |||
975 | cur_base = addr & PAGE_MASK; | ||
976 | |||
977 | - if (npages == 0) { | ||
978 | + if (npages == 0 || npages > UINT_MAX) { | ||
979 | ret = -EINVAL; | ||
980 | goto out; | ||
981 | } | ||
982 | diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c | ||
983 | index 0012fa58c105..44b1104eb168 100644 | ||
984 | --- a/drivers/infiniband/core/uverbs_main.c | ||
985 | +++ b/drivers/infiniband/core/uverbs_main.c | ||
986 | @@ -262,12 +262,9 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file, | ||
987 | container_of(uobj, struct ib_uqp_object, uevent.uobject); | ||
988 | |||
989 | idr_remove_uobj(&ib_uverbs_qp_idr, uobj); | ||
990 | - if (qp != qp->real_qp) { | ||
991 | - ib_close_qp(qp); | ||
992 | - } else { | ||
993 | + if (qp == qp->real_qp) | ||
994 | ib_uverbs_detach_umcast(qp, uqp); | ||
995 | - ib_destroy_qp(qp); | ||
996 | - } | ||
997 | + ib_destroy_qp(qp); | ||
998 | ib_uverbs_release_uevent(file, &uqp->uevent); | ||
999 | kfree(uqp); | ||
1000 | } | ||
1001 | diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c | ||
1002 | index bcf76c33726b..e3629983f1bf 100644 | ||
1003 | --- a/drivers/infiniband/hw/hfi1/rc.c | ||
1004 | +++ b/drivers/infiniband/hw/hfi1/rc.c | ||
1005 | @@ -87,7 +87,7 @@ void hfi1_add_rnr_timer(struct rvt_qp *qp, u32 to) | ||
1006 | struct hfi1_qp_priv *priv = qp->priv; | ||
1007 | |||
1008 | qp->s_flags |= RVT_S_WAIT_RNR; | ||
1009 | - qp->s_timer.expires = jiffies + usecs_to_jiffies(to); | ||
1010 | + priv->s_rnr_timer.expires = jiffies + usecs_to_jiffies(to); | ||
1011 | add_timer(&priv->s_rnr_timer); | ||
1012 | } | ||
1013 | |||
1014 | diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c | ||
1015 | index 1694037d1eee..8f59a4fded93 100644 | ||
1016 | --- a/drivers/infiniband/hw/hfi1/user_sdma.c | ||
1017 | +++ b/drivers/infiniband/hw/hfi1/user_sdma.c | ||
1018 | @@ -1152,7 +1152,7 @@ static int pin_vector_pages(struct user_sdma_request *req, | ||
1019 | rb_node = hfi1_mmu_rb_extract(pq->handler, | ||
1020 | (unsigned long)iovec->iov.iov_base, | ||
1021 | iovec->iov.iov_len); | ||
1022 | - if (rb_node && !IS_ERR(rb_node)) | ||
1023 | + if (rb_node) | ||
1024 | node = container_of(rb_node, struct sdma_mmu_node, rb); | ||
1025 | else | ||
1026 | rb_node = NULL; | ||
1027 | diff --git a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c | ||
1028 | index 5fc623362731..b9bf0759f10a 100644 | ||
1029 | --- a/drivers/infiniband/hw/mlx4/ah.c | ||
1030 | +++ b/drivers/infiniband/hw/mlx4/ah.c | ||
1031 | @@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr | ||
1032 | if (vlan_tag < 0x1000) | ||
1033 | vlan_tag |= (ah_attr->sl & 7) << 13; | ||
1034 | ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24)); | ||
1035 | - ah->av.eth.gid_index = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); | ||
1036 | + ret = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); | ||
1037 | + if (ret < 0) | ||
1038 | + return ERR_PTR(ret); | ||
1039 | + ah->av.eth.gid_index = ret; | ||
1040 | ah->av.eth.vlan = cpu_to_be16(vlan_tag); | ||
1041 | ah->av.eth.hop_limit = ah_attr->grh.hop_limit; | ||
1042 | if (ah_attr->static_rate) { | ||
1043 | diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c | ||
1044 | index 5df63dacaaa3..efb6414cc5e4 100644 | ||
1045 | --- a/drivers/infiniband/hw/mlx4/cq.c | ||
1046 | +++ b/drivers/infiniband/hw/mlx4/cq.c | ||
1047 | @@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev, | ||
1048 | if (context) | ||
1049 | if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) { | ||
1050 | err = -EFAULT; | ||
1051 | - goto err_dbmap; | ||
1052 | + goto err_cq_free; | ||
1053 | } | ||
1054 | |||
1055 | return &cq->ibcq; | ||
1056 | |||
1057 | +err_cq_free: | ||
1058 | + mlx4_cq_free(dev->dev, &cq->mcq); | ||
1059 | + | ||
1060 | err_dbmap: | ||
1061 | if (context) | ||
1062 | mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db); | ||
1063 | diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c | ||
1064 | index e4fac9292e4a..ebe43cb7d06b 100644 | ||
1065 | --- a/drivers/infiniband/hw/mlx5/cq.c | ||
1066 | +++ b/drivers/infiniband/hw/mlx5/cq.c | ||
1067 | @@ -917,8 +917,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev, | ||
1068 | if (err) | ||
1069 | goto err_create; | ||
1070 | } else { | ||
1071 | - /* for now choose 64 bytes till we have a proper interface */ | ||
1072 | - cqe_size = 64; | ||
1073 | + cqe_size = cache_line_size() == 128 ? 128 : 64; | ||
1074 | err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb, | ||
1075 | &index, &inlen); | ||
1076 | if (err) | ||
1077 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c | ||
1078 | index bff8707a2f1f..19f8820b4e92 100644 | ||
1079 | --- a/drivers/infiniband/hw/mlx5/main.c | ||
1080 | +++ b/drivers/infiniband/hw/mlx5/main.c | ||
1081 | @@ -2100,14 +2100,14 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context, | ||
1082 | { | ||
1083 | struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context; | ||
1084 | struct ib_event ibev; | ||
1085 | - | ||
1086 | + bool fatal = false; | ||
1087 | u8 port = 0; | ||
1088 | |||
1089 | switch (event) { | ||
1090 | case MLX5_DEV_EVENT_SYS_ERROR: | ||
1091 | - ibdev->ib_active = false; | ||
1092 | ibev.event = IB_EVENT_DEVICE_FATAL; | ||
1093 | mlx5_ib_handle_internal_error(ibdev); | ||
1094 | + fatal = true; | ||
1095 | break; | ||
1096 | |||
1097 | case MLX5_DEV_EVENT_PORT_UP: | ||
1098 | @@ -2154,6 +2154,9 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context, | ||
1099 | |||
1100 | if (ibdev->ib_active) | ||
1101 | ib_dispatch_event(&ibev); | ||
1102 | + | ||
1103 | + if (fatal) | ||
1104 | + ibdev->ib_active = false; | ||
1105 | } | ||
1106 | |||
1107 | static void get_ext_port_caps(struct mlx5_ib_dev *dev) | ||
1108 | @@ -2835,7 +2838,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | ||
1109 | } | ||
1110 | err = init_node_data(dev); | ||
1111 | if (err) | ||
1112 | - goto err_dealloc; | ||
1113 | + goto err_free_port; | ||
1114 | |||
1115 | mutex_init(&dev->flow_db.lock); | ||
1116 | mutex_init(&dev->cap_mask_mutex); | ||
1117 | @@ -2845,7 +2848,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | ||
1118 | if (ll == IB_LINK_LAYER_ETHERNET) { | ||
1119 | err = mlx5_enable_roce(dev); | ||
1120 | if (err) | ||
1121 | - goto err_dealloc; | ||
1122 | + goto err_free_port; | ||
1123 | } | ||
1124 | |||
1125 | err = create_dev_resources(&dev->devr); | ||
1126 | diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c | ||
1127 | index affc3f6598ca..19d590d39484 100644 | ||
1128 | --- a/drivers/infiniband/hw/mlx5/qp.c | ||
1129 | +++ b/drivers/infiniband/hw/mlx5/qp.c | ||
1130 | @@ -2037,8 +2037,8 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, | ||
1131 | |||
1132 | mlx5_ib_dbg(dev, "ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n", | ||
1133 | qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn, | ||
1134 | - to_mcq(init_attr->recv_cq)->mcq.cqn, | ||
1135 | - to_mcq(init_attr->send_cq)->mcq.cqn); | ||
1136 | + init_attr->recv_cq ? to_mcq(init_attr->recv_cq)->mcq.cqn : -1, | ||
1137 | + init_attr->send_cq ? to_mcq(init_attr->send_cq)->mcq.cqn : -1); | ||
1138 | |||
1139 | qp->trans_qp.xrcdn = xrcdn; | ||
1140 | |||
1141 | @@ -4702,6 +4702,14 @@ struct ib_rwq_ind_table *mlx5_ib_create_rwq_ind_table(struct ib_device *device, | ||
1142 | udata->inlen)) | ||
1143 | return ERR_PTR(-EOPNOTSUPP); | ||
1144 | |||
1145 | + if (init_attr->log_ind_tbl_size > | ||
1146 | + MLX5_CAP_GEN(dev->mdev, log_max_rqt_size)) { | ||
1147 | + mlx5_ib_dbg(dev, "log_ind_tbl_size = %d is bigger than supported = %d\n", | ||
1148 | + init_attr->log_ind_tbl_size, | ||
1149 | + MLX5_CAP_GEN(dev->mdev, log_max_rqt_size)); | ||
1150 | + return ERR_PTR(-EINVAL); | ||
1151 | + } | ||
1152 | + | ||
1153 | min_resp_len = offsetof(typeof(resp), reserved) + sizeof(resp.reserved); | ||
1154 | if (udata->outlen && udata->outlen < min_resp_len) | ||
1155 | return ERR_PTR(-EINVAL); | ||
1156 | diff --git a/drivers/infiniband/sw/rdmavt/dma.c b/drivers/infiniband/sw/rdmavt/dma.c | ||
1157 | index 33076a5eee2f..04ebbb576385 100644 | ||
1158 | --- a/drivers/infiniband/sw/rdmavt/dma.c | ||
1159 | +++ b/drivers/infiniband/sw/rdmavt/dma.c | ||
1160 | @@ -90,9 +90,6 @@ static u64 rvt_dma_map_page(struct ib_device *dev, struct page *page, | ||
1161 | if (WARN_ON(!valid_dma_direction(direction))) | ||
1162 | return BAD_DMA_ADDRESS; | ||
1163 | |||
1164 | - if (offset + size > PAGE_SIZE) | ||
1165 | - return BAD_DMA_ADDRESS; | ||
1166 | - | ||
1167 | addr = (u64)page_address(page); | ||
1168 | if (addr) | ||
1169 | addr += offset; | ||
1170 | diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c | ||
1171 | index eedf2f1cafdf..7f5d7358c99e 100644 | ||
1172 | --- a/drivers/infiniband/sw/rxe/rxe_net.c | ||
1173 | +++ b/drivers/infiniband/sw/rxe/rxe_net.c | ||
1174 | @@ -243,10 +243,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port, | ||
1175 | { | ||
1176 | int err; | ||
1177 | struct socket *sock; | ||
1178 | - struct udp_port_cfg udp_cfg; | ||
1179 | - struct udp_tunnel_sock_cfg tnl_cfg; | ||
1180 | - | ||
1181 | - memset(&udp_cfg, 0, sizeof(udp_cfg)); | ||
1182 | + struct udp_port_cfg udp_cfg = {0}; | ||
1183 | + struct udp_tunnel_sock_cfg tnl_cfg = {0}; | ||
1184 | |||
1185 | if (ipv6) { | ||
1186 | udp_cfg.family = AF_INET6; | ||
1187 | @@ -264,10 +262,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port, | ||
1188 | return ERR_PTR(err); | ||
1189 | } | ||
1190 | |||
1191 | - tnl_cfg.sk_user_data = NULL; | ||
1192 | tnl_cfg.encap_type = 1; | ||
1193 | tnl_cfg.encap_rcv = rxe_udp_encap_recv; | ||
1194 | - tnl_cfg.encap_destroy = NULL; | ||
1195 | |||
1196 | /* Setup UDP tunnel */ | ||
1197 | setup_udp_tunnel_sock(net, sock, &tnl_cfg); | ||
1198 | diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c | ||
1199 | index 22ba24f2a2c1..f724a7ef9b67 100644 | ||
1200 | --- a/drivers/infiniband/sw/rxe/rxe_qp.c | ||
1201 | +++ b/drivers/infiniband/sw/rxe/rxe_qp.c | ||
1202 | @@ -522,6 +522,7 @@ static void rxe_qp_reset(struct rxe_qp *qp) | ||
1203 | if (qp->sq.queue) { | ||
1204 | __rxe_do_task(&qp->comp.task); | ||
1205 | __rxe_do_task(&qp->req.task); | ||
1206 | + rxe_queue_reset(qp->sq.queue); | ||
1207 | } | ||
1208 | |||
1209 | /* cleanup attributes */ | ||
1210 | @@ -573,6 +574,7 @@ void rxe_qp_error(struct rxe_qp *qp) | ||
1211 | { | ||
1212 | qp->req.state = QP_STATE_ERROR; | ||
1213 | qp->resp.state = QP_STATE_ERROR; | ||
1214 | + qp->attr.qp_state = IB_QPS_ERR; | ||
1215 | |||
1216 | /* drain work and packet queues */ | ||
1217 | rxe_run_task(&qp->resp.task, 1); | ||
1218 | diff --git a/drivers/infiniband/sw/rxe/rxe_queue.c b/drivers/infiniband/sw/rxe/rxe_queue.c | ||
1219 | index 08274254eb88..d14bf496d62d 100644 | ||
1220 | --- a/drivers/infiniband/sw/rxe/rxe_queue.c | ||
1221 | +++ b/drivers/infiniband/sw/rxe/rxe_queue.c | ||
1222 | @@ -84,6 +84,15 @@ err1: | ||
1223 | return -EINVAL; | ||
1224 | } | ||
1225 | |||
1226 | +inline void rxe_queue_reset(struct rxe_queue *q) | ||
1227 | +{ | ||
1228 | + /* queue is comprised from header and the memory | ||
1229 | + * of the actual queue. See "struct rxe_queue_buf" in rxe_queue.h | ||
1230 | + * reset only the queue itself and not the management header | ||
1231 | + */ | ||
1232 | + memset(q->buf->data, 0, q->buf_size - sizeof(struct rxe_queue_buf)); | ||
1233 | +} | ||
1234 | + | ||
1235 | struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe, | ||
1236 | int *num_elem, | ||
1237 | unsigned int elem_size) | ||
1238 | diff --git a/drivers/infiniband/sw/rxe/rxe_queue.h b/drivers/infiniband/sw/rxe/rxe_queue.h | ||
1239 | index 239fd609c31e..8c8641c87817 100644 | ||
1240 | --- a/drivers/infiniband/sw/rxe/rxe_queue.h | ||
1241 | +++ b/drivers/infiniband/sw/rxe/rxe_queue.h | ||
1242 | @@ -84,6 +84,8 @@ int do_mmap_info(struct rxe_dev *rxe, | ||
1243 | size_t buf_size, | ||
1244 | struct rxe_mmap_info **ip_p); | ||
1245 | |||
1246 | +void rxe_queue_reset(struct rxe_queue *q); | ||
1247 | + | ||
1248 | struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe, | ||
1249 | int *num_elem, | ||
1250 | unsigned int elem_size); | ||
1251 | diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c | ||
1252 | index 13a848a518e8..43bb16649e44 100644 | ||
1253 | --- a/drivers/infiniband/sw/rxe/rxe_req.c | ||
1254 | +++ b/drivers/infiniband/sw/rxe/rxe_req.c | ||
1255 | @@ -695,7 +695,8 @@ next_wqe: | ||
1256 | qp->req.wqe_index); | ||
1257 | wqe->state = wqe_state_done; | ||
1258 | wqe->status = IB_WC_SUCCESS; | ||
1259 | - goto complete; | ||
1260 | + __rxe_do_task(&qp->comp.task); | ||
1261 | + return 0; | ||
1262 | } | ||
1263 | payload = mtu; | ||
1264 | } | ||
1265 | @@ -744,13 +745,17 @@ err: | ||
1266 | wqe->status = IB_WC_LOC_PROT_ERR; | ||
1267 | wqe->state = wqe_state_error; | ||
1268 | |||
1269 | -complete: | ||
1270 | - if (qp_type(qp) != IB_QPT_RC) { | ||
1271 | - while (rxe_completer(qp) == 0) | ||
1272 | - ; | ||
1273 | - } | ||
1274 | - | ||
1275 | - return 0; | ||
1276 | + /* | ||
1277 | + * IBA Spec. Section 10.7.3.1 SIGNALED COMPLETIONS | ||
1278 | + * ---------8<---------8<------------- | ||
1279 | + * ...Note that if a completion error occurs, a Work Completion | ||
1280 | + * will always be generated, even if the signaling | ||
1281 | + * indicator requests an Unsignaled Completion. | ||
1282 | + * ---------8<---------8<------------- | ||
1283 | + */ | ||
1284 | + wqe->wr.send_flags |= IB_SEND_SIGNALED; | ||
1285 | + __rxe_do_task(&qp->comp.task); | ||
1286 | + return -EAGAIN; | ||
1287 | |||
1288 | exit: | ||
1289 | return -EAGAIN; | ||
1290 | diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c | ||
1291 | index 41b113875d64..70c646b0097d 100644 | ||
1292 | --- a/drivers/mfd/intel-lpss.c | ||
1293 | +++ b/drivers/mfd/intel-lpss.c | ||
1294 | @@ -502,9 +502,6 @@ int intel_lpss_suspend(struct device *dev) | ||
1295 | for (i = 0; i < LPSS_PRIV_REG_COUNT; i++) | ||
1296 | lpss->priv_ctx[i] = readl(lpss->priv + i * 4); | ||
1297 | |||
1298 | - /* Put the device into reset state */ | ||
1299 | - writel(0, lpss->priv + LPSS_PRIV_RESETS); | ||
1300 | - | ||
1301 | return 0; | ||
1302 | } | ||
1303 | EXPORT_SYMBOL_GPL(intel_lpss_suspend); | ||
1304 | diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c | ||
1305 | index 3ac486a597f3..c57e407020f1 100644 | ||
1306 | --- a/drivers/mfd/mfd-core.c | ||
1307 | +++ b/drivers/mfd/mfd-core.c | ||
1308 | @@ -399,6 +399,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones) | ||
1309 | clones[i]); | ||
1310 | } | ||
1311 | |||
1312 | + put_device(dev); | ||
1313 | + | ||
1314 | return 0; | ||
1315 | } | ||
1316 | EXPORT_SYMBOL(mfd_clone_cell); | ||
1317 | diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c | ||
1318 | index 94c7cc02fdab..00dd7ff70e01 100644 | ||
1319 | --- a/drivers/mfd/stmpe.c | ||
1320 | +++ b/drivers/mfd/stmpe.c | ||
1321 | @@ -761,6 +761,8 @@ static int stmpe1801_reset(struct stmpe *stmpe) | ||
1322 | if (ret < 0) | ||
1323 | return ret; | ||
1324 | |||
1325 | + msleep(10); | ||
1326 | + | ||
1327 | timeout = jiffies + msecs_to_jiffies(100); | ||
1328 | while (time_before(jiffies, timeout)) { | ||
1329 | ret = __stmpe_reg_read(stmpe, STMPE1801_REG_SYS_CTRL); | ||
1330 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
1331 | index 1b5f531eeb25..bf3fd34924bd 100644 | ||
1332 | --- a/drivers/net/virtio_net.c | ||
1333 | +++ b/drivers/net/virtio_net.c | ||
1334 | @@ -2010,23 +2010,33 @@ static struct virtio_device_id id_table[] = { | ||
1335 | { 0 }, | ||
1336 | }; | ||
1337 | |||
1338 | +#define VIRTNET_FEATURES \ | ||
1339 | + VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, \ | ||
1340 | + VIRTIO_NET_F_MAC, \ | ||
1341 | + VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, \ | ||
1342 | + VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, \ | ||
1343 | + VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, \ | ||
1344 | + VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, \ | ||
1345 | + VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \ | ||
1346 | + VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \ | ||
1347 | + VIRTIO_NET_F_CTRL_MAC_ADDR, \ | ||
1348 | + VIRTIO_NET_F_MTU | ||
1349 | + | ||
1350 | static unsigned int features[] = { | ||
1351 | - VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, | ||
1352 | - VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, | ||
1353 | - VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, | ||
1354 | - VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, | ||
1355 | - VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, | ||
1356 | - VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, | ||
1357 | - VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | ||
1358 | - VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, | ||
1359 | - VIRTIO_NET_F_CTRL_MAC_ADDR, | ||
1360 | + VIRTNET_FEATURES, | ||
1361 | +}; | ||
1362 | + | ||
1363 | +static unsigned int features_legacy[] = { | ||
1364 | + VIRTNET_FEATURES, | ||
1365 | + VIRTIO_NET_F_GSO, | ||
1366 | VIRTIO_F_ANY_LAYOUT, | ||
1367 | - VIRTIO_NET_F_MTU, | ||
1368 | }; | ||
1369 | |||
1370 | static struct virtio_driver virtio_net_driver = { | ||
1371 | .feature_table = features, | ||
1372 | .feature_table_size = ARRAY_SIZE(features), | ||
1373 | + .feature_table_legacy = features_legacy, | ||
1374 | + .feature_table_size_legacy = ARRAY_SIZE(features_legacy), | ||
1375 | .driver.name = KBUILD_MODNAME, | ||
1376 | .driver.owner = THIS_MODULE, | ||
1377 | .id_table = id_table, | ||
1378 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | ||
1379 | index 4fdc3dad3e85..ea67ae9c87a0 100644 | ||
1380 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | ||
1381 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | ||
1382 | @@ -1087,6 +1087,15 @@ iwl_mvm_netdetect_config(struct iwl_mvm *mvm, | ||
1383 | ret = iwl_mvm_switch_to_d3(mvm); | ||
1384 | if (ret) | ||
1385 | return ret; | ||
1386 | + } else { | ||
1387 | + /* In theory, we wouldn't have to stop a running sched | ||
1388 | + * scan in order to start another one (for | ||
1389 | + * net-detect). But in practice this doesn't seem to | ||
1390 | + * work properly, so stop any running sched_scan now. | ||
1391 | + */ | ||
1392 | + ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, true); | ||
1393 | + if (ret) | ||
1394 | + return ret; | ||
1395 | } | ||
1396 | |||
1397 | /* rfkill release can be either for wowlan or netdetect */ | ||
1398 | @@ -2088,6 +2097,16 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) | ||
1399 | iwl_mvm_update_changed_regdom(mvm); | ||
1400 | |||
1401 | if (mvm->net_detect) { | ||
1402 | + /* If this is a non-unified image, we restart the FW, | ||
1403 | + * so no need to stop the netdetect scan. If that | ||
1404 | + * fails, continue and try to get the wake-up reasons, | ||
1405 | + * but trigger a HW restart by keeping a failure code | ||
1406 | + * in ret. | ||
1407 | + */ | ||
1408 | + if (unified_image) | ||
1409 | + ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_NETDETECT, | ||
1410 | + false); | ||
1411 | + | ||
1412 | iwl_mvm_query_netdetect_reasons(mvm, vif); | ||
1413 | /* has unlocked the mutex, so skip that */ | ||
1414 | goto out; | ||
1415 | @@ -2271,7 +2290,8 @@ static void iwl_mvm_d3_test_disconn_work_iter(void *_data, u8 *mac, | ||
1416 | static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file) | ||
1417 | { | ||
1418 | struct iwl_mvm *mvm = inode->i_private; | ||
1419 | - int remaining_time = 10; | ||
1420 | + bool unified_image = fw_has_capa(&mvm->fw->ucode_capa, | ||
1421 | + IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG); | ||
1422 | |||
1423 | mvm->d3_test_active = false; | ||
1424 | |||
1425 | @@ -2282,17 +2302,21 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file) | ||
1426 | mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED; | ||
1427 | |||
1428 | iwl_abort_notification_waits(&mvm->notif_wait); | ||
1429 | - ieee80211_restart_hw(mvm->hw); | ||
1430 | + if (!unified_image) { | ||
1431 | + int remaining_time = 10; | ||
1432 | |||
1433 | - /* wait for restart and disconnect all interfaces */ | ||
1434 | - while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && | ||
1435 | - remaining_time > 0) { | ||
1436 | - remaining_time--; | ||
1437 | - msleep(1000); | ||
1438 | - } | ||
1439 | + ieee80211_restart_hw(mvm->hw); | ||
1440 | |||
1441 | - if (remaining_time == 0) | ||
1442 | - IWL_ERR(mvm, "Timed out waiting for HW restart to finish!\n"); | ||
1443 | + /* wait for restart and disconnect all interfaces */ | ||
1444 | + while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && | ||
1445 | + remaining_time > 0) { | ||
1446 | + remaining_time--; | ||
1447 | + msleep(1000); | ||
1448 | + } | ||
1449 | + | ||
1450 | + if (remaining_time == 0) | ||
1451 | + IWL_ERR(mvm, "Timed out waiting for HW restart!\n"); | ||
1452 | + } | ||
1453 | |||
1454 | ieee80211_iterate_active_interfaces_atomic( | ||
1455 | mvm->hw, IEEE80211_IFACE_ITER_NORMAL, | ||
1456 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1457 | index 5dd77e336617..90a1f4a06ba1 100644 | ||
1458 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1459 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1460 | @@ -4097,7 +4097,6 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm, | ||
1461 | struct iwl_mvm_internal_rxq_notif *notif, | ||
1462 | u32 size) | ||
1463 | { | ||
1464 | - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(notif_waitq); | ||
1465 | u32 qmask = BIT(mvm->trans->num_rx_queues) - 1; | ||
1466 | int ret; | ||
1467 | |||
1468 | @@ -4119,7 +4118,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm, | ||
1469 | } | ||
1470 | |||
1471 | if (notif->sync) | ||
1472 | - ret = wait_event_timeout(notif_waitq, | ||
1473 | + ret = wait_event_timeout(mvm->rx_sync_waitq, | ||
1474 | atomic_read(&mvm->queue_sync_counter) == 0, | ||
1475 | HZ); | ||
1476 | WARN_ON_ONCE(!ret); | ||
1477 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | ||
1478 | index 6a615bb73042..e9cb970139c7 100644 | ||
1479 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | ||
1480 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | ||
1481 | @@ -932,6 +932,7 @@ struct iwl_mvm { | ||
1482 | /* sync d0i3_tx queue and IWL_MVM_STATUS_IN_D0I3 status flag */ | ||
1483 | spinlock_t d0i3_tx_lock; | ||
1484 | wait_queue_head_t d0i3_exit_waitq; | ||
1485 | + wait_queue_head_t rx_sync_waitq; | ||
1486 | |||
1487 | /* BT-Coex */ | ||
1488 | struct iwl_bt_coex_profile_notif last_bt_notif; | ||
1489 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | ||
1490 | index 55d9096da68c..30bbdec97d03 100644 | ||
1491 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | ||
1492 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | ||
1493 | @@ -618,6 +618,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, | ||
1494 | spin_lock_init(&mvm->refs_lock); | ||
1495 | skb_queue_head_init(&mvm->d0i3_tx); | ||
1496 | init_waitqueue_head(&mvm->d0i3_exit_waitq); | ||
1497 | + init_waitqueue_head(&mvm->rx_sync_waitq); | ||
1498 | |||
1499 | atomic_set(&mvm->queue_sync_counter, 0); | ||
1500 | |||
1501 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | ||
1502 | index afb7eb60e454..2b994be10b42 100644 | ||
1503 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | ||
1504 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | ||
1505 | @@ -545,7 +545,8 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | ||
1506 | "Received expired RX queue sync message\n"); | ||
1507 | return; | ||
1508 | } | ||
1509 | - atomic_dec(&mvm->queue_sync_counter); | ||
1510 | + if (!atomic_dec_return(&mvm->queue_sync_counter)) | ||
1511 | + wake_up(&mvm->rx_sync_waitq); | ||
1512 | } | ||
1513 | |||
1514 | switch (internal_notif->type) { | ||
1515 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c | ||
1516 | index dac120f8861b..3707ec60b575 100644 | ||
1517 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c | ||
1518 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c | ||
1519 | @@ -1185,6 +1185,9 @@ static int iwl_mvm_num_scans(struct iwl_mvm *mvm) | ||
1520 | |||
1521 | static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type) | ||
1522 | { | ||
1523 | + bool unified_image = fw_has_capa(&mvm->fw->ucode_capa, | ||
1524 | + IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG); | ||
1525 | + | ||
1526 | /* This looks a bit arbitrary, but the idea is that if we run | ||
1527 | * out of possible simultaneous scans and the userspace is | ||
1528 | * trying to run a scan type that is already running, we | ||
1529 | @@ -1211,12 +1214,30 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type) | ||
1530 | return -EBUSY; | ||
1531 | return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true); | ||
1532 | case IWL_MVM_SCAN_NETDETECT: | ||
1533 | - /* No need to stop anything for net-detect since the | ||
1534 | - * firmware is restarted anyway. This way, any sched | ||
1535 | - * scans that were running will be restarted when we | ||
1536 | - * resume. | ||
1537 | - */ | ||
1538 | - return 0; | ||
1539 | + /* For non-unified images, there's no need to stop | ||
1540 | + * anything for net-detect since the firmware is | ||
1541 | + * restarted anyway. This way, any sched scans that | ||
1542 | + * were running will be restarted when we resume. | ||
1543 | + */ | ||
1544 | + if (!unified_image) | ||
1545 | + return 0; | ||
1546 | + | ||
1547 | + /* If this is a unified image and we ran out of scans, | ||
1548 | + * we need to stop something. Prefer stopping regular | ||
1549 | + * scans, because the results are useless at this | ||
1550 | + * point, and we should be able to keep running | ||
1551 | + * another scheduled scan while suspended. | ||
1552 | + */ | ||
1553 | + if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK) | ||
1554 | + return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, | ||
1555 | + true); | ||
1556 | + if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK) | ||
1557 | + return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, | ||
1558 | + true); | ||
1559 | + | ||
1560 | + /* fall through, something is wrong if no scan was | ||
1561 | + * running but we ran out of scans. | ||
1562 | + */ | ||
1563 | default: | ||
1564 | WARN_ON(1); | ||
1565 | break; | ||
1566 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | ||
1567 | index 78cf9a7f3eac..13842ca124ab 100644 | ||
1568 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | ||
1569 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | ||
1570 | @@ -526,48 +526,64 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | ||
1571 | MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids); | ||
1572 | |||
1573 | #ifdef CONFIG_ACPI | ||
1574 | -#define SPL_METHOD "SPLC" | ||
1575 | -#define SPL_DOMAINTYPE_MODULE BIT(0) | ||
1576 | -#define SPL_DOMAINTYPE_WIFI BIT(1) | ||
1577 | -#define SPL_DOMAINTYPE_WIGIG BIT(2) | ||
1578 | -#define SPL_DOMAINTYPE_RFEM BIT(3) | ||
1579 | +#define ACPI_SPLC_METHOD "SPLC" | ||
1580 | +#define ACPI_SPLC_DOMAIN_WIFI (0x07) | ||
1581 | |||
1582 | -static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx) | ||
1583 | +static u64 splc_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splc) | ||
1584 | { | ||
1585 | - union acpi_object *limits, *domain_type, *power_limit; | ||
1586 | - | ||
1587 | - if (splx->type != ACPI_TYPE_PACKAGE || | ||
1588 | - splx->package.count != 2 || | ||
1589 | - splx->package.elements[0].type != ACPI_TYPE_INTEGER || | ||
1590 | - splx->package.elements[0].integer.value != 0) { | ||
1591 | - IWL_ERR(trans, "Unsupported splx structure\n"); | ||
1592 | + union acpi_object *data_pkg, *dflt_pwr_limit; | ||
1593 | + int i; | ||
1594 | + | ||
1595 | + /* We need at least two elements, one for the revision and one | ||
1596 | + * for the data itself. Also check that the revision is | ||
1597 | + * supported (currently only revision 0). | ||
1598 | + */ | ||
1599 | + if (splc->type != ACPI_TYPE_PACKAGE || | ||
1600 | + splc->package.count < 2 || | ||
1601 | + splc->package.elements[0].type != ACPI_TYPE_INTEGER || | ||
1602 | + splc->package.elements[0].integer.value != 0) { | ||
1603 | + IWL_DEBUG_INFO(trans, | ||
1604 | + "Unsupported structure returned by the SPLC method. Ignoring.\n"); | ||
1605 | return 0; | ||
1606 | } | ||
1607 | |||
1608 | - limits = &splx->package.elements[1]; | ||
1609 | - if (limits->type != ACPI_TYPE_PACKAGE || | ||
1610 | - limits->package.count < 2 || | ||
1611 | - limits->package.elements[0].type != ACPI_TYPE_INTEGER || | ||
1612 | - limits->package.elements[1].type != ACPI_TYPE_INTEGER) { | ||
1613 | - IWL_ERR(trans, "Invalid limits element\n"); | ||
1614 | - return 0; | ||
1615 | + /* loop through all the packages to find the one for WiFi */ | ||
1616 | + for (i = 1; i < splc->package.count; i++) { | ||
1617 | + union acpi_object *domain; | ||
1618 | + | ||
1619 | + data_pkg = &splc->package.elements[i]; | ||
1620 | + | ||
1621 | + /* Skip anything that is not a package with the right | ||
1622 | + * amount of elements (i.e. at least 2 integers). | ||
1623 | + */ | ||
1624 | + if (data_pkg->type != ACPI_TYPE_PACKAGE || | ||
1625 | + data_pkg->package.count < 2 || | ||
1626 | + data_pkg->package.elements[0].type != ACPI_TYPE_INTEGER || | ||
1627 | + data_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) | ||
1628 | + continue; | ||
1629 | + | ||
1630 | + domain = &data_pkg->package.elements[0]; | ||
1631 | + if (domain->integer.value == ACPI_SPLC_DOMAIN_WIFI) | ||
1632 | + break; | ||
1633 | + | ||
1634 | + data_pkg = NULL; | ||
1635 | } | ||
1636 | |||
1637 | - domain_type = &limits->package.elements[0]; | ||
1638 | - power_limit = &limits->package.elements[1]; | ||
1639 | - if (!(domain_type->integer.value & SPL_DOMAINTYPE_WIFI)) { | ||
1640 | - IWL_DEBUG_INFO(trans, "WiFi power is not limited\n"); | ||
1641 | + if (!data_pkg) { | ||
1642 | + IWL_DEBUG_INFO(trans, | ||
1643 | + "No element for the WiFi domain returned by the SPLC method.\n"); | ||
1644 | return 0; | ||
1645 | } | ||
1646 | |||
1647 | - return power_limit->integer.value; | ||
1648 | + dflt_pwr_limit = &data_pkg->package.elements[1]; | ||
1649 | + return dflt_pwr_limit->integer.value; | ||
1650 | } | ||
1651 | |||
1652 | static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev) | ||
1653 | { | ||
1654 | acpi_handle pxsx_handle; | ||
1655 | acpi_handle handle; | ||
1656 | - struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER, NULL}; | ||
1657 | + struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER, NULL}; | ||
1658 | acpi_status status; | ||
1659 | |||
1660 | pxsx_handle = ACPI_HANDLE(&pdev->dev); | ||
1661 | @@ -578,23 +594,24 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev) | ||
1662 | } | ||
1663 | |||
1664 | /* Get the method's handle */ | ||
1665 | - status = acpi_get_handle(pxsx_handle, (acpi_string)SPL_METHOD, &handle); | ||
1666 | + status = acpi_get_handle(pxsx_handle, (acpi_string)ACPI_SPLC_METHOD, | ||
1667 | + &handle); | ||
1668 | if (ACPI_FAILURE(status)) { | ||
1669 | - IWL_DEBUG_INFO(trans, "SPL method not found\n"); | ||
1670 | + IWL_DEBUG_INFO(trans, "SPLC method not found\n"); | ||
1671 | return; | ||
1672 | } | ||
1673 | |||
1674 | /* Call SPLC with no arguments */ | ||
1675 | - status = acpi_evaluate_object(handle, NULL, NULL, &splx); | ||
1676 | + status = acpi_evaluate_object(handle, NULL, NULL, &splc); | ||
1677 | if (ACPI_FAILURE(status)) { | ||
1678 | IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status); | ||
1679 | return; | ||
1680 | } | ||
1681 | |||
1682 | - trans->dflt_pwr_limit = splx_get_pwr_limit(trans, splx.pointer); | ||
1683 | + trans->dflt_pwr_limit = splc_get_pwr_limit(trans, splc.pointer); | ||
1684 | IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n", | ||
1685 | trans->dflt_pwr_limit); | ||
1686 | - kfree(splx.pointer); | ||
1687 | + kfree(splc.pointer); | ||
1688 | } | ||
1689 | |||
1690 | #else /* CONFIG_ACPI */ | ||
1691 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c | ||
1692 | index 18650dccdb58..478bba527977 100644 | ||
1693 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c | ||
1694 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c | ||
1695 | @@ -522,6 +522,7 @@ error: | ||
1696 | static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, | ||
1697 | int slots_num, u32 txq_id) | ||
1698 | { | ||
1699 | + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
1700 | int ret; | ||
1701 | |||
1702 | txq->need_update = false; | ||
1703 | @@ -536,6 +537,13 @@ static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, | ||
1704 | return ret; | ||
1705 | |||
1706 | spin_lock_init(&txq->lock); | ||
1707 | + | ||
1708 | + if (txq_id == trans_pcie->cmd_queue) { | ||
1709 | + static struct lock_class_key iwl_pcie_cmd_queue_lock_class; | ||
1710 | + | ||
1711 | + lockdep_set_class(&txq->lock, &iwl_pcie_cmd_queue_lock_class); | ||
1712 | + } | ||
1713 | + | ||
1714 | __skb_queue_head_init(&txq->overflow_q); | ||
1715 | |||
1716 | /* | ||
1717 | diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c | ||
1718 | index ec2e9c5fb993..22394fe30579 100644 | ||
1719 | --- a/drivers/rtc/rtc-omap.c | ||
1720 | +++ b/drivers/rtc/rtc-omap.c | ||
1721 | @@ -109,6 +109,7 @@ | ||
1722 | /* OMAP_RTC_OSC_REG bit fields: */ | ||
1723 | #define OMAP_RTC_OSC_32KCLK_EN BIT(6) | ||
1724 | #define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3) | ||
1725 | +#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4) | ||
1726 | |||
1727 | /* OMAP_RTC_IRQWAKEEN bit fields: */ | ||
1728 | #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1) | ||
1729 | @@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platform_device *pdev) | ||
1730 | */ | ||
1731 | if (rtc->has_ext_clk) { | ||
1732 | reg = rtc_read(rtc, OMAP_RTC_OSC_REG); | ||
1733 | - rtc_write(rtc, OMAP_RTC_OSC_REG, | ||
1734 | - reg | OMAP_RTC_OSC_SEL_32KCLK_SRC); | ||
1735 | + reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE; | ||
1736 | + reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC; | ||
1737 | + rtc_writel(rtc, OMAP_RTC_OSC_REG, reg); | ||
1738 | } | ||
1739 | |||
1740 | rtc->type->lock(rtc); | ||
1741 | diff --git a/drivers/uwb/lc-rc.c b/drivers/uwb/lc-rc.c | ||
1742 | index d059ad4d0dbd..97ee1b46db69 100644 | ||
1743 | --- a/drivers/uwb/lc-rc.c | ||
1744 | +++ b/drivers/uwb/lc-rc.c | ||
1745 | @@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_index(int index) | ||
1746 | struct uwb_rc *rc = NULL; | ||
1747 | |||
1748 | dev = class_find_device(&uwb_rc_class, NULL, &index, uwb_rc_index_match); | ||
1749 | - if (dev) | ||
1750 | + if (dev) { | ||
1751 | rc = dev_get_drvdata(dev); | ||
1752 | + put_device(dev); | ||
1753 | + } | ||
1754 | + | ||
1755 | return rc; | ||
1756 | } | ||
1757 | |||
1758 | @@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *target_rc) | ||
1759 | if (dev) { | ||
1760 | rc = dev_get_drvdata(dev); | ||
1761 | __uwb_rc_get(rc); | ||
1762 | + put_device(dev); | ||
1763 | } | ||
1764 | + | ||
1765 | return rc; | ||
1766 | } | ||
1767 | EXPORT_SYMBOL_GPL(__uwb_rc_try_get); | ||
1768 | @@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(const struct device *grandpa_dev) | ||
1769 | |||
1770 | dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev, | ||
1771 | find_rc_grandpa); | ||
1772 | - if (dev) | ||
1773 | + if (dev) { | ||
1774 | rc = dev_get_drvdata(dev); | ||
1775 | + put_device(dev); | ||
1776 | + } | ||
1777 | + | ||
1778 | return rc; | ||
1779 | } | ||
1780 | EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa); | ||
1781 | @@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const struct uwb_dev_addr *addr) | ||
1782 | struct uwb_rc *rc = NULL; | ||
1783 | |||
1784 | dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev); | ||
1785 | - if (dev) | ||
1786 | + if (dev) { | ||
1787 | rc = dev_get_drvdata(dev); | ||
1788 | + put_device(dev); | ||
1789 | + } | ||
1790 | |||
1791 | return rc; | ||
1792 | } | ||
1793 | diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c | ||
1794 | index c1304b8d4985..678e93741ae1 100644 | ||
1795 | --- a/drivers/uwb/pal.c | ||
1796 | +++ b/drivers/uwb/pal.c | ||
1797 | @@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc) | ||
1798 | |||
1799 | dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc); | ||
1800 | |||
1801 | + put_device(dev); | ||
1802 | + | ||
1803 | return (dev != NULL); | ||
1804 | } | ||
1805 | |||
1806 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
1807 | index ea31931386ec..7bd21aaedaaf 100644 | ||
1808 | --- a/fs/ext4/ext4.h | ||
1809 | +++ b/fs/ext4/ext4.h | ||
1810 | @@ -235,6 +235,7 @@ struct ext4_io_submit { | ||
1811 | #define EXT4_MAX_BLOCK_SIZE 65536 | ||
1812 | #define EXT4_MIN_BLOCK_LOG_SIZE 10 | ||
1813 | #define EXT4_MAX_BLOCK_LOG_SIZE 16 | ||
1814 | +#define EXT4_MAX_CLUSTER_LOG_SIZE 30 | ||
1815 | #ifdef __KERNEL__ | ||
1816 | # define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize) | ||
1817 | #else | ||
1818 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
1819 | index 3ec8708989ca..ec89f5005c2d 100644 | ||
1820 | --- a/fs/ext4/super.c | ||
1821 | +++ b/fs/ext4/super.c | ||
1822 | @@ -3518,7 +3518,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1823 | if (blocksize < EXT4_MIN_BLOCK_SIZE || | ||
1824 | blocksize > EXT4_MAX_BLOCK_SIZE) { | ||
1825 | ext4_msg(sb, KERN_ERR, | ||
1826 | - "Unsupported filesystem blocksize %d", blocksize); | ||
1827 | + "Unsupported filesystem blocksize %d (%d log_block_size)", | ||
1828 | + blocksize, le32_to_cpu(es->s_log_block_size)); | ||
1829 | + goto failed_mount; | ||
1830 | + } | ||
1831 | + if (le32_to_cpu(es->s_log_block_size) > | ||
1832 | + (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { | ||
1833 | + ext4_msg(sb, KERN_ERR, | ||
1834 | + "Invalid log block size: %u", | ||
1835 | + le32_to_cpu(es->s_log_block_size)); | ||
1836 | goto failed_mount; | ||
1837 | } | ||
1838 | |||
1839 | @@ -3650,6 +3658,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1840 | "block size (%d)", clustersize, blocksize); | ||
1841 | goto failed_mount; | ||
1842 | } | ||
1843 | + if (le32_to_cpu(es->s_log_cluster_size) > | ||
1844 | + (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { | ||
1845 | + ext4_msg(sb, KERN_ERR, | ||
1846 | + "Invalid log cluster size: %u", | ||
1847 | + le32_to_cpu(es->s_log_cluster_size)); | ||
1848 | + goto failed_mount; | ||
1849 | + } | ||
1850 | sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) - | ||
1851 | le32_to_cpu(es->s_log_block_size); | ||
1852 | sbi->s_clusters_per_group = | ||
1853 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c | ||
1854 | index 3988b43c2f5a..a621dd98a865 100644 | ||
1855 | --- a/fs/fuse/file.c | ||
1856 | +++ b/fs/fuse/file.c | ||
1857 | @@ -1985,6 +1985,10 @@ static int fuse_write_end(struct file *file, struct address_space *mapping, | ||
1858 | { | ||
1859 | struct inode *inode = page->mapping->host; | ||
1860 | |||
1861 | + /* Haven't copied anything? Skip zeroing, size extending, dirtying. */ | ||
1862 | + if (!copied) | ||
1863 | + goto unlock; | ||
1864 | + | ||
1865 | if (!PageUptodate(page)) { | ||
1866 | /* Zero any unwritten bytes at the end of the page */ | ||
1867 | size_t endoff = (pos + copied) & ~PAGE_MASK; | ||
1868 | @@ -1995,6 +1999,8 @@ static int fuse_write_end(struct file *file, struct address_space *mapping, | ||
1869 | |||
1870 | fuse_write_update_size(inode, pos + copied); | ||
1871 | set_page_dirty(page); | ||
1872 | + | ||
1873 | +unlock: | ||
1874 | unlock_page(page); | ||
1875 | put_page(page); | ||
1876 | |||
1877 | diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h | ||
1878 | index ab02a457da1f..e5d193440374 100644 | ||
1879 | --- a/include/linux/sunrpc/svc_xprt.h | ||
1880 | +++ b/include/linux/sunrpc/svc_xprt.h | ||
1881 | @@ -25,6 +25,7 @@ struct svc_xprt_ops { | ||
1882 | void (*xpo_detach)(struct svc_xprt *); | ||
1883 | void (*xpo_free)(struct svc_xprt *); | ||
1884 | int (*xpo_secure_port)(struct svc_rqst *); | ||
1885 | + void (*xpo_kill_temp_xprt)(struct svc_xprt *); | ||
1886 | }; | ||
1887 | |||
1888 | struct svc_xprt_class { | ||
1889 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c | ||
1890 | index 9530fcd27704..9d592c66f754 100644 | ||
1891 | --- a/kernel/irq/manage.c | ||
1892 | +++ b/kernel/irq/manage.c | ||
1893 | @@ -1341,12 +1341,12 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | ||
1894 | |||
1895 | } else if (new->flags & IRQF_TRIGGER_MASK) { | ||
1896 | unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK; | ||
1897 | - unsigned int omsk = irq_settings_get_trigger_mask(desc); | ||
1898 | + unsigned int omsk = irqd_get_trigger_type(&desc->irq_data); | ||
1899 | |||
1900 | if (nmsk != omsk) | ||
1901 | /* hope the handler works with current trigger mode */ | ||
1902 | pr_warn("irq %d uses trigger mode %u; requested %u\n", | ||
1903 | - irq, nmsk, omsk); | ||
1904 | + irq, omsk, nmsk); | ||
1905 | } | ||
1906 | |||
1907 | *old_ptr = new; | ||
1908 | diff --git a/kernel/power/suspend_test.c b/kernel/power/suspend_test.c | ||
1909 | index 084452e34a12..bdff5ed57f10 100644 | ||
1910 | --- a/kernel/power/suspend_test.c | ||
1911 | +++ b/kernel/power/suspend_test.c | ||
1912 | @@ -203,8 +203,10 @@ static int __init test_suspend(void) | ||
1913 | |||
1914 | /* RTCs have initialized by now too ... can we use one? */ | ||
1915 | dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm); | ||
1916 | - if (dev) | ||
1917 | + if (dev) { | ||
1918 | rtc = rtc_class_open(dev_name(dev)); | ||
1919 | + put_device(dev); | ||
1920 | + } | ||
1921 | if (!rtc) { | ||
1922 | printk(warn_no_rtc); | ||
1923 | return 0; | ||
1924 | diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile | ||
1925 | index d0a1617b52b4..979e7bfbde7a 100644 | ||
1926 | --- a/kernel/trace/Makefile | ||
1927 | +++ b/kernel/trace/Makefile | ||
1928 | @@ -1,8 +1,4 @@ | ||
1929 | |||
1930 | -# We are fully aware of the dangers of __builtin_return_address() | ||
1931 | -FRAME_CFLAGS := $(call cc-disable-warning,frame-address) | ||
1932 | -KBUILD_CFLAGS += $(FRAME_CFLAGS) | ||
1933 | - | ||
1934 | # Do not instrument the tracer itself: | ||
1935 | |||
1936 | ifdef CONFIG_FUNCTION_TRACER | ||
1937 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
1938 | index 84752c8e28b5..b1d7f1b5e791 100644 | ||
1939 | --- a/kernel/trace/ftrace.c | ||
1940 | +++ b/kernel/trace/ftrace.c | ||
1941 | @@ -1856,6 +1856,10 @@ static int __ftrace_hash_update_ipmodify(struct ftrace_ops *ops, | ||
1942 | |||
1943 | /* Update rec->flags */ | ||
1944 | do_for_each_ftrace_rec(pg, rec) { | ||
1945 | + | ||
1946 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
1947 | + continue; | ||
1948 | + | ||
1949 | /* We need to update only differences of filter_hash */ | ||
1950 | in_old = !!ftrace_lookup_ip(old_hash, rec->ip); | ||
1951 | in_new = !!ftrace_lookup_ip(new_hash, rec->ip); | ||
1952 | @@ -1878,6 +1882,10 @@ rollback: | ||
1953 | |||
1954 | /* Roll back what we did above */ | ||
1955 | do_for_each_ftrace_rec(pg, rec) { | ||
1956 | + | ||
1957 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
1958 | + continue; | ||
1959 | + | ||
1960 | if (rec == end) | ||
1961 | goto err_out; | ||
1962 | |||
1963 | @@ -2391,6 +2399,10 @@ void __weak ftrace_replace_code(int enable) | ||
1964 | return; | ||
1965 | |||
1966 | do_for_each_ftrace_rec(pg, rec) { | ||
1967 | + | ||
1968 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
1969 | + continue; | ||
1970 | + | ||
1971 | failed = __ftrace_replace_code(rec, enable); | ||
1972 | if (failed) { | ||
1973 | ftrace_bug(failed, rec); | ||
1974 | @@ -2757,7 +2769,7 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command) | ||
1975 | struct dyn_ftrace *rec; | ||
1976 | |||
1977 | do_for_each_ftrace_rec(pg, rec) { | ||
1978 | - if (FTRACE_WARN_ON_ONCE(rec->flags)) | ||
1979 | + if (FTRACE_WARN_ON_ONCE(rec->flags & ~FTRACE_FL_DISABLED)) | ||
1980 | pr_warn(" %pS flags:%lx\n", | ||
1981 | (void *)rec->ip, rec->flags); | ||
1982 | } while_for_each_ftrace_rec(); | ||
1983 | @@ -3592,6 +3604,10 @@ match_records(struct ftrace_hash *hash, char *func, int len, char *mod) | ||
1984 | goto out_unlock; | ||
1985 | |||
1986 | do_for_each_ftrace_rec(pg, rec) { | ||
1987 | + | ||
1988 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
1989 | + continue; | ||
1990 | + | ||
1991 | if (ftrace_match_record(rec, &func_g, mod_match, exclude_mod)) { | ||
1992 | ret = enter_record(hash, rec, clear_filter); | ||
1993 | if (ret < 0) { | ||
1994 | @@ -3787,6 +3803,9 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, | ||
1995 | |||
1996 | do_for_each_ftrace_rec(pg, rec) { | ||
1997 | |||
1998 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
1999 | + continue; | ||
2000 | + | ||
2001 | if (!ftrace_match_record(rec, &func_g, NULL, 0)) | ||
2002 | continue; | ||
2003 | |||
2004 | @@ -4679,6 +4698,9 @@ ftrace_set_func(unsigned long *array, int *idx, int size, char *buffer) | ||
2005 | |||
2006 | do_for_each_ftrace_rec(pg, rec) { | ||
2007 | |||
2008 | + if (rec->flags & FTRACE_FL_DISABLED) | ||
2009 | + continue; | ||
2010 | + | ||
2011 | if (ftrace_match_record(rec, &func_g, NULL, 0)) { | ||
2012 | /* if it is in the array */ | ||
2013 | exists = false; | ||
2014 | diff --git a/mm/Makefile b/mm/Makefile | ||
2015 | index 2ca1faf3fa09..295bd7a9f76b 100644 | ||
2016 | --- a/mm/Makefile | ||
2017 | +++ b/mm/Makefile | ||
2018 | @@ -21,9 +21,6 @@ KCOV_INSTRUMENT_memcontrol.o := n | ||
2019 | KCOV_INSTRUMENT_mmzone.o := n | ||
2020 | KCOV_INSTRUMENT_vmstat.o := n | ||
2021 | |||
2022 | -# Since __builtin_frame_address does work as used, disable the warning. | ||
2023 | -CFLAGS_usercopy.o += $(call cc-disable-warning, frame-address) | ||
2024 | - | ||
2025 | mmu-y := nommu.o | ||
2026 | mmu-$(CONFIG_MMU) := gup.o highmem.o memory.o mincore.o \ | ||
2027 | mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \ | ||
2028 | diff --git a/net/can/bcm.c b/net/can/bcm.c | ||
2029 | index 8e999ffdf28b..8af9d25ff988 100644 | ||
2030 | --- a/net/can/bcm.c | ||
2031 | +++ b/net/can/bcm.c | ||
2032 | @@ -1549,24 +1549,31 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len, | ||
2033 | struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; | ||
2034 | struct sock *sk = sock->sk; | ||
2035 | struct bcm_sock *bo = bcm_sk(sk); | ||
2036 | + int ret = 0; | ||
2037 | |||
2038 | if (len < sizeof(*addr)) | ||
2039 | return -EINVAL; | ||
2040 | |||
2041 | - if (bo->bound) | ||
2042 | - return -EISCONN; | ||
2043 | + lock_sock(sk); | ||
2044 | + | ||
2045 | + if (bo->bound) { | ||
2046 | + ret = -EISCONN; | ||
2047 | + goto fail; | ||
2048 | + } | ||
2049 | |||
2050 | /* bind a device to this socket */ | ||
2051 | if (addr->can_ifindex) { | ||
2052 | struct net_device *dev; | ||
2053 | |||
2054 | dev = dev_get_by_index(&init_net, addr->can_ifindex); | ||
2055 | - if (!dev) | ||
2056 | - return -ENODEV; | ||
2057 | - | ||
2058 | + if (!dev) { | ||
2059 | + ret = -ENODEV; | ||
2060 | + goto fail; | ||
2061 | + } | ||
2062 | if (dev->type != ARPHRD_CAN) { | ||
2063 | dev_put(dev); | ||
2064 | - return -ENODEV; | ||
2065 | + ret = -ENODEV; | ||
2066 | + goto fail; | ||
2067 | } | ||
2068 | |||
2069 | bo->ifindex = dev->ifindex; | ||
2070 | @@ -1577,17 +1584,24 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len, | ||
2071 | bo->ifindex = 0; | ||
2072 | } | ||
2073 | |||
2074 | - bo->bound = 1; | ||
2075 | - | ||
2076 | if (proc_dir) { | ||
2077 | /* unique socket address as filename */ | ||
2078 | sprintf(bo->procname, "%lu", sock_i_ino(sk)); | ||
2079 | bo->bcm_proc_read = proc_create_data(bo->procname, 0644, | ||
2080 | proc_dir, | ||
2081 | &bcm_proc_fops, sk); | ||
2082 | + if (!bo->bcm_proc_read) { | ||
2083 | + ret = -ENOMEM; | ||
2084 | + goto fail; | ||
2085 | + } | ||
2086 | } | ||
2087 | |||
2088 | - return 0; | ||
2089 | + bo->bound = 1; | ||
2090 | + | ||
2091 | +fail: | ||
2092 | + release_sock(sk); | ||
2093 | + | ||
2094 | + return ret; | ||
2095 | } | ||
2096 | |||
2097 | static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | ||
2098 | diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c | ||
2099 | index 0af26699bf04..584ac76ec555 100644 | ||
2100 | --- a/net/netfilter/nft_dynset.c | ||
2101 | +++ b/net/netfilter/nft_dynset.c | ||
2102 | @@ -143,7 +143,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx, | ||
2103 | if (tb[NFTA_DYNSET_TIMEOUT] != NULL) { | ||
2104 | if (!(set->flags & NFT_SET_TIMEOUT)) | ||
2105 | return -EINVAL; | ||
2106 | - timeout = be64_to_cpu(nla_get_be64(tb[NFTA_DYNSET_TIMEOUT])); | ||
2107 | + timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64( | ||
2108 | + tb[NFTA_DYNSET_TIMEOUT]))); | ||
2109 | } | ||
2110 | |||
2111 | priv->sreg_key = nft_parse_register(tb[NFTA_DYNSET_SREG_KEY]); | ||
2112 | @@ -230,7 +231,8 @@ static int nft_dynset_dump(struct sk_buff *skb, const struct nft_expr *expr) | ||
2113 | goto nla_put_failure; | ||
2114 | if (nla_put_string(skb, NFTA_DYNSET_SET_NAME, priv->set->name)) | ||
2115 | goto nla_put_failure; | ||
2116 | - if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, cpu_to_be64(priv->timeout), | ||
2117 | + if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, | ||
2118 | + cpu_to_be64(jiffies_to_msecs(priv->timeout)), | ||
2119 | NFTA_DYNSET_PAD)) | ||
2120 | goto nla_put_failure; | ||
2121 | if (priv->expr && nft_expr_dump(skb, NFTA_DYNSET_EXPR, priv->expr)) | ||
2122 | diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c | ||
2123 | index c3f652395a80..3bc1d61694cb 100644 | ||
2124 | --- a/net/sunrpc/svc_xprt.c | ||
2125 | +++ b/net/sunrpc/svc_xprt.c | ||
2126 | @@ -1002,14 +1002,8 @@ static void svc_age_temp_xprts(unsigned long closure) | ||
2127 | void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr) | ||
2128 | { | ||
2129 | struct svc_xprt *xprt; | ||
2130 | - struct svc_sock *svsk; | ||
2131 | - struct socket *sock; | ||
2132 | struct list_head *le, *next; | ||
2133 | LIST_HEAD(to_be_closed); | ||
2134 | - struct linger no_linger = { | ||
2135 | - .l_onoff = 1, | ||
2136 | - .l_linger = 0, | ||
2137 | - }; | ||
2138 | |||
2139 | spin_lock_bh(&serv->sv_lock); | ||
2140 | list_for_each_safe(le, next, &serv->sv_tempsocks) { | ||
2141 | @@ -1027,10 +1021,7 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr) | ||
2142 | list_del_init(le); | ||
2143 | xprt = list_entry(le, struct svc_xprt, xpt_list); | ||
2144 | dprintk("svc_age_temp_xprts_now: closing %p\n", xprt); | ||
2145 | - svsk = container_of(xprt, struct svc_sock, sk_xprt); | ||
2146 | - sock = svsk->sk_sock; | ||
2147 | - kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER, | ||
2148 | - (char *)&no_linger, sizeof(no_linger)); | ||
2149 | + xprt->xpt_ops->xpo_kill_temp_xprt(xprt); | ||
2150 | svc_close_xprt(xprt); | ||
2151 | } | ||
2152 | } | ||
2153 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c | ||
2154 | index 57625f64efd5..a4bc98265d88 100644 | ||
2155 | --- a/net/sunrpc/svcsock.c | ||
2156 | +++ b/net/sunrpc/svcsock.c | ||
2157 | @@ -438,6 +438,21 @@ static int svc_tcp_has_wspace(struct svc_xprt *xprt) | ||
2158 | return !test_bit(SOCK_NOSPACE, &svsk->sk_sock->flags); | ||
2159 | } | ||
2160 | |||
2161 | +static void svc_tcp_kill_temp_xprt(struct svc_xprt *xprt) | ||
2162 | +{ | ||
2163 | + struct svc_sock *svsk; | ||
2164 | + struct socket *sock; | ||
2165 | + struct linger no_linger = { | ||
2166 | + .l_onoff = 1, | ||
2167 | + .l_linger = 0, | ||
2168 | + }; | ||
2169 | + | ||
2170 | + svsk = container_of(xprt, struct svc_sock, sk_xprt); | ||
2171 | + sock = svsk->sk_sock; | ||
2172 | + kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER, | ||
2173 | + (char *)&no_linger, sizeof(no_linger)); | ||
2174 | +} | ||
2175 | + | ||
2176 | /* | ||
2177 | * See net/ipv6/ip_sockglue.c : ip_cmsg_recv_pktinfo | ||
2178 | */ | ||
2179 | @@ -648,6 +663,10 @@ static struct svc_xprt *svc_udp_accept(struct svc_xprt *xprt) | ||
2180 | return NULL; | ||
2181 | } | ||
2182 | |||
2183 | +static void svc_udp_kill_temp_xprt(struct svc_xprt *xprt) | ||
2184 | +{ | ||
2185 | +} | ||
2186 | + | ||
2187 | static struct svc_xprt *svc_udp_create(struct svc_serv *serv, | ||
2188 | struct net *net, | ||
2189 | struct sockaddr *sa, int salen, | ||
2190 | @@ -667,6 +686,7 @@ static struct svc_xprt_ops svc_udp_ops = { | ||
2191 | .xpo_has_wspace = svc_udp_has_wspace, | ||
2192 | .xpo_accept = svc_udp_accept, | ||
2193 | .xpo_secure_port = svc_sock_secure_port, | ||
2194 | + .xpo_kill_temp_xprt = svc_udp_kill_temp_xprt, | ||
2195 | }; | ||
2196 | |||
2197 | static struct svc_xprt_class svc_udp_class = { | ||
2198 | @@ -1242,6 +1262,7 @@ static struct svc_xprt_ops svc_tcp_ops = { | ||
2199 | .xpo_has_wspace = svc_tcp_has_wspace, | ||
2200 | .xpo_accept = svc_tcp_accept, | ||
2201 | .xpo_secure_port = svc_sock_secure_port, | ||
2202 | + .xpo_kill_temp_xprt = svc_tcp_kill_temp_xprt, | ||
2203 | }; | ||
2204 | |||
2205 | static struct svc_xprt_class svc_tcp_class = { | ||
2206 | diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c | ||
2207 | index 924271c9ef3e..a55b8093a7f9 100644 | ||
2208 | --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c | ||
2209 | +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | ||
2210 | @@ -67,6 +67,7 @@ static void svc_rdma_detach(struct svc_xprt *xprt); | ||
2211 | static void svc_rdma_free(struct svc_xprt *xprt); | ||
2212 | static int svc_rdma_has_wspace(struct svc_xprt *xprt); | ||
2213 | static int svc_rdma_secure_port(struct svc_rqst *); | ||
2214 | +static void svc_rdma_kill_temp_xprt(struct svc_xprt *); | ||
2215 | |||
2216 | static struct svc_xprt_ops svc_rdma_ops = { | ||
2217 | .xpo_create = svc_rdma_create, | ||
2218 | @@ -79,6 +80,7 @@ static struct svc_xprt_ops svc_rdma_ops = { | ||
2219 | .xpo_has_wspace = svc_rdma_has_wspace, | ||
2220 | .xpo_accept = svc_rdma_accept, | ||
2221 | .xpo_secure_port = svc_rdma_secure_port, | ||
2222 | + .xpo_kill_temp_xprt = svc_rdma_kill_temp_xprt, | ||
2223 | }; | ||
2224 | |||
2225 | struct svc_xprt_class svc_rdma_class = { | ||
2226 | @@ -1285,6 +1287,10 @@ static int svc_rdma_secure_port(struct svc_rqst *rqstp) | ||
2227 | return 1; | ||
2228 | } | ||
2229 | |||
2230 | +static void svc_rdma_kill_temp_xprt(struct svc_xprt *xprt) | ||
2231 | +{ | ||
2232 | +} | ||
2233 | + | ||
2234 | int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) | ||
2235 | { | ||
2236 | struct ib_send_wr *bad_wr, *n_wr; | ||
2237 | diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh | ||
2238 | index 973e8c141567..17867e723a51 100755 | ||
2239 | --- a/scripts/gcc-x86_64-has-stack-protector.sh | ||
2240 | +++ b/scripts/gcc-x86_64-has-stack-protector.sh | ||
2241 | @@ -1,6 +1,6 @@ | ||
2242 | #!/bin/sh | ||
2243 | |||
2244 | -echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
2245 | +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
2246 | if [ "$?" -eq "0" ] ; then | ||
2247 | echo y | ||
2248 | else | ||
2249 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
2250 | index 26e866f65314..162818058a5d 100644 | ||
2251 | --- a/sound/pci/hda/patch_realtek.c | ||
2252 | +++ b/sound/pci/hda/patch_realtek.c | ||
2253 | @@ -6905,8 +6905,6 @@ static const struct hda_fixup alc662_fixups[] = { | ||
2254 | .v.pins = (const struct hda_pintbl[]) { | ||
2255 | { 0x15, 0x40f000f0 }, /* disabled */ | ||
2256 | { 0x16, 0x40f000f0 }, /* disabled */ | ||
2257 | - { 0x18, 0x01014011 }, /* LO */ | ||
2258 | - { 0x1a, 0x01014012 }, /* LO */ | ||
2259 | { } | ||
2260 | } | ||
2261 | }, | ||
2262 | diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c | ||
2263 | index 6a23302297c9..4d9d320a7971 100644 | ||
2264 | --- a/sound/pci/hda/thinkpad_helper.c | ||
2265 | +++ b/sound/pci/hda/thinkpad_helper.c | ||
2266 | @@ -13,7 +13,8 @@ static void (*old_vmaster_hook)(void *, int); | ||
2267 | static bool is_thinkpad(struct hda_codec *codec) | ||
2268 | { | ||
2269 | return (codec->core.subsystem_id >> 16 == 0x17aa) && | ||
2270 | - (acpi_dev_found("LEN0068") || acpi_dev_found("IBM0068")); | ||
2271 | + (acpi_dev_found("LEN0068") || acpi_dev_found("LEN0268") || | ||
2272 | + acpi_dev_found("IBM0068")); | ||
2273 | } | ||
2274 | |||
2275 | static void update_tpacpi_mute_led(void *private_data, int enabled) | ||
2276 | diff --git a/sound/usb/card.c b/sound/usb/card.c | ||
2277 | index 9e5276d6dda0..2ddc034673a8 100644 | ||
2278 | --- a/sound/usb/card.c | ||
2279 | +++ b/sound/usb/card.c | ||
2280 | @@ -315,7 +315,8 @@ static int snd_usb_audio_free(struct snd_usb_audio *chip) | ||
2281 | snd_usb_endpoint_free(ep); | ||
2282 | |||
2283 | mutex_destroy(&chip->mutex); | ||
2284 | - dev_set_drvdata(&chip->dev->dev, NULL); | ||
2285 | + if (!atomic_read(&chip->shutdown)) | ||
2286 | + dev_set_drvdata(&chip->dev->dev, NULL); | ||
2287 | kfree(chip); | ||
2288 | return 0; | ||
2289 | } | ||
2290 | diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c | ||
2291 | index de15dbcdcecf..7214913861cf 100644 | ||
2292 | --- a/tools/perf/util/hist.c | ||
2293 | +++ b/tools/perf/util/hist.c | ||
2294 | @@ -1596,18 +1596,18 @@ static void hists__hierarchy_output_resort(struct hists *hists, | ||
2295 | if (prog) | ||
2296 | ui_progress__update(prog, 1); | ||
2297 | |||
2298 | + hists->nr_entries++; | ||
2299 | + if (!he->filtered) { | ||
2300 | + hists->nr_non_filtered_entries++; | ||
2301 | + hists__calc_col_len(hists, he); | ||
2302 | + } | ||
2303 | + | ||
2304 | if (!he->leaf) { | ||
2305 | hists__hierarchy_output_resort(hists, prog, | ||
2306 | &he->hroot_in, | ||
2307 | &he->hroot_out, | ||
2308 | min_callchain_hits, | ||
2309 | use_callchain); | ||
2310 | - hists->nr_entries++; | ||
2311 | - if (!he->filtered) { | ||
2312 | - hists->nr_non_filtered_entries++; | ||
2313 | - hists__calc_col_len(hists, he); | ||
2314 | - } | ||
2315 | - | ||
2316 | continue; | ||
2317 | } | ||
2318 | |||
2319 | diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c | ||
2320 | index 6e9c40eea208..69ccce308458 100644 | ||
2321 | --- a/virt/kvm/arm/pmu.c | ||
2322 | +++ b/virt/kvm/arm/pmu.c | ||
2323 | @@ -305,7 +305,7 @@ void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val) | ||
2324 | continue; | ||
2325 | type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i) | ||
2326 | & ARMV8_PMU_EVTYPE_EVENT; | ||
2327 | - if ((type == ARMV8_PMU_EVTYPE_EVENT_SW_INCR) | ||
2328 | + if ((type == ARMV8_PMUV3_PERFCTR_SW_INCR) | ||
2329 | && (enable & BIT(i))) { | ||
2330 | reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1; | ||
2331 | reg = lower_32_bits(reg); | ||
2332 | @@ -379,7 +379,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data, | ||
2333 | eventsel = data & ARMV8_PMU_EVTYPE_EVENT; | ||
2334 | |||
2335 | /* Software increment event does't need to be backed by a perf event */ | ||
2336 | - if (eventsel == ARMV8_PMU_EVTYPE_EVENT_SW_INCR) | ||
2337 | + if (eventsel == ARMV8_PMUV3_PERFCTR_SW_INCR && | ||
2338 | + select_idx != ARMV8_PMU_CYCLE_IDX) | ||
2339 | return; | ||
2340 | |||
2341 | memset(&attr, 0, sizeof(struct perf_event_attr)); | ||
2342 | @@ -391,7 +392,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data, | ||
2343 | attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0; | ||
2344 | attr.exclude_hv = 1; /* Don't count EL2 events */ | ||
2345 | attr.exclude_host = 1; /* Don't count host events */ | ||
2346 | - attr.config = eventsel; | ||
2347 | + attr.config = (select_idx == ARMV8_PMU_CYCLE_IDX) ? | ||
2348 | + ARMV8_PMUV3_PERFCTR_CPU_CYCLES : eventsel; | ||
2349 | |||
2350 | counter = kvm_pmu_get_counter_value(vcpu, select_idx); | ||
2351 | /* The initial sample period (overflow count) of an event. */ |