Annotation of /trunk/kernel-alx/patches-4.19/0109-4.19.10-all-fixes.patch
Parent Directory | Revision Log
Revision 3388 -
(hide 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 | niro | 3388 | 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; |