Contents of /trunk/kernel-alx/patches-4.19/0109-4.19.10-all-fixes.patch
Parent Directory | Revision Log
Revision 3388 -
(show annotations)
(download)
Fri Aug 2 11:47:09 2019 UTC (5 years, 1 month ago) by niro
File size: 166350 byte(s)
Fri Aug 2 11:47:09 2019 UTC (5 years, 1 month ago) by niro
File size: 166350 byte(s)
-linux-4.19.10
1 | diff --git a/Makefile b/Makefile |
2 | index 8717f34464d5..36d9de42def3 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 19 |
9 | -SUBLEVEL = 9 |
10 | +SUBLEVEL = 10 |
11 | EXTRAVERSION = |
12 | NAME = "People's Front" |
13 | |
14 | diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts |
15 | index 1d158cfda15f..c45aef806870 100644 |
16 | --- a/arch/arm/boot/dts/am3517-evm.dts |
17 | +++ b/arch/arm/boot/dts/am3517-evm.dts |
18 | @@ -227,7 +227,7 @@ |
19 | vmmc-supply = <&vmmc_fixed>; |
20 | bus-width = <4>; |
21 | wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */ |
22 | - cd-gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>; /* gpio_127 */ |
23 | + cd-gpios = <&gpio4 31 GPIO_ACTIVE_LOW>; /* gpio_127 */ |
24 | }; |
25 | |
26 | &mmc3 { |
27 | diff --git a/arch/arm/boot/dts/am3517-som.dtsi b/arch/arm/boot/dts/am3517-som.dtsi |
28 | index dae6e458e59f..b1c988eed87c 100644 |
29 | --- a/arch/arm/boot/dts/am3517-som.dtsi |
30 | +++ b/arch/arm/boot/dts/am3517-som.dtsi |
31 | @@ -163,7 +163,7 @@ |
32 | compatible = "ti,wl1271"; |
33 | reg = <2>; |
34 | interrupt-parent = <&gpio6>; |
35 | - interrupts = <10 IRQ_TYPE_LEVEL_HIGH>; /* gpio_170 */ |
36 | + interrupts = <10 IRQ_TYPE_EDGE_RISING>; /* gpio_170 */ |
37 | ref-clock-frequency = <26000000>; |
38 | tcxo-clock-frequency = <26000000>; |
39 | }; |
40 | diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi |
41 | index ac343330d0c8..98b682a8080c 100644 |
42 | --- a/arch/arm/boot/dts/logicpd-som-lv.dtsi |
43 | +++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi |
44 | @@ -129,7 +129,7 @@ |
45 | }; |
46 | |
47 | &mmc3 { |
48 | - interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>; |
49 | + interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>; |
50 | pinctrl-0 = <&mmc3_pins &wl127x_gpio>; |
51 | pinctrl-names = "default"; |
52 | vmmc-supply = <&wl12xx_vmmc>; |
53 | diff --git a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts |
54 | index 9d5d53fbe9c0..c39cf2ca54da 100644 |
55 | --- a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts |
56 | +++ b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts |
57 | @@ -35,7 +35,7 @@ |
58 | * jumpering combinations for the long run. |
59 | */ |
60 | &mmc3 { |
61 | - interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>; |
62 | + interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>; |
63 | pinctrl-0 = <&mmc3_pins &mmc3_core2_pins>; |
64 | pinctrl-names = "default"; |
65 | vmmc-supply = <&wl12xx_vmmc>; |
66 | diff --git a/arch/arm/boot/dts/sama5d2.dtsi b/arch/arm/boot/dts/sama5d2.dtsi |
67 | index 61f68e5c48e9..b405992eb601 100644 |
68 | --- a/arch/arm/boot/dts/sama5d2.dtsi |
69 | +++ b/arch/arm/boot/dts/sama5d2.dtsi |
70 | @@ -308,7 +308,7 @@ |
71 | 0x1 0x0 0x60000000 0x10000000 |
72 | 0x2 0x0 0x70000000 0x10000000 |
73 | 0x3 0x0 0x80000000 0x10000000>; |
74 | - clocks = <&mck>; |
75 | + clocks = <&h32ck>; |
76 | status = "disabled"; |
77 | |
78 | nand_controller: nand-controller { |
79 | diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c |
80 | index dd28d2614d7f..d10d8831f527 100644 |
81 | --- a/arch/arm/mach-omap1/board-ams-delta.c |
82 | +++ b/arch/arm/mach-omap1/board-ams-delta.c |
83 | @@ -726,6 +726,9 @@ static void modem_pm(struct uart_port *port, unsigned int state, unsigned old) |
84 | struct modem_private_data *priv = port->private_data; |
85 | int ret; |
86 | |
87 | + if (!priv) |
88 | + return; |
89 | + |
90 | if (IS_ERR(priv->regulator)) |
91 | return; |
92 | |
93 | diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c |
94 | index 7b95729e8359..38a1be6c3694 100644 |
95 | --- a/arch/arm/mach-omap2/prm44xx.c |
96 | +++ b/arch/arm/mach-omap2/prm44xx.c |
97 | @@ -351,7 +351,7 @@ static void omap44xx_prm_reconfigure_io_chain(void) |
98 | * to occur, WAKEUPENABLE bits must be set in the pad mux registers, and |
99 | * omap44xx_prm_reconfigure_io_chain() must be called. No return value. |
100 | */ |
101 | -static void __init omap44xx_prm_enable_io_wakeup(void) |
102 | +static void omap44xx_prm_enable_io_wakeup(void) |
103 | { |
104 | s32 inst = omap4_prmst_get_prm_dev_inst(); |
105 | |
106 | diff --git a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts |
107 | index 6d651f314193..6921f8dc5ebb 100644 |
108 | --- a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts |
109 | +++ b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts |
110 | @@ -31,6 +31,10 @@ |
111 | status = "okay"; |
112 | }; |
113 | |
114 | +&tlmm { |
115 | + gpio-reserved-ranges = <0 4>, <81 4>; |
116 | +}; |
117 | + |
118 | &uart9 { |
119 | status = "okay"; |
120 | }; |
121 | diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c |
122 | index 74091fd3101e..d5523adeddbf 100644 |
123 | --- a/arch/s390/kernel/perf_cpum_cf.c |
124 | +++ b/arch/s390/kernel/perf_cpum_cf.c |
125 | @@ -346,6 +346,8 @@ static int __hw_perf_event_init(struct perf_event *event) |
126 | break; |
127 | |
128 | case PERF_TYPE_HARDWARE: |
129 | + if (is_sampling_event(event)) /* No sampling support */ |
130 | + return -ENOENT; |
131 | ev = attr->config; |
132 | /* Count user space (problem-state) only */ |
133 | if (!attr->exclude_user && attr->exclude_kernel) { |
134 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
135 | index 2216d21e955d..3692de84c420 100644 |
136 | --- a/arch/x86/kvm/lapic.c |
137 | +++ b/arch/x86/kvm/lapic.c |
138 | @@ -55,7 +55,7 @@ |
139 | #define PRIo64 "o" |
140 | |
141 | /* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */ |
142 | -#define apic_debug(fmt, arg...) |
143 | +#define apic_debug(fmt, arg...) do {} while (0) |
144 | |
145 | /* 14 is the version for Xeon and Pentium 8.4.8*/ |
146 | #define APIC_VERSION (0x14UL | ((KVM_APIC_LVT_NUM - 1) << 16)) |
147 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
148 | index e55f7a90d4b2..c97a9d60d305 100644 |
149 | --- a/arch/x86/kvm/vmx.c |
150 | +++ b/arch/x86/kvm/vmx.c |
151 | @@ -962,6 +962,7 @@ struct vcpu_vmx { |
152 | struct shared_msr_entry *guest_msrs; |
153 | int nmsrs; |
154 | int save_nmsrs; |
155 | + bool guest_msrs_dirty; |
156 | unsigned long host_idt_base; |
157 | #ifdef CONFIG_X86_64 |
158 | u64 msr_host_kernel_gs_base; |
159 | @@ -1284,7 +1285,7 @@ static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked); |
160 | static bool nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12, |
161 | u16 error_code); |
162 | static void vmx_update_msr_bitmap(struct kvm_vcpu *vcpu); |
163 | -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
164 | +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
165 | u32 msr, int type); |
166 | |
167 | static DEFINE_PER_CPU(struct vmcs *, vmxarea); |
168 | @@ -2874,6 +2875,20 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu) |
169 | |
170 | vmx->req_immediate_exit = false; |
171 | |
172 | + /* |
173 | + * Note that guest MSRs to be saved/restored can also be changed |
174 | + * when guest state is loaded. This happens when guest transitions |
175 | + * to/from long-mode by setting MSR_EFER.LMA. |
176 | + */ |
177 | + if (!vmx->loaded_cpu_state || vmx->guest_msrs_dirty) { |
178 | + vmx->guest_msrs_dirty = false; |
179 | + for (i = 0; i < vmx->save_nmsrs; ++i) |
180 | + kvm_set_shared_msr(vmx->guest_msrs[i].index, |
181 | + vmx->guest_msrs[i].data, |
182 | + vmx->guest_msrs[i].mask); |
183 | + |
184 | + } |
185 | + |
186 | if (vmx->loaded_cpu_state) |
187 | return; |
188 | |
189 | @@ -2934,11 +2949,6 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu) |
190 | vmcs_writel(HOST_GS_BASE, gs_base); |
191 | host_state->gs_base = gs_base; |
192 | } |
193 | - |
194 | - for (i = 0; i < vmx->save_nmsrs; ++i) |
195 | - kvm_set_shared_msr(vmx->guest_msrs[i].index, |
196 | - vmx->guest_msrs[i].data, |
197 | - vmx->guest_msrs[i].mask); |
198 | } |
199 | |
200 | static void vmx_prepare_switch_to_host(struct vcpu_vmx *vmx) |
201 | @@ -3418,6 +3428,7 @@ static void setup_msrs(struct vcpu_vmx *vmx) |
202 | move_msr_up(vmx, index, save_nmsrs++); |
203 | |
204 | vmx->save_nmsrs = save_nmsrs; |
205 | + vmx->guest_msrs_dirty = true; |
206 | |
207 | if (cpu_has_vmx_msr_bitmap()) |
208 | vmx_update_msr_bitmap(&vmx->vcpu); |
209 | @@ -5924,7 +5935,7 @@ static void free_vpid(int vpid) |
210 | spin_unlock(&vmx_vpid_lock); |
211 | } |
212 | |
213 | -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
214 | +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, |
215 | u32 msr, int type) |
216 | { |
217 | int f = sizeof(unsigned long); |
218 | @@ -5962,7 +5973,7 @@ static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bit |
219 | } |
220 | } |
221 | |
222 | -static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitmap, |
223 | +static __always_inline void vmx_enable_intercept_for_msr(unsigned long *msr_bitmap, |
224 | u32 msr, int type) |
225 | { |
226 | int f = sizeof(unsigned long); |
227 | @@ -6000,7 +6011,7 @@ static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitm |
228 | } |
229 | } |
230 | |
231 | -static void __always_inline vmx_set_intercept_for_msr(unsigned long *msr_bitmap, |
232 | +static __always_inline void vmx_set_intercept_for_msr(unsigned long *msr_bitmap, |
233 | u32 msr, int type, bool value) |
234 | { |
235 | if (value) |
236 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c |
237 | index 2eeddd814653..c6c7c9b7b5c1 100644 |
238 | --- a/arch/x86/xen/enlighten.c |
239 | +++ b/arch/x86/xen/enlighten.c |
240 | @@ -7,7 +7,6 @@ |
241 | |
242 | #include <xen/features.h> |
243 | #include <xen/page.h> |
244 | -#include <xen/interface/memory.h> |
245 | |
246 | #include <asm/xen/hypercall.h> |
247 | #include <asm/xen/hypervisor.h> |
248 | @@ -343,80 +342,3 @@ void xen_arch_unregister_cpu(int num) |
249 | } |
250 | EXPORT_SYMBOL(xen_arch_unregister_cpu); |
251 | #endif |
252 | - |
253 | -#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG |
254 | -void __init arch_xen_balloon_init(struct resource *hostmem_resource) |
255 | -{ |
256 | - struct xen_memory_map memmap; |
257 | - int rc; |
258 | - unsigned int i, last_guest_ram; |
259 | - phys_addr_t max_addr = PFN_PHYS(max_pfn); |
260 | - struct e820_table *xen_e820_table; |
261 | - const struct e820_entry *entry; |
262 | - struct resource *res; |
263 | - |
264 | - if (!xen_initial_domain()) |
265 | - return; |
266 | - |
267 | - xen_e820_table = kmalloc(sizeof(*xen_e820_table), GFP_KERNEL); |
268 | - if (!xen_e820_table) |
269 | - return; |
270 | - |
271 | - memmap.nr_entries = ARRAY_SIZE(xen_e820_table->entries); |
272 | - set_xen_guest_handle(memmap.buffer, xen_e820_table->entries); |
273 | - rc = HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap); |
274 | - if (rc) { |
275 | - pr_warn("%s: Can't read host e820 (%d)\n", __func__, rc); |
276 | - goto out; |
277 | - } |
278 | - |
279 | - last_guest_ram = 0; |
280 | - for (i = 0; i < memmap.nr_entries; i++) { |
281 | - if (xen_e820_table->entries[i].addr >= max_addr) |
282 | - break; |
283 | - if (xen_e820_table->entries[i].type == E820_TYPE_RAM) |
284 | - last_guest_ram = i; |
285 | - } |
286 | - |
287 | - entry = &xen_e820_table->entries[last_guest_ram]; |
288 | - if (max_addr >= entry->addr + entry->size) |
289 | - goto out; /* No unallocated host RAM. */ |
290 | - |
291 | - hostmem_resource->start = max_addr; |
292 | - hostmem_resource->end = entry->addr + entry->size; |
293 | - |
294 | - /* |
295 | - * Mark non-RAM regions between the end of dom0 RAM and end of host RAM |
296 | - * as unavailable. The rest of that region can be used for hotplug-based |
297 | - * ballooning. |
298 | - */ |
299 | - for (; i < memmap.nr_entries; i++) { |
300 | - entry = &xen_e820_table->entries[i]; |
301 | - |
302 | - if (entry->type == E820_TYPE_RAM) |
303 | - continue; |
304 | - |
305 | - if (entry->addr >= hostmem_resource->end) |
306 | - break; |
307 | - |
308 | - res = kzalloc(sizeof(*res), GFP_KERNEL); |
309 | - if (!res) |
310 | - goto out; |
311 | - |
312 | - res->name = "Unavailable host RAM"; |
313 | - res->start = entry->addr; |
314 | - res->end = (entry->addr + entry->size < hostmem_resource->end) ? |
315 | - entry->addr + entry->size : hostmem_resource->end; |
316 | - rc = insert_resource(hostmem_resource, res); |
317 | - if (rc) { |
318 | - pr_warn("%s: Can't insert [%llx - %llx) (%d)\n", |
319 | - __func__, res->start, res->end, rc); |
320 | - kfree(res); |
321 | - goto out; |
322 | - } |
323 | - } |
324 | - |
325 | - out: |
326 | - kfree(xen_e820_table); |
327 | -} |
328 | -#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */ |
329 | diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c |
330 | index 1163e33121fb..075ed47993bb 100644 |
331 | --- a/arch/x86/xen/setup.c |
332 | +++ b/arch/x86/xen/setup.c |
333 | @@ -808,6 +808,7 @@ char * __init xen_memory_setup(void) |
334 | addr = xen_e820_table.entries[0].addr; |
335 | size = xen_e820_table.entries[0].size; |
336 | while (i < xen_e820_table.nr_entries) { |
337 | + bool discard = false; |
338 | |
339 | chunk_size = size; |
340 | type = xen_e820_table.entries[i].type; |
341 | @@ -823,10 +824,11 @@ char * __init xen_memory_setup(void) |
342 | xen_add_extra_mem(pfn_s, n_pfns); |
343 | xen_max_p2m_pfn = pfn_s + n_pfns; |
344 | } else |
345 | - type = E820_TYPE_UNUSABLE; |
346 | + discard = true; |
347 | } |
348 | |
349 | - xen_align_and_add_e820_region(addr, chunk_size, type); |
350 | + if (!discard) |
351 | + xen_align_and_add_e820_region(addr, chunk_size, type); |
352 | |
353 | addr += chunk_size; |
354 | size -= chunk_size; |
355 | diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c |
356 | index 08f26db2da7e..e938576e58cb 100644 |
357 | --- a/drivers/acpi/arm64/iort.c |
358 | +++ b/drivers/acpi/arm64/iort.c |
359 | @@ -700,7 +700,7 @@ static void iort_set_device_domain(struct device *dev, |
360 | */ |
361 | static struct irq_domain *iort_get_platform_device_domain(struct device *dev) |
362 | { |
363 | - struct acpi_iort_node *node, *msi_parent; |
364 | + struct acpi_iort_node *node, *msi_parent = NULL; |
365 | struct fwnode_handle *iort_fwnode; |
366 | struct acpi_iort_its_group *its; |
367 | int i; |
368 | diff --git a/drivers/fsi/Kconfig b/drivers/fsi/Kconfig |
369 | index af3a20dd5aa4..99c99a5d57fe 100644 |
370 | --- a/drivers/fsi/Kconfig |
371 | +++ b/drivers/fsi/Kconfig |
372 | @@ -46,6 +46,7 @@ config FSI_MASTER_AST_CF |
373 | tristate "FSI master based on Aspeed ColdFire coprocessor" |
374 | depends on GPIOLIB |
375 | depends on GPIO_ASPEED |
376 | + select GENERIC_ALLOCATOR |
377 | ---help--- |
378 | This option enables a FSI master using the AST2400 and AST2500 GPIO |
379 | lines driven by the internal ColdFire coprocessor. This requires |
380 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
381 | index ef00d14f8645..325e2213cac5 100644 |
382 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
383 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
384 | @@ -2243,12 +2243,13 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev) |
385 | #endif |
386 | |
387 | WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); |
388 | + udelay(50); |
389 | |
390 | /* carrizo do enable cp interrupt after cp inited */ |
391 | - if (!(adev->flags & AMD_IS_APU)) |
392 | + if (!(adev->flags & AMD_IS_APU)) { |
393 | gfx_v9_0_enable_gui_idle_interrupt(adev, true); |
394 | - |
395 | - udelay(50); |
396 | + udelay(50); |
397 | + } |
398 | |
399 | #ifdef AMDGPU_RLC_DEBUG_RETRY |
400 | /* RLC_GPM_GENERAL_6 : RLC Ucode version */ |
401 | diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c |
402 | index 7c6ac3cadb6b..8bb355d5d43d 100644 |
403 | --- a/drivers/gpu/drm/ast/ast_mode.c |
404 | +++ b/drivers/gpu/drm/ast/ast_mode.c |
405 | @@ -973,9 +973,21 @@ static int get_clock(void *i2c_priv) |
406 | { |
407 | struct ast_i2c_chan *i2c = i2c_priv; |
408 | struct ast_private *ast = i2c->dev->dev_private; |
409 | - uint32_t val; |
410 | + uint32_t val, val2, count, pass; |
411 | + |
412 | + count = 0; |
413 | + pass = 0; |
414 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
415 | + do { |
416 | + val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
417 | + if (val == val2) { |
418 | + pass++; |
419 | + } else { |
420 | + pass = 0; |
421 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; |
422 | + } |
423 | + } while ((pass < 5) && (count++ < 0x10000)); |
424 | |
425 | - val = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4; |
426 | return val & 1 ? 1 : 0; |
427 | } |
428 | |
429 | @@ -983,9 +995,21 @@ static int get_data(void *i2c_priv) |
430 | { |
431 | struct ast_i2c_chan *i2c = i2c_priv; |
432 | struct ast_private *ast = i2c->dev->dev_private; |
433 | - uint32_t val; |
434 | + uint32_t val, val2, count, pass; |
435 | + |
436 | + count = 0; |
437 | + pass = 0; |
438 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
439 | + do { |
440 | + val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
441 | + if (val == val2) { |
442 | + pass++; |
443 | + } else { |
444 | + pass = 0; |
445 | + val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; |
446 | + } |
447 | + } while ((pass < 5) && (count++ < 0x10000)); |
448 | |
449 | - val = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5; |
450 | return val & 1 ? 1 : 0; |
451 | } |
452 | |
453 | @@ -998,7 +1022,7 @@ static void set_clock(void *i2c_priv, int clock) |
454 | |
455 | for (i = 0; i < 0x10000; i++) { |
456 | ujcrb7 = ((clock & 0x01) ? 0 : 1); |
457 | - ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xfe, ujcrb7); |
458 | + ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf4, ujcrb7); |
459 | jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x01); |
460 | if (ujcrb7 == jtemp) |
461 | break; |
462 | @@ -1014,7 +1038,7 @@ static void set_data(void *i2c_priv, int data) |
463 | |
464 | for (i = 0; i < 0x10000; i++) { |
465 | ujcrb7 = ((data & 0x01) ? 0 : 1) << 2; |
466 | - ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xfb, ujcrb7); |
467 | + ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf1, ujcrb7); |
468 | jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x04); |
469 | if (ujcrb7 == jtemp) |
470 | break; |
471 | diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c |
472 | index 14aac661f38b..7a3a6ed9f27b 100644 |
473 | --- a/drivers/gpu/drm/meson/meson_venc.c |
474 | +++ b/drivers/gpu/drm/meson/meson_venc.c |
475 | @@ -715,6 +715,7 @@ struct meson_hdmi_venc_vic_mode { |
476 | { 5, &meson_hdmi_encp_mode_1080i60 }, |
477 | { 20, &meson_hdmi_encp_mode_1080i50 }, |
478 | { 32, &meson_hdmi_encp_mode_1080p24 }, |
479 | + { 33, &meson_hdmi_encp_mode_1080p50 }, |
480 | { 34, &meson_hdmi_encp_mode_1080p30 }, |
481 | { 31, &meson_hdmi_encp_mode_1080p50 }, |
482 | { 16, &meson_hdmi_encp_mode_1080p60 }, |
483 | diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c |
484 | index 71d3445ba869..07ee19573b3f 100644 |
485 | --- a/drivers/hwmon/ina2xx.c |
486 | +++ b/drivers/hwmon/ina2xx.c |
487 | @@ -274,7 +274,7 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, |
488 | break; |
489 | case INA2XX_CURRENT: |
490 | /* signed register, result in mA */ |
491 | - val = regval * data->current_lsb_uA; |
492 | + val = (s16)regval * data->current_lsb_uA; |
493 | val = DIV_ROUND_CLOSEST(val, 1000); |
494 | break; |
495 | case INA2XX_CALIBRATION: |
496 | @@ -491,7 +491,7 @@ static int ina2xx_probe(struct i2c_client *client, |
497 | } |
498 | |
499 | data->groups[group++] = &ina2xx_group; |
500 | - if (id->driver_data == ina226) |
501 | + if (chip == ina226) |
502 | data->groups[group++] = &ina226_group; |
503 | |
504 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
505 | @@ -500,7 +500,7 @@ static int ina2xx_probe(struct i2c_client *client, |
506 | return PTR_ERR(hwmon_dev); |
507 | |
508 | dev_info(dev, "power monitor %s (Rshunt = %li uOhm)\n", |
509 | - id->name, data->rshunt); |
510 | + client->name, data->rshunt); |
511 | |
512 | return 0; |
513 | } |
514 | diff --git a/drivers/hwmon/mlxreg-fan.c b/drivers/hwmon/mlxreg-fan.c |
515 | index de46577c7d5a..d8fa4bea4bc8 100644 |
516 | --- a/drivers/hwmon/mlxreg-fan.c |
517 | +++ b/drivers/hwmon/mlxreg-fan.c |
518 | @@ -51,7 +51,7 @@ |
519 | */ |
520 | #define MLXREG_FAN_GET_RPM(rval, d, s) (DIV_ROUND_CLOSEST(15000000 * 100, \ |
521 | ((rval) + (s)) * (d))) |
522 | -#define MLXREG_FAN_GET_FAULT(val, mask) (!!((val) ^ (mask))) |
523 | +#define MLXREG_FAN_GET_FAULT(val, mask) (!((val) ^ (mask))) |
524 | #define MLXREG_FAN_PWM_DUTY2STATE(duty) (DIV_ROUND_CLOSEST((duty) * \ |
525 | MLXREG_FAN_MAX_STATE, \ |
526 | MLXREG_FAN_MAX_DUTY)) |
527 | diff --git a/drivers/hwmon/raspberrypi-hwmon.c b/drivers/hwmon/raspberrypi-hwmon.c |
528 | index be5ba4690895..0d0457245e7d 100644 |
529 | --- a/drivers/hwmon/raspberrypi-hwmon.c |
530 | +++ b/drivers/hwmon/raspberrypi-hwmon.c |
531 | @@ -115,7 +115,6 @@ static int rpi_hwmon_probe(struct platform_device *pdev) |
532 | { |
533 | struct device *dev = &pdev->dev; |
534 | struct rpi_hwmon_data *data; |
535 | - int ret; |
536 | |
537 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
538 | if (!data) |
539 | @@ -124,11 +123,6 @@ static int rpi_hwmon_probe(struct platform_device *pdev) |
540 | /* Parent driver assure that firmware is correct */ |
541 | data->fw = dev_get_drvdata(dev->parent); |
542 | |
543 | - /* Init throttled */ |
544 | - ret = rpi_firmware_property(data->fw, RPI_FIRMWARE_GET_THROTTLED, |
545 | - &data->last_throttled, |
546 | - sizeof(data->last_throttled)); |
547 | - |
548 | data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "rpi_volt", |
549 | data, |
550 | &rpi_chip_info, |
551 | diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c |
552 | index 49276bbdac3d..1bb80f992aa8 100644 |
553 | --- a/drivers/hwmon/w83795.c |
554 | +++ b/drivers/hwmon/w83795.c |
555 | @@ -1691,7 +1691,7 @@ store_sf_setup(struct device *dev, struct device_attribute *attr, |
556 | * somewhere else in the code |
557 | */ |
558 | #define SENSOR_ATTR_TEMP(index) { \ |
559 | - SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 4 ? S_IWUSR : 0), \ |
560 | + SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 5 ? S_IWUSR : 0), \ |
561 | show_temp_mode, store_temp_mode, NOT_USED, index - 1), \ |
562 | SENSOR_ATTR_2(temp##index##_input, S_IRUGO, show_temp, \ |
563 | NULL, TEMP_READ, index - 1), \ |
564 | diff --git a/drivers/infiniband/core/roce_gid_mgmt.c b/drivers/infiniband/core/roce_gid_mgmt.c |
565 | index ee366199b169..25d43c8f1c2a 100644 |
566 | --- a/drivers/infiniband/core/roce_gid_mgmt.c |
567 | +++ b/drivers/infiniband/core/roce_gid_mgmt.c |
568 | @@ -767,8 +767,10 @@ static int netdevice_event(struct notifier_block *this, unsigned long event, |
569 | |
570 | case NETDEV_CHANGEADDR: |
571 | cmds[0] = netdev_del_cmd; |
572 | - cmds[1] = add_default_gid_cmd; |
573 | - cmds[2] = add_cmd; |
574 | + if (ndev->reg_state == NETREG_REGISTERED) { |
575 | + cmds[1] = add_default_gid_cmd; |
576 | + cmds[2] = add_cmd; |
577 | + } |
578 | break; |
579 | |
580 | case NETDEV_CHANGEUPPER: |
581 | diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c |
582 | index 85cd1a3593d6..22bd9784fa2e 100644 |
583 | --- a/drivers/infiniband/hw/bnxt_re/main.c |
584 | +++ b/drivers/infiniband/hw/bnxt_re/main.c |
585 | @@ -1252,6 +1252,7 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev) |
586 | /* Registered a new RoCE device instance to netdev */ |
587 | rc = bnxt_re_register_netdev(rdev); |
588 | if (rc) { |
589 | + rtnl_unlock(); |
590 | pr_err("Failed to register with netedev: %#x\n", rc); |
591 | return -EINVAL; |
592 | } |
593 | @@ -1461,6 +1462,7 @@ static void bnxt_re_task(struct work_struct *work) |
594 | "Failed to register with IB: %#x", rc); |
595 | bnxt_re_remove_one(rdev); |
596 | bnxt_re_dev_unreg(rdev); |
597 | + goto exit; |
598 | } |
599 | break; |
600 | case NETDEV_UP: |
601 | @@ -1484,6 +1486,7 @@ static void bnxt_re_task(struct work_struct *work) |
602 | } |
603 | smp_mb__before_atomic(); |
604 | atomic_dec(&rdev->sched_count); |
605 | +exit: |
606 | kfree(re_work); |
607 | } |
608 | |
609 | diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c |
610 | index e1668bcc2d13..902d12d6d88b 100644 |
611 | --- a/drivers/infiniband/hw/hfi1/chip.c |
612 | +++ b/drivers/infiniband/hw/hfi1/chip.c |
613 | @@ -12485,7 +12485,8 @@ static int init_cntrs(struct hfi1_devdata *dd) |
614 | } |
615 | |
616 | /* allocate space for the counter values */ |
617 | - dd->cntrs = kcalloc(dd->ndevcntrs, sizeof(u64), GFP_KERNEL); |
618 | + dd->cntrs = kcalloc(dd->ndevcntrs + num_driver_cntrs, sizeof(u64), |
619 | + GFP_KERNEL); |
620 | if (!dd->cntrs) |
621 | goto bail; |
622 | |
623 | diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h |
624 | index d9470317983f..cfd252386356 100644 |
625 | --- a/drivers/infiniband/hw/hfi1/hfi.h |
626 | +++ b/drivers/infiniband/hw/hfi1/hfi.h |
627 | @@ -154,6 +154,8 @@ struct hfi1_ib_stats { |
628 | extern struct hfi1_ib_stats hfi1_stats; |
629 | extern const struct pci_error_handlers hfi1_pci_err_handler; |
630 | |
631 | +extern int num_driver_cntrs; |
632 | + |
633 | /* |
634 | * First-cut criterion for "device is active" is |
635 | * two thousand dwords combined Tx, Rx traffic per |
636 | diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c |
637 | index a7c586a5589d..3dfb4cf2f8c9 100644 |
638 | --- a/drivers/infiniband/hw/hfi1/verbs.c |
639 | +++ b/drivers/infiniband/hw/hfi1/verbs.c |
640 | @@ -1701,7 +1701,7 @@ static const char * const driver_cntr_names[] = { |
641 | static DEFINE_MUTEX(cntr_names_lock); /* protects the *_cntr_names bufers */ |
642 | static const char **dev_cntr_names; |
643 | static const char **port_cntr_names; |
644 | -static int num_driver_cntrs = ARRAY_SIZE(driver_cntr_names); |
645 | +int num_driver_cntrs = ARRAY_SIZE(driver_cntr_names); |
646 | static int num_dev_cntrs; |
647 | static int num_port_cntrs; |
648 | static int cntr_names_initialized; |
649 | diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
650 | index 0218c0f8c2a7..a442b29e7611 100644 |
651 | --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
652 | +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c |
653 | @@ -1661,10 +1661,9 @@ static int hns_roce_v2_set_mac(struct hns_roce_dev *hr_dev, u8 phy_port, |
654 | return hns_roce_cmq_send(hr_dev, &desc, 1); |
655 | } |
656 | |
657 | -static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
658 | - unsigned long mtpt_idx) |
659 | +static int set_mtpt_pbl(struct hns_roce_v2_mpt_entry *mpt_entry, |
660 | + struct hns_roce_mr *mr) |
661 | { |
662 | - struct hns_roce_v2_mpt_entry *mpt_entry; |
663 | struct scatterlist *sg; |
664 | u64 page_addr; |
665 | u64 *pages; |
666 | @@ -1672,6 +1671,53 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
667 | int len; |
668 | int entry; |
669 | |
670 | + mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size); |
671 | + mpt_entry->pbl_ba_l = cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3)); |
672 | + roce_set_field(mpt_entry->byte_48_mode_ba, |
673 | + V2_MPT_BYTE_48_PBL_BA_H_M, V2_MPT_BYTE_48_PBL_BA_H_S, |
674 | + upper_32_bits(mr->pbl_ba >> 3)); |
675 | + |
676 | + pages = (u64 *)__get_free_page(GFP_KERNEL); |
677 | + if (!pages) |
678 | + return -ENOMEM; |
679 | + |
680 | + i = 0; |
681 | + for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) { |
682 | + len = sg_dma_len(sg) >> PAGE_SHIFT; |
683 | + for (j = 0; j < len; ++j) { |
684 | + page_addr = sg_dma_address(sg) + |
685 | + (j << mr->umem->page_shift); |
686 | + pages[i] = page_addr >> 6; |
687 | + /* Record the first 2 entry directly to MTPT table */ |
688 | + if (i >= HNS_ROCE_V2_MAX_INNER_MTPT_NUM - 1) |
689 | + goto found; |
690 | + i++; |
691 | + } |
692 | + } |
693 | +found: |
694 | + mpt_entry->pa0_l = cpu_to_le32(lower_32_bits(pages[0])); |
695 | + roce_set_field(mpt_entry->byte_56_pa0_h, V2_MPT_BYTE_56_PA0_H_M, |
696 | + V2_MPT_BYTE_56_PA0_H_S, upper_32_bits(pages[0])); |
697 | + |
698 | + mpt_entry->pa1_l = cpu_to_le32(lower_32_bits(pages[1])); |
699 | + roce_set_field(mpt_entry->byte_64_buf_pa1, V2_MPT_BYTE_64_PA1_H_M, |
700 | + V2_MPT_BYTE_64_PA1_H_S, upper_32_bits(pages[1])); |
701 | + roce_set_field(mpt_entry->byte_64_buf_pa1, |
702 | + V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M, |
703 | + V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S, |
704 | + mr->pbl_buf_pg_sz + PG_SHIFT_OFFSET); |
705 | + |
706 | + free_page((unsigned long)pages); |
707 | + |
708 | + return 0; |
709 | +} |
710 | + |
711 | +static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
712 | + unsigned long mtpt_idx) |
713 | +{ |
714 | + struct hns_roce_v2_mpt_entry *mpt_entry; |
715 | + int ret; |
716 | + |
717 | mpt_entry = mb_buf; |
718 | memset(mpt_entry, 0, sizeof(*mpt_entry)); |
719 | |
720 | @@ -1686,7 +1732,6 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
721 | mr->pbl_ba_pg_sz + PG_SHIFT_OFFSET); |
722 | roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M, |
723 | V2_MPT_BYTE_4_PD_S, mr->pd); |
724 | - mpt_entry->byte_4_pd_hop_st = cpu_to_le32(mpt_entry->byte_4_pd_hop_st); |
725 | |
726 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RA_EN_S, 0); |
727 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 1); |
728 | @@ -1700,13 +1745,11 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
729 | (mr->access & IB_ACCESS_REMOTE_WRITE ? 1 : 0)); |
730 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S, |
731 | (mr->access & IB_ACCESS_LOCAL_WRITE ? 1 : 0)); |
732 | - mpt_entry->byte_8_mw_cnt_en = cpu_to_le32(mpt_entry->byte_8_mw_cnt_en); |
733 | |
734 | roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S, |
735 | mr->type == MR_TYPE_MR ? 0 : 1); |
736 | roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_INNER_PA_VLD_S, |
737 | 1); |
738 | - mpt_entry->byte_12_mw_pa = cpu_to_le32(mpt_entry->byte_12_mw_pa); |
739 | |
740 | mpt_entry->len_l = cpu_to_le32(lower_32_bits(mr->size)); |
741 | mpt_entry->len_h = cpu_to_le32(upper_32_bits(mr->size)); |
742 | @@ -1717,53 +1760,9 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, |
743 | if (mr->type == MR_TYPE_DMA) |
744 | return 0; |
745 | |
746 | - mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size); |
747 | - |
748 | - mpt_entry->pbl_ba_l = cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3)); |
749 | - roce_set_field(mpt_entry->byte_48_mode_ba, V2_MPT_BYTE_48_PBL_BA_H_M, |
750 | - V2_MPT_BYTE_48_PBL_BA_H_S, |
751 | - upper_32_bits(mr->pbl_ba >> 3)); |
752 | - mpt_entry->byte_48_mode_ba = cpu_to_le32(mpt_entry->byte_48_mode_ba); |
753 | - |
754 | - pages = (u64 *)__get_free_page(GFP_KERNEL); |
755 | - if (!pages) |
756 | - return -ENOMEM; |
757 | - |
758 | - i = 0; |
759 | - for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) { |
760 | - len = sg_dma_len(sg) >> PAGE_SHIFT; |
761 | - for (j = 0; j < len; ++j) { |
762 | - page_addr = sg_dma_address(sg) + |
763 | - (j << mr->umem->page_shift); |
764 | - pages[i] = page_addr >> 6; |
765 | - |
766 | - /* Record the first 2 entry directly to MTPT table */ |
767 | - if (i >= HNS_ROCE_V2_MAX_INNER_MTPT_NUM - 1) |
768 | - goto found; |
769 | - i++; |
770 | - } |
771 | - } |
772 | + ret = set_mtpt_pbl(mpt_entry, mr); |
773 | |
774 | -found: |
775 | - mpt_entry->pa0_l = cpu_to_le32(lower_32_bits(pages[0])); |
776 | - roce_set_field(mpt_entry->byte_56_pa0_h, V2_MPT_BYTE_56_PA0_H_M, |
777 | - V2_MPT_BYTE_56_PA0_H_S, |
778 | - upper_32_bits(pages[0])); |
779 | - mpt_entry->byte_56_pa0_h = cpu_to_le32(mpt_entry->byte_56_pa0_h); |
780 | - |
781 | - mpt_entry->pa1_l = cpu_to_le32(lower_32_bits(pages[1])); |
782 | - roce_set_field(mpt_entry->byte_64_buf_pa1, V2_MPT_BYTE_64_PA1_H_M, |
783 | - V2_MPT_BYTE_64_PA1_H_S, upper_32_bits(pages[1])); |
784 | - |
785 | - free_page((unsigned long)pages); |
786 | - |
787 | - roce_set_field(mpt_entry->byte_64_buf_pa1, |
788 | - V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M, |
789 | - V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S, |
790 | - mr->pbl_buf_pg_sz + PG_SHIFT_OFFSET); |
791 | - mpt_entry->byte_64_buf_pa1 = cpu_to_le32(mpt_entry->byte_64_buf_pa1); |
792 | - |
793 | - return 0; |
794 | + return ret; |
795 | } |
796 | |
797 | static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, |
798 | @@ -1772,6 +1771,7 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, |
799 | u64 size, void *mb_buf) |
800 | { |
801 | struct hns_roce_v2_mpt_entry *mpt_entry = mb_buf; |
802 | + int ret = 0; |
803 | |
804 | if (flags & IB_MR_REREG_PD) { |
805 | roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M, |
806 | @@ -1784,14 +1784,14 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, |
807 | V2_MPT_BYTE_8_BIND_EN_S, |
808 | (mr_access_flags & IB_ACCESS_MW_BIND ? 1 : 0)); |
809 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, |
810 | - V2_MPT_BYTE_8_ATOMIC_EN_S, |
811 | - (mr_access_flags & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0)); |
812 | + V2_MPT_BYTE_8_ATOMIC_EN_S, |
813 | + mr_access_flags & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0); |
814 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RR_EN_S, |
815 | - (mr_access_flags & IB_ACCESS_REMOTE_READ ? 1 : 0)); |
816 | + mr_access_flags & IB_ACCESS_REMOTE_READ ? 1 : 0); |
817 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RW_EN_S, |
818 | - (mr_access_flags & IB_ACCESS_REMOTE_WRITE ? 1 : 0)); |
819 | + mr_access_flags & IB_ACCESS_REMOTE_WRITE ? 1 : 0); |
820 | roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S, |
821 | - (mr_access_flags & IB_ACCESS_LOCAL_WRITE ? 1 : 0)); |
822 | + mr_access_flags & IB_ACCESS_LOCAL_WRITE ? 1 : 0); |
823 | } |
824 | |
825 | if (flags & IB_MR_REREG_TRANS) { |
826 | @@ -1800,21 +1800,13 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, |
827 | mpt_entry->len_l = cpu_to_le32(lower_32_bits(size)); |
828 | mpt_entry->len_h = cpu_to_le32(upper_32_bits(size)); |
829 | |
830 | - mpt_entry->pbl_size = cpu_to_le32(mr->pbl_size); |
831 | - mpt_entry->pbl_ba_l = |
832 | - cpu_to_le32(lower_32_bits(mr->pbl_ba >> 3)); |
833 | - roce_set_field(mpt_entry->byte_48_mode_ba, |
834 | - V2_MPT_BYTE_48_PBL_BA_H_M, |
835 | - V2_MPT_BYTE_48_PBL_BA_H_S, |
836 | - upper_32_bits(mr->pbl_ba >> 3)); |
837 | - mpt_entry->byte_48_mode_ba = |
838 | - cpu_to_le32(mpt_entry->byte_48_mode_ba); |
839 | - |
840 | mr->iova = iova; |
841 | mr->size = size; |
842 | + |
843 | + ret = set_mtpt_pbl(mpt_entry, mr); |
844 | } |
845 | |
846 | - return 0; |
847 | + return ret; |
848 | } |
849 | |
850 | static void *get_cqe_v2(struct hns_roce_cq *hr_cq, int n) |
851 | diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c |
852 | index d216e0d2921d..9e1cac8cb260 100644 |
853 | --- a/drivers/infiniband/hw/mlx5/odp.c |
854 | +++ b/drivers/infiniband/hw/mlx5/odp.c |
855 | @@ -724,6 +724,7 @@ next_mr: |
856 | head = frame; |
857 | |
858 | bcnt -= frame->bcnt; |
859 | + offset = 0; |
860 | } |
861 | break; |
862 | |
863 | diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c |
864 | index d53d954ac8af..183fe5c8ceb7 100644 |
865 | --- a/drivers/infiniband/hw/mlx5/qp.c |
866 | +++ b/drivers/infiniband/hw/mlx5/qp.c |
867 | @@ -4413,17 +4413,18 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, |
868 | goto out; |
869 | } |
870 | |
871 | - if (wr->opcode == IB_WR_LOCAL_INV || |
872 | - wr->opcode == IB_WR_REG_MR) { |
873 | + if (wr->opcode == IB_WR_REG_MR) { |
874 | fence = dev->umr_fence; |
875 | next_fence = MLX5_FENCE_MODE_INITIATOR_SMALL; |
876 | - } else if (wr->send_flags & IB_SEND_FENCE) { |
877 | - if (qp->next_fence) |
878 | - fence = MLX5_FENCE_MODE_SMALL_AND_FENCE; |
879 | - else |
880 | - fence = MLX5_FENCE_MODE_FENCE; |
881 | - } else { |
882 | - fence = qp->next_fence; |
883 | + } else { |
884 | + if (wr->send_flags & IB_SEND_FENCE) { |
885 | + if (qp->next_fence) |
886 | + fence = MLX5_FENCE_MODE_SMALL_AND_FENCE; |
887 | + else |
888 | + fence = MLX5_FENCE_MODE_FENCE; |
889 | + } else { |
890 | + fence = qp->next_fence; |
891 | + } |
892 | } |
893 | |
894 | switch (ibqp->qp_type) { |
895 | diff --git a/drivers/infiniband/sw/rdmavt/ah.c b/drivers/infiniband/sw/rdmavt/ah.c |
896 | index 89ec0f64abfc..084bb4baebb5 100644 |
897 | --- a/drivers/infiniband/sw/rdmavt/ah.c |
898 | +++ b/drivers/infiniband/sw/rdmavt/ah.c |
899 | @@ -91,13 +91,15 @@ EXPORT_SYMBOL(rvt_check_ah); |
900 | * rvt_create_ah - create an address handle |
901 | * @pd: the protection domain |
902 | * @ah_attr: the attributes of the AH |
903 | + * @udata: pointer to user's input output buffer information. |
904 | * |
905 | * This may be called from interrupt context. |
906 | * |
907 | * Return: newly allocated ah |
908 | */ |
909 | struct ib_ah *rvt_create_ah(struct ib_pd *pd, |
910 | - struct rdma_ah_attr *ah_attr) |
911 | + struct rdma_ah_attr *ah_attr, |
912 | + struct ib_udata *udata) |
913 | { |
914 | struct rvt_ah *ah; |
915 | struct rvt_dev_info *dev = ib_to_rvt(pd->device); |
916 | diff --git a/drivers/infiniband/sw/rdmavt/ah.h b/drivers/infiniband/sw/rdmavt/ah.h |
917 | index 16105af99189..25271b48a683 100644 |
918 | --- a/drivers/infiniband/sw/rdmavt/ah.h |
919 | +++ b/drivers/infiniband/sw/rdmavt/ah.h |
920 | @@ -51,7 +51,8 @@ |
921 | #include <rdma/rdma_vt.h> |
922 | |
923 | struct ib_ah *rvt_create_ah(struct ib_pd *pd, |
924 | - struct rdma_ah_attr *ah_attr); |
925 | + struct rdma_ah_attr *ah_attr, |
926 | + struct ib_udata *udata); |
927 | int rvt_destroy_ah(struct ib_ah *ibah); |
928 | int rvt_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr); |
929 | int rvt_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr); |
930 | diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c |
931 | index 55af04fa03a7..6c8dcb65ff03 100644 |
932 | --- a/drivers/net/ethernet/cavium/thunder/nic_main.c |
933 | +++ b/drivers/net/ethernet/cavium/thunder/nic_main.c |
934 | @@ -1441,6 +1441,9 @@ static void nic_remove(struct pci_dev *pdev) |
935 | { |
936 | struct nicpf *nic = pci_get_drvdata(pdev); |
937 | |
938 | + if (!nic) |
939 | + return; |
940 | + |
941 | if (nic->flags & NIC_SRIOV_ENABLED) |
942 | pci_disable_sriov(pdev); |
943 | |
944 | diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c |
945 | index 14374a856d30..6127697ede12 100644 |
946 | --- a/drivers/net/ethernet/hisilicon/hip04_eth.c |
947 | +++ b/drivers/net/ethernet/hisilicon/hip04_eth.c |
948 | @@ -914,10 +914,8 @@ static int hip04_mac_probe(struct platform_device *pdev) |
949 | } |
950 | |
951 | ret = register_netdev(ndev); |
952 | - if (ret) { |
953 | - free_netdev(ndev); |
954 | + if (ret) |
955 | goto alloc_fail; |
956 | - } |
957 | |
958 | return 0; |
959 | |
960 | diff --git a/drivers/net/ethernet/ibm/emac/emac.h b/drivers/net/ethernet/ibm/emac/emac.h |
961 | index e2f80cca9bed..0d2de6f67676 100644 |
962 | --- a/drivers/net/ethernet/ibm/emac/emac.h |
963 | +++ b/drivers/net/ethernet/ibm/emac/emac.h |
964 | @@ -231,7 +231,7 @@ struct emac_regs { |
965 | #define EMAC_STACR_PHYE 0x00004000 |
966 | #define EMAC_STACR_STAC_MASK 0x00003000 |
967 | #define EMAC_STACR_STAC_READ 0x00001000 |
968 | -#define EMAC_STACR_STAC_WRITE 0x00000800 |
969 | +#define EMAC_STACR_STAC_WRITE 0x00002000 |
970 | #define EMAC_STACR_OPBC_MASK 0x00000C00 |
971 | #define EMAC_STACR_OPBC_50 0x00000000 |
972 | #define EMAC_STACR_OPBC_66 0x00000400 |
973 | diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c b/drivers/net/ethernet/intel/igb/e1000_i210.c |
974 | index c54ebedca6da..c393cb2c0f16 100644 |
975 | --- a/drivers/net/ethernet/intel/igb/e1000_i210.c |
976 | +++ b/drivers/net/ethernet/intel/igb/e1000_i210.c |
977 | @@ -842,6 +842,7 @@ s32 igb_pll_workaround_i210(struct e1000_hw *hw) |
978 | nvm_word = E1000_INVM_DEFAULT_AL; |
979 | tmp_nvm = nvm_word | E1000_INVM_PLL_WO_VAL; |
980 | igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, E1000_PHY_PLL_FREQ_PAGE); |
981 | + phy_word = E1000_PHY_PLL_UNCONF; |
982 | for (i = 0; i < E1000_MAX_PLL_TRIES; i++) { |
983 | /* check current state directly from internal PHY */ |
984 | igb_read_phy_reg_82580(hw, E1000_PHY_PLL_FREQ_REG, &phy_word); |
985 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
986 | index a8148c7126e5..9772016222c3 100644 |
987 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
988 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
989 | @@ -2248,7 +2248,9 @@ static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw, |
990 | *autoneg = false; |
991 | |
992 | if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || |
993 | - hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) { |
994 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 || |
995 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || |
996 | + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) { |
997 | *speed = IXGBE_LINK_SPEED_1GB_FULL; |
998 | return 0; |
999 | } |
1000 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1001 | index f11b45001cad..d290f0787dfb 100644 |
1002 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1003 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1004 | @@ -1084,8 +1084,8 @@ static int mlx4_en_set_pauseparam(struct net_device *dev, |
1005 | |
1006 | tx_pause = !!(pause->tx_pause); |
1007 | rx_pause = !!(pause->rx_pause); |
1008 | - rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause); |
1009 | - tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause); |
1010 | + rx_ppp = (tx_pause || rx_pause) ? 0 : priv->prof->rx_ppp; |
1011 | + tx_ppp = (tx_pause || rx_pause) ? 0 : priv->prof->tx_ppp; |
1012 | |
1013 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
1014 | priv->rx_skb_size + ETH_FCS_LEN, |
1015 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1016 | index fe49384eba48..0d7fd3f043cf 100644 |
1017 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1018 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1019 | @@ -3494,8 +3494,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
1020 | dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM; |
1021 | } |
1022 | |
1023 | - /* MTU range: 46 - hw-specific max */ |
1024 | - dev->min_mtu = MLX4_EN_MIN_MTU; |
1025 | + /* MTU range: 68 - hw-specific max */ |
1026 | + dev->min_mtu = ETH_MIN_MTU; |
1027 | dev->max_mtu = priv->max_mtu; |
1028 | |
1029 | mdev->pndev[port] = dev; |
1030 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1031 | index c3228b89df46..240f9c9ca943 100644 |
1032 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1033 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1034 | @@ -161,7 +161,6 @@ |
1035 | #define MLX4_SELFTEST_LB_MIN_MTU (MLX4_LOOPBACK_TEST_PAYLOAD + NET_IP_ALIGN + \ |
1036 | ETH_HLEN + PREAMBLE_LEN) |
1037 | |
1038 | -#define MLX4_EN_MIN_MTU 46 |
1039 | /* VLAN_HLEN is added twice,to support skb vlan tagged with multiple |
1040 | * headers. (For example: ETH_P_8021Q and ETH_P_8021AD). |
1041 | */ |
1042 | diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c |
1043 | index 81045dfa1cd8..44f6e4873aad 100644 |
1044 | --- a/drivers/net/ethernet/realtek/8139cp.c |
1045 | +++ b/drivers/net/ethernet/realtek/8139cp.c |
1046 | @@ -571,6 +571,7 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance) |
1047 | struct cp_private *cp; |
1048 | int handled = 0; |
1049 | u16 status; |
1050 | + u16 mask; |
1051 | |
1052 | if (unlikely(dev == NULL)) |
1053 | return IRQ_NONE; |
1054 | @@ -578,6 +579,10 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance) |
1055 | |
1056 | spin_lock(&cp->lock); |
1057 | |
1058 | + mask = cpr16(IntrMask); |
1059 | + if (!mask) |
1060 | + goto out_unlock; |
1061 | + |
1062 | status = cpr16(IntrStatus); |
1063 | if (!status || (status == 0xFFFF)) |
1064 | goto out_unlock; |
1065 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
1066 | index 733e35b7c4bb..20d1be2b070b 100644 |
1067 | --- a/drivers/net/phy/phy_device.c |
1068 | +++ b/drivers/net/phy/phy_device.c |
1069 | @@ -1738,20 +1738,17 @@ EXPORT_SYMBOL(genphy_loopback); |
1070 | |
1071 | static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) |
1072 | { |
1073 | - phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES | |
1074 | - PHY_10BT_FEATURES); |
1075 | - |
1076 | switch (max_speed) { |
1077 | - default: |
1078 | - return -ENOTSUPP; |
1079 | - case SPEED_1000: |
1080 | - phydev->supported |= PHY_1000BT_FEATURES; |
1081 | + case SPEED_10: |
1082 | + phydev->supported &= ~PHY_100BT_FEATURES; |
1083 | /* fall through */ |
1084 | case SPEED_100: |
1085 | - phydev->supported |= PHY_100BT_FEATURES; |
1086 | - /* fall through */ |
1087 | - case SPEED_10: |
1088 | - phydev->supported |= PHY_10BT_FEATURES; |
1089 | + phydev->supported &= ~PHY_1000BT_FEATURES; |
1090 | + break; |
1091 | + case SPEED_1000: |
1092 | + break; |
1093 | + default: |
1094 | + return -ENOTSUPP; |
1095 | } |
1096 | |
1097 | return 0; |
1098 | diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c |
1099 | index 83060fb349f4..ad9db652874d 100644 |
1100 | --- a/drivers/net/phy/sfp-bus.c |
1101 | +++ b/drivers/net/phy/sfp-bus.c |
1102 | @@ -162,7 +162,7 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, |
1103 | /* 1000Base-PX or 1000Base-BX10 */ |
1104 | if ((id->base.e_base_px || id->base.e_base_bx10) && |
1105 | br_min <= 1300 && br_max >= 1200) |
1106 | - phylink_set(support, 1000baseX_Full); |
1107 | + phylink_set(modes, 1000baseX_Full); |
1108 | |
1109 | /* For active or passive cables, select the link modes |
1110 | * based on the bit rates and the cable compliance bytes. |
1111 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
1112 | index 573620771154..8c1abcba4cbd 100644 |
1113 | --- a/drivers/net/tun.c |
1114 | +++ b/drivers/net/tun.c |
1115 | @@ -2268,9 +2268,9 @@ static void tun_setup(struct net_device *dev) |
1116 | static int tun_validate(struct nlattr *tb[], struct nlattr *data[], |
1117 | struct netlink_ext_ack *extack) |
1118 | { |
1119 | - if (!data) |
1120 | - return 0; |
1121 | - return -EINVAL; |
1122 | + NL_SET_ERR_MSG(extack, |
1123 | + "tun/tap creation via rtnetlink is not supported."); |
1124 | + return -EOPNOTSUPP; |
1125 | } |
1126 | |
1127 | static size_t tun_get_size(const struct net_device *dev) |
1128 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c |
1129 | index c2ca6cd3fbe0..ad14fbfa1864 100644 |
1130 | --- a/drivers/net/virtio_net.c |
1131 | +++ b/drivers/net/virtio_net.c |
1132 | @@ -365,7 +365,8 @@ static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx) |
1133 | static struct sk_buff *page_to_skb(struct virtnet_info *vi, |
1134 | struct receive_queue *rq, |
1135 | struct page *page, unsigned int offset, |
1136 | - unsigned int len, unsigned int truesize) |
1137 | + unsigned int len, unsigned int truesize, |
1138 | + bool hdr_valid) |
1139 | { |
1140 | struct sk_buff *skb; |
1141 | struct virtio_net_hdr_mrg_rxbuf *hdr; |
1142 | @@ -387,7 +388,8 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, |
1143 | else |
1144 | hdr_padded_len = sizeof(struct padded_vnet_hdr); |
1145 | |
1146 | - memcpy(hdr, p, hdr_len); |
1147 | + if (hdr_valid) |
1148 | + memcpy(hdr, p, hdr_len); |
1149 | |
1150 | len -= hdr_len; |
1151 | offset += hdr_padded_len; |
1152 | @@ -739,7 +741,8 @@ static struct sk_buff *receive_big(struct net_device *dev, |
1153 | struct virtnet_rq_stats *stats) |
1154 | { |
1155 | struct page *page = buf; |
1156 | - struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len, PAGE_SIZE); |
1157 | + struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len, |
1158 | + PAGE_SIZE, true); |
1159 | |
1160 | stats->bytes += len - vi->hdr_len; |
1161 | if (unlikely(!skb)) |
1162 | @@ -842,7 +845,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, |
1163 | rcu_read_unlock(); |
1164 | put_page(page); |
1165 | head_skb = page_to_skb(vi, rq, xdp_page, |
1166 | - offset, len, PAGE_SIZE); |
1167 | + offset, len, |
1168 | + PAGE_SIZE, false); |
1169 | return head_skb; |
1170 | } |
1171 | break; |
1172 | @@ -898,7 +902,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, |
1173 | goto err_skb; |
1174 | } |
1175 | |
1176 | - head_skb = page_to_skb(vi, rq, page, offset, len, truesize); |
1177 | + head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog); |
1178 | curr_skb = head_skb; |
1179 | |
1180 | if (unlikely(!curr_skb)) |
1181 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
1182 | index 0ba301f7e8b4..b7b2659e02fa 100644 |
1183 | --- a/drivers/nvme/host/core.c |
1184 | +++ b/drivers/nvme/host/core.c |
1185 | @@ -3308,6 +3308,9 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl) |
1186 | struct nvme_ns *ns, *next; |
1187 | LIST_HEAD(ns_list); |
1188 | |
1189 | + /* prevent racing with ns scanning */ |
1190 | + flush_work(&ctrl->scan_work); |
1191 | + |
1192 | /* |
1193 | * The dead states indicates the controller was not gracefully |
1194 | * disconnected. In that case, we won't be able to flush any data while |
1195 | @@ -3463,7 +3466,6 @@ void nvme_stop_ctrl(struct nvme_ctrl *ctrl) |
1196 | nvme_mpath_stop(ctrl); |
1197 | nvme_stop_keep_alive(ctrl); |
1198 | flush_work(&ctrl->async_event_work); |
1199 | - flush_work(&ctrl->scan_work); |
1200 | cancel_work_sync(&ctrl->fw_act_work); |
1201 | if (ctrl->ops->stop_ctrl) |
1202 | ctrl->ops->stop_ctrl(ctrl); |
1203 | diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h |
1204 | index bb4a2003c097..60220de2db52 100644 |
1205 | --- a/drivers/nvme/host/nvme.h |
1206 | +++ b/drivers/nvme/host/nvme.h |
1207 | @@ -537,6 +537,9 @@ static inline void nvme_mpath_check_last_path(struct nvme_ns *ns) |
1208 | static inline int nvme_mpath_init(struct nvme_ctrl *ctrl, |
1209 | struct nvme_id_ctrl *id) |
1210 | { |
1211 | + if (ctrl->subsys->cmic & (1 << 3)) |
1212 | + dev_warn(ctrl->device, |
1213 | +"Please enable CONFIG_NVME_MULTIPATH for full support of multi-port devices.\n"); |
1214 | return 0; |
1215 | } |
1216 | static inline void nvme_mpath_uninit(struct nvme_ctrl *ctrl) |
1217 | diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
1218 | index dc042017c293..b6a28de682e8 100644 |
1219 | --- a/drivers/nvme/host/rdma.c |
1220 | +++ b/drivers/nvme/host/rdma.c |
1221 | @@ -184,6 +184,7 @@ static int nvme_rdma_alloc_qe(struct ib_device *ibdev, struct nvme_rdma_qe *qe, |
1222 | qe->dma = ib_dma_map_single(ibdev, qe->data, capsule_size, dir); |
1223 | if (ib_dma_mapping_error(ibdev, qe->dma)) { |
1224 | kfree(qe->data); |
1225 | + qe->data = NULL; |
1226 | return -ENOMEM; |
1227 | } |
1228 | |
1229 | @@ -816,6 +817,7 @@ out_free_tagset: |
1230 | out_free_async_qe: |
1231 | nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, |
1232 | sizeof(struct nvme_command), DMA_TO_DEVICE); |
1233 | + ctrl->async_event_sqe.data = NULL; |
1234 | out_free_queue: |
1235 | nvme_rdma_free_queue(&ctrl->queues[0]); |
1236 | return error; |
1237 | diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c |
1238 | index 4a9a673b4777..975050a69494 100644 |
1239 | --- a/drivers/pci/controller/dwc/pci-imx6.c |
1240 | +++ b/drivers/pci/controller/dwc/pci-imx6.c |
1241 | @@ -80,8 +80,6 @@ struct imx6_pcie { |
1242 | #define PCIE_PL_PFLR_FORCE_LINK (1 << 15) |
1243 | #define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28) |
1244 | #define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c) |
1245 | -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29) |
1246 | -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_UP (1 << 4) |
1247 | |
1248 | #define PCIE_PHY_CTRL (PL_OFFSET + 0x114) |
1249 | #define PCIE_PHY_CTRL_DATA_LOC 0 |
1250 | @@ -641,12 +639,6 @@ static int imx6_pcie_host_init(struct pcie_port *pp) |
1251 | return 0; |
1252 | } |
1253 | |
1254 | -static int imx6_pcie_link_up(struct dw_pcie *pci) |
1255 | -{ |
1256 | - return dw_pcie_readl_dbi(pci, PCIE_PHY_DEBUG_R1) & |
1257 | - PCIE_PHY_DEBUG_R1_XMLH_LINK_UP; |
1258 | -} |
1259 | - |
1260 | static const struct dw_pcie_host_ops imx6_pcie_host_ops = { |
1261 | .host_init = imx6_pcie_host_init, |
1262 | }; |
1263 | @@ -679,7 +671,7 @@ static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, |
1264 | } |
1265 | |
1266 | static const struct dw_pcie_ops dw_pcie_ops = { |
1267 | - .link_up = imx6_pcie_link_up, |
1268 | + /* No special ops needed, but pcie-designware still expects this struct */ |
1269 | }; |
1270 | |
1271 | static int imx6_pcie_probe(struct platform_device *pdev) |
1272 | diff --git a/drivers/phy/qualcomm/phy-qcom-qusb2.c b/drivers/phy/qualcomm/phy-qcom-qusb2.c |
1273 | index e70e425f26f5..69c92843eb3b 100644 |
1274 | --- a/drivers/phy/qualcomm/phy-qcom-qusb2.c |
1275 | +++ b/drivers/phy/qualcomm/phy-qcom-qusb2.c |
1276 | @@ -231,6 +231,7 @@ static const struct qusb2_phy_cfg sdm845_phy_cfg = { |
1277 | .mask_core_ready = CORE_READY_STATUS, |
1278 | .has_pll_override = true, |
1279 | .autoresume_en = BIT(0), |
1280 | + .update_tune1_with_efuse = true, |
1281 | }; |
1282 | |
1283 | static const char * const qusb2_phy_vreg_names[] = { |
1284 | @@ -402,10 +403,10 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy) |
1285 | |
1286 | /* |
1287 | * Read efuse register having TUNE2/1 parameter's high nibble. |
1288 | - * If efuse register shows value as 0x0, or if we fail to find |
1289 | - * a valid efuse register settings, then use default value |
1290 | - * as 0xB for high nibble that we have already set while |
1291 | - * configuring phy. |
1292 | + * If efuse register shows value as 0x0 (indicating value is not |
1293 | + * fused), or if we fail to find a valid efuse register setting, |
1294 | + * then use default value for high nibble that we have already |
1295 | + * set while configuring the phy. |
1296 | */ |
1297 | val = nvmem_cell_read(qphy->cell, NULL); |
1298 | if (IS_ERR(val) || !val[0]) { |
1299 | @@ -415,12 +416,13 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy) |
1300 | |
1301 | /* Fused TUNE1/2 value is the higher nibble only */ |
1302 | if (cfg->update_tune1_with_efuse) |
1303 | - qusb2_setbits(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1], |
1304 | - val[0] << 0x4); |
1305 | + qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1], |
1306 | + val[0] << HSTX_TRIM_SHIFT, |
1307 | + HSTX_TRIM_MASK); |
1308 | else |
1309 | - qusb2_setbits(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2], |
1310 | - val[0] << 0x4); |
1311 | - |
1312 | + qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2], |
1313 | + val[0] << HSTX_TRIM_SHIFT, |
1314 | + HSTX_TRIM_MASK); |
1315 | } |
1316 | |
1317 | static int qusb2_phy_set_mode(struct phy *phy, enum phy_mode mode) |
1318 | diff --git a/drivers/s390/cio/vfio_ccw_cp.c b/drivers/s390/cio/vfio_ccw_cp.c |
1319 | index fd77e46eb3b2..70a006ba4d05 100644 |
1320 | --- a/drivers/s390/cio/vfio_ccw_cp.c |
1321 | +++ b/drivers/s390/cio/vfio_ccw_cp.c |
1322 | @@ -387,8 +387,10 @@ static int ccwchain_calc_length(u64 iova, struct channel_program *cp) |
1323 | * orb specified one of the unsupported formats, we defer |
1324 | * checking for IDAWs in unsupported formats to here. |
1325 | */ |
1326 | - if ((!cp->orb.cmd.c64 || cp->orb.cmd.i2k) && ccw_is_idal(ccw)) |
1327 | + if ((!cp->orb.cmd.c64 || cp->orb.cmd.i2k) && ccw_is_idal(ccw)) { |
1328 | + kfree(p); |
1329 | return -EOPNOTSUPP; |
1330 | + } |
1331 | |
1332 | if ((!ccw_is_chain(ccw)) && (!ccw_is_tic(ccw))) |
1333 | break; |
1334 | @@ -528,7 +530,7 @@ static int ccwchain_fetch_direct(struct ccwchain *chain, |
1335 | |
1336 | ret = pfn_array_alloc_pin(pat->pat_pa, cp->mdev, ccw->cda, ccw->count); |
1337 | if (ret < 0) |
1338 | - goto out_init; |
1339 | + goto out_unpin; |
1340 | |
1341 | /* Translate this direct ccw to a idal ccw. */ |
1342 | idaws = kcalloc(ret, sizeof(*idaws), GFP_DMA | GFP_KERNEL); |
1343 | diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c |
1344 | index 508c61c669e7..e2be7da74343 100644 |
1345 | --- a/drivers/spi/spi-omap2-mcspi.c |
1346 | +++ b/drivers/spi/spi-omap2-mcspi.c |
1347 | @@ -1455,13 +1455,26 @@ static int omap2_mcspi_remove(struct platform_device *pdev) |
1348 | /* work with hotplug and coldplug */ |
1349 | MODULE_ALIAS("platform:omap2_mcspi"); |
1350 | |
1351 | -#ifdef CONFIG_SUSPEND |
1352 | -static int omap2_mcspi_suspend_noirq(struct device *dev) |
1353 | +static int __maybe_unused omap2_mcspi_suspend(struct device *dev) |
1354 | { |
1355 | - return pinctrl_pm_select_sleep_state(dev); |
1356 | + struct spi_master *master = dev_get_drvdata(dev); |
1357 | + struct omap2_mcspi *mcspi = spi_master_get_devdata(master); |
1358 | + int error; |
1359 | + |
1360 | + error = pinctrl_pm_select_sleep_state(dev); |
1361 | + if (error) |
1362 | + dev_warn(mcspi->dev, "%s: failed to set pins: %i\n", |
1363 | + __func__, error); |
1364 | + |
1365 | + error = spi_master_suspend(master); |
1366 | + if (error) |
1367 | + dev_warn(mcspi->dev, "%s: master suspend failed: %i\n", |
1368 | + __func__, error); |
1369 | + |
1370 | + return pm_runtime_force_suspend(dev); |
1371 | } |
1372 | |
1373 | -static int omap2_mcspi_resume_noirq(struct device *dev) |
1374 | +static int __maybe_unused omap2_mcspi_resume(struct device *dev) |
1375 | { |
1376 | struct spi_master *master = dev_get_drvdata(dev); |
1377 | struct omap2_mcspi *mcspi = spi_master_get_devdata(master); |
1378 | @@ -1472,17 +1485,17 @@ static int omap2_mcspi_resume_noirq(struct device *dev) |
1379 | dev_warn(mcspi->dev, "%s: failed to set pins: %i\n", |
1380 | __func__, error); |
1381 | |
1382 | - return 0; |
1383 | -} |
1384 | + error = spi_master_resume(master); |
1385 | + if (error) |
1386 | + dev_warn(mcspi->dev, "%s: master resume failed: %i\n", |
1387 | + __func__, error); |
1388 | |
1389 | -#else |
1390 | -#define omap2_mcspi_suspend_noirq NULL |
1391 | -#define omap2_mcspi_resume_noirq NULL |
1392 | -#endif |
1393 | + return pm_runtime_force_resume(dev); |
1394 | +} |
1395 | |
1396 | static const struct dev_pm_ops omap2_mcspi_pm_ops = { |
1397 | - .suspend_noirq = omap2_mcspi_suspend_noirq, |
1398 | - .resume_noirq = omap2_mcspi_resume_noirq, |
1399 | + SET_SYSTEM_SLEEP_PM_OPS(omap2_mcspi_suspend, |
1400 | + omap2_mcspi_resume) |
1401 | .runtime_resume = omap_mcspi_runtime_resume, |
1402 | }; |
1403 | |
1404 | diff --git a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
1405 | index c38298d960ff..4f120e72c7d2 100644 |
1406 | --- a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
1407 | +++ b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c |
1408 | @@ -2289,7 +2289,7 @@ static int rtw_wx_read32(struct net_device *dev, |
1409 | exit: |
1410 | kfree(ptmp); |
1411 | |
1412 | - return 0; |
1413 | + return ret; |
1414 | } |
1415 | |
1416 | static int rtw_wx_write32(struct net_device *dev, |
1417 | diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c |
1418 | index 7442bc4c6433..dd9ae6f5d19c 100644 |
1419 | --- a/drivers/thunderbolt/switch.c |
1420 | +++ b/drivers/thunderbolt/switch.c |
1421 | @@ -864,6 +864,30 @@ static ssize_t key_store(struct device *dev, struct device_attribute *attr, |
1422 | } |
1423 | static DEVICE_ATTR(key, 0600, key_show, key_store); |
1424 | |
1425 | +static void nvm_authenticate_start(struct tb_switch *sw) |
1426 | +{ |
1427 | + struct pci_dev *root_port; |
1428 | + |
1429 | + /* |
1430 | + * During host router NVM upgrade we should not allow root port to |
1431 | + * go into D3cold because some root ports cannot trigger PME |
1432 | + * itself. To be on the safe side keep the root port in D0 during |
1433 | + * the whole upgrade process. |
1434 | + */ |
1435 | + root_port = pci_find_pcie_root_port(sw->tb->nhi->pdev); |
1436 | + if (root_port) |
1437 | + pm_runtime_get_noresume(&root_port->dev); |
1438 | +} |
1439 | + |
1440 | +static void nvm_authenticate_complete(struct tb_switch *sw) |
1441 | +{ |
1442 | + struct pci_dev *root_port; |
1443 | + |
1444 | + root_port = pci_find_pcie_root_port(sw->tb->nhi->pdev); |
1445 | + if (root_port) |
1446 | + pm_runtime_put(&root_port->dev); |
1447 | +} |
1448 | + |
1449 | static ssize_t nvm_authenticate_show(struct device *dev, |
1450 | struct device_attribute *attr, char *buf) |
1451 | { |
1452 | @@ -913,10 +937,18 @@ static ssize_t nvm_authenticate_store(struct device *dev, |
1453 | |
1454 | sw->nvm->authenticating = true; |
1455 | |
1456 | - if (!tb_route(sw)) |
1457 | + if (!tb_route(sw)) { |
1458 | + /* |
1459 | + * Keep root port from suspending as long as the |
1460 | + * NVM upgrade process is running. |
1461 | + */ |
1462 | + nvm_authenticate_start(sw); |
1463 | ret = nvm_authenticate_host(sw); |
1464 | - else |
1465 | + if (ret) |
1466 | + nvm_authenticate_complete(sw); |
1467 | + } else { |
1468 | ret = nvm_authenticate_device(sw); |
1469 | + } |
1470 | pm_runtime_mark_last_busy(&sw->dev); |
1471 | pm_runtime_put_autosuspend(&sw->dev); |
1472 | } |
1473 | @@ -1336,6 +1368,10 @@ static int tb_switch_add_dma_port(struct tb_switch *sw) |
1474 | if (ret <= 0) |
1475 | return ret; |
1476 | |
1477 | + /* Now we can allow root port to suspend again */ |
1478 | + if (!tb_route(sw)) |
1479 | + nvm_authenticate_complete(sw); |
1480 | + |
1481 | if (status) { |
1482 | tb_sw_info(sw, "switch flash authentication failed\n"); |
1483 | tb_switch_set_uuid(sw); |
1484 | diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c |
1485 | index 1000d864929c..0f026d445e31 100644 |
1486 | --- a/drivers/usb/gadget/function/u_ether.c |
1487 | +++ b/drivers/usb/gadget/function/u_ether.c |
1488 | @@ -401,12 +401,12 @@ done: |
1489 | static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) |
1490 | { |
1491 | struct usb_request *req; |
1492 | - struct usb_request *tmp; |
1493 | unsigned long flags; |
1494 | |
1495 | /* fill unused rxq slots with some skb */ |
1496 | spin_lock_irqsave(&dev->req_lock, flags); |
1497 | - list_for_each_entry_safe(req, tmp, &dev->rx_reqs, list) { |
1498 | + while (!list_empty(&dev->rx_reqs)) { |
1499 | + req = list_first_entry(&dev->rx_reqs, struct usb_request, list); |
1500 | list_del_init(&req->list); |
1501 | spin_unlock_irqrestore(&dev->req_lock, flags); |
1502 | |
1503 | @@ -1125,7 +1125,6 @@ void gether_disconnect(struct gether *link) |
1504 | { |
1505 | struct eth_dev *dev = link->ioport; |
1506 | struct usb_request *req; |
1507 | - struct usb_request *tmp; |
1508 | |
1509 | WARN_ON(!dev); |
1510 | if (!dev) |
1511 | @@ -1142,7 +1141,8 @@ void gether_disconnect(struct gether *link) |
1512 | */ |
1513 | usb_ep_disable(link->in_ep); |
1514 | spin_lock(&dev->req_lock); |
1515 | - list_for_each_entry_safe(req, tmp, &dev->tx_reqs, list) { |
1516 | + while (!list_empty(&dev->tx_reqs)) { |
1517 | + req = list_first_entry(&dev->tx_reqs, struct usb_request, list); |
1518 | list_del(&req->list); |
1519 | |
1520 | spin_unlock(&dev->req_lock); |
1521 | @@ -1154,7 +1154,8 @@ void gether_disconnect(struct gether *link) |
1522 | |
1523 | usb_ep_disable(link->out_ep); |
1524 | spin_lock(&dev->req_lock); |
1525 | - list_for_each_entry_safe(req, tmp, &dev->rx_reqs, list) { |
1526 | + while (!list_empty(&dev->rx_reqs)) { |
1527 | + req = list_first_entry(&dev->rx_reqs, struct usb_request, list); |
1528 | list_del(&req->list); |
1529 | |
1530 | spin_unlock(&dev->req_lock); |
1531 | diff --git a/drivers/usb/gadget/udc/omap_udc.c b/drivers/usb/gadget/udc/omap_udc.c |
1532 | index 3a16431da321..fcf13ef33b31 100644 |
1533 | --- a/drivers/usb/gadget/udc/omap_udc.c |
1534 | +++ b/drivers/usb/gadget/udc/omap_udc.c |
1535 | @@ -2033,6 +2033,7 @@ static inline int machine_without_vbus_sense(void) |
1536 | { |
1537 | return machine_is_omap_innovator() |
1538 | || machine_is_omap_osk() |
1539 | + || machine_is_omap_palmte() |
1540 | || machine_is_sx1() |
1541 | /* No known omap7xx boards with vbus sense */ |
1542 | || cpu_is_omap7xx(); |
1543 | @@ -2041,7 +2042,7 @@ static inline int machine_without_vbus_sense(void) |
1544 | static int omap_udc_start(struct usb_gadget *g, |
1545 | struct usb_gadget_driver *driver) |
1546 | { |
1547 | - int status = -ENODEV; |
1548 | + int status; |
1549 | struct omap_ep *ep; |
1550 | unsigned long flags; |
1551 | |
1552 | @@ -2079,6 +2080,7 @@ static int omap_udc_start(struct usb_gadget *g, |
1553 | goto done; |
1554 | } |
1555 | } else { |
1556 | + status = 0; |
1557 | if (can_pullup(udc)) |
1558 | pullup_enable(udc); |
1559 | else |
1560 | @@ -2593,9 +2595,22 @@ omap_ep_setup(char *name, u8 addr, u8 type, |
1561 | |
1562 | static void omap_udc_release(struct device *dev) |
1563 | { |
1564 | - complete(udc->done); |
1565 | + pullup_disable(udc); |
1566 | + if (!IS_ERR_OR_NULL(udc->transceiver)) { |
1567 | + usb_put_phy(udc->transceiver); |
1568 | + udc->transceiver = NULL; |
1569 | + } |
1570 | + omap_writew(0, UDC_SYSCON1); |
1571 | + remove_proc_file(); |
1572 | + if (udc->dc_clk) { |
1573 | + if (udc->clk_requested) |
1574 | + omap_udc_enable_clock(0); |
1575 | + clk_put(udc->hhc_clk); |
1576 | + clk_put(udc->dc_clk); |
1577 | + } |
1578 | + if (udc->done) |
1579 | + complete(udc->done); |
1580 | kfree(udc); |
1581 | - udc = NULL; |
1582 | } |
1583 | |
1584 | static int |
1585 | @@ -2627,6 +2642,7 @@ omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) |
1586 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
1587 | udc->gadget.max_speed = USB_SPEED_FULL; |
1588 | udc->gadget.name = driver_name; |
1589 | + udc->gadget.quirk_ep_out_aligned_size = 1; |
1590 | udc->transceiver = xceiv; |
1591 | |
1592 | /* ep0 is special; put it right after the SETUP buffer */ |
1593 | @@ -2867,8 +2883,8 @@ bad_on_1710: |
1594 | udc->clr_halt = UDC_RESET_EP; |
1595 | |
1596 | /* USB general purpose IRQ: ep0, state changes, dma, etc */ |
1597 | - status = request_irq(pdev->resource[1].start, omap_udc_irq, |
1598 | - 0, driver_name, udc); |
1599 | + status = devm_request_irq(&pdev->dev, pdev->resource[1].start, |
1600 | + omap_udc_irq, 0, driver_name, udc); |
1601 | if (status != 0) { |
1602 | ERR("can't get irq %d, err %d\n", |
1603 | (int) pdev->resource[1].start, status); |
1604 | @@ -2876,20 +2892,20 @@ bad_on_1710: |
1605 | } |
1606 | |
1607 | /* USB "non-iso" IRQ (PIO for all but ep0) */ |
1608 | - status = request_irq(pdev->resource[2].start, omap_udc_pio_irq, |
1609 | - 0, "omap_udc pio", udc); |
1610 | + status = devm_request_irq(&pdev->dev, pdev->resource[2].start, |
1611 | + omap_udc_pio_irq, 0, "omap_udc pio", udc); |
1612 | if (status != 0) { |
1613 | ERR("can't get irq %d, err %d\n", |
1614 | (int) pdev->resource[2].start, status); |
1615 | - goto cleanup2; |
1616 | + goto cleanup1; |
1617 | } |
1618 | #ifdef USE_ISO |
1619 | - status = request_irq(pdev->resource[3].start, omap_udc_iso_irq, |
1620 | - 0, "omap_udc iso", udc); |
1621 | + status = devm_request_irq(&pdev->dev, pdev->resource[3].start, |
1622 | + omap_udc_iso_irq, 0, "omap_udc iso", udc); |
1623 | if (status != 0) { |
1624 | ERR("can't get irq %d, err %d\n", |
1625 | (int) pdev->resource[3].start, status); |
1626 | - goto cleanup3; |
1627 | + goto cleanup1; |
1628 | } |
1629 | #endif |
1630 | if (cpu_is_omap16xx() || cpu_is_omap7xx()) { |
1631 | @@ -2900,23 +2916,8 @@ bad_on_1710: |
1632 | } |
1633 | |
1634 | create_proc_file(); |
1635 | - status = usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, |
1636 | - omap_udc_release); |
1637 | - if (status) |
1638 | - goto cleanup4; |
1639 | - |
1640 | - return 0; |
1641 | - |
1642 | -cleanup4: |
1643 | - remove_proc_file(); |
1644 | - |
1645 | -#ifdef USE_ISO |
1646 | -cleanup3: |
1647 | - free_irq(pdev->resource[2].start, udc); |
1648 | -#endif |
1649 | - |
1650 | -cleanup2: |
1651 | - free_irq(pdev->resource[1].start, udc); |
1652 | + return usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, |
1653 | + omap_udc_release); |
1654 | |
1655 | cleanup1: |
1656 | kfree(udc); |
1657 | @@ -2943,42 +2944,15 @@ static int omap_udc_remove(struct platform_device *pdev) |
1658 | { |
1659 | DECLARE_COMPLETION_ONSTACK(done); |
1660 | |
1661 | - if (!udc) |
1662 | - return -ENODEV; |
1663 | - |
1664 | - usb_del_gadget_udc(&udc->gadget); |
1665 | - if (udc->driver) |
1666 | - return -EBUSY; |
1667 | - |
1668 | udc->done = &done; |
1669 | |
1670 | - pullup_disable(udc); |
1671 | - if (!IS_ERR_OR_NULL(udc->transceiver)) { |
1672 | - usb_put_phy(udc->transceiver); |
1673 | - udc->transceiver = NULL; |
1674 | - } |
1675 | - omap_writew(0, UDC_SYSCON1); |
1676 | - |
1677 | - remove_proc_file(); |
1678 | - |
1679 | -#ifdef USE_ISO |
1680 | - free_irq(pdev->resource[3].start, udc); |
1681 | -#endif |
1682 | - free_irq(pdev->resource[2].start, udc); |
1683 | - free_irq(pdev->resource[1].start, udc); |
1684 | + usb_del_gadget_udc(&udc->gadget); |
1685 | |
1686 | - if (udc->dc_clk) { |
1687 | - if (udc->clk_requested) |
1688 | - omap_udc_enable_clock(0); |
1689 | - clk_put(udc->hhc_clk); |
1690 | - clk_put(udc->dc_clk); |
1691 | - } |
1692 | + wait_for_completion(&done); |
1693 | |
1694 | release_mem_region(pdev->resource[0].start, |
1695 | pdev->resource[0].end - pdev->resource[0].start + 1); |
1696 | |
1697 | - wait_for_completion(&done); |
1698 | - |
1699 | return 0; |
1700 | } |
1701 | |
1702 | diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c |
1703 | index e12bb256036f..7ab6caef599c 100644 |
1704 | --- a/drivers/xen/balloon.c |
1705 | +++ b/drivers/xen/balloon.c |
1706 | @@ -251,25 +251,10 @@ static void release_memory_resource(struct resource *resource) |
1707 | kfree(resource); |
1708 | } |
1709 | |
1710 | -/* |
1711 | - * Host memory not allocated to dom0. We can use this range for hotplug-based |
1712 | - * ballooning. |
1713 | - * |
1714 | - * It's a type-less resource. Setting IORESOURCE_MEM will make resource |
1715 | - * management algorithms (arch_remove_reservations()) look into guest e820, |
1716 | - * which we don't want. |
1717 | - */ |
1718 | -static struct resource hostmem_resource = { |
1719 | - .name = "Host RAM", |
1720 | -}; |
1721 | - |
1722 | -void __attribute__((weak)) __init arch_xen_balloon_init(struct resource *res) |
1723 | -{} |
1724 | - |
1725 | static struct resource *additional_memory_resource(phys_addr_t size) |
1726 | { |
1727 | - struct resource *res, *res_hostmem; |
1728 | - int ret = -ENOMEM; |
1729 | + struct resource *res; |
1730 | + int ret; |
1731 | |
1732 | res = kzalloc(sizeof(*res), GFP_KERNEL); |
1733 | if (!res) |
1734 | @@ -278,42 +263,13 @@ static struct resource *additional_memory_resource(phys_addr_t size) |
1735 | res->name = "System RAM"; |
1736 | res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; |
1737 | |
1738 | - res_hostmem = kzalloc(sizeof(*res), GFP_KERNEL); |
1739 | - if (res_hostmem) { |
1740 | - /* Try to grab a range from hostmem */ |
1741 | - res_hostmem->name = "Host memory"; |
1742 | - ret = allocate_resource(&hostmem_resource, res_hostmem, |
1743 | - size, 0, -1, |
1744 | - PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL); |
1745 | - } |
1746 | - |
1747 | - if (!ret) { |
1748 | - /* |
1749 | - * Insert this resource into iomem. Because hostmem_resource |
1750 | - * tracks portion of guest e820 marked as UNUSABLE noone else |
1751 | - * should try to use it. |
1752 | - */ |
1753 | - res->start = res_hostmem->start; |
1754 | - res->end = res_hostmem->end; |
1755 | - ret = insert_resource(&iomem_resource, res); |
1756 | - if (ret < 0) { |
1757 | - pr_err("Can't insert iomem_resource [%llx - %llx]\n", |
1758 | - res->start, res->end); |
1759 | - release_memory_resource(res_hostmem); |
1760 | - res_hostmem = NULL; |
1761 | - res->start = res->end = 0; |
1762 | - } |
1763 | - } |
1764 | - |
1765 | - if (ret) { |
1766 | - ret = allocate_resource(&iomem_resource, res, |
1767 | - size, 0, -1, |
1768 | - PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL); |
1769 | - if (ret < 0) { |
1770 | - pr_err("Cannot allocate new System RAM resource\n"); |
1771 | - kfree(res); |
1772 | - return NULL; |
1773 | - } |
1774 | + ret = allocate_resource(&iomem_resource, res, |
1775 | + size, 0, -1, |
1776 | + PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL); |
1777 | + if (ret < 0) { |
1778 | + pr_err("Cannot allocate new System RAM resource\n"); |
1779 | + kfree(res); |
1780 | + return NULL; |
1781 | } |
1782 | |
1783 | #ifdef CONFIG_SPARSEMEM |
1784 | @@ -325,7 +281,6 @@ static struct resource *additional_memory_resource(phys_addr_t size) |
1785 | pr_err("New System RAM resource outside addressable RAM (%lu > %lu)\n", |
1786 | pfn, limit); |
1787 | release_memory_resource(res); |
1788 | - release_memory_resource(res_hostmem); |
1789 | return NULL; |
1790 | } |
1791 | } |
1792 | @@ -747,8 +702,6 @@ static int __init balloon_init(void) |
1793 | set_online_page_callback(&xen_online_page); |
1794 | register_memory_notifier(&xen_memory_nb); |
1795 | register_sysctl_table(xen_root); |
1796 | - |
1797 | - arch_xen_balloon_init(&hostmem_resource); |
1798 | #endif |
1799 | |
1800 | #ifdef CONFIG_XEN_PV |
1801 | diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c |
1802 | index 2f11ca72a281..77224d8f3e6f 100644 |
1803 | --- a/drivers/xen/pvcalls-front.c |
1804 | +++ b/drivers/xen/pvcalls-front.c |
1805 | @@ -385,8 +385,8 @@ static int create_active(struct sock_mapping *map, int *evtchn) |
1806 | out_error: |
1807 | if (*evtchn >= 0) |
1808 | xenbus_free_evtchn(pvcalls_front_dev, *evtchn); |
1809 | - kfree(map->active.data.in); |
1810 | - kfree(map->active.ring); |
1811 | + free_pages((unsigned long)map->active.data.in, PVCALLS_RING_ORDER); |
1812 | + free_page((unsigned long)map->active.ring); |
1813 | return ret; |
1814 | } |
1815 | |
1816 | diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c |
1817 | index 23f1387b3ef7..e7df65d32c91 100644 |
1818 | --- a/drivers/xen/xlate_mmu.c |
1819 | +++ b/drivers/xen/xlate_mmu.c |
1820 | @@ -36,6 +36,7 @@ |
1821 | #include <asm/xen/hypervisor.h> |
1822 | |
1823 | #include <xen/xen.h> |
1824 | +#include <xen/xen-ops.h> |
1825 | #include <xen/page.h> |
1826 | #include <xen/interface/xen.h> |
1827 | #include <xen/interface/memory.h> |
1828 | diff --git a/fs/afs/inode.c b/fs/afs/inode.c |
1829 | index 479b7fdda124..071075d775a9 100644 |
1830 | --- a/fs/afs/inode.c |
1831 | +++ b/fs/afs/inode.c |
1832 | @@ -379,7 +379,7 @@ void afs_zap_data(struct afs_vnode *vnode) |
1833 | int afs_validate(struct afs_vnode *vnode, struct key *key) |
1834 | { |
1835 | time64_t now = ktime_get_real_seconds(); |
1836 | - bool valid = false; |
1837 | + bool valid; |
1838 | int ret; |
1839 | |
1840 | _enter("{v={%x:%u} fl=%lx},%x", |
1841 | @@ -399,15 +399,21 @@ int afs_validate(struct afs_vnode *vnode, struct key *key) |
1842 | vnode->cb_v_break = vnode->volume->cb_v_break; |
1843 | valid = false; |
1844 | } else if (vnode->status.type == AFS_FTYPE_DIR && |
1845 | - test_bit(AFS_VNODE_DIR_VALID, &vnode->flags) && |
1846 | - vnode->cb_expires_at - 10 > now) { |
1847 | - valid = true; |
1848 | - } else if (!test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags) && |
1849 | - vnode->cb_expires_at - 10 > now) { |
1850 | + (!test_bit(AFS_VNODE_DIR_VALID, &vnode->flags) || |
1851 | + vnode->cb_expires_at - 10 <= now)) { |
1852 | + valid = false; |
1853 | + } else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags) || |
1854 | + vnode->cb_expires_at - 10 <= now) { |
1855 | + valid = false; |
1856 | + } else { |
1857 | valid = true; |
1858 | } |
1859 | } else if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) { |
1860 | valid = true; |
1861 | + } else { |
1862 | + vnode->cb_s_break = vnode->cb_interest->server->cb_s_break; |
1863 | + vnode->cb_v_break = vnode->volume->cb_v_break; |
1864 | + valid = false; |
1865 | } |
1866 | |
1867 | read_sequnlock_excl(&vnode->cb_lock); |
1868 | diff --git a/fs/aio.c b/fs/aio.c |
1869 | index b9350f3360c6..04c4d6218978 100644 |
1870 | --- a/fs/aio.c |
1871 | +++ b/fs/aio.c |
1872 | @@ -1436,6 +1436,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) |
1873 | ret = ioprio_check_cap(iocb->aio_reqprio); |
1874 | if (ret) { |
1875 | pr_debug("aio ioprio check cap error: %d\n", ret); |
1876 | + fput(req->ki_filp); |
1877 | return ret; |
1878 | } |
1879 | |
1880 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
1881 | index ba8950bfd9c7..84cb6e5ef36c 100644 |
1882 | --- a/fs/btrfs/send.c |
1883 | +++ b/fs/btrfs/send.c |
1884 | @@ -3344,7 +3344,8 @@ static void free_pending_move(struct send_ctx *sctx, struct pending_dir_move *m) |
1885 | kfree(m); |
1886 | } |
1887 | |
1888 | -static void tail_append_pending_moves(struct pending_dir_move *moves, |
1889 | +static void tail_append_pending_moves(struct send_ctx *sctx, |
1890 | + struct pending_dir_move *moves, |
1891 | struct list_head *stack) |
1892 | { |
1893 | if (list_empty(&moves->list)) { |
1894 | @@ -3355,6 +3356,10 @@ static void tail_append_pending_moves(struct pending_dir_move *moves, |
1895 | list_add_tail(&moves->list, stack); |
1896 | list_splice_tail(&list, stack); |
1897 | } |
1898 | + if (!RB_EMPTY_NODE(&moves->node)) { |
1899 | + rb_erase(&moves->node, &sctx->pending_dir_moves); |
1900 | + RB_CLEAR_NODE(&moves->node); |
1901 | + } |
1902 | } |
1903 | |
1904 | static int apply_children_dir_moves(struct send_ctx *sctx) |
1905 | @@ -3369,7 +3374,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx) |
1906 | return 0; |
1907 | |
1908 | INIT_LIST_HEAD(&stack); |
1909 | - tail_append_pending_moves(pm, &stack); |
1910 | + tail_append_pending_moves(sctx, pm, &stack); |
1911 | |
1912 | while (!list_empty(&stack)) { |
1913 | pm = list_first_entry(&stack, struct pending_dir_move, list); |
1914 | @@ -3380,7 +3385,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx) |
1915 | goto out; |
1916 | pm = get_pending_dir_moves(sctx, parent_ino); |
1917 | if (pm) |
1918 | - tail_append_pending_moves(pm, &stack); |
1919 | + tail_append_pending_moves(sctx, pm, &stack); |
1920 | } |
1921 | return 0; |
1922 | |
1923 | diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c |
1924 | index 95983c744164..5ab411d4bc59 100644 |
1925 | --- a/fs/cachefiles/namei.c |
1926 | +++ b/fs/cachefiles/namei.c |
1927 | @@ -244,11 +244,13 @@ wait_for_old_object: |
1928 | |
1929 | ASSERT(!test_bit(CACHEFILES_OBJECT_ACTIVE, &xobject->flags)); |
1930 | |
1931 | - cache->cache.ops->put_object(&xobject->fscache, cachefiles_obj_put_wait_retry); |
1932 | + cache->cache.ops->put_object(&xobject->fscache, |
1933 | + (enum fscache_obj_ref_trace)cachefiles_obj_put_wait_retry); |
1934 | goto try_again; |
1935 | |
1936 | requeue: |
1937 | - cache->cache.ops->put_object(&xobject->fscache, cachefiles_obj_put_wait_timeo); |
1938 | + cache->cache.ops->put_object(&xobject->fscache, |
1939 | + (enum fscache_obj_ref_trace)cachefiles_obj_put_wait_timeo); |
1940 | _leave(" = -ETIMEDOUT"); |
1941 | return -ETIMEDOUT; |
1942 | } |
1943 | diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c |
1944 | index 40f7595aad10..8a577409d030 100644 |
1945 | --- a/fs/cachefiles/rdwr.c |
1946 | +++ b/fs/cachefiles/rdwr.c |
1947 | @@ -535,7 +535,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, |
1948 | netpage->index, cachefiles_gfp); |
1949 | if (ret < 0) { |
1950 | if (ret == -EEXIST) { |
1951 | + put_page(backpage); |
1952 | + backpage = NULL; |
1953 | put_page(netpage); |
1954 | + netpage = NULL; |
1955 | fscache_retrieval_complete(op, 1); |
1956 | continue; |
1957 | } |
1958 | @@ -608,7 +611,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, |
1959 | netpage->index, cachefiles_gfp); |
1960 | if (ret < 0) { |
1961 | if (ret == -EEXIST) { |
1962 | + put_page(backpage); |
1963 | + backpage = NULL; |
1964 | put_page(netpage); |
1965 | + netpage = NULL; |
1966 | fscache_retrieval_complete(op, 1); |
1967 | continue; |
1968 | } |
1969 | @@ -962,11 +968,8 @@ void cachefiles_uncache_page(struct fscache_object *_object, struct page *page) |
1970 | __releases(&object->fscache.cookie->lock) |
1971 | { |
1972 | struct cachefiles_object *object; |
1973 | - struct cachefiles_cache *cache; |
1974 | |
1975 | object = container_of(_object, struct cachefiles_object, fscache); |
1976 | - cache = container_of(object->fscache.cache, |
1977 | - struct cachefiles_cache, cache); |
1978 | |
1979 | _enter("%p,{%lu}", object, page->index); |
1980 | |
1981 | diff --git a/fs/cachefiles/xattr.c b/fs/cachefiles/xattr.c |
1982 | index 0a29a00aed2e..511e6c68156a 100644 |
1983 | --- a/fs/cachefiles/xattr.c |
1984 | +++ b/fs/cachefiles/xattr.c |
1985 | @@ -135,7 +135,8 @@ int cachefiles_update_object_xattr(struct cachefiles_object *object, |
1986 | struct dentry *dentry = object->dentry; |
1987 | int ret; |
1988 | |
1989 | - ASSERT(dentry); |
1990 | + if (!dentry) |
1991 | + return -ESTALE; |
1992 | |
1993 | _enter("%p,#%d", object, auxdata->len); |
1994 | |
1995 | diff --git a/fs/dax.c b/fs/dax.c |
1996 | index b0cd1364c68f..3a2682a6c832 100644 |
1997 | --- a/fs/dax.c |
1998 | +++ b/fs/dax.c |
1999 | @@ -423,7 +423,7 @@ bool dax_lock_mapping_entry(struct page *page) |
2000 | for (;;) { |
2001 | mapping = READ_ONCE(page->mapping); |
2002 | |
2003 | - if (!dax_mapping(mapping)) |
2004 | + if (!mapping || !dax_mapping(mapping)) |
2005 | break; |
2006 | |
2007 | /* |
2008 | diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c |
2009 | index 645158dc33f1..63707abcbeb3 100644 |
2010 | --- a/fs/exportfs/expfs.c |
2011 | +++ b/fs/exportfs/expfs.c |
2012 | @@ -77,7 +77,7 @@ static bool dentry_connected(struct dentry *dentry) |
2013 | struct dentry *parent = dget_parent(dentry); |
2014 | |
2015 | dput(dentry); |
2016 | - if (IS_ROOT(dentry)) { |
2017 | + if (dentry == parent) { |
2018 | dput(parent); |
2019 | return false; |
2020 | } |
2021 | diff --git a/fs/fscache/object.c b/fs/fscache/object.c |
2022 | index 9edc920f651f..6d9cb1719de5 100644 |
2023 | --- a/fs/fscache/object.c |
2024 | +++ b/fs/fscache/object.c |
2025 | @@ -730,6 +730,9 @@ static const struct fscache_state *fscache_drop_object(struct fscache_object *ob |
2026 | |
2027 | if (awaken) |
2028 | wake_up_bit(&cookie->flags, FSCACHE_COOKIE_INVALIDATING); |
2029 | + if (test_and_clear_bit(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags)) |
2030 | + wake_up_bit(&cookie->flags, FSCACHE_COOKIE_LOOKING_UP); |
2031 | + |
2032 | |
2033 | /* Prevent a race with our last child, which has to signal EV_CLEARED |
2034 | * before dropping our spinlock. |
2035 | diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c |
2036 | index 374b5688e29e..9bdff5e40626 100644 |
2037 | --- a/fs/hfs/btree.c |
2038 | +++ b/fs/hfs/btree.c |
2039 | @@ -329,13 +329,14 @@ void hfs_bmap_free(struct hfs_bnode *node) |
2040 | |
2041 | nidx -= len * 8; |
2042 | i = node->next; |
2043 | - hfs_bnode_put(node); |
2044 | if (!i) { |
2045 | /* panic */; |
2046 | pr_crit("unable to free bnode %u. bmap not found!\n", |
2047 | node->this); |
2048 | + hfs_bnode_put(node); |
2049 | return; |
2050 | } |
2051 | + hfs_bnode_put(node); |
2052 | node = hfs_bnode_find(tree, i); |
2053 | if (IS_ERR(node)) |
2054 | return; |
2055 | diff --git a/fs/hfsplus/btree.c b/fs/hfsplus/btree.c |
2056 | index de14b2b6881b..3de3bc4918b5 100644 |
2057 | --- a/fs/hfsplus/btree.c |
2058 | +++ b/fs/hfsplus/btree.c |
2059 | @@ -454,14 +454,15 @@ void hfs_bmap_free(struct hfs_bnode *node) |
2060 | |
2061 | nidx -= len * 8; |
2062 | i = node->next; |
2063 | - hfs_bnode_put(node); |
2064 | if (!i) { |
2065 | /* panic */; |
2066 | pr_crit("unable to free bnode %u. " |
2067 | "bmap not found!\n", |
2068 | node->this); |
2069 | + hfs_bnode_put(node); |
2070 | return; |
2071 | } |
2072 | + hfs_bnode_put(node); |
2073 | node = hfs_bnode_find(tree, i); |
2074 | if (IS_ERR(node)) |
2075 | return; |
2076 | diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c |
2077 | index 86ac2c5b93fe..e0fe9a0f1bf1 100644 |
2078 | --- a/fs/nfs/flexfilelayout/flexfilelayout.c |
2079 | +++ b/fs/nfs/flexfilelayout/flexfilelayout.c |
2080 | @@ -1733,7 +1733,8 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr) |
2081 | if (fh) |
2082 | hdr->args.fh = fh; |
2083 | |
2084 | - if (!nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) |
2085 | + if (vers == 4 && |
2086 | + !nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) |
2087 | goto out_failed; |
2088 | |
2089 | /* |
2090 | @@ -1798,7 +1799,8 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync) |
2091 | if (fh) |
2092 | hdr->args.fh = fh; |
2093 | |
2094 | - if (!nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) |
2095 | + if (vers == 4 && |
2096 | + !nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) |
2097 | goto out_failed; |
2098 | |
2099 | /* |
2100 | diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c |
2101 | index 9f88188060db..4bf8d5854b27 100644 |
2102 | --- a/fs/ocfs2/export.c |
2103 | +++ b/fs/ocfs2/export.c |
2104 | @@ -125,10 +125,10 @@ check_err: |
2105 | |
2106 | check_gen: |
2107 | if (handle->ih_generation != inode->i_generation) { |
2108 | - iput(inode); |
2109 | trace_ocfs2_get_dentry_generation((unsigned long long)blkno, |
2110 | handle->ih_generation, |
2111 | inode->i_generation); |
2112 | + iput(inode); |
2113 | result = ERR_PTR(-ESTALE); |
2114 | goto bail; |
2115 | } |
2116 | diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c |
2117 | index 7eb3b0a6347e..f55f82ca3425 100644 |
2118 | --- a/fs/ocfs2/move_extents.c |
2119 | +++ b/fs/ocfs2/move_extents.c |
2120 | @@ -156,18 +156,14 @@ out: |
2121 | } |
2122 | |
2123 | /* |
2124 | - * lock allocators, and reserving appropriate number of bits for |
2125 | - * meta blocks and data clusters. |
2126 | - * |
2127 | - * in some cases, we don't need to reserve clusters, just let data_ac |
2128 | - * be NULL. |
2129 | + * lock allocator, and reserve appropriate number of bits for |
2130 | + * meta blocks. |
2131 | */ |
2132 | -static int ocfs2_lock_allocators_move_extents(struct inode *inode, |
2133 | +static int ocfs2_lock_meta_allocator_move_extents(struct inode *inode, |
2134 | struct ocfs2_extent_tree *et, |
2135 | u32 clusters_to_move, |
2136 | u32 extents_to_split, |
2137 | struct ocfs2_alloc_context **meta_ac, |
2138 | - struct ocfs2_alloc_context **data_ac, |
2139 | int extra_blocks, |
2140 | int *credits) |
2141 | { |
2142 | @@ -192,13 +188,6 @@ static int ocfs2_lock_allocators_move_extents(struct inode *inode, |
2143 | goto out; |
2144 | } |
2145 | |
2146 | - if (data_ac) { |
2147 | - ret = ocfs2_reserve_clusters(osb, clusters_to_move, data_ac); |
2148 | - if (ret) { |
2149 | - mlog_errno(ret); |
2150 | - goto out; |
2151 | - } |
2152 | - } |
2153 | |
2154 | *credits += ocfs2_calc_extend_credits(osb->sb, et->et_root_el); |
2155 | |
2156 | @@ -257,10 +246,10 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, |
2157 | } |
2158 | } |
2159 | |
2160 | - ret = ocfs2_lock_allocators_move_extents(inode, &context->et, *len, 1, |
2161 | - &context->meta_ac, |
2162 | - &context->data_ac, |
2163 | - extra_blocks, &credits); |
2164 | + ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et, |
2165 | + *len, 1, |
2166 | + &context->meta_ac, |
2167 | + extra_blocks, &credits); |
2168 | if (ret) { |
2169 | mlog_errno(ret); |
2170 | goto out; |
2171 | @@ -283,6 +272,21 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, |
2172 | } |
2173 | } |
2174 | |
2175 | + /* |
2176 | + * Make sure ocfs2_reserve_cluster is called after |
2177 | + * __ocfs2_flush_truncate_log, otherwise, dead lock may happen. |
2178 | + * |
2179 | + * If ocfs2_reserve_cluster is called |
2180 | + * before __ocfs2_flush_truncate_log, dead lock on global bitmap |
2181 | + * may happen. |
2182 | + * |
2183 | + */ |
2184 | + ret = ocfs2_reserve_clusters(osb, *len, &context->data_ac); |
2185 | + if (ret) { |
2186 | + mlog_errno(ret); |
2187 | + goto out_unlock_mutex; |
2188 | + } |
2189 | + |
2190 | handle = ocfs2_start_trans(osb, credits); |
2191 | if (IS_ERR(handle)) { |
2192 | ret = PTR_ERR(handle); |
2193 | @@ -600,9 +604,10 @@ static int ocfs2_move_extent(struct ocfs2_move_extents_context *context, |
2194 | } |
2195 | } |
2196 | |
2197 | - ret = ocfs2_lock_allocators_move_extents(inode, &context->et, len, 1, |
2198 | - &context->meta_ac, |
2199 | - NULL, extra_blocks, &credits); |
2200 | + ret = ocfs2_lock_meta_allocator_move_extents(inode, &context->et, |
2201 | + len, 1, |
2202 | + &context->meta_ac, |
2203 | + extra_blocks, &credits); |
2204 | if (ret) { |
2205 | mlog_errno(ret); |
2206 | goto out; |
2207 | diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c |
2208 | index f4fd2e72add4..03cd59375abe 100644 |
2209 | --- a/fs/pstore/ram.c |
2210 | +++ b/fs/pstore/ram.c |
2211 | @@ -806,17 +806,14 @@ static int ramoops_probe(struct platform_device *pdev) |
2212 | |
2213 | cxt->pstore.data = cxt; |
2214 | /* |
2215 | - * Console can handle any buffer size, so prefer LOG_LINE_MAX. If we |
2216 | - * have to handle dumps, we must have at least record_size buffer. And |
2217 | - * for ftrace, bufsize is irrelevant (if bufsize is 0, buf will be |
2218 | - * ZERO_SIZE_PTR). |
2219 | + * Since bufsize is only used for dmesg crash dumps, it |
2220 | + * must match the size of the dprz record (after PRZ header |
2221 | + * and ECC bytes have been accounted for). |
2222 | */ |
2223 | - if (cxt->console_size) |
2224 | - cxt->pstore.bufsize = 1024; /* LOG_LINE_MAX */ |
2225 | - cxt->pstore.bufsize = max(cxt->record_size, cxt->pstore.bufsize); |
2226 | - cxt->pstore.buf = kmalloc(cxt->pstore.bufsize, GFP_KERNEL); |
2227 | + cxt->pstore.bufsize = cxt->dprzs[0]->buffer_size; |
2228 | + cxt->pstore.buf = kzalloc(cxt->pstore.bufsize, GFP_KERNEL); |
2229 | if (!cxt->pstore.buf) { |
2230 | - pr_err("cannot allocate pstore buffer\n"); |
2231 | + pr_err("cannot allocate pstore crash dump buffer\n"); |
2232 | err = -ENOMEM; |
2233 | goto fail_clear; |
2234 | } |
2235 | diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c |
2236 | index 499a20a5a010..273736f41be3 100644 |
2237 | --- a/fs/sysv/inode.c |
2238 | +++ b/fs/sysv/inode.c |
2239 | @@ -275,7 +275,7 @@ static int __sysv_write_inode(struct inode *inode, int wait) |
2240 | } |
2241 | } |
2242 | brelse(bh); |
2243 | - return 0; |
2244 | + return err; |
2245 | } |
2246 | |
2247 | int sysv_write_inode(struct inode *inode, struct writeback_control *wbc) |
2248 | diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h |
2249 | index 34cf0fdd7dc7..610815e3f1aa 100644 |
2250 | --- a/include/linux/fscache-cache.h |
2251 | +++ b/include/linux/fscache-cache.h |
2252 | @@ -196,8 +196,7 @@ static inline void fscache_enqueue_retrieval(struct fscache_retrieval *op) |
2253 | static inline void fscache_retrieval_complete(struct fscache_retrieval *op, |
2254 | int n_pages) |
2255 | { |
2256 | - atomic_sub(n_pages, &op->n_pages); |
2257 | - if (atomic_read(&op->n_pages) <= 0) |
2258 | + if (atomic_sub_return_relaxed(n_pages, &op->n_pages) <= 0) |
2259 | fscache_op_complete(&op->op, false); |
2260 | } |
2261 | |
2262 | diff --git a/include/linux/pstore.h b/include/linux/pstore.h |
2263 | index a15bc4d48752..30fcec375a3a 100644 |
2264 | --- a/include/linux/pstore.h |
2265 | +++ b/include/linux/pstore.h |
2266 | @@ -90,7 +90,10 @@ struct pstore_record { |
2267 | * |
2268 | * @buf_lock: spinlock to serialize access to @buf |
2269 | * @buf: preallocated crash dump buffer |
2270 | - * @bufsize: size of @buf available for crash dump writes |
2271 | + * @bufsize: size of @buf available for crash dump bytes (must match |
2272 | + * smallest number of bytes available for writing to a |
2273 | + * backend entry, since compressed bytes don't take kindly |
2274 | + * to being truncated) |
2275 | * |
2276 | * @read_mutex: serializes @open, @read, @close, and @erase callbacks |
2277 | * @flags: bitfield of frontends the backend can accept writes for |
2278 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
2279 | index e6ef9cc05e60..60a2e7646985 100644 |
2280 | --- a/include/linux/skbuff.h |
2281 | +++ b/include/linux/skbuff.h |
2282 | @@ -1355,6 +1355,17 @@ static inline void skb_zcopy_abort(struct sk_buff *skb) |
2283 | } |
2284 | } |
2285 | |
2286 | +static inline void skb_mark_not_on_list(struct sk_buff *skb) |
2287 | +{ |
2288 | + skb->next = NULL; |
2289 | +} |
2290 | + |
2291 | +static inline void skb_list_del_init(struct sk_buff *skb) |
2292 | +{ |
2293 | + __list_del_entry(&skb->list); |
2294 | + skb_mark_not_on_list(skb); |
2295 | +} |
2296 | + |
2297 | /** |
2298 | * skb_queue_empty - check if a queue is empty |
2299 | * @list: queue head |
2300 | diff --git a/include/net/neighbour.h b/include/net/neighbour.h |
2301 | index 6c1eecd56a4d..beeeed126872 100644 |
2302 | --- a/include/net/neighbour.h |
2303 | +++ b/include/net/neighbour.h |
2304 | @@ -453,6 +453,7 @@ static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb) |
2305 | |
2306 | static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb) |
2307 | { |
2308 | + unsigned int hh_alen = 0; |
2309 | unsigned int seq; |
2310 | unsigned int hh_len; |
2311 | |
2312 | @@ -460,16 +461,33 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb |
2313 | seq = read_seqbegin(&hh->hh_lock); |
2314 | hh_len = hh->hh_len; |
2315 | if (likely(hh_len <= HH_DATA_MOD)) { |
2316 | - /* this is inlined by gcc */ |
2317 | - memcpy(skb->data - HH_DATA_MOD, hh->hh_data, HH_DATA_MOD); |
2318 | + hh_alen = HH_DATA_MOD; |
2319 | + |
2320 | + /* skb_push() would proceed silently if we have room for |
2321 | + * the unaligned size but not for the aligned size: |
2322 | + * check headroom explicitly. |
2323 | + */ |
2324 | + if (likely(skb_headroom(skb) >= HH_DATA_MOD)) { |
2325 | + /* this is inlined by gcc */ |
2326 | + memcpy(skb->data - HH_DATA_MOD, hh->hh_data, |
2327 | + HH_DATA_MOD); |
2328 | + } |
2329 | } else { |
2330 | - unsigned int hh_alen = HH_DATA_ALIGN(hh_len); |
2331 | + hh_alen = HH_DATA_ALIGN(hh_len); |
2332 | |
2333 | - memcpy(skb->data - hh_alen, hh->hh_data, hh_alen); |
2334 | + if (likely(skb_headroom(skb) >= hh_alen)) { |
2335 | + memcpy(skb->data - hh_alen, hh->hh_data, |
2336 | + hh_alen); |
2337 | + } |
2338 | } |
2339 | } while (read_seqretry(&hh->hh_lock, seq)); |
2340 | |
2341 | - skb_push(skb, hh_len); |
2342 | + if (WARN_ON_ONCE(skb_headroom(skb) < hh_alen)) { |
2343 | + kfree_skb(skb); |
2344 | + return NET_XMIT_DROP; |
2345 | + } |
2346 | + |
2347 | + __skb_push(skb, hh_len); |
2348 | return dev_queue_xmit(skb); |
2349 | } |
2350 | |
2351 | diff --git a/include/net/netfilter/ipv4/nf_nat_masquerade.h b/include/net/netfilter/ipv4/nf_nat_masquerade.h |
2352 | index cd24be4c4a99..13d55206bb9f 100644 |
2353 | --- a/include/net/netfilter/ipv4/nf_nat_masquerade.h |
2354 | +++ b/include/net/netfilter/ipv4/nf_nat_masquerade.h |
2355 | @@ -9,7 +9,7 @@ nf_nat_masquerade_ipv4(struct sk_buff *skb, unsigned int hooknum, |
2356 | const struct nf_nat_range2 *range, |
2357 | const struct net_device *out); |
2358 | |
2359 | -void nf_nat_masquerade_ipv4_register_notifier(void); |
2360 | +int nf_nat_masquerade_ipv4_register_notifier(void); |
2361 | void nf_nat_masquerade_ipv4_unregister_notifier(void); |
2362 | |
2363 | #endif /*_NF_NAT_MASQUERADE_IPV4_H_ */ |
2364 | diff --git a/include/net/netfilter/ipv6/nf_nat_masquerade.h b/include/net/netfilter/ipv6/nf_nat_masquerade.h |
2365 | index 0c3b5ebf0bb8..2917bf95c437 100644 |
2366 | --- a/include/net/netfilter/ipv6/nf_nat_masquerade.h |
2367 | +++ b/include/net/netfilter/ipv6/nf_nat_masquerade.h |
2368 | @@ -5,7 +5,7 @@ |
2369 | unsigned int |
2370 | nf_nat_masquerade_ipv6(struct sk_buff *skb, const struct nf_nat_range2 *range, |
2371 | const struct net_device *out); |
2372 | -void nf_nat_masquerade_ipv6_register_notifier(void); |
2373 | +int nf_nat_masquerade_ipv6_register_notifier(void); |
2374 | void nf_nat_masquerade_ipv6_unregister_notifier(void); |
2375 | |
2376 | #endif /* _NF_NAT_MASQUERADE_IPV6_H_ */ |
2377 | diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h |
2378 | index a11f93790476..feada358d872 100644 |
2379 | --- a/include/net/sctp/structs.h |
2380 | +++ b/include/net/sctp/structs.h |
2381 | @@ -2075,6 +2075,8 @@ struct sctp_association { |
2382 | |
2383 | __u64 abandoned_unsent[SCTP_PR_INDEX(MAX) + 1]; |
2384 | __u64 abandoned_sent[SCTP_PR_INDEX(MAX) + 1]; |
2385 | + |
2386 | + struct rcu_head rcu; |
2387 | }; |
2388 | |
2389 | |
2390 | diff --git a/include/xen/balloon.h b/include/xen/balloon.h |
2391 | index 61f410fd74e4..4914b93a23f2 100644 |
2392 | --- a/include/xen/balloon.h |
2393 | +++ b/include/xen/balloon.h |
2394 | @@ -44,8 +44,3 @@ static inline void xen_balloon_init(void) |
2395 | { |
2396 | } |
2397 | #endif |
2398 | - |
2399 | -#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG |
2400 | -struct resource; |
2401 | -void arch_xen_balloon_init(struct resource *hostmem_resource); |
2402 | -#endif |
2403 | diff --git a/init/initramfs.c b/init/initramfs.c |
2404 | index 640557788026..f6f4a1e4cd54 100644 |
2405 | --- a/init/initramfs.c |
2406 | +++ b/init/initramfs.c |
2407 | @@ -291,16 +291,6 @@ static int __init do_reset(void) |
2408 | return 1; |
2409 | } |
2410 | |
2411 | -static int __init maybe_link(void) |
2412 | -{ |
2413 | - if (nlink >= 2) { |
2414 | - char *old = find_link(major, minor, ino, mode, collected); |
2415 | - if (old) |
2416 | - return (ksys_link(old, collected) < 0) ? -1 : 1; |
2417 | - } |
2418 | - return 0; |
2419 | -} |
2420 | - |
2421 | static void __init clean_path(char *path, umode_t fmode) |
2422 | { |
2423 | struct kstat st; |
2424 | @@ -313,6 +303,18 @@ static void __init clean_path(char *path, umode_t fmode) |
2425 | } |
2426 | } |
2427 | |
2428 | +static int __init maybe_link(void) |
2429 | +{ |
2430 | + if (nlink >= 2) { |
2431 | + char *old = find_link(major, minor, ino, mode, collected); |
2432 | + if (old) { |
2433 | + clean_path(collected, 0); |
2434 | + return (ksys_link(old, collected) < 0) ? -1 : 1; |
2435 | + } |
2436 | + } |
2437 | + return 0; |
2438 | +} |
2439 | + |
2440 | static __initdata int wfd; |
2441 | |
2442 | static int __init do_name(void) |
2443 | diff --git a/kernel/bpf/local_storage.c b/kernel/bpf/local_storage.c |
2444 | index 830d7f095748..fc1605aee5ea 100644 |
2445 | --- a/kernel/bpf/local_storage.c |
2446 | +++ b/kernel/bpf/local_storage.c |
2447 | @@ -138,7 +138,8 @@ static int cgroup_storage_update_elem(struct bpf_map *map, void *_key, |
2448 | return -ENOENT; |
2449 | |
2450 | new = kmalloc_node(sizeof(struct bpf_storage_buffer) + |
2451 | - map->value_size, __GFP_ZERO | GFP_USER, |
2452 | + map->value_size, |
2453 | + __GFP_ZERO | GFP_ATOMIC | __GFP_NOWARN, |
2454 | map->numa_node); |
2455 | if (!new) |
2456 | return -ENOMEM; |
2457 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c |
2458 | index 5780876ac81a..56acfbb80104 100644 |
2459 | --- a/kernel/bpf/verifier.c |
2460 | +++ b/kernel/bpf/verifier.c |
2461 | @@ -5283,7 +5283,7 @@ static void adjust_subprog_starts(struct bpf_verifier_env *env, u32 off, u32 len |
2462 | return; |
2463 | /* NOTE: fake 'exit' subprog should be updated as well. */ |
2464 | for (i = 0; i <= env->subprog_cnt; i++) { |
2465 | - if (env->subprog_info[i].start < off) |
2466 | + if (env->subprog_info[i].start <= off) |
2467 | continue; |
2468 | env->subprog_info[i].start += len - 1; |
2469 | } |
2470 | diff --git a/kernel/kcov.c b/kernel/kcov.c |
2471 | index 3ebd09efe72a..97959d7b77e2 100644 |
2472 | --- a/kernel/kcov.c |
2473 | +++ b/kernel/kcov.c |
2474 | @@ -56,7 +56,7 @@ struct kcov { |
2475 | struct task_struct *t; |
2476 | }; |
2477 | |
2478 | -static bool check_kcov_mode(enum kcov_mode needed_mode, struct task_struct *t) |
2479 | +static notrace bool check_kcov_mode(enum kcov_mode needed_mode, struct task_struct *t) |
2480 | { |
2481 | unsigned int mode; |
2482 | |
2483 | @@ -78,7 +78,7 @@ static bool check_kcov_mode(enum kcov_mode needed_mode, struct task_struct *t) |
2484 | return mode == needed_mode; |
2485 | } |
2486 | |
2487 | -static unsigned long canonicalize_ip(unsigned long ip) |
2488 | +static notrace unsigned long canonicalize_ip(unsigned long ip) |
2489 | { |
2490 | #ifdef CONFIG_RANDOMIZE_BASE |
2491 | ip -= kaslr_offset(); |
2492 | diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c |
2493 | index 08fcfe440c63..9864a35c8bb5 100644 |
2494 | --- a/kernel/trace/bpf_trace.c |
2495 | +++ b/kernel/trace/bpf_trace.c |
2496 | @@ -196,11 +196,13 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, |
2497 | i++; |
2498 | } else if (fmt[i] == 'p' || fmt[i] == 's') { |
2499 | mod[fmt_cnt]++; |
2500 | - i++; |
2501 | - if (!isspace(fmt[i]) && !ispunct(fmt[i]) && fmt[i] != 0) |
2502 | + /* disallow any further format extensions */ |
2503 | + if (fmt[i + 1] != 0 && |
2504 | + !isspace(fmt[i + 1]) && |
2505 | + !ispunct(fmt[i + 1])) |
2506 | return -EINVAL; |
2507 | fmt_cnt++; |
2508 | - if (fmt[i - 1] == 's') { |
2509 | + if (fmt[i] == 's') { |
2510 | if (str_seen) |
2511 | /* allow only one '%s' per fmt string */ |
2512 | return -EINVAL; |
2513 | diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
2514 | index 70935ed91125..14afeeb7d6ef 100644 |
2515 | --- a/lib/debugobjects.c |
2516 | +++ b/lib/debugobjects.c |
2517 | @@ -135,7 +135,6 @@ static void fill_pool(void) |
2518 | if (!new) |
2519 | return; |
2520 | |
2521 | - kmemleak_ignore(new); |
2522 | raw_spin_lock_irqsave(&pool_lock, flags); |
2523 | hlist_add_head(&new->node, &obj_pool); |
2524 | debug_objects_allocated++; |
2525 | @@ -1128,7 +1127,6 @@ static int __init debug_objects_replace_static_objects(void) |
2526 | obj = kmem_cache_zalloc(obj_cache, GFP_KERNEL); |
2527 | if (!obj) |
2528 | goto free; |
2529 | - kmemleak_ignore(obj); |
2530 | hlist_add_head(&obj->node, &objects); |
2531 | } |
2532 | |
2533 | @@ -1184,7 +1182,8 @@ void __init debug_objects_mem_init(void) |
2534 | |
2535 | obj_cache = kmem_cache_create("debug_objects_cache", |
2536 | sizeof (struct debug_obj), 0, |
2537 | - SLAB_DEBUG_OBJECTS, NULL); |
2538 | + SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, |
2539 | + NULL); |
2540 | |
2541 | if (!obj_cache || debug_objects_replace_static_objects()) { |
2542 | debug_objects_enabled = 0; |
2543 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
2544 | index b721631d78ab..6a62b2421cdf 100644 |
2545 | --- a/mm/page_alloc.c |
2546 | +++ b/mm/page_alloc.c |
2547 | @@ -5733,8 +5733,10 @@ void __meminit init_currently_empty_zone(struct zone *zone, |
2548 | unsigned long size) |
2549 | { |
2550 | struct pglist_data *pgdat = zone->zone_pgdat; |
2551 | + int zone_idx = zone_idx(zone) + 1; |
2552 | |
2553 | - pgdat->nr_zones = zone_idx(zone) + 1; |
2554 | + if (zone_idx > pgdat->nr_zones) |
2555 | + pgdat->nr_zones = zone_idx; |
2556 | |
2557 | zone->zone_start_pfn = zone_start_pfn; |
2558 | |
2559 | diff --git a/net/core/dev.c b/net/core/dev.c |
2560 | index 22af88c47756..1f1aae27d41f 100644 |
2561 | --- a/net/core/dev.c |
2562 | +++ b/net/core/dev.c |
2563 | @@ -2161,6 +2161,20 @@ static bool remove_xps_queue_cpu(struct net_device *dev, |
2564 | return active; |
2565 | } |
2566 | |
2567 | +static void reset_xps_maps(struct net_device *dev, |
2568 | + struct xps_dev_maps *dev_maps, |
2569 | + bool is_rxqs_map) |
2570 | +{ |
2571 | + if (is_rxqs_map) { |
2572 | + static_key_slow_dec_cpuslocked(&xps_rxqs_needed); |
2573 | + RCU_INIT_POINTER(dev->xps_rxqs_map, NULL); |
2574 | + } else { |
2575 | + RCU_INIT_POINTER(dev->xps_cpus_map, NULL); |
2576 | + } |
2577 | + static_key_slow_dec_cpuslocked(&xps_needed); |
2578 | + kfree_rcu(dev_maps, rcu); |
2579 | +} |
2580 | + |
2581 | static void clean_xps_maps(struct net_device *dev, const unsigned long *mask, |
2582 | struct xps_dev_maps *dev_maps, unsigned int nr_ids, |
2583 | u16 offset, u16 count, bool is_rxqs_map) |
2584 | @@ -2172,18 +2186,15 @@ static void clean_xps_maps(struct net_device *dev, const unsigned long *mask, |
2585 | j < nr_ids;) |
2586 | active |= remove_xps_queue_cpu(dev, dev_maps, j, offset, |
2587 | count); |
2588 | - if (!active) { |
2589 | - if (is_rxqs_map) { |
2590 | - RCU_INIT_POINTER(dev->xps_rxqs_map, NULL); |
2591 | - } else { |
2592 | - RCU_INIT_POINTER(dev->xps_cpus_map, NULL); |
2593 | + if (!active) |
2594 | + reset_xps_maps(dev, dev_maps, is_rxqs_map); |
2595 | |
2596 | - for (i = offset + (count - 1); count--; i--) |
2597 | - netdev_queue_numa_node_write( |
2598 | - netdev_get_tx_queue(dev, i), |
2599 | - NUMA_NO_NODE); |
2600 | + if (!is_rxqs_map) { |
2601 | + for (i = offset + (count - 1); count--; i--) { |
2602 | + netdev_queue_numa_node_write( |
2603 | + netdev_get_tx_queue(dev, i), |
2604 | + NUMA_NO_NODE); |
2605 | } |
2606 | - kfree_rcu(dev_maps, rcu); |
2607 | } |
2608 | } |
2609 | |
2610 | @@ -2220,10 +2231,6 @@ static void netif_reset_xps_queues(struct net_device *dev, u16 offset, |
2611 | false); |
2612 | |
2613 | out_no_maps: |
2614 | - if (static_key_enabled(&xps_rxqs_needed)) |
2615 | - static_key_slow_dec_cpuslocked(&xps_rxqs_needed); |
2616 | - |
2617 | - static_key_slow_dec_cpuslocked(&xps_needed); |
2618 | mutex_unlock(&xps_map_mutex); |
2619 | cpus_read_unlock(); |
2620 | } |
2621 | @@ -2341,9 +2348,12 @@ int __netif_set_xps_queue(struct net_device *dev, const unsigned long *mask, |
2622 | if (!new_dev_maps) |
2623 | goto out_no_new_maps; |
2624 | |
2625 | - static_key_slow_inc_cpuslocked(&xps_needed); |
2626 | - if (is_rxqs_map) |
2627 | - static_key_slow_inc_cpuslocked(&xps_rxqs_needed); |
2628 | + if (!dev_maps) { |
2629 | + /* Increment static keys at most once per type */ |
2630 | + static_key_slow_inc_cpuslocked(&xps_needed); |
2631 | + if (is_rxqs_map) |
2632 | + static_key_slow_inc_cpuslocked(&xps_rxqs_needed); |
2633 | + } |
2634 | |
2635 | for (j = -1; j = netif_attrmask_next(j, possible_mask, nr_ids), |
2636 | j < nr_ids;) { |
2637 | @@ -2441,13 +2451,8 @@ out_no_new_maps: |
2638 | } |
2639 | |
2640 | /* free map if not active */ |
2641 | - if (!active) { |
2642 | - if (is_rxqs_map) |
2643 | - RCU_INIT_POINTER(dev->xps_rxqs_map, NULL); |
2644 | - else |
2645 | - RCU_INIT_POINTER(dev->xps_cpus_map, NULL); |
2646 | - kfree_rcu(dev_maps, rcu); |
2647 | - } |
2648 | + if (!active) |
2649 | + reset_xps_maps(dev, dev_maps, is_rxqs_map); |
2650 | |
2651 | out_no_maps: |
2652 | mutex_unlock(&xps_map_mutex); |
2653 | @@ -4981,7 +4986,7 @@ static void __netif_receive_skb_list_core(struct list_head *head, bool pfmemallo |
2654 | struct net_device *orig_dev = skb->dev; |
2655 | struct packet_type *pt_prev = NULL; |
2656 | |
2657 | - list_del(&skb->list); |
2658 | + skb_list_del_init(skb); |
2659 | __netif_receive_skb_core(skb, pfmemalloc, &pt_prev); |
2660 | if (!pt_prev) |
2661 | continue; |
2662 | @@ -5137,7 +5142,7 @@ static void netif_receive_skb_list_internal(struct list_head *head) |
2663 | INIT_LIST_HEAD(&sublist); |
2664 | list_for_each_entry_safe(skb, next, head, list) { |
2665 | net_timestamp_check(netdev_tstamp_prequeue, skb); |
2666 | - list_del(&skb->list); |
2667 | + skb_list_del_init(skb); |
2668 | if (!skb_defer_rx_timestamp(skb)) |
2669 | list_add_tail(&skb->list, &sublist); |
2670 | } |
2671 | @@ -5148,7 +5153,7 @@ static void netif_receive_skb_list_internal(struct list_head *head) |
2672 | rcu_read_lock(); |
2673 | list_for_each_entry_safe(skb, next, head, list) { |
2674 | xdp_prog = rcu_dereference(skb->dev->xdp_prog); |
2675 | - list_del(&skb->list); |
2676 | + skb_list_del_init(skb); |
2677 | if (do_xdp_generic(xdp_prog, skb) == XDP_PASS) |
2678 | list_add_tail(&skb->list, &sublist); |
2679 | } |
2680 | @@ -5167,7 +5172,7 @@ static void netif_receive_skb_list_internal(struct list_head *head) |
2681 | |
2682 | if (cpu >= 0) { |
2683 | /* Will be handled, remove from list */ |
2684 | - list_del(&skb->list); |
2685 | + skb_list_del_init(skb); |
2686 | enqueue_to_backlog(skb, cpu, &rflow->last_qtail); |
2687 | } |
2688 | } |
2689 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
2690 | index 6e5d61a20a70..ebde98b565e9 100644 |
2691 | --- a/net/core/rtnetlink.c |
2692 | +++ b/net/core/rtnetlink.c |
2693 | @@ -3730,6 +3730,9 @@ int ndo_dflt_fdb_dump(struct sk_buff *skb, |
2694 | { |
2695 | int err; |
2696 | |
2697 | + if (dev->type != ARPHRD_ETHER) |
2698 | + return -EINVAL; |
2699 | + |
2700 | netif_addr_lock_bh(dev); |
2701 | err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->uc); |
2702 | if (err) |
2703 | diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c |
2704 | index cb8fa5d7afe1..f686d7761acb 100644 |
2705 | --- a/net/ipv4/ip_fragment.c |
2706 | +++ b/net/ipv4/ip_fragment.c |
2707 | @@ -513,6 +513,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb, |
2708 | struct rb_node *rbn; |
2709 | int len; |
2710 | int ihlen; |
2711 | + int delta; |
2712 | int err; |
2713 | u8 ecn; |
2714 | |
2715 | @@ -554,10 +555,16 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb, |
2716 | if (len > 65535) |
2717 | goto out_oversize; |
2718 | |
2719 | + delta = - head->truesize; |
2720 | + |
2721 | /* Head of list must not be cloned. */ |
2722 | if (skb_unclone(head, GFP_ATOMIC)) |
2723 | goto out_nomem; |
2724 | |
2725 | + delta += head->truesize; |
2726 | + if (delta) |
2727 | + add_frag_mem_limit(qp->q.net, delta); |
2728 | + |
2729 | /* If the first fragment is fragmented itself, we split |
2730 | * it to two chunks: the first with data and paged part |
2731 | * and the second, holding only fragments. */ |
2732 | diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c |
2733 | index 3196cf58f418..27c863f6dd83 100644 |
2734 | --- a/net/ipv4/ip_input.c |
2735 | +++ b/net/ipv4/ip_input.c |
2736 | @@ -551,7 +551,7 @@ static void ip_list_rcv_finish(struct net *net, struct sock *sk, |
2737 | list_for_each_entry_safe(skb, next, head, list) { |
2738 | struct dst_entry *dst; |
2739 | |
2740 | - list_del(&skb->list); |
2741 | + skb_list_del_init(skb); |
2742 | /* if ingress device is enslaved to an L3 master device pass the |
2743 | * skb to its handler for processing |
2744 | */ |
2745 | @@ -598,7 +598,7 @@ void ip_list_rcv(struct list_head *head, struct packet_type *pt, |
2746 | struct net_device *dev = skb->dev; |
2747 | struct net *net = dev_net(dev); |
2748 | |
2749 | - list_del(&skb->list); |
2750 | + skb_list_del_init(skb); |
2751 | skb = ip_rcv_core(skb, net); |
2752 | if (skb == NULL) |
2753 | continue; |
2754 | diff --git a/net/ipv4/netfilter/ipt_MASQUERADE.c b/net/ipv4/netfilter/ipt_MASQUERADE.c |
2755 | index ce1512b02cb2..fd3f9e8a74da 100644 |
2756 | --- a/net/ipv4/netfilter/ipt_MASQUERADE.c |
2757 | +++ b/net/ipv4/netfilter/ipt_MASQUERADE.c |
2758 | @@ -81,9 +81,12 @@ static int __init masquerade_tg_init(void) |
2759 | int ret; |
2760 | |
2761 | ret = xt_register_target(&masquerade_tg_reg); |
2762 | + if (ret) |
2763 | + return ret; |
2764 | |
2765 | - if (ret == 0) |
2766 | - nf_nat_masquerade_ipv4_register_notifier(); |
2767 | + ret = nf_nat_masquerade_ipv4_register_notifier(); |
2768 | + if (ret) |
2769 | + xt_unregister_target(&masquerade_tg_reg); |
2770 | |
2771 | return ret; |
2772 | } |
2773 | diff --git a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c |
2774 | index ad3aeff152ed..4c7fcd32f8e6 100644 |
2775 | --- a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c |
2776 | +++ b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c |
2777 | @@ -131,28 +131,50 @@ static struct notifier_block masq_inet_notifier = { |
2778 | .notifier_call = masq_inet_event, |
2779 | }; |
2780 | |
2781 | -static atomic_t masquerade_notifier_refcount = ATOMIC_INIT(0); |
2782 | +static int masq_refcnt; |
2783 | +static DEFINE_MUTEX(masq_mutex); |
2784 | |
2785 | -void nf_nat_masquerade_ipv4_register_notifier(void) |
2786 | +int nf_nat_masquerade_ipv4_register_notifier(void) |
2787 | { |
2788 | + int ret = 0; |
2789 | + |
2790 | + mutex_lock(&masq_mutex); |
2791 | /* check if the notifier was already set */ |
2792 | - if (atomic_inc_return(&masquerade_notifier_refcount) > 1) |
2793 | - return; |
2794 | + if (++masq_refcnt > 1) |
2795 | + goto out_unlock; |
2796 | |
2797 | /* Register for device down reports */ |
2798 | - register_netdevice_notifier(&masq_dev_notifier); |
2799 | + ret = register_netdevice_notifier(&masq_dev_notifier); |
2800 | + if (ret) |
2801 | + goto err_dec; |
2802 | /* Register IP address change reports */ |
2803 | - register_inetaddr_notifier(&masq_inet_notifier); |
2804 | + ret = register_inetaddr_notifier(&masq_inet_notifier); |
2805 | + if (ret) |
2806 | + goto err_unregister; |
2807 | + |
2808 | + mutex_unlock(&masq_mutex); |
2809 | + return ret; |
2810 | + |
2811 | +err_unregister: |
2812 | + unregister_netdevice_notifier(&masq_dev_notifier); |
2813 | +err_dec: |
2814 | + masq_refcnt--; |
2815 | +out_unlock: |
2816 | + mutex_unlock(&masq_mutex); |
2817 | + return ret; |
2818 | } |
2819 | EXPORT_SYMBOL_GPL(nf_nat_masquerade_ipv4_register_notifier); |
2820 | |
2821 | void nf_nat_masquerade_ipv4_unregister_notifier(void) |
2822 | { |
2823 | + mutex_lock(&masq_mutex); |
2824 | /* check if the notifier still has clients */ |
2825 | - if (atomic_dec_return(&masquerade_notifier_refcount) > 0) |
2826 | - return; |
2827 | + if (--masq_refcnt > 0) |
2828 | + goto out_unlock; |
2829 | |
2830 | unregister_netdevice_notifier(&masq_dev_notifier); |
2831 | unregister_inetaddr_notifier(&masq_inet_notifier); |
2832 | +out_unlock: |
2833 | + mutex_unlock(&masq_mutex); |
2834 | } |
2835 | EXPORT_SYMBOL_GPL(nf_nat_masquerade_ipv4_unregister_notifier); |
2836 | diff --git a/net/ipv4/netfilter/nft_masq_ipv4.c b/net/ipv4/netfilter/nft_masq_ipv4.c |
2837 | index f1193e1e928a..6847de1d1db8 100644 |
2838 | --- a/net/ipv4/netfilter/nft_masq_ipv4.c |
2839 | +++ b/net/ipv4/netfilter/nft_masq_ipv4.c |
2840 | @@ -69,7 +69,9 @@ static int __init nft_masq_ipv4_module_init(void) |
2841 | if (ret < 0) |
2842 | return ret; |
2843 | |
2844 | - nf_nat_masquerade_ipv4_register_notifier(); |
2845 | + ret = nf_nat_masquerade_ipv4_register_notifier(); |
2846 | + if (ret) |
2847 | + nft_unregister_expr(&nft_masq_ipv4_type); |
2848 | |
2849 | return ret; |
2850 | } |
2851 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
2852 | index 68f65ddf9e3c..bd134e3a0473 100644 |
2853 | --- a/net/ipv4/tcp_output.c |
2854 | +++ b/net/ipv4/tcp_output.c |
2855 | @@ -1902,7 +1902,9 @@ static int tso_fragment(struct sock *sk, enum tcp_queue tcp_queue, |
2856 | * This algorithm is from John Heffner. |
2857 | */ |
2858 | static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, |
2859 | - bool *is_cwnd_limited, u32 max_segs) |
2860 | + bool *is_cwnd_limited, |
2861 | + bool *is_rwnd_limited, |
2862 | + u32 max_segs) |
2863 | { |
2864 | const struct inet_connection_sock *icsk = inet_csk(sk); |
2865 | u32 age, send_win, cong_win, limit, in_flight; |
2866 | @@ -1910,9 +1912,6 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, |
2867 | struct sk_buff *head; |
2868 | int win_divisor; |
2869 | |
2870 | - if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) |
2871 | - goto send_now; |
2872 | - |
2873 | if (icsk->icsk_ca_state >= TCP_CA_Recovery) |
2874 | goto send_now; |
2875 | |
2876 | @@ -1971,10 +1970,27 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, |
2877 | if (age < (tp->srtt_us >> 4)) |
2878 | goto send_now; |
2879 | |
2880 | - /* Ok, it looks like it is advisable to defer. */ |
2881 | + /* Ok, it looks like it is advisable to defer. |
2882 | + * Three cases are tracked : |
2883 | + * 1) We are cwnd-limited |
2884 | + * 2) We are rwnd-limited |
2885 | + * 3) We are application limited. |
2886 | + */ |
2887 | + if (cong_win < send_win) { |
2888 | + if (cong_win <= skb->len) { |
2889 | + *is_cwnd_limited = true; |
2890 | + return true; |
2891 | + } |
2892 | + } else { |
2893 | + if (send_win <= skb->len) { |
2894 | + *is_rwnd_limited = true; |
2895 | + return true; |
2896 | + } |
2897 | + } |
2898 | |
2899 | - if (cong_win < send_win && cong_win <= skb->len) |
2900 | - *is_cwnd_limited = true; |
2901 | + /* If this packet won't get more data, do not wait. */ |
2902 | + if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) |
2903 | + goto send_now; |
2904 | |
2905 | return true; |
2906 | |
2907 | @@ -2338,7 +2354,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, |
2908 | } else { |
2909 | if (!push_one && |
2910 | tcp_tso_should_defer(sk, skb, &is_cwnd_limited, |
2911 | - max_segs)) |
2912 | + &is_rwnd_limited, max_segs)) |
2913 | break; |
2914 | } |
2915 | |
2916 | @@ -2476,15 +2492,18 @@ void tcp_send_loss_probe(struct sock *sk) |
2917 | goto rearm_timer; |
2918 | } |
2919 | skb = skb_rb_last(&sk->tcp_rtx_queue); |
2920 | + if (unlikely(!skb)) { |
2921 | + WARN_ONCE(tp->packets_out, |
2922 | + "invalid inflight: %u state %u cwnd %u mss %d\n", |
2923 | + tp->packets_out, sk->sk_state, tp->snd_cwnd, mss); |
2924 | + inet_csk(sk)->icsk_pending = 0; |
2925 | + return; |
2926 | + } |
2927 | |
2928 | /* At most one outstanding TLP retransmission. */ |
2929 | if (tp->tlp_high_seq) |
2930 | goto rearm_timer; |
2931 | |
2932 | - /* Retransmit last segment. */ |
2933 | - if (WARN_ON(!skb)) |
2934 | - goto rearm_timer; |
2935 | - |
2936 | if (skb_still_in_host_queue(sk, skb)) |
2937 | goto rearm_timer; |
2938 | |
2939 | diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c |
2940 | index 6242682be876..6b74523fc1c4 100644 |
2941 | --- a/net/ipv6/ip6_input.c |
2942 | +++ b/net/ipv6/ip6_input.c |
2943 | @@ -95,7 +95,7 @@ static void ip6_list_rcv_finish(struct net *net, struct sock *sk, |
2944 | list_for_each_entry_safe(skb, next, head, list) { |
2945 | struct dst_entry *dst; |
2946 | |
2947 | - list_del(&skb->list); |
2948 | + skb_list_del_init(skb); |
2949 | /* if ingress device is enslaved to an L3 master device pass the |
2950 | * skb to its handler for processing |
2951 | */ |
2952 | @@ -295,7 +295,7 @@ void ipv6_list_rcv(struct list_head *head, struct packet_type *pt, |
2953 | struct net_device *dev = skb->dev; |
2954 | struct net *net = dev_net(dev); |
2955 | |
2956 | - list_del(&skb->list); |
2957 | + skb_list_del_init(skb); |
2958 | skb = ip6_rcv_core(skb, dev, net); |
2959 | if (skb == NULL) |
2960 | continue; |
2961 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c |
2962 | index f9f8f554d141..2694def1e72c 100644 |
2963 | --- a/net/ipv6/ip6_output.c |
2964 | +++ b/net/ipv6/ip6_output.c |
2965 | @@ -195,37 +195,37 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, |
2966 | const struct ipv6_pinfo *np = inet6_sk(sk); |
2967 | struct in6_addr *first_hop = &fl6->daddr; |
2968 | struct dst_entry *dst = skb_dst(skb); |
2969 | + unsigned int head_room; |
2970 | struct ipv6hdr *hdr; |
2971 | u8 proto = fl6->flowi6_proto; |
2972 | int seg_len = skb->len; |
2973 | int hlimit = -1; |
2974 | u32 mtu; |
2975 | |
2976 | - if (opt) { |
2977 | - unsigned int head_room; |
2978 | + head_room = sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev); |
2979 | + if (opt) |
2980 | + head_room += opt->opt_nflen + opt->opt_flen; |
2981 | |
2982 | - /* First: exthdrs may take lots of space (~8K for now) |
2983 | - MAX_HEADER is not enough. |
2984 | - */ |
2985 | - head_room = opt->opt_nflen + opt->opt_flen; |
2986 | - seg_len += head_room; |
2987 | - head_room += sizeof(struct ipv6hdr) + LL_RESERVED_SPACE(dst->dev); |
2988 | - |
2989 | - if (skb_headroom(skb) < head_room) { |
2990 | - struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
2991 | - if (!skb2) { |
2992 | - IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
2993 | - IPSTATS_MIB_OUTDISCARDS); |
2994 | - kfree_skb(skb); |
2995 | - return -ENOBUFS; |
2996 | - } |
2997 | - if (skb->sk) |
2998 | - skb_set_owner_w(skb2, skb->sk); |
2999 | - consume_skb(skb); |
3000 | - skb = skb2; |
3001 | + if (unlikely(skb_headroom(skb) < head_room)) { |
3002 | + struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
3003 | + if (!skb2) { |
3004 | + IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
3005 | + IPSTATS_MIB_OUTDISCARDS); |
3006 | + kfree_skb(skb); |
3007 | + return -ENOBUFS; |
3008 | } |
3009 | + if (skb->sk) |
3010 | + skb_set_owner_w(skb2, skb->sk); |
3011 | + consume_skb(skb); |
3012 | + skb = skb2; |
3013 | + } |
3014 | + |
3015 | + if (opt) { |
3016 | + seg_len += opt->opt_nflen + opt->opt_flen; |
3017 | + |
3018 | if (opt->opt_flen) |
3019 | ipv6_push_frag_opts(skb, opt, &proto); |
3020 | + |
3021 | if (opt->opt_nflen) |
3022 | ipv6_push_nfrag_opts(skb, opt, &proto, &first_hop, |
3023 | &fl6->saddr); |
3024 | diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c |
3025 | index 5ae8e1c51079..8b075f0bc351 100644 |
3026 | --- a/net/ipv6/netfilter.c |
3027 | +++ b/net/ipv6/netfilter.c |
3028 | @@ -24,7 +24,8 @@ int ip6_route_me_harder(struct net *net, struct sk_buff *skb) |
3029 | unsigned int hh_len; |
3030 | struct dst_entry *dst; |
3031 | struct flowi6 fl6 = { |
3032 | - .flowi6_oif = sk ? sk->sk_bound_dev_if : 0, |
3033 | + .flowi6_oif = sk && sk->sk_bound_dev_if ? sk->sk_bound_dev_if : |
3034 | + rt6_need_strict(&iph->daddr) ? skb_dst(skb)->dev->ifindex : 0, |
3035 | .flowi6_mark = skb->mark, |
3036 | .flowi6_uid = sock_net_uid(net, sk), |
3037 | .daddr = iph->daddr, |
3038 | diff --git a/net/ipv6/netfilter/ip6t_MASQUERADE.c b/net/ipv6/netfilter/ip6t_MASQUERADE.c |
3039 | index 491f808e356a..29c7f1915a96 100644 |
3040 | --- a/net/ipv6/netfilter/ip6t_MASQUERADE.c |
3041 | +++ b/net/ipv6/netfilter/ip6t_MASQUERADE.c |
3042 | @@ -58,8 +58,12 @@ static int __init masquerade_tg6_init(void) |
3043 | int err; |
3044 | |
3045 | err = xt_register_target(&masquerade_tg6_reg); |
3046 | - if (err == 0) |
3047 | - nf_nat_masquerade_ipv6_register_notifier(); |
3048 | + if (err) |
3049 | + return err; |
3050 | + |
3051 | + err = nf_nat_masquerade_ipv6_register_notifier(); |
3052 | + if (err) |
3053 | + xt_unregister_target(&masquerade_tg6_reg); |
3054 | |
3055 | return err; |
3056 | } |
3057 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c |
3058 | index f76bd4d15704..043ed8eb0ab9 100644 |
3059 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c |
3060 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c |
3061 | @@ -341,7 +341,7 @@ static bool |
3062 | nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_device *dev) |
3063 | { |
3064 | struct sk_buff *fp, *head = fq->q.fragments; |
3065 | - int payload_len; |
3066 | + int payload_len, delta; |
3067 | u8 ecn; |
3068 | |
3069 | inet_frag_kill(&fq->q); |
3070 | @@ -363,10 +363,16 @@ nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_devic |
3071 | return false; |
3072 | } |
3073 | |
3074 | + delta = - head->truesize; |
3075 | + |
3076 | /* Head of list must not be cloned. */ |
3077 | if (skb_unclone(head, GFP_ATOMIC)) |
3078 | return false; |
3079 | |
3080 | + delta += head->truesize; |
3081 | + if (delta) |
3082 | + add_frag_mem_limit(fq->q.net, delta); |
3083 | + |
3084 | /* If the first fragment is fragmented itself, we split |
3085 | * it to two chunks: the first with data and paged part |
3086 | * and the second, holding only fragments. */ |
3087 | diff --git a/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c b/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c |
3088 | index e6eb7cf9b54f..37b1d413c825 100644 |
3089 | --- a/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c |
3090 | +++ b/net/ipv6/netfilter/nf_nat_masquerade_ipv6.c |
3091 | @@ -120,8 +120,8 @@ static void iterate_cleanup_work(struct work_struct *work) |
3092 | * of ipv6 addresses being deleted), we also need to add an upper |
3093 | * limit to the number of queued work items. |
3094 | */ |
3095 | -static int masq_inet_event(struct notifier_block *this, |
3096 | - unsigned long event, void *ptr) |
3097 | +static int masq_inet6_event(struct notifier_block *this, |
3098 | + unsigned long event, void *ptr) |
3099 | { |
3100 | struct inet6_ifaddr *ifa = ptr; |
3101 | const struct net_device *dev; |
3102 | @@ -158,30 +158,53 @@ static int masq_inet_event(struct notifier_block *this, |
3103 | return NOTIFY_DONE; |
3104 | } |
3105 | |
3106 | -static struct notifier_block masq_inet_notifier = { |
3107 | - .notifier_call = masq_inet_event, |
3108 | +static struct notifier_block masq_inet6_notifier = { |
3109 | + .notifier_call = masq_inet6_event, |
3110 | }; |
3111 | |
3112 | -static atomic_t masquerade_notifier_refcount = ATOMIC_INIT(0); |
3113 | +static int masq_refcnt; |
3114 | +static DEFINE_MUTEX(masq_mutex); |
3115 | |
3116 | -void nf_nat_masquerade_ipv6_register_notifier(void) |
3117 | +int nf_nat_masquerade_ipv6_register_notifier(void) |
3118 | { |
3119 | + int ret = 0; |
3120 | + |
3121 | + mutex_lock(&masq_mutex); |
3122 | /* check if the notifier is already set */ |
3123 | - if (atomic_inc_return(&masquerade_notifier_refcount) > 1) |
3124 | - return; |
3125 | + if (++masq_refcnt > 1) |
3126 | + goto out_unlock; |
3127 | + |
3128 | + ret = register_netdevice_notifier(&masq_dev_notifier); |
3129 | + if (ret) |
3130 | + goto err_dec; |
3131 | + |
3132 | + ret = register_inet6addr_notifier(&masq_inet6_notifier); |
3133 | + if (ret) |
3134 | + goto err_unregister; |
3135 | |
3136 | - register_netdevice_notifier(&masq_dev_notifier); |
3137 | - register_inet6addr_notifier(&masq_inet_notifier); |
3138 | + mutex_unlock(&masq_mutex); |
3139 | + return ret; |
3140 | + |
3141 | +err_unregister: |
3142 | + unregister_netdevice_notifier(&masq_dev_notifier); |
3143 | +err_dec: |
3144 | + masq_refcnt--; |
3145 | +out_unlock: |
3146 | + mutex_unlock(&masq_mutex); |
3147 | + return ret; |
3148 | } |
3149 | EXPORT_SYMBOL_GPL(nf_nat_masquerade_ipv6_register_notifier); |
3150 | |
3151 | void nf_nat_masquerade_ipv6_unregister_notifier(void) |
3152 | { |
3153 | + mutex_lock(&masq_mutex); |
3154 | /* check if the notifier still has clients */ |
3155 | - if (atomic_dec_return(&masquerade_notifier_refcount) > 0) |
3156 | - return; |
3157 | + if (--masq_refcnt > 0) |
3158 | + goto out_unlock; |
3159 | |
3160 | - unregister_inet6addr_notifier(&masq_inet_notifier); |
3161 | + unregister_inet6addr_notifier(&masq_inet6_notifier); |
3162 | unregister_netdevice_notifier(&masq_dev_notifier); |
3163 | +out_unlock: |
3164 | + mutex_unlock(&masq_mutex); |
3165 | } |
3166 | EXPORT_SYMBOL_GPL(nf_nat_masquerade_ipv6_unregister_notifier); |
3167 | diff --git a/net/ipv6/netfilter/nft_masq_ipv6.c b/net/ipv6/netfilter/nft_masq_ipv6.c |
3168 | index dd0122f3cffe..e06c82e9dfcd 100644 |
3169 | --- a/net/ipv6/netfilter/nft_masq_ipv6.c |
3170 | +++ b/net/ipv6/netfilter/nft_masq_ipv6.c |
3171 | @@ -70,7 +70,9 @@ static int __init nft_masq_ipv6_module_init(void) |
3172 | if (ret < 0) |
3173 | return ret; |
3174 | |
3175 | - nf_nat_masquerade_ipv6_register_notifier(); |
3176 | + ret = nf_nat_masquerade_ipv6_register_notifier(); |
3177 | + if (ret) |
3178 | + nft_unregister_expr(&nft_masq_ipv6_type); |
3179 | |
3180 | return ret; |
3181 | } |
3182 | diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c |
3183 | index 5c5b4f79296e..d3fd2d7e5aa4 100644 |
3184 | --- a/net/ipv6/reassembly.c |
3185 | +++ b/net/ipv6/reassembly.c |
3186 | @@ -281,7 +281,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, |
3187 | { |
3188 | struct net *net = container_of(fq->q.net, struct net, ipv6.frags); |
3189 | struct sk_buff *fp, *head = fq->q.fragments; |
3190 | - int payload_len; |
3191 | + int payload_len, delta; |
3192 | unsigned int nhoff; |
3193 | int sum_truesize; |
3194 | u8 ecn; |
3195 | @@ -322,10 +322,16 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, |
3196 | if (payload_len > IPV6_MAXPLEN) |
3197 | goto out_oversize; |
3198 | |
3199 | + delta = - head->truesize; |
3200 | + |
3201 | /* Head of list must not be cloned. */ |
3202 | if (skb_unclone(head, GFP_ATOMIC)) |
3203 | goto out_oom; |
3204 | |
3205 | + delta += head->truesize; |
3206 | + if (delta) |
3207 | + add_frag_mem_limit(fq->q.net, delta); |
3208 | + |
3209 | /* If the first fragment is fragmented itself, we split |
3210 | * it to two chunks: the first with data and paged part |
3211 | * and the second, holding only fragments. */ |
3212 | diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c |
3213 | index a8854dd3e9c5..8181ee7e1e27 100644 |
3214 | --- a/net/ipv6/seg6_iptunnel.c |
3215 | +++ b/net/ipv6/seg6_iptunnel.c |
3216 | @@ -347,6 +347,7 @@ static int seg6_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
3217 | struct ipv6hdr *hdr = ipv6_hdr(skb); |
3218 | struct flowi6 fl6; |
3219 | |
3220 | + memset(&fl6, 0, sizeof(fl6)); |
3221 | fl6.daddr = hdr->daddr; |
3222 | fl6.saddr = hdr->saddr; |
3223 | fl6.flowlabel = ip6_flowinfo(hdr); |
3224 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c |
3225 | index 62eefea48973..518364f4abcc 100644 |
3226 | --- a/net/netfilter/ipvs/ip_vs_ctl.c |
3227 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c |
3228 | @@ -3980,6 +3980,9 @@ static void __net_exit ip_vs_control_net_cleanup_sysctl(struct netns_ipvs *ipvs) |
3229 | |
3230 | static struct notifier_block ip_vs_dst_notifier = { |
3231 | .notifier_call = ip_vs_dst_event, |
3232 | +#ifdef CONFIG_IP_VS_IPV6 |
3233 | + .priority = ADDRCONF_NOTIFY_PRIORITY + 5, |
3234 | +#endif |
3235 | }; |
3236 | |
3237 | int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs) |
3238 | diff --git a/net/netfilter/nf_conncount.c b/net/netfilter/nf_conncount.c |
3239 | index 02ca7df793f5..b6d0f6deea86 100644 |
3240 | --- a/net/netfilter/nf_conncount.c |
3241 | +++ b/net/netfilter/nf_conncount.c |
3242 | @@ -49,6 +49,7 @@ struct nf_conncount_tuple { |
3243 | struct nf_conntrack_zone zone; |
3244 | int cpu; |
3245 | u32 jiffies32; |
3246 | + bool dead; |
3247 | struct rcu_head rcu_head; |
3248 | }; |
3249 | |
3250 | @@ -106,15 +107,16 @@ nf_conncount_add(struct nf_conncount_list *list, |
3251 | conn->zone = *zone; |
3252 | conn->cpu = raw_smp_processor_id(); |
3253 | conn->jiffies32 = (u32)jiffies; |
3254 | - spin_lock(&list->list_lock); |
3255 | + conn->dead = false; |
3256 | + spin_lock_bh(&list->list_lock); |
3257 | if (list->dead == true) { |
3258 | kmem_cache_free(conncount_conn_cachep, conn); |
3259 | - spin_unlock(&list->list_lock); |
3260 | + spin_unlock_bh(&list->list_lock); |
3261 | return NF_CONNCOUNT_SKIP; |
3262 | } |
3263 | list_add_tail(&conn->node, &list->head); |
3264 | list->count++; |
3265 | - spin_unlock(&list->list_lock); |
3266 | + spin_unlock_bh(&list->list_lock); |
3267 | return NF_CONNCOUNT_ADDED; |
3268 | } |
3269 | EXPORT_SYMBOL_GPL(nf_conncount_add); |
3270 | @@ -132,19 +134,22 @@ static bool conn_free(struct nf_conncount_list *list, |
3271 | { |
3272 | bool free_entry = false; |
3273 | |
3274 | - spin_lock(&list->list_lock); |
3275 | + spin_lock_bh(&list->list_lock); |
3276 | |
3277 | - if (list->count == 0) { |
3278 | - spin_unlock(&list->list_lock); |
3279 | - return free_entry; |
3280 | + if (conn->dead) { |
3281 | + spin_unlock_bh(&list->list_lock); |
3282 | + return free_entry; |
3283 | } |
3284 | |
3285 | list->count--; |
3286 | + conn->dead = true; |
3287 | list_del_rcu(&conn->node); |
3288 | - if (list->count == 0) |
3289 | + if (list->count == 0) { |
3290 | + list->dead = true; |
3291 | free_entry = true; |
3292 | + } |
3293 | |
3294 | - spin_unlock(&list->list_lock); |
3295 | + spin_unlock_bh(&list->list_lock); |
3296 | call_rcu(&conn->rcu_head, __conn_free); |
3297 | return free_entry; |
3298 | } |
3299 | @@ -245,7 +250,7 @@ void nf_conncount_list_init(struct nf_conncount_list *list) |
3300 | { |
3301 | spin_lock_init(&list->list_lock); |
3302 | INIT_LIST_HEAD(&list->head); |
3303 | - list->count = 1; |
3304 | + list->count = 0; |
3305 | list->dead = false; |
3306 | } |
3307 | EXPORT_SYMBOL_GPL(nf_conncount_list_init); |
3308 | @@ -259,6 +264,7 @@ bool nf_conncount_gc_list(struct net *net, |
3309 | struct nf_conn *found_ct; |
3310 | unsigned int collected = 0; |
3311 | bool free_entry = false; |
3312 | + bool ret = false; |
3313 | |
3314 | list_for_each_entry_safe(conn, conn_n, &list->head, node) { |
3315 | found = find_or_evict(net, list, conn, &free_entry); |
3316 | @@ -288,7 +294,15 @@ bool nf_conncount_gc_list(struct net *net, |
3317 | if (collected > CONNCOUNT_GC_MAX_NODES) |
3318 | return false; |
3319 | } |
3320 | - return false; |
3321 | + |
3322 | + spin_lock_bh(&list->list_lock); |
3323 | + if (!list->count) { |
3324 | + list->dead = true; |
3325 | + ret = true; |
3326 | + } |
3327 | + spin_unlock_bh(&list->list_lock); |
3328 | + |
3329 | + return ret; |
3330 | } |
3331 | EXPORT_SYMBOL_GPL(nf_conncount_gc_list); |
3332 | |
3333 | @@ -309,11 +323,8 @@ static void tree_nodes_free(struct rb_root *root, |
3334 | while (gc_count) { |
3335 | rbconn = gc_nodes[--gc_count]; |
3336 | spin_lock(&rbconn->list.list_lock); |
3337 | - if (rbconn->list.count == 0 && rbconn->list.dead == false) { |
3338 | - rbconn->list.dead = true; |
3339 | - rb_erase(&rbconn->node, root); |
3340 | - call_rcu(&rbconn->rcu_head, __tree_nodes_free); |
3341 | - } |
3342 | + rb_erase(&rbconn->node, root); |
3343 | + call_rcu(&rbconn->rcu_head, __tree_nodes_free); |
3344 | spin_unlock(&rbconn->list.list_lock); |
3345 | } |
3346 | } |
3347 | @@ -414,6 +425,7 @@ insert_tree(struct net *net, |
3348 | nf_conncount_list_init(&rbconn->list); |
3349 | list_add(&conn->node, &rbconn->list.head); |
3350 | count = 1; |
3351 | + rbconn->list.count = count; |
3352 | |
3353 | rb_link_node(&rbconn->node, parent, rbnode); |
3354 | rb_insert_color(&rbconn->node, root); |
3355 | diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c |
3356 | index 2cfb173cd0b2..fe0558b15fd3 100644 |
3357 | --- a/net/netfilter/nf_tables_api.c |
3358 | +++ b/net/netfilter/nf_tables_api.c |
3359 | @@ -2432,7 +2432,7 @@ err: |
3360 | static void nf_tables_rule_destroy(const struct nft_ctx *ctx, |
3361 | struct nft_rule *rule) |
3362 | { |
3363 | - struct nft_expr *expr; |
3364 | + struct nft_expr *expr, *next; |
3365 | |
3366 | lockdep_assert_held(&ctx->net->nft.commit_mutex); |
3367 | /* |
3368 | @@ -2441,8 +2441,9 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx, |
3369 | */ |
3370 | expr = nft_expr_first(rule); |
3371 | while (expr != nft_expr_last(rule) && expr->ops) { |
3372 | + next = nft_expr_next(expr); |
3373 | nf_tables_expr_destroy(ctx, expr); |
3374 | - expr = nft_expr_next(expr); |
3375 | + expr = next; |
3376 | } |
3377 | kfree(rule); |
3378 | } |
3379 | @@ -2645,21 +2646,14 @@ static int nf_tables_newrule(struct net *net, struct sock *nlsk, |
3380 | } |
3381 | |
3382 | if (nlh->nlmsg_flags & NLM_F_REPLACE) { |
3383 | - if (!nft_is_active_next(net, old_rule)) { |
3384 | - err = -ENOENT; |
3385 | - goto err2; |
3386 | - } |
3387 | - trans = nft_trans_rule_add(&ctx, NFT_MSG_DELRULE, |
3388 | - old_rule); |
3389 | + trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule); |
3390 | if (trans == NULL) { |
3391 | err = -ENOMEM; |
3392 | goto err2; |
3393 | } |
3394 | - nft_deactivate_next(net, old_rule); |
3395 | - chain->use--; |
3396 | - |
3397 | - if (nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule) == NULL) { |
3398 | - err = -ENOMEM; |
3399 | + err = nft_delrule(&ctx, old_rule); |
3400 | + if (err < 0) { |
3401 | + nft_trans_destroy(trans); |
3402 | goto err2; |
3403 | } |
3404 | |
3405 | @@ -6277,7 +6271,7 @@ static void nf_tables_commit_chain_free_rules_old(struct nft_rule **rules) |
3406 | call_rcu(&old->h, __nf_tables_commit_chain_free_rules_old); |
3407 | } |
3408 | |
3409 | -static void nf_tables_commit_chain_active(struct net *net, struct nft_chain *chain) |
3410 | +static void nf_tables_commit_chain(struct net *net, struct nft_chain *chain) |
3411 | { |
3412 | struct nft_rule **g0, **g1; |
3413 | bool next_genbit; |
3414 | @@ -6363,11 +6357,8 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb) |
3415 | |
3416 | /* step 2. Make rules_gen_X visible to packet path */ |
3417 | list_for_each_entry(table, &net->nft.tables, list) { |
3418 | - list_for_each_entry(chain, &table->chains, list) { |
3419 | - if (!nft_is_active_next(net, chain)) |
3420 | - continue; |
3421 | - nf_tables_commit_chain_active(net, chain); |
3422 | - } |
3423 | + list_for_each_entry(chain, &table->chains, list) |
3424 | + nf_tables_commit_chain(net, chain); |
3425 | } |
3426 | |
3427 | /* |
3428 | diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c |
3429 | index ad2fe6a7e47d..29d6fc73caf9 100644 |
3430 | --- a/net/netfilter/nft_compat.c |
3431 | +++ b/net/netfilter/nft_compat.c |
3432 | @@ -501,6 +501,7 @@ __nft_match_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr, |
3433 | void *info) |
3434 | { |
3435 | struct xt_match *match = expr->ops->data; |
3436 | + struct module *me = match->me; |
3437 | struct xt_mtdtor_param par; |
3438 | |
3439 | par.net = ctx->net; |
3440 | @@ -511,7 +512,7 @@ __nft_match_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr, |
3441 | par.match->destroy(&par); |
3442 | |
3443 | if (nft_xt_put(container_of(expr->ops, struct nft_xt, ops))) |
3444 | - module_put(match->me); |
3445 | + module_put(me); |
3446 | } |
3447 | |
3448 | static void |
3449 | diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c |
3450 | index d6bab8c3cbb0..5fd4c57c79cc 100644 |
3451 | --- a/net/netfilter/nft_flow_offload.c |
3452 | +++ b/net/netfilter/nft_flow_offload.c |
3453 | @@ -214,7 +214,9 @@ static int __init nft_flow_offload_module_init(void) |
3454 | { |
3455 | int err; |
3456 | |
3457 | - register_netdevice_notifier(&flow_offload_netdev_notifier); |
3458 | + err = register_netdevice_notifier(&flow_offload_netdev_notifier); |
3459 | + if (err) |
3460 | + goto err; |
3461 | |
3462 | err = nft_register_expr(&nft_flow_offload_type); |
3463 | if (err < 0) |
3464 | @@ -224,6 +226,7 @@ static int __init nft_flow_offload_module_init(void) |
3465 | |
3466 | register_expr: |
3467 | unregister_netdevice_notifier(&flow_offload_netdev_notifier); |
3468 | +err: |
3469 | return err; |
3470 | } |
3471 | |
3472 | diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c |
3473 | index dec843cadf46..9e05c86ba5c4 100644 |
3474 | --- a/net/netfilter/xt_RATEEST.c |
3475 | +++ b/net/netfilter/xt_RATEEST.c |
3476 | @@ -201,18 +201,8 @@ static __net_init int xt_rateest_net_init(struct net *net) |
3477 | return 0; |
3478 | } |
3479 | |
3480 | -static void __net_exit xt_rateest_net_exit(struct net *net) |
3481 | -{ |
3482 | - struct xt_rateest_net *xn = net_generic(net, xt_rateest_id); |
3483 | - int i; |
3484 | - |
3485 | - for (i = 0; i < ARRAY_SIZE(xn->hash); i++) |
3486 | - WARN_ON_ONCE(!hlist_empty(&xn->hash[i])); |
3487 | -} |
3488 | - |
3489 | static struct pernet_operations xt_rateest_net_ops = { |
3490 | .init = xt_rateest_net_init, |
3491 | - .exit = xt_rateest_net_exit, |
3492 | .id = &xt_rateest_id, |
3493 | .size = sizeof(struct xt_rateest_net), |
3494 | }; |
3495 | diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c |
3496 | index 3e7d259e5d8d..1ad4017f9b73 100644 |
3497 | --- a/net/netfilter/xt_hashlimit.c |
3498 | +++ b/net/netfilter/xt_hashlimit.c |
3499 | @@ -295,9 +295,10 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg, |
3500 | |
3501 | /* copy match config into hashtable config */ |
3502 | ret = cfg_copy(&hinfo->cfg, (void *)cfg, 3); |
3503 | - |
3504 | - if (ret) |
3505 | + if (ret) { |
3506 | + vfree(hinfo); |
3507 | return ret; |
3508 | + } |
3509 | |
3510 | hinfo->cfg.size = size; |
3511 | if (hinfo->cfg.max == 0) |
3512 | @@ -814,7 +815,6 @@ hashlimit_mt_v1(const struct sk_buff *skb, struct xt_action_param *par) |
3513 | int ret; |
3514 | |
3515 | ret = cfg_copy(&cfg, (void *)&info->cfg, 1); |
3516 | - |
3517 | if (ret) |
3518 | return ret; |
3519 | |
3520 | @@ -830,7 +830,6 @@ hashlimit_mt_v2(const struct sk_buff *skb, struct xt_action_param *par) |
3521 | int ret; |
3522 | |
3523 | ret = cfg_copy(&cfg, (void *)&info->cfg, 2); |
3524 | - |
3525 | if (ret) |
3526 | return ret; |
3527 | |
3528 | @@ -921,7 +920,6 @@ static int hashlimit_mt_check_v1(const struct xt_mtchk_param *par) |
3529 | return ret; |
3530 | |
3531 | ret = cfg_copy(&cfg, (void *)&info->cfg, 1); |
3532 | - |
3533 | if (ret) |
3534 | return ret; |
3535 | |
3536 | @@ -940,7 +938,6 @@ static int hashlimit_mt_check_v2(const struct xt_mtchk_param *par) |
3537 | return ret; |
3538 | |
3539 | ret = cfg_copy(&cfg, (void *)&info->cfg, 2); |
3540 | - |
3541 | if (ret) |
3542 | return ret; |
3543 | |
3544 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c |
3545 | index ad18a2052416..74c0f656f28c 100644 |
3546 | --- a/net/sched/sch_netem.c |
3547 | +++ b/net/sched/sch_netem.c |
3548 | @@ -441,6 +441,9 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, |
3549 | int count = 1; |
3550 | int rc = NET_XMIT_SUCCESS; |
3551 | |
3552 | + /* Do not fool qdisc_drop_all() */ |
3553 | + skb->prev = NULL; |
3554 | + |
3555 | /* Random duplication */ |
3556 | if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) |
3557 | ++count; |
3558 | diff --git a/net/sctp/associola.c b/net/sctp/associola.c |
3559 | index 6a28b96e779e..914750b819b2 100644 |
3560 | --- a/net/sctp/associola.c |
3561 | +++ b/net/sctp/associola.c |
3562 | @@ -118,9 +118,6 @@ static struct sctp_association *sctp_association_init( |
3563 | asoc->flowlabel = sp->flowlabel; |
3564 | asoc->dscp = sp->dscp; |
3565 | |
3566 | - /* Initialize default path MTU. */ |
3567 | - asoc->pathmtu = sp->pathmtu; |
3568 | - |
3569 | /* Set association default SACK delay */ |
3570 | asoc->sackdelay = msecs_to_jiffies(sp->sackdelay); |
3571 | asoc->sackfreq = sp->sackfreq; |
3572 | @@ -252,6 +249,10 @@ static struct sctp_association *sctp_association_init( |
3573 | 0, gfp)) |
3574 | goto fail_init; |
3575 | |
3576 | + /* Initialize default path MTU. */ |
3577 | + asoc->pathmtu = sp->pathmtu; |
3578 | + sctp_assoc_update_frag_point(asoc); |
3579 | + |
3580 | /* Assume that peer would support both address types unless we are |
3581 | * told otherwise. |
3582 | */ |
3583 | @@ -434,7 +435,7 @@ static void sctp_association_destroy(struct sctp_association *asoc) |
3584 | |
3585 | WARN_ON(atomic_read(&asoc->rmem_alloc)); |
3586 | |
3587 | - kfree(asoc); |
3588 | + kfree_rcu(asoc, rcu); |
3589 | SCTP_DBG_OBJCNT_DEC(assoc); |
3590 | } |
3591 | |
3592 | diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c |
3593 | index 4a4fd1971255..f4ac6c592e13 100644 |
3594 | --- a/net/sctp/sm_make_chunk.c |
3595 | +++ b/net/sctp/sm_make_chunk.c |
3596 | @@ -2462,6 +2462,9 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk, |
3597 | asoc->c.sinit_max_instreams, gfp)) |
3598 | goto clean_up; |
3599 | |
3600 | + /* Update frag_point when stream_interleave may get changed. */ |
3601 | + sctp_assoc_update_frag_point(asoc); |
3602 | + |
3603 | if (!asoc->temp && sctp_assoc_set_id(asoc, gfp)) |
3604 | goto clean_up; |
3605 | |
3606 | diff --git a/sound/firewire/fireface/ff-protocol-ff400.c b/sound/firewire/fireface/ff-protocol-ff400.c |
3607 | index 64c3cb0fb926..654a50319198 100644 |
3608 | --- a/sound/firewire/fireface/ff-protocol-ff400.c |
3609 | +++ b/sound/firewire/fireface/ff-protocol-ff400.c |
3610 | @@ -30,7 +30,7 @@ static int ff400_get_clock(struct snd_ff *ff, unsigned int *rate, |
3611 | int err; |
3612 | |
3613 | err = snd_fw_transaction(ff->unit, TCODE_READ_QUADLET_REQUEST, |
3614 | - FF400_SYNC_STATUS, ®, sizeof(reg), 0); |
3615 | + FF400_CLOCK_CONFIG, ®, sizeof(reg), 0); |
3616 | if (err < 0) |
3617 | return err; |
3618 | data = le32_to_cpu(reg); |
3619 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3620 | index 22ca1f0a858f..8a3d0694d2e5 100644 |
3621 | --- a/sound/pci/hda/patch_realtek.c |
3622 | +++ b/sound/pci/hda/patch_realtek.c |
3623 | @@ -5520,6 +5520,9 @@ enum { |
3624 | ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, |
3625 | ALC295_FIXUP_HP_AUTO_MUTE, |
3626 | ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, |
3627 | + ALC294_FIXUP_ASUS_MIC, |
3628 | + ALC294_FIXUP_ASUS_HEADSET_MIC, |
3629 | + ALC294_FIXUP_ASUS_SPK, |
3630 | }; |
3631 | |
3632 | static const struct hda_fixup alc269_fixups[] = { |
3633 | @@ -6392,6 +6395,8 @@ static const struct hda_fixup alc269_fixups[] = { |
3634 | [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = { |
3635 | .type = HDA_FIXUP_FUNC, |
3636 | .v.func = alc285_fixup_invalidate_dacs, |
3637 | + .chained = true, |
3638 | + .chain_id = ALC269_FIXUP_THINKPAD_ACPI |
3639 | }, |
3640 | [ALC295_FIXUP_HP_AUTO_MUTE] = { |
3641 | .type = HDA_FIXUP_FUNC, |
3642 | @@ -6406,6 +6411,36 @@ static const struct hda_fixup alc269_fixups[] = { |
3643 | .chained = true, |
3644 | .chain_id = ALC269_FIXUP_HEADSET_MIC |
3645 | }, |
3646 | + [ALC294_FIXUP_ASUS_MIC] = { |
3647 | + .type = HDA_FIXUP_PINS, |
3648 | + .v.pins = (const struct hda_pintbl[]) { |
3649 | + { 0x13, 0x90a60160 }, /* use as internal mic */ |
3650 | + { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */ |
3651 | + { } |
3652 | + }, |
3653 | + .chained = true, |
3654 | + .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC |
3655 | + }, |
3656 | + [ALC294_FIXUP_ASUS_HEADSET_MIC] = { |
3657 | + .type = HDA_FIXUP_PINS, |
3658 | + .v.pins = (const struct hda_pintbl[]) { |
3659 | + { 0x19, 0x01a1113c }, /* use as headset mic, without its own jack detect */ |
3660 | + { } |
3661 | + }, |
3662 | + .chained = true, |
3663 | + .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC |
3664 | + }, |
3665 | + [ALC294_FIXUP_ASUS_SPK] = { |
3666 | + .type = HDA_FIXUP_VERBS, |
3667 | + .v.verbs = (const struct hda_verb[]) { |
3668 | + /* Set EAPD high */ |
3669 | + { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 }, |
3670 | + { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 }, |
3671 | + { } |
3672 | + }, |
3673 | + .chained = true, |
3674 | + .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC |
3675 | + }, |
3676 | }; |
3677 | |
3678 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
3679 | @@ -6548,6 +6583,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
3680 | SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC), |
3681 | SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC), |
3682 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK), |
3683 | + SND_PCI_QUIRK(0x1043, 0x14a1, "ASUS UX533FD", ALC294_FIXUP_ASUS_SPK), |
3684 | SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A), |
3685 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), |
3686 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
3687 | @@ -7155,6 +7191,14 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
3688 | SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, |
3689 | ALC292_STANDARD_PINS, |
3690 | {0x13, 0x90a60140}), |
3691 | + SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC, |
3692 | + {0x14, 0x90170110}, |
3693 | + {0x1b, 0x90a70130}, |
3694 | + {0x21, 0x04211020}), |
3695 | + SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, |
3696 | + {0x12, 0x90a60130}, |
3697 | + {0x17, 0x90170110}, |
3698 | + {0x21, 0x04211020}), |
3699 | SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, |
3700 | ALC295_STANDARD_PINS, |
3701 | {0x17, 0x21014020}, |
3702 | @@ -7227,6 +7271,37 @@ static void alc269_fill_coef(struct hda_codec *codec) |
3703 | alc_update_coef_idx(codec, 0x4, 0, 1<<11); |
3704 | } |
3705 | |
3706 | +static void alc294_hp_init(struct hda_codec *codec) |
3707 | +{ |
3708 | + struct alc_spec *spec = codec->spec; |
3709 | + hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; |
3710 | + int i, val; |
3711 | + |
3712 | + if (!hp_pin) |
3713 | + return; |
3714 | + |
3715 | + snd_hda_codec_write(codec, hp_pin, 0, |
3716 | + AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); |
3717 | + |
3718 | + msleep(100); |
3719 | + |
3720 | + snd_hda_codec_write(codec, hp_pin, 0, |
3721 | + AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); |
3722 | + |
3723 | + alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */ |
3724 | + alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */ |
3725 | + |
3726 | + /* Wait for depop procedure finish */ |
3727 | + val = alc_read_coefex_idx(codec, 0x58, 0x01); |
3728 | + for (i = 0; i < 20 && val & 0x0080; i++) { |
3729 | + msleep(50); |
3730 | + val = alc_read_coefex_idx(codec, 0x58, 0x01); |
3731 | + } |
3732 | + /* Set HP depop to auto mode */ |
3733 | + alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b); |
3734 | + msleep(50); |
3735 | +} |
3736 | + |
3737 | /* |
3738 | */ |
3739 | static int patch_alc269(struct hda_codec *codec) |
3740 | @@ -7352,6 +7427,7 @@ static int patch_alc269(struct hda_codec *codec) |
3741 | spec->codec_variant = ALC269_TYPE_ALC294; |
3742 | spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */ |
3743 | alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */ |
3744 | + alc294_hp_init(codec); |
3745 | break; |
3746 | case 0x10ec0300: |
3747 | spec->codec_variant = ALC269_TYPE_ALC300; |
3748 | @@ -7363,6 +7439,7 @@ static int patch_alc269(struct hda_codec *codec) |
3749 | spec->codec_variant = ALC269_TYPE_ALC700; |
3750 | spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */ |
3751 | alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */ |
3752 | + alc294_hp_init(codec); |
3753 | break; |
3754 | |
3755 | } |
3756 | diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c |
3757 | index 7b8533abf637..b61d518f4fef 100644 |
3758 | --- a/sound/soc/codecs/hdac_hdmi.c |
3759 | +++ b/sound/soc/codecs/hdac_hdmi.c |
3760 | @@ -2184,11 +2184,6 @@ static int hdac_hdmi_runtime_suspend(struct device *dev) |
3761 | */ |
3762 | snd_hdac_codec_read(hdev, hdev->afg, 0, AC_VERB_SET_POWER_STATE, |
3763 | AC_PWRST_D3); |
3764 | - err = snd_hdac_display_power(bus, false); |
3765 | - if (err < 0) { |
3766 | - dev_err(dev, "Cannot turn on display power on i915\n"); |
3767 | - return err; |
3768 | - } |
3769 | |
3770 | hlink = snd_hdac_ext_bus_get_link(bus, dev_name(dev)); |
3771 | if (!hlink) { |
3772 | @@ -2198,7 +2193,11 @@ static int hdac_hdmi_runtime_suspend(struct device *dev) |
3773 | |
3774 | snd_hdac_ext_bus_link_put(bus, hlink); |
3775 | |
3776 | - return 0; |
3777 | + err = snd_hdac_display_power(bus, false); |
3778 | + if (err < 0) |
3779 | + dev_err(dev, "Cannot turn off display power on i915\n"); |
3780 | + |
3781 | + return err; |
3782 | } |
3783 | |
3784 | static int hdac_hdmi_runtime_resume(struct device *dev) |
3785 | diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c |
3786 | index f61656070225..4d3ec295679d 100644 |
3787 | --- a/sound/soc/codecs/wm_adsp.c |
3788 | +++ b/sound/soc/codecs/wm_adsp.c |
3789 | @@ -765,38 +765,41 @@ static unsigned int wm_adsp_region_to_reg(struct wm_adsp_region const *mem, |
3790 | |
3791 | static void wm_adsp2_show_fw_status(struct wm_adsp *dsp) |
3792 | { |
3793 | - u16 scratch[4]; |
3794 | + unsigned int scratch[4]; |
3795 | + unsigned int addr = dsp->base + ADSP2_SCRATCH0; |
3796 | + unsigned int i; |
3797 | int ret; |
3798 | |
3799 | - ret = regmap_raw_read(dsp->regmap, dsp->base + ADSP2_SCRATCH0, |
3800 | - scratch, sizeof(scratch)); |
3801 | - if (ret) { |
3802 | - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); |
3803 | - return; |
3804 | + for (i = 0; i < ARRAY_SIZE(scratch); ++i) { |
3805 | + ret = regmap_read(dsp->regmap, addr + i, &scratch[i]); |
3806 | + if (ret) { |
3807 | + adsp_err(dsp, "Failed to read SCRATCH%u: %d\n", i, ret); |
3808 | + return; |
3809 | + } |
3810 | } |
3811 | |
3812 | adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", |
3813 | - be16_to_cpu(scratch[0]), |
3814 | - be16_to_cpu(scratch[1]), |
3815 | - be16_to_cpu(scratch[2]), |
3816 | - be16_to_cpu(scratch[3])); |
3817 | + scratch[0], scratch[1], scratch[2], scratch[3]); |
3818 | } |
3819 | |
3820 | static void wm_adsp2v2_show_fw_status(struct wm_adsp *dsp) |
3821 | { |
3822 | - u32 scratch[2]; |
3823 | + unsigned int scratch[2]; |
3824 | int ret; |
3825 | |
3826 | - ret = regmap_raw_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, |
3827 | - scratch, sizeof(scratch)); |
3828 | - |
3829 | + ret = regmap_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, |
3830 | + &scratch[0]); |
3831 | if (ret) { |
3832 | - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); |
3833 | + adsp_err(dsp, "Failed to read SCRATCH0_1: %d\n", ret); |
3834 | return; |
3835 | } |
3836 | |
3837 | - scratch[0] = be32_to_cpu(scratch[0]); |
3838 | - scratch[1] = be32_to_cpu(scratch[1]); |
3839 | + ret = regmap_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH2_3, |
3840 | + &scratch[1]); |
3841 | + if (ret) { |
3842 | + adsp_err(dsp, "Failed to read SCRATCH2_3: %d\n", ret); |
3843 | + return; |
3844 | + } |
3845 | |
3846 | adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", |
3847 | scratch[0] & 0xFFFF, |
3848 | diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c |
3849 | index 1d17be0f78a0..50f16a0f6535 100644 |
3850 | --- a/sound/soc/intel/skylake/skl.c |
3851 | +++ b/sound/soc/intel/skylake/skl.c |
3852 | @@ -752,6 +752,12 @@ static void skl_probe_work(struct work_struct *work) |
3853 | } |
3854 | } |
3855 | |
3856 | + /* |
3857 | + * we are done probing so decrement link counts |
3858 | + */ |
3859 | + list_for_each_entry(hlink, &bus->hlink_list, list) |
3860 | + snd_hdac_ext_bus_link_put(bus, hlink); |
3861 | + |
3862 | if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) { |
3863 | err = snd_hdac_display_power(bus, false); |
3864 | if (err < 0) { |
3865 | @@ -761,12 +767,6 @@ static void skl_probe_work(struct work_struct *work) |
3866 | } |
3867 | } |
3868 | |
3869 | - /* |
3870 | - * we are done probing so decrement link counts |
3871 | - */ |
3872 | - list_for_each_entry(hlink, &bus->hlink_list, list) |
3873 | - snd_hdac_ext_bus_link_put(bus, hlink); |
3874 | - |
3875 | /* configure PM */ |
3876 | pm_runtime_put_noidle(bus->dev); |
3877 | pm_runtime_allow(bus->dev); |
3878 | diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c |
3879 | index d5ae9eb8c756..fed45b41f9d3 100644 |
3880 | --- a/sound/soc/omap/omap-abe-twl6040.c |
3881 | +++ b/sound/soc/omap/omap-abe-twl6040.c |
3882 | @@ -36,6 +36,8 @@ |
3883 | #include "../codecs/twl6040.h" |
3884 | |
3885 | struct abe_twl6040 { |
3886 | + struct snd_soc_card card; |
3887 | + struct snd_soc_dai_link dai_links[2]; |
3888 | int jack_detection; /* board can detect jack events */ |
3889 | int mclk_freq; /* MCLK frequency speed for twl6040 */ |
3890 | }; |
3891 | @@ -208,40 +210,10 @@ static int omap_abe_dmic_init(struct snd_soc_pcm_runtime *rtd) |
3892 | ARRAY_SIZE(dmic_audio_map)); |
3893 | } |
3894 | |
3895 | -/* Digital audio interface glue - connects codec <--> CPU */ |
3896 | -static struct snd_soc_dai_link abe_twl6040_dai_links[] = { |
3897 | - { |
3898 | - .name = "TWL6040", |
3899 | - .stream_name = "TWL6040", |
3900 | - .codec_dai_name = "twl6040-legacy", |
3901 | - .codec_name = "twl6040-codec", |
3902 | - .init = omap_abe_twl6040_init, |
3903 | - .ops = &omap_abe_ops, |
3904 | - }, |
3905 | - { |
3906 | - .name = "DMIC", |
3907 | - .stream_name = "DMIC Capture", |
3908 | - .codec_dai_name = "dmic-hifi", |
3909 | - .codec_name = "dmic-codec", |
3910 | - .init = omap_abe_dmic_init, |
3911 | - .ops = &omap_abe_dmic_ops, |
3912 | - }, |
3913 | -}; |
3914 | - |
3915 | -/* Audio machine driver */ |
3916 | -static struct snd_soc_card omap_abe_card = { |
3917 | - .owner = THIS_MODULE, |
3918 | - |
3919 | - .dapm_widgets = twl6040_dapm_widgets, |
3920 | - .num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets), |
3921 | - .dapm_routes = audio_map, |
3922 | - .num_dapm_routes = ARRAY_SIZE(audio_map), |
3923 | -}; |
3924 | - |
3925 | static int omap_abe_probe(struct platform_device *pdev) |
3926 | { |
3927 | struct device_node *node = pdev->dev.of_node; |
3928 | - struct snd_soc_card *card = &omap_abe_card; |
3929 | + struct snd_soc_card *card; |
3930 | struct device_node *dai_node; |
3931 | struct abe_twl6040 *priv; |
3932 | int num_links = 0; |
3933 | @@ -252,12 +224,18 @@ static int omap_abe_probe(struct platform_device *pdev) |
3934 | return -ENODEV; |
3935 | } |
3936 | |
3937 | - card->dev = &pdev->dev; |
3938 | - |
3939 | priv = devm_kzalloc(&pdev->dev, sizeof(struct abe_twl6040), GFP_KERNEL); |
3940 | if (priv == NULL) |
3941 | return -ENOMEM; |
3942 | |
3943 | + card = &priv->card; |
3944 | + card->dev = &pdev->dev; |
3945 | + card->owner = THIS_MODULE; |
3946 | + card->dapm_widgets = twl6040_dapm_widgets; |
3947 | + card->num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets); |
3948 | + card->dapm_routes = audio_map; |
3949 | + card->num_dapm_routes = ARRAY_SIZE(audio_map); |
3950 | + |
3951 | if (snd_soc_of_parse_card_name(card, "ti,model")) { |
3952 | dev_err(&pdev->dev, "Card name is not provided\n"); |
3953 | return -ENODEV; |
3954 | @@ -274,14 +252,27 @@ static int omap_abe_probe(struct platform_device *pdev) |
3955 | dev_err(&pdev->dev, "McPDM node is not provided\n"); |
3956 | return -EINVAL; |
3957 | } |
3958 | - abe_twl6040_dai_links[0].cpu_of_node = dai_node; |
3959 | - abe_twl6040_dai_links[0].platform_of_node = dai_node; |
3960 | + |
3961 | + priv->dai_links[0].name = "DMIC"; |
3962 | + priv->dai_links[0].stream_name = "TWL6040"; |
3963 | + priv->dai_links[0].cpu_of_node = dai_node; |
3964 | + priv->dai_links[0].platform_of_node = dai_node; |
3965 | + priv->dai_links[0].codec_dai_name = "twl6040-legacy"; |
3966 | + priv->dai_links[0].codec_name = "twl6040-codec"; |
3967 | + priv->dai_links[0].init = omap_abe_twl6040_init; |
3968 | + priv->dai_links[0].ops = &omap_abe_ops; |
3969 | |
3970 | dai_node = of_parse_phandle(node, "ti,dmic", 0); |
3971 | if (dai_node) { |
3972 | num_links = 2; |
3973 | - abe_twl6040_dai_links[1].cpu_of_node = dai_node; |
3974 | - abe_twl6040_dai_links[1].platform_of_node = dai_node; |
3975 | + priv->dai_links[1].name = "TWL6040"; |
3976 | + priv->dai_links[1].stream_name = "DMIC Capture"; |
3977 | + priv->dai_links[1].cpu_of_node = dai_node; |
3978 | + priv->dai_links[1].platform_of_node = dai_node; |
3979 | + priv->dai_links[1].codec_dai_name = "dmic-hifi"; |
3980 | + priv->dai_links[1].codec_name = "dmic-codec"; |
3981 | + priv->dai_links[1].init = omap_abe_dmic_init; |
3982 | + priv->dai_links[1].ops = &omap_abe_dmic_ops; |
3983 | } else { |
3984 | num_links = 1; |
3985 | } |
3986 | @@ -300,7 +291,7 @@ static int omap_abe_probe(struct platform_device *pdev) |
3987 | return -ENODEV; |
3988 | } |
3989 | |
3990 | - card->dai_link = abe_twl6040_dai_links; |
3991 | + card->dai_link = priv->dai_links; |
3992 | card->num_links = num_links; |
3993 | |
3994 | snd_soc_card_set_drvdata(card, priv); |
3995 | diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c |
3996 | index fe966272bd0c..cba9645b6487 100644 |
3997 | --- a/sound/soc/omap/omap-dmic.c |
3998 | +++ b/sound/soc/omap/omap-dmic.c |
3999 | @@ -48,6 +48,8 @@ struct omap_dmic { |
4000 | struct device *dev; |
4001 | void __iomem *io_base; |
4002 | struct clk *fclk; |
4003 | + struct pm_qos_request pm_qos_req; |
4004 | + int latency; |
4005 | int fclk_freq; |
4006 | int out_freq; |
4007 | int clk_div; |
4008 | @@ -124,6 +126,8 @@ static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream, |
4009 | |
4010 | mutex_lock(&dmic->mutex); |
4011 | |
4012 | + pm_qos_remove_request(&dmic->pm_qos_req); |
4013 | + |
4014 | if (!dai->active) |
4015 | dmic->active = 0; |
4016 | |
4017 | @@ -228,6 +232,8 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream, |
4018 | /* packet size is threshold * channels */ |
4019 | dma_data = snd_soc_dai_get_dma_data(dai, substream); |
4020 | dma_data->maxburst = dmic->threshold * channels; |
4021 | + dmic->latency = (OMAP_DMIC_THRES_MAX - dmic->threshold) * USEC_PER_SEC / |
4022 | + params_rate(params); |
4023 | |
4024 | return 0; |
4025 | } |
4026 | @@ -238,6 +244,9 @@ static int omap_dmic_dai_prepare(struct snd_pcm_substream *substream, |
4027 | struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); |
4028 | u32 ctrl; |
4029 | |
4030 | + if (pm_qos_request_active(&dmic->pm_qos_req)) |
4031 | + pm_qos_update_request(&dmic->pm_qos_req, dmic->latency); |
4032 | + |
4033 | /* Configure uplink threshold */ |
4034 | omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL_REG, dmic->threshold); |
4035 | |
4036 | diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c |
4037 | index d0ebb6b9bfac..2d6decbfc99e 100644 |
4038 | --- a/sound/soc/omap/omap-mcbsp.c |
4039 | +++ b/sound/soc/omap/omap-mcbsp.c |
4040 | @@ -308,9 +308,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, |
4041 | pkt_size = channels; |
4042 | } |
4043 | |
4044 | - latency = ((((buffer_size - pkt_size) / channels) * 1000) |
4045 | - / (params->rate_num / params->rate_den)); |
4046 | - |
4047 | + latency = (buffer_size - pkt_size) / channels; |
4048 | + latency = latency * USEC_PER_SEC / |
4049 | + (params->rate_num / params->rate_den); |
4050 | mcbsp->latency[substream->stream] = latency; |
4051 | |
4052 | omap_mcbsp_set_threshold(substream, pkt_size); |
4053 | diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c |
4054 | index 4c1be36c2207..7d5bdc5a2890 100644 |
4055 | --- a/sound/soc/omap/omap-mcpdm.c |
4056 | +++ b/sound/soc/omap/omap-mcpdm.c |
4057 | @@ -54,6 +54,8 @@ struct omap_mcpdm { |
4058 | unsigned long phys_base; |
4059 | void __iomem *io_base; |
4060 | int irq; |
4061 | + struct pm_qos_request pm_qos_req; |
4062 | + int latency[2]; |
4063 | |
4064 | struct mutex mutex; |
4065 | |
4066 | @@ -277,6 +279,9 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, |
4067 | struct snd_soc_dai *dai) |
4068 | { |
4069 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); |
4070 | + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); |
4071 | + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; |
4072 | + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; |
4073 | |
4074 | mutex_lock(&mcpdm->mutex); |
4075 | |
4076 | @@ -289,6 +294,14 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, |
4077 | } |
4078 | } |
4079 | |
4080 | + if (mcpdm->latency[stream2]) |
4081 | + pm_qos_update_request(&mcpdm->pm_qos_req, |
4082 | + mcpdm->latency[stream2]); |
4083 | + else if (mcpdm->latency[stream1]) |
4084 | + pm_qos_remove_request(&mcpdm->pm_qos_req); |
4085 | + |
4086 | + mcpdm->latency[stream1] = 0; |
4087 | + |
4088 | mutex_unlock(&mcpdm->mutex); |
4089 | } |
4090 | |
4091 | @@ -300,7 +313,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, |
4092 | int stream = substream->stream; |
4093 | struct snd_dmaengine_dai_dma_data *dma_data; |
4094 | u32 threshold; |
4095 | - int channels; |
4096 | + int channels, latency; |
4097 | int link_mask = 0; |
4098 | |
4099 | channels = params_channels(params); |
4100 | @@ -344,14 +357,25 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, |
4101 | |
4102 | dma_data->maxburst = |
4103 | (MCPDM_DN_THRES_MAX - threshold) * channels; |
4104 | + latency = threshold; |
4105 | } else { |
4106 | /* If playback is not running assume a stereo stream to come */ |
4107 | if (!mcpdm->config[!stream].link_mask) |
4108 | mcpdm->config[!stream].link_mask = (0x3 << 3); |
4109 | |
4110 | dma_data->maxburst = threshold * channels; |
4111 | + latency = (MCPDM_DN_THRES_MAX - threshold); |
4112 | } |
4113 | |
4114 | + /* |
4115 | + * The DMA must act to a DMA request within latency time (usec) to avoid |
4116 | + * under/overflow |
4117 | + */ |
4118 | + mcpdm->latency[stream] = latency * USEC_PER_SEC / params_rate(params); |
4119 | + |
4120 | + if (!mcpdm->latency[stream]) |
4121 | + mcpdm->latency[stream] = 10; |
4122 | + |
4123 | /* Check if we need to restart McPDM with this stream */ |
4124 | if (mcpdm->config[stream].link_mask && |
4125 | mcpdm->config[stream].link_mask != link_mask) |
4126 | @@ -366,6 +390,20 @@ static int omap_mcpdm_prepare(struct snd_pcm_substream *substream, |
4127 | struct snd_soc_dai *dai) |
4128 | { |
4129 | struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); |
4130 | + struct pm_qos_request *pm_qos_req = &mcpdm->pm_qos_req; |
4131 | + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); |
4132 | + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; |
4133 | + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; |
4134 | + int latency = mcpdm->latency[stream2]; |
4135 | + |
4136 | + /* Prevent omap hardware from hitting off between FIFO fills */ |
4137 | + if (!latency || mcpdm->latency[stream1] < latency) |
4138 | + latency = mcpdm->latency[stream1]; |
4139 | + |
4140 | + if (pm_qos_request_active(pm_qos_req)) |
4141 | + pm_qos_update_request(pm_qos_req, latency); |
4142 | + else if (latency) |
4143 | + pm_qos_add_request(pm_qos_req, PM_QOS_CPU_DMA_LATENCY, latency); |
4144 | |
4145 | if (!omap_mcpdm_active(mcpdm)) { |
4146 | omap_mcpdm_start(mcpdm); |
4147 | @@ -427,6 +465,9 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai) |
4148 | free_irq(mcpdm->irq, (void *)mcpdm); |
4149 | pm_runtime_disable(mcpdm->dev); |
4150 | |
4151 | + if (pm_qos_request_active(&mcpdm->pm_qos_req)) |
4152 | + pm_qos_remove_request(&mcpdm->pm_qos_req); |
4153 | + |
4154 | return 0; |
4155 | } |
4156 | |
4157 | diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c |
4158 | index eb1b9da05dd4..4715527054e5 100644 |
4159 | --- a/sound/soc/qcom/common.c |
4160 | +++ b/sound/soc/qcom/common.c |
4161 | @@ -13,6 +13,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card) |
4162 | struct device_node *cpu = NULL; |
4163 | struct device *dev = card->dev; |
4164 | struct snd_soc_dai_link *link; |
4165 | + struct of_phandle_args args; |
4166 | int ret, num_links; |
4167 | |
4168 | ret = snd_soc_of_parse_card_name(card, "model"); |
4169 | @@ -47,12 +48,14 @@ int qcom_snd_parse_of(struct snd_soc_card *card) |
4170 | goto err; |
4171 | } |
4172 | |
4173 | - link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); |
4174 | - if (!link->cpu_of_node) { |
4175 | + ret = of_parse_phandle_with_args(cpu, "sound-dai", |
4176 | + "#sound-dai-cells", 0, &args); |
4177 | + if (ret) { |
4178 | dev_err(card->dev, "error getting cpu phandle\n"); |
4179 | - ret = -EINVAL; |
4180 | goto err; |
4181 | } |
4182 | + link->cpu_of_node = args.np; |
4183 | + link->id = args.args[0]; |
4184 | |
4185 | ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); |
4186 | if (ret) { |
4187 | diff --git a/sound/soc/qcom/qdsp6/q6afe-dai.c b/sound/soc/qcom/qdsp6/q6afe-dai.c |
4188 | index 60ff4a2d3577..8f6c8fc073a9 100644 |
4189 | --- a/sound/soc/qcom/qdsp6/q6afe-dai.c |
4190 | +++ b/sound/soc/qcom/qdsp6/q6afe-dai.c |
4191 | @@ -1112,204 +1112,204 @@ static int q6afe_of_xlate_dai_name(struct snd_soc_component *component, |
4192 | } |
4193 | |
4194 | static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = { |
4195 | - SND_SOC_DAPM_AIF_OUT("HDMI_RX", "HDMI Playback", 0, 0, 0, 0), |
4196 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0), |
4197 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0), |
4198 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0), |
4199 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0), |
4200 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback", 0, 0, 0, 0), |
4201 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0), |
4202 | - SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_RX", "Slimbus6 Playback", 0, 0, 0, 0), |
4203 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0), |
4204 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0), |
4205 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_2_TX", "Slimbus2 Capture", 0, 0, 0, 0), |
4206 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_3_TX", "Slimbus3 Capture", 0, 0, 0, 0), |
4207 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture", 0, 0, 0, 0), |
4208 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0), |
4209 | - SND_SOC_DAPM_AIF_IN("SLIMBUS_6_TX", "Slimbus6 Capture", 0, 0, 0, 0), |
4210 | - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX", "Quaternary MI2S Playback", |
4211 | + SND_SOC_DAPM_AIF_IN("HDMI_RX", NULL, 0, 0, 0, 0), |
4212 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_0_RX", NULL, 0, 0, 0, 0), |
4213 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_1_RX", NULL, 0, 0, 0, 0), |
4214 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_2_RX", NULL, 0, 0, 0, 0), |
4215 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_3_RX", NULL, 0, 0, 0, 0), |
4216 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_4_RX", NULL, 0, 0, 0, 0), |
4217 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_5_RX", NULL, 0, 0, 0, 0), |
4218 | + SND_SOC_DAPM_AIF_IN("SLIMBUS_6_RX", NULL, 0, 0, 0, 0), |
4219 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_TX", NULL, 0, 0, 0, 0), |
4220 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_TX", NULL, 0, 0, 0, 0), |
4221 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_TX", NULL, 0, 0, 0, 0), |
4222 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_TX", NULL, 0, 0, 0, 0), |
4223 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, 0, 0, 0), |
4224 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, 0, 0, 0), |
4225 | + SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, 0, 0, 0), |
4226 | + SND_SOC_DAPM_AIF_IN("QUAT_MI2S_RX", NULL, |
4227 | 0, 0, 0, 0), |
4228 | - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture", |
4229 | + SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_TX", NULL, |
4230 | 0, 0, 0, 0), |
4231 | - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX", "Tertiary MI2S Playback", |
4232 | + SND_SOC_DAPM_AIF_IN("TERT_MI2S_RX", NULL, |
4233 | 0, 0, 0, 0), |
4234 | - SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX", "Tertiary MI2S Capture", |
4235 | + SND_SOC_DAPM_AIF_OUT("TERT_MI2S_TX", NULL, |
4236 | 0, 0, 0, 0), |
4237 | - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX", "Secondary MI2S Playback", |
4238 | + SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX", NULL, |
4239 | 0, 0, 0, 0), |
4240 | - SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX", "Secondary MI2S Capture", |
4241 | + SND_SOC_DAPM_AIF_OUT("SEC_MI2S_TX", NULL, |
4242 | 0, 0, 0, 0), |
4243 | - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_SD1", |
4244 | + SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX_SD1", |
4245 | "Secondary MI2S Playback SD1", |
4246 | 0, 0, 0, 0), |
4247 | - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_RX", "Primary MI2S Playback", |
4248 | + SND_SOC_DAPM_AIF_IN("PRI_MI2S_RX", NULL, |
4249 | 0, 0, 0, 0), |
4250 | - SND_SOC_DAPM_AIF_IN("PRI_MI2S_TX", "Primary MI2S Capture", |
4251 | + SND_SOC_DAPM_AIF_OUT("PRI_MI2S_TX", NULL, |
4252 | 0, 0, 0, 0), |
4253 | |
4254 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_0", "Primary TDM0 Playback", |
4255 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_0", NULL, |
4256 | 0, 0, 0, 0), |
4257 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_1", "Primary TDM1 Playback", |
4258 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_1", NULL, |
4259 | 0, 0, 0, 0), |
4260 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_2", "Primary TDM2 Playback", |
4261 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_2", NULL, |
4262 | 0, 0, 0, 0), |
4263 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_3", "Primary TDM3 Playback", |
4264 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_3", NULL, |
4265 | 0, 0, 0, 0), |
4266 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_4", "Primary TDM4 Playback", |
4267 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_4", NULL, |
4268 | 0, 0, 0, 0), |
4269 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_5", "Primary TDM5 Playback", |
4270 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_5", NULL, |
4271 | 0, 0, 0, 0), |
4272 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_6", "Primary TDM6 Playback", |
4273 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_6", NULL, |
4274 | 0, 0, 0, 0), |
4275 | - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_7", "Primary TDM7 Playback", |
4276 | + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_7", NULL, |
4277 | 0, 0, 0, 0), |
4278 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_0", "Primary TDM0 Capture", |
4279 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_0", NULL, |
4280 | 0, 0, 0, 0), |
4281 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_1", "Primary TDM1 Capture", |
4282 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_1", NULL, |
4283 | 0, 0, 0, 0), |
4284 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_2", "Primary TDM2 Capture", |
4285 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_2", NULL, |
4286 | 0, 0, 0, 0), |
4287 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_3", "Primary TDM3 Capture", |
4288 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_3", NULL, |
4289 | 0, 0, 0, 0), |
4290 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_4", "Primary TDM4 Capture", |
4291 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_4", NULL, |
4292 | 0, 0, 0, 0), |
4293 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_5", "Primary TDM5 Capture", |
4294 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_5", NULL, |
4295 | 0, 0, 0, 0), |
4296 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_6", "Primary TDM6 Capture", |
4297 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_6", NULL, |
4298 | 0, 0, 0, 0), |
4299 | - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_7", "Primary TDM7 Capture", |
4300 | + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_7", NULL, |
4301 | 0, 0, 0, 0), |
4302 | |
4303 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_0", "Secondary TDM0 Playback", |
4304 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0", NULL, |
4305 | 0, 0, 0, 0), |
4306 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_1", "Secondary TDM1 Playback", |
4307 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1", NULL, |
4308 | 0, 0, 0, 0), |
4309 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_2", "Secondary TDM2 Playback", |
4310 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2", NULL, |
4311 | 0, 0, 0, 0), |
4312 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_3", "Secondary TDM3 Playback", |
4313 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3", NULL, |
4314 | 0, 0, 0, 0), |
4315 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_4", "Secondary TDM4 Playback", |
4316 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4", NULL, |
4317 | 0, 0, 0, 0), |
4318 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_5", "Secondary TDM5 Playback", |
4319 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5", NULL, |
4320 | 0, 0, 0, 0), |
4321 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_6", "Secondary TDM6 Playback", |
4322 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6", NULL, |
4323 | 0, 0, 0, 0), |
4324 | - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_7", "Secondary TDM7 Playback", |
4325 | + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7", NULL, |
4326 | 0, 0, 0, 0), |
4327 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_0", "Secondary TDM0 Capture", |
4328 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0", NULL, |
4329 | 0, 0, 0, 0), |
4330 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_1", "Secondary TDM1 Capture", |
4331 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1", NULL, |
4332 | 0, 0, 0, 0), |
4333 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_2", "Secondary TDM2 Capture", |
4334 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2", NULL, |
4335 | 0, 0, 0, 0), |
4336 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_3", "Secondary TDM3 Capture", |
4337 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3", NULL, |
4338 | 0, 0, 0, 0), |
4339 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_4", "Secondary TDM4 Capture", |
4340 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4", NULL, |
4341 | 0, 0, 0, 0), |
4342 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_5", "Secondary TDM5 Capture", |
4343 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5", NULL, |
4344 | 0, 0, 0, 0), |
4345 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_6", "Secondary TDM6 Capture", |
4346 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6", NULL, |
4347 | 0, 0, 0, 0), |
4348 | - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_7", "Secondary TDM7 Capture", |
4349 | + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7", NULL, |
4350 | 0, 0, 0, 0), |
4351 | |
4352 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_0", "Tertiary TDM0 Playback", |
4353 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0", NULL, |
4354 | 0, 0, 0, 0), |
4355 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_1", "Tertiary TDM1 Playback", |
4356 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1", NULL, |
4357 | 0, 0, 0, 0), |
4358 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_2", "Tertiary TDM2 Playback", |
4359 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2", NULL, |
4360 | 0, 0, 0, 0), |
4361 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_3", "Tertiary TDM3 Playback", |
4362 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3", NULL, |
4363 | 0, 0, 0, 0), |
4364 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_4", "Tertiary TDM4 Playback", |
4365 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4", NULL, |
4366 | 0, 0, 0, 0), |
4367 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_5", "Tertiary TDM5 Playback", |
4368 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5", NULL, |
4369 | 0, 0, 0, 0), |
4370 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_6", "Tertiary TDM6 Playback", |
4371 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6", NULL, |
4372 | 0, 0, 0, 0), |
4373 | - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_7", "Tertiary TDM7 Playback", |
4374 | + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7", NULL, |
4375 | 0, 0, 0, 0), |
4376 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_0", "Tertiary TDM0 Capture", |
4377 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0", NULL, |
4378 | 0, 0, 0, 0), |
4379 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_1", "Tertiary TDM1 Capture", |
4380 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1", NULL, |
4381 | 0, 0, 0, 0), |
4382 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_2", "Tertiary TDM2 Capture", |
4383 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2", NULL, |
4384 | 0, 0, 0, 0), |
4385 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_3", "Tertiary TDM3 Capture", |
4386 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3", NULL, |
4387 | 0, 0, 0, 0), |
4388 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_4", "Tertiary TDM4 Capture", |
4389 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4", NULL, |
4390 | 0, 0, 0, 0), |
4391 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_5", "Tertiary TDM5 Capture", |
4392 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5", NULL, |
4393 | 0, 0, 0, 0), |
4394 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_6", "Tertiary TDM6 Capture", |
4395 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6", NULL, |
4396 | 0, 0, 0, 0), |
4397 | - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_7", "Tertiary TDM7 Capture", |
4398 | + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7", NULL, |
4399 | 0, 0, 0, 0), |
4400 | |
4401 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_0", "Quaternary TDM0 Playback", |
4402 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0", NULL, |
4403 | 0, 0, 0, 0), |
4404 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_1", "Quaternary TDM1 Playback", |
4405 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1", NULL, |
4406 | 0, 0, 0, 0), |
4407 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_2", "Quaternary TDM2 Playback", |
4408 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2", NULL, |
4409 | 0, 0, 0, 0), |
4410 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_3", "Quaternary TDM3 Playback", |
4411 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3", NULL, |
4412 | 0, 0, 0, 0), |
4413 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_4", "Quaternary TDM4 Playback", |
4414 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4", NULL, |
4415 | 0, 0, 0, 0), |
4416 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_5", "Quaternary TDM5 Playback", |
4417 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5", NULL, |
4418 | 0, 0, 0, 0), |
4419 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_6", "Quaternary TDM6 Playback", |
4420 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6", NULL, |
4421 | 0, 0, 0, 0), |
4422 | - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_7", "Quaternary TDM7 Playback", |
4423 | + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7", NULL, |
4424 | 0, 0, 0, 0), |
4425 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_0", "Quaternary TDM0 Capture", |
4426 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0", NULL, |
4427 | 0, 0, 0, 0), |
4428 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_1", "Quaternary TDM1 Capture", |
4429 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1", NULL, |
4430 | 0, 0, 0, 0), |
4431 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_2", "Quaternary TDM2 Capture", |
4432 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2", NULL, |
4433 | 0, 0, 0, 0), |
4434 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_3", "Quaternary TDM3 Capture", |
4435 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3", NULL, |
4436 | 0, 0, 0, 0), |
4437 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_4", "Quaternary TDM4 Capture", |
4438 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4", NULL, |
4439 | 0, 0, 0, 0), |
4440 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_5", "Quaternary TDM5 Capture", |
4441 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5", NULL, |
4442 | 0, 0, 0, 0), |
4443 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_6", "Quaternary TDM6 Capture", |
4444 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6", NULL, |
4445 | 0, 0, 0, 0), |
4446 | - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_7", "Quaternary TDM7 Capture", |
4447 | + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7", NULL, |
4448 | 0, 0, 0, 0), |
4449 | |
4450 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_0", "Quinary TDM0 Playback", |
4451 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0", NULL, |
4452 | 0, 0, 0, 0), |
4453 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_1", "Quinary TDM1 Playback", |
4454 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1", NULL, |
4455 | 0, 0, 0, 0), |
4456 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_2", "Quinary TDM2 Playback", |
4457 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2", NULL, |
4458 | 0, 0, 0, 0), |
4459 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_3", "Quinary TDM3 Playback", |
4460 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3", NULL, |
4461 | 0, 0, 0, 0), |
4462 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_4", "Quinary TDM4 Playback", |
4463 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4", NULL, |
4464 | 0, 0, 0, 0), |
4465 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_5", "Quinary TDM5 Playback", |
4466 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5", NULL, |
4467 | 0, 0, 0, 0), |
4468 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_6", "Quinary TDM6 Playback", |
4469 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6", NULL, |
4470 | 0, 0, 0, 0), |
4471 | - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_7", "Quinary TDM7 Playback", |
4472 | + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7", NULL, |
4473 | 0, 0, 0, 0), |
4474 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_0", "Quinary TDM0 Capture", |
4475 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0", NULL, |
4476 | 0, 0, 0, 0), |
4477 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_1", "Quinary TDM1 Capture", |
4478 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1", NULL, |
4479 | 0, 0, 0, 0), |
4480 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_2", "Quinary TDM2 Capture", |
4481 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2", NULL, |
4482 | 0, 0, 0, 0), |
4483 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_3", "Quinary TDM3 Capture", |
4484 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3", NULL, |
4485 | 0, 0, 0, 0), |
4486 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_4", "Quinary TDM4 Capture", |
4487 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4", NULL, |
4488 | 0, 0, 0, 0), |
4489 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_5", "Quinary TDM5 Capture", |
4490 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5", NULL, |
4491 | 0, 0, 0, 0), |
4492 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_6", "Quinary TDM6 Capture", |
4493 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6", NULL, |
4494 | 0, 0, 0, 0), |
4495 | - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_7", "Quinary TDM7 Capture", |
4496 | + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7", NULL, |
4497 | 0, 0, 0, 0), |
4498 | }; |
4499 | |
4500 | diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c |
4501 | index 000775b4bba8..829b5e987b2a 100644 |
4502 | --- a/sound/soc/qcom/qdsp6/q6afe.c |
4503 | +++ b/sound/soc/qcom/qdsp6/q6afe.c |
4504 | @@ -49,14 +49,14 @@ |
4505 | #define AFE_PORT_I2S_SD1 0x2 |
4506 | #define AFE_PORT_I2S_SD2 0x3 |
4507 | #define AFE_PORT_I2S_SD3 0x4 |
4508 | -#define AFE_PORT_I2S_SD0_MASK BIT(0x1) |
4509 | -#define AFE_PORT_I2S_SD1_MASK BIT(0x2) |
4510 | -#define AFE_PORT_I2S_SD2_MASK BIT(0x3) |
4511 | -#define AFE_PORT_I2S_SD3_MASK BIT(0x4) |
4512 | -#define AFE_PORT_I2S_SD0_1_MASK GENMASK(2, 1) |
4513 | -#define AFE_PORT_I2S_SD2_3_MASK GENMASK(4, 3) |
4514 | -#define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(3, 1) |
4515 | -#define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(4, 1) |
4516 | +#define AFE_PORT_I2S_SD0_MASK BIT(0x0) |
4517 | +#define AFE_PORT_I2S_SD1_MASK BIT(0x1) |
4518 | +#define AFE_PORT_I2S_SD2_MASK BIT(0x2) |
4519 | +#define AFE_PORT_I2S_SD3_MASK BIT(0x3) |
4520 | +#define AFE_PORT_I2S_SD0_1_MASK GENMASK(1, 0) |
4521 | +#define AFE_PORT_I2S_SD2_3_MASK GENMASK(3, 2) |
4522 | +#define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(2, 0) |
4523 | +#define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(3, 0) |
4524 | #define AFE_PORT_I2S_QUAD01 0x5 |
4525 | #define AFE_PORT_I2S_QUAD23 0x6 |
4526 | #define AFE_PORT_I2S_6CHS 0x7 |
4527 | diff --git a/sound/soc/rockchip/rockchip_pcm.c b/sound/soc/rockchip/rockchip_pcm.c |
4528 | index f77538319221..7029e0b85f9e 100644 |
4529 | --- a/sound/soc/rockchip/rockchip_pcm.c |
4530 | +++ b/sound/soc/rockchip/rockchip_pcm.c |
4531 | @@ -32,6 +32,7 @@ static const struct snd_pcm_hardware snd_rockchip_hardware = { |
4532 | |
4533 | static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = { |
4534 | .pcm_hardware = &snd_rockchip_hardware, |
4535 | + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, |
4536 | .prealloc_buffer_size = 32 * 1024, |
4537 | }; |
4538 | |
4539 | diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c |
4540 | index 3f880ec66459..a566dae3ec8a 100644 |
4541 | --- a/sound/soc/sh/rcar/ssi.c |
4542 | +++ b/sound/soc/sh/rcar/ssi.c |
4543 | @@ -283,7 +283,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod, |
4544 | if (rsnd_ssi_is_multi_slave(mod, io)) |
4545 | return 0; |
4546 | |
4547 | - if (ssi->rate) { |
4548 | + if (ssi->usrcnt > 1) { |
4549 | if (ssi->rate != rate) { |
4550 | dev_err(dev, "SSI parent/child should use same rate\n"); |
4551 | return -EINVAL; |
4552 | diff --git a/sound/soc/soc-acpi.c b/sound/soc/soc-acpi.c |
4553 | index b8e72b52db30..4fb29f0e561e 100644 |
4554 | --- a/sound/soc/soc-acpi.c |
4555 | +++ b/sound/soc/soc-acpi.c |
4556 | @@ -10,11 +10,17 @@ struct snd_soc_acpi_mach * |
4557 | snd_soc_acpi_find_machine(struct snd_soc_acpi_mach *machines) |
4558 | { |
4559 | struct snd_soc_acpi_mach *mach; |
4560 | + struct snd_soc_acpi_mach *mach_alt; |
4561 | |
4562 | for (mach = machines; mach->id[0]; mach++) { |
4563 | if (acpi_dev_present(mach->id, NULL, -1)) { |
4564 | - if (mach->machine_quirk) |
4565 | - mach = mach->machine_quirk(mach); |
4566 | + if (mach->machine_quirk) { |
4567 | + mach_alt = mach->machine_quirk(mach); |
4568 | + if (!mach_alt) |
4569 | + continue; /* not full match, ignore */ |
4570 | + mach = mach_alt; |
4571 | + } |
4572 | + |
4573 | return mach; |
4574 | } |
4575 | } |
4576 | diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
4577 | index 473eefe8658e..62aa320c2070 100644 |
4578 | --- a/sound/soc/soc-core.c |
4579 | +++ b/sound/soc/soc-core.c |
4580 | @@ -2126,6 +2126,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) |
4581 | } |
4582 | |
4583 | card->instantiated = 1; |
4584 | + dapm_mark_endpoints_dirty(card); |
4585 | snd_soc_dapm_sync(&card->dapm); |
4586 | mutex_unlock(&card->mutex); |
4587 | mutex_unlock(&client_mutex); |
4588 | diff --git a/sound/soc/sunxi/sun8i-codec.c b/sound/soc/sunxi/sun8i-codec.c |
4589 | index fb37dd927e33..bf615fa16dc8 100644 |
4590 | --- a/sound/soc/sunxi/sun8i-codec.c |
4591 | +++ b/sound/soc/sunxi/sun8i-codec.c |
4592 | @@ -589,16 +589,10 @@ err_pm_disable: |
4593 | |
4594 | static int sun8i_codec_remove(struct platform_device *pdev) |
4595 | { |
4596 | - struct snd_soc_card *card = platform_get_drvdata(pdev); |
4597 | - struct sun8i_codec *scodec = snd_soc_card_get_drvdata(card); |
4598 | - |
4599 | pm_runtime_disable(&pdev->dev); |
4600 | if (!pm_runtime_status_suspended(&pdev->dev)) |
4601 | sun8i_codec_runtime_suspend(&pdev->dev); |
4602 | |
4603 | - clk_disable_unprepare(scodec->clk_module); |
4604 | - clk_disable_unprepare(scodec->clk_bus); |
4605 | - |
4606 | return 0; |
4607 | } |
4608 | |
4609 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h |
4610 | index 08aa78007020..1c73b9ed44a6 100644 |
4611 | --- a/sound/usb/quirks-table.h |
4612 | +++ b/sound/usb/quirks-table.h |
4613 | @@ -3387,5 +3387,15 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), |
4614 | .ifnum = QUIRK_NO_INTERFACE |
4615 | } |
4616 | }, |
4617 | +/* Dell WD19 Dock */ |
4618 | +{ |
4619 | + USB_DEVICE(0x0bda, 0x402e), |
4620 | + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
4621 | + .vendor_name = "Dell", |
4622 | + .product_name = "WD19 Dock", |
4623 | + .profile_name = "Dell-WD15-Dock", |
4624 | + .ifnum = QUIRK_NO_INTERFACE |
4625 | + } |
4626 | +}, |
4627 | |
4628 | #undef USB_DEVICE_VENDOR_SPEC |
4629 | diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c |
4630 | index b3a0709ea7ed..fcaf00621102 100644 |
4631 | --- a/tools/bpf/bpftool/common.c |
4632 | +++ b/tools/bpf/bpftool/common.c |
4633 | @@ -304,7 +304,7 @@ char *get_fdinfo(int fd, const char *key) |
4634 | return NULL; |
4635 | } |
4636 | |
4637 | - while ((n = getline(&line, &line_n, fdi))) { |
4638 | + while ((n = getline(&line, &line_n, fdi)) > 0) { |
4639 | char *value; |
4640 | int len; |
4641 | |
4642 | diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c |
4643 | index dce960d22106..0de024a6cc2b 100644 |
4644 | --- a/tools/bpf/bpftool/prog.c |
4645 | +++ b/tools/bpf/bpftool/prog.c |
4646 | @@ -749,6 +749,7 @@ static int do_load(int argc, char **argv) |
4647 | } |
4648 | NEXT_ARG(); |
4649 | } else if (is_prefix(*argv, "map")) { |
4650 | + void *new_map_replace; |
4651 | char *endptr, *name; |
4652 | int fd; |
4653 | |
4654 | @@ -782,12 +783,15 @@ static int do_load(int argc, char **argv) |
4655 | if (fd < 0) |
4656 | goto err_free_reuse_maps; |
4657 | |
4658 | - map_replace = reallocarray(map_replace, old_map_fds + 1, |
4659 | - sizeof(*map_replace)); |
4660 | - if (!map_replace) { |
4661 | + new_map_replace = reallocarray(map_replace, |
4662 | + old_map_fds + 1, |
4663 | + sizeof(*map_replace)); |
4664 | + if (!new_map_replace) { |
4665 | p_err("mem alloc failed"); |
4666 | goto err_free_reuse_maps; |
4667 | } |
4668 | + map_replace = new_map_replace; |
4669 | + |
4670 | map_replace[old_map_fds].idx = idx; |
4671 | map_replace[old_map_fds].name = name; |
4672 | map_replace[old_map_fds].fd = fd; |
4673 | diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c |
4674 | index 7ec85d567598..b75d004f6482 100644 |
4675 | --- a/tools/objtool/elf.c |
4676 | +++ b/tools/objtool/elf.c |
4677 | @@ -31,6 +31,8 @@ |
4678 | #include "elf.h" |
4679 | #include "warn.h" |
4680 | |
4681 | +#define MAX_NAME_LEN 128 |
4682 | + |
4683 | struct section *find_section_by_name(struct elf *elf, const char *name) |
4684 | { |
4685 | struct section *sec; |
4686 | @@ -298,6 +300,8 @@ static int read_symbols(struct elf *elf) |
4687 | /* Create parent/child links for any cold subfunctions */ |
4688 | list_for_each_entry(sec, &elf->sections, list) { |
4689 | list_for_each_entry(sym, &sec->symbol_list, list) { |
4690 | + char pname[MAX_NAME_LEN + 1]; |
4691 | + size_t pnamelen; |
4692 | if (sym->type != STT_FUNC) |
4693 | continue; |
4694 | sym->pfunc = sym->cfunc = sym; |
4695 | @@ -305,14 +309,21 @@ static int read_symbols(struct elf *elf) |
4696 | if (!coldstr) |
4697 | continue; |
4698 | |
4699 | - coldstr[0] = '\0'; |
4700 | - pfunc = find_symbol_by_name(elf, sym->name); |
4701 | - coldstr[0] = '.'; |
4702 | + pnamelen = coldstr - sym->name; |
4703 | + if (pnamelen > MAX_NAME_LEN) { |
4704 | + WARN("%s(): parent function name exceeds maximum length of %d characters", |
4705 | + sym->name, MAX_NAME_LEN); |
4706 | + return -1; |
4707 | + } |
4708 | + |
4709 | + strncpy(pname, sym->name, pnamelen); |
4710 | + pname[pnamelen] = '\0'; |
4711 | + pfunc = find_symbol_by_name(elf, pname); |
4712 | |
4713 | if (!pfunc) { |
4714 | WARN("%s(): can't find parent function", |
4715 | sym->name); |
4716 | - goto err; |
4717 | + return -1; |
4718 | } |
4719 | |
4720 | sym->pfunc = pfunc; |
4721 | diff --git a/tools/perf/tests/attr/base-record b/tools/perf/tests/attr/base-record |
4722 | index 37940665f736..efd0157b9d22 100644 |
4723 | --- a/tools/perf/tests/attr/base-record |
4724 | +++ b/tools/perf/tests/attr/base-record |
4725 | @@ -9,7 +9,7 @@ size=112 |
4726 | config=0 |
4727 | sample_period=* |
4728 | sample_type=263 |
4729 | -read_format=0 |
4730 | +read_format=0|4 |
4731 | disabled=1 |
4732 | inherit=1 |
4733 | pinned=0 |
4734 | diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c |
4735 | index 03a72310315f..e7dbdcc8d465 100644 |
4736 | --- a/tools/perf/util/evsel.c |
4737 | +++ b/tools/perf/util/evsel.c |
4738 | @@ -1088,7 +1088,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts, |
4739 | attr->exclude_user = 1; |
4740 | } |
4741 | |
4742 | - if (evsel->own_cpus) |
4743 | + if (evsel->own_cpus || evsel->unit) |
4744 | evsel->attr.read_format |= PERF_FORMAT_ID; |
4745 | |
4746 | /* |
4747 | diff --git a/tools/perf/util/namespaces.c b/tools/perf/util/namespaces.c |
4748 | index cf8bd123cf73..aed170bd4384 100644 |
4749 | --- a/tools/perf/util/namespaces.c |
4750 | +++ b/tools/perf/util/namespaces.c |
4751 | @@ -18,6 +18,7 @@ |
4752 | #include <stdio.h> |
4753 | #include <string.h> |
4754 | #include <unistd.h> |
4755 | +#include <asm/bug.h> |
4756 | |
4757 | struct namespaces *namespaces__new(struct namespaces_event *event) |
4758 | { |
4759 | @@ -186,6 +187,7 @@ void nsinfo__mountns_enter(struct nsinfo *nsi, |
4760 | char curpath[PATH_MAX]; |
4761 | int oldns = -1; |
4762 | int newns = -1; |
4763 | + char *oldcwd = NULL; |
4764 | |
4765 | if (nc == NULL) |
4766 | return; |
4767 | @@ -199,9 +201,13 @@ void nsinfo__mountns_enter(struct nsinfo *nsi, |
4768 | if (snprintf(curpath, PATH_MAX, "/proc/self/ns/mnt") >= PATH_MAX) |
4769 | return; |
4770 | |
4771 | + oldcwd = get_current_dir_name(); |
4772 | + if (!oldcwd) |
4773 | + return; |
4774 | + |
4775 | oldns = open(curpath, O_RDONLY); |
4776 | if (oldns < 0) |
4777 | - return; |
4778 | + goto errout; |
4779 | |
4780 | newns = open(nsi->mntns_path, O_RDONLY); |
4781 | if (newns < 0) |
4782 | @@ -210,11 +216,13 @@ void nsinfo__mountns_enter(struct nsinfo *nsi, |
4783 | if (setns(newns, CLONE_NEWNS) < 0) |
4784 | goto errout; |
4785 | |
4786 | + nc->oldcwd = oldcwd; |
4787 | nc->oldns = oldns; |
4788 | nc->newns = newns; |
4789 | return; |
4790 | |
4791 | errout: |
4792 | + free(oldcwd); |
4793 | if (oldns > -1) |
4794 | close(oldns); |
4795 | if (newns > -1) |
4796 | @@ -223,11 +231,16 @@ errout: |
4797 | |
4798 | void nsinfo__mountns_exit(struct nscookie *nc) |
4799 | { |
4800 | - if (nc == NULL || nc->oldns == -1 || nc->newns == -1) |
4801 | + if (nc == NULL || nc->oldns == -1 || nc->newns == -1 || !nc->oldcwd) |
4802 | return; |
4803 | |
4804 | setns(nc->oldns, CLONE_NEWNS); |
4805 | |
4806 | + if (nc->oldcwd) { |
4807 | + WARN_ON_ONCE(chdir(nc->oldcwd)); |
4808 | + zfree(&nc->oldcwd); |
4809 | + } |
4810 | + |
4811 | if (nc->oldns > -1) { |
4812 | close(nc->oldns); |
4813 | nc->oldns = -1; |
4814 | diff --git a/tools/perf/util/namespaces.h b/tools/perf/util/namespaces.h |
4815 | index cae1a9a39722..d5f46c09ea31 100644 |
4816 | --- a/tools/perf/util/namespaces.h |
4817 | +++ b/tools/perf/util/namespaces.h |
4818 | @@ -38,6 +38,7 @@ struct nsinfo { |
4819 | struct nscookie { |
4820 | int oldns; |
4821 | int newns; |
4822 | + char *oldcwd; |
4823 | }; |
4824 | |
4825 | int nsinfo__init(struct nsinfo *nsi); |
4826 | diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile |
4827 | index f1fe492c8e17..f0017c831e57 100644 |
4828 | --- a/tools/testing/selftests/Makefile |
4829 | +++ b/tools/testing/selftests/Makefile |
4830 | @@ -24,6 +24,7 @@ TARGETS += memory-hotplug |
4831 | TARGETS += mount |
4832 | TARGETS += mqueue |
4833 | TARGETS += net |
4834 | +TARGETS += netfilter |
4835 | TARGETS += nsfs |
4836 | TARGETS += powerpc |
4837 | TARGETS += proc |
4838 | diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c |
4839 | index 67c412d19c09..2bde9ee04db7 100644 |
4840 | --- a/tools/testing/selftests/bpf/test_verifier.c |
4841 | +++ b/tools/testing/selftests/bpf/test_verifier.c |
4842 | @@ -12511,6 +12511,25 @@ static struct bpf_test tests[] = { |
4843 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, |
4844 | .result = ACCEPT, |
4845 | }, |
4846 | + { |
4847 | + "calls: ctx read at start of subprog", |
4848 | + .insns = { |
4849 | + BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), |
4850 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), |
4851 | + BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0), |
4852 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), |
4853 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), |
4854 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), |
4855 | + BPF_EXIT_INSN(), |
4856 | + BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), |
4857 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
4858 | + BPF_EXIT_INSN(), |
4859 | + }, |
4860 | + .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, |
4861 | + .errstr_unpriv = "function calls to other bpf functions are allowed for root only", |
4862 | + .result_unpriv = REJECT, |
4863 | + .result = ACCEPT, |
4864 | + }, |
4865 | }; |
4866 | |
4867 | static int probe_filter_length(const struct bpf_insn *fp) |
4868 | diff --git a/tools/testing/selftests/netfilter/Makefile b/tools/testing/selftests/netfilter/Makefile |
4869 | new file mode 100644 |
4870 | index 000000000000..47ed6cef93fb |
4871 | --- /dev/null |
4872 | +++ b/tools/testing/selftests/netfilter/Makefile |
4873 | @@ -0,0 +1,6 @@ |
4874 | +# SPDX-License-Identifier: GPL-2.0 |
4875 | +# Makefile for netfilter selftests |
4876 | + |
4877 | +TEST_PROGS := nft_trans_stress.sh |
4878 | + |
4879 | +include ../lib.mk |
4880 | diff --git a/tools/testing/selftests/netfilter/config b/tools/testing/selftests/netfilter/config |
4881 | new file mode 100644 |
4882 | index 000000000000..1017313e41a8 |
4883 | --- /dev/null |
4884 | +++ b/tools/testing/selftests/netfilter/config |
4885 | @@ -0,0 +1,2 @@ |
4886 | +CONFIG_NET_NS=y |
4887 | +NF_TABLES_INET=y |
4888 | diff --git a/tools/testing/selftests/netfilter/nft_trans_stress.sh b/tools/testing/selftests/netfilter/nft_trans_stress.sh |
4889 | new file mode 100755 |
4890 | index 000000000000..f1affd12c4b1 |
4891 | --- /dev/null |
4892 | +++ b/tools/testing/selftests/netfilter/nft_trans_stress.sh |
4893 | @@ -0,0 +1,78 @@ |
4894 | +#!/bin/bash |
4895 | +# |
4896 | +# This test is for stress-testing the nf_tables config plane path vs. |
4897 | +# packet path processing: Make sure we never release rules that are |
4898 | +# still visible to other cpus. |
4899 | +# |
4900 | +# set -e |
4901 | + |
4902 | +# Kselftest framework requirement - SKIP code is 4. |
4903 | +ksft_skip=4 |
4904 | + |
4905 | +testns=testns1 |
4906 | +tables="foo bar baz quux" |
4907 | + |
4908 | +nft --version > /dev/null 2>&1 |
4909 | +if [ $? -ne 0 ];then |
4910 | + echo "SKIP: Could not run test without nft tool" |
4911 | + exit $ksft_skip |
4912 | +fi |
4913 | + |
4914 | +ip -Version > /dev/null 2>&1 |
4915 | +if [ $? -ne 0 ];then |
4916 | + echo "SKIP: Could not run test without ip tool" |
4917 | + exit $ksft_skip |
4918 | +fi |
4919 | + |
4920 | +tmp=$(mktemp) |
4921 | + |
4922 | +for table in $tables; do |
4923 | + echo add table inet "$table" >> "$tmp" |
4924 | + echo flush table inet "$table" >> "$tmp" |
4925 | + |
4926 | + echo "add chain inet $table INPUT { type filter hook input priority 0; }" >> "$tmp" |
4927 | + echo "add chain inet $table OUTPUT { type filter hook output priority 0; }" >> "$tmp" |
4928 | + for c in $(seq 1 400); do |
4929 | + chain=$(printf "chain%03u" "$c") |
4930 | + echo "add chain inet $table $chain" >> "$tmp" |
4931 | + done |
4932 | + |
4933 | + for c in $(seq 1 400); do |
4934 | + chain=$(printf "chain%03u" "$c") |
4935 | + for BASE in INPUT OUTPUT; do |
4936 | + echo "add rule inet $table $BASE counter jump $chain" >> "$tmp" |
4937 | + done |
4938 | + echo "add rule inet $table $chain counter return" >> "$tmp" |
4939 | + done |
4940 | +done |
4941 | + |
4942 | +ip netns add "$testns" |
4943 | +ip -netns "$testns" link set lo up |
4944 | + |
4945 | +lscpu | grep ^CPU\(s\): | ( read cpu cpunum ; |
4946 | +cpunum=$((cpunum-1)) |
4947 | +for i in $(seq 0 $cpunum);do |
4948 | + mask=$(printf 0x%x $((1<<$i))) |
4949 | + ip netns exec "$testns" taskset $mask ping -4 127.0.0.1 -fq > /dev/null & |
4950 | + ip netns exec "$testns" taskset $mask ping -6 ::1 -fq > /dev/null & |
4951 | +done) |
4952 | + |
4953 | +sleep 1 |
4954 | + |
4955 | +for i in $(seq 1 10) ; do ip netns exec "$testns" nft -f "$tmp" & done |
4956 | + |
4957 | +for table in $tables;do |
4958 | + randsleep=$((RANDOM%10)) |
4959 | + sleep $randsleep |
4960 | + ip netns exec "$testns" nft delete table inet $table 2>/dev/null |
4961 | +done |
4962 | + |
4963 | +randsleep=$((RANDOM%10)) |
4964 | +sleep $randsleep |
4965 | + |
4966 | +pkill -9 ping |
4967 | + |
4968 | +wait |
4969 | + |
4970 | +rm -f "$tmp" |
4971 | +ip netns del "$testns" |
4972 | diff --git a/tools/testing/selftests/proc/proc-self-map-files-002.c b/tools/testing/selftests/proc/proc-self-map-files-002.c |
4973 | index 6f1f4a6e1ecb..85744425b08d 100644 |
4974 | --- a/tools/testing/selftests/proc/proc-self-map-files-002.c |
4975 | +++ b/tools/testing/selftests/proc/proc-self-map-files-002.c |
4976 | @@ -13,7 +13,7 @@ |
4977 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
4978 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
4979 | */ |
4980 | -/* Test readlink /proc/self/map_files/... with address 0. */ |
4981 | +/* Test readlink /proc/self/map_files/... with minimum address. */ |
4982 | #include <errno.h> |
4983 | #include <sys/types.h> |
4984 | #include <sys/stat.h> |
4985 | @@ -47,6 +47,11 @@ static void fail(const char *fmt, unsigned long a, unsigned long b) |
4986 | int main(void) |
4987 | { |
4988 | const unsigned int PAGE_SIZE = sysconf(_SC_PAGESIZE); |
4989 | +#ifdef __arm__ |
4990 | + unsigned long va = 2 * PAGE_SIZE; |
4991 | +#else |
4992 | + unsigned long va = 0; |
4993 | +#endif |
4994 | void *p; |
4995 | int fd; |
4996 | unsigned long a, b; |
4997 | @@ -55,7 +60,7 @@ int main(void) |
4998 | if (fd == -1) |
4999 | return 1; |
5000 | |
5001 | - p = mmap(NULL, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE|MAP_FIXED, fd, 0); |
5002 | + p = mmap((void *)va, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE|MAP_FIXED, fd, 0); |
5003 | if (p == MAP_FAILED) { |
5004 | if (errno == EPERM) |
5005 | return 2; |