Contents of /trunk/kernel-magellan/patches-4.20/0102-4.20.3-all-fixes.patch
Parent Directory | Revision Log
Revision 3279 -
(show annotations)
(download)
Mon Mar 4 10:35:51 2019 UTC (5 years, 6 months ago) by niro
File size: 65079 byte(s)
Mon Mar 4 10:35:51 2019 UTC (5 years, 6 months ago) by niro
File size: 65079 byte(s)
linux-4.20.3
1 | diff --git a/Makefile b/Makefile |
2 | index 4ba3dd0bf35d..3b9e4658d31f 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 20 |
9 | -SUBLEVEL = 2 |
10 | +SUBLEVEL = 3 |
11 | EXTRAVERSION = |
12 | NAME = Shy Crocodile |
13 | |
14 | diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c |
15 | index 7d8ab36ff83d..b3a3f5a59b5c 100644 |
16 | --- a/arch/arm/mach-davinci/board-da830-evm.c |
17 | +++ b/arch/arm/mach-davinci/board-da830-evm.c |
18 | @@ -207,9 +207,9 @@ static struct gpiod_lookup_table mmc_gpios_table = { |
19 | .dev_id = "da830-mmc.0", |
20 | .table = { |
21 | /* gpio chip 1 contains gpio range 32-63 */ |
22 | - GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_CD_PIN, "cd", |
23 | + GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_CD_PIN, "cd", |
24 | GPIO_ACTIVE_LOW), |
25 | - GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_WP_PIN, "wp", |
26 | + GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_WP_PIN, "wp", |
27 | GPIO_ACTIVE_LOW), |
28 | }, |
29 | }; |
30 | diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c |
31 | index e1a949b47306..bf2549e1894b 100644 |
32 | --- a/arch/arm/mach-davinci/board-da850-evm.c |
33 | +++ b/arch/arm/mach-davinci/board-da850-evm.c |
34 | @@ -780,9 +780,9 @@ static struct gpiod_lookup_table mmc_gpios_table = { |
35 | .dev_id = "da830-mmc.0", |
36 | .table = { |
37 | /* gpio chip 2 contains gpio range 64-95 */ |
38 | - GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_CD_PIN, "cd", |
39 | + GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_CD_PIN, "cd", |
40 | GPIO_ACTIVE_LOW), |
41 | - GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_WP_PIN, "wp", |
42 | + GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_WP_PIN, "wp", |
43 | GPIO_ACTIVE_HIGH), |
44 | }, |
45 | }; |
46 | diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c |
47 | index f53a461a606f..f7fa960c23e3 100644 |
48 | --- a/arch/arm/mach-davinci/board-dm355-evm.c |
49 | +++ b/arch/arm/mach-davinci/board-dm355-evm.c |
50 | @@ -117,9 +117,9 @@ static struct platform_device davinci_nand_device = { |
51 | static struct gpiod_lookup_table i2c_recovery_gpiod_table = { |
52 | .dev_id = "i2c_davinci.1", |
53 | .table = { |
54 | - GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SDA_PIN, "sda", |
55 | + GPIO_LOOKUP("davinci_gpio", DM355_I2C_SDA_PIN, "sda", |
56 | GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), |
57 | - GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SCL_PIN, "scl", |
58 | + GPIO_LOOKUP("davinci_gpio", DM355_I2C_SCL_PIN, "scl", |
59 | GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), |
60 | }, |
61 | }; |
62 | diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c |
63 | index e4a8f9225d16..f752d828e42f 100644 |
64 | --- a/arch/arm/mach-davinci/board-dm644x-evm.c |
65 | +++ b/arch/arm/mach-davinci/board-dm644x-evm.c |
66 | @@ -638,9 +638,9 @@ static struct i2c_board_info __initdata i2c_info[] = { |
67 | static struct gpiod_lookup_table i2c_recovery_gpiod_table = { |
68 | .dev_id = "i2c_davinci.1", |
69 | .table = { |
70 | - GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SDA_PIN, "sda", |
71 | + GPIO_LOOKUP("davinci_gpio", DM644X_I2C_SDA_PIN, "sda", |
72 | GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), |
73 | - GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SCL_PIN, "scl", |
74 | + GPIO_LOOKUP("davinci_gpio", DM644X_I2C_SCL_PIN, "scl", |
75 | GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), |
76 | }, |
77 | }; |
78 | diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c |
79 | index 8e8d51f4a276..94c4f126ef86 100644 |
80 | --- a/arch/arm/mach-davinci/board-omapl138-hawk.c |
81 | +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c |
82 | @@ -134,9 +134,9 @@ static const short hawk_mmcsd0_pins[] = { |
83 | static struct gpiod_lookup_table mmc_gpios_table = { |
84 | .dev_id = "da830-mmc.0", |
85 | .table = { |
86 | - GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_CD_PIN, "cd", |
87 | + GPIO_LOOKUP("davinci_gpio", DA850_HAWK_MMCSD_CD_PIN, "cd", |
88 | GPIO_ACTIVE_LOW), |
89 | - GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_WP_PIN, "wp", |
90 | + GPIO_LOOKUP("davinci_gpio", DA850_HAWK_MMCSD_WP_PIN, "wp", |
91 | GPIO_ACTIVE_LOW), |
92 | }, |
93 | }; |
94 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
95 | index fd59fef9931b..1355fab5f676 100644 |
96 | --- a/arch/powerpc/kernel/signal_32.c |
97 | +++ b/arch/powerpc/kernel/signal_32.c |
98 | @@ -1158,11 +1158,11 @@ SYSCALL_DEFINE0(rt_sigreturn) |
99 | { |
100 | struct rt_sigframe __user *rt_sf; |
101 | struct pt_regs *regs = current_pt_regs(); |
102 | + int tm_restore = 0; |
103 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
104 | struct ucontext __user *uc_transact; |
105 | unsigned long msr_hi; |
106 | unsigned long tmp; |
107 | - int tm_restore = 0; |
108 | #endif |
109 | /* Always make any pending restarted system calls return -EINTR */ |
110 | current->restart_block.fn = do_no_restart_syscall; |
111 | @@ -1210,11 +1210,19 @@ SYSCALL_DEFINE0(rt_sigreturn) |
112 | goto bad; |
113 | } |
114 | } |
115 | - if (!tm_restore) |
116 | - /* Fall through, for non-TM restore */ |
117 | + if (!tm_restore) { |
118 | + /* |
119 | + * Unset regs->msr because ucontext MSR TS is not |
120 | + * set, and recheckpoint was not called. This avoid |
121 | + * hitting a TM Bad thing at RFID |
122 | + */ |
123 | + regs->msr &= ~MSR_TS_MASK; |
124 | + } |
125 | + /* Fall through, for non-TM restore */ |
126 | #endif |
127 | - if (do_setcontext(&rt_sf->uc, regs, 1)) |
128 | - goto bad; |
129 | + if (!tm_restore) |
130 | + if (do_setcontext(&rt_sf->uc, regs, 1)) |
131 | + goto bad; |
132 | |
133 | /* |
134 | * It's not clear whether or why it is desirable to save the |
135 | diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c |
136 | index bbd1c73243d7..6f70d1b4bf36 100644 |
137 | --- a/arch/powerpc/kernel/signal_64.c |
138 | +++ b/arch/powerpc/kernel/signal_64.c |
139 | @@ -756,11 +756,23 @@ SYSCALL_DEFINE0(rt_sigreturn) |
140 | &uc_transact->uc_mcontext)) |
141 | goto badframe; |
142 | } |
143 | - else |
144 | - /* Fall through, for non-TM restore */ |
145 | #endif |
146 | - if (restore_sigcontext(current, NULL, 1, &uc->uc_mcontext)) |
147 | - goto badframe; |
148 | + /* Fall through, for non-TM restore */ |
149 | + if (!MSR_TM_ACTIVE(msr)) { |
150 | + /* |
151 | + * Unset MSR[TS] on the thread regs since MSR from user |
152 | + * context does not have MSR active, and recheckpoint was |
153 | + * not called since restore_tm_sigcontexts() was not called |
154 | + * also. |
155 | + * |
156 | + * If not unsetting it, the code can RFID to userspace with |
157 | + * MSR[TS] set, but without CPU in the proper state, |
158 | + * causing a TM bad thing. |
159 | + */ |
160 | + current->thread.regs->msr &= ~MSR_TS_MASK; |
161 | + if (restore_sigcontext(current, NULL, 1, &uc->uc_mcontext)) |
162 | + goto badframe; |
163 | + } |
164 | |
165 | if (restore_altstack(&uc->uc_stack)) |
166 | goto badframe; |
167 | diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c |
168 | index 362f3cde6a31..7b135796813f 100644 |
169 | --- a/arch/x86/kernel/cpu/bugs.c |
170 | +++ b/arch/x86/kernel/cpu/bugs.c |
171 | @@ -213,7 +213,7 @@ static enum spectre_v2_mitigation spectre_v2_enabled __ro_after_init = |
172 | static enum spectre_v2_user_mitigation spectre_v2_user __ro_after_init = |
173 | SPECTRE_V2_USER_NONE; |
174 | |
175 | -#ifdef RETPOLINE |
176 | +#ifdef CONFIG_RETPOLINE |
177 | static bool spectre_v2_bad_module; |
178 | |
179 | bool retpoline_module_ok(bool has_retpoline) |
180 | diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c |
181 | index 70f4e80b9246..a1a22e9c0328 100644 |
182 | --- a/drivers/acpi/arm64/iort.c |
183 | +++ b/drivers/acpi/arm64/iort.c |
184 | @@ -951,9 +951,10 @@ static int rc_dma_get_range(struct device *dev, u64 *size) |
185 | { |
186 | struct acpi_iort_node *node; |
187 | struct acpi_iort_root_complex *rc; |
188 | + struct pci_bus *pbus = to_pci_dev(dev)->bus; |
189 | |
190 | node = iort_scan_node(ACPI_IORT_NODE_PCI_ROOT_COMPLEX, |
191 | - iort_match_node_callback, dev); |
192 | + iort_match_node_callback, &pbus->dev); |
193 | if (!node || node->revision < 1) |
194 | return -ENODEV; |
195 | |
196 | diff --git a/drivers/acpi/pmic/intel_pmic_xpower.c b/drivers/acpi/pmic/intel_pmic_xpower.c |
197 | index 2579675b7082..e7c0006e6602 100644 |
198 | --- a/drivers/acpi/pmic/intel_pmic_xpower.c |
199 | +++ b/drivers/acpi/pmic/intel_pmic_xpower.c |
200 | @@ -20,8 +20,11 @@ |
201 | #define GPI1_LDO_ON (3 << 0) |
202 | #define GPI1_LDO_OFF (4 << 0) |
203 | |
204 | -#define AXP288_ADC_TS_PIN_GPADC 0xf2 |
205 | -#define AXP288_ADC_TS_PIN_ON 0xf3 |
206 | +#define AXP288_ADC_TS_CURRENT_ON_OFF_MASK GENMASK(1, 0) |
207 | +#define AXP288_ADC_TS_CURRENT_OFF (0 << 0) |
208 | +#define AXP288_ADC_TS_CURRENT_ON_WHEN_CHARGING (1 << 0) |
209 | +#define AXP288_ADC_TS_CURRENT_ON_ONDEMAND (2 << 0) |
210 | +#define AXP288_ADC_TS_CURRENT_ON (3 << 0) |
211 | |
212 | static struct pmic_table power_table[] = { |
213 | { |
214 | @@ -212,22 +215,44 @@ out: |
215 | */ |
216 | static int intel_xpower_pmic_get_raw_temp(struct regmap *regmap, int reg) |
217 | { |
218 | + int ret, adc_ts_pin_ctrl; |
219 | u8 buf[2]; |
220 | - int ret; |
221 | |
222 | - ret = regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, |
223 | - AXP288_ADC_TS_PIN_GPADC); |
224 | + /* |
225 | + * The current-source used for the battery temp-sensor (TS) is shared |
226 | + * with the GPADC. For proper fuel-gauge and charger operation the TS |
227 | + * current-source needs to be permanently on. But to read the GPADC we |
228 | + * need to temporary switch the TS current-source to ondemand, so that |
229 | + * the GPADC can use it, otherwise we will always read an all 0 value. |
230 | + * |
231 | + * Note that the switching from on to on-ondemand is not necessary |
232 | + * when the TS current-source is off (this happens on devices which |
233 | + * do not use the TS-pin). |
234 | + */ |
235 | + ret = regmap_read(regmap, AXP288_ADC_TS_PIN_CTRL, &adc_ts_pin_ctrl); |
236 | if (ret) |
237 | return ret; |
238 | |
239 | - /* After switching to the GPADC pin give things some time to settle */ |
240 | - usleep_range(6000, 10000); |
241 | + if (adc_ts_pin_ctrl & AXP288_ADC_TS_CURRENT_ON_OFF_MASK) { |
242 | + ret = regmap_update_bits(regmap, AXP288_ADC_TS_PIN_CTRL, |
243 | + AXP288_ADC_TS_CURRENT_ON_OFF_MASK, |
244 | + AXP288_ADC_TS_CURRENT_ON_ONDEMAND); |
245 | + if (ret) |
246 | + return ret; |
247 | + |
248 | + /* Wait a bit after switching the current-source */ |
249 | + usleep_range(6000, 10000); |
250 | + } |
251 | |
252 | ret = regmap_bulk_read(regmap, AXP288_GP_ADC_H, buf, 2); |
253 | if (ret == 0) |
254 | ret = (buf[0] << 4) + ((buf[1] >> 4) & 0x0f); |
255 | |
256 | - regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, AXP288_ADC_TS_PIN_ON); |
257 | + if (adc_ts_pin_ctrl & AXP288_ADC_TS_CURRENT_ON_OFF_MASK) { |
258 | + regmap_update_bits(regmap, AXP288_ADC_TS_PIN_CTRL, |
259 | + AXP288_ADC_TS_CURRENT_ON_OFF_MASK, |
260 | + AXP288_ADC_TS_CURRENT_ON); |
261 | + } |
262 | |
263 | return ret; |
264 | } |
265 | diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c |
266 | index 1b475bc1ae16..665e93ca0b40 100644 |
267 | --- a/drivers/acpi/power.c |
268 | +++ b/drivers/acpi/power.c |
269 | @@ -131,6 +131,23 @@ void acpi_power_resources_list_free(struct list_head *list) |
270 | } |
271 | } |
272 | |
273 | +static bool acpi_power_resource_is_dup(union acpi_object *package, |
274 | + unsigned int start, unsigned int i) |
275 | +{ |
276 | + acpi_handle rhandle, dup; |
277 | + unsigned int j; |
278 | + |
279 | + /* The caller is expected to check the package element types */ |
280 | + rhandle = package->package.elements[i].reference.handle; |
281 | + for (j = start; j < i; j++) { |
282 | + dup = package->package.elements[j].reference.handle; |
283 | + if (dup == rhandle) |
284 | + return true; |
285 | + } |
286 | + |
287 | + return false; |
288 | +} |
289 | + |
290 | int acpi_extract_power_resources(union acpi_object *package, unsigned int start, |
291 | struct list_head *list) |
292 | { |
293 | @@ -150,6 +167,11 @@ int acpi_extract_power_resources(union acpi_object *package, unsigned int start, |
294 | err = -ENODEV; |
295 | break; |
296 | } |
297 | + |
298 | + /* Some ACPI tables contain duplicate power resource references */ |
299 | + if (acpi_power_resource_is_dup(package, start, i)) |
300 | + continue; |
301 | + |
302 | err = acpi_add_power_resource(rhandle); |
303 | if (err) |
304 | break; |
305 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c |
306 | index 8e5140bbf241..1e92b61d0bd5 100644 |
307 | --- a/drivers/block/rbd.c |
308 | +++ b/drivers/block/rbd.c |
309 | @@ -5986,7 +5986,6 @@ static ssize_t do_rbd_remove(struct bus_type *bus, |
310 | struct list_head *tmp; |
311 | int dev_id; |
312 | char opt_buf[6]; |
313 | - bool already = false; |
314 | bool force = false; |
315 | int ret; |
316 | |
317 | @@ -6019,13 +6018,13 @@ static ssize_t do_rbd_remove(struct bus_type *bus, |
318 | spin_lock_irq(&rbd_dev->lock); |
319 | if (rbd_dev->open_count && !force) |
320 | ret = -EBUSY; |
321 | - else |
322 | - already = test_and_set_bit(RBD_DEV_FLAG_REMOVING, |
323 | - &rbd_dev->flags); |
324 | + else if (test_and_set_bit(RBD_DEV_FLAG_REMOVING, |
325 | + &rbd_dev->flags)) |
326 | + ret = -EINPROGRESS; |
327 | spin_unlock_irq(&rbd_dev->lock); |
328 | } |
329 | spin_unlock(&rbd_dev_list_lock); |
330 | - if (ret < 0 || already) |
331 | + if (ret) |
332 | return ret; |
333 | |
334 | if (force) { |
335 | diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c |
336 | index 50b1551ba894..242c3370544e 100644 |
337 | --- a/drivers/cpufreq/scmi-cpufreq.c |
338 | +++ b/drivers/cpufreq/scmi-cpufreq.c |
339 | @@ -52,9 +52,9 @@ scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index) |
340 | int ret; |
341 | struct scmi_data *priv = policy->driver_data; |
342 | struct scmi_perf_ops *perf_ops = handle->perf_ops; |
343 | - u64 freq = policy->freq_table[index].frequency * 1000; |
344 | + u64 freq = policy->freq_table[index].frequency; |
345 | |
346 | - ret = perf_ops->freq_set(handle, priv->domain_id, freq, false); |
347 | + ret = perf_ops->freq_set(handle, priv->domain_id, freq * 1000, false); |
348 | if (!ret) |
349 | arch_set_freq_scale(policy->related_cpus, freq, |
350 | policy->cpuinfo.max_freq); |
351 | @@ -176,7 +176,7 @@ static int scmi_cpufreq_init(struct cpufreq_policy *policy) |
352 | out_free_priv: |
353 | kfree(priv); |
354 | out_free_opp: |
355 | - dev_pm_opp_cpumask_remove_table(policy->cpus); |
356 | + dev_pm_opp_remove_all_dynamic(cpu_dev); |
357 | |
358 | return ret; |
359 | } |
360 | @@ -188,7 +188,7 @@ static int scmi_cpufreq_exit(struct cpufreq_policy *policy) |
361 | cpufreq_cooling_unregister(priv->cdev); |
362 | dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); |
363 | kfree(priv); |
364 | - dev_pm_opp_cpumask_remove_table(policy->related_cpus); |
365 | + dev_pm_opp_remove_all_dynamic(priv->cpu_dev); |
366 | |
367 | return 0; |
368 | } |
369 | diff --git a/drivers/cpufreq/scpi-cpufreq.c b/drivers/cpufreq/scpi-cpufreq.c |
370 | index 87a98ec77773..99449738faa4 100644 |
371 | --- a/drivers/cpufreq/scpi-cpufreq.c |
372 | +++ b/drivers/cpufreq/scpi-cpufreq.c |
373 | @@ -177,7 +177,7 @@ out_free_cpufreq_table: |
374 | out_free_priv: |
375 | kfree(priv); |
376 | out_free_opp: |
377 | - dev_pm_opp_cpumask_remove_table(policy->cpus); |
378 | + dev_pm_opp_remove_all_dynamic(cpu_dev); |
379 | |
380 | return ret; |
381 | } |
382 | @@ -190,7 +190,7 @@ static int scpi_cpufreq_exit(struct cpufreq_policy *policy) |
383 | clk_put(priv->clk); |
384 | dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); |
385 | kfree(priv); |
386 | - dev_pm_opp_cpumask_remove_table(policy->related_cpus); |
387 | + dev_pm_opp_remove_all_dynamic(priv->cpu_dev); |
388 | |
389 | return 0; |
390 | } |
391 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
392 | index 74b611e8a1b1..c79517dc8804 100644 |
393 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
394 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
395 | @@ -864,6 +864,7 @@ static const struct pci_device_id pciidlist[] = { |
396 | /* VEGAM */ |
397 | {0x1002, 0x694C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM}, |
398 | {0x1002, 0x694E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM}, |
399 | + {0x1002, 0x694F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGAM}, |
400 | /* Vega 10 */ |
401 | {0x1002, 0x6860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
402 | {0x1002, 0x6861, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10}, |
403 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
404 | index 5a6edf65c9ea..3118ae0e7a87 100644 |
405 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
406 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
407 | @@ -645,22 +645,36 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend) |
408 | { |
409 | struct amdgpu_dm_connector *aconnector; |
410 | struct drm_connector *connector; |
411 | + struct drm_dp_mst_topology_mgr *mgr; |
412 | + int ret; |
413 | + bool need_hotplug = false; |
414 | |
415 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
416 | |
417 | - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
418 | - aconnector = to_amdgpu_dm_connector(connector); |
419 | - if (aconnector->dc_link->type == dc_connection_mst_branch && |
420 | - !aconnector->mst_port) { |
421 | + list_for_each_entry(connector, &dev->mode_config.connector_list, |
422 | + head) { |
423 | + aconnector = to_amdgpu_dm_connector(connector); |
424 | + if (aconnector->dc_link->type != dc_connection_mst_branch || |
425 | + aconnector->mst_port) |
426 | + continue; |
427 | |
428 | - if (suspend) |
429 | - drm_dp_mst_topology_mgr_suspend(&aconnector->mst_mgr); |
430 | - else |
431 | - drm_dp_mst_topology_mgr_resume(&aconnector->mst_mgr); |
432 | - } |
433 | + mgr = &aconnector->mst_mgr; |
434 | + |
435 | + if (suspend) { |
436 | + drm_dp_mst_topology_mgr_suspend(mgr); |
437 | + } else { |
438 | + ret = drm_dp_mst_topology_mgr_resume(mgr); |
439 | + if (ret < 0) { |
440 | + drm_dp_mst_topology_mgr_set_mst(mgr, false); |
441 | + need_hotplug = true; |
442 | + } |
443 | + } |
444 | } |
445 | |
446 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
447 | + |
448 | + if (need_hotplug) |
449 | + drm_kms_helper_hotplug_event(dev); |
450 | } |
451 | |
452 | static int dm_hw_init(void *handle) |
453 | @@ -816,7 +830,6 @@ static int dm_resume(void *handle) |
454 | struct drm_plane_state *new_plane_state; |
455 | struct dm_plane_state *dm_new_plane_state; |
456 | enum dc_connection_type new_connection_type = dc_connection_none; |
457 | - int ret; |
458 | int i; |
459 | |
460 | /* power on hardware */ |
461 | @@ -889,13 +902,13 @@ static int dm_resume(void *handle) |
462 | } |
463 | } |
464 | |
465 | - ret = drm_atomic_helper_resume(ddev, dm->cached_state); |
466 | + drm_atomic_helper_resume(ddev, dm->cached_state); |
467 | |
468 | dm->cached_state = NULL; |
469 | |
470 | amdgpu_dm_irq_resume_late(adev); |
471 | |
472 | - return ret; |
473 | + return 0; |
474 | } |
475 | |
476 | static const struct amd_ip_funcs amdgpu_dm_funcs = { |
477 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
478 | index 5da2186b3615..5141c1401889 100644 |
479 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
480 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
481 | @@ -2617,11 +2617,11 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option) |
482 | { |
483 | struct dc *core_dc = pipe_ctx->stream->ctx->dc; |
484 | |
485 | + core_dc->hwss.blank_stream(pipe_ctx); |
486 | + |
487 | if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) |
488 | deallocate_mst_payload(pipe_ctx); |
489 | |
490 | - core_dc->hwss.blank_stream(pipe_ctx); |
491 | - |
492 | core_dc->hwss.disable_stream(pipe_ctx, option); |
493 | |
494 | disable_link(pipe_ctx->stream->sink->link, pipe_ctx->stream->signal); |
495 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c |
496 | index 9d64f874f965..b10ed61526a5 100644 |
497 | --- a/drivers/gpu/drm/drm_fb_helper.c |
498 | +++ b/drivers/gpu/drm/drm_fb_helper.c |
499 | @@ -1621,6 +1621,64 @@ static bool drm_fb_pixel_format_equal(const struct fb_var_screeninfo *var_1, |
500 | var_1->transp.msb_right == var_2->transp.msb_right; |
501 | } |
502 | |
503 | +static void drm_fb_helper_fill_pixel_fmt(struct fb_var_screeninfo *var, |
504 | + u8 depth) |
505 | +{ |
506 | + switch (depth) { |
507 | + case 8: |
508 | + var->red.offset = 0; |
509 | + var->green.offset = 0; |
510 | + var->blue.offset = 0; |
511 | + var->red.length = 8; /* 8bit DAC */ |
512 | + var->green.length = 8; |
513 | + var->blue.length = 8; |
514 | + var->transp.offset = 0; |
515 | + var->transp.length = 0; |
516 | + break; |
517 | + case 15: |
518 | + var->red.offset = 10; |
519 | + var->green.offset = 5; |
520 | + var->blue.offset = 0; |
521 | + var->red.length = 5; |
522 | + var->green.length = 5; |
523 | + var->blue.length = 5; |
524 | + var->transp.offset = 15; |
525 | + var->transp.length = 1; |
526 | + break; |
527 | + case 16: |
528 | + var->red.offset = 11; |
529 | + var->green.offset = 5; |
530 | + var->blue.offset = 0; |
531 | + var->red.length = 5; |
532 | + var->green.length = 6; |
533 | + var->blue.length = 5; |
534 | + var->transp.offset = 0; |
535 | + break; |
536 | + case 24: |
537 | + var->red.offset = 16; |
538 | + var->green.offset = 8; |
539 | + var->blue.offset = 0; |
540 | + var->red.length = 8; |
541 | + var->green.length = 8; |
542 | + var->blue.length = 8; |
543 | + var->transp.offset = 0; |
544 | + var->transp.length = 0; |
545 | + break; |
546 | + case 32: |
547 | + var->red.offset = 16; |
548 | + var->green.offset = 8; |
549 | + var->blue.offset = 0; |
550 | + var->red.length = 8; |
551 | + var->green.length = 8; |
552 | + var->blue.length = 8; |
553 | + var->transp.offset = 24; |
554 | + var->transp.length = 8; |
555 | + break; |
556 | + default: |
557 | + break; |
558 | + } |
559 | +} |
560 | + |
561 | /** |
562 | * drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var |
563 | * @var: screeninfo to check |
564 | @@ -1650,6 +1708,20 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
565 | return -EINVAL; |
566 | } |
567 | |
568 | + /* |
569 | + * Workaround for SDL 1.2, which is known to be setting all pixel format |
570 | + * fields values to zero in some cases. We treat this situation as a |
571 | + * kind of "use some reasonable autodetected values". |
572 | + */ |
573 | + if (!var->red.offset && !var->green.offset && |
574 | + !var->blue.offset && !var->transp.offset && |
575 | + !var->red.length && !var->green.length && |
576 | + !var->blue.length && !var->transp.length && |
577 | + !var->red.msb_right && !var->green.msb_right && |
578 | + !var->blue.msb_right && !var->transp.msb_right) { |
579 | + drm_fb_helper_fill_pixel_fmt(var, fb->format->depth); |
580 | + } |
581 | + |
582 | /* |
583 | * drm fbdev emulation doesn't support changing the pixel format at all, |
584 | * so reject all pixel format changing requests. |
585 | @@ -1961,59 +2033,7 @@ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helpe |
586 | info->var.yoffset = 0; |
587 | info->var.activate = FB_ACTIVATE_NOW; |
588 | |
589 | - switch (fb->format->depth) { |
590 | - case 8: |
591 | - info->var.red.offset = 0; |
592 | - info->var.green.offset = 0; |
593 | - info->var.blue.offset = 0; |
594 | - info->var.red.length = 8; /* 8bit DAC */ |
595 | - info->var.green.length = 8; |
596 | - info->var.blue.length = 8; |
597 | - info->var.transp.offset = 0; |
598 | - info->var.transp.length = 0; |
599 | - break; |
600 | - case 15: |
601 | - info->var.red.offset = 10; |
602 | - info->var.green.offset = 5; |
603 | - info->var.blue.offset = 0; |
604 | - info->var.red.length = 5; |
605 | - info->var.green.length = 5; |
606 | - info->var.blue.length = 5; |
607 | - info->var.transp.offset = 15; |
608 | - info->var.transp.length = 1; |
609 | - break; |
610 | - case 16: |
611 | - info->var.red.offset = 11; |
612 | - info->var.green.offset = 5; |
613 | - info->var.blue.offset = 0; |
614 | - info->var.red.length = 5; |
615 | - info->var.green.length = 6; |
616 | - info->var.blue.length = 5; |
617 | - info->var.transp.offset = 0; |
618 | - break; |
619 | - case 24: |
620 | - info->var.red.offset = 16; |
621 | - info->var.green.offset = 8; |
622 | - info->var.blue.offset = 0; |
623 | - info->var.red.length = 8; |
624 | - info->var.green.length = 8; |
625 | - info->var.blue.length = 8; |
626 | - info->var.transp.offset = 0; |
627 | - info->var.transp.length = 0; |
628 | - break; |
629 | - case 32: |
630 | - info->var.red.offset = 16; |
631 | - info->var.green.offset = 8; |
632 | - info->var.blue.offset = 0; |
633 | - info->var.red.length = 8; |
634 | - info->var.green.length = 8; |
635 | - info->var.blue.length = 8; |
636 | - info->var.transp.offset = 24; |
637 | - info->var.transp.length = 8; |
638 | - break; |
639 | - default: |
640 | - break; |
641 | - } |
642 | + drm_fb_helper_fill_pixel_fmt(&info->var, fb->format->depth); |
643 | |
644 | info->var.xres = fb_width; |
645 | info->var.yres = fb_height; |
646 | diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c |
647 | index 07999fe09ad2..4fa1d2b146b1 100644 |
648 | --- a/drivers/gpu/drm/i915/i915_gem_gtt.c |
649 | +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c |
650 | @@ -2117,6 +2117,7 @@ static struct i915_vma *pd_vma_create(struct gen6_hw_ppgtt *ppgtt, int size) |
651 | int gen6_ppgtt_pin(struct i915_hw_ppgtt *base) |
652 | { |
653 | struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(base); |
654 | + int err; |
655 | |
656 | /* |
657 | * Workaround the limited maximum vma->pin_count and the aliasing_ppgtt |
658 | @@ -2132,9 +2133,17 @@ int gen6_ppgtt_pin(struct i915_hw_ppgtt *base) |
659 | * allocator works in address space sizes, so it's multiplied by page |
660 | * size. We allocate at the top of the GTT to avoid fragmentation. |
661 | */ |
662 | - return i915_vma_pin(ppgtt->vma, |
663 | - 0, GEN6_PD_ALIGN, |
664 | - PIN_GLOBAL | PIN_HIGH); |
665 | + err = i915_vma_pin(ppgtt->vma, |
666 | + 0, GEN6_PD_ALIGN, |
667 | + PIN_GLOBAL | PIN_HIGH); |
668 | + if (err) |
669 | + goto unpin; |
670 | + |
671 | + return 0; |
672 | + |
673 | +unpin: |
674 | + ppgtt->pin_count = 0; |
675 | + return err; |
676 | } |
677 | |
678 | void gen6_ppgtt_unpin(struct i915_hw_ppgtt *base) |
679 | diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c |
680 | index 1aca742fde4a..ccd76c71af09 100644 |
681 | --- a/drivers/i2c/i2c-dev.c |
682 | +++ b/drivers/i2c/i2c-dev.c |
683 | @@ -470,9 +470,15 @@ static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
684 | data_arg.data); |
685 | } |
686 | case I2C_RETRIES: |
687 | + if (arg > INT_MAX) |
688 | + return -EINVAL; |
689 | + |
690 | client->adapter->retries = arg; |
691 | break; |
692 | case I2C_TIMEOUT: |
693 | + if (arg > INT_MAX) |
694 | + return -EINVAL; |
695 | + |
696 | /* For historical reasons, user-space sets the timeout |
697 | * value in units of 10 ms. |
698 | */ |
699 | diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c |
700 | index 699d3cf49c6d..7c42a57aca1f 100644 |
701 | --- a/drivers/mtd/nand/raw/qcom_nandc.c |
702 | +++ b/drivers/mtd/nand/raw/qcom_nandc.c |
703 | @@ -2833,6 +2833,16 @@ static int qcom_nand_host_init_and_register(struct qcom_nand_controller *nandc, |
704 | if (ret) |
705 | return ret; |
706 | |
707 | + if (nandc->props->is_bam) { |
708 | + free_bam_transaction(nandc); |
709 | + nandc->bam_txn = alloc_bam_transaction(nandc); |
710 | + if (!nandc->bam_txn) { |
711 | + dev_err(nandc->dev, |
712 | + "failed to allocate bam transaction\n"); |
713 | + return -ENOMEM; |
714 | + } |
715 | + } |
716 | + |
717 | ret = mtd_device_register(mtd, NULL, 0); |
718 | if (ret) |
719 | nand_cleanup(chip); |
720 | @@ -2847,16 +2857,6 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc) |
721 | struct qcom_nand_host *host; |
722 | int ret; |
723 | |
724 | - if (nandc->props->is_bam) { |
725 | - free_bam_transaction(nandc); |
726 | - nandc->bam_txn = alloc_bam_transaction(nandc); |
727 | - if (!nandc->bam_txn) { |
728 | - dev_err(nandc->dev, |
729 | - "failed to allocate bam transaction\n"); |
730 | - return -ENOMEM; |
731 | - } |
732 | - } |
733 | - |
734 | for_each_available_child_of_node(dn, child) { |
735 | host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); |
736 | if (!host) { |
737 | diff --git a/drivers/opp/core.c b/drivers/opp/core.c |
738 | index 2c2df4e4fc14..9280f51f1ce6 100644 |
739 | --- a/drivers/opp/core.c |
740 | +++ b/drivers/opp/core.c |
741 | @@ -951,11 +951,9 @@ void _opp_free(struct dev_pm_opp *opp) |
742 | kfree(opp); |
743 | } |
744 | |
745 | -static void _opp_kref_release(struct kref *kref) |
746 | +static void _opp_kref_release(struct dev_pm_opp *opp, |
747 | + struct opp_table *opp_table) |
748 | { |
749 | - struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref); |
750 | - struct opp_table *opp_table = opp->opp_table; |
751 | - |
752 | /* |
753 | * Notify the changes in the availability of the operable |
754 | * frequency/voltage list. |
755 | @@ -964,7 +962,22 @@ static void _opp_kref_release(struct kref *kref) |
756 | opp_debug_remove_one(opp); |
757 | list_del(&opp->node); |
758 | kfree(opp); |
759 | +} |
760 | |
761 | +static void _opp_kref_release_unlocked(struct kref *kref) |
762 | +{ |
763 | + struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref); |
764 | + struct opp_table *opp_table = opp->opp_table; |
765 | + |
766 | + _opp_kref_release(opp, opp_table); |
767 | +} |
768 | + |
769 | +static void _opp_kref_release_locked(struct kref *kref) |
770 | +{ |
771 | + struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref); |
772 | + struct opp_table *opp_table = opp->opp_table; |
773 | + |
774 | + _opp_kref_release(opp, opp_table); |
775 | mutex_unlock(&opp_table->lock); |
776 | } |
777 | |
778 | @@ -975,10 +988,16 @@ void dev_pm_opp_get(struct dev_pm_opp *opp) |
779 | |
780 | void dev_pm_opp_put(struct dev_pm_opp *opp) |
781 | { |
782 | - kref_put_mutex(&opp->kref, _opp_kref_release, &opp->opp_table->lock); |
783 | + kref_put_mutex(&opp->kref, _opp_kref_release_locked, |
784 | + &opp->opp_table->lock); |
785 | } |
786 | EXPORT_SYMBOL_GPL(dev_pm_opp_put); |
787 | |
788 | +static void dev_pm_opp_put_unlocked(struct dev_pm_opp *opp) |
789 | +{ |
790 | + kref_put(&opp->kref, _opp_kref_release_unlocked); |
791 | +} |
792 | + |
793 | /** |
794 | * dev_pm_opp_remove() - Remove an OPP from OPP table |
795 | * @dev: device for which we do this operation |
796 | @@ -1022,6 +1041,40 @@ void dev_pm_opp_remove(struct device *dev, unsigned long freq) |
797 | } |
798 | EXPORT_SYMBOL_GPL(dev_pm_opp_remove); |
799 | |
800 | +/** |
801 | + * dev_pm_opp_remove_all_dynamic() - Remove all dynamically created OPPs |
802 | + * @dev: device for which we do this operation |
803 | + * |
804 | + * This function removes all dynamically created OPPs from the opp table. |
805 | + */ |
806 | +void dev_pm_opp_remove_all_dynamic(struct device *dev) |
807 | +{ |
808 | + struct opp_table *opp_table; |
809 | + struct dev_pm_opp *opp, *temp; |
810 | + int count = 0; |
811 | + |
812 | + opp_table = _find_opp_table(dev); |
813 | + if (IS_ERR(opp_table)) |
814 | + return; |
815 | + |
816 | + mutex_lock(&opp_table->lock); |
817 | + list_for_each_entry_safe(opp, temp, &opp_table->opp_list, node) { |
818 | + if (opp->dynamic) { |
819 | + dev_pm_opp_put_unlocked(opp); |
820 | + count++; |
821 | + } |
822 | + } |
823 | + mutex_unlock(&opp_table->lock); |
824 | + |
825 | + /* Drop the references taken by dev_pm_opp_add() */ |
826 | + while (count--) |
827 | + dev_pm_opp_put_opp_table(opp_table); |
828 | + |
829 | + /* Drop the reference taken by _find_opp_table() */ |
830 | + dev_pm_opp_put_opp_table(opp_table); |
831 | +} |
832 | +EXPORT_SYMBOL_GPL(dev_pm_opp_remove_all_dynamic); |
833 | + |
834 | struct dev_pm_opp *_opp_allocate(struct opp_table *table) |
835 | { |
836 | struct dev_pm_opp *opp; |
837 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c |
838 | index 29a05759a294..0fa9e8fdce66 100644 |
839 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c |
840 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c |
841 | @@ -99,9 +99,6 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) |
842 | (i * MAX_MSI_IRQS_PER_CTRL) + |
843 | pos); |
844 | generic_handle_irq(irq); |
845 | - dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + |
846 | - (i * MSI_REG_CTRL_BLOCK_SIZE), |
847 | - 4, 1 << pos); |
848 | pos++; |
849 | } |
850 | } |
851 | @@ -168,8 +165,8 @@ static void dw_pci_bottom_mask(struct irq_data *data) |
852 | bit = data->hwirq % MAX_MSI_IRQS_PER_CTRL; |
853 | |
854 | pp->irq_status[ctrl] &= ~(1 << bit); |
855 | - dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, |
856 | - pp->irq_status[ctrl]); |
857 | + dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK + res, 4, |
858 | + ~pp->irq_status[ctrl]); |
859 | } |
860 | |
861 | raw_spin_unlock_irqrestore(&pp->lock, flags); |
862 | @@ -191,8 +188,8 @@ static void dw_pci_bottom_unmask(struct irq_data *data) |
863 | bit = data->hwirq % MAX_MSI_IRQS_PER_CTRL; |
864 | |
865 | pp->irq_status[ctrl] |= 1 << bit; |
866 | - dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, |
867 | - pp->irq_status[ctrl]); |
868 | + dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK + res, 4, |
869 | + ~pp->irq_status[ctrl]); |
870 | } |
871 | |
872 | raw_spin_unlock_irqrestore(&pp->lock, flags); |
873 | @@ -200,13 +197,22 @@ static void dw_pci_bottom_unmask(struct irq_data *data) |
874 | |
875 | static void dw_pci_bottom_ack(struct irq_data *d) |
876 | { |
877 | - struct msi_desc *msi = irq_data_get_msi_desc(d); |
878 | - struct pcie_port *pp; |
879 | + struct pcie_port *pp = irq_data_get_irq_chip_data(d); |
880 | + unsigned int res, bit, ctrl; |
881 | + unsigned long flags; |
882 | + |
883 | + ctrl = d->hwirq / MAX_MSI_IRQS_PER_CTRL; |
884 | + res = ctrl * MSI_REG_CTRL_BLOCK_SIZE; |
885 | + bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL; |
886 | + |
887 | + raw_spin_lock_irqsave(&pp->lock, flags); |
888 | |
889 | - pp = msi_desc_to_pci_sysdata(msi); |
890 | + dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + res, 4, 1 << bit); |
891 | |
892 | if (pp->ops->msi_irq_ack) |
893 | pp->ops->msi_irq_ack(d->hwirq, pp); |
894 | + |
895 | + raw_spin_unlock_irqrestore(&pp->lock, flags); |
896 | } |
897 | |
898 | static struct irq_chip dw_pci_msi_bottom_irq_chip = { |
899 | @@ -658,10 +664,15 @@ void dw_pcie_setup_rc(struct pcie_port *pp) |
900 | num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; |
901 | |
902 | /* Initialize IRQ Status array */ |
903 | - for (ctrl = 0; ctrl < num_ctrls; ctrl++) |
904 | - dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_ENABLE + |
905 | + for (ctrl = 0; ctrl < num_ctrls; ctrl++) { |
906 | + dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK + |
907 | (ctrl * MSI_REG_CTRL_BLOCK_SIZE), |
908 | - 4, &pp->irq_status[ctrl]); |
909 | + 4, ~0); |
910 | + dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + |
911 | + (ctrl * MSI_REG_CTRL_BLOCK_SIZE), |
912 | + 4, ~0); |
913 | + pp->irq_status[ctrl] = 0; |
914 | + } |
915 | |
916 | /* Setup RC BARs */ |
917 | dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_0, 0x00000004); |
918 | diff --git a/drivers/staging/rtl8188eu/core/rtw_security.c b/drivers/staging/rtl8188eu/core/rtw_security.c |
919 | index f7407632e80b..bab96c870042 100644 |
920 | --- a/drivers/staging/rtl8188eu/core/rtw_security.c |
921 | +++ b/drivers/staging/rtl8188eu/core/rtw_security.c |
922 | @@ -154,7 +154,7 @@ void rtw_wep_encrypt(struct adapter *padapter, u8 *pxmitframe) |
923 | |
924 | pframe = ((struct xmit_frame *)pxmitframe)->buf_addr + hw_hdr_offset; |
925 | |
926 | - crypto_ops = try_then_request_module(lib80211_get_crypto_ops("WEP"), "lib80211_crypt_wep"); |
927 | + crypto_ops = lib80211_get_crypto_ops("WEP"); |
928 | |
929 | if (!crypto_ops) |
930 | return; |
931 | @@ -210,7 +210,7 @@ int rtw_wep_decrypt(struct adapter *padapter, u8 *precvframe) |
932 | void *crypto_private = NULL; |
933 | int status = _SUCCESS; |
934 | const int keyindex = prxattrib->key_index; |
935 | - struct lib80211_crypto_ops *crypto_ops = try_then_request_module(lib80211_get_crypto_ops("WEP"), "lib80211_crypt_wep"); |
936 | + struct lib80211_crypto_ops *crypto_ops = lib80211_get_crypto_ops("WEP"); |
937 | char iv[4], icv[4]; |
938 | |
939 | if (!crypto_ops) { |
940 | @@ -1291,7 +1291,7 @@ u32 rtw_aes_decrypt(struct adapter *padapter, u8 *precvframe) |
941 | struct sk_buff *skb = ((struct recv_frame *)precvframe)->pkt; |
942 | void *crypto_private = NULL; |
943 | u8 *key, *pframe = skb->data; |
944 | - struct lib80211_crypto_ops *crypto_ops = try_then_request_module(lib80211_get_crypto_ops("CCMP"), "lib80211_crypt_ccmp"); |
945 | + struct lib80211_crypto_ops *crypto_ops = lib80211_get_crypto_ops("CCMP"); |
946 | struct security_priv *psecuritypriv = &padapter->securitypriv; |
947 | char iv[8], icv[8]; |
948 | |
949 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
950 | index ed8c62b2d9d1..739f8960811a 100644 |
951 | --- a/drivers/usb/class/cdc-acm.c |
952 | +++ b/drivers/usb/class/cdc-acm.c |
953 | @@ -1865,6 +1865,13 @@ static const struct usb_device_id acm_ids[] = { |
954 | .driver_info = IGNORE_DEVICE, |
955 | }, |
956 | |
957 | + { USB_DEVICE(0x1bc7, 0x0021), /* Telit 3G ACM only composition */ |
958 | + .driver_info = SEND_ZERO_PACKET, |
959 | + }, |
960 | + { USB_DEVICE(0x1bc7, 0x0023), /* Telit 3G ACM + ECM composition */ |
961 | + .driver_info = SEND_ZERO_PACKET, |
962 | + }, |
963 | + |
964 | /* control interfaces without any protocol set */ |
965 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
966 | USB_CDC_PROTO_NONE) }, |
967 | diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c |
968 | index 356b05c82dbc..f713cecc1f41 100644 |
969 | --- a/drivers/usb/core/generic.c |
970 | +++ b/drivers/usb/core/generic.c |
971 | @@ -143,9 +143,12 @@ int usb_choose_configuration(struct usb_device *udev) |
972 | continue; |
973 | } |
974 | |
975 | - if (i > 0 && desc && is_audio(desc) && is_uac3_config(desc)) { |
976 | - best = c; |
977 | - break; |
978 | + if (i > 0 && desc && is_audio(desc)) { |
979 | + if (is_uac3_config(desc)) { |
980 | + best = c; |
981 | + break; |
982 | + } |
983 | + continue; |
984 | } |
985 | |
986 | /* From the remaining configs, choose the first one whose |
987 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
988 | index 514c5214ddb2..8bc35d53408b 100644 |
989 | --- a/drivers/usb/core/quirks.c |
990 | +++ b/drivers/usb/core/quirks.c |
991 | @@ -394,7 +394,8 @@ static const struct usb_device_id usb_quirk_list[] = { |
992 | { USB_DEVICE(0x1a40, 0x0101), .driver_info = USB_QUIRK_HUB_SLOW_RESET }, |
993 | |
994 | /* Corsair K70 RGB */ |
995 | - { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT }, |
996 | + { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT | |
997 | + USB_QUIRK_DELAY_CTRL_MSG }, |
998 | |
999 | /* Corsair Strafe */ |
1000 | { USB_DEVICE(0x1b1c, 0x1b15), .driver_info = USB_QUIRK_DELAY_INIT | |
1001 | diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c |
1002 | index e227bb5b794f..101ebac43c87 100644 |
1003 | --- a/drivers/usb/storage/scsiglue.c |
1004 | +++ b/drivers/usb/storage/scsiglue.c |
1005 | @@ -235,8 +235,12 @@ static int slave_configure(struct scsi_device *sdev) |
1006 | if (!(us->fflags & US_FL_NEEDS_CAP16)) |
1007 | sdev->try_rc_10_first = 1; |
1008 | |
1009 | - /* assume SPC3 or latter devices support sense size > 18 */ |
1010 | - if (sdev->scsi_level > SCSI_SPC_2) |
1011 | + /* |
1012 | + * assume SPC3 or latter devices support sense size > 18 |
1013 | + * unless US_FL_BAD_SENSE quirk is specified. |
1014 | + */ |
1015 | + if (sdev->scsi_level > SCSI_SPC_2 && |
1016 | + !(us->fflags & US_FL_BAD_SENSE)) |
1017 | us->fflags |= US_FL_SANE_SENSE; |
1018 | |
1019 | /* |
1020 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
1021 | index f7f83b21dc74..ea0d27a94afe 100644 |
1022 | --- a/drivers/usb/storage/unusual_devs.h |
1023 | +++ b/drivers/usb/storage/unusual_devs.h |
1024 | @@ -1265,6 +1265,18 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, |
1025 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
1026 | US_FL_FIX_CAPACITY ), |
1027 | |
1028 | +/* |
1029 | + * Reported by Icenowy Zheng <icenowy@aosc.io> |
1030 | + * The SMI SM3350 USB-UFS bridge controller will enter a wrong state |
1031 | + * that do not process read/write command if a long sense is requested, |
1032 | + * so force to use 18-byte sense. |
1033 | + */ |
1034 | +UNUSUAL_DEV( 0x090c, 0x3350, 0x0000, 0xffff, |
1035 | + "SMI", |
1036 | + "SM3350 UFS-to-USB-Mass-Storage bridge", |
1037 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
1038 | + US_FL_BAD_SENSE ), |
1039 | + |
1040 | /* |
1041 | * Reported by Paul Hartman <paul.hartman+linux@gmail.com> |
1042 | * This card reader returns "Illegal Request, Logical Block Address |
1043 | diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c |
1044 | index d9fd3188615d..64cbc2d007c9 100644 |
1045 | --- a/drivers/vfio/vfio_iommu_type1.c |
1046 | +++ b/drivers/vfio/vfio_iommu_type1.c |
1047 | @@ -878,7 +878,7 @@ static int vfio_dma_do_unmap(struct vfio_iommu *iommu, |
1048 | return -EINVAL; |
1049 | if (!unmap->size || unmap->size & mask) |
1050 | return -EINVAL; |
1051 | - if (unmap->iova + unmap->size < unmap->iova || |
1052 | + if (unmap->iova + unmap->size - 1 < unmap->iova || |
1053 | unmap->size > SIZE_MAX) |
1054 | return -EINVAL; |
1055 | |
1056 | diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c |
1057 | index 99e7645ad94e..47f1183b3dbe 100644 |
1058 | --- a/fs/btrfs/ctree.c |
1059 | +++ b/fs/btrfs/ctree.c |
1060 | @@ -1015,19 +1015,21 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, |
1061 | parent_start = parent->start; |
1062 | |
1063 | /* |
1064 | - * If we are COWing a node/leaf from the extent, chunk or device trees, |
1065 | - * make sure that we do not finish block group creation of pending block |
1066 | - * groups. We do this to avoid a deadlock. |
1067 | + * If we are COWing a node/leaf from the extent, chunk, device or free |
1068 | + * space trees, make sure that we do not finish block group creation of |
1069 | + * pending block groups. We do this to avoid a deadlock. |
1070 | * COWing can result in allocation of a new chunk, and flushing pending |
1071 | * block groups (btrfs_create_pending_block_groups()) can be triggered |
1072 | * when finishing allocation of a new chunk. Creation of a pending block |
1073 | - * group modifies the extent, chunk and device trees, therefore we could |
1074 | - * deadlock with ourselves since we are holding a lock on an extent |
1075 | - * buffer that btrfs_create_pending_block_groups() may try to COW later. |
1076 | + * group modifies the extent, chunk, device and free space trees, |
1077 | + * therefore we could deadlock with ourselves since we are holding a |
1078 | + * lock on an extent buffer that btrfs_create_pending_block_groups() may |
1079 | + * try to COW later. |
1080 | */ |
1081 | if (root == fs_info->extent_root || |
1082 | root == fs_info->chunk_root || |
1083 | - root == fs_info->dev_root) |
1084 | + root == fs_info->dev_root || |
1085 | + root == fs_info->free_space_root) |
1086 | trans->can_flush_pending_bgs = false; |
1087 | |
1088 | cow = btrfs_alloc_tree_block(trans, root, parent_start, |
1089 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c |
1090 | index f70825af6438..9e419f6878c5 100644 |
1091 | --- a/fs/btrfs/qgroup.c |
1092 | +++ b/fs/btrfs/qgroup.c |
1093 | @@ -1013,16 +1013,22 @@ out_add_root: |
1094 | btrfs_abort_transaction(trans, ret); |
1095 | goto out_free_path; |
1096 | } |
1097 | - spin_lock(&fs_info->qgroup_lock); |
1098 | - fs_info->quota_root = quota_root; |
1099 | - set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); |
1100 | - spin_unlock(&fs_info->qgroup_lock); |
1101 | |
1102 | ret = btrfs_commit_transaction(trans); |
1103 | trans = NULL; |
1104 | if (ret) |
1105 | goto out_free_path; |
1106 | |
1107 | + /* |
1108 | + * Set quota enabled flag after committing the transaction, to avoid |
1109 | + * deadlocks on fs_info->qgroup_ioctl_lock with concurrent snapshot |
1110 | + * creation. |
1111 | + */ |
1112 | + spin_lock(&fs_info->qgroup_lock); |
1113 | + fs_info->quota_root = quota_root; |
1114 | + set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); |
1115 | + spin_unlock(&fs_info->qgroup_lock); |
1116 | + |
1117 | ret = qgroup_rescan_init(fs_info, 0, 1); |
1118 | if (!ret) { |
1119 | qgroup_rescan_zero_tracking(fs_info); |
1120 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c |
1121 | index f435d397019e..c872adfc939e 100644 |
1122 | --- a/fs/btrfs/volumes.c |
1123 | +++ b/fs/btrfs/volumes.c |
1124 | @@ -3724,6 +3724,7 @@ int btrfs_balance(struct btrfs_fs_info *fs_info, |
1125 | int ret; |
1126 | u64 num_devices; |
1127 | unsigned seq; |
1128 | + bool reducing_integrity; |
1129 | |
1130 | if (btrfs_fs_closing(fs_info) || |
1131 | atomic_read(&fs_info->balance_pause_req) || |
1132 | @@ -3803,24 +3804,30 @@ int btrfs_balance(struct btrfs_fs_info *fs_info, |
1133 | !(bctl->sys.target & allowed)) || |
1134 | ((bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) && |
1135 | (fs_info->avail_metadata_alloc_bits & allowed) && |
1136 | - !(bctl->meta.target & allowed))) { |
1137 | - if (bctl->flags & BTRFS_BALANCE_FORCE) { |
1138 | - btrfs_info(fs_info, |
1139 | - "balance: force reducing metadata integrity"); |
1140 | - } else { |
1141 | - btrfs_err(fs_info, |
1142 | - "balance: reduces metadata integrity, use --force if you want this"); |
1143 | - ret = -EINVAL; |
1144 | - goto out; |
1145 | - } |
1146 | - } |
1147 | + !(bctl->meta.target & allowed))) |
1148 | + reducing_integrity = true; |
1149 | + else |
1150 | + reducing_integrity = false; |
1151 | + |
1152 | + /* if we're not converting, the target field is uninitialized */ |
1153 | + meta_target = (bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) ? |
1154 | + bctl->meta.target : fs_info->avail_metadata_alloc_bits; |
1155 | + data_target = (bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) ? |
1156 | + bctl->data.target : fs_info->avail_data_alloc_bits; |
1157 | } while (read_seqretry(&fs_info->profiles_lock, seq)); |
1158 | |
1159 | - /* if we're not converting, the target field is uninitialized */ |
1160 | - meta_target = (bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) ? |
1161 | - bctl->meta.target : fs_info->avail_metadata_alloc_bits; |
1162 | - data_target = (bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) ? |
1163 | - bctl->data.target : fs_info->avail_data_alloc_bits; |
1164 | + if (reducing_integrity) { |
1165 | + if (bctl->flags & BTRFS_BALANCE_FORCE) { |
1166 | + btrfs_info(fs_info, |
1167 | + "balance: force reducing metadata integrity"); |
1168 | + } else { |
1169 | + btrfs_err(fs_info, |
1170 | + "balance: reduces metadata integrity, use --force if you want this"); |
1171 | + ret = -EINVAL; |
1172 | + goto out; |
1173 | + } |
1174 | + } |
1175 | + |
1176 | if (btrfs_get_num_tolerated_disk_barrier_failures(meta_target) < |
1177 | btrfs_get_num_tolerated_disk_barrier_failures(data_target)) { |
1178 | int meta_index = btrfs_bg_flags_to_raid_index(meta_target); |
1179 | diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c |
1180 | index ea78c3d6dcfc..f141b45ce349 100644 |
1181 | --- a/fs/btrfs/xattr.c |
1182 | +++ b/fs/btrfs/xattr.c |
1183 | @@ -11,6 +11,7 @@ |
1184 | #include <linux/security.h> |
1185 | #include <linux/posix_acl_xattr.h> |
1186 | #include <linux/iversion.h> |
1187 | +#include <linux/sched/mm.h> |
1188 | #include "ctree.h" |
1189 | #include "btrfs_inode.h" |
1190 | #include "transaction.h" |
1191 | @@ -422,9 +423,15 @@ static int btrfs_initxattrs(struct inode *inode, |
1192 | { |
1193 | const struct xattr *xattr; |
1194 | struct btrfs_trans_handle *trans = fs_info; |
1195 | + unsigned int nofs_flag; |
1196 | char *name; |
1197 | int err = 0; |
1198 | |
1199 | + /* |
1200 | + * We're holding a transaction handle, so use a NOFS memory allocation |
1201 | + * context to avoid deadlock if reclaim happens. |
1202 | + */ |
1203 | + nofs_flag = memalloc_nofs_save(); |
1204 | for (xattr = xattr_array; xattr->name != NULL; xattr++) { |
1205 | name = kmalloc(XATTR_SECURITY_PREFIX_LEN + |
1206 | strlen(xattr->name) + 1, GFP_KERNEL); |
1207 | @@ -440,6 +447,7 @@ static int btrfs_initxattrs(struct inode *inode, |
1208 | if (err < 0) |
1209 | break; |
1210 | } |
1211 | + memalloc_nofs_restore(nofs_flag); |
1212 | return err; |
1213 | } |
1214 | |
1215 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
1216 | index c23bf9da93d2..d5c3e0725849 100644 |
1217 | --- a/fs/cifs/file.c |
1218 | +++ b/fs/cifs/file.c |
1219 | @@ -1131,10 +1131,10 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile) |
1220 | |
1221 | /* |
1222 | * Accessing maxBuf is racy with cifs_reconnect - need to store value |
1223 | - * and check it for zero before using. |
1224 | + * and check it before using. |
1225 | */ |
1226 | max_buf = tcon->ses->server->maxBuf; |
1227 | - if (!max_buf) { |
1228 | + if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE))) { |
1229 | free_xid(xid); |
1230 | return -EINVAL; |
1231 | } |
1232 | @@ -1471,10 +1471,10 @@ cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock, |
1233 | |
1234 | /* |
1235 | * Accessing maxBuf is racy with cifs_reconnect - need to store value |
1236 | - * and check it for zero before using. |
1237 | + * and check it before using. |
1238 | */ |
1239 | max_buf = tcon->ses->server->maxBuf; |
1240 | - if (!max_buf) |
1241 | + if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE))) |
1242 | return -EINVAL; |
1243 | |
1244 | max_num = (max_buf - sizeof(struct smb_hdr)) / |
1245 | diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c |
1246 | index 8a41f4eba726..6f33253938cd 100644 |
1247 | --- a/fs/cifs/misc.c |
1248 | +++ b/fs/cifs/misc.c |
1249 | @@ -111,21 +111,27 @@ struct cifs_tcon * |
1250 | tconInfoAlloc(void) |
1251 | { |
1252 | struct cifs_tcon *ret_buf; |
1253 | - ret_buf = kzalloc(sizeof(struct cifs_tcon), GFP_KERNEL); |
1254 | - if (ret_buf) { |
1255 | - atomic_inc(&tconInfoAllocCount); |
1256 | - ret_buf->tidStatus = CifsNew; |
1257 | - ++ret_buf->tc_count; |
1258 | - INIT_LIST_HEAD(&ret_buf->openFileList); |
1259 | - INIT_LIST_HEAD(&ret_buf->tcon_list); |
1260 | - spin_lock_init(&ret_buf->open_file_lock); |
1261 | - mutex_init(&ret_buf->crfid.fid_mutex); |
1262 | - ret_buf->crfid.fid = kzalloc(sizeof(struct cifs_fid), |
1263 | - GFP_KERNEL); |
1264 | - spin_lock_init(&ret_buf->stat_lock); |
1265 | - atomic_set(&ret_buf->num_local_opens, 0); |
1266 | - atomic_set(&ret_buf->num_remote_opens, 0); |
1267 | + |
1268 | + ret_buf = kzalloc(sizeof(*ret_buf), GFP_KERNEL); |
1269 | + if (!ret_buf) |
1270 | + return NULL; |
1271 | + ret_buf->crfid.fid = kzalloc(sizeof(*ret_buf->crfid.fid), GFP_KERNEL); |
1272 | + if (!ret_buf->crfid.fid) { |
1273 | + kfree(ret_buf); |
1274 | + return NULL; |
1275 | } |
1276 | + |
1277 | + atomic_inc(&tconInfoAllocCount); |
1278 | + ret_buf->tidStatus = CifsNew; |
1279 | + ++ret_buf->tc_count; |
1280 | + INIT_LIST_HEAD(&ret_buf->openFileList); |
1281 | + INIT_LIST_HEAD(&ret_buf->tcon_list); |
1282 | + spin_lock_init(&ret_buf->open_file_lock); |
1283 | + mutex_init(&ret_buf->crfid.fid_mutex); |
1284 | + spin_lock_init(&ret_buf->stat_lock); |
1285 | + atomic_set(&ret_buf->num_local_opens, 0); |
1286 | + atomic_set(&ret_buf->num_remote_opens, 0); |
1287 | + |
1288 | return ret_buf; |
1289 | } |
1290 | |
1291 | diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c |
1292 | index 4ed10dd086e6..2fc3d31967ee 100644 |
1293 | --- a/fs/cifs/smb2file.c |
1294 | +++ b/fs/cifs/smb2file.c |
1295 | @@ -122,10 +122,10 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock, |
1296 | |
1297 | /* |
1298 | * Accessing maxBuf is racy with cifs_reconnect - need to store value |
1299 | - * and check it for zero before using. |
1300 | + * and check it before using. |
1301 | */ |
1302 | max_buf = tcon->ses->server->maxBuf; |
1303 | - if (!max_buf) |
1304 | + if (max_buf < sizeof(struct smb2_lock_element)) |
1305 | return -EINVAL; |
1306 | |
1307 | max_num = max_buf / sizeof(struct smb2_lock_element); |
1308 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
1309 | index 27f86537a5d1..836c59fca049 100644 |
1310 | --- a/fs/cifs/smb2pdu.c |
1311 | +++ b/fs/cifs/smb2pdu.c |
1312 | @@ -3197,12 +3197,14 @@ smb2_async_readv(struct cifs_readdata *rdata) |
1313 | if (rdata->credits) { |
1314 | shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, |
1315 | SMB2_MAX_BUFFER_SIZE)); |
1316 | - shdr->CreditRequest = shdr->CreditCharge; |
1317 | + shdr->CreditRequest = |
1318 | + cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 1); |
1319 | spin_lock(&server->req_lock); |
1320 | server->credits += rdata->credits - |
1321 | le16_to_cpu(shdr->CreditCharge); |
1322 | spin_unlock(&server->req_lock); |
1323 | wake_up(&server->request_q); |
1324 | + rdata->credits = le16_to_cpu(shdr->CreditCharge); |
1325 | flags |= CIFS_HAS_CREDITS; |
1326 | } |
1327 | |
1328 | @@ -3474,12 +3476,14 @@ smb2_async_writev(struct cifs_writedata *wdata, |
1329 | if (wdata->credits) { |
1330 | shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, |
1331 | SMB2_MAX_BUFFER_SIZE)); |
1332 | - shdr->CreditRequest = shdr->CreditCharge; |
1333 | + shdr->CreditRequest = |
1334 | + cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 1); |
1335 | spin_lock(&server->req_lock); |
1336 | server->credits += wdata->credits - |
1337 | le16_to_cpu(shdr->CreditCharge); |
1338 | spin_unlock(&server->req_lock); |
1339 | wake_up(&server->request_q); |
1340 | + wdata->credits = le16_to_cpu(shdr->CreditCharge); |
1341 | flags |= CIFS_HAS_CREDITS; |
1342 | } |
1343 | |
1344 | diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c |
1345 | index 83ff0c25710d..d51064c1ba42 100644 |
1346 | --- a/fs/cifs/transport.c |
1347 | +++ b/fs/cifs/transport.c |
1348 | @@ -385,7 +385,7 @@ smbd_done: |
1349 | if (rc < 0 && rc != -EINTR) |
1350 | cifs_dbg(VFS, "Error %d sending data on socket to server\n", |
1351 | rc); |
1352 | - else |
1353 | + else if (rc > 0) |
1354 | rc = 0; |
1355 | |
1356 | return rc; |
1357 | @@ -793,7 +793,8 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
1358 | int i, j, rc = 0; |
1359 | int timeout, optype; |
1360 | struct mid_q_entry *midQ[MAX_COMPOUND]; |
1361 | - unsigned int credits = 0; |
1362 | + bool cancelled_mid[MAX_COMPOUND] = {false}; |
1363 | + unsigned int credits[MAX_COMPOUND] = {0}; |
1364 | char *buf; |
1365 | |
1366 | timeout = flags & CIFS_TIMEOUT_MASK; |
1367 | @@ -811,13 +812,31 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
1368 | return -ENOENT; |
1369 | |
1370 | /* |
1371 | - * Ensure that we do not send more than 50 overlapping requests |
1372 | - * to the same server. We may make this configurable later or |
1373 | - * use ses->maxReq. |
1374 | + * Ensure we obtain 1 credit per request in the compound chain. |
1375 | + * It can be optimized further by waiting for all the credits |
1376 | + * at once but this can wait long enough if we don't have enough |
1377 | + * credits due to some heavy operations in progress or the server |
1378 | + * not granting us much, so a fallback to the current approach is |
1379 | + * needed anyway. |
1380 | */ |
1381 | - rc = wait_for_free_request(ses->server, timeout, optype); |
1382 | - if (rc) |
1383 | - return rc; |
1384 | + for (i = 0; i < num_rqst; i++) { |
1385 | + rc = wait_for_free_request(ses->server, timeout, optype); |
1386 | + if (rc) { |
1387 | + /* |
1388 | + * We haven't sent an SMB packet to the server yet but |
1389 | + * we already obtained credits for i requests in the |
1390 | + * compound chain - need to return those credits back |
1391 | + * for future use. Note that we need to call add_credits |
1392 | + * multiple times to match the way we obtained credits |
1393 | + * in the first place and to account for in flight |
1394 | + * requests correctly. |
1395 | + */ |
1396 | + for (j = 0; j < i; j++) |
1397 | + add_credits(ses->server, 1, optype); |
1398 | + return rc; |
1399 | + } |
1400 | + credits[i] = 1; |
1401 | + } |
1402 | |
1403 | /* |
1404 | * Make sure that we sign in the same order that we send on this socket |
1405 | @@ -833,8 +852,10 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
1406 | for (j = 0; j < i; j++) |
1407 | cifs_delete_mid(midQ[j]); |
1408 | mutex_unlock(&ses->server->srv_mutex); |
1409 | + |
1410 | /* Update # of requests on wire to server */ |
1411 | - add_credits(ses->server, 1, optype); |
1412 | + for (j = 0; j < num_rqst; j++) |
1413 | + add_credits(ses->server, credits[j], optype); |
1414 | return PTR_ERR(midQ[i]); |
1415 | } |
1416 | |
1417 | @@ -881,19 +902,16 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
1418 | if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED) { |
1419 | midQ[i]->mid_flags |= MID_WAIT_CANCELLED; |
1420 | midQ[i]->callback = DeleteMidQEntry; |
1421 | - spin_unlock(&GlobalMid_Lock); |
1422 | - add_credits(ses->server, 1, optype); |
1423 | - return rc; |
1424 | + cancelled_mid[i] = true; |
1425 | } |
1426 | spin_unlock(&GlobalMid_Lock); |
1427 | } |
1428 | } |
1429 | |
1430 | for (i = 0; i < num_rqst; i++) |
1431 | - if (midQ[i]->resp_buf) |
1432 | - credits += ses->server->ops->get_credits(midQ[i]); |
1433 | - if (!credits) |
1434 | - credits = 1; |
1435 | + if (!cancelled_mid[i] && midQ[i]->resp_buf |
1436 | + && (midQ[i]->mid_state == MID_RESPONSE_RECEIVED)) |
1437 | + credits[i] = ses->server->ops->get_credits(midQ[i]); |
1438 | |
1439 | for (i = 0; i < num_rqst; i++) { |
1440 | if (rc < 0) |
1441 | @@ -901,8 +919,9 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
1442 | |
1443 | rc = cifs_sync_mid_result(midQ[i], ses->server); |
1444 | if (rc != 0) { |
1445 | - add_credits(ses->server, credits, optype); |
1446 | - return rc; |
1447 | + /* mark this mid as cancelled to not free it below */ |
1448 | + cancelled_mid[i] = true; |
1449 | + goto out; |
1450 | } |
1451 | |
1452 | if (!midQ[i]->resp_buf || |
1453 | @@ -949,9 +968,11 @@ out: |
1454 | * This is prevented above by using a noop callback that will not |
1455 | * wake this thread except for the very last PDU. |
1456 | */ |
1457 | - for (i = 0; i < num_rqst; i++) |
1458 | - cifs_delete_mid(midQ[i]); |
1459 | - add_credits(ses->server, credits, optype); |
1460 | + for (i = 0; i < num_rqst; i++) { |
1461 | + if (!cancelled_mid[i]) |
1462 | + cifs_delete_mid(midQ[i]); |
1463 | + add_credits(ses->server, credits[i], optype); |
1464 | + } |
1465 | |
1466 | return rc; |
1467 | } |
1468 | diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c |
1469 | index 26a7fe5c4fd3..712f00995390 100644 |
1470 | --- a/fs/ext4/fsync.c |
1471 | +++ b/fs/ext4/fsync.c |
1472 | @@ -116,8 +116,16 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
1473 | goto out; |
1474 | } |
1475 | |
1476 | + ret = file_write_and_wait_range(file, start, end); |
1477 | + if (ret) |
1478 | + return ret; |
1479 | + |
1480 | if (!journal) { |
1481 | - ret = __generic_file_fsync(file, start, end, datasync); |
1482 | + struct writeback_control wbc = { |
1483 | + .sync_mode = WB_SYNC_ALL |
1484 | + }; |
1485 | + |
1486 | + ret = ext4_write_inode(inode, &wbc); |
1487 | if (!ret) |
1488 | ret = ext4_sync_parent(inode); |
1489 | if (test_opt(inode->i_sb, BARRIER)) |
1490 | @@ -125,9 +133,6 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
1491 | goto out; |
1492 | } |
1493 | |
1494 | - ret = file_write_and_wait_range(file, start, end); |
1495 | - if (ret) |
1496 | - return ret; |
1497 | /* |
1498 | * data=writeback,ordered: |
1499 | * The caller's filemap_fdatawrite()/wait will sync the data. |
1500 | @@ -159,6 +164,9 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
1501 | ret = err; |
1502 | } |
1503 | out: |
1504 | + err = file_check_and_advance_wb_err(file); |
1505 | + if (ret == 0) |
1506 | + ret = err; |
1507 | trace_ext4_sync_file_exit(inode, ret); |
1508 | return ret; |
1509 | } |
1510 | diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c |
1511 | index 27373d88b5f0..56f6e1782d5f 100644 |
1512 | --- a/fs/ext4/inline.c |
1513 | +++ b/fs/ext4/inline.c |
1514 | @@ -1890,12 +1890,12 @@ int ext4_inline_data_fiemap(struct inode *inode, |
1515 | physical += (char *)ext4_raw_inode(&iloc) - iloc.bh->b_data; |
1516 | physical += offsetof(struct ext4_inode, i_block); |
1517 | |
1518 | - if (physical) |
1519 | - error = fiemap_fill_next_extent(fieinfo, start, physical, |
1520 | - inline_len, flags); |
1521 | brelse(iloc.bh); |
1522 | out: |
1523 | up_read(&EXT4_I(inode)->xattr_sem); |
1524 | + if (physical) |
1525 | + error = fiemap_fill_next_extent(fieinfo, start, physical, |
1526 | + inline_len, flags); |
1527 | return (error < 0 ? error : 0); |
1528 | } |
1529 | |
1530 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
1531 | index 9affabd07682..34d7e0703cc6 100644 |
1532 | --- a/fs/ext4/inode.c |
1533 | +++ b/fs/ext4/inode.c |
1534 | @@ -2778,7 +2778,8 @@ static int ext4_writepages(struct address_space *mapping, |
1535 | * We may need to convert up to one extent per block in |
1536 | * the page and we may dirty the inode. |
1537 | */ |
1538 | - rsv_blocks = 1 + (PAGE_SIZE >> inode->i_blkbits); |
1539 | + rsv_blocks = 1 + ext4_chunk_trans_blocks(inode, |
1540 | + PAGE_SIZE >> inode->i_blkbits); |
1541 | } |
1542 | |
1543 | /* |
1544 | @@ -4833,7 +4834,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, |
1545 | gid_t i_gid; |
1546 | projid_t i_projid; |
1547 | |
1548 | - if (((flags & EXT4_IGET_NORMAL) && |
1549 | + if ((!(flags & EXT4_IGET_SPECIAL) && |
1550 | (ino < EXT4_FIRST_INO(sb) && ino != EXT4_ROOT_INO)) || |
1551 | (ino < EXT4_ROOT_INO) || |
1552 | (ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count))) { |
1553 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
1554 | index 6641a1b8a6a5..521320de2017 100644 |
1555 | --- a/fs/ext4/super.c |
1556 | +++ b/fs/ext4/super.c |
1557 | @@ -4905,7 +4905,7 @@ static int ext4_commit_super(struct super_block *sb, int sync) |
1558 | ext4_superblock_csum_set(sb); |
1559 | if (sync) |
1560 | lock_buffer(sbh); |
1561 | - if (buffer_write_io_error(sbh)) { |
1562 | + if (buffer_write_io_error(sbh) || !buffer_uptodate(sbh)) { |
1563 | /* |
1564 | * Oh, dear. A previous attempt to write the |
1565 | * superblock failed. This could happen because the |
1566 | diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h |
1567 | index 2010493e1040..977ddf2774f9 100644 |
1568 | --- a/include/linux/compiler-gcc.h |
1569 | +++ b/include/linux/compiler-gcc.h |
1570 | @@ -68,7 +68,7 @@ |
1571 | */ |
1572 | #define uninitialized_var(x) x = x |
1573 | |
1574 | -#ifdef RETPOLINE |
1575 | +#ifdef CONFIG_RETPOLINE |
1576 | #define __noretpoline __attribute__((__indirect_branch__("keep"))) |
1577 | #endif |
1578 | |
1579 | diff --git a/include/linux/module.h b/include/linux/module.h |
1580 | index fce6b4335e36..0c575f51fe57 100644 |
1581 | --- a/include/linux/module.h |
1582 | +++ b/include/linux/module.h |
1583 | @@ -817,7 +817,7 @@ static inline void module_bug_finalize(const Elf_Ehdr *hdr, |
1584 | static inline void module_bug_cleanup(struct module *mod) {} |
1585 | #endif /* CONFIG_GENERIC_BUG */ |
1586 | |
1587 | -#ifdef RETPOLINE |
1588 | +#ifdef CONFIG_RETPOLINE |
1589 | extern bool retpoline_module_ok(bool has_retpoline); |
1590 | #else |
1591 | static inline bool retpoline_module_ok(bool has_retpoline) |
1592 | diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h |
1593 | index 5d399eeef172..f4f8840eab04 100644 |
1594 | --- a/include/linux/pm_opp.h |
1595 | +++ b/include/linux/pm_opp.h |
1596 | @@ -108,6 +108,7 @@ void dev_pm_opp_put(struct dev_pm_opp *opp); |
1597 | int dev_pm_opp_add(struct device *dev, unsigned long freq, |
1598 | unsigned long u_volt); |
1599 | void dev_pm_opp_remove(struct device *dev, unsigned long freq); |
1600 | +void dev_pm_opp_remove_all_dynamic(struct device *dev); |
1601 | |
1602 | int dev_pm_opp_enable(struct device *dev, unsigned long freq); |
1603 | |
1604 | @@ -214,6 +215,10 @@ static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq) |
1605 | { |
1606 | } |
1607 | |
1608 | +static inline void dev_pm_opp_remove_all_dynamic(struct device *dev) |
1609 | +{ |
1610 | +} |
1611 | + |
1612 | static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq) |
1613 | { |
1614 | return 0; |
1615 | diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h |
1616 | index 73e130a840ce..fdb6b317d974 100644 |
1617 | --- a/include/linux/sunrpc/svc.h |
1618 | +++ b/include/linux/sunrpc/svc.h |
1619 | @@ -295,9 +295,12 @@ struct svc_rqst { |
1620 | struct svc_cacherep * rq_cacherep; /* cache info */ |
1621 | struct task_struct *rq_task; /* service thread */ |
1622 | spinlock_t rq_lock; /* per-request lock */ |
1623 | + struct net *rq_bc_net; /* pointer to backchannel's |
1624 | + * net namespace |
1625 | + */ |
1626 | }; |
1627 | |
1628 | -#define SVC_NET(svc_rqst) (svc_rqst->rq_xprt->xpt_net) |
1629 | +#define SVC_NET(rqst) (rqst->rq_xprt ? rqst->rq_xprt->xpt_net : rqst->rq_bc_net) |
1630 | |
1631 | /* |
1632 | * Rigorous type checking on sockaddr type conversions |
1633 | diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h |
1634 | index 28e384186c35..8617f4fd6b70 100644 |
1635 | --- a/include/trace/events/sunrpc.h |
1636 | +++ b/include/trace/events/sunrpc.h |
1637 | @@ -569,7 +569,8 @@ TRACE_EVENT(svc_process, |
1638 | __field(u32, vers) |
1639 | __field(u32, proc) |
1640 | __string(service, name) |
1641 | - __string(addr, rqst->rq_xprt->xpt_remotebuf) |
1642 | + __string(addr, rqst->rq_xprt ? |
1643 | + rqst->rq_xprt->xpt_remotebuf : "(null)") |
1644 | ), |
1645 | |
1646 | TP_fast_assign( |
1647 | @@ -577,7 +578,8 @@ TRACE_EVENT(svc_process, |
1648 | __entry->vers = rqst->rq_vers; |
1649 | __entry->proc = rqst->rq_proc; |
1650 | __assign_str(service, name); |
1651 | - __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); |
1652 | + __assign_str(addr, rqst->rq_xprt ? |
1653 | + rqst->rq_xprt->xpt_remotebuf : "(null)"); |
1654 | ), |
1655 | |
1656 | TP_printk("addr=%s xid=0x%08x service=%s vers=%u proc=%u", |
1657 | diff --git a/kernel/fork.c b/kernel/fork.c |
1658 | index 3c16bc490583..906cd0c13d15 100644 |
1659 | --- a/kernel/fork.c |
1660 | +++ b/kernel/fork.c |
1661 | @@ -221,6 +221,7 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) |
1662 | memset(s->addr, 0, THREAD_SIZE); |
1663 | |
1664 | tsk->stack_vm_area = s; |
1665 | + tsk->stack = s->addr; |
1666 | return s->addr; |
1667 | } |
1668 | |
1669 | diff --git a/mm/memory.c b/mm/memory.c |
1670 | index 4ad2d293ddc2..59c00ae6b928 100644 |
1671 | --- a/mm/memory.c |
1672 | +++ b/mm/memory.c |
1673 | @@ -2993,6 +2993,29 @@ static vm_fault_t __do_fault(struct vm_fault *vmf) |
1674 | struct vm_area_struct *vma = vmf->vma; |
1675 | vm_fault_t ret; |
1676 | |
1677 | + /* |
1678 | + * Preallocate pte before we take page_lock because this might lead to |
1679 | + * deadlocks for memcg reclaim which waits for pages under writeback: |
1680 | + * lock_page(A) |
1681 | + * SetPageWriteback(A) |
1682 | + * unlock_page(A) |
1683 | + * lock_page(B) |
1684 | + * lock_page(B) |
1685 | + * pte_alloc_pne |
1686 | + * shrink_page_list |
1687 | + * wait_on_page_writeback(A) |
1688 | + * SetPageWriteback(B) |
1689 | + * unlock_page(B) |
1690 | + * # flush A, B to clear the writeback |
1691 | + */ |
1692 | + if (pmd_none(*vmf->pmd) && !vmf->prealloc_pte) { |
1693 | + vmf->prealloc_pte = pte_alloc_one(vmf->vma->vm_mm, |
1694 | + vmf->address); |
1695 | + if (!vmf->prealloc_pte) |
1696 | + return VM_FAULT_OOM; |
1697 | + smp_wmb(); /* See comment in __pte_alloc() */ |
1698 | + } |
1699 | + |
1700 | ret = vma->vm_ops->fault(vmf); |
1701 | if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY | |
1702 | VM_FAULT_DONE_COW))) |
1703 | diff --git a/mm/slab.c b/mm/slab.c |
1704 | index 2a5654bb3b3f..9d5de959d9d9 100644 |
1705 | --- a/mm/slab.c |
1706 | +++ b/mm/slab.c |
1707 | @@ -679,8 +679,10 @@ static struct alien_cache *__alloc_alien_cache(int node, int entries, |
1708 | struct alien_cache *alc = NULL; |
1709 | |
1710 | alc = kmalloc_node(memsize, gfp, node); |
1711 | - init_arraycache(&alc->ac, entries, batch); |
1712 | - spin_lock_init(&alc->lock); |
1713 | + if (alc) { |
1714 | + init_arraycache(&alc->ac, entries, batch); |
1715 | + spin_lock_init(&alc->lock); |
1716 | + } |
1717 | return alc; |
1718 | } |
1719 | |
1720 | diff --git a/mm/usercopy.c b/mm/usercopy.c |
1721 | index 852eb4e53f06..14faadcedd06 100644 |
1722 | --- a/mm/usercopy.c |
1723 | +++ b/mm/usercopy.c |
1724 | @@ -247,7 +247,8 @@ static DEFINE_STATIC_KEY_FALSE_RO(bypass_usercopy_checks); |
1725 | /* |
1726 | * Validates that the given object is: |
1727 | * - not bogus address |
1728 | - * - known-safe heap or stack object |
1729 | + * - fully contained by stack (or stack frame, when available) |
1730 | + * - fully within SLAB object (or object whitelist area, when available) |
1731 | * - not in kernel text |
1732 | */ |
1733 | void __check_object_size(const void *ptr, unsigned long n, bool to_user) |
1734 | @@ -262,9 +263,6 @@ void __check_object_size(const void *ptr, unsigned long n, bool to_user) |
1735 | /* Check for invalid addresses. */ |
1736 | check_bogus_address((const unsigned long)ptr, n, to_user); |
1737 | |
1738 | - /* Check for bad heap object. */ |
1739 | - check_heap_object(ptr, n, to_user); |
1740 | - |
1741 | /* Check for bad stack object. */ |
1742 | switch (check_stack_object(ptr, n)) { |
1743 | case NOT_STACK: |
1744 | @@ -282,6 +280,9 @@ void __check_object_size(const void *ptr, unsigned long n, bool to_user) |
1745 | usercopy_abort("process stack", NULL, to_user, 0, n); |
1746 | } |
1747 | |
1748 | + /* Check for bad heap object. */ |
1749 | + check_heap_object(ptr, n, to_user); |
1750 | + |
1751 | /* Check for object in kernel to avoid text exposure. */ |
1752 | check_kernel_text_object((const unsigned long)ptr, n, to_user); |
1753 | } |
1754 | diff --git a/mm/util.c b/mm/util.c |
1755 | index 8bf08b5b5760..5c9c7359ee8a 100644 |
1756 | --- a/mm/util.c |
1757 | +++ b/mm/util.c |
1758 | @@ -478,7 +478,7 @@ bool page_mapped(struct page *page) |
1759 | return true; |
1760 | if (PageHuge(page)) |
1761 | return false; |
1762 | - for (i = 0; i < hpage_nr_pages(page); i++) { |
1763 | + for (i = 0; i < (1 << compound_order(page)); i++) { |
1764 | if (atomic_read(&page[i]._mapcount) >= 0) |
1765 | return true; |
1766 | } |
1767 | diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c |
1768 | index d13e05f1a990..d65f8d35de87 100644 |
1769 | --- a/net/sunrpc/svc.c |
1770 | +++ b/net/sunrpc/svc.c |
1771 | @@ -1144,6 +1144,8 @@ void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) |
1772 | static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) {} |
1773 | #endif |
1774 | |
1775 | +extern void svc_tcp_prep_reply_hdr(struct svc_rqst *); |
1776 | + |
1777 | /* |
1778 | * Common routine for processing the RPC request. |
1779 | */ |
1780 | @@ -1172,7 +1174,8 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) |
1781 | clear_bit(RQ_DROPME, &rqstp->rq_flags); |
1782 | |
1783 | /* Setup reply header */ |
1784 | - rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp); |
1785 | + if (rqstp->rq_prot == IPPROTO_TCP) |
1786 | + svc_tcp_prep_reply_hdr(rqstp); |
1787 | |
1788 | svc_putu32(resv, rqstp->rq_xid); |
1789 | |
1790 | @@ -1244,7 +1247,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) |
1791 | * for lower versions. RPC_PROG_MISMATCH seems to be the closest |
1792 | * fit. |
1793 | */ |
1794 | - if (versp->vs_need_cong_ctrl && |
1795 | + if (versp->vs_need_cong_ctrl && rqstp->rq_xprt && |
1796 | !test_bit(XPT_CONG_CTRL, &rqstp->rq_xprt->xpt_flags)) |
1797 | goto err_bad_vers; |
1798 | |
1799 | @@ -1336,7 +1339,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) |
1800 | return 0; |
1801 | |
1802 | close: |
1803 | - if (test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags)) |
1804 | + if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags)) |
1805 | svc_close_xprt(rqstp->rq_xprt); |
1806 | dprintk("svc: svc_process close\n"); |
1807 | return 0; |
1808 | @@ -1459,10 +1462,10 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req, |
1809 | dprintk("svc: %s(%p)\n", __func__, req); |
1810 | |
1811 | /* Build the svc_rqst used by the common processing routine */ |
1812 | - rqstp->rq_xprt = serv->sv_bc_xprt; |
1813 | rqstp->rq_xid = req->rq_xid; |
1814 | rqstp->rq_prot = req->rq_xprt->prot; |
1815 | rqstp->rq_server = serv; |
1816 | + rqstp->rq_bc_net = req->rq_xprt->xprt_net; |
1817 | |
1818 | rqstp->rq_addrlen = sizeof(req->rq_xprt->addr); |
1819 | memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen); |
1820 | diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c |
1821 | index 51d36230b6e3..bd42da287c26 100644 |
1822 | --- a/net/sunrpc/svc_xprt.c |
1823 | +++ b/net/sunrpc/svc_xprt.c |
1824 | @@ -468,10 +468,11 @@ out: |
1825 | */ |
1826 | void svc_reserve(struct svc_rqst *rqstp, int space) |
1827 | { |
1828 | + struct svc_xprt *xprt = rqstp->rq_xprt; |
1829 | + |
1830 | space += rqstp->rq_res.head[0].iov_len; |
1831 | |
1832 | - if (space < rqstp->rq_reserved) { |
1833 | - struct svc_xprt *xprt = rqstp->rq_xprt; |
1834 | + if (xprt && space < rqstp->rq_reserved) { |
1835 | atomic_sub((rqstp->rq_reserved - space), &xprt->xpt_reserved); |
1836 | rqstp->rq_reserved = space; |
1837 | |
1838 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
1839 | index b7e67310ec37..b90492c43711 100644 |
1840 | --- a/net/sunrpc/svcsock.c |
1841 | +++ b/net/sunrpc/svcsock.c |
1842 | @@ -1173,7 +1173,7 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp) |
1843 | /* |
1844 | * Setup response header. TCP has a 4B record length field. |
1845 | */ |
1846 | -static void svc_tcp_prep_reply_hdr(struct svc_rqst *rqstp) |
1847 | +void svc_tcp_prep_reply_hdr(struct svc_rqst *rqstp) |
1848 | { |
1849 | struct kvec *resv = &rqstp->rq_res.head[0]; |
1850 | |
1851 | diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c |
1852 | index 0d998c54564d..5a5b3780456f 100644 |
1853 | --- a/scripts/mod/modpost.c |
1854 | +++ b/scripts/mod/modpost.c |
1855 | @@ -2157,7 +2157,7 @@ static void add_intree_flag(struct buffer *b, int is_intree) |
1856 | /* Cannot check for assembler */ |
1857 | static void add_retpoline(struct buffer *b) |
1858 | { |
1859 | - buf_printf(b, "\n#ifdef RETPOLINE\n"); |
1860 | + buf_printf(b, "\n#ifdef CONFIG_RETPOLINE\n"); |
1861 | buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n"); |
1862 | buf_printf(b, "#endif\n"); |
1863 | } |
1864 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
1865 | index 54fc9c0f07de..0d95316d6dbd 100644 |
1866 | --- a/sound/pci/hda/patch_realtek.c |
1867 | +++ b/sound/pci/hda/patch_realtek.c |
1868 | @@ -4102,6 +4102,7 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) |
1869 | case 0x10ec0295: |
1870 | case 0x10ec0289: |
1871 | case 0x10ec0299: |
1872 | + alc_process_coef_fw(codec, alc225_pre_hsmode); |
1873 | alc_process_coef_fw(codec, coef0225); |
1874 | break; |
1875 | case 0x10ec0867: |
1876 | @@ -5380,6 +5381,13 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec, |
1877 | snd_hda_override_wcaps(codec, 0x03, 0); |
1878 | } |
1879 | |
1880 | +static void alc_fixup_disable_mic_vref(struct hda_codec *codec, |
1881 | + const struct hda_fixup *fix, int action) |
1882 | +{ |
1883 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) |
1884 | + snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ); |
1885 | +} |
1886 | + |
1887 | /* for hda_fixup_thinkpad_acpi() */ |
1888 | #include "thinkpad_helper.c" |
1889 | |
1890 | @@ -5492,6 +5500,7 @@ enum { |
1891 | ALC293_FIXUP_LENOVO_SPK_NOISE, |
1892 | ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, |
1893 | ALC255_FIXUP_DELL_SPK_NOISE, |
1894 | + ALC225_FIXUP_DISABLE_MIC_VREF, |
1895 | ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, |
1896 | ALC295_FIXUP_DISABLE_DAC3, |
1897 | ALC280_FIXUP_HP_HEADSET_MIC, |
1898 | @@ -6191,6 +6200,12 @@ static const struct hda_fixup alc269_fixups[] = { |
1899 | .chained = true, |
1900 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE |
1901 | }, |
1902 | + [ALC225_FIXUP_DISABLE_MIC_VREF] = { |
1903 | + .type = HDA_FIXUP_FUNC, |
1904 | + .v.func = alc_fixup_disable_mic_vref, |
1905 | + .chained = true, |
1906 | + .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE |
1907 | + }, |
1908 | [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = { |
1909 | .type = HDA_FIXUP_VERBS, |
1910 | .v.verbs = (const struct hda_verb[]) { |
1911 | @@ -6200,7 +6215,7 @@ static const struct hda_fixup alc269_fixups[] = { |
1912 | {} |
1913 | }, |
1914 | .chained = true, |
1915 | - .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE |
1916 | + .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF |
1917 | }, |
1918 | [ALC280_FIXUP_HP_HEADSET_MIC] = { |
1919 | .type = HDA_FIXUP_FUNC, |
1920 | @@ -6503,6 +6518,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
1921 | SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), |
1922 | SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), |
1923 | SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), |
1924 | + SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), |
1925 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
1926 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
1927 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |