Contents of /trunk/kernel-alx/patches-5.4/0114-5.4.15-all-fixes.patch
Parent Directory | Revision Log
Revision 3495 -
(show annotations)
(download)
Mon May 11 14:36:17 2020 UTC (4 years, 4 months ago) by niro
File size: 147775 byte(s)
Mon May 11 14:36:17 2020 UTC (4 years, 4 months ago) by niro
File size: 147775 byte(s)
-linux-5.4.15
1 | diff --git a/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt b/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt |
2 | new file mode 100644 |
3 | index 000000000000..f315c9723bd2 |
4 | --- /dev/null |
5 | +++ b/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt |
6 | @@ -0,0 +1,27 @@ |
7 | +OMAP ROM RNG driver binding |
8 | + |
9 | +Secure SoCs may provide RNG via secure ROM calls like Nokia N900 does. The |
10 | +implementation can depend on the SoC secure ROM used. |
11 | + |
12 | +- compatible: |
13 | + Usage: required |
14 | + Value type: <string> |
15 | + Definition: must be "nokia,n900-rom-rng" |
16 | + |
17 | +- clocks: |
18 | + Usage: required |
19 | + Value type: <prop-encoded-array> |
20 | + Definition: reference to the the RNG interface clock |
21 | + |
22 | +- clock-names: |
23 | + Usage: required |
24 | + Value type: <stringlist> |
25 | + Definition: must be "ick" |
26 | + |
27 | +Example: |
28 | + |
29 | + rom_rng: rng { |
30 | + compatible = "nokia,n900-rom-rng"; |
31 | + clocks = <&rng_ick>; |
32 | + clock-names = "ick"; |
33 | + }; |
34 | diff --git a/Makefile b/Makefile |
35 | index 2b2080d08bb2..30600e309c73 100644 |
36 | --- a/Makefile |
37 | +++ b/Makefile |
38 | @@ -1,7 +1,7 @@ |
39 | # SPDX-License-Identifier: GPL-2.0 |
40 | VERSION = 5 |
41 | PATCHLEVEL = 4 |
42 | -SUBLEVEL = 14 |
43 | +SUBLEVEL = 15 |
44 | EXTRAVERSION = |
45 | NAME = Kleptomaniac Octopus |
46 | |
47 | diff --git a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts |
48 | index 07ac99b9cda6..cdb89b3e2a9b 100644 |
49 | --- a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts |
50 | +++ b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts |
51 | @@ -11,22 +11,6 @@ |
52 | #include "logicpd-torpedo-37xx-devkit.dts" |
53 | |
54 | &lcd0 { |
55 | - |
56 | - label = "28"; |
57 | - |
58 | - panel-timing { |
59 | - clock-frequency = <9000000>; |
60 | - hactive = <480>; |
61 | - vactive = <272>; |
62 | - hfront-porch = <3>; |
63 | - hback-porch = <2>; |
64 | - hsync-len = <42>; |
65 | - vback-porch = <3>; |
66 | - vfront-porch = <2>; |
67 | - vsync-len = <11>; |
68 | - hsync-active = <1>; |
69 | - vsync-active = <1>; |
70 | - de-active = <1>; |
71 | - pixelclk-active = <0>; |
72 | - }; |
73 | + /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ |
74 | + compatible = "logicpd,type28"; |
75 | }; |
76 | diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts |
77 | index 84a5ade1e865..63659880eeb3 100644 |
78 | --- a/arch/arm/boot/dts/omap3-n900.dts |
79 | +++ b/arch/arm/boot/dts/omap3-n900.dts |
80 | @@ -155,6 +155,12 @@ |
81 | pwms = <&pwm9 0 26316 0>; /* 38000 Hz */ |
82 | }; |
83 | |
84 | + rom_rng: rng { |
85 | + compatible = "nokia,n900-rom-rng"; |
86 | + clocks = <&rng_ick>; |
87 | + clock-names = "ick"; |
88 | + }; |
89 | + |
90 | /* controlled (enabled/disabled) directly by bcm2048 and wl1251 */ |
91 | vctcxo: vctcxo { |
92 | compatible = "fixed-clock"; |
93 | diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c |
94 | index 439e143cad7b..46012ca812f4 100644 |
95 | --- a/arch/arm/mach-omap2/display.c |
96 | +++ b/arch/arm/mach-omap2/display.c |
97 | @@ -265,6 +265,7 @@ static int __init omapdss_init_of(void) |
98 | r = of_platform_populate(node, NULL, NULL, &pdev->dev); |
99 | if (r) { |
100 | pr_err("Unable to populate DSS submodule devices\n"); |
101 | + put_device(&pdev->dev); |
102 | return r; |
103 | } |
104 | |
105 | diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c |
106 | index 33688e1d9acf..247e3f8acffe 100644 |
107 | --- a/arch/arm/mach-omap2/pdata-quirks.c |
108 | +++ b/arch/arm/mach-omap2/pdata-quirks.c |
109 | @@ -268,14 +268,6 @@ static void __init am3517_evm_legacy_init(void) |
110 | am35xx_emac_reset(); |
111 | } |
112 | |
113 | -static struct platform_device omap3_rom_rng_device = { |
114 | - .name = "omap3-rom-rng", |
115 | - .id = -1, |
116 | - .dev = { |
117 | - .platform_data = rx51_secure_rng_call, |
118 | - }, |
119 | -}; |
120 | - |
121 | static void __init nokia_n900_legacy_init(void) |
122 | { |
123 | hsmmc2_internal_input_clk(); |
124 | @@ -291,9 +283,6 @@ static void __init nokia_n900_legacy_init(void) |
125 | pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); |
126 | pr_warn("Thumb binaries may crash randomly without this workaround\n"); |
127 | } |
128 | - |
129 | - pr_info("RX-51: Registering OMAP3 HWRNG device\n"); |
130 | - platform_device_register(&omap3_rom_rng_device); |
131 | } |
132 | } |
133 | |
134 | @@ -538,6 +527,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = { |
135 | OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), |
136 | OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", |
137 | &am35xx_emac_pdata), |
138 | + OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL, rx51_secure_rng_call), |
139 | /* McBSP modules with sidetone core */ |
140 | #if IS_ENABLED(CONFIG_SND_SOC_OMAP_MCBSP) |
141 | OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata), |
142 | diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h |
143 | index 9c63b596e6ce..a09595f00cab 100644 |
144 | --- a/arch/powerpc/include/asm/archrandom.h |
145 | +++ b/arch/powerpc/include/asm/archrandom.h |
146 | @@ -28,7 +28,7 @@ static inline int arch_get_random_seed_int(unsigned int *v) |
147 | unsigned long val; |
148 | int rc; |
149 | |
150 | - rc = arch_get_random_long(&val); |
151 | + rc = arch_get_random_seed_long(&val); |
152 | if (rc) |
153 | *v = val; |
154 | |
155 | diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h |
156 | index ccf44c135389..7c05e95a5c44 100644 |
157 | --- a/arch/powerpc/include/asm/security_features.h |
158 | +++ b/arch/powerpc/include/asm/security_features.h |
159 | @@ -9,7 +9,7 @@ |
160 | #define _ASM_POWERPC_SECURITY_FEATURES_H |
161 | |
162 | |
163 | -extern unsigned long powerpc_security_features; |
164 | +extern u64 powerpc_security_features; |
165 | extern bool rfi_flush; |
166 | |
167 | /* These are bit flags */ |
168 | @@ -24,17 +24,17 @@ void setup_stf_barrier(void); |
169 | void do_stf_barrier_fixups(enum stf_barrier_type types); |
170 | void setup_count_cache_flush(void); |
171 | |
172 | -static inline void security_ftr_set(unsigned long feature) |
173 | +static inline void security_ftr_set(u64 feature) |
174 | { |
175 | powerpc_security_features |= feature; |
176 | } |
177 | |
178 | -static inline void security_ftr_clear(unsigned long feature) |
179 | +static inline void security_ftr_clear(u64 feature) |
180 | { |
181 | powerpc_security_features &= ~feature; |
182 | } |
183 | |
184 | -static inline bool security_ftr_enabled(unsigned long feature) |
185 | +static inline bool security_ftr_enabled(u64 feature) |
186 | { |
187 | return !!(powerpc_security_features & feature); |
188 | } |
189 | diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S |
190 | index adf0505dbe02..519d49547e2f 100644 |
191 | --- a/arch/powerpc/kernel/head_fsl_booke.S |
192 | +++ b/arch/powerpc/kernel/head_fsl_booke.S |
193 | @@ -238,6 +238,9 @@ set_ivor: |
194 | |
195 | bl early_init |
196 | |
197 | +#ifdef CONFIG_KASAN |
198 | + bl kasan_early_init |
199 | +#endif |
200 | #ifdef CONFIG_RELOCATABLE |
201 | mr r3,r30 |
202 | mr r4,r31 |
203 | @@ -264,9 +267,6 @@ set_ivor: |
204 | /* |
205 | * Decide what sort of machine this is and initialize the MMU. |
206 | */ |
207 | -#ifdef CONFIG_KASAN |
208 | - bl kasan_early_init |
209 | -#endif |
210 | mr r3,r30 |
211 | mr r4,r31 |
212 | bl machine_init |
213 | diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c |
214 | index 100f1b57ec2f..eba9d4ee4baf 100644 |
215 | --- a/arch/powerpc/kernel/prom_init.c |
216 | +++ b/arch/powerpc/kernel/prom_init.c |
217 | @@ -1053,7 +1053,7 @@ static const struct ibm_arch_vec ibm_architecture_vec_template __initconst = { |
218 | .reserved2 = 0, |
219 | .reserved3 = 0, |
220 | .subprocessors = 1, |
221 | - .byte22 = OV5_FEAT(OV5_DRMEM_V2), |
222 | + .byte22 = OV5_FEAT(OV5_DRMEM_V2) | OV5_FEAT(OV5_DRC_INFO), |
223 | .intarch = 0, |
224 | .mmu = 0, |
225 | .hash_ext = 0, |
226 | diff --git a/arch/powerpc/kernel/security.c b/arch/powerpc/kernel/security.c |
227 | index d341b464f23c..1740a66cea84 100644 |
228 | --- a/arch/powerpc/kernel/security.c |
229 | +++ b/arch/powerpc/kernel/security.c |
230 | @@ -16,7 +16,7 @@ |
231 | #include <asm/setup.h> |
232 | |
233 | |
234 | -unsigned long powerpc_security_features __read_mostly = SEC_FTR_DEFAULT; |
235 | +u64 powerpc_security_features __read_mostly = SEC_FTR_DEFAULT; |
236 | |
237 | enum count_cache_flush_type { |
238 | COUNT_CACHE_FLUSH_NONE = 0x1, |
239 | @@ -109,7 +109,7 @@ device_initcall(barrier_nospec_debugfs_init); |
240 | static __init int security_feature_debugfs_init(void) |
241 | { |
242 | debugfs_create_x64("security_features", 0400, powerpc_debugfs_root, |
243 | - (u64 *)&powerpc_security_features); |
244 | + &powerpc_security_features); |
245 | return 0; |
246 | } |
247 | device_initcall(security_feature_debugfs_init); |
248 | diff --git a/block/bio-integrity.c b/block/bio-integrity.c |
249 | index fb95dbb21dd8..bf62c25cde8f 100644 |
250 | --- a/block/bio-integrity.c |
251 | +++ b/block/bio-integrity.c |
252 | @@ -87,7 +87,7 @@ EXPORT_SYMBOL(bio_integrity_alloc); |
253 | * Description: Used to free the integrity portion of a bio. Usually |
254 | * called from bio_free(). |
255 | */ |
256 | -static void bio_integrity_free(struct bio *bio) |
257 | +void bio_integrity_free(struct bio *bio) |
258 | { |
259 | struct bio_integrity_payload *bip = bio_integrity(bio); |
260 | struct bio_set *bs = bio->bi_pool; |
261 | diff --git a/block/bio.c b/block/bio.c |
262 | index 906da3581a3e..94d697217887 100644 |
263 | --- a/block/bio.c |
264 | +++ b/block/bio.c |
265 | @@ -233,6 +233,9 @@ fallback: |
266 | void bio_uninit(struct bio *bio) |
267 | { |
268 | bio_disassociate_blkg(bio); |
269 | + |
270 | + if (bio_integrity(bio)) |
271 | + bio_integrity_free(bio); |
272 | } |
273 | EXPORT_SYMBOL(bio_uninit); |
274 | |
275 | diff --git a/block/blk.h b/block/blk.h |
276 | index ffea1691470e..ee3d5664d962 100644 |
277 | --- a/block/blk.h |
278 | +++ b/block/blk.h |
279 | @@ -122,6 +122,7 @@ static inline void blk_rq_bio_prep(struct request *rq, struct bio *bio, |
280 | #ifdef CONFIG_BLK_DEV_INTEGRITY |
281 | void blk_flush_integrity(void); |
282 | bool __bio_integrity_endio(struct bio *); |
283 | +void bio_integrity_free(struct bio *bio); |
284 | static inline bool bio_integrity_endio(struct bio *bio) |
285 | { |
286 | if (bio_integrity(bio)) |
287 | @@ -167,6 +168,9 @@ static inline bool bio_integrity_endio(struct bio *bio) |
288 | { |
289 | return true; |
290 | } |
291 | +static inline void bio_integrity_free(struct bio *bio) |
292 | +{ |
293 | +} |
294 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
295 | |
296 | unsigned long blk_rq_timeout(unsigned long timeout); |
297 | diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c |
298 | index 00ec4f2bf015..c05050f474cd 100644 |
299 | --- a/drivers/acpi/acpi_platform.c |
300 | +++ b/drivers/acpi/acpi_platform.c |
301 | @@ -31,6 +31,44 @@ static const struct acpi_device_id forbidden_id_list[] = { |
302 | {"", 0}, |
303 | }; |
304 | |
305 | +static struct platform_device *acpi_platform_device_find_by_companion(struct acpi_device *adev) |
306 | +{ |
307 | + struct device *dev; |
308 | + |
309 | + dev = bus_find_device_by_acpi_dev(&platform_bus_type, adev); |
310 | + return dev ? to_platform_device(dev) : NULL; |
311 | +} |
312 | + |
313 | +static int acpi_platform_device_remove_notify(struct notifier_block *nb, |
314 | + unsigned long value, void *arg) |
315 | +{ |
316 | + struct acpi_device *adev = arg; |
317 | + struct platform_device *pdev; |
318 | + |
319 | + switch (value) { |
320 | + case ACPI_RECONFIG_DEVICE_ADD: |
321 | + /* Nothing to do here */ |
322 | + break; |
323 | + case ACPI_RECONFIG_DEVICE_REMOVE: |
324 | + if (!acpi_device_enumerated(adev)) |
325 | + break; |
326 | + |
327 | + pdev = acpi_platform_device_find_by_companion(adev); |
328 | + if (!pdev) |
329 | + break; |
330 | + |
331 | + platform_device_unregister(pdev); |
332 | + put_device(&pdev->dev); |
333 | + break; |
334 | + } |
335 | + |
336 | + return NOTIFY_OK; |
337 | +} |
338 | + |
339 | +static struct notifier_block acpi_platform_notifier = { |
340 | + .notifier_call = acpi_platform_device_remove_notify, |
341 | +}; |
342 | + |
343 | static void acpi_platform_fill_resource(struct acpi_device *adev, |
344 | const struct resource *src, struct resource *dest) |
345 | { |
346 | @@ -130,3 +168,8 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev, |
347 | return pdev; |
348 | } |
349 | EXPORT_SYMBOL_GPL(acpi_create_platform_device); |
350 | + |
351 | +void __init acpi_platform_init(void) |
352 | +{ |
353 | + acpi_reconfig_notifier_register(&acpi_platform_notifier); |
354 | +} |
355 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
356 | index aad6be5c0af0..915650bf519f 100644 |
357 | --- a/drivers/acpi/scan.c |
358 | +++ b/drivers/acpi/scan.c |
359 | @@ -2174,6 +2174,7 @@ int __init acpi_scan_init(void) |
360 | acpi_pci_root_init(); |
361 | acpi_pci_link_init(); |
362 | acpi_processor_init(); |
363 | + acpi_platform_init(); |
364 | acpi_lpss_init(); |
365 | acpi_apd_init(); |
366 | acpi_cmos_rtc_init(); |
367 | diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c |
368 | index a1f3f0994f9f..d5b4905e2adb 100644 |
369 | --- a/drivers/base/swnode.c |
370 | +++ b/drivers/base/swnode.c |
371 | @@ -520,7 +520,10 @@ software_node_get_parent(const struct fwnode_handle *fwnode) |
372 | { |
373 | struct swnode *swnode = to_swnode(fwnode); |
374 | |
375 | - return swnode ? (swnode->parent ? &swnode->parent->fwnode : NULL) : NULL; |
376 | + if (!swnode || !swnode->parent) |
377 | + return NULL; |
378 | + |
379 | + return fwnode_handle_get(&swnode->parent->fwnode); |
380 | } |
381 | |
382 | static struct fwnode_handle * |
383 | diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c |
384 | index 648e39ce6bd9..8df3cad7c97a 100644 |
385 | --- a/drivers/char/hw_random/omap3-rom-rng.c |
386 | +++ b/drivers/char/hw_random/omap3-rom-rng.c |
387 | @@ -20,6 +20,8 @@ |
388 | #include <linux/workqueue.h> |
389 | #include <linux/clk.h> |
390 | #include <linux/err.h> |
391 | +#include <linux/of.h> |
392 | +#include <linux/of_device.h> |
393 | #include <linux/platform_device.h> |
394 | |
395 | #define RNG_RESET 0x01 |
396 | @@ -86,14 +88,18 @@ static int omap3_rom_rng_read(struct hwrng *rng, void *data, size_t max, bool w) |
397 | |
398 | static struct hwrng omap3_rom_rng_ops = { |
399 | .name = "omap3-rom", |
400 | - .read = omap3_rom_rng_read, |
401 | }; |
402 | |
403 | static int omap3_rom_rng_probe(struct platform_device *pdev) |
404 | { |
405 | int ret = 0; |
406 | |
407 | - pr_info("initializing\n"); |
408 | + omap3_rom_rng_ops.read = of_device_get_match_data(&pdev->dev); |
409 | + if (!omap3_rom_rng_ops.read) { |
410 | + dev_err(&pdev->dev, "missing rom code handler\n"); |
411 | + |
412 | + return -ENODEV; |
413 | + } |
414 | |
415 | omap3_rom_rng_call = pdev->dev.platform_data; |
416 | if (!omap3_rom_rng_call) { |
417 | @@ -126,9 +132,16 @@ static int omap3_rom_rng_remove(struct platform_device *pdev) |
418 | return 0; |
419 | } |
420 | |
421 | +static const struct of_device_id omap_rom_rng_match[] = { |
422 | + { .compatible = "nokia,n900-rom-rng", .data = omap3_rom_rng_read, }, |
423 | + { /* sentinel */ }, |
424 | +}; |
425 | +MODULE_DEVICE_TABLE(of, omap_rom_rng_match); |
426 | + |
427 | static struct platform_driver omap3_rom_rng_driver = { |
428 | .driver = { |
429 | .name = "omap3-rom-rng", |
430 | + .of_match_table = omap_rom_rng_match, |
431 | }, |
432 | .probe = omap3_rom_rng_probe, |
433 | .remove = omap3_rom_rng_remove, |
434 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c |
435 | index 3c8a559506e8..0b6e7f8d9729 100644 |
436 | --- a/drivers/char/ipmi/ipmi_msghandler.c |
437 | +++ b/drivers/char/ipmi/ipmi_msghandler.c |
438 | @@ -3039,8 +3039,11 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, |
439 | bmc->pdev.name = "ipmi_bmc"; |
440 | |
441 | rv = ida_simple_get(&ipmi_bmc_ida, 0, 0, GFP_KERNEL); |
442 | - if (rv < 0) |
443 | + if (rv < 0) { |
444 | + kfree(bmc); |
445 | goto out; |
446 | + } |
447 | + |
448 | bmc->pdev.dev.driver = &ipmidriver.driver; |
449 | bmc->pdev.id = rv; |
450 | bmc->pdev.dev.release = release_bmc_device; |
451 | diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig |
452 | index 8eabf7b20101..7316312935c8 100644 |
453 | --- a/drivers/crypto/Kconfig |
454 | +++ b/drivers/crypto/Kconfig |
455 | @@ -333,6 +333,7 @@ config CRYPTO_DEV_PPC4XX |
456 | depends on PPC && 4xx |
457 | select CRYPTO_HASH |
458 | select CRYPTO_AEAD |
459 | + select CRYPTO_AES |
460 | select CRYPTO_LIB_AES |
461 | select CRYPTO_CCM |
462 | select CRYPTO_CTR |
463 | diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c |
464 | index 1369c5fa3087..07df012893bb 100644 |
465 | --- a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c |
466 | +++ b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c |
467 | @@ -175,7 +175,7 @@ static int sun4i_hash(struct ahash_request *areq) |
468 | */ |
469 | unsigned int i = 0, end, fill, min_fill, nwait, nbw = 0, j = 0, todo; |
470 | unsigned int in_i = 0; |
471 | - u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, wb = 0, v, ivmode = 0; |
472 | + u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, v, ivmode = 0; |
473 | struct sun4i_req_ctx *op = ahash_request_ctx(areq); |
474 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); |
475 | struct sun4i_tfm_ctx *tfmctx = crypto_ahash_ctx(tfm); |
476 | @@ -184,6 +184,7 @@ static int sun4i_hash(struct ahash_request *areq) |
477 | struct sg_mapping_iter mi; |
478 | int in_r, err = 0; |
479 | size_t copied = 0; |
480 | + __le32 wb = 0; |
481 | |
482 | dev_dbg(ss->dev, "%s %s bc=%llu len=%u mode=%x wl=%u h0=%0x", |
483 | __func__, crypto_tfm_alg_name(areq->base.tfm), |
484 | @@ -395,7 +396,7 @@ hash_final: |
485 | |
486 | nbw = op->len - 4 * nwait; |
487 | if (nbw) { |
488 | - wb = *(u32 *)(op->buf + nwait * 4); |
489 | + wb = cpu_to_le32(*(u32 *)(op->buf + nwait * 4)); |
490 | wb &= GENMASK((nbw * 8) - 1, 0); |
491 | |
492 | op->byte_count += nbw; |
493 | @@ -404,7 +405,7 @@ hash_final: |
494 | |
495 | /* write the remaining bytes of the nbw buffer */ |
496 | wb |= ((1 << 7) << (nbw * 8)); |
497 | - bf[j++] = wb; |
498 | + bf[j++] = le32_to_cpu(wb); |
499 | |
500 | /* |
501 | * number of space to pad to obtain 64o minus 8(size) minus 4 (final 1) |
502 | @@ -423,13 +424,13 @@ hash_final: |
503 | |
504 | /* write the length of data */ |
505 | if (op->mode == SS_OP_SHA1) { |
506 | - __be64 bits = cpu_to_be64(op->byte_count << 3); |
507 | - bf[j++] = lower_32_bits(bits); |
508 | - bf[j++] = upper_32_bits(bits); |
509 | + __be64 *bits = (__be64 *)&bf[j]; |
510 | + *bits = cpu_to_be64(op->byte_count << 3); |
511 | + j += 2; |
512 | } else { |
513 | - __le64 bits = op->byte_count << 3; |
514 | - bf[j++] = lower_32_bits(bits); |
515 | - bf[j++] = upper_32_bits(bits); |
516 | + __le64 *bits = (__le64 *)&bf[j]; |
517 | + *bits = cpu_to_le64(op->byte_count << 3); |
518 | + j += 2; |
519 | } |
520 | writesl(ss->base + SS_RXFIFO, bf, j); |
521 | |
522 | @@ -471,7 +472,7 @@ hash_final: |
523 | } |
524 | } else { |
525 | for (i = 0; i < 4; i++) { |
526 | - v = readl(ss->base + SS_MD0 + i * 4); |
527 | + v = cpu_to_le32(readl(ss->base + SS_MD0 + i * 4)); |
528 | memcpy(areq->result + i * 4, &v, 4); |
529 | } |
530 | } |
531 | diff --git a/drivers/dma/ti/edma.c b/drivers/dma/ti/edma.c |
532 | index ba7c4f07fcd6..80b780e49971 100644 |
533 | --- a/drivers/dma/ti/edma.c |
534 | +++ b/drivers/dma/ti/edma.c |
535 | @@ -2403,8 +2403,10 @@ static int edma_probe(struct platform_device *pdev) |
536 | |
537 | ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, |
538 | sizeof(*ecc->tc_list), GFP_KERNEL); |
539 | - if (!ecc->tc_list) |
540 | - return -ENOMEM; |
541 | + if (!ecc->tc_list) { |
542 | + ret = -ENOMEM; |
543 | + goto err_reg1; |
544 | + } |
545 | |
546 | for (i = 0;; i++) { |
547 | ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", |
548 | diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c |
549 | index 4a8012e3cb8c..601af4edad5e 100644 |
550 | --- a/drivers/firmware/arm_scmi/perf.c |
551 | +++ b/drivers/firmware/arm_scmi/perf.c |
552 | @@ -323,7 +323,7 @@ static void scmi_perf_fc_ring_db(struct scmi_fc_db_info *db) |
553 | |
554 | if (db->mask) |
555 | val = ioread64_hi_lo(db->addr) & db->mask; |
556 | - iowrite64_hi_lo(db->set, db->addr); |
557 | + iowrite64_hi_lo(db->set | val, db->addr); |
558 | } |
559 | #endif |
560 | } |
561 | diff --git a/drivers/firmware/imx/imx-dsp.c b/drivers/firmware/imx/imx-dsp.c |
562 | index a43d2db5cbdb..4265e9dbed84 100644 |
563 | --- a/drivers/firmware/imx/imx-dsp.c |
564 | +++ b/drivers/firmware/imx/imx-dsp.c |
565 | @@ -114,7 +114,7 @@ static int imx_dsp_probe(struct platform_device *pdev) |
566 | |
567 | dev_info(dev, "NXP i.MX DSP IPC initialized\n"); |
568 | |
569 | - return devm_of_platform_populate(dev); |
570 | + return 0; |
571 | out: |
572 | kfree(chan_name); |
573 | for (j = 0; j < i; j++) { |
574 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c |
575 | index 43ffec3a6fbb..7ee5b7f53aeb 100644 |
576 | --- a/drivers/gpio/gpiolib-of.c |
577 | +++ b/drivers/gpio/gpiolib-of.c |
578 | @@ -909,16 +909,13 @@ int of_gpiochip_add(struct gpio_chip *chip) |
579 | of_node_get(chip->of_node); |
580 | |
581 | ret = of_gpiochip_scan_gpios(chip); |
582 | - if (ret) { |
583 | + if (ret) |
584 | of_node_put(chip->of_node); |
585 | - gpiochip_remove_pin_ranges(chip); |
586 | - } |
587 | |
588 | return ret; |
589 | } |
590 | |
591 | void of_gpiochip_remove(struct gpio_chip *chip) |
592 | { |
593 | - gpiochip_remove_pin_ranges(chip); |
594 | of_node_put(chip->of_node); |
595 | } |
596 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
597 | index 3d9524a2abc4..2476306e7030 100644 |
598 | --- a/drivers/gpio/gpiolib.c |
599 | +++ b/drivers/gpio/gpiolib.c |
600 | @@ -1452,6 +1452,7 @@ err_remove_of_chip: |
601 | gpiochip_free_hogs(chip); |
602 | of_gpiochip_remove(chip); |
603 | err_free_gpiochip_mask: |
604 | + gpiochip_remove_pin_ranges(chip); |
605 | gpiochip_free_valid_mask(chip); |
606 | err_remove_from_list: |
607 | spin_lock_irqsave(&gpio_lock, flags); |
608 | @@ -1507,8 +1508,8 @@ void gpiochip_remove(struct gpio_chip *chip) |
609 | gdev->chip = NULL; |
610 | gpiochip_irqchip_remove(chip); |
611 | acpi_gpiochip_remove(chip); |
612 | - gpiochip_remove_pin_ranges(chip); |
613 | of_gpiochip_remove(chip); |
614 | + gpiochip_remove_pin_ranges(chip); |
615 | gpiochip_free_valid_mask(chip); |
616 | /* |
617 | * We accept no more calls into the driver from this point, so |
618 | diff --git a/drivers/gpio/sgpio-aspeed.c b/drivers/gpio/sgpio-aspeed.c |
619 | index 7e99860ca447..8319812593e3 100644 |
620 | --- a/drivers/gpio/sgpio-aspeed.c |
621 | +++ b/drivers/gpio/sgpio-aspeed.c |
622 | @@ -107,7 +107,7 @@ static void __iomem *bank_reg(struct aspeed_sgpio *gpio, |
623 | return gpio->base + bank->irq_regs + GPIO_IRQ_STATUS; |
624 | default: |
625 | /* acturally if code runs to here, it's an error case */ |
626 | - BUG_ON(1); |
627 | + BUG(); |
628 | } |
629 | } |
630 | |
631 | diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
632 | index 395c2259f979..9d778a0b2c5e 100644 |
633 | --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
634 | +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
635 | @@ -423,7 +423,6 @@ static void vcn_v2_5_mc_resume(struct amdgpu_device *adev) |
636 | * vcn_v2_5_disable_clock_gating - disable VCN clock gating |
637 | * |
638 | * @adev: amdgpu_device pointer |
639 | - * @sw: enable SW clock gating |
640 | * |
641 | * Disable clock gating for VCN block |
642 | */ |
643 | @@ -542,7 +541,6 @@ static void vcn_v2_5_disable_clock_gating(struct amdgpu_device *adev) |
644 | * vcn_v2_5_enable_clock_gating - enable VCN clock gating |
645 | * |
646 | * @adev: amdgpu_device pointer |
647 | - * @sw: enable SW clock gating |
648 | * |
649 | * Enable clock gating for VCN block |
650 | */ |
651 | diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c |
652 | index fa8ad7db2b3a..d306cc711997 100644 |
653 | --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c |
654 | +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c |
655 | @@ -1421,6 +1421,7 @@ static int pp_get_asic_baco_capability(void *handle, bool *cap) |
656 | { |
657 | struct pp_hwmgr *hwmgr = handle; |
658 | |
659 | + *cap = false; |
660 | if (!hwmgr) |
661 | return -EINVAL; |
662 | |
663 | diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c |
664 | index e41fd94ae5a9..b3d2b91575cb 100644 |
665 | --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c |
666 | +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c |
667 | @@ -2094,8 +2094,7 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, |
668 | ext_data.fpriv = file->driver_priv; |
669 | if (client_is_banned(ext_data.fpriv)) { |
670 | DRM_DEBUG("client %s[%d] banned from creating ctx\n", |
671 | - current->comm, |
672 | - pid_nr(get_task_pid(current, PIDTYPE_PID))); |
673 | + current->comm, task_pid_nr(current)); |
674 | return -EIO; |
675 | } |
676 | |
677 | diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c |
678 | index ad47cc95459e..bf5fcc3e5379 100644 |
679 | --- a/drivers/gpu/drm/panel/panel-lvds.c |
680 | +++ b/drivers/gpu/drm/panel/panel-lvds.c |
681 | @@ -197,7 +197,6 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds) |
682 | static int panel_lvds_probe(struct platform_device *pdev) |
683 | { |
684 | struct panel_lvds *lvds; |
685 | - struct device_node *np; |
686 | int ret; |
687 | |
688 | lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); |
689 | @@ -243,14 +242,9 @@ static int panel_lvds_probe(struct platform_device *pdev) |
690 | return ret; |
691 | } |
692 | |
693 | - np = of_parse_phandle(lvds->dev->of_node, "backlight", 0); |
694 | - if (np) { |
695 | - lvds->backlight = of_find_backlight_by_node(np); |
696 | - of_node_put(np); |
697 | - |
698 | - if (!lvds->backlight) |
699 | - return -EPROBE_DEFER; |
700 | - } |
701 | + lvds->backlight = devm_of_find_backlight(lvds->dev); |
702 | + if (IS_ERR(lvds->backlight)) |
703 | + return PTR_ERR(lvds->backlight); |
704 | |
705 | /* |
706 | * TODO: Handle all power supplies specified in the DT node in a generic |
707 | @@ -266,14 +260,10 @@ static int panel_lvds_probe(struct platform_device *pdev) |
708 | |
709 | ret = drm_panel_add(&lvds->panel); |
710 | if (ret < 0) |
711 | - goto error; |
712 | + return ret; |
713 | |
714 | dev_set_drvdata(lvds->dev, lvds); |
715 | return 0; |
716 | - |
717 | -error: |
718 | - put_device(&lvds->backlight->dev); |
719 | - return ret; |
720 | } |
721 | |
722 | static int panel_lvds_remove(struct platform_device *pdev) |
723 | @@ -284,9 +274,6 @@ static int panel_lvds_remove(struct platform_device *pdev) |
724 | |
725 | panel_lvds_disable(&lvds->panel); |
726 | |
727 | - if (lvds->backlight) |
728 | - put_device(&lvds->backlight->dev); |
729 | - |
730 | return 0; |
731 | } |
732 | |
733 | diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c |
734 | index 12ff77dacc95..c1eb8cfe6aeb 100644 |
735 | --- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c |
736 | +++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c |
737 | @@ -53,8 +53,10 @@ static int panfrost_devfreq_target(struct device *dev, unsigned long *freq, |
738 | if (err) { |
739 | dev_err(dev, "Cannot set frequency %lu (%d)\n", target_rate, |
740 | err); |
741 | - regulator_set_voltage(pfdev->regulator, pfdev->devfreq.cur_volt, |
742 | - pfdev->devfreq.cur_volt); |
743 | + if (pfdev->regulator) |
744 | + regulator_set_voltage(pfdev->regulator, |
745 | + pfdev->devfreq.cur_volt, |
746 | + pfdev->devfreq.cur_volt); |
747 | return err; |
748 | } |
749 | |
750 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c |
751 | index 62eab82a64f9..897442754fd0 100644 |
752 | --- a/drivers/gpu/drm/radeon/cik.c |
753 | +++ b/drivers/gpu/drm/radeon/cik.c |
754 | @@ -6969,8 +6969,8 @@ static int cik_irq_init(struct radeon_device *rdev) |
755 | } |
756 | |
757 | /* setup interrupt control */ |
758 | - /* XXX this should actually be a bus address, not an MC address. same on older asics */ |
759 | - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); |
760 | + /* set dummy read address to dummy page address */ |
761 | + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); |
762 | interrupt_cntl = RREG32(INTERRUPT_CNTL); |
763 | /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi |
764 | * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN |
765 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
766 | index e937cc01910d..033bc466a862 100644 |
767 | --- a/drivers/gpu/drm/radeon/r600.c |
768 | +++ b/drivers/gpu/drm/radeon/r600.c |
769 | @@ -3696,8 +3696,8 @@ int r600_irq_init(struct radeon_device *rdev) |
770 | } |
771 | |
772 | /* setup interrupt control */ |
773 | - /* set dummy read address to ring address */ |
774 | - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); |
775 | + /* set dummy read address to dummy page address */ |
776 | + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); |
777 | interrupt_cntl = RREG32(INTERRUPT_CNTL); |
778 | /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi |
779 | * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN |
780 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
781 | index 05894d198a79..1d8efb0eefdb 100644 |
782 | --- a/drivers/gpu/drm/radeon/si.c |
783 | +++ b/drivers/gpu/drm/radeon/si.c |
784 | @@ -5997,8 +5997,8 @@ static int si_irq_init(struct radeon_device *rdev) |
785 | } |
786 | |
787 | /* setup interrupt control */ |
788 | - /* set dummy read address to ring address */ |
789 | - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); |
790 | + /* set dummy read address to dummy page address */ |
791 | + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); |
792 | interrupt_cntl = RREG32(INTERRUPT_CNTL); |
793 | /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi |
794 | * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN |
795 | diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c |
796 | index 3fc7e6899cab..50c11a7f0467 100644 |
797 | --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c |
798 | +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c |
799 | @@ -16,6 +16,7 @@ |
800 | #include <linux/of_graph.h> |
801 | #include <linux/platform_device.h> |
802 | #include <linux/slab.h> |
803 | +#include <linux/sys_soc.h> |
804 | |
805 | #include <drm/drm_atomic.h> |
806 | #include <drm/drm_atomic_helper.h> |
807 | @@ -842,8 +843,23 @@ static int rcar_lvds_get_clocks(struct rcar_lvds *lvds) |
808 | return 0; |
809 | } |
810 | |
811 | +static const struct rcar_lvds_device_info rcar_lvds_r8a7790es1_info = { |
812 | + .gen = 2, |
813 | + .quirks = RCAR_LVDS_QUIRK_LANES, |
814 | + .pll_setup = rcar_lvds_pll_setup_gen2, |
815 | +}; |
816 | + |
817 | +static const struct soc_device_attribute lvds_quirk_matches[] = { |
818 | + { |
819 | + .soc_id = "r8a7790", .revision = "ES1.*", |
820 | + .data = &rcar_lvds_r8a7790es1_info, |
821 | + }, |
822 | + { /* sentinel */ } |
823 | +}; |
824 | + |
825 | static int rcar_lvds_probe(struct platform_device *pdev) |
826 | { |
827 | + const struct soc_device_attribute *attr; |
828 | struct rcar_lvds *lvds; |
829 | struct resource *mem; |
830 | int ret; |
831 | @@ -857,6 +873,10 @@ static int rcar_lvds_probe(struct platform_device *pdev) |
832 | lvds->dev = &pdev->dev; |
833 | lvds->info = of_device_get_match_data(&pdev->dev); |
834 | |
835 | + attr = soc_device_match(lvds_quirk_matches); |
836 | + if (attr) |
837 | + lvds->info = attr->data; |
838 | + |
839 | ret = rcar_lvds_parse_dt(lvds); |
840 | if (ret < 0) |
841 | return ret; |
842 | @@ -893,12 +913,6 @@ static const struct rcar_lvds_device_info rcar_lvds_gen2_info = { |
843 | .pll_setup = rcar_lvds_pll_setup_gen2, |
844 | }; |
845 | |
846 | -static const struct rcar_lvds_device_info rcar_lvds_r8a7790_info = { |
847 | - .gen = 2, |
848 | - .quirks = RCAR_LVDS_QUIRK_LANES, |
849 | - .pll_setup = rcar_lvds_pll_setup_gen2, |
850 | -}; |
851 | - |
852 | static const struct rcar_lvds_device_info rcar_lvds_gen3_info = { |
853 | .gen = 3, |
854 | .quirks = RCAR_LVDS_QUIRK_PWD, |
855 | @@ -930,7 +944,7 @@ static const struct of_device_id rcar_lvds_of_table[] = { |
856 | { .compatible = "renesas,r8a7744-lvds", .data = &rcar_lvds_gen2_info }, |
857 | { .compatible = "renesas,r8a774a1-lvds", .data = &rcar_lvds_gen3_info }, |
858 | { .compatible = "renesas,r8a774c0-lvds", .data = &rcar_lvds_r8a77990_info }, |
859 | - { .compatible = "renesas,r8a7790-lvds", .data = &rcar_lvds_r8a7790_info }, |
860 | + { .compatible = "renesas,r8a7790-lvds", .data = &rcar_lvds_gen2_info }, |
861 | { .compatible = "renesas,r8a7791-lvds", .data = &rcar_lvds_gen2_info }, |
862 | { .compatible = "renesas,r8a7793-lvds", .data = &rcar_lvds_gen2_info }, |
863 | { .compatible = "renesas,r8a7795-lvds", .data = &rcar_lvds_gen3_info }, |
864 | diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
865 | index 613404f86668..84e3decb17b1 100644 |
866 | --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
867 | +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
868 | @@ -1040,10 +1040,41 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, |
869 | struct drm_display_mode *adjusted_mode) |
870 | { |
871 | struct vop *vop = to_vop(crtc); |
872 | + unsigned long rate; |
873 | |
874 | - adjusted_mode->clock = |
875 | - DIV_ROUND_UP(clk_round_rate(vop->dclk, |
876 | - adjusted_mode->clock * 1000), 1000); |
877 | + /* |
878 | + * Clock craziness. |
879 | + * |
880 | + * Key points: |
881 | + * |
882 | + * - DRM works in in kHz. |
883 | + * - Clock framework works in Hz. |
884 | + * - Rockchip's clock driver picks the clock rate that is the |
885 | + * same _OR LOWER_ than the one requested. |
886 | + * |
887 | + * Action plan: |
888 | + * |
889 | + * 1. When DRM gives us a mode, we should add 999 Hz to it. That way |
890 | + * if the clock we need is 60000001 Hz (~60 MHz) and DRM tells us to |
891 | + * make 60000 kHz then the clock framework will actually give us |
892 | + * the right clock. |
893 | + * |
894 | + * NOTE: if the PLL (maybe through a divider) could actually make |
895 | + * a clock rate 999 Hz higher instead of the one we want then this |
896 | + * could be a problem. Unfortunately there's not much we can do |
897 | + * since it's baked into DRM to use kHz. It shouldn't matter in |
898 | + * practice since Rockchip PLLs are controlled by tables and |
899 | + * even if there is a divider in the middle I wouldn't expect PLL |
900 | + * rates in the table that are just a few kHz different. |
901 | + * |
902 | + * 2. Get the clock framework to round the rate for us to tell us |
903 | + * what it will actually make. |
904 | + * |
905 | + * 3. Store the rounded up rate so that we don't need to worry about |
906 | + * this in the actual clk_set_rate(). |
907 | + */ |
908 | + rate = clk_round_rate(vop->dclk, adjusted_mode->clock * 1000 + 999); |
909 | + adjusted_mode->clock = DIV_ROUND_UP(rate, 1000); |
910 | |
911 | return true; |
912 | } |
913 | diff --git a/drivers/i2c/busses/i2c-stm32.c b/drivers/i2c/busses/i2c-stm32.c |
914 | index 07d5dfce68d4..1da347e6a358 100644 |
915 | --- a/drivers/i2c/busses/i2c-stm32.c |
916 | +++ b/drivers/i2c/busses/i2c-stm32.c |
917 | @@ -20,13 +20,13 @@ struct stm32_i2c_dma *stm32_i2c_dma_request(struct device *dev, |
918 | |
919 | dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); |
920 | if (!dma) |
921 | - return NULL; |
922 | + return ERR_PTR(-ENOMEM); |
923 | |
924 | /* Request and configure I2C TX dma channel */ |
925 | - dma->chan_tx = dma_request_slave_channel(dev, "tx"); |
926 | - if (!dma->chan_tx) { |
927 | + dma->chan_tx = dma_request_chan(dev, "tx"); |
928 | + if (IS_ERR(dma->chan_tx)) { |
929 | dev_dbg(dev, "can't request DMA tx channel\n"); |
930 | - ret = -EINVAL; |
931 | + ret = PTR_ERR(dma->chan_tx); |
932 | goto fail_al; |
933 | } |
934 | |
935 | @@ -42,10 +42,10 @@ struct stm32_i2c_dma *stm32_i2c_dma_request(struct device *dev, |
936 | } |
937 | |
938 | /* Request and configure I2C RX dma channel */ |
939 | - dma->chan_rx = dma_request_slave_channel(dev, "rx"); |
940 | - if (!dma->chan_rx) { |
941 | + dma->chan_rx = dma_request_chan(dev, "rx"); |
942 | + if (IS_ERR(dma->chan_rx)) { |
943 | dev_err(dev, "can't request DMA rx channel\n"); |
944 | - ret = -EINVAL; |
945 | + ret = PTR_ERR(dma->chan_rx); |
946 | goto fail_tx; |
947 | } |
948 | |
949 | @@ -75,7 +75,7 @@ fail_al: |
950 | devm_kfree(dev, dma); |
951 | dev_info(dev, "can't use DMA\n"); |
952 | |
953 | - return NULL; |
954 | + return ERR_PTR(ret); |
955 | } |
956 | |
957 | void stm32_i2c_dma_free(struct stm32_i2c_dma *dma) |
958 | diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c |
959 | index 84cfed17ff4f..b2634afe066d 100644 |
960 | --- a/drivers/i2c/busses/i2c-stm32f7.c |
961 | +++ b/drivers/i2c/busses/i2c-stm32f7.c |
962 | @@ -1267,8 +1267,8 @@ static int stm32f7_i2c_get_free_slave_id(struct stm32f7_i2c_dev *i2c_dev, |
963 | * slave[0] supports 7-bit and 10-bit slave address |
964 | * slave[1] supports 7-bit slave address only |
965 | */ |
966 | - for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) { |
967 | - if (i == 1 && (slave->flags & I2C_CLIENT_PEC)) |
968 | + for (i = STM32F7_I2C_MAX_SLAVE - 1; i >= 0; i--) { |
969 | + if (i == 1 && (slave->flags & I2C_CLIENT_TEN)) |
970 | continue; |
971 | if (!i2c_dev->slave[i]) { |
972 | *id = i; |
973 | @@ -1955,6 +1955,15 @@ static int stm32f7_i2c_probe(struct platform_device *pdev) |
974 | i2c_dev->dma = stm32_i2c_dma_request(i2c_dev->dev, phy_addr, |
975 | STM32F7_I2C_TXDR, |
976 | STM32F7_I2C_RXDR); |
977 | + if (PTR_ERR(i2c_dev->dma) == -ENODEV) |
978 | + i2c_dev->dma = NULL; |
979 | + else if (IS_ERR(i2c_dev->dma)) { |
980 | + ret = PTR_ERR(i2c_dev->dma); |
981 | + if (ret != -EPROBE_DEFER) |
982 | + dev_err(&pdev->dev, |
983 | + "Failed to request dma error %i\n", ret); |
984 | + goto clk_free; |
985 | + } |
986 | |
987 | platform_set_drvdata(pdev, i2c_dev); |
988 | |
989 | diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c |
990 | index 59ff088c7d75..9feaec3c8329 100644 |
991 | --- a/drivers/leds/leds-tlc591xx.c |
992 | +++ b/drivers/leds/leds-tlc591xx.c |
993 | @@ -13,6 +13,7 @@ |
994 | #include <linux/slab.h> |
995 | |
996 | #define TLC591XX_MAX_LEDS 16 |
997 | +#define TLC591XX_MAX_BRIGHTNESS 256 |
998 | |
999 | #define TLC591XX_REG_MODE1 0x00 |
1000 | #define MODE1_RESPON_ADDR_MASK 0xF0 |
1001 | @@ -112,11 +113,11 @@ tlc591xx_brightness_set(struct led_classdev *led_cdev, |
1002 | struct tlc591xx_priv *priv = led->priv; |
1003 | int err; |
1004 | |
1005 | - switch (brightness) { |
1006 | + switch ((int)brightness) { |
1007 | case 0: |
1008 | err = tlc591xx_set_ledout(priv, led, LEDOUT_OFF); |
1009 | break; |
1010 | - case LED_FULL: |
1011 | + case TLC591XX_MAX_BRIGHTNESS: |
1012 | err = tlc591xx_set_ledout(priv, led, LEDOUT_ON); |
1013 | break; |
1014 | default: |
1015 | @@ -157,7 +158,7 @@ tlc591xx_configure(struct device *dev, |
1016 | led->priv = priv; |
1017 | led->led_no = i; |
1018 | led->ldev.brightness_set_blocking = tlc591xx_brightness_set; |
1019 | - led->ldev.max_brightness = LED_FULL; |
1020 | + led->ldev.max_brightness = TLC591XX_MAX_BRIGHTNESS; |
1021 | err = led_classdev_register(dev, &led->ldev); |
1022 | if (err < 0) { |
1023 | dev_err(dev, "couldn't register LED %s\n", |
1024 | diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c |
1025 | index 9355db29d2f9..1767f30a1676 100644 |
1026 | --- a/drivers/mfd/intel-lpss-pci.c |
1027 | +++ b/drivers/mfd/intel-lpss-pci.c |
1028 | @@ -122,6 +122,18 @@ static const struct intel_lpss_platform_info apl_i2c_info = { |
1029 | .properties = apl_i2c_properties, |
1030 | }; |
1031 | |
1032 | +static struct property_entry glk_i2c_properties[] = { |
1033 | + PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 313), |
1034 | + PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171), |
1035 | + PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 290), |
1036 | + { }, |
1037 | +}; |
1038 | + |
1039 | +static const struct intel_lpss_platform_info glk_i2c_info = { |
1040 | + .clk_rate = 133000000, |
1041 | + .properties = glk_i2c_properties, |
1042 | +}; |
1043 | + |
1044 | static const struct intel_lpss_platform_info cnl_i2c_info = { |
1045 | .clk_rate = 216000000, |
1046 | .properties = spt_i2c_properties, |
1047 | @@ -174,14 +186,14 @@ static const struct pci_device_id intel_lpss_pci_ids[] = { |
1048 | { PCI_VDEVICE(INTEL, 0x1ac6), (kernel_ulong_t)&bxt_info }, |
1049 | { PCI_VDEVICE(INTEL, 0x1aee), (kernel_ulong_t)&bxt_uart_info }, |
1050 | /* GLK */ |
1051 | - { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&bxt_i2c_info }, |
1052 | - { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&bxt_i2c_info }, |
1053 | - { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&bxt_i2c_info }, |
1054 | - { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&bxt_i2c_info }, |
1055 | - { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&bxt_i2c_info }, |
1056 | - { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&bxt_i2c_info }, |
1057 | - { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&bxt_i2c_info }, |
1058 | - { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&bxt_i2c_info }, |
1059 | + { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&glk_i2c_info }, |
1060 | + { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&glk_i2c_info }, |
1061 | + { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&glk_i2c_info }, |
1062 | + { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&glk_i2c_info }, |
1063 | + { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&glk_i2c_info }, |
1064 | + { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&glk_i2c_info }, |
1065 | + { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&glk_i2c_info }, |
1066 | + { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&glk_i2c_info }, |
1067 | { PCI_VDEVICE(INTEL, 0x31bc), (kernel_ulong_t)&bxt_uart_info }, |
1068 | { PCI_VDEVICE(INTEL, 0x31be), (kernel_ulong_t)&bxt_uart_info }, |
1069 | { PCI_VDEVICE(INTEL, 0x31c0), (kernel_ulong_t)&bxt_uart_info }, |
1070 | diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h |
1071 | index 2d2d9ea8be4f..3dba15bccce2 100644 |
1072 | --- a/drivers/mmc/core/quirks.h |
1073 | +++ b/drivers/mmc/core/quirks.h |
1074 | @@ -119,7 +119,14 @@ static const struct mmc_fixup mmc_ext_csd_fixups[] = { |
1075 | END_FIXUP |
1076 | }; |
1077 | |
1078 | + |
1079 | static const struct mmc_fixup sdio_fixup_methods[] = { |
1080 | + SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, |
1081 | + add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), |
1082 | + |
1083 | + SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, |
1084 | + add_quirk, MMC_QUIRK_DISABLE_CD), |
1085 | + |
1086 | SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271, |
1087 | add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), |
1088 | |
1089 | diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
1090 | index b4b82b9c5cd6..fcbe01f61aa4 100644 |
1091 | --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
1092 | +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c |
1093 | @@ -1600,13 +1600,15 @@ static int dpaa_eth_refill_bpools(struct dpaa_priv *priv) |
1094 | * Skb freeing is not handled here. |
1095 | * |
1096 | * This function may be called on error paths in the Tx function, so guard |
1097 | - * against cases when not all fd relevant fields were filled in. |
1098 | + * against cases when not all fd relevant fields were filled in. To avoid |
1099 | + * reading the invalid transmission timestamp for the error paths set ts to |
1100 | + * false. |
1101 | * |
1102 | * Return the skb backpointer, since for S/G frames the buffer containing it |
1103 | * gets freed here. |
1104 | */ |
1105 | static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv, |
1106 | - const struct qm_fd *fd) |
1107 | + const struct qm_fd *fd, bool ts) |
1108 | { |
1109 | const enum dma_data_direction dma_dir = DMA_TO_DEVICE; |
1110 | struct device *dev = priv->net_dev->dev.parent; |
1111 | @@ -1620,18 +1622,6 @@ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv, |
1112 | skbh = (struct sk_buff **)phys_to_virt(addr); |
1113 | skb = *skbh; |
1114 | |
1115 | - if (priv->tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { |
1116 | - memset(&shhwtstamps, 0, sizeof(shhwtstamps)); |
1117 | - |
1118 | - if (!fman_port_get_tstamp(priv->mac_dev->port[TX], (void *)skbh, |
1119 | - &ns)) { |
1120 | - shhwtstamps.hwtstamp = ns_to_ktime(ns); |
1121 | - skb_tstamp_tx(skb, &shhwtstamps); |
1122 | - } else { |
1123 | - dev_warn(dev, "fman_port_get_tstamp failed!\n"); |
1124 | - } |
1125 | - } |
1126 | - |
1127 | if (unlikely(qm_fd_get_format(fd) == qm_fd_sg)) { |
1128 | nr_frags = skb_shinfo(skb)->nr_frags; |
1129 | dma_unmap_single(dev, addr, |
1130 | @@ -1654,14 +1644,29 @@ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv, |
1131 | dma_unmap_page(dev, qm_sg_addr(&sgt[i]), |
1132 | qm_sg_entry_get_len(&sgt[i]), dma_dir); |
1133 | } |
1134 | - |
1135 | - /* Free the page frag that we allocated on Tx */ |
1136 | - skb_free_frag(phys_to_virt(addr)); |
1137 | } else { |
1138 | dma_unmap_single(dev, addr, |
1139 | skb_tail_pointer(skb) - (u8 *)skbh, dma_dir); |
1140 | } |
1141 | |
1142 | + /* DMA unmapping is required before accessing the HW provided info */ |
1143 | + if (ts && priv->tx_tstamp && |
1144 | + skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { |
1145 | + memset(&shhwtstamps, 0, sizeof(shhwtstamps)); |
1146 | + |
1147 | + if (!fman_port_get_tstamp(priv->mac_dev->port[TX], (void *)skbh, |
1148 | + &ns)) { |
1149 | + shhwtstamps.hwtstamp = ns_to_ktime(ns); |
1150 | + skb_tstamp_tx(skb, &shhwtstamps); |
1151 | + } else { |
1152 | + dev_warn(dev, "fman_port_get_tstamp failed!\n"); |
1153 | + } |
1154 | + } |
1155 | + |
1156 | + if (qm_fd_get_format(fd) == qm_fd_sg) |
1157 | + /* Free the page frag that we allocated on Tx */ |
1158 | + skb_free_frag(phys_to_virt(addr)); |
1159 | + |
1160 | return skb; |
1161 | } |
1162 | |
1163 | @@ -2114,7 +2119,7 @@ dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev) |
1164 | if (likely(dpaa_xmit(priv, percpu_stats, queue_mapping, &fd) == 0)) |
1165 | return NETDEV_TX_OK; |
1166 | |
1167 | - dpaa_cleanup_tx_fd(priv, &fd); |
1168 | + dpaa_cleanup_tx_fd(priv, &fd, false); |
1169 | skb_to_fd_failed: |
1170 | enomem: |
1171 | percpu_stats->tx_errors++; |
1172 | @@ -2160,7 +2165,7 @@ static void dpaa_tx_error(struct net_device *net_dev, |
1173 | |
1174 | percpu_priv->stats.tx_errors++; |
1175 | |
1176 | - skb = dpaa_cleanup_tx_fd(priv, fd); |
1177 | + skb = dpaa_cleanup_tx_fd(priv, fd, false); |
1178 | dev_kfree_skb(skb); |
1179 | } |
1180 | |
1181 | @@ -2200,7 +2205,7 @@ static void dpaa_tx_conf(struct net_device *net_dev, |
1182 | |
1183 | percpu_priv->tx_confirm++; |
1184 | |
1185 | - skb = dpaa_cleanup_tx_fd(priv, fd); |
1186 | + skb = dpaa_cleanup_tx_fd(priv, fd, true); |
1187 | |
1188 | consume_skb(skb); |
1189 | } |
1190 | @@ -2430,7 +2435,7 @@ static void egress_ern(struct qman_portal *portal, |
1191 | percpu_priv->stats.tx_fifo_errors++; |
1192 | count_ern(percpu_priv, msg); |
1193 | |
1194 | - skb = dpaa_cleanup_tx_fd(priv, fd); |
1195 | + skb = dpaa_cleanup_tx_fd(priv, fd, false); |
1196 | dev_kfree_skb_any(skb); |
1197 | } |
1198 | |
1199 | diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c |
1200 | index 0aa1c34019bb..dc9a6c36cac0 100644 |
1201 | --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c |
1202 | +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c |
1203 | @@ -216,7 +216,7 @@ static void dpaa2_eth_get_ethtool_stats(struct net_device *net_dev, |
1204 | if (err == -EINVAL) |
1205 | /* Older firmware versions don't support all pages */ |
1206 | memset(&dpni_stats, 0, sizeof(dpni_stats)); |
1207 | - else |
1208 | + else if (err) |
1209 | netdev_warn(net_dev, "dpni_get_stats(%d) failed\n", j); |
1210 | |
1211 | num_cnt = dpni_stats_page_size[j] / sizeof(u64); |
1212 | diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c |
1213 | index c0637a0cbfe8..e92a00a61755 100644 |
1214 | --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c |
1215 | +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c |
1216 | @@ -1873,8 +1873,8 @@ static int ice_vc_get_stats_msg(struct ice_vf *vf, u8 *msg) |
1217 | enum virtchnl_status_code v_ret = VIRTCHNL_STATUS_SUCCESS; |
1218 | struct virtchnl_queue_select *vqs = |
1219 | (struct virtchnl_queue_select *)msg; |
1220 | + struct ice_eth_stats stats = { 0 }; |
1221 | struct ice_pf *pf = vf->pf; |
1222 | - struct ice_eth_stats stats; |
1223 | struct ice_vsi *vsi; |
1224 | |
1225 | if (!test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) { |
1226 | @@ -1893,7 +1893,6 @@ static int ice_vc_get_stats_msg(struct ice_vf *vf, u8 *msg) |
1227 | goto error_param; |
1228 | } |
1229 | |
1230 | - memset(&stats, 0, sizeof(struct ice_eth_stats)); |
1231 | ice_update_eth_stats(vsi); |
1232 | |
1233 | stats = vsi->eth_stats; |
1234 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1235 | index 947122c68493..96711e34d248 100644 |
1236 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1237 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1238 | @@ -1615,8 +1615,11 @@ static void __mlx5e_tc_del_fdb_peer_flow(struct mlx5e_tc_flow *flow) |
1239 | |
1240 | flow_flag_clear(flow, DUP); |
1241 | |
1242 | - mlx5e_tc_del_fdb_flow(flow->peer_flow->priv, flow->peer_flow); |
1243 | - kfree(flow->peer_flow); |
1244 | + if (refcount_dec_and_test(&flow->peer_flow->refcnt)) { |
1245 | + mlx5e_tc_del_fdb_flow(flow->peer_flow->priv, flow->peer_flow); |
1246 | + kfree(flow->peer_flow); |
1247 | + } |
1248 | + |
1249 | flow->peer_flow = NULL; |
1250 | } |
1251 | |
1252 | diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c |
1253 | index f9e6744d8fd6..41ddd8fff2a7 100644 |
1254 | --- a/drivers/net/ethernet/socionext/netsec.c |
1255 | +++ b/drivers/net/ethernet/socionext/netsec.c |
1256 | @@ -847,8 +847,8 @@ static u32 netsec_xdp_queue_one(struct netsec_priv *priv, |
1257 | enum dma_data_direction dma_dir = |
1258 | page_pool_get_dma_dir(rx_ring->page_pool); |
1259 | |
1260 | - dma_handle = page_pool_get_dma_addr(page) + |
1261 | - NETSEC_RXBUF_HEADROOM; |
1262 | + dma_handle = page_pool_get_dma_addr(page) + xdpf->headroom + |
1263 | + sizeof(*xdpf); |
1264 | dma_sync_single_for_device(priv->dev, dma_handle, xdpf->len, |
1265 | dma_dir); |
1266 | tx_desc.buf_type = TYPE_NETSEC_XDP_TX; |
1267 | diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c |
1268 | index 676006f32f91..479325eeaf8a 100644 |
1269 | --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c |
1270 | +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c |
1271 | @@ -1790,10 +1790,6 @@ static int axienet_probe(struct platform_device *pdev) |
1272 | /* Check for these resources directly on the Ethernet node. */ |
1273 | struct resource *res = platform_get_resource(pdev, |
1274 | IORESOURCE_MEM, 1); |
1275 | - if (!res) { |
1276 | - dev_err(&pdev->dev, "unable to get DMA memory resource\n"); |
1277 | - goto free_netdev; |
1278 | - } |
1279 | lp->dma_regs = devm_ioremap_resource(&pdev->dev, res); |
1280 | lp->rx_irq = platform_get_irq(pdev, 1); |
1281 | lp->tx_irq = platform_get_irq(pdev, 0); |
1282 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c |
1283 | index 78e3e689a733..0dee358864f3 100644 |
1284 | --- a/drivers/net/hyperv/netvsc_drv.c |
1285 | +++ b/drivers/net/hyperv/netvsc_drv.c |
1286 | @@ -285,9 +285,9 @@ static inline u32 netvsc_get_hash( |
1287 | else if (flow.basic.n_proto == htons(ETH_P_IPV6)) |
1288 | hash = jhash2((u32 *)&flow.addrs.v6addrs, 8, hashrnd); |
1289 | else |
1290 | - hash = 0; |
1291 | + return 0; |
1292 | |
1293 | - skb_set_hash(skb, hash, PKT_HASH_TYPE_L3); |
1294 | + __skb_set_sw_hash(skb, hash, false); |
1295 | } |
1296 | |
1297 | return hash; |
1298 | @@ -795,8 +795,7 @@ static struct sk_buff *netvsc_alloc_recv_skb(struct net_device *net, |
1299 | skb->protocol == htons(ETH_P_IP)) |
1300 | netvsc_comp_ipcsum(skb); |
1301 | |
1302 | - /* Do L4 checksum offload if enabled and present. |
1303 | - */ |
1304 | + /* Do L4 checksum offload if enabled and present. */ |
1305 | if (csum_info && (net->features & NETIF_F_RXCSUM)) { |
1306 | if (csum_info->receive.tcp_checksum_succeeded || |
1307 | csum_info->receive.udp_checksum_succeeded) |
1308 | diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c |
1309 | index 937d0059e8ac..5e956089bf52 100644 |
1310 | --- a/drivers/net/phy/broadcom.c |
1311 | +++ b/drivers/net/phy/broadcom.c |
1312 | @@ -26,18 +26,13 @@ MODULE_DESCRIPTION("Broadcom PHY driver"); |
1313 | MODULE_AUTHOR("Maciej W. Rozycki"); |
1314 | MODULE_LICENSE("GPL"); |
1315 | |
1316 | +static int bcm54xx_config_clock_delay(struct phy_device *phydev); |
1317 | + |
1318 | static int bcm54210e_config_init(struct phy_device *phydev) |
1319 | { |
1320 | int val; |
1321 | |
1322 | - val = bcm54xx_auxctl_read(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC); |
1323 | - val &= ~MII_BCM54XX_AUXCTL_SHDWSEL_MISC_RGMII_SKEW_EN; |
1324 | - val |= MII_BCM54XX_AUXCTL_MISC_WREN; |
1325 | - bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC, val); |
1326 | - |
1327 | - val = bcm_phy_read_shadow(phydev, BCM54810_SHD_CLK_CTL); |
1328 | - val &= ~BCM54810_SHD_CLK_CTL_GTXCLK_EN; |
1329 | - bcm_phy_write_shadow(phydev, BCM54810_SHD_CLK_CTL, val); |
1330 | + bcm54xx_config_clock_delay(phydev); |
1331 | |
1332 | if (phydev->dev_flags & PHY_BRCM_EN_MASTER_MODE) { |
1333 | val = phy_read(phydev, MII_CTRL1000); |
1334 | diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h |
1335 | index 8aec7ccf2d79..502814c26b33 100644 |
1336 | --- a/drivers/net/wireless/mediatek/mt76/mt76.h |
1337 | +++ b/drivers/net/wireless/mediatek/mt76/mt76.h |
1338 | @@ -367,8 +367,8 @@ enum mt76u_in_ep { |
1339 | |
1340 | enum mt76u_out_ep { |
1341 | MT_EP_OUT_INBAND_CMD, |
1342 | - MT_EP_OUT_AC_BK, |
1343 | MT_EP_OUT_AC_BE, |
1344 | + MT_EP_OUT_AC_BK, |
1345 | MT_EP_OUT_AC_VI, |
1346 | MT_EP_OUT_AC_VO, |
1347 | MT_EP_OUT_HCCA, |
1348 | @@ -799,7 +799,8 @@ static inline int |
1349 | mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, |
1350 | int timeout) |
1351 | { |
1352 | - struct usb_device *udev = to_usb_device(dev->dev); |
1353 | + struct usb_interface *uintf = to_usb_interface(dev->dev); |
1354 | + struct usb_device *udev = interface_to_usbdev(uintf); |
1355 | struct mt76_usb *usb = &dev->usb; |
1356 | unsigned int pipe; |
1357 | |
1358 | diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c |
1359 | index 00a445d27599..65d404e61404 100644 |
1360 | --- a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c |
1361 | +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c |
1362 | @@ -226,7 +226,7 @@ static int mt76x0u_probe(struct usb_interface *usb_intf, |
1363 | u32 mac_rev; |
1364 | int ret; |
1365 | |
1366 | - mdev = mt76_alloc_device(&usb_dev->dev, sizeof(*dev), &mt76x0u_ops, |
1367 | + mdev = mt76_alloc_device(&usb_intf->dev, sizeof(*dev), &mt76x0u_ops, |
1368 | &drv_ops); |
1369 | if (!mdev) |
1370 | return -ENOMEM; |
1371 | diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c |
1372 | index da5e0f9a8bae..8b26c6108186 100644 |
1373 | --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c |
1374 | +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c |
1375 | @@ -39,7 +39,7 @@ static int mt76x2u_probe(struct usb_interface *intf, |
1376 | struct mt76_dev *mdev; |
1377 | int err; |
1378 | |
1379 | - mdev = mt76_alloc_device(&udev->dev, sizeof(*dev), &mt76x2u_ops, |
1380 | + mdev = mt76_alloc_device(&intf->dev, sizeof(*dev), &mt76x2u_ops, |
1381 | &drv_ops); |
1382 | if (!mdev) |
1383 | return -ENOMEM; |
1384 | diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c |
1385 | index 20c6fe510e9d..05aa42bd9808 100644 |
1386 | --- a/drivers/net/wireless/mediatek/mt76/usb.c |
1387 | +++ b/drivers/net/wireless/mediatek/mt76/usb.c |
1388 | @@ -20,7 +20,8 @@ static int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, |
1389 | u8 req_type, u16 val, u16 offset, |
1390 | void *buf, size_t len) |
1391 | { |
1392 | - struct usb_device *udev = to_usb_device(dev->dev); |
1393 | + struct usb_interface *uintf = to_usb_interface(dev->dev); |
1394 | + struct usb_device *udev = interface_to_usbdev(uintf); |
1395 | unsigned int pipe; |
1396 | int i, ret; |
1397 | |
1398 | @@ -235,7 +236,8 @@ mt76u_rd_rp(struct mt76_dev *dev, u32 base, |
1399 | |
1400 | static bool mt76u_check_sg(struct mt76_dev *dev) |
1401 | { |
1402 | - struct usb_device *udev = to_usb_device(dev->dev); |
1403 | + struct usb_interface *uintf = to_usb_interface(dev->dev); |
1404 | + struct usb_device *udev = interface_to_usbdev(uintf); |
1405 | |
1406 | return (!disable_usb_sg && udev->bus->sg_tablesize > 0 && |
1407 | (udev->bus->no_sg_constraint || |
1408 | @@ -370,7 +372,8 @@ mt76u_fill_bulk_urb(struct mt76_dev *dev, int dir, int index, |
1409 | struct urb *urb, usb_complete_t complete_fn, |
1410 | void *context) |
1411 | { |
1412 | - struct usb_device *udev = to_usb_device(dev->dev); |
1413 | + struct usb_interface *uintf = to_usb_interface(dev->dev); |
1414 | + struct usb_device *udev = interface_to_usbdev(uintf); |
1415 | unsigned int pipe; |
1416 | |
1417 | if (dir == USB_DIR_IN) |
1418 | @@ -952,6 +955,7 @@ int mt76u_init(struct mt76_dev *dev, |
1419 | .rd_rp = mt76u_rd_rp, |
1420 | .type = MT76_BUS_USB, |
1421 | }; |
1422 | + struct usb_device *udev = interface_to_usbdev(intf); |
1423 | struct mt76_usb *usb = &dev->usb; |
1424 | |
1425 | tasklet_init(&usb->rx_tasklet, mt76u_rx_tasklet, (unsigned long)dev); |
1426 | @@ -965,6 +969,8 @@ int mt76u_init(struct mt76_dev *dev, |
1427 | dev->bus = &mt76u_ops; |
1428 | dev->queue_ops = &usb_queue_ops; |
1429 | |
1430 | + dev_set_drvdata(&udev->dev, dev); |
1431 | + |
1432 | usb->sg_en = mt76u_check_sg(dev); |
1433 | |
1434 | return mt76u_set_endpoints(intf, usb); |
1435 | diff --git a/drivers/net/wireless/mediatek/mt7601u/phy.c b/drivers/net/wireless/mediatek/mt7601u/phy.c |
1436 | index 06f5702ab4bd..d863ab4a66c9 100644 |
1437 | --- a/drivers/net/wireless/mediatek/mt7601u/phy.c |
1438 | +++ b/drivers/net/wireless/mediatek/mt7601u/phy.c |
1439 | @@ -213,7 +213,7 @@ int mt7601u_wait_bbp_ready(struct mt7601u_dev *dev) |
1440 | |
1441 | do { |
1442 | val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); |
1443 | - if (val && ~val) |
1444 | + if (val && val != 0xff) |
1445 | break; |
1446 | } while (--i); |
1447 | |
1448 | diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c |
1449 | index f1cdcd61c54a..c99f1912e266 100644 |
1450 | --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c |
1451 | +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c |
1452 | @@ -5839,8 +5839,7 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) |
1453 | rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21); |
1454 | rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40); |
1455 | } else if (rt2x00_rt(rt2x00dev, RT5390) || |
1456 | - rt2x00_rt(rt2x00dev, RT5392) || |
1457 | - rt2x00_rt(rt2x00dev, RT6352)) { |
1458 | + rt2x00_rt(rt2x00dev, RT5392)) { |
1459 | rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); |
1460 | rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); |
1461 | rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); |
1462 | @@ -5854,8 +5853,6 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) |
1463 | rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); |
1464 | rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000); |
1465 | rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); |
1466 | - rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002); |
1467 | - rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F); |
1468 | rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000); |
1469 | rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); |
1470 | rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); |
1471 | diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c |
1472 | index b082e2cc95f5..35dbdb3c4f1e 100644 |
1473 | --- a/drivers/net/wireless/realtek/rtw88/fw.c |
1474 | +++ b/drivers/net/wireless/realtek/rtw88/fw.c |
1475 | @@ -498,9 +498,6 @@ static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size, |
1476 | { |
1477 | struct sk_buff *skb = rsvd_pkt->skb; |
1478 | |
1479 | - if (rsvd_pkt->add_txdesc) |
1480 | - rtw_fill_rsvd_page_desc(rtwdev, skb); |
1481 | - |
1482 | if (page >= 1) |
1483 | memcpy(buf + page_margin + page_size * (page - 1), |
1484 | skb->data, skb->len); |
1485 | @@ -625,16 +622,37 @@ static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, |
1486 | list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, list) { |
1487 | iter = rtw_get_rsvd_page_skb(hw, vif, rsvd_pkt->type); |
1488 | if (!iter) { |
1489 | - rtw_err(rtwdev, "fail to build rsvd packet\n"); |
1490 | + rtw_err(rtwdev, "failed to build rsvd packet\n"); |
1491 | goto release_skb; |
1492 | } |
1493 | + |
1494 | + /* Fill the tx_desc for the rsvd pkt that requires one. |
1495 | + * And iter->len will be added with size of tx_desc_sz. |
1496 | + */ |
1497 | + if (rsvd_pkt->add_txdesc) |
1498 | + rtw_fill_rsvd_page_desc(rtwdev, iter); |
1499 | + |
1500 | rsvd_pkt->skb = iter; |
1501 | rsvd_pkt->page = total_page; |
1502 | - if (rsvd_pkt->add_txdesc) |
1503 | + |
1504 | + /* Reserved page is downloaded via TX path, and TX path will |
1505 | + * generate a tx_desc at the header to describe length of |
1506 | + * the buffer. If we are not counting page numbers with the |
1507 | + * size of tx_desc added at the first rsvd_pkt (usually a |
1508 | + * beacon, firmware default refer to the first page as the |
1509 | + * content of beacon), we could generate a buffer which size |
1510 | + * is smaller than the actual size of the whole rsvd_page |
1511 | + */ |
1512 | + if (total_page == 0) { |
1513 | + if (rsvd_pkt->type != RSVD_BEACON) { |
1514 | + rtw_err(rtwdev, "first page should be a beacon\n"); |
1515 | + goto release_skb; |
1516 | + } |
1517 | total_page += rtw_len_to_page(iter->len + tx_desc_sz, |
1518 | page_size); |
1519 | - else |
1520 | + } else { |
1521 | total_page += rtw_len_to_page(iter->len, page_size); |
1522 | + } |
1523 | } |
1524 | |
1525 | if (total_page > rtwdev->fifo.rsvd_drv_pg_num) { |
1526 | @@ -647,13 +665,24 @@ static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, |
1527 | if (!buf) |
1528 | goto release_skb; |
1529 | |
1530 | + /* Copy the content of each rsvd_pkt to the buf, and they should |
1531 | + * be aligned to the pages. |
1532 | + * |
1533 | + * Note that the first rsvd_pkt is a beacon no matter what vif->type. |
1534 | + * And that rsvd_pkt does not require tx_desc because when it goes |
1535 | + * through TX path, the TX path will generate one for it. |
1536 | + */ |
1537 | list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, list) { |
1538 | rtw_rsvd_page_list_to_buf(rtwdev, page_size, page_margin, |
1539 | page, buf, rsvd_pkt); |
1540 | - page += rtw_len_to_page(rsvd_pkt->skb->len, page_size); |
1541 | - } |
1542 | - list_for_each_entry(rsvd_pkt, &rtwdev->rsvd_page_list, list) |
1543 | + if (page == 0) |
1544 | + page += rtw_len_to_page(rsvd_pkt->skb->len + |
1545 | + tx_desc_sz, page_size); |
1546 | + else |
1547 | + page += rtw_len_to_page(rsvd_pkt->skb->len, page_size); |
1548 | + |
1549 | kfree_skb(rsvd_pkt->skb); |
1550 | + } |
1551 | |
1552 | return buf; |
1553 | |
1554 | @@ -706,6 +735,11 @@ int rtw_fw_download_rsvd_page(struct rtw_dev *rtwdev, struct ieee80211_vif *vif) |
1555 | goto free; |
1556 | } |
1557 | |
1558 | + /* The last thing is to download the *ONLY* beacon again, because |
1559 | + * the previous tx_desc is to describe the total rsvd page. Download |
1560 | + * the beacon again to replace the TX desc header, and we will get |
1561 | + * a correct tx_desc for the beacon in the rsvd page. |
1562 | + */ |
1563 | ret = rtw_download_beacon(rtwdev, vif); |
1564 | if (ret) { |
1565 | rtw_err(rtwdev, "failed to download beacon\n"); |
1566 | diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c |
1567 | index 7a3a4911bde2..806af37192bc 100644 |
1568 | --- a/drivers/net/wireless/realtek/rtw88/main.c |
1569 | +++ b/drivers/net/wireless/realtek/rtw88/main.c |
1570 | @@ -1048,19 +1048,19 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev) |
1571 | /* power on mac to read efuse */ |
1572 | ret = rtw_chip_efuse_enable(rtwdev); |
1573 | if (ret) |
1574 | - goto out; |
1575 | + goto out_unlock; |
1576 | |
1577 | ret = rtw_parse_efuse_map(rtwdev); |
1578 | if (ret) |
1579 | - goto out; |
1580 | + goto out_disable; |
1581 | |
1582 | ret = rtw_dump_hw_feature(rtwdev); |
1583 | if (ret) |
1584 | - goto out; |
1585 | + goto out_disable; |
1586 | |
1587 | ret = rtw_check_supported_rfe(rtwdev); |
1588 | if (ret) |
1589 | - goto out; |
1590 | + goto out_disable; |
1591 | |
1592 | if (efuse->crystal_cap == 0xff) |
1593 | efuse->crystal_cap = 0; |
1594 | @@ -1087,9 +1087,10 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev) |
1595 | efuse->ext_pa_5g = efuse->pa_type_5g & BIT(0) ? 1 : 0; |
1596 | efuse->ext_lna_2g = efuse->lna_type_5g & BIT(3) ? 1 : 0; |
1597 | |
1598 | +out_disable: |
1599 | rtw_chip_efuse_disable(rtwdev); |
1600 | |
1601 | -out: |
1602 | +out_unlock: |
1603 | mutex_unlock(&rtwdev->mutex); |
1604 | return ret; |
1605 | } |
1606 | diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c |
1607 | index a45a6447b01d..32f37d08d5bc 100644 |
1608 | --- a/drivers/pci/controller/pcie-mobiveil.c |
1609 | +++ b/drivers/pci/controller/pcie-mobiveil.c |
1610 | @@ -235,7 +235,7 @@ static int mobiveil_pcie_write(void __iomem *addr, int size, u32 val) |
1611 | return PCIBIOS_SUCCESSFUL; |
1612 | } |
1613 | |
1614 | -static u32 csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size) |
1615 | +static u32 mobiveil_csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size) |
1616 | { |
1617 | void *addr; |
1618 | u32 val; |
1619 | @@ -250,7 +250,8 @@ static u32 csr_read(struct mobiveil_pcie *pcie, u32 off, size_t size) |
1620 | return val; |
1621 | } |
1622 | |
1623 | -static void csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, size_t size) |
1624 | +static void mobiveil_csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, |
1625 | + size_t size) |
1626 | { |
1627 | void *addr; |
1628 | int ret; |
1629 | @@ -262,19 +263,19 @@ static void csr_write(struct mobiveil_pcie *pcie, u32 val, u32 off, size_t size) |
1630 | dev_err(&pcie->pdev->dev, "write CSR address failed\n"); |
1631 | } |
1632 | |
1633 | -static u32 csr_readl(struct mobiveil_pcie *pcie, u32 off) |
1634 | +static u32 mobiveil_csr_readl(struct mobiveil_pcie *pcie, u32 off) |
1635 | { |
1636 | - return csr_read(pcie, off, 0x4); |
1637 | + return mobiveil_csr_read(pcie, off, 0x4); |
1638 | } |
1639 | |
1640 | -static void csr_writel(struct mobiveil_pcie *pcie, u32 val, u32 off) |
1641 | +static void mobiveil_csr_writel(struct mobiveil_pcie *pcie, u32 val, u32 off) |
1642 | { |
1643 | - csr_write(pcie, val, off, 0x4); |
1644 | + mobiveil_csr_write(pcie, val, off, 0x4); |
1645 | } |
1646 | |
1647 | static bool mobiveil_pcie_link_up(struct mobiveil_pcie *pcie) |
1648 | { |
1649 | - return (csr_readl(pcie, LTSSM_STATUS) & |
1650 | + return (mobiveil_csr_readl(pcie, LTSSM_STATUS) & |
1651 | LTSSM_STATUS_L0_MASK) == LTSSM_STATUS_L0; |
1652 | } |
1653 | |
1654 | @@ -323,7 +324,7 @@ static void __iomem *mobiveil_pcie_map_bus(struct pci_bus *bus, |
1655 | PCI_SLOT(devfn) << PAB_DEVICE_SHIFT | |
1656 | PCI_FUNC(devfn) << PAB_FUNCTION_SHIFT; |
1657 | |
1658 | - csr_writel(pcie, value, PAB_AXI_AMAP_PEX_WIN_L(WIN_NUM_0)); |
1659 | + mobiveil_csr_writel(pcie, value, PAB_AXI_AMAP_PEX_WIN_L(WIN_NUM_0)); |
1660 | |
1661 | return pcie->config_axi_slave_base + where; |
1662 | } |
1663 | @@ -353,13 +354,14 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) |
1664 | chained_irq_enter(chip, desc); |
1665 | |
1666 | /* read INTx status */ |
1667 | - val = csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT); |
1668 | - mask = csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1669 | + val = mobiveil_csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT); |
1670 | + mask = mobiveil_csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1671 | intr_status = val & mask; |
1672 | |
1673 | /* Handle INTx */ |
1674 | if (intr_status & PAB_INTP_INTX_MASK) { |
1675 | - shifted_status = csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT); |
1676 | + shifted_status = mobiveil_csr_readl(pcie, |
1677 | + PAB_INTP_AMBA_MISC_STAT); |
1678 | shifted_status &= PAB_INTP_INTX_MASK; |
1679 | shifted_status >>= PAB_INTX_START; |
1680 | do { |
1681 | @@ -373,12 +375,13 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) |
1682 | bit); |
1683 | |
1684 | /* clear interrupt handled */ |
1685 | - csr_writel(pcie, 1 << (PAB_INTX_START + bit), |
1686 | - PAB_INTP_AMBA_MISC_STAT); |
1687 | + mobiveil_csr_writel(pcie, |
1688 | + 1 << (PAB_INTX_START + bit), |
1689 | + PAB_INTP_AMBA_MISC_STAT); |
1690 | } |
1691 | |
1692 | - shifted_status = csr_readl(pcie, |
1693 | - PAB_INTP_AMBA_MISC_STAT); |
1694 | + shifted_status = mobiveil_csr_readl(pcie, |
1695 | + PAB_INTP_AMBA_MISC_STAT); |
1696 | shifted_status &= PAB_INTP_INTX_MASK; |
1697 | shifted_status >>= PAB_INTX_START; |
1698 | } while (shifted_status != 0); |
1699 | @@ -413,7 +416,7 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) |
1700 | } |
1701 | |
1702 | /* Clear the interrupt status */ |
1703 | - csr_writel(pcie, intr_status, PAB_INTP_AMBA_MISC_STAT); |
1704 | + mobiveil_csr_writel(pcie, intr_status, PAB_INTP_AMBA_MISC_STAT); |
1705 | chained_irq_exit(chip, desc); |
1706 | } |
1707 | |
1708 | @@ -474,24 +477,24 @@ static void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, |
1709 | return; |
1710 | } |
1711 | |
1712 | - value = csr_readl(pcie, PAB_PEX_AMAP_CTRL(win_num)); |
1713 | + value = mobiveil_csr_readl(pcie, PAB_PEX_AMAP_CTRL(win_num)); |
1714 | value &= ~(AMAP_CTRL_TYPE_MASK << AMAP_CTRL_TYPE_SHIFT | WIN_SIZE_MASK); |
1715 | value |= type << AMAP_CTRL_TYPE_SHIFT | 1 << AMAP_CTRL_EN_SHIFT | |
1716 | (lower_32_bits(size64) & WIN_SIZE_MASK); |
1717 | - csr_writel(pcie, value, PAB_PEX_AMAP_CTRL(win_num)); |
1718 | + mobiveil_csr_writel(pcie, value, PAB_PEX_AMAP_CTRL(win_num)); |
1719 | |
1720 | - csr_writel(pcie, upper_32_bits(size64), |
1721 | - PAB_EXT_PEX_AMAP_SIZEN(win_num)); |
1722 | + mobiveil_csr_writel(pcie, upper_32_bits(size64), |
1723 | + PAB_EXT_PEX_AMAP_SIZEN(win_num)); |
1724 | |
1725 | - csr_writel(pcie, lower_32_bits(cpu_addr), |
1726 | - PAB_PEX_AMAP_AXI_WIN(win_num)); |
1727 | - csr_writel(pcie, upper_32_bits(cpu_addr), |
1728 | - PAB_EXT_PEX_AMAP_AXI_WIN(win_num)); |
1729 | + mobiveil_csr_writel(pcie, lower_32_bits(cpu_addr), |
1730 | + PAB_PEX_AMAP_AXI_WIN(win_num)); |
1731 | + mobiveil_csr_writel(pcie, upper_32_bits(cpu_addr), |
1732 | + PAB_EXT_PEX_AMAP_AXI_WIN(win_num)); |
1733 | |
1734 | - csr_writel(pcie, lower_32_bits(pci_addr), |
1735 | - PAB_PEX_AMAP_PEX_WIN_L(win_num)); |
1736 | - csr_writel(pcie, upper_32_bits(pci_addr), |
1737 | - PAB_PEX_AMAP_PEX_WIN_H(win_num)); |
1738 | + mobiveil_csr_writel(pcie, lower_32_bits(pci_addr), |
1739 | + PAB_PEX_AMAP_PEX_WIN_L(win_num)); |
1740 | + mobiveil_csr_writel(pcie, upper_32_bits(pci_addr), |
1741 | + PAB_PEX_AMAP_PEX_WIN_H(win_num)); |
1742 | |
1743 | pcie->ib_wins_configured++; |
1744 | } |
1745 | @@ -515,27 +518,29 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, |
1746 | * program Enable Bit to 1, Type Bit to (00) base 2, AXI Window Size Bit |
1747 | * to 4 KB in PAB_AXI_AMAP_CTRL register |
1748 | */ |
1749 | - value = csr_readl(pcie, PAB_AXI_AMAP_CTRL(win_num)); |
1750 | + value = mobiveil_csr_readl(pcie, PAB_AXI_AMAP_CTRL(win_num)); |
1751 | value &= ~(WIN_TYPE_MASK << WIN_TYPE_SHIFT | WIN_SIZE_MASK); |
1752 | value |= 1 << WIN_ENABLE_SHIFT | type << WIN_TYPE_SHIFT | |
1753 | (lower_32_bits(size64) & WIN_SIZE_MASK); |
1754 | - csr_writel(pcie, value, PAB_AXI_AMAP_CTRL(win_num)); |
1755 | + mobiveil_csr_writel(pcie, value, PAB_AXI_AMAP_CTRL(win_num)); |
1756 | |
1757 | - csr_writel(pcie, upper_32_bits(size64), PAB_EXT_AXI_AMAP_SIZE(win_num)); |
1758 | + mobiveil_csr_writel(pcie, upper_32_bits(size64), |
1759 | + PAB_EXT_AXI_AMAP_SIZE(win_num)); |
1760 | |
1761 | /* |
1762 | * program AXI window base with appropriate value in |
1763 | * PAB_AXI_AMAP_AXI_WIN0 register |
1764 | */ |
1765 | - csr_writel(pcie, lower_32_bits(cpu_addr) & (~AXI_WINDOW_ALIGN_MASK), |
1766 | - PAB_AXI_AMAP_AXI_WIN(win_num)); |
1767 | - csr_writel(pcie, upper_32_bits(cpu_addr), |
1768 | - PAB_EXT_AXI_AMAP_AXI_WIN(win_num)); |
1769 | + mobiveil_csr_writel(pcie, |
1770 | + lower_32_bits(cpu_addr) & (~AXI_WINDOW_ALIGN_MASK), |
1771 | + PAB_AXI_AMAP_AXI_WIN(win_num)); |
1772 | + mobiveil_csr_writel(pcie, upper_32_bits(cpu_addr), |
1773 | + PAB_EXT_AXI_AMAP_AXI_WIN(win_num)); |
1774 | |
1775 | - csr_writel(pcie, lower_32_bits(pci_addr), |
1776 | - PAB_AXI_AMAP_PEX_WIN_L(win_num)); |
1777 | - csr_writel(pcie, upper_32_bits(pci_addr), |
1778 | - PAB_AXI_AMAP_PEX_WIN_H(win_num)); |
1779 | + mobiveil_csr_writel(pcie, lower_32_bits(pci_addr), |
1780 | + PAB_AXI_AMAP_PEX_WIN_L(win_num)); |
1781 | + mobiveil_csr_writel(pcie, upper_32_bits(pci_addr), |
1782 | + PAB_AXI_AMAP_PEX_WIN_H(win_num)); |
1783 | |
1784 | pcie->ob_wins_configured++; |
1785 | } |
1786 | @@ -579,42 +584,42 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) |
1787 | struct resource_entry *win; |
1788 | |
1789 | /* setup bus numbers */ |
1790 | - value = csr_readl(pcie, PCI_PRIMARY_BUS); |
1791 | + value = mobiveil_csr_readl(pcie, PCI_PRIMARY_BUS); |
1792 | value &= 0xff000000; |
1793 | value |= 0x00ff0100; |
1794 | - csr_writel(pcie, value, PCI_PRIMARY_BUS); |
1795 | + mobiveil_csr_writel(pcie, value, PCI_PRIMARY_BUS); |
1796 | |
1797 | /* |
1798 | * program Bus Master Enable Bit in Command Register in PAB Config |
1799 | * Space |
1800 | */ |
1801 | - value = csr_readl(pcie, PCI_COMMAND); |
1802 | + value = mobiveil_csr_readl(pcie, PCI_COMMAND); |
1803 | value |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER; |
1804 | - csr_writel(pcie, value, PCI_COMMAND); |
1805 | + mobiveil_csr_writel(pcie, value, PCI_COMMAND); |
1806 | |
1807 | /* |
1808 | * program PIO Enable Bit to 1 (and PEX PIO Enable to 1) in PAB_CTRL |
1809 | * register |
1810 | */ |
1811 | - pab_ctrl = csr_readl(pcie, PAB_CTRL); |
1812 | + pab_ctrl = mobiveil_csr_readl(pcie, PAB_CTRL); |
1813 | pab_ctrl |= (1 << AMBA_PIO_ENABLE_SHIFT) | (1 << PEX_PIO_ENABLE_SHIFT); |
1814 | - csr_writel(pcie, pab_ctrl, PAB_CTRL); |
1815 | + mobiveil_csr_writel(pcie, pab_ctrl, PAB_CTRL); |
1816 | |
1817 | - csr_writel(pcie, (PAB_INTP_INTX_MASK | PAB_INTP_MSI_MASK), |
1818 | - PAB_INTP_AMBA_MISC_ENB); |
1819 | + mobiveil_csr_writel(pcie, (PAB_INTP_INTX_MASK | PAB_INTP_MSI_MASK), |
1820 | + PAB_INTP_AMBA_MISC_ENB); |
1821 | |
1822 | /* |
1823 | * program PIO Enable Bit to 1 and Config Window Enable Bit to 1 in |
1824 | * PAB_AXI_PIO_CTRL Register |
1825 | */ |
1826 | - value = csr_readl(pcie, PAB_AXI_PIO_CTRL); |
1827 | + value = mobiveil_csr_readl(pcie, PAB_AXI_PIO_CTRL); |
1828 | value |= APIO_EN_MASK; |
1829 | - csr_writel(pcie, value, PAB_AXI_PIO_CTRL); |
1830 | + mobiveil_csr_writel(pcie, value, PAB_AXI_PIO_CTRL); |
1831 | |
1832 | /* Enable PCIe PIO master */ |
1833 | - value = csr_readl(pcie, PAB_PEX_PIO_CTRL); |
1834 | + value = mobiveil_csr_readl(pcie, PAB_PEX_PIO_CTRL); |
1835 | value |= 1 << PIO_ENABLE_SHIFT; |
1836 | - csr_writel(pcie, value, PAB_PEX_PIO_CTRL); |
1837 | + mobiveil_csr_writel(pcie, value, PAB_PEX_PIO_CTRL); |
1838 | |
1839 | /* |
1840 | * we'll program one outbound window for config reads and |
1841 | @@ -647,10 +652,10 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) |
1842 | } |
1843 | |
1844 | /* fixup for PCIe class register */ |
1845 | - value = csr_readl(pcie, PAB_INTP_AXI_PIO_CLASS); |
1846 | + value = mobiveil_csr_readl(pcie, PAB_INTP_AXI_PIO_CLASS); |
1847 | value &= 0xff; |
1848 | value |= (PCI_CLASS_BRIDGE_PCI << 16); |
1849 | - csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS); |
1850 | + mobiveil_csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS); |
1851 | |
1852 | /* setup MSI hardware registers */ |
1853 | mobiveil_pcie_enable_msi(pcie); |
1854 | @@ -668,9 +673,9 @@ static void mobiveil_mask_intx_irq(struct irq_data *data) |
1855 | pcie = irq_desc_get_chip_data(desc); |
1856 | mask = 1 << ((data->hwirq + PAB_INTX_START) - 1); |
1857 | raw_spin_lock_irqsave(&pcie->intx_mask_lock, flags); |
1858 | - shifted_val = csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1859 | + shifted_val = mobiveil_csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1860 | shifted_val &= ~mask; |
1861 | - csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); |
1862 | + mobiveil_csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); |
1863 | raw_spin_unlock_irqrestore(&pcie->intx_mask_lock, flags); |
1864 | } |
1865 | |
1866 | @@ -684,9 +689,9 @@ static void mobiveil_unmask_intx_irq(struct irq_data *data) |
1867 | pcie = irq_desc_get_chip_data(desc); |
1868 | mask = 1 << ((data->hwirq + PAB_INTX_START) - 1); |
1869 | raw_spin_lock_irqsave(&pcie->intx_mask_lock, flags); |
1870 | - shifted_val = csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1871 | + shifted_val = mobiveil_csr_readl(pcie, PAB_INTP_AMBA_MISC_ENB); |
1872 | shifted_val |= mask; |
1873 | - csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); |
1874 | + mobiveil_csr_writel(pcie, shifted_val, PAB_INTP_AMBA_MISC_ENB); |
1875 | raw_spin_unlock_irqrestore(&pcie->intx_mask_lock, flags); |
1876 | } |
1877 | |
1878 | diff --git a/drivers/phy/lantiq/phy-lantiq-vrx200-pcie.c b/drivers/phy/lantiq/phy-lantiq-vrx200-pcie.c |
1879 | index 544d64a84cc0..6e457967653e 100644 |
1880 | --- a/drivers/phy/lantiq/phy-lantiq-vrx200-pcie.c |
1881 | +++ b/drivers/phy/lantiq/phy-lantiq-vrx200-pcie.c |
1882 | @@ -323,7 +323,8 @@ static int ltq_vrx200_pcie_phy_power_on(struct phy *phy) |
1883 | goto err_disable_pdi_clk; |
1884 | |
1885 | /* Check if we are in "startup ready" status */ |
1886 | - if (ltq_vrx200_pcie_phy_wait_for_pll(phy) != 0) |
1887 | + ret = ltq_vrx200_pcie_phy_wait_for_pll(phy); |
1888 | + if (ret) |
1889 | goto err_disable_phy_clk; |
1890 | |
1891 | ltq_vrx200_pcie_phy_apply_workarounds(phy); |
1892 | diff --git a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c |
1893 | index 2b97fb1185a0..9ca20c947283 100644 |
1894 | --- a/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c |
1895 | +++ b/drivers/phy/rockchip/phy-rockchip-inno-hdmi.c |
1896 | @@ -603,6 +603,8 @@ static long inno_hdmi_phy_rk3228_clk_round_rate(struct clk_hw *hw, |
1897 | { |
1898 | const struct pre_pll_config *cfg = pre_pll_cfg_table; |
1899 | |
1900 | + rate = (rate / 1000) * 1000; |
1901 | + |
1902 | for (; cfg->pixclock != 0; cfg++) |
1903 | if (cfg->pixclock == rate && !cfg->fracdiv) |
1904 | break; |
1905 | @@ -755,6 +757,8 @@ static long inno_hdmi_phy_rk3328_clk_round_rate(struct clk_hw *hw, |
1906 | { |
1907 | const struct pre_pll_config *cfg = pre_pll_cfg_table; |
1908 | |
1909 | + rate = (rate / 1000) * 1000; |
1910 | + |
1911 | for (; cfg->pixclock != 0; cfg++) |
1912 | if (cfg->pixclock == rate) |
1913 | break; |
1914 | diff --git a/drivers/phy/ti/phy-gmii-sel.c b/drivers/phy/ti/phy-gmii-sel.c |
1915 | index a52c5bb35033..a28bd15297f5 100644 |
1916 | --- a/drivers/phy/ti/phy-gmii-sel.c |
1917 | +++ b/drivers/phy/ti/phy-gmii-sel.c |
1918 | @@ -69,11 +69,11 @@ static int phy_gmii_sel_mode(struct phy *phy, enum phy_mode mode, int submode) |
1919 | break; |
1920 | |
1921 | case PHY_INTERFACE_MODE_RGMII: |
1922 | + case PHY_INTERFACE_MODE_RGMII_RXID: |
1923 | gmii_sel_mode = AM33XX_GMII_SEL_MODE_RGMII; |
1924 | break; |
1925 | |
1926 | case PHY_INTERFACE_MODE_RGMII_ID: |
1927 | - case PHY_INTERFACE_MODE_RGMII_RXID: |
1928 | case PHY_INTERFACE_MODE_RGMII_TXID: |
1929 | gmii_sel_mode = AM33XX_GMII_SEL_MODE_RGMII; |
1930 | rgmii_id = 1; |
1931 | diff --git a/drivers/platform/chrome/wilco_ec/telemetry.c b/drivers/platform/chrome/wilco_ec/telemetry.c |
1932 | index b9d03c33d8dc..1176d543191a 100644 |
1933 | --- a/drivers/platform/chrome/wilco_ec/telemetry.c |
1934 | +++ b/drivers/platform/chrome/wilco_ec/telemetry.c |
1935 | @@ -406,8 +406,8 @@ static int telem_device_remove(struct platform_device *pdev) |
1936 | struct telem_device_data *dev_data = platform_get_drvdata(pdev); |
1937 | |
1938 | cdev_device_del(&dev_data->cdev, &dev_data->dev); |
1939 | - put_device(&dev_data->dev); |
1940 | ida_simple_remove(&telem_ida, MINOR(dev_data->dev.devt)); |
1941 | + put_device(&dev_data->dev); |
1942 | |
1943 | return 0; |
1944 | } |
1945 | diff --git a/drivers/power/supply/bd70528-charger.c b/drivers/power/supply/bd70528-charger.c |
1946 | index 1bb32b7226d7..b8e1ec106627 100644 |
1947 | --- a/drivers/power/supply/bd70528-charger.c |
1948 | +++ b/drivers/power/supply/bd70528-charger.c |
1949 | @@ -741,3 +741,4 @@ module_platform_driver(bd70528_power); |
1950 | MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); |
1951 | MODULE_DESCRIPTION("BD70528 power-supply driver"); |
1952 | MODULE_LICENSE("GPL"); |
1953 | +MODULE_ALIAS("platform:bd70528-power"); |
1954 | diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c |
1955 | index 6f5840a1a82d..05273725a9ff 100644 |
1956 | --- a/drivers/pwm/pwm-sun4i.c |
1957 | +++ b/drivers/pwm/pwm-sun4i.c |
1958 | @@ -137,10 +137,10 @@ static void sun4i_pwm_get_state(struct pwm_chip *chip, |
1959 | |
1960 | val = sun4i_pwm_readl(sun4i_pwm, PWM_CH_PRD(pwm->hwpwm)); |
1961 | |
1962 | - tmp = prescaler * NSEC_PER_SEC * PWM_REG_DTY(val); |
1963 | + tmp = (u64)prescaler * NSEC_PER_SEC * PWM_REG_DTY(val); |
1964 | state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate); |
1965 | |
1966 | - tmp = prescaler * NSEC_PER_SEC * PWM_REG_PRD(val); |
1967 | + tmp = (u64)prescaler * NSEC_PER_SEC * PWM_REG_PRD(val); |
1968 | state->period = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate); |
1969 | } |
1970 | |
1971 | diff --git a/drivers/regulator/bd70528-regulator.c b/drivers/regulator/bd70528-regulator.c |
1972 | index 6041839ec38c..5bf8a2dc5fe7 100644 |
1973 | --- a/drivers/regulator/bd70528-regulator.c |
1974 | +++ b/drivers/regulator/bd70528-regulator.c |
1975 | @@ -285,3 +285,4 @@ module_platform_driver(bd70528_regulator); |
1976 | MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); |
1977 | MODULE_DESCRIPTION("BD70528 voltage regulator driver"); |
1978 | MODULE_LICENSE("GPL"); |
1979 | +MODULE_ALIAS("platform:bd70528-pmic"); |
1980 | diff --git a/drivers/rtc/rtc-bd70528.c b/drivers/rtc/rtc-bd70528.c |
1981 | index ddfef4d43bab..627037aa66a8 100644 |
1982 | --- a/drivers/rtc/rtc-bd70528.c |
1983 | +++ b/drivers/rtc/rtc-bd70528.c |
1984 | @@ -491,4 +491,4 @@ module_platform_driver(bd70528_rtc); |
1985 | MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); |
1986 | MODULE_DESCRIPTION("BD70528 RTC driver"); |
1987 | MODULE_LICENSE("GPL"); |
1988 | -MODULE_ALIAS("platofrm:bd70528-rtc"); |
1989 | +MODULE_ALIAS("platform:bd70528-rtc"); |
1990 | diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c |
1991 | index 9de3d46b3253..e17fac20127e 100644 |
1992 | --- a/drivers/s390/crypto/pkey_api.c |
1993 | +++ b/drivers/s390/crypto/pkey_api.c |
1994 | @@ -740,8 +740,10 @@ static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns) |
1995 | kapqns = kmalloc(nbytes, GFP_KERNEL); |
1996 | if (!kapqns) |
1997 | return ERR_PTR(-ENOMEM); |
1998 | - if (copy_from_user(kapqns, uapqns, nbytes)) |
1999 | + if (copy_from_user(kapqns, uapqns, nbytes)) { |
2000 | + kfree(kapqns); |
2001 | return ERR_PTR(-EFAULT); |
2002 | + } |
2003 | } |
2004 | |
2005 | return kapqns; |
2006 | diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h |
2007 | index 65e31df37b1f..820f2c29376c 100644 |
2008 | --- a/drivers/s390/net/qeth_core.h |
2009 | +++ b/drivers/s390/net/qeth_core.h |
2010 | @@ -620,6 +620,7 @@ struct qeth_ipato { |
2011 | |
2012 | struct qeth_channel { |
2013 | struct ccw_device *ccwdev; |
2014 | + struct qeth_cmd_buffer *active_cmd; |
2015 | enum qeth_channel_states state; |
2016 | atomic_t irq_pending; |
2017 | }; |
2018 | @@ -1024,6 +1025,8 @@ int qeth_do_run_thread(struct qeth_card *, unsigned long); |
2019 | void qeth_clear_thread_start_bit(struct qeth_card *, unsigned long); |
2020 | void qeth_clear_thread_running_bit(struct qeth_card *, unsigned long); |
2021 | int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok); |
2022 | +int qeth_stop_channel(struct qeth_channel *channel); |
2023 | + |
2024 | void qeth_print_status_message(struct qeth_card *); |
2025 | int qeth_init_qdio_queues(struct qeth_card *); |
2026 | int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, |
2027 | diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c |
2028 | index 5be4d800e4ba..23852888eb2c 100644 |
2029 | --- a/drivers/s390/net/qeth_core_main.c |
2030 | +++ b/drivers/s390/net/qeth_core_main.c |
2031 | @@ -515,7 +515,9 @@ static int __qeth_issue_next_read(struct qeth_card *card) |
2032 | |
2033 | QETH_CARD_TEXT(card, 6, "noirqpnd"); |
2034 | rc = ccw_device_start(channel->ccwdev, ccw, (addr_t) iob, 0, 0); |
2035 | - if (rc) { |
2036 | + if (!rc) { |
2037 | + channel->active_cmd = iob; |
2038 | + } else { |
2039 | QETH_DBF_MESSAGE(2, "error %i on device %x when starting next read ccw!\n", |
2040 | rc, CARD_DEVID(card)); |
2041 | atomic_set(&channel->irq_pending, 0); |
2042 | @@ -986,8 +988,21 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, |
2043 | QETH_CARD_TEXT(card, 5, "data"); |
2044 | } |
2045 | |
2046 | - if (qeth_intparm_is_iob(intparm)) |
2047 | - iob = (struct qeth_cmd_buffer *) __va((addr_t)intparm); |
2048 | + if (intparm == 0) { |
2049 | + QETH_CARD_TEXT(card, 5, "irqunsol"); |
2050 | + } else if ((addr_t)intparm != (addr_t)channel->active_cmd) { |
2051 | + QETH_CARD_TEXT(card, 5, "irqunexp"); |
2052 | + |
2053 | + dev_err(&cdev->dev, |
2054 | + "Received IRQ with intparm %lx, expected %px\n", |
2055 | + intparm, channel->active_cmd); |
2056 | + if (channel->active_cmd) |
2057 | + qeth_cancel_cmd(channel->active_cmd, -EIO); |
2058 | + } else { |
2059 | + iob = (struct qeth_cmd_buffer *) (addr_t)intparm; |
2060 | + } |
2061 | + |
2062 | + channel->active_cmd = NULL; |
2063 | |
2064 | rc = qeth_check_irb_error(card, cdev, irb); |
2065 | if (rc) { |
2066 | @@ -1007,15 +1022,10 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, |
2067 | if (irb->scsw.cmd.fctl & (SCSW_FCTL_HALT_FUNC)) |
2068 | channel->state = CH_STATE_HALTED; |
2069 | |
2070 | - if (intparm == QETH_CLEAR_CHANNEL_PARM) { |
2071 | - QETH_CARD_TEXT(card, 6, "clrchpar"); |
2072 | - /* we don't have to handle this further */ |
2073 | - intparm = 0; |
2074 | - } |
2075 | - if (intparm == QETH_HALT_CHANNEL_PARM) { |
2076 | - QETH_CARD_TEXT(card, 6, "hltchpar"); |
2077 | - /* we don't have to handle this further */ |
2078 | - intparm = 0; |
2079 | + if (iob && (irb->scsw.cmd.fctl & (SCSW_FCTL_CLEAR_FUNC | |
2080 | + SCSW_FCTL_HALT_FUNC))) { |
2081 | + qeth_cancel_cmd(iob, -ECANCELED); |
2082 | + iob = NULL; |
2083 | } |
2084 | |
2085 | cstat = irb->scsw.cmd.cstat; |
2086 | @@ -1408,7 +1418,7 @@ static int qeth_clear_channel(struct qeth_card *card, |
2087 | |
2088 | QETH_CARD_TEXT(card, 3, "clearch"); |
2089 | spin_lock_irq(get_ccwdev_lock(channel->ccwdev)); |
2090 | - rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM); |
2091 | + rc = ccw_device_clear(channel->ccwdev, (addr_t)channel->active_cmd); |
2092 | spin_unlock_irq(get_ccwdev_lock(channel->ccwdev)); |
2093 | |
2094 | if (rc) |
2095 | @@ -1430,7 +1440,7 @@ static int qeth_halt_channel(struct qeth_card *card, |
2096 | |
2097 | QETH_CARD_TEXT(card, 3, "haltch"); |
2098 | spin_lock_irq(get_ccwdev_lock(channel->ccwdev)); |
2099 | - rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM); |
2100 | + rc = ccw_device_halt(channel->ccwdev, (addr_t)channel->active_cmd); |
2101 | spin_unlock_irq(get_ccwdev_lock(channel->ccwdev)); |
2102 | |
2103 | if (rc) |
2104 | @@ -1444,6 +1454,25 @@ static int qeth_halt_channel(struct qeth_card *card, |
2105 | return 0; |
2106 | } |
2107 | |
2108 | +int qeth_stop_channel(struct qeth_channel *channel) |
2109 | +{ |
2110 | + struct ccw_device *cdev = channel->ccwdev; |
2111 | + int rc; |
2112 | + |
2113 | + rc = ccw_device_set_offline(cdev); |
2114 | + |
2115 | + spin_lock_irq(get_ccwdev_lock(cdev)); |
2116 | + if (channel->active_cmd) { |
2117 | + dev_err(&cdev->dev, "Stopped channel while cmd %px was still active\n", |
2118 | + channel->active_cmd); |
2119 | + channel->active_cmd = NULL; |
2120 | + } |
2121 | + spin_unlock_irq(get_ccwdev_lock(cdev)); |
2122 | + |
2123 | + return rc; |
2124 | +} |
2125 | +EXPORT_SYMBOL_GPL(qeth_stop_channel); |
2126 | + |
2127 | static int qeth_halt_channels(struct qeth_card *card) |
2128 | { |
2129 | int rc1 = 0, rc2 = 0, rc3 = 0; |
2130 | @@ -1747,6 +1776,8 @@ static int qeth_send_control_data(struct qeth_card *card, |
2131 | spin_lock_irq(get_ccwdev_lock(channel->ccwdev)); |
2132 | rc = ccw_device_start_timeout(channel->ccwdev, __ccw_from_cmd(iob), |
2133 | (addr_t) iob, 0, 0, timeout); |
2134 | + if (!rc) |
2135 | + channel->active_cmd = iob; |
2136 | spin_unlock_irq(get_ccwdev_lock(channel->ccwdev)); |
2137 | if (rc) { |
2138 | QETH_DBF_MESSAGE(2, "qeth_send_control_data on device %x: ccw_device_start rc = %i\n", |
2139 | @@ -4625,12 +4656,12 @@ EXPORT_SYMBOL_GPL(qeth_vm_request_mac); |
2140 | |
2141 | static void qeth_determine_capabilities(struct qeth_card *card) |
2142 | { |
2143 | + struct qeth_channel *channel = &card->data; |
2144 | + struct ccw_device *ddev = channel->ccwdev; |
2145 | int rc; |
2146 | - struct ccw_device *ddev; |
2147 | int ddev_offline = 0; |
2148 | |
2149 | QETH_CARD_TEXT(card, 2, "detcapab"); |
2150 | - ddev = CARD_DDEV(card); |
2151 | if (!ddev->online) { |
2152 | ddev_offline = 1; |
2153 | rc = ccw_device_set_online(ddev); |
2154 | @@ -4669,7 +4700,7 @@ static void qeth_determine_capabilities(struct qeth_card *card) |
2155 | |
2156 | out_offline: |
2157 | if (ddev_offline == 1) |
2158 | - ccw_device_set_offline(ddev); |
2159 | + qeth_stop_channel(channel); |
2160 | out: |
2161 | return; |
2162 | } |
2163 | @@ -4870,9 +4901,9 @@ retry: |
2164 | QETH_DBF_MESSAGE(2, "Retrying to do IDX activates on device %x.\n", |
2165 | CARD_DEVID(card)); |
2166 | rc = qeth_qdio_clear_card(card, !IS_IQD(card)); |
2167 | - ccw_device_set_offline(CARD_DDEV(card)); |
2168 | - ccw_device_set_offline(CARD_WDEV(card)); |
2169 | - ccw_device_set_offline(CARD_RDEV(card)); |
2170 | + qeth_stop_channel(&card->data); |
2171 | + qeth_stop_channel(&card->write); |
2172 | + qeth_stop_channel(&card->read); |
2173 | qdio_free(CARD_DDEV(card)); |
2174 | rc = ccw_device_set_online(CARD_RDEV(card)); |
2175 | if (rc) |
2176 | diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h |
2177 | index b7c17b5c823b..65038539b324 100644 |
2178 | --- a/drivers/s390/net/qeth_core_mpc.h |
2179 | +++ b/drivers/s390/net/qeth_core_mpc.h |
2180 | @@ -28,20 +28,6 @@ extern unsigned char IPA_PDU_HEADER[]; |
2181 | #define QETH_TIMEOUT (10 * HZ) |
2182 | #define QETH_IPA_TIMEOUT (45 * HZ) |
2183 | |
2184 | -#define QETH_CLEAR_CHANNEL_PARM -10 |
2185 | -#define QETH_HALT_CHANNEL_PARM -11 |
2186 | - |
2187 | -static inline bool qeth_intparm_is_iob(unsigned long intparm) |
2188 | -{ |
2189 | - switch (intparm) { |
2190 | - case QETH_CLEAR_CHANNEL_PARM: |
2191 | - case QETH_HALT_CHANNEL_PARM: |
2192 | - case 0: |
2193 | - return false; |
2194 | - } |
2195 | - return true; |
2196 | -} |
2197 | - |
2198 | /*****************************************************************************/ |
2199 | /* IP Assist related definitions */ |
2200 | /*****************************************************************************/ |
2201 | diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c |
2202 | index 11e3292c0adf..59e220749ad1 100644 |
2203 | --- a/drivers/s390/net/qeth_l2_main.c |
2204 | +++ b/drivers/s390/net/qeth_l2_main.c |
2205 | @@ -877,9 +877,9 @@ static int qeth_l2_set_online(struct ccwgroup_device *gdev) |
2206 | |
2207 | out_remove: |
2208 | qeth_l2_stop_card(card); |
2209 | - ccw_device_set_offline(CARD_DDEV(card)); |
2210 | - ccw_device_set_offline(CARD_WDEV(card)); |
2211 | - ccw_device_set_offline(CARD_RDEV(card)); |
2212 | + qeth_stop_channel(&card->data); |
2213 | + qeth_stop_channel(&card->write); |
2214 | + qeth_stop_channel(&card->read); |
2215 | qdio_free(CARD_DDEV(card)); |
2216 | |
2217 | mutex_unlock(&card->conf_mutex); |
2218 | @@ -910,9 +910,9 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev, |
2219 | rtnl_unlock(); |
2220 | |
2221 | qeth_l2_stop_card(card); |
2222 | - rc = ccw_device_set_offline(CARD_DDEV(card)); |
2223 | - rc2 = ccw_device_set_offline(CARD_WDEV(card)); |
2224 | - rc3 = ccw_device_set_offline(CARD_RDEV(card)); |
2225 | + rc = qeth_stop_channel(&card->data); |
2226 | + rc2 = qeth_stop_channel(&card->write); |
2227 | + rc3 = qeth_stop_channel(&card->read); |
2228 | if (!rc) |
2229 | rc = (rc2) ? rc2 : rc3; |
2230 | if (rc) |
2231 | diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c |
2232 | index 5152970a9aa4..a1c23e998f97 100644 |
2233 | --- a/drivers/s390/net/qeth_l3_main.c |
2234 | +++ b/drivers/s390/net/qeth_l3_main.c |
2235 | @@ -2383,9 +2383,9 @@ static int qeth_l3_set_online(struct ccwgroup_device *gdev) |
2236 | return 0; |
2237 | out_remove: |
2238 | qeth_l3_stop_card(card); |
2239 | - ccw_device_set_offline(CARD_DDEV(card)); |
2240 | - ccw_device_set_offline(CARD_WDEV(card)); |
2241 | - ccw_device_set_offline(CARD_RDEV(card)); |
2242 | + qeth_stop_channel(&card->data); |
2243 | + qeth_stop_channel(&card->write); |
2244 | + qeth_stop_channel(&card->read); |
2245 | qdio_free(CARD_DDEV(card)); |
2246 | |
2247 | mutex_unlock(&card->conf_mutex); |
2248 | @@ -2421,9 +2421,10 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev, |
2249 | call_netdevice_notifiers(NETDEV_REBOOT, card->dev); |
2250 | rtnl_unlock(); |
2251 | } |
2252 | - rc = ccw_device_set_offline(CARD_DDEV(card)); |
2253 | - rc2 = ccw_device_set_offline(CARD_WDEV(card)); |
2254 | - rc3 = ccw_device_set_offline(CARD_RDEV(card)); |
2255 | + |
2256 | + rc = qeth_stop_channel(&card->data); |
2257 | + rc2 = qeth_stop_channel(&card->write); |
2258 | + rc3 = qeth_stop_channel(&card->read); |
2259 | if (!rc) |
2260 | rc = (rc2) ? rc2 : rc3; |
2261 | if (rc) |
2262 | diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c |
2263 | index 25a6a25b17a2..1e38bb967871 100644 |
2264 | --- a/drivers/scsi/ufs/ufshcd.c |
2265 | +++ b/drivers/scsi/ufs/ufshcd.c |
2266 | @@ -6779,23 +6779,13 @@ static void ufshcd_init_desc_sizes(struct ufs_hba *hba) |
2267 | &hba->desc_size.geom_desc); |
2268 | if (err) |
2269 | hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; |
2270 | + |
2271 | err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_HEALTH, 0, |
2272 | &hba->desc_size.hlth_desc); |
2273 | if (err) |
2274 | hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; |
2275 | } |
2276 | |
2277 | -static void ufshcd_def_desc_sizes(struct ufs_hba *hba) |
2278 | -{ |
2279 | - hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE; |
2280 | - hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE; |
2281 | - hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE; |
2282 | - hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE; |
2283 | - hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE; |
2284 | - hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; |
2285 | - hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; |
2286 | -} |
2287 | - |
2288 | static struct ufs_ref_clk ufs_ref_clk_freqs[] = { |
2289 | {19200000, REF_CLK_FREQ_19_2_MHZ}, |
2290 | {26000000, REF_CLK_FREQ_26_MHZ}, |
2291 | @@ -8283,9 +8273,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) |
2292 | hba->mmio_base = mmio_base; |
2293 | hba->irq = irq; |
2294 | |
2295 | - /* Set descriptor lengths to specification defaults */ |
2296 | - ufshcd_def_desc_sizes(hba); |
2297 | - |
2298 | err = ufshcd_hba_init(hba); |
2299 | if (err) |
2300 | goto out_error; |
2301 | diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c |
2302 | index 48f7ac238861..f3d8d53ab84d 100644 |
2303 | --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c |
2304 | +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c |
2305 | @@ -97,13 +97,13 @@ static ssize_t snoop_file_read(struct file *file, char __user *buffer, |
2306 | return ret ? ret : copied; |
2307 | } |
2308 | |
2309 | -static unsigned int snoop_file_poll(struct file *file, |
2310 | +static __poll_t snoop_file_poll(struct file *file, |
2311 | struct poll_table_struct *pt) |
2312 | { |
2313 | struct aspeed_lpc_snoop_channel *chan = snoop_file_to_chan(file); |
2314 | |
2315 | poll_wait(file, &chan->wq, pt); |
2316 | - return !kfifo_is_empty(&chan->fifo) ? POLLIN : 0; |
2317 | + return !kfifo_is_empty(&chan->fifo) ? EPOLLIN : 0; |
2318 | } |
2319 | |
2320 | static const struct file_operations snoop_fops = { |
2321 | diff --git a/drivers/soc/qcom/llcc-slice.c b/drivers/soc/qcom/llcc-slice.c |
2322 | index 9090ea12eaf3..4a6111635f82 100644 |
2323 | --- a/drivers/soc/qcom/llcc-slice.c |
2324 | +++ b/drivers/soc/qcom/llcc-slice.c |
2325 | @@ -48,7 +48,7 @@ |
2326 | |
2327 | static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER; |
2328 | |
2329 | -static const struct regmap_config llcc_regmap_config = { |
2330 | +static struct regmap_config llcc_regmap_config = { |
2331 | .reg_bits = 32, |
2332 | .reg_stride = 4, |
2333 | .val_bits = 32, |
2334 | @@ -323,6 +323,7 @@ static struct regmap *qcom_llcc_init_mmio(struct platform_device *pdev, |
2335 | if (IS_ERR(base)) |
2336 | return ERR_CAST(base); |
2337 | |
2338 | + llcc_regmap_config.name = name; |
2339 | return devm_regmap_init_mmio(&pdev->dev, base, &llcc_regmap_config); |
2340 | } |
2341 | |
2342 | diff --git a/drivers/soc/renesas/renesas-soc.c b/drivers/soc/renesas/renesas-soc.c |
2343 | index 3299cf5365f3..6651755e9f20 100644 |
2344 | --- a/drivers/soc/renesas/renesas-soc.c |
2345 | +++ b/drivers/soc/renesas/renesas-soc.c |
2346 | @@ -326,7 +326,7 @@ static int __init renesas_soc_init(void) |
2347 | if (np) { |
2348 | chipid = of_iomap(np, 0); |
2349 | of_node_put(np); |
2350 | - } else if (soc->id) { |
2351 | + } else if (soc->id && family->reg) { |
2352 | chipid = ioremap(family->reg, 4); |
2353 | } |
2354 | if (chipid) { |
2355 | diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c |
2356 | index 9f9c1c677cf4..0447afa970f5 100644 |
2357 | --- a/drivers/soc/tegra/pmc.c |
2358 | +++ b/drivers/soc/tegra/pmc.c |
2359 | @@ -1899,6 +1899,20 @@ static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq, |
2360 | event->id, |
2361 | &pmc->irq, pmc); |
2362 | |
2363 | + /* |
2364 | + * GPIOs don't have an equivalent interrupt in the |
2365 | + * parent controller (GIC). However some code, such |
2366 | + * as the one in irq_get_irqchip_state(), require a |
2367 | + * valid IRQ chip to be set. Make sure that's the |
2368 | + * case by passing NULL here, which will install a |
2369 | + * dummy IRQ chip for the interrupt in the parent |
2370 | + * domain. |
2371 | + */ |
2372 | + if (domain->parent) |
2373 | + irq_domain_set_hwirq_and_chip(domain->parent, |
2374 | + virq, 0, NULL, |
2375 | + NULL); |
2376 | + |
2377 | break; |
2378 | } |
2379 | } |
2380 | @@ -1908,10 +1922,22 @@ static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq, |
2381 | * dummy hardware IRQ number. This is used in the ->irq_set_type() |
2382 | * and ->irq_set_wake() callbacks to return early for these IRQs. |
2383 | */ |
2384 | - if (i == soc->num_wake_events) |
2385 | + if (i == soc->num_wake_events) { |
2386 | err = irq_domain_set_hwirq_and_chip(domain, virq, ULONG_MAX, |
2387 | &pmc->irq, pmc); |
2388 | |
2389 | + /* |
2390 | + * Interrupts without a wake event don't have a corresponding |
2391 | + * interrupt in the parent controller (GIC). Pass NULL for the |
2392 | + * chip here, which causes a dummy IRQ chip to be installed |
2393 | + * for the interrupt in the parent domain, to make this |
2394 | + * explicit. |
2395 | + */ |
2396 | + if (domain->parent) |
2397 | + irq_domain_set_hwirq_and_chip(domain->parent, virq, 0, |
2398 | + NULL, NULL); |
2399 | + } |
2400 | + |
2401 | return err; |
2402 | } |
2403 | |
2404 | diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c |
2405 | index 13b0269a0abc..cf2367ba08d6 100644 |
2406 | --- a/drivers/tee/optee/call.c |
2407 | +++ b/drivers/tee/optee/call.c |
2408 | @@ -554,6 +554,13 @@ static int check_mem_type(unsigned long start, size_t num_pages) |
2409 | struct mm_struct *mm = current->mm; |
2410 | int rc; |
2411 | |
2412 | + /* |
2413 | + * Allow kernel address to register with OP-TEE as kernel |
2414 | + * pages are configured as normal memory only. |
2415 | + */ |
2416 | + if (virt_addr_valid(start)) |
2417 | + return 0; |
2418 | + |
2419 | down_read(&mm->mmap_sem); |
2420 | rc = __check_mem_type(find_vma(mm, start), |
2421 | start + num_pages * PAGE_SIZE); |
2422 | diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c |
2423 | index 1854a3db7345..b830e0a87fba 100644 |
2424 | --- a/drivers/tee/optee/core.c |
2425 | +++ b/drivers/tee/optee/core.c |
2426 | @@ -643,11 +643,6 @@ static struct optee *optee_probe(struct device_node *np) |
2427 | if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) |
2428 | pr_info("dynamic shared memory is enabled\n"); |
2429 | |
2430 | - rc = optee_enumerate_devices(); |
2431 | - if (rc) |
2432 | - goto err; |
2433 | - |
2434 | - pr_info("initialized driver\n"); |
2435 | return optee; |
2436 | err: |
2437 | if (optee) { |
2438 | @@ -702,9 +697,10 @@ static struct optee *optee_svc; |
2439 | |
2440 | static int __init optee_driver_init(void) |
2441 | { |
2442 | - struct device_node *fw_np; |
2443 | - struct device_node *np; |
2444 | - struct optee *optee; |
2445 | + struct device_node *fw_np = NULL; |
2446 | + struct device_node *np = NULL; |
2447 | + struct optee *optee = NULL; |
2448 | + int rc = 0; |
2449 | |
2450 | /* Node is supposed to be below /firmware */ |
2451 | fw_np = of_find_node_by_name(NULL, "firmware"); |
2452 | @@ -723,6 +719,14 @@ static int __init optee_driver_init(void) |
2453 | if (IS_ERR(optee)) |
2454 | return PTR_ERR(optee); |
2455 | |
2456 | + rc = optee_enumerate_devices(); |
2457 | + if (rc) { |
2458 | + optee_remove(optee); |
2459 | + return rc; |
2460 | + } |
2461 | + |
2462 | + pr_info("initialized driver\n"); |
2463 | + |
2464 | optee_svc = optee; |
2465 | |
2466 | return 0; |
2467 | diff --git a/drivers/tee/optee/shm_pool.c b/drivers/tee/optee/shm_pool.c |
2468 | index de1d9b8fad90..d767eebf30bd 100644 |
2469 | --- a/drivers/tee/optee/shm_pool.c |
2470 | +++ b/drivers/tee/optee/shm_pool.c |
2471 | @@ -17,6 +17,7 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, |
2472 | { |
2473 | unsigned int order = get_order(size); |
2474 | struct page *page; |
2475 | + int rc = 0; |
2476 | |
2477 | page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); |
2478 | if (!page) |
2479 | @@ -26,12 +27,34 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, |
2480 | shm->paddr = page_to_phys(page); |
2481 | shm->size = PAGE_SIZE << order; |
2482 | |
2483 | - return 0; |
2484 | + if (shm->flags & TEE_SHM_DMA_BUF) { |
2485 | + unsigned int nr_pages = 1 << order, i; |
2486 | + struct page **pages; |
2487 | + |
2488 | + pages = kcalloc(nr_pages, sizeof(pages), GFP_KERNEL); |
2489 | + if (!pages) |
2490 | + return -ENOMEM; |
2491 | + |
2492 | + for (i = 0; i < nr_pages; i++) { |
2493 | + pages[i] = page; |
2494 | + page++; |
2495 | + } |
2496 | + |
2497 | + shm->flags |= TEE_SHM_REGISTER; |
2498 | + rc = optee_shm_register(shm->ctx, shm, pages, nr_pages, |
2499 | + (unsigned long)shm->kaddr); |
2500 | + kfree(pages); |
2501 | + } |
2502 | + |
2503 | + return rc; |
2504 | } |
2505 | |
2506 | static void pool_op_free(struct tee_shm_pool_mgr *poolm, |
2507 | struct tee_shm *shm) |
2508 | { |
2509 | + if (shm->flags & TEE_SHM_DMA_BUF) |
2510 | + optee_shm_unregister(shm->ctx, shm); |
2511 | + |
2512 | free_pages((unsigned long)shm->kaddr, get_order(shm->size)); |
2513 | shm->kaddr = NULL; |
2514 | } |
2515 | diff --git a/drivers/watchdog/sprd_wdt.c b/drivers/watchdog/sprd_wdt.c |
2516 | index 0bb17b046140..65cb55f3916f 100644 |
2517 | --- a/drivers/watchdog/sprd_wdt.c |
2518 | +++ b/drivers/watchdog/sprd_wdt.c |
2519 | @@ -327,10 +327,9 @@ static int sprd_wdt_probe(struct platform_device *pdev) |
2520 | |
2521 | static int __maybe_unused sprd_wdt_pm_suspend(struct device *dev) |
2522 | { |
2523 | - struct watchdog_device *wdd = dev_get_drvdata(dev); |
2524 | struct sprd_wdt *wdt = dev_get_drvdata(dev); |
2525 | |
2526 | - if (watchdog_active(wdd)) |
2527 | + if (watchdog_active(&wdt->wdd)) |
2528 | sprd_wdt_stop(&wdt->wdd); |
2529 | sprd_wdt_disable(wdt); |
2530 | |
2531 | @@ -339,7 +338,6 @@ static int __maybe_unused sprd_wdt_pm_suspend(struct device *dev) |
2532 | |
2533 | static int __maybe_unused sprd_wdt_pm_resume(struct device *dev) |
2534 | { |
2535 | - struct watchdog_device *wdd = dev_get_drvdata(dev); |
2536 | struct sprd_wdt *wdt = dev_get_drvdata(dev); |
2537 | int ret; |
2538 | |
2539 | @@ -347,7 +345,7 @@ static int __maybe_unused sprd_wdt_pm_resume(struct device *dev) |
2540 | if (ret) |
2541 | return ret; |
2542 | |
2543 | - if (watchdog_active(wdd)) { |
2544 | + if (watchdog_active(&wdt->wdd)) { |
2545 | ret = sprd_wdt_start(&wdt->wdd); |
2546 | if (ret) { |
2547 | sprd_wdt_disable(wdt); |
2548 | diff --git a/fs/afs/dir_edit.c b/fs/afs/dir_edit.c |
2549 | index d4fbe5f85f1b..b108528bf010 100644 |
2550 | --- a/fs/afs/dir_edit.c |
2551 | +++ b/fs/afs/dir_edit.c |
2552 | @@ -68,13 +68,11 @@ static int afs_find_contig_bits(union afs_xdr_dir_block *block, unsigned int nr_ |
2553 | static void afs_set_contig_bits(union afs_xdr_dir_block *block, |
2554 | int bit, unsigned int nr_slots) |
2555 | { |
2556 | - u64 mask, before, after; |
2557 | + u64 mask; |
2558 | |
2559 | mask = (1 << nr_slots) - 1; |
2560 | mask <<= bit; |
2561 | |
2562 | - before = *(u64 *)block->hdr.bitmap; |
2563 | - |
2564 | block->hdr.bitmap[0] |= (u8)(mask >> 0 * 8); |
2565 | block->hdr.bitmap[1] |= (u8)(mask >> 1 * 8); |
2566 | block->hdr.bitmap[2] |= (u8)(mask >> 2 * 8); |
2567 | @@ -83,8 +81,6 @@ static void afs_set_contig_bits(union afs_xdr_dir_block *block, |
2568 | block->hdr.bitmap[5] |= (u8)(mask >> 5 * 8); |
2569 | block->hdr.bitmap[6] |= (u8)(mask >> 6 * 8); |
2570 | block->hdr.bitmap[7] |= (u8)(mask >> 7 * 8); |
2571 | - |
2572 | - after = *(u64 *)block->hdr.bitmap; |
2573 | } |
2574 | |
2575 | /* |
2576 | @@ -93,13 +89,11 @@ static void afs_set_contig_bits(union afs_xdr_dir_block *block, |
2577 | static void afs_clear_contig_bits(union afs_xdr_dir_block *block, |
2578 | int bit, unsigned int nr_slots) |
2579 | { |
2580 | - u64 mask, before, after; |
2581 | + u64 mask; |
2582 | |
2583 | mask = (1 << nr_slots) - 1; |
2584 | mask <<= bit; |
2585 | |
2586 | - before = *(u64 *)block->hdr.bitmap; |
2587 | - |
2588 | block->hdr.bitmap[0] &= ~(u8)(mask >> 0 * 8); |
2589 | block->hdr.bitmap[1] &= ~(u8)(mask >> 1 * 8); |
2590 | block->hdr.bitmap[2] &= ~(u8)(mask >> 2 * 8); |
2591 | @@ -108,8 +102,6 @@ static void afs_clear_contig_bits(union afs_xdr_dir_block *block, |
2592 | block->hdr.bitmap[5] &= ~(u8)(mask >> 5 * 8); |
2593 | block->hdr.bitmap[6] &= ~(u8)(mask >> 6 * 8); |
2594 | block->hdr.bitmap[7] &= ~(u8)(mask >> 7 * 8); |
2595 | - |
2596 | - after = *(u64 *)block->hdr.bitmap; |
2597 | } |
2598 | |
2599 | /* |
2600 | diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig |
2601 | index c4b1a89b8845..f2f81561ebb6 100644 |
2602 | --- a/fs/nfsd/Kconfig |
2603 | +++ b/fs/nfsd/Kconfig |
2604 | @@ -73,6 +73,7 @@ config NFSD_V4 |
2605 | select NFSD_V3 |
2606 | select FS_POSIX_ACL |
2607 | select SUNRPC_GSS |
2608 | + select CRYPTO_MD5 |
2609 | select CRYPTO_SHA256 |
2610 | select GRACE_PERIOD |
2611 | help |
2612 | diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c |
2613 | index cd6c7210a373..c7de17deeae6 100644 |
2614 | --- a/fs/xfs/xfs_quotaops.c |
2615 | +++ b/fs/xfs/xfs_quotaops.c |
2616 | @@ -201,6 +201,9 @@ xfs_fs_rm_xquota( |
2617 | if (XFS_IS_QUOTA_ON(mp)) |
2618 | return -EINVAL; |
2619 | |
2620 | + if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) |
2621 | + return -EINVAL; |
2622 | + |
2623 | if (uflags & FS_USER_QUOTA) |
2624 | flags |= XFS_DQ_USER; |
2625 | if (uflags & FS_GROUP_QUOTA) |
2626 | diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h |
2627 | index d1a5d5df02f5..08b25c02b5a1 100644 |
2628 | --- a/include/linux/mmc/sdio_ids.h |
2629 | +++ b/include/linux/mmc/sdio_ids.h |
2630 | @@ -71,6 +71,8 @@ |
2631 | |
2632 | #define SDIO_VENDOR_ID_TI 0x0097 |
2633 | #define SDIO_DEVICE_ID_TI_WL1271 0x4076 |
2634 | +#define SDIO_VENDOR_ID_TI_WL1251 0x104c |
2635 | +#define SDIO_DEVICE_ID_TI_WL1251 0x9066 |
2636 | |
2637 | #define SDIO_VENDOR_ID_STE 0x0020 |
2638 | #define SDIO_DEVICE_ID_STE_CW1200 0x2280 |
2639 | diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c |
2640 | index 3867864cdc2f..3d3d61b5985b 100644 |
2641 | --- a/kernel/bpf/devmap.c |
2642 | +++ b/kernel/bpf/devmap.c |
2643 | @@ -74,7 +74,7 @@ struct bpf_dtab_netdev { |
2644 | |
2645 | struct bpf_dtab { |
2646 | struct bpf_map map; |
2647 | - struct bpf_dtab_netdev **netdev_map; |
2648 | + struct bpf_dtab_netdev **netdev_map; /* DEVMAP type only */ |
2649 | struct list_head __percpu *flush_list; |
2650 | struct list_head list; |
2651 | |
2652 | @@ -101,6 +101,12 @@ static struct hlist_head *dev_map_create_hash(unsigned int entries) |
2653 | return hash; |
2654 | } |
2655 | |
2656 | +static inline struct hlist_head *dev_map_index_hash(struct bpf_dtab *dtab, |
2657 | + int idx) |
2658 | +{ |
2659 | + return &dtab->dev_index_head[idx & (dtab->n_buckets - 1)]; |
2660 | +} |
2661 | + |
2662 | static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr) |
2663 | { |
2664 | int err, cpu; |
2665 | @@ -120,8 +126,7 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr) |
2666 | bpf_map_init_from_attr(&dtab->map, attr); |
2667 | |
2668 | /* make sure page count doesn't overflow */ |
2669 | - cost = (u64) dtab->map.max_entries * sizeof(struct bpf_dtab_netdev *); |
2670 | - cost += sizeof(struct list_head) * num_possible_cpus(); |
2671 | + cost = (u64) sizeof(struct list_head) * num_possible_cpus(); |
2672 | |
2673 | if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) { |
2674 | dtab->n_buckets = roundup_pow_of_two(dtab->map.max_entries); |
2675 | @@ -129,6 +134,8 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr) |
2676 | if (!dtab->n_buckets) /* Overflow check */ |
2677 | return -EINVAL; |
2678 | cost += (u64) sizeof(struct hlist_head) * dtab->n_buckets; |
2679 | + } else { |
2680 | + cost += (u64) dtab->map.max_entries * sizeof(struct bpf_dtab_netdev *); |
2681 | } |
2682 | |
2683 | /* if map size is larger than memlock limit, reject it */ |
2684 | @@ -143,24 +150,22 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr) |
2685 | for_each_possible_cpu(cpu) |
2686 | INIT_LIST_HEAD(per_cpu_ptr(dtab->flush_list, cpu)); |
2687 | |
2688 | - dtab->netdev_map = bpf_map_area_alloc(dtab->map.max_entries * |
2689 | - sizeof(struct bpf_dtab_netdev *), |
2690 | - dtab->map.numa_node); |
2691 | - if (!dtab->netdev_map) |
2692 | - goto free_percpu; |
2693 | - |
2694 | if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) { |
2695 | dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets); |
2696 | if (!dtab->dev_index_head) |
2697 | - goto free_map_area; |
2698 | + goto free_percpu; |
2699 | |
2700 | spin_lock_init(&dtab->index_lock); |
2701 | + } else { |
2702 | + dtab->netdev_map = bpf_map_area_alloc(dtab->map.max_entries * |
2703 | + sizeof(struct bpf_dtab_netdev *), |
2704 | + dtab->map.numa_node); |
2705 | + if (!dtab->netdev_map) |
2706 | + goto free_percpu; |
2707 | } |
2708 | |
2709 | return 0; |
2710 | |
2711 | -free_map_area: |
2712 | - bpf_map_area_free(dtab->netdev_map); |
2713 | free_percpu: |
2714 | free_percpu(dtab->flush_list); |
2715 | free_charge: |
2716 | @@ -228,21 +233,40 @@ static void dev_map_free(struct bpf_map *map) |
2717 | cond_resched(); |
2718 | } |
2719 | |
2720 | - for (i = 0; i < dtab->map.max_entries; i++) { |
2721 | - struct bpf_dtab_netdev *dev; |
2722 | + if (dtab->map.map_type == BPF_MAP_TYPE_DEVMAP_HASH) { |
2723 | + for (i = 0; i < dtab->n_buckets; i++) { |
2724 | + struct bpf_dtab_netdev *dev; |
2725 | + struct hlist_head *head; |
2726 | + struct hlist_node *next; |
2727 | |
2728 | - dev = dtab->netdev_map[i]; |
2729 | - if (!dev) |
2730 | - continue; |
2731 | + head = dev_map_index_hash(dtab, i); |
2732 | |
2733 | - free_percpu(dev->bulkq); |
2734 | - dev_put(dev->dev); |
2735 | - kfree(dev); |
2736 | + hlist_for_each_entry_safe(dev, next, head, index_hlist) { |
2737 | + hlist_del_rcu(&dev->index_hlist); |
2738 | + free_percpu(dev->bulkq); |
2739 | + dev_put(dev->dev); |
2740 | + kfree(dev); |
2741 | + } |
2742 | + } |
2743 | + |
2744 | + kfree(dtab->dev_index_head); |
2745 | + } else { |
2746 | + for (i = 0; i < dtab->map.max_entries; i++) { |
2747 | + struct bpf_dtab_netdev *dev; |
2748 | + |
2749 | + dev = dtab->netdev_map[i]; |
2750 | + if (!dev) |
2751 | + continue; |
2752 | + |
2753 | + free_percpu(dev->bulkq); |
2754 | + dev_put(dev->dev); |
2755 | + kfree(dev); |
2756 | + } |
2757 | + |
2758 | + bpf_map_area_free(dtab->netdev_map); |
2759 | } |
2760 | |
2761 | free_percpu(dtab->flush_list); |
2762 | - bpf_map_area_free(dtab->netdev_map); |
2763 | - kfree(dtab->dev_index_head); |
2764 | kfree(dtab); |
2765 | } |
2766 | |
2767 | @@ -263,12 +287,6 @@ static int dev_map_get_next_key(struct bpf_map *map, void *key, void *next_key) |
2768 | return 0; |
2769 | } |
2770 | |
2771 | -static inline struct hlist_head *dev_map_index_hash(struct bpf_dtab *dtab, |
2772 | - int idx) |
2773 | -{ |
2774 | - return &dtab->dev_index_head[idx & (dtab->n_buckets - 1)]; |
2775 | -} |
2776 | - |
2777 | struct bpf_dtab_netdev *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key) |
2778 | { |
2779 | struct bpf_dtab *dtab = container_of(map, struct bpf_dtab, map); |
2780 | diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c |
2781 | index 8402b29c280f..867fd72cb260 100644 |
2782 | --- a/kernel/dma/direct.c |
2783 | +++ b/kernel/dma/direct.c |
2784 | @@ -375,7 +375,7 @@ dma_addr_t dma_direct_map_resource(struct device *dev, phys_addr_t paddr, |
2785 | { |
2786 | dma_addr_t dma_addr = paddr; |
2787 | |
2788 | - if (unlikely(!dma_direct_possible(dev, dma_addr, size))) { |
2789 | + if (unlikely(!dma_capable(dev, dma_addr, size))) { |
2790 | report_addr(dev, dma_addr, size); |
2791 | return DMA_MAPPING_ERROR; |
2792 | } |
2793 | diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h |
2794 | index 2defc7fe74c3..fa08d55f7040 100644 |
2795 | --- a/kernel/rcu/tree_plugin.h |
2796 | +++ b/kernel/rcu/tree_plugin.h |
2797 | @@ -1946,7 +1946,7 @@ static void nocb_gp_wait(struct rcu_data *my_rdp) |
2798 | int __maybe_unused cpu = my_rdp->cpu; |
2799 | unsigned long cur_gp_seq; |
2800 | unsigned long flags; |
2801 | - bool gotcbs; |
2802 | + bool gotcbs = false; |
2803 | unsigned long j = jiffies; |
2804 | bool needwait_gp = false; // This prevents actual uninitialized use. |
2805 | bool needwake; |
2806 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c |
2807 | index a8a08030a8f7..08bdee0480b3 100644 |
2808 | --- a/kernel/sched/deadline.c |
2809 | +++ b/kernel/sched/deadline.c |
2810 | @@ -1743,13 +1743,16 @@ static void start_hrtick_dl(struct rq *rq, struct task_struct *p) |
2811 | } |
2812 | #endif |
2813 | |
2814 | -static void set_next_task_dl(struct rq *rq, struct task_struct *p) |
2815 | +static void set_next_task_dl(struct rq *rq, struct task_struct *p, bool first) |
2816 | { |
2817 | p->se.exec_start = rq_clock_task(rq); |
2818 | |
2819 | /* You can't push away the running task */ |
2820 | dequeue_pushable_dl_task(rq, p); |
2821 | |
2822 | + if (!first) |
2823 | + return; |
2824 | + |
2825 | if (hrtick_enabled(rq)) |
2826 | start_hrtick_dl(rq, p); |
2827 | |
2828 | @@ -1785,7 +1788,7 @@ pick_next_task_dl(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) |
2829 | dl_se = pick_next_dl_entity(rq, dl_rq); |
2830 | BUG_ON(!dl_se); |
2831 | p = dl_task_of(dl_se); |
2832 | - set_next_task_dl(rq, p); |
2833 | + set_next_task_dl(rq, p, true); |
2834 | return p; |
2835 | } |
2836 | |
2837 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
2838 | index 69a81a5709ff..c87a798d1456 100644 |
2839 | --- a/kernel/sched/fair.c |
2840 | +++ b/kernel/sched/fair.c |
2841 | @@ -3504,9 +3504,6 @@ update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq) |
2842 | cfs_rq->load_last_update_time_copy = sa->last_update_time; |
2843 | #endif |
2844 | |
2845 | - if (decayed) |
2846 | - cfs_rq_util_change(cfs_rq, 0); |
2847 | - |
2848 | return decayed; |
2849 | } |
2850 | |
2851 | @@ -3616,8 +3613,12 @@ static inline void update_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *s |
2852 | attach_entity_load_avg(cfs_rq, se, SCHED_CPUFREQ_MIGRATION); |
2853 | update_tg_load_avg(cfs_rq, 0); |
2854 | |
2855 | - } else if (decayed && (flags & UPDATE_TG)) |
2856 | - update_tg_load_avg(cfs_rq, 0); |
2857 | + } else if (decayed) { |
2858 | + cfs_rq_util_change(cfs_rq, 0); |
2859 | + |
2860 | + if (flags & UPDATE_TG) |
2861 | + update_tg_load_avg(cfs_rq, 0); |
2862 | + } |
2863 | } |
2864 | |
2865 | #ifndef CONFIG_64BIT |
2866 | @@ -7517,6 +7518,28 @@ static inline bool others_have_blocked(struct rq *rq) { return false; } |
2867 | static inline void update_blocked_load_status(struct rq *rq, bool has_blocked) {} |
2868 | #endif |
2869 | |
2870 | +static bool __update_blocked_others(struct rq *rq, bool *done) |
2871 | +{ |
2872 | + const struct sched_class *curr_class; |
2873 | + u64 now = rq_clock_pelt(rq); |
2874 | + bool decayed; |
2875 | + |
2876 | + /* |
2877 | + * update_load_avg() can call cpufreq_update_util(). Make sure that RT, |
2878 | + * DL and IRQ signals have been updated before updating CFS. |
2879 | + */ |
2880 | + curr_class = rq->curr->sched_class; |
2881 | + |
2882 | + decayed = update_rt_rq_load_avg(now, rq, curr_class == &rt_sched_class) | |
2883 | + update_dl_rq_load_avg(now, rq, curr_class == &dl_sched_class) | |
2884 | + update_irq_load_avg(rq, 0); |
2885 | + |
2886 | + if (others_have_blocked(rq)) |
2887 | + *done = false; |
2888 | + |
2889 | + return decayed; |
2890 | +} |
2891 | + |
2892 | #ifdef CONFIG_FAIR_GROUP_SCHED |
2893 | |
2894 | static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq) |
2895 | @@ -7536,29 +7559,11 @@ static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq) |
2896 | return true; |
2897 | } |
2898 | |
2899 | -static void update_blocked_averages(int cpu) |
2900 | +static bool __update_blocked_fair(struct rq *rq, bool *done) |
2901 | { |
2902 | - struct rq *rq = cpu_rq(cpu); |
2903 | struct cfs_rq *cfs_rq, *pos; |
2904 | - const struct sched_class *curr_class; |
2905 | - struct rq_flags rf; |
2906 | - bool done = true; |
2907 | - |
2908 | - rq_lock_irqsave(rq, &rf); |
2909 | - update_rq_clock(rq); |
2910 | - |
2911 | - /* |
2912 | - * update_cfs_rq_load_avg() can call cpufreq_update_util(). Make sure |
2913 | - * that RT, DL and IRQ signals have been updated before updating CFS. |
2914 | - */ |
2915 | - curr_class = rq->curr->sched_class; |
2916 | - update_rt_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &rt_sched_class); |
2917 | - update_dl_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &dl_sched_class); |
2918 | - update_irq_load_avg(rq, 0); |
2919 | - |
2920 | - /* Don't need periodic decay once load/util_avg are null */ |
2921 | - if (others_have_blocked(rq)) |
2922 | - done = false; |
2923 | + bool decayed = false; |
2924 | + int cpu = cpu_of(rq); |
2925 | |
2926 | /* |
2927 | * Iterates the task_group tree in a bottom up fashion, see |
2928 | @@ -7567,9 +7572,13 @@ static void update_blocked_averages(int cpu) |
2929 | for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) { |
2930 | struct sched_entity *se; |
2931 | |
2932 | - if (update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq)) |
2933 | + if (update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq)) { |
2934 | update_tg_load_avg(cfs_rq, 0); |
2935 | |
2936 | + if (cfs_rq == &rq->cfs) |
2937 | + decayed = true; |
2938 | + } |
2939 | + |
2940 | /* Propagate pending load changes to the parent, if any: */ |
2941 | se = cfs_rq->tg->se[cpu]; |
2942 | if (se && !skip_blocked_update(se)) |
2943 | @@ -7584,11 +7593,10 @@ static void update_blocked_averages(int cpu) |
2944 | |
2945 | /* Don't need periodic decay once load/util_avg are null */ |
2946 | if (cfs_rq_has_blocked(cfs_rq)) |
2947 | - done = false; |
2948 | + *done = false; |
2949 | } |
2950 | |
2951 | - update_blocked_load_status(rq, !done); |
2952 | - rq_unlock_irqrestore(rq, &rf); |
2953 | + return decayed; |
2954 | } |
2955 | |
2956 | /* |
2957 | @@ -7638,29 +7646,16 @@ static unsigned long task_h_load(struct task_struct *p) |
2958 | cfs_rq_load_avg(cfs_rq) + 1); |
2959 | } |
2960 | #else |
2961 | -static inline void update_blocked_averages(int cpu) |
2962 | +static bool __update_blocked_fair(struct rq *rq, bool *done) |
2963 | { |
2964 | - struct rq *rq = cpu_rq(cpu); |
2965 | struct cfs_rq *cfs_rq = &rq->cfs; |
2966 | - const struct sched_class *curr_class; |
2967 | - struct rq_flags rf; |
2968 | - |
2969 | - rq_lock_irqsave(rq, &rf); |
2970 | - update_rq_clock(rq); |
2971 | - |
2972 | - /* |
2973 | - * update_cfs_rq_load_avg() can call cpufreq_update_util(). Make sure |
2974 | - * that RT, DL and IRQ signals have been updated before updating CFS. |
2975 | - */ |
2976 | - curr_class = rq->curr->sched_class; |
2977 | - update_rt_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &rt_sched_class); |
2978 | - update_dl_rq_load_avg(rq_clock_pelt(rq), rq, curr_class == &dl_sched_class); |
2979 | - update_irq_load_avg(rq, 0); |
2980 | + bool decayed; |
2981 | |
2982 | - update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq); |
2983 | + decayed = update_cfs_rq_load_avg(cfs_rq_clock_pelt(cfs_rq), cfs_rq); |
2984 | + if (cfs_rq_has_blocked(cfs_rq)) |
2985 | + *done = false; |
2986 | |
2987 | - update_blocked_load_status(rq, cfs_rq_has_blocked(cfs_rq) || others_have_blocked(rq)); |
2988 | - rq_unlock_irqrestore(rq, &rf); |
2989 | + return decayed; |
2990 | } |
2991 | |
2992 | static unsigned long task_h_load(struct task_struct *p) |
2993 | @@ -7669,6 +7664,24 @@ static unsigned long task_h_load(struct task_struct *p) |
2994 | } |
2995 | #endif |
2996 | |
2997 | +static void update_blocked_averages(int cpu) |
2998 | +{ |
2999 | + bool decayed = false, done = true; |
3000 | + struct rq *rq = cpu_rq(cpu); |
3001 | + struct rq_flags rf; |
3002 | + |
3003 | + rq_lock_irqsave(rq, &rf); |
3004 | + update_rq_clock(rq); |
3005 | + |
3006 | + decayed |= __update_blocked_others(rq, &done); |
3007 | + decayed |= __update_blocked_fair(rq, &done); |
3008 | + |
3009 | + update_blocked_load_status(rq, !done); |
3010 | + if (decayed) |
3011 | + cpufreq_update_util(rq, 0); |
3012 | + rq_unlock_irqrestore(rq, &rf); |
3013 | +} |
3014 | + |
3015 | /********** Helpers for find_busiest_group ************************/ |
3016 | |
3017 | /* |
3018 | @@ -10151,7 +10164,7 @@ static void switched_to_fair(struct rq *rq, struct task_struct *p) |
3019 | * This routine is mostly called to set cfs_rq->curr field when a task |
3020 | * migrates between groups/classes. |
3021 | */ |
3022 | -static void set_next_task_fair(struct rq *rq, struct task_struct *p) |
3023 | +static void set_next_task_fair(struct rq *rq, struct task_struct *p, bool first) |
3024 | { |
3025 | struct sched_entity *se = &p->se; |
3026 | |
3027 | diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c |
3028 | index f65ef1e2f204..131e7c86cf06 100644 |
3029 | --- a/kernel/sched/idle.c |
3030 | +++ b/kernel/sched/idle.c |
3031 | @@ -385,7 +385,7 @@ static void put_prev_task_idle(struct rq *rq, struct task_struct *prev) |
3032 | { |
3033 | } |
3034 | |
3035 | -static void set_next_task_idle(struct rq *rq, struct task_struct *next) |
3036 | +static void set_next_task_idle(struct rq *rq, struct task_struct *next, bool first) |
3037 | { |
3038 | update_idle_core(rq); |
3039 | schedstat_inc(rq->sched_goidle); |
3040 | @@ -399,7 +399,7 @@ pick_next_task_idle(struct rq *rq, struct task_struct *prev, struct rq_flags *rf |
3041 | if (prev) |
3042 | put_prev_task(rq, prev); |
3043 | |
3044 | - set_next_task_idle(rq, next); |
3045 | + set_next_task_idle(rq, next, true); |
3046 | |
3047 | return next; |
3048 | } |
3049 | diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c |
3050 | index 9b8adc01be3d..7bf917e4d63a 100644 |
3051 | --- a/kernel/sched/rt.c |
3052 | +++ b/kernel/sched/rt.c |
3053 | @@ -1515,13 +1515,16 @@ static void check_preempt_curr_rt(struct rq *rq, struct task_struct *p, int flag |
3054 | #endif |
3055 | } |
3056 | |
3057 | -static inline void set_next_task_rt(struct rq *rq, struct task_struct *p) |
3058 | +static inline void set_next_task_rt(struct rq *rq, struct task_struct *p, bool first) |
3059 | { |
3060 | p->se.exec_start = rq_clock_task(rq); |
3061 | |
3062 | /* The running task is never eligible for pushing */ |
3063 | dequeue_pushable_task(rq, p); |
3064 | |
3065 | + if (!first) |
3066 | + return; |
3067 | + |
3068 | /* |
3069 | * If prev task was rt, put_prev_task() has already updated the |
3070 | * utilization. We only care of the case where we start to schedule a |
3071 | @@ -1575,7 +1578,7 @@ pick_next_task_rt(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) |
3072 | return NULL; |
3073 | |
3074 | p = _pick_next_task_rt(rq); |
3075 | - set_next_task_rt(rq, p); |
3076 | + set_next_task_rt(rq, p, true); |
3077 | return p; |
3078 | } |
3079 | |
3080 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h |
3081 | index 49ed949f850c..e5e2605778c9 100644 |
3082 | --- a/kernel/sched/sched.h |
3083 | +++ b/kernel/sched/sched.h |
3084 | @@ -1728,7 +1728,7 @@ struct sched_class { |
3085 | struct task_struct *prev, |
3086 | struct rq_flags *rf); |
3087 | void (*put_prev_task)(struct rq *rq, struct task_struct *p); |
3088 | - void (*set_next_task)(struct rq *rq, struct task_struct *p); |
3089 | + void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first); |
3090 | |
3091 | #ifdef CONFIG_SMP |
3092 | int (*balance)(struct rq *rq, struct task_struct *prev, struct rq_flags *rf); |
3093 | @@ -1780,7 +1780,7 @@ static inline void put_prev_task(struct rq *rq, struct task_struct *prev) |
3094 | static inline void set_next_task(struct rq *rq, struct task_struct *next) |
3095 | { |
3096 | WARN_ON_ONCE(rq->curr != next); |
3097 | - next->sched_class->set_next_task(rq, next); |
3098 | + next->sched_class->set_next_task(rq, next, false); |
3099 | } |
3100 | |
3101 | #ifdef CONFIG_SMP |
3102 | diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c |
3103 | index c0640739e05e..02dc0a8e3925 100644 |
3104 | --- a/kernel/sched/stop_task.c |
3105 | +++ b/kernel/sched/stop_task.c |
3106 | @@ -29,7 +29,7 @@ check_preempt_curr_stop(struct rq *rq, struct task_struct *p, int flags) |
3107 | /* we're never preempted */ |
3108 | } |
3109 | |
3110 | -static void set_next_task_stop(struct rq *rq, struct task_struct *stop) |
3111 | +static void set_next_task_stop(struct rq *rq, struct task_struct *stop, bool first) |
3112 | { |
3113 | stop->se.exec_start = rq_clock_task(rq); |
3114 | } |
3115 | @@ -42,7 +42,7 @@ pick_next_task_stop(struct rq *rq, struct task_struct *prev, struct rq_flags *rf |
3116 | if (!sched_stop_runnable(rq)) |
3117 | return NULL; |
3118 | |
3119 | - set_next_task_stop(rq, rq->stop); |
3120 | + set_next_task_stop(rq, rq->stop, true); |
3121 | return rq->stop; |
3122 | } |
3123 | |
3124 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
3125 | index 649687622654..e9c63b79e03f 100644 |
3126 | --- a/kernel/workqueue.c |
3127 | +++ b/kernel/workqueue.c |
3128 | @@ -425,7 +425,8 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); |
3129 | * ignored. |
3130 | */ |
3131 | #define for_each_pwq(pwq, wq) \ |
3132 | - list_for_each_entry_rcu((pwq), &(wq)->pwqs, pwqs_node) \ |
3133 | + list_for_each_entry_rcu((pwq), &(wq)->pwqs, pwqs_node, \ |
3134 | + lockdep_is_held(&wq->mutex)) \ |
3135 | if (({ assert_rcu_or_wq_mutex(wq); false; })) { } \ |
3136 | else |
3137 | |
3138 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
3139 | index f2452496ad9f..920784a9b7ff 100644 |
3140 | --- a/net/core/neighbour.c |
3141 | +++ b/net/core/neighbour.c |
3142 | @@ -2049,8 +2049,8 @@ static int neightbl_fill_info(struct sk_buff *skb, struct neigh_table *tbl, |
3143 | goto nla_put_failure; |
3144 | { |
3145 | unsigned long now = jiffies; |
3146 | - unsigned int flush_delta = now - tbl->last_flush; |
3147 | - unsigned int rand_delta = now - tbl->last_rand; |
3148 | + long flush_delta = now - tbl->last_flush; |
3149 | + long rand_delta = now - tbl->last_rand; |
3150 | struct neigh_hash_table *nht; |
3151 | struct ndt_config ndc = { |
3152 | .ndtc_key_len = tbl->key_len, |
3153 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c |
3154 | index b4db68e5caa9..4c826b8bf9b1 100644 |
3155 | --- a/net/core/net-sysfs.c |
3156 | +++ b/net/core/net-sysfs.c |
3157 | @@ -1462,14 +1462,17 @@ static int netdev_queue_add_kobject(struct net_device *dev, int index) |
3158 | struct kobject *kobj = &queue->kobj; |
3159 | int error = 0; |
3160 | |
3161 | + /* Kobject_put later will trigger netdev_queue_release call |
3162 | + * which decreases dev refcount: Take that reference here |
3163 | + */ |
3164 | + dev_hold(queue->dev); |
3165 | + |
3166 | kobj->kset = dev->queues_kset; |
3167 | error = kobject_init_and_add(kobj, &netdev_queue_ktype, NULL, |
3168 | "tx-%u", index); |
3169 | if (error) |
3170 | goto err; |
3171 | |
3172 | - dev_hold(queue->dev); |
3173 | - |
3174 | #ifdef CONFIG_BQL |
3175 | error = sysfs_create_group(kobj, &dql_group); |
3176 | if (error) |
3177 | diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c |
3178 | index 23f67b8fdeaa..3eed90bfa2bf 100644 |
3179 | --- a/net/openvswitch/datapath.c |
3180 | +++ b/net/openvswitch/datapath.c |
3181 | @@ -1667,6 +1667,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) |
3182 | ovs_dp_reset_user_features(skb, info); |
3183 | } |
3184 | |
3185 | + ovs_unlock(); |
3186 | goto err_destroy_meters; |
3187 | } |
3188 | |
3189 | @@ -1683,7 +1684,6 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) |
3190 | return 0; |
3191 | |
3192 | err_destroy_meters: |
3193 | - ovs_unlock(); |
3194 | ovs_meters_exit(dp); |
3195 | err_destroy_ports_array: |
3196 | kfree(dp->ports); |
3197 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
3198 | index 529d4ce945db..118cd66b7516 100644 |
3199 | --- a/net/packet/af_packet.c |
3200 | +++ b/net/packet/af_packet.c |
3201 | @@ -1296,15 +1296,21 @@ static void packet_sock_destruct(struct sock *sk) |
3202 | |
3203 | static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) |
3204 | { |
3205 | - u32 rxhash; |
3206 | + u32 *history = po->rollover->history; |
3207 | + u32 victim, rxhash; |
3208 | int i, count = 0; |
3209 | |
3210 | rxhash = skb_get_hash(skb); |
3211 | for (i = 0; i < ROLLOVER_HLEN; i++) |
3212 | - if (po->rollover->history[i] == rxhash) |
3213 | + if (READ_ONCE(history[i]) == rxhash) |
3214 | count++; |
3215 | |
3216 | - po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; |
3217 | + victim = prandom_u32() % ROLLOVER_HLEN; |
3218 | + |
3219 | + /* Avoid dirtying the cache line if possible */ |
3220 | + if (READ_ONCE(history[victim]) != rxhash) |
3221 | + WRITE_ONCE(history[victim], rxhash); |
3222 | + |
3223 | return count > (ROLLOVER_HLEN >> 1); |
3224 | } |
3225 | |
3226 | diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c |
3227 | index 8be2f209982b..908b60a72d95 100644 |
3228 | --- a/net/sunrpc/auth_gss/svcauth_gss.c |
3229 | +++ b/net/sunrpc/auth_gss/svcauth_gss.c |
3230 | @@ -1075,24 +1075,32 @@ gss_read_verf(struct rpc_gss_wire_cred *gc, |
3231 | return 0; |
3232 | } |
3233 | |
3234 | -/* Ok this is really heavily depending on a set of semantics in |
3235 | - * how rqstp is set up by svc_recv and pages laid down by the |
3236 | - * server when reading a request. We are basically guaranteed that |
3237 | - * the token lays all down linearly across a set of pages, starting |
3238 | - * at iov_base in rq_arg.head[0] which happens to be the first of a |
3239 | - * set of pages stored in rq_pages[]. |
3240 | - * rq_arg.head[0].iov_base will provide us the page_base to pass |
3241 | - * to the upcall. |
3242 | - */ |
3243 | -static inline int |
3244 | -gss_read_proxy_verf(struct svc_rqst *rqstp, |
3245 | - struct rpc_gss_wire_cred *gc, __be32 *authp, |
3246 | - struct xdr_netobj *in_handle, |
3247 | - struct gssp_in_token *in_token) |
3248 | +static void gss_free_in_token_pages(struct gssp_in_token *in_token) |
3249 | { |
3250 | - struct kvec *argv = &rqstp->rq_arg.head[0]; |
3251 | u32 inlen; |
3252 | - int res; |
3253 | + int i; |
3254 | + |
3255 | + i = 0; |
3256 | + inlen = in_token->page_len; |
3257 | + while (inlen) { |
3258 | + if (in_token->pages[i]) |
3259 | + put_page(in_token->pages[i]); |
3260 | + inlen -= inlen > PAGE_SIZE ? PAGE_SIZE : inlen; |
3261 | + } |
3262 | + |
3263 | + kfree(in_token->pages); |
3264 | + in_token->pages = NULL; |
3265 | +} |
3266 | + |
3267 | +static int gss_read_proxy_verf(struct svc_rqst *rqstp, |
3268 | + struct rpc_gss_wire_cred *gc, __be32 *authp, |
3269 | + struct xdr_netobj *in_handle, |
3270 | + struct gssp_in_token *in_token) |
3271 | +{ |
3272 | + struct kvec *argv = &rqstp->rq_arg.head[0]; |
3273 | + unsigned int page_base, length; |
3274 | + int pages, i, res; |
3275 | + size_t inlen; |
3276 | |
3277 | res = gss_read_common_verf(gc, argv, authp, in_handle); |
3278 | if (res) |
3279 | @@ -1102,10 +1110,36 @@ gss_read_proxy_verf(struct svc_rqst *rqstp, |
3280 | if (inlen > (argv->iov_len + rqstp->rq_arg.page_len)) |
3281 | return SVC_DENIED; |
3282 | |
3283 | - in_token->pages = rqstp->rq_pages; |
3284 | - in_token->page_base = (ulong)argv->iov_base & ~PAGE_MASK; |
3285 | + pages = DIV_ROUND_UP(inlen, PAGE_SIZE); |
3286 | + in_token->pages = kcalloc(pages, sizeof(struct page *), GFP_KERNEL); |
3287 | + if (!in_token->pages) |
3288 | + return SVC_DENIED; |
3289 | + in_token->page_base = 0; |
3290 | in_token->page_len = inlen; |
3291 | + for (i = 0; i < pages; i++) { |
3292 | + in_token->pages[i] = alloc_page(GFP_KERNEL); |
3293 | + if (!in_token->pages[i]) { |
3294 | + gss_free_in_token_pages(in_token); |
3295 | + return SVC_DENIED; |
3296 | + } |
3297 | + } |
3298 | |
3299 | + length = min_t(unsigned int, inlen, argv->iov_len); |
3300 | + memcpy(page_address(in_token->pages[0]), argv->iov_base, length); |
3301 | + inlen -= length; |
3302 | + |
3303 | + i = 1; |
3304 | + page_base = rqstp->rq_arg.page_base; |
3305 | + while (inlen) { |
3306 | + length = min_t(unsigned int, inlen, PAGE_SIZE); |
3307 | + memcpy(page_address(in_token->pages[i]), |
3308 | + page_address(rqstp->rq_arg.pages[i]) + page_base, |
3309 | + length); |
3310 | + |
3311 | + inlen -= length; |
3312 | + page_base = 0; |
3313 | + i++; |
3314 | + } |
3315 | return 0; |
3316 | } |
3317 | |
3318 | @@ -1280,8 +1314,11 @@ static int svcauth_gss_proxy_init(struct svc_rqst *rqstp, |
3319 | break; |
3320 | case GSS_S_COMPLETE: |
3321 | status = gss_proxy_save_rsc(sn->rsc_cache, &ud, &handle); |
3322 | - if (status) |
3323 | + if (status) { |
3324 | + pr_info("%s: gss_proxy_save_rsc failed (%d)\n", |
3325 | + __func__, status); |
3326 | goto out; |
3327 | + } |
3328 | cli_handle.data = (u8 *)&handle; |
3329 | cli_handle.len = sizeof(handle); |
3330 | break; |
3331 | @@ -1292,15 +1329,20 @@ static int svcauth_gss_proxy_init(struct svc_rqst *rqstp, |
3332 | |
3333 | /* Got an answer to the upcall; use it: */ |
3334 | if (gss_write_init_verf(sn->rsc_cache, rqstp, |
3335 | - &cli_handle, &ud.major_status)) |
3336 | + &cli_handle, &ud.major_status)) { |
3337 | + pr_info("%s: gss_write_init_verf failed\n", __func__); |
3338 | goto out; |
3339 | + } |
3340 | if (gss_write_resv(resv, PAGE_SIZE, |
3341 | &cli_handle, &ud.out_token, |
3342 | - ud.major_status, ud.minor_status)) |
3343 | + ud.major_status, ud.minor_status)) { |
3344 | + pr_info("%s: gss_write_resv failed\n", __func__); |
3345 | goto out; |
3346 | + } |
3347 | |
3348 | ret = SVC_COMPLETE; |
3349 | out: |
3350 | + gss_free_in_token_pages(&ud.in_token); |
3351 | gssp_free_upcall_data(&ud); |
3352 | return ret; |
3353 | } |
3354 | diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c |
3355 | index 14ba9e72a204..f3104be8ff5d 100644 |
3356 | --- a/net/sunrpc/xdr.c |
3357 | +++ b/net/sunrpc/xdr.c |
3358 | @@ -436,13 +436,12 @@ xdr_shrink_bufhead(struct xdr_buf *buf, size_t len) |
3359 | } |
3360 | |
3361 | /** |
3362 | - * xdr_shrink_pagelen |
3363 | + * xdr_shrink_pagelen - shrinks buf->pages by up to @len bytes |
3364 | * @buf: xdr_buf |
3365 | * @len: bytes to remove from buf->pages |
3366 | * |
3367 | - * Shrinks XDR buffer's page array buf->pages by |
3368 | - * 'len' bytes. The extra data is not lost, but is instead |
3369 | - * moved into the tail. |
3370 | + * The extra data is not lost, but is instead moved into buf->tail. |
3371 | + * Returns the actual number of bytes moved. |
3372 | */ |
3373 | static unsigned int |
3374 | xdr_shrink_pagelen(struct xdr_buf *buf, size_t len) |
3375 | @@ -455,8 +454,8 @@ xdr_shrink_pagelen(struct xdr_buf *buf, size_t len) |
3376 | |
3377 | result = 0; |
3378 | tail = buf->tail; |
3379 | - BUG_ON (len > pglen); |
3380 | - |
3381 | + if (len > buf->page_len) |
3382 | + len = buf-> page_len; |
3383 | tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len; |
3384 | |
3385 | /* Shift the tail first */ |
3386 | diff --git a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c |
3387 | index d1fcc41d5eb5..908e78bb87c6 100644 |
3388 | --- a/net/sunrpc/xprtrdma/svc_rdma_backchannel.c |
3389 | +++ b/net/sunrpc/xprtrdma/svc_rdma_backchannel.c |
3390 | @@ -195,6 +195,7 @@ rpcrdma_bc_send_request(struct svcxprt_rdma *rdma, struct rpc_rqst *rqst) |
3391 | pr_info("%s: %*ph\n", __func__, 64, rqst->rq_buffer); |
3392 | #endif |
3393 | |
3394 | + rqst->rq_xtime = ktime_get(); |
3395 | rc = svc_rdma_bc_sendto(rdma, rqst, ctxt); |
3396 | if (rc) { |
3397 | svc_rdma_send_ctxt_put(rdma, ctxt); |
3398 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
3399 | index 70e52f567b2a..5361b98f31ae 100644 |
3400 | --- a/net/sunrpc/xprtsock.c |
3401 | +++ b/net/sunrpc/xprtsock.c |
3402 | @@ -2659,6 +2659,8 @@ static int bc_sendto(struct rpc_rqst *req) |
3403 | .iov_len = sizeof(marker), |
3404 | }; |
3405 | |
3406 | + req->rq_xtime = ktime_get(); |
3407 | + |
3408 | len = kernel_sendmsg(transport->sock, &msg, &iov, 1, iov.iov_len); |
3409 | if (len != iov.iov_len) |
3410 | return -EAGAIN; |
3411 | @@ -2684,7 +2686,6 @@ static int bc_send_request(struct rpc_rqst *req) |
3412 | struct svc_xprt *xprt; |
3413 | int len; |
3414 | |
3415 | - dprintk("sending request with xid: %08x\n", ntohl(req->rq_xid)); |
3416 | /* |
3417 | * Get the server socket associated with this callback xprt |
3418 | */ |
3419 | diff --git a/net/tipc/link.c b/net/tipc/link.c |
3420 | index 999eab592de8..a9d8a81e80cf 100644 |
3421 | --- a/net/tipc/link.c |
3422 | +++ b/net/tipc/link.c |
3423 | @@ -1084,7 +1084,7 @@ static bool link_retransmit_failure(struct tipc_link *l, struct tipc_link *r, |
3424 | return false; |
3425 | |
3426 | if (!time_after(jiffies, TIPC_SKB_CB(skb)->retr_stamp + |
3427 | - msecs_to_jiffies(r->tolerance))) |
3428 | + msecs_to_jiffies(r->tolerance * 10))) |
3429 | return false; |
3430 | |
3431 | hdr = buf_msg(skb); |
3432 | diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c |
3433 | index 6a6eae88442f..58708b4c7719 100644 |
3434 | --- a/net/tipc/monitor.c |
3435 | +++ b/net/tipc/monitor.c |
3436 | @@ -665,6 +665,21 @@ void tipc_mon_delete(struct net *net, int bearer_id) |
3437 | kfree(mon); |
3438 | } |
3439 | |
3440 | +void tipc_mon_reinit_self(struct net *net) |
3441 | +{ |
3442 | + struct tipc_monitor *mon; |
3443 | + int bearer_id; |
3444 | + |
3445 | + for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { |
3446 | + mon = tipc_monitor(net, bearer_id); |
3447 | + if (!mon) |
3448 | + continue; |
3449 | + write_lock_bh(&mon->lock); |
3450 | + mon->self->addr = tipc_own_addr(net); |
3451 | + write_unlock_bh(&mon->lock); |
3452 | + } |
3453 | +} |
3454 | + |
3455 | int tipc_nl_monitor_set_threshold(struct net *net, u32 cluster_size) |
3456 | { |
3457 | struct tipc_net *tn = tipc_net(net); |
3458 | diff --git a/net/tipc/monitor.h b/net/tipc/monitor.h |
3459 | index 2a21b93e0d04..ed63d2e650b0 100644 |
3460 | --- a/net/tipc/monitor.h |
3461 | +++ b/net/tipc/monitor.h |
3462 | @@ -77,6 +77,7 @@ int __tipc_nl_add_monitor(struct net *net, struct tipc_nl_msg *msg, |
3463 | u32 bearer_id); |
3464 | int tipc_nl_add_monitor_peer(struct net *net, struct tipc_nl_msg *msg, |
3465 | u32 bearer_id, u32 *prev_node); |
3466 | +void tipc_mon_reinit_self(struct net *net); |
3467 | |
3468 | extern const int tipc_max_domain_size; |
3469 | #endif |
3470 | diff --git a/net/tipc/net.c b/net/tipc/net.c |
3471 | index 85707c185360..2de3cec9929d 100644 |
3472 | --- a/net/tipc/net.c |
3473 | +++ b/net/tipc/net.c |
3474 | @@ -42,6 +42,7 @@ |
3475 | #include "node.h" |
3476 | #include "bcast.h" |
3477 | #include "netlink.h" |
3478 | +#include "monitor.h" |
3479 | |
3480 | /* |
3481 | * The TIPC locking policy is designed to ensure a very fine locking |
3482 | @@ -136,6 +137,7 @@ static void tipc_net_finalize(struct net *net, u32 addr) |
3483 | tipc_set_node_addr(net, addr); |
3484 | tipc_named_reinit(net); |
3485 | tipc_sk_reinit(net); |
3486 | + tipc_mon_reinit_self(net); |
3487 | tipc_nametbl_publish(net, TIPC_CFG_SRV, addr, addr, |
3488 | TIPC_CLUSTER_SCOPE, 0, addr); |
3489 | } |
3490 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c |
3491 | index 79d06c21ebe3..aea951a1f805 100644 |
3492 | --- a/net/tipc/socket.c |
3493 | +++ b/net/tipc/socket.c |
3494 | @@ -504,7 +504,7 @@ static void __tipc_shutdown(struct socket *sock, int error) |
3495 | struct sock *sk = sock->sk; |
3496 | struct tipc_sock *tsk = tipc_sk(sk); |
3497 | struct net *net = sock_net(sk); |
3498 | - long timeout = CONN_TIMEOUT_DEFAULT; |
3499 | + long timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); |
3500 | u32 dnode = tsk_peer_node(tsk); |
3501 | struct sk_buff *skb; |
3502 | |
3503 | @@ -1396,8 +1396,10 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen) |
3504 | rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts); |
3505 | if (unlikely(rc != dlen)) |
3506 | return rc; |
3507 | - if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) |
3508 | + if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) { |
3509 | + __skb_queue_purge(&pkts); |
3510 | return -ENOMEM; |
3511 | + } |
3512 | |
3513 | trace_tipc_sk_sendmsg(sk, skb_peek(&pkts), TIPC_DUMP_SK_SNDQ, " "); |
3514 | rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid); |
3515 | @@ -2685,6 +2687,7 @@ static void tipc_sk_timeout(struct timer_list *t) |
3516 | if (sock_owned_by_user(sk)) { |
3517 | sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 20); |
3518 | bh_unlock_sock(sk); |
3519 | + sock_put(sk); |
3520 | return; |
3521 | } |
3522 | |
3523 | diff --git a/samples/bpf/sockex1_kern.c b/samples/bpf/sockex1_kern.c |
3524 | index ed18e9a4909c..43e38ce594d4 100644 |
3525 | --- a/samples/bpf/sockex1_kern.c |
3526 | +++ b/samples/bpf/sockex1_kern.c |
3527 | @@ -4,12 +4,12 @@ |
3528 | #include <uapi/linux/ip.h> |
3529 | #include "bpf_helpers.h" |
3530 | |
3531 | -struct bpf_map_def SEC("maps") my_map = { |
3532 | - .type = BPF_MAP_TYPE_ARRAY, |
3533 | - .key_size = sizeof(u32), |
3534 | - .value_size = sizeof(long), |
3535 | - .max_entries = 256, |
3536 | -}; |
3537 | +struct { |
3538 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3539 | + __type(key, u32); |
3540 | + __type(value, long); |
3541 | + __uint(max_entries, 256); |
3542 | +} my_map SEC(".maps"); |
3543 | |
3544 | SEC("socket1") |
3545 | int bpf_prog1(struct __sk_buff *skb) |
3546 | diff --git a/samples/bpf/sockex2_kern.c b/samples/bpf/sockex2_kern.c |
3547 | index f2f9dbc021b0..ae4bdc89b599 100644 |
3548 | --- a/samples/bpf/sockex2_kern.c |
3549 | +++ b/samples/bpf/sockex2_kern.c |
3550 | @@ -189,12 +189,12 @@ struct pair { |
3551 | long bytes; |
3552 | }; |
3553 | |
3554 | -struct bpf_map_def SEC("maps") hash_map = { |
3555 | - .type = BPF_MAP_TYPE_HASH, |
3556 | - .key_size = sizeof(__be32), |
3557 | - .value_size = sizeof(struct pair), |
3558 | - .max_entries = 1024, |
3559 | -}; |
3560 | +struct { |
3561 | + __uint(type, BPF_MAP_TYPE_HASH); |
3562 | + __type(key, __be32); |
3563 | + __type(value, struct pair); |
3564 | + __uint(max_entries, 1024); |
3565 | +} hash_map SEC(".maps"); |
3566 | |
3567 | SEC("socket2") |
3568 | int bpf_prog2(struct __sk_buff *skb) |
3569 | diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c |
3570 | index 219742106bfd..db6870aee42c 100644 |
3571 | --- a/samples/bpf/xdp1_kern.c |
3572 | +++ b/samples/bpf/xdp1_kern.c |
3573 | @@ -14,12 +14,12 @@ |
3574 | #include <linux/ipv6.h> |
3575 | #include "bpf_helpers.h" |
3576 | |
3577 | -struct bpf_map_def SEC("maps") rxcnt = { |
3578 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3579 | - .key_size = sizeof(u32), |
3580 | - .value_size = sizeof(long), |
3581 | - .max_entries = 256, |
3582 | -}; |
3583 | +struct { |
3584 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3585 | + __type(key, u32); |
3586 | + __type(value, long); |
3587 | + __uint(max_entries, 256); |
3588 | +} rxcnt SEC(".maps"); |
3589 | |
3590 | static int parse_ipv4(void *data, u64 nh_off, void *data_end) |
3591 | { |
3592 | diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c |
3593 | index e01288867d15..c74b52c6d945 100644 |
3594 | --- a/samples/bpf/xdp2_kern.c |
3595 | +++ b/samples/bpf/xdp2_kern.c |
3596 | @@ -14,12 +14,12 @@ |
3597 | #include <linux/ipv6.h> |
3598 | #include "bpf_helpers.h" |
3599 | |
3600 | -struct bpf_map_def SEC("maps") rxcnt = { |
3601 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3602 | - .key_size = sizeof(u32), |
3603 | - .value_size = sizeof(long), |
3604 | - .max_entries = 256, |
3605 | -}; |
3606 | +struct { |
3607 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3608 | + __type(key, u32); |
3609 | + __type(value, long); |
3610 | + __uint(max_entries, 256); |
3611 | +} rxcnt SEC(".maps"); |
3612 | |
3613 | static void swap_src_dst_mac(void *data) |
3614 | { |
3615 | diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c |
3616 | index 411fdb21f8bc..cd9ff2a40a39 100644 |
3617 | --- a/samples/bpf/xdp_adjust_tail_kern.c |
3618 | +++ b/samples/bpf/xdp_adjust_tail_kern.c |
3619 | @@ -25,12 +25,12 @@ |
3620 | #define ICMP_TOOBIG_SIZE 98 |
3621 | #define ICMP_TOOBIG_PAYLOAD_SIZE 92 |
3622 | |
3623 | -struct bpf_map_def SEC("maps") icmpcnt = { |
3624 | - .type = BPF_MAP_TYPE_ARRAY, |
3625 | - .key_size = sizeof(__u32), |
3626 | - .value_size = sizeof(__u64), |
3627 | - .max_entries = 1, |
3628 | -}; |
3629 | +struct { |
3630 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3631 | + __type(key, __u32); |
3632 | + __type(value, __u64); |
3633 | + __uint(max_entries, 1); |
3634 | +} icmpcnt SEC(".maps"); |
3635 | |
3636 | static __always_inline void count_icmp(void) |
3637 | { |
3638 | diff --git a/samples/bpf/xdp_fwd_kern.c b/samples/bpf/xdp_fwd_kern.c |
3639 | index 701a30f258b1..d013029aeaa2 100644 |
3640 | --- a/samples/bpf/xdp_fwd_kern.c |
3641 | +++ b/samples/bpf/xdp_fwd_kern.c |
3642 | @@ -23,13 +23,12 @@ |
3643 | |
3644 | #define IPV6_FLOWINFO_MASK cpu_to_be32(0x0FFFFFFF) |
3645 | |
3646 | -/* For TX-traffic redirect requires net_device ifindex to be in this devmap */ |
3647 | -struct bpf_map_def SEC("maps") xdp_tx_ports = { |
3648 | - .type = BPF_MAP_TYPE_DEVMAP, |
3649 | - .key_size = sizeof(int), |
3650 | - .value_size = sizeof(int), |
3651 | - .max_entries = 64, |
3652 | -}; |
3653 | +struct { |
3654 | + __uint(type, BPF_MAP_TYPE_DEVMAP); |
3655 | + __uint(key_size, sizeof(int)); |
3656 | + __uint(value_size, sizeof(int)); |
3657 | + __uint(max_entries, 64); |
3658 | +} xdp_tx_ports SEC(".maps"); |
3659 | |
3660 | /* from include/net/ip.h */ |
3661 | static __always_inline int ip_decrease_ttl(struct iphdr *iph) |
3662 | diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c |
3663 | index a306d1c75622..cfcc31e51197 100644 |
3664 | --- a/samples/bpf/xdp_redirect_cpu_kern.c |
3665 | +++ b/samples/bpf/xdp_redirect_cpu_kern.c |
3666 | @@ -18,12 +18,12 @@ |
3667 | #define MAX_CPUS 64 /* WARNING - sync with _user.c */ |
3668 | |
3669 | /* Special map type that can XDP_REDIRECT frames to another CPU */ |
3670 | -struct bpf_map_def SEC("maps") cpu_map = { |
3671 | - .type = BPF_MAP_TYPE_CPUMAP, |
3672 | - .key_size = sizeof(u32), |
3673 | - .value_size = sizeof(u32), |
3674 | - .max_entries = MAX_CPUS, |
3675 | -}; |
3676 | +struct { |
3677 | + __uint(type, BPF_MAP_TYPE_CPUMAP); |
3678 | + __uint(key_size, sizeof(u32)); |
3679 | + __uint(value_size, sizeof(u32)); |
3680 | + __uint(max_entries, MAX_CPUS); |
3681 | +} cpu_map SEC(".maps"); |
3682 | |
3683 | /* Common stats data record to keep userspace more simple */ |
3684 | struct datarec { |
3685 | @@ -35,67 +35,67 @@ struct datarec { |
3686 | /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success |
3687 | * feedback. Redirect TX errors can be caught via a tracepoint. |
3688 | */ |
3689 | -struct bpf_map_def SEC("maps") rx_cnt = { |
3690 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3691 | - .key_size = sizeof(u32), |
3692 | - .value_size = sizeof(struct datarec), |
3693 | - .max_entries = 1, |
3694 | -}; |
3695 | +struct { |
3696 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3697 | + __type(key, u32); |
3698 | + __type(value, struct datarec); |
3699 | + __uint(max_entries, 1); |
3700 | +} rx_cnt SEC(".maps"); |
3701 | |
3702 | /* Used by trace point */ |
3703 | -struct bpf_map_def SEC("maps") redirect_err_cnt = { |
3704 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3705 | - .key_size = sizeof(u32), |
3706 | - .value_size = sizeof(struct datarec), |
3707 | - .max_entries = 2, |
3708 | +struct { |
3709 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3710 | + __type(key, u32); |
3711 | + __type(value, struct datarec); |
3712 | + __uint(max_entries, 2); |
3713 | /* TODO: have entries for all possible errno's */ |
3714 | -}; |
3715 | +} redirect_err_cnt SEC(".maps"); |
3716 | |
3717 | /* Used by trace point */ |
3718 | -struct bpf_map_def SEC("maps") cpumap_enqueue_cnt = { |
3719 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3720 | - .key_size = sizeof(u32), |
3721 | - .value_size = sizeof(struct datarec), |
3722 | - .max_entries = MAX_CPUS, |
3723 | -}; |
3724 | +struct { |
3725 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3726 | + __type(key, u32); |
3727 | + __type(value, struct datarec); |
3728 | + __uint(max_entries, MAX_CPUS); |
3729 | +} cpumap_enqueue_cnt SEC(".maps"); |
3730 | |
3731 | /* Used by trace point */ |
3732 | -struct bpf_map_def SEC("maps") cpumap_kthread_cnt = { |
3733 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3734 | - .key_size = sizeof(u32), |
3735 | - .value_size = sizeof(struct datarec), |
3736 | - .max_entries = 1, |
3737 | -}; |
3738 | +struct { |
3739 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3740 | + __type(key, u32); |
3741 | + __type(value, struct datarec); |
3742 | + __uint(max_entries, 1); |
3743 | +} cpumap_kthread_cnt SEC(".maps"); |
3744 | |
3745 | /* Set of maps controlling available CPU, and for iterating through |
3746 | * selectable redirect CPUs. |
3747 | */ |
3748 | -struct bpf_map_def SEC("maps") cpus_available = { |
3749 | - .type = BPF_MAP_TYPE_ARRAY, |
3750 | - .key_size = sizeof(u32), |
3751 | - .value_size = sizeof(u32), |
3752 | - .max_entries = MAX_CPUS, |
3753 | -}; |
3754 | -struct bpf_map_def SEC("maps") cpus_count = { |
3755 | - .type = BPF_MAP_TYPE_ARRAY, |
3756 | - .key_size = sizeof(u32), |
3757 | - .value_size = sizeof(u32), |
3758 | - .max_entries = 1, |
3759 | -}; |
3760 | -struct bpf_map_def SEC("maps") cpus_iterator = { |
3761 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3762 | - .key_size = sizeof(u32), |
3763 | - .value_size = sizeof(u32), |
3764 | - .max_entries = 1, |
3765 | -}; |
3766 | +struct { |
3767 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3768 | + __type(key, u32); |
3769 | + __type(value, u32); |
3770 | + __uint(max_entries, MAX_CPUS); |
3771 | +} cpus_available SEC(".maps"); |
3772 | +struct { |
3773 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3774 | + __type(key, u32); |
3775 | + __type(value, u32); |
3776 | + __uint(max_entries, 1); |
3777 | +} cpus_count SEC(".maps"); |
3778 | +struct { |
3779 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3780 | + __type(key, u32); |
3781 | + __type(value, u32); |
3782 | + __uint(max_entries, 1); |
3783 | +} cpus_iterator SEC(".maps"); |
3784 | |
3785 | /* Used by trace point */ |
3786 | -struct bpf_map_def SEC("maps") exception_cnt = { |
3787 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3788 | - .key_size = sizeof(u32), |
3789 | - .value_size = sizeof(struct datarec), |
3790 | - .max_entries = 1, |
3791 | -}; |
3792 | +struct { |
3793 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3794 | + __type(key, u32); |
3795 | + __type(value, struct datarec); |
3796 | + __uint(max_entries, 1); |
3797 | +} exception_cnt SEC(".maps"); |
3798 | |
3799 | /* Helper parse functions */ |
3800 | |
3801 | diff --git a/samples/bpf/xdp_redirect_kern.c b/samples/bpf/xdp_redirect_kern.c |
3802 | index 8abb151e385f..1f0b7d05abb2 100644 |
3803 | --- a/samples/bpf/xdp_redirect_kern.c |
3804 | +++ b/samples/bpf/xdp_redirect_kern.c |
3805 | @@ -19,22 +19,22 @@ |
3806 | #include <linux/ipv6.h> |
3807 | #include "bpf_helpers.h" |
3808 | |
3809 | -struct bpf_map_def SEC("maps") tx_port = { |
3810 | - .type = BPF_MAP_TYPE_ARRAY, |
3811 | - .key_size = sizeof(int), |
3812 | - .value_size = sizeof(int), |
3813 | - .max_entries = 1, |
3814 | -}; |
3815 | +struct { |
3816 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3817 | + __type(key, int); |
3818 | + __type(value, int); |
3819 | + __uint(max_entries, 1); |
3820 | +} tx_port SEC(".maps"); |
3821 | |
3822 | /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success |
3823 | * feedback. Redirect TX errors can be caught via a tracepoint. |
3824 | */ |
3825 | -struct bpf_map_def SEC("maps") rxcnt = { |
3826 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3827 | - .key_size = sizeof(u32), |
3828 | - .value_size = sizeof(long), |
3829 | - .max_entries = 1, |
3830 | -}; |
3831 | +struct { |
3832 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3833 | + __type(key, u32); |
3834 | + __type(value, long); |
3835 | + __uint(max_entries, 1); |
3836 | +} rxcnt SEC(".maps"); |
3837 | |
3838 | static void swap_src_dst_mac(void *data) |
3839 | { |
3840 | diff --git a/samples/bpf/xdp_redirect_map_kern.c b/samples/bpf/xdp_redirect_map_kern.c |
3841 | index 740a529ba84f..4631b484c432 100644 |
3842 | --- a/samples/bpf/xdp_redirect_map_kern.c |
3843 | +++ b/samples/bpf/xdp_redirect_map_kern.c |
3844 | @@ -19,22 +19,22 @@ |
3845 | #include <linux/ipv6.h> |
3846 | #include "bpf_helpers.h" |
3847 | |
3848 | -struct bpf_map_def SEC("maps") tx_port = { |
3849 | - .type = BPF_MAP_TYPE_DEVMAP, |
3850 | - .key_size = sizeof(int), |
3851 | - .value_size = sizeof(int), |
3852 | - .max_entries = 100, |
3853 | -}; |
3854 | +struct { |
3855 | + __uint(type, BPF_MAP_TYPE_DEVMAP); |
3856 | + __uint(key_size, sizeof(int)); |
3857 | + __uint(value_size, sizeof(int)); |
3858 | + __uint(max_entries, 100); |
3859 | +} tx_port SEC(".maps"); |
3860 | |
3861 | /* Count RX packets, as XDP bpf_prog doesn't get direct TX-success |
3862 | * feedback. Redirect TX errors can be caught via a tracepoint. |
3863 | */ |
3864 | -struct bpf_map_def SEC("maps") rxcnt = { |
3865 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3866 | - .key_size = sizeof(u32), |
3867 | - .value_size = sizeof(long), |
3868 | - .max_entries = 1, |
3869 | -}; |
3870 | +struct { |
3871 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3872 | + __type(key, u32); |
3873 | + __type(value, long); |
3874 | + __uint(max_entries, 1); |
3875 | +} rxcnt SEC(".maps"); |
3876 | |
3877 | static void swap_src_dst_mac(void *data) |
3878 | { |
3879 | diff --git a/samples/bpf/xdp_router_ipv4_kern.c b/samples/bpf/xdp_router_ipv4_kern.c |
3880 | index 993f56bc7b9a..bf11efc8e949 100644 |
3881 | --- a/samples/bpf/xdp_router_ipv4_kern.c |
3882 | +++ b/samples/bpf/xdp_router_ipv4_kern.c |
3883 | @@ -42,44 +42,44 @@ struct direct_map { |
3884 | }; |
3885 | |
3886 | /* Map for trie implementation*/ |
3887 | -struct bpf_map_def SEC("maps") lpm_map = { |
3888 | - .type = BPF_MAP_TYPE_LPM_TRIE, |
3889 | - .key_size = 8, |
3890 | - .value_size = sizeof(struct trie_value), |
3891 | - .max_entries = 50, |
3892 | - .map_flags = BPF_F_NO_PREALLOC, |
3893 | -}; |
3894 | +struct { |
3895 | + __uint(type, BPF_MAP_TYPE_LPM_TRIE); |
3896 | + __uint(key_size, 8); |
3897 | + __uint(value_size, sizeof(struct trie_value)); |
3898 | + __uint(max_entries, 50); |
3899 | + __uint(map_flags, BPF_F_NO_PREALLOC); |
3900 | +} lpm_map SEC(".maps"); |
3901 | |
3902 | /* Map for counter*/ |
3903 | -struct bpf_map_def SEC("maps") rxcnt = { |
3904 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3905 | - .key_size = sizeof(u32), |
3906 | - .value_size = sizeof(u64), |
3907 | - .max_entries = 256, |
3908 | -}; |
3909 | +struct { |
3910 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3911 | + __type(key, u32); |
3912 | + __type(value, u64); |
3913 | + __uint(max_entries, 256); |
3914 | +} rxcnt SEC(".maps"); |
3915 | |
3916 | /* Map for ARP table*/ |
3917 | -struct bpf_map_def SEC("maps") arp_table = { |
3918 | - .type = BPF_MAP_TYPE_HASH, |
3919 | - .key_size = sizeof(__be32), |
3920 | - .value_size = sizeof(__be64), |
3921 | - .max_entries = 50, |
3922 | -}; |
3923 | +struct { |
3924 | + __uint(type, BPF_MAP_TYPE_HASH); |
3925 | + __type(key, __be32); |
3926 | + __type(value, __be64); |
3927 | + __uint(max_entries, 50); |
3928 | +} arp_table SEC(".maps"); |
3929 | |
3930 | /* Map to keep the exact match entries in the route table*/ |
3931 | -struct bpf_map_def SEC("maps") exact_match = { |
3932 | - .type = BPF_MAP_TYPE_HASH, |
3933 | - .key_size = sizeof(__be32), |
3934 | - .value_size = sizeof(struct direct_map), |
3935 | - .max_entries = 50, |
3936 | -}; |
3937 | - |
3938 | -struct bpf_map_def SEC("maps") tx_port = { |
3939 | - .type = BPF_MAP_TYPE_DEVMAP, |
3940 | - .key_size = sizeof(int), |
3941 | - .value_size = sizeof(int), |
3942 | - .max_entries = 100, |
3943 | -}; |
3944 | +struct { |
3945 | + __uint(type, BPF_MAP_TYPE_HASH); |
3946 | + __type(key, __be32); |
3947 | + __type(value, struct direct_map); |
3948 | + __uint(max_entries, 50); |
3949 | +} exact_match SEC(".maps"); |
3950 | + |
3951 | +struct { |
3952 | + __uint(type, BPF_MAP_TYPE_DEVMAP); |
3953 | + __uint(key_size, sizeof(int)); |
3954 | + __uint(value_size, sizeof(int)); |
3955 | + __uint(max_entries, 100); |
3956 | +} tx_port SEC(".maps"); |
3957 | |
3958 | /* Function to set source and destination mac of the packet */ |
3959 | static inline void set_src_dst_mac(void *data, void *src, void *dst) |
3960 | diff --git a/samples/bpf/xdp_rxq_info_kern.c b/samples/bpf/xdp_rxq_info_kern.c |
3961 | index 222a83eed1cb..272d0f82a6b5 100644 |
3962 | --- a/samples/bpf/xdp_rxq_info_kern.c |
3963 | +++ b/samples/bpf/xdp_rxq_info_kern.c |
3964 | @@ -23,12 +23,13 @@ enum cfg_options_flags { |
3965 | READ_MEM = 0x1U, |
3966 | SWAP_MAC = 0x2U, |
3967 | }; |
3968 | -struct bpf_map_def SEC("maps") config_map = { |
3969 | - .type = BPF_MAP_TYPE_ARRAY, |
3970 | - .key_size = sizeof(int), |
3971 | - .value_size = sizeof(struct config), |
3972 | - .max_entries = 1, |
3973 | -}; |
3974 | + |
3975 | +struct { |
3976 | + __uint(type, BPF_MAP_TYPE_ARRAY); |
3977 | + __type(key, int); |
3978 | + __type(value, struct config); |
3979 | + __uint(max_entries, 1); |
3980 | +} config_map SEC(".maps"); |
3981 | |
3982 | /* Common stats data record (shared with userspace) */ |
3983 | struct datarec { |
3984 | @@ -36,22 +37,22 @@ struct datarec { |
3985 | __u64 issue; |
3986 | }; |
3987 | |
3988 | -struct bpf_map_def SEC("maps") stats_global_map = { |
3989 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
3990 | - .key_size = sizeof(u32), |
3991 | - .value_size = sizeof(struct datarec), |
3992 | - .max_entries = 1, |
3993 | -}; |
3994 | +struct { |
3995 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
3996 | + __type(key, u32); |
3997 | + __type(value, struct datarec); |
3998 | + __uint(max_entries, 1); |
3999 | +} stats_global_map SEC(".maps"); |
4000 | |
4001 | #define MAX_RXQs 64 |
4002 | |
4003 | /* Stats per rx_queue_index (per CPU) */ |
4004 | -struct bpf_map_def SEC("maps") rx_queue_index_map = { |
4005 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
4006 | - .key_size = sizeof(u32), |
4007 | - .value_size = sizeof(struct datarec), |
4008 | - .max_entries = MAX_RXQs + 1, |
4009 | -}; |
4010 | +struct { |
4011 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
4012 | + __type(key, u32); |
4013 | + __type(value, struct datarec); |
4014 | + __uint(max_entries, MAX_RXQs + 1); |
4015 | +} rx_queue_index_map SEC(".maps"); |
4016 | |
4017 | static __always_inline |
4018 | void swap_src_dst_mac(void *data) |
4019 | diff --git a/samples/bpf/xdp_rxq_info_user.c b/samples/bpf/xdp_rxq_info_user.c |
4020 | index c7e4e45d824a..b88df17853b8 100644 |
4021 | --- a/samples/bpf/xdp_rxq_info_user.c |
4022 | +++ b/samples/bpf/xdp_rxq_info_user.c |
4023 | @@ -489,9 +489,9 @@ int main(int argc, char **argv) |
4024 | if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) |
4025 | return EXIT_FAIL; |
4026 | |
4027 | - map = bpf_map__next(NULL, obj); |
4028 | - stats_global_map = bpf_map__next(map, obj); |
4029 | - rx_queue_index_map = bpf_map__next(stats_global_map, obj); |
4030 | + map = bpf_object__find_map_by_name(obj, "config_map"); |
4031 | + stats_global_map = bpf_object__find_map_by_name(obj, "stats_global_map"); |
4032 | + rx_queue_index_map = bpf_object__find_map_by_name(obj, "rx_queue_index_map"); |
4033 | if (!map || !stats_global_map || !rx_queue_index_map) { |
4034 | printf("finding a map in obj file failed\n"); |
4035 | return EXIT_FAIL; |
4036 | diff --git a/samples/bpf/xdp_tx_iptunnel_kern.c b/samples/bpf/xdp_tx_iptunnel_kern.c |
4037 | index 0f4f6e8c8611..6db450a5c1ca 100644 |
4038 | --- a/samples/bpf/xdp_tx_iptunnel_kern.c |
4039 | +++ b/samples/bpf/xdp_tx_iptunnel_kern.c |
4040 | @@ -19,19 +19,19 @@ |
4041 | #include "bpf_helpers.h" |
4042 | #include "xdp_tx_iptunnel_common.h" |
4043 | |
4044 | -struct bpf_map_def SEC("maps") rxcnt = { |
4045 | - .type = BPF_MAP_TYPE_PERCPU_ARRAY, |
4046 | - .key_size = sizeof(__u32), |
4047 | - .value_size = sizeof(__u64), |
4048 | - .max_entries = 256, |
4049 | -}; |
4050 | - |
4051 | -struct bpf_map_def SEC("maps") vip2tnl = { |
4052 | - .type = BPF_MAP_TYPE_HASH, |
4053 | - .key_size = sizeof(struct vip), |
4054 | - .value_size = sizeof(struct iptnl_info), |
4055 | - .max_entries = MAX_IPTNL_ENTRIES, |
4056 | -}; |
4057 | +struct { |
4058 | + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
4059 | + __type(key, __u32); |
4060 | + __type(value, __u64); |
4061 | + __uint(max_entries, 256); |
4062 | +} rxcnt SEC(".maps"); |
4063 | + |
4064 | +struct { |
4065 | + __uint(type, BPF_MAP_TYPE_HASH); |
4066 | + __type(key, struct vip); |
4067 | + __type(value, struct iptnl_info); |
4068 | + __uint(max_entries, MAX_IPTNL_ENTRIES); |
4069 | +} vip2tnl SEC(".maps"); |
4070 | |
4071 | static __always_inline void count_tx(u32 protocol) |
4072 | { |
4073 | diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh |
4074 | index 2998ddb323e3..436379940356 100755 |
4075 | --- a/scripts/link-vmlinux.sh |
4076 | +++ b/scripts/link-vmlinux.sh |
4077 | @@ -127,8 +127,9 @@ gen_btf() |
4078 | cut -d, -f1 | cut -d' ' -f2) |
4079 | bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \ |
4080 | awk '{print $4}') |
4081 | - ${OBJCOPY} --set-section-flags .BTF=alloc -O binary \ |
4082 | - --only-section=.BTF ${1} .btf.vmlinux.bin 2>/dev/null |
4083 | + ${OBJCOPY} --change-section-address .BTF=0 \ |
4084 | + --set-section-flags .BTF=alloc -O binary \ |
4085 | + --only-section=.BTF ${1} .btf.vmlinux.bin |
4086 | ${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \ |
4087 | --rename-section .data=.BTF .btf.vmlinux.bin ${2} |
4088 | } |
4089 | diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c |
4090 | index cbb933532981..9d0485959308 100644 |
4091 | --- a/tools/lib/bpf/bpf.c |
4092 | +++ b/tools/lib/bpf/bpf.c |
4093 | @@ -189,7 +189,7 @@ static void * |
4094 | alloc_zero_tailing_info(const void *orecord, __u32 cnt, |
4095 | __u32 actual_rec_size, __u32 expected_rec_size) |
4096 | { |
4097 | - __u64 info_len = actual_rec_size * cnt; |
4098 | + __u64 info_len = (__u64)actual_rec_size * cnt; |
4099 | void *info, *nrecord; |
4100 | int i; |
4101 | |
4102 | diff --git a/tools/lib/bpf/bpf_prog_linfo.c b/tools/lib/bpf/bpf_prog_linfo.c |
4103 | index 8c67561c93b0..3ed1a27b5f7c 100644 |
4104 | --- a/tools/lib/bpf/bpf_prog_linfo.c |
4105 | +++ b/tools/lib/bpf/bpf_prog_linfo.c |
4106 | @@ -101,6 +101,7 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) |
4107 | { |
4108 | struct bpf_prog_linfo *prog_linfo; |
4109 | __u32 nr_linfo, nr_jited_func; |
4110 | + __u64 data_sz; |
4111 | |
4112 | nr_linfo = info->nr_line_info; |
4113 | |
4114 | @@ -122,11 +123,11 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) |
4115 | /* Copy xlated line_info */ |
4116 | prog_linfo->nr_linfo = nr_linfo; |
4117 | prog_linfo->rec_size = info->line_info_rec_size; |
4118 | - prog_linfo->raw_linfo = malloc(nr_linfo * prog_linfo->rec_size); |
4119 | + data_sz = (__u64)nr_linfo * prog_linfo->rec_size; |
4120 | + prog_linfo->raw_linfo = malloc(data_sz); |
4121 | if (!prog_linfo->raw_linfo) |
4122 | goto err_free; |
4123 | - memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, |
4124 | - nr_linfo * prog_linfo->rec_size); |
4125 | + memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, data_sz); |
4126 | |
4127 | nr_jited_func = info->nr_jited_ksyms; |
4128 | if (!nr_jited_func || |
4129 | @@ -142,13 +143,12 @@ struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) |
4130 | /* Copy jited_line_info */ |
4131 | prog_linfo->nr_jited_func = nr_jited_func; |
4132 | prog_linfo->jited_rec_size = info->jited_line_info_rec_size; |
4133 | - prog_linfo->raw_jited_linfo = malloc(nr_linfo * |
4134 | - prog_linfo->jited_rec_size); |
4135 | + data_sz = (__u64)nr_linfo * prog_linfo->jited_rec_size; |
4136 | + prog_linfo->raw_jited_linfo = malloc(data_sz); |
4137 | if (!prog_linfo->raw_jited_linfo) |
4138 | goto err_free; |
4139 | memcpy(prog_linfo->raw_jited_linfo, |
4140 | - (void *)(long)info->jited_line_info, |
4141 | - nr_linfo * prog_linfo->jited_rec_size); |
4142 | + (void *)(long)info->jited_line_info, data_sz); |
4143 | |
4144 | /* Number of jited_line_info per jited func */ |
4145 | prog_linfo->nr_jited_linfo_per_func = malloc(nr_jited_func * |
4146 | diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c |
4147 | index 1aa189a9112a..d606a358480d 100644 |
4148 | --- a/tools/lib/bpf/btf.c |
4149 | +++ b/tools/lib/bpf/btf.c |
4150 | @@ -269,10 +269,9 @@ __s64 btf__resolve_size(const struct btf *btf, __u32 type_id) |
4151 | t = btf__type_by_id(btf, type_id); |
4152 | } |
4153 | |
4154 | +done: |
4155 | if (size < 0) |
4156 | return -EINVAL; |
4157 | - |
4158 | -done: |
4159 | if (nelems && size > UINT32_MAX / nelems) |
4160 | return -E2BIG; |
4161 | |
4162 | diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c |
4163 | index a267cd0c0ce2..d98838c5820c 100644 |
4164 | --- a/tools/lib/bpf/libbpf.c |
4165 | +++ b/tools/lib/bpf/libbpf.c |
4166 | @@ -3220,6 +3220,7 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj, |
4167 | pr_warning("oom in prog realloc\n"); |
4168 | return -ENOMEM; |
4169 | } |
4170 | + prog->insns = new_insn; |
4171 | |
4172 | if (obj->btf_ext) { |
4173 | err = bpf_program_reloc_btf_ext(prog, obj, |
4174 | @@ -3231,7 +3232,6 @@ bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj, |
4175 | |
4176 | memcpy(new_insn + prog->insns_cnt, text->insns, |
4177 | text->insns_cnt * sizeof(*insn)); |
4178 | - prog->insns = new_insn; |
4179 | prog->main_prog_cnt = prog->insns_cnt; |
4180 | prog->insns_cnt = new_cnt; |
4181 | pr_debug("added %zd insn from %s to prog %s\n", |
4182 | diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c |
4183 | index 70f9e10de286..0c7386b0e42e 100644 |
4184 | --- a/tools/lib/bpf/xsk.c |
4185 | +++ b/tools/lib/bpf/xsk.c |
4186 | @@ -73,6 +73,21 @@ struct xsk_nl_info { |
4187 | int fd; |
4188 | }; |
4189 | |
4190 | +/* Up until and including Linux 5.3 */ |
4191 | +struct xdp_ring_offset_v1 { |
4192 | + __u64 producer; |
4193 | + __u64 consumer; |
4194 | + __u64 desc; |
4195 | +}; |
4196 | + |
4197 | +/* Up until and including Linux 5.3 */ |
4198 | +struct xdp_mmap_offsets_v1 { |
4199 | + struct xdp_ring_offset_v1 rx; |
4200 | + struct xdp_ring_offset_v1 tx; |
4201 | + struct xdp_ring_offset_v1 fr; |
4202 | + struct xdp_ring_offset_v1 cr; |
4203 | +}; |
4204 | + |
4205 | int xsk_umem__fd(const struct xsk_umem *umem) |
4206 | { |
4207 | return umem ? umem->fd : -EINVAL; |
4208 | @@ -133,6 +148,58 @@ static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg, |
4209 | return 0; |
4210 | } |
4211 | |
4212 | +static void xsk_mmap_offsets_v1(struct xdp_mmap_offsets *off) |
4213 | +{ |
4214 | + struct xdp_mmap_offsets_v1 off_v1; |
4215 | + |
4216 | + /* getsockopt on a kernel <= 5.3 has no flags fields. |
4217 | + * Copy over the offsets to the correct places in the >=5.4 format |
4218 | + * and put the flags where they would have been on that kernel. |
4219 | + */ |
4220 | + memcpy(&off_v1, off, sizeof(off_v1)); |
4221 | + |
4222 | + off->rx.producer = off_v1.rx.producer; |
4223 | + off->rx.consumer = off_v1.rx.consumer; |
4224 | + off->rx.desc = off_v1.rx.desc; |
4225 | + off->rx.flags = off_v1.rx.consumer + sizeof(__u32); |
4226 | + |
4227 | + off->tx.producer = off_v1.tx.producer; |
4228 | + off->tx.consumer = off_v1.tx.consumer; |
4229 | + off->tx.desc = off_v1.tx.desc; |
4230 | + off->tx.flags = off_v1.tx.consumer + sizeof(__u32); |
4231 | + |
4232 | + off->fr.producer = off_v1.fr.producer; |
4233 | + off->fr.consumer = off_v1.fr.consumer; |
4234 | + off->fr.desc = off_v1.fr.desc; |
4235 | + off->fr.flags = off_v1.fr.consumer + sizeof(__u32); |
4236 | + |
4237 | + off->cr.producer = off_v1.cr.producer; |
4238 | + off->cr.consumer = off_v1.cr.consumer; |
4239 | + off->cr.desc = off_v1.cr.desc; |
4240 | + off->cr.flags = off_v1.cr.consumer + sizeof(__u32); |
4241 | +} |
4242 | + |
4243 | +static int xsk_get_mmap_offsets(int fd, struct xdp_mmap_offsets *off) |
4244 | +{ |
4245 | + socklen_t optlen; |
4246 | + int err; |
4247 | + |
4248 | + optlen = sizeof(*off); |
4249 | + err = getsockopt(fd, SOL_XDP, XDP_MMAP_OFFSETS, off, &optlen); |
4250 | + if (err) |
4251 | + return err; |
4252 | + |
4253 | + if (optlen == sizeof(*off)) |
4254 | + return 0; |
4255 | + |
4256 | + if (optlen == sizeof(struct xdp_mmap_offsets_v1)) { |
4257 | + xsk_mmap_offsets_v1(off); |
4258 | + return 0; |
4259 | + } |
4260 | + |
4261 | + return -EINVAL; |
4262 | +} |
4263 | + |
4264 | int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area, |
4265 | __u64 size, struct xsk_ring_prod *fill, |
4266 | struct xsk_ring_cons *comp, |
4267 | @@ -141,7 +208,6 @@ int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area, |
4268 | struct xdp_mmap_offsets off; |
4269 | struct xdp_umem_reg mr; |
4270 | struct xsk_umem *umem; |
4271 | - socklen_t optlen; |
4272 | void *map; |
4273 | int err; |
4274 | |
4275 | @@ -190,8 +256,7 @@ int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area, |
4276 | goto out_socket; |
4277 | } |
4278 | |
4279 | - optlen = sizeof(off); |
4280 | - err = getsockopt(umem->fd, SOL_XDP, XDP_MMAP_OFFSETS, &off, &optlen); |
4281 | + err = xsk_get_mmap_offsets(umem->fd, &off); |
4282 | if (err) { |
4283 | err = -errno; |
4284 | goto out_socket; |
4285 | @@ -499,7 +564,6 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname, |
4286 | struct sockaddr_xdp sxdp = {}; |
4287 | struct xdp_mmap_offsets off; |
4288 | struct xsk_socket *xsk; |
4289 | - socklen_t optlen; |
4290 | int err; |
4291 | |
4292 | if (!umem || !xsk_ptr || !rx || !tx) |
4293 | @@ -558,8 +622,7 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname, |
4294 | } |
4295 | } |
4296 | |
4297 | - optlen = sizeof(off); |
4298 | - err = getsockopt(xsk->fd, SOL_XDP, XDP_MMAP_OFFSETS, &off, &optlen); |
4299 | + err = xsk_get_mmap_offsets(xsk->fd, &off); |
4300 | if (err) { |
4301 | err = -errno; |
4302 | goto out_socket; |
4303 | @@ -645,7 +708,6 @@ out_xsk_alloc: |
4304 | int xsk_umem__delete(struct xsk_umem *umem) |
4305 | { |
4306 | struct xdp_mmap_offsets off; |
4307 | - socklen_t optlen; |
4308 | int err; |
4309 | |
4310 | if (!umem) |
4311 | @@ -654,8 +716,7 @@ int xsk_umem__delete(struct xsk_umem *umem) |
4312 | if (umem->refcount) |
4313 | return -EBUSY; |
4314 | |
4315 | - optlen = sizeof(off); |
4316 | - err = getsockopt(umem->fd, SOL_XDP, XDP_MMAP_OFFSETS, &off, &optlen); |
4317 | + err = xsk_get_mmap_offsets(umem->fd, &off); |
4318 | if (!err) { |
4319 | munmap(umem->fill->ring - off.fr.desc, |
4320 | off.fr.desc + umem->config.fill_size * sizeof(__u64)); |
4321 | @@ -673,7 +734,6 @@ void xsk_socket__delete(struct xsk_socket *xsk) |
4322 | { |
4323 | size_t desc_sz = sizeof(struct xdp_desc); |
4324 | struct xdp_mmap_offsets off; |
4325 | - socklen_t optlen; |
4326 | int err; |
4327 | |
4328 | if (!xsk) |
4329 | @@ -684,8 +744,7 @@ void xsk_socket__delete(struct xsk_socket *xsk) |
4330 | close(xsk->prog_fd); |
4331 | } |
4332 | |
4333 | - optlen = sizeof(off); |
4334 | - err = getsockopt(xsk->fd, SOL_XDP, XDP_MMAP_OFFSETS, &off, &optlen); |
4335 | + err = xsk_get_mmap_offsets(xsk->fd, &off); |
4336 | if (!err) { |
4337 | if (xsk->rx) { |
4338 | munmap(xsk->rx->ring - off.rx.desc, |
4339 | diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c |
4340 | index 888814df758d..ea277ce63a46 100644 |
4341 | --- a/tools/perf/util/machine.c |
4342 | +++ b/tools/perf/util/machine.c |
4343 | @@ -767,24 +767,6 @@ int machine__process_ksymbol(struct machine *machine __maybe_unused, |
4344 | return machine__process_ksymbol_register(machine, event, sample); |
4345 | } |
4346 | |
4347 | -static void dso__adjust_kmod_long_name(struct dso *dso, const char *filename) |
4348 | -{ |
4349 | - const char *dup_filename; |
4350 | - |
4351 | - if (!filename || !dso || !dso->long_name) |
4352 | - return; |
4353 | - if (dso->long_name[0] != '[') |
4354 | - return; |
4355 | - if (!strchr(filename, '/')) |
4356 | - return; |
4357 | - |
4358 | - dup_filename = strdup(filename); |
4359 | - if (!dup_filename) |
4360 | - return; |
4361 | - |
4362 | - dso__set_long_name(dso, dup_filename, true); |
4363 | -} |
4364 | - |
4365 | struct map *machine__findnew_module_map(struct machine *machine, u64 start, |
4366 | const char *filename) |
4367 | { |
4368 | @@ -796,15 +778,8 @@ struct map *machine__findnew_module_map(struct machine *machine, u64 start, |
4369 | return NULL; |
4370 | |
4371 | map = map_groups__find_by_name(&machine->kmaps, m.name); |
4372 | - if (map) { |
4373 | - /* |
4374 | - * If the map's dso is an offline module, give dso__load() |
4375 | - * a chance to find the file path of that module by fixing |
4376 | - * long_name. |
4377 | - */ |
4378 | - dso__adjust_kmod_long_name(map->dso, filename); |
4379 | + if (map) |
4380 | goto out; |
4381 | - } |
4382 | |
4383 | dso = machine__findnew_module_dso(machine, &m, filename); |
4384 | if (dso == NULL) |
4385 | diff --git a/tools/testing/selftests/cgroup/test_freezer.c b/tools/testing/selftests/cgroup/test_freezer.c |
4386 | index 0fc1b6d4b0f9..62a27ab3c2f3 100644 |
4387 | --- a/tools/testing/selftests/cgroup/test_freezer.c |
4388 | +++ b/tools/testing/selftests/cgroup/test_freezer.c |
4389 | @@ -72,6 +72,7 @@ static int cg_prepare_for_wait(const char *cgroup) |
4390 | if (ret == -1) { |
4391 | debug("Error: inotify_add_watch() failed\n"); |
4392 | close(fd); |
4393 | + fd = -1; |
4394 | } |
4395 | |
4396 | return fd; |
4397 | diff --git a/tools/testing/selftests/gen_kselftest_tar.sh b/tools/testing/selftests/gen_kselftest_tar.sh |
4398 | index a27e2eec3586..8b2b6088540d 100755 |
4399 | --- a/tools/testing/selftests/gen_kselftest_tar.sh |
4400 | +++ b/tools/testing/selftests/gen_kselftest_tar.sh |
4401 | @@ -38,16 +38,21 @@ main() |
4402 | esac |
4403 | fi |
4404 | |
4405 | - install_dir=./kselftest |
4406 | + # Create working directory. |
4407 | + dest=`pwd` |
4408 | + install_work="$dest"/kselftest_install |
4409 | + install_name=kselftest |
4410 | + install_dir="$install_work"/"$install_name" |
4411 | + mkdir -p "$install_dir" |
4412 | |
4413 | -# Run install using INSTALL_KSFT_PATH override to generate install |
4414 | -# directory |
4415 | -./kselftest_install.sh |
4416 | -tar $copts kselftest${ext} $install_dir |
4417 | -echo "Kselftest archive kselftest${ext} created!" |
4418 | + # Run install using INSTALL_KSFT_PATH override to generate install |
4419 | + # directory |
4420 | + ./kselftest_install.sh "$install_dir" |
4421 | + (cd "$install_work"; tar $copts "$dest"/kselftest${ext} $install_name) |
4422 | + echo "Kselftest archive kselftest${ext} created!" |
4423 | |
4424 | -# clean up install directory |
4425 | -rm -rf kselftest |
4426 | + # clean up top-level install work directory |
4427 | + rm -rf "$install_work" |
4428 | } |
4429 | |
4430 | main "$@" |
4431 | diff --git a/tools/testing/selftests/kselftest_install.sh b/tools/testing/selftests/kselftest_install.sh |
4432 | index e2e1911d62d5..407af7da7037 100755 |
4433 | --- a/tools/testing/selftests/kselftest_install.sh |
4434 | +++ b/tools/testing/selftests/kselftest_install.sh |
4435 | @@ -6,30 +6,30 @@ |
4436 | # Author: Shuah Khan <shuahkh@osg.samsung.com> |
4437 | # Copyright (C) 2015 Samsung Electronics Co., Ltd. |
4438 | |
4439 | -install_loc=`pwd` |
4440 | - |
4441 | main() |
4442 | { |
4443 | - if [ $(basename $install_loc) != "selftests" ]; then |
4444 | + base_dir=`pwd` |
4445 | + install_dir="$base_dir"/kselftest_install |
4446 | + |
4447 | + # Make sure we're in the selftests top-level directory. |
4448 | + if [ $(basename "$base_dir") != "selftests" ]; then |
4449 | echo "$0: Please run it in selftests directory ..." |
4450 | exit 1; |
4451 | fi |
4452 | + |
4453 | + # Only allow installation into an existing location. |
4454 | if [ "$#" -eq 0 ]; then |
4455 | - echo "$0: Installing in default location - $install_loc ..." |
4456 | + echo "$0: Installing in default location - $install_dir ..." |
4457 | elif [ ! -d "$1" ]; then |
4458 | echo "$0: $1 doesn't exist!!" |
4459 | exit 1; |
4460 | else |
4461 | - install_loc=$1 |
4462 | - echo "$0: Installing in specified location - $install_loc ..." |
4463 | + install_dir="$1" |
4464 | + echo "$0: Installing in specified location - $install_dir ..." |
4465 | fi |
4466 | |
4467 | - install_dir=$install_loc/kselftest_install |
4468 | - |
4469 | -# Create install directory |
4470 | - mkdir -p $install_dir |
4471 | -# Build tests |
4472 | - KSFT_INSTALL_PATH=$install_dir make install |
4473 | + # Build tests |
4474 | + KSFT_INSTALL_PATH="$install_dir" make install |
4475 | } |
4476 | |
4477 | main "$@" |