Contents of /trunk/kernel-magellan/patches-4.8/0110-4.8.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2850 -
(show 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 | 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. */ |