Contents of /trunk/kernel-alx/patches-4.9/0170-4.9.71-all-fixes.patch
Parent Directory | Revision Log
Revision 3055 -
(show annotations)
(download)
Wed Dec 20 11:50:17 2017 UTC (6 years, 9 months ago) by niro
File size: 181157 byte(s)
Wed Dec 20 11:50:17 2017 UTC (6 years, 9 months ago) by niro
File size: 181157 byte(s)
-linux-4.9.71
1 | diff --git a/Makefile b/Makefile |
2 | index 7ad3271a1a1d..5f2736bb4877 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 70 |
9 | +SUBLEVEL = 71 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile |
14 | index 3635b8662724..92110c2c6c59 100644 |
15 | --- a/arch/arm64/Makefile |
16 | +++ b/arch/arm64/Makefile |
17 | @@ -14,8 +14,12 @@ LDFLAGS_vmlinux :=-p --no-undefined -X |
18 | CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET) |
19 | GZFLAGS :=-9 |
20 | |
21 | -ifneq ($(CONFIG_RELOCATABLE),) |
22 | -LDFLAGS_vmlinux += -pie -shared -Bsymbolic |
23 | +ifeq ($(CONFIG_RELOCATABLE), y) |
24 | +# Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour |
25 | +# for relative relocs, since this leads to better Image compression |
26 | +# with the relocation offsets always being zero. |
27 | +LDFLAGS_vmlinux += -pie -shared -Bsymbolic \ |
28 | + $(call ld-option, --no-apply-dynamic-relocs) |
29 | endif |
30 | |
31 | ifeq ($(CONFIG_ARM64_ERRATUM_843419),y) |
32 | diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig |
33 | index 3c1bd640042a..88c4b77ec8d2 100644 |
34 | --- a/arch/blackfin/Kconfig |
35 | +++ b/arch/blackfin/Kconfig |
36 | @@ -319,11 +319,14 @@ config BF53x |
37 | |
38 | config GPIO_ADI |
39 | def_bool y |
40 | + depends on !PINCTRL |
41 | depends on (BF51x || BF52x || BF53x || BF538 || BF539 || BF561) |
42 | |
43 | -config PINCTRL |
44 | +config PINCTRL_BLACKFIN_ADI2 |
45 | def_bool y |
46 | - depends on BF54x || BF60x |
47 | + depends on (BF54x || BF60x) |
48 | + select PINCTRL |
49 | + select PINCTRL_ADI2 |
50 | |
51 | config MEM_MT48LC64M4A2FB_7E |
52 | bool |
53 | diff --git a/arch/blackfin/Kconfig.debug b/arch/blackfin/Kconfig.debug |
54 | index f3337ee03621..a93cf06a4d6f 100644 |
55 | --- a/arch/blackfin/Kconfig.debug |
56 | +++ b/arch/blackfin/Kconfig.debug |
57 | @@ -17,6 +17,7 @@ config DEBUG_VERBOSE |
58 | |
59 | config DEBUG_MMRS |
60 | tristate "Generate Blackfin MMR tree" |
61 | + depends on !PINCTRL |
62 | select DEBUG_FS |
63 | help |
64 | Create a tree of Blackfin MMRs via the debugfs tree. If |
65 | diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h |
66 | index 140faa16685a..1311e6b13991 100644 |
67 | --- a/arch/openrisc/include/asm/uaccess.h |
68 | +++ b/arch/openrisc/include/asm/uaccess.h |
69 | @@ -211,7 +211,7 @@ do { \ |
70 | case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \ |
71 | case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \ |
72 | case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \ |
73 | - case 8: __get_user_asm2(x, ptr, retval); \ |
74 | + case 8: __get_user_asm2(x, ptr, retval); break; \ |
75 | default: (x) = __get_user_bad(); \ |
76 | } \ |
77 | } while (0) |
78 | diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c |
79 | index 7b2ca16b1eb4..991c6a517ddc 100644 |
80 | --- a/arch/powerpc/perf/hv-24x7.c |
81 | +++ b/arch/powerpc/perf/hv-24x7.c |
82 | @@ -516,7 +516,7 @@ static int memord(const void *d1, size_t s1, const void *d2, size_t s2) |
83 | { |
84 | if (s1 < s2) |
85 | return 1; |
86 | - if (s2 > s1) |
87 | + if (s1 > s2) |
88 | return -1; |
89 | |
90 | return memcmp(d1, d2, s1); |
91 | diff --git a/arch/powerpc/platforms/powernv/opal-async.c b/arch/powerpc/platforms/powernv/opal-async.c |
92 | index 83bebeec0fea..0f7b16e29347 100644 |
93 | --- a/arch/powerpc/platforms/powernv/opal-async.c |
94 | +++ b/arch/powerpc/platforms/powernv/opal-async.c |
95 | @@ -39,18 +39,18 @@ int __opal_async_get_token(void) |
96 | int token; |
97 | |
98 | spin_lock_irqsave(&opal_async_comp_lock, flags); |
99 | - token = find_first_bit(opal_async_complete_map, opal_max_async_tokens); |
100 | + token = find_first_zero_bit(opal_async_token_map, opal_max_async_tokens); |
101 | if (token >= opal_max_async_tokens) { |
102 | token = -EBUSY; |
103 | goto out; |
104 | } |
105 | |
106 | - if (__test_and_set_bit(token, opal_async_token_map)) { |
107 | + if (!__test_and_clear_bit(token, opal_async_complete_map)) { |
108 | token = -EBUSY; |
109 | goto out; |
110 | } |
111 | |
112 | - __clear_bit(token, opal_async_complete_map); |
113 | + __set_bit(token, opal_async_token_map); |
114 | |
115 | out: |
116 | spin_unlock_irqrestore(&opal_async_comp_lock, flags); |
117 | diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c |
118 | index efe8b6bb168b..b33faa0015cc 100644 |
119 | --- a/arch/powerpc/platforms/powernv/setup.c |
120 | +++ b/arch/powerpc/platforms/powernv/setup.c |
121 | @@ -289,7 +289,7 @@ static unsigned long pnv_get_proc_freq(unsigned int cpu) |
122 | { |
123 | unsigned long ret_freq; |
124 | |
125 | - ret_freq = cpufreq_quick_get(cpu) * 1000ul; |
126 | + ret_freq = cpufreq_get(cpu) * 1000ul; |
127 | |
128 | /* |
129 | * If the backend cpufreq driver does not exist, |
130 | diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c |
131 | index f267ee0afc08..716353b247de 100644 |
132 | --- a/arch/powerpc/sysdev/ipic.c |
133 | +++ b/arch/powerpc/sysdev/ipic.c |
134 | @@ -845,12 +845,12 @@ void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq) |
135 | |
136 | u32 ipic_get_mcp_status(void) |
137 | { |
138 | - return ipic_read(primary_ipic->regs, IPIC_SERMR); |
139 | + return ipic_read(primary_ipic->regs, IPIC_SERSR); |
140 | } |
141 | |
142 | void ipic_clear_mcp_status(u32 mask) |
143 | { |
144 | - ipic_write(primary_ipic->regs, IPIC_SERMR, mask); |
145 | + ipic_write(primary_ipic->regs, IPIC_SERSR, mask); |
146 | } |
147 | |
148 | /* Return an interrupt vector or 0 if no interrupt is pending. */ |
149 | diff --git a/arch/x86/crypto/salsa20_glue.c b/arch/x86/crypto/salsa20_glue.c |
150 | index 399a29d067d6..cb91a64a99e7 100644 |
151 | --- a/arch/x86/crypto/salsa20_glue.c |
152 | +++ b/arch/x86/crypto/salsa20_glue.c |
153 | @@ -59,13 +59,6 @@ static int encrypt(struct blkcipher_desc *desc, |
154 | |
155 | salsa20_ivsetup(ctx, walk.iv); |
156 | |
157 | - if (likely(walk.nbytes == nbytes)) |
158 | - { |
159 | - salsa20_encrypt_bytes(ctx, walk.src.virt.addr, |
160 | - walk.dst.virt.addr, nbytes); |
161 | - return blkcipher_walk_done(desc, &walk, 0); |
162 | - } |
163 | - |
164 | while (walk.nbytes >= 64) { |
165 | salsa20_encrypt_bytes(ctx, walk.src.virt.addr, |
166 | walk.dst.virt.addr, |
167 | diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c |
168 | index b89bef95f63b..11cc600f4df0 100644 |
169 | --- a/arch/x86/kernel/acpi/boot.c |
170 | +++ b/arch/x86/kernel/acpi/boot.c |
171 | @@ -720,7 +720,7 @@ static void __init acpi_set_irq_model_ioapic(void) |
172 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
173 | #include <acpi/processor.h> |
174 | |
175 | -int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
176 | +static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
177 | { |
178 | #ifdef CONFIG_ACPI_NUMA |
179 | int nid; |
180 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
181 | index 9aa62ab13ae8..a929ca03b7ed 100644 |
182 | --- a/arch/x86/kvm/vmx.c |
183 | +++ b/arch/x86/kvm/vmx.c |
184 | @@ -9543,10 +9543,8 @@ static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu, |
185 | return false; |
186 | |
187 | page = nested_get_page(vcpu, vmcs12->msr_bitmap); |
188 | - if (!page) { |
189 | - WARN_ON(1); |
190 | + if (!page) |
191 | return false; |
192 | - } |
193 | msr_bitmap_l1 = (unsigned long *)kmap(page); |
194 | if (!msr_bitmap_l1) { |
195 | nested_release_page_clean(page); |
196 | diff --git a/block/badblocks.c b/block/badblocks.c |
197 | index 6ebcef282314..2fe6c117ac96 100644 |
198 | --- a/block/badblocks.c |
199 | +++ b/block/badblocks.c |
200 | @@ -178,7 +178,7 @@ int badblocks_set(struct badblocks *bb, sector_t s, int sectors, |
201 | |
202 | if (bb->shift < 0) |
203 | /* badblocks are disabled */ |
204 | - return 0; |
205 | + return 1; |
206 | |
207 | if (bb->shift) { |
208 | /* round the start down, and the end up */ |
209 | diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c |
210 | index dcf5ce3ba4bf..4bc701b32ce2 100644 |
211 | --- a/block/blk-mq-tag.c |
212 | +++ b/block/blk-mq-tag.c |
213 | @@ -311,6 +311,9 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set) |
214 | for (i = 0; i < set->nr_hw_queues; i++) { |
215 | struct blk_mq_tags *tags = set->tags[i]; |
216 | |
217 | + if (!tags) |
218 | + continue; |
219 | + |
220 | for (j = 0; j < tags->nr_tags; j++) { |
221 | if (!tags->rqs[j]) |
222 | continue; |
223 | diff --git a/crypto/hmac.c b/crypto/hmac.c |
224 | index 72e38c098bb3..ba07fb6221ae 100644 |
225 | --- a/crypto/hmac.c |
226 | +++ b/crypto/hmac.c |
227 | @@ -194,11 +194,15 @@ static int hmac_create(struct crypto_template *tmpl, struct rtattr **tb) |
228 | salg = shash_attr_alg(tb[1], 0, 0); |
229 | if (IS_ERR(salg)) |
230 | return PTR_ERR(salg); |
231 | + alg = &salg->base; |
232 | |
233 | + /* The underlying hash algorithm must be unkeyed */ |
234 | err = -EINVAL; |
235 | + if (crypto_shash_alg_has_setkey(salg)) |
236 | + goto out_put_alg; |
237 | + |
238 | ds = salg->digestsize; |
239 | ss = salg->statesize; |
240 | - alg = &salg->base; |
241 | if (ds > alg->cra_blocksize || |
242 | ss < alg->cra_blocksize) |
243 | goto out_put_alg; |
244 | diff --git a/crypto/rsa_helper.c b/crypto/rsa_helper.c |
245 | index 0b66dc824606..cad395d70d78 100644 |
246 | --- a/crypto/rsa_helper.c |
247 | +++ b/crypto/rsa_helper.c |
248 | @@ -30,7 +30,7 @@ int rsa_get_n(void *context, size_t hdrlen, unsigned char tag, |
249 | return -EINVAL; |
250 | |
251 | if (fips_enabled) { |
252 | - while (!*ptr && n_sz) { |
253 | + while (n_sz && !*ptr) { |
254 | ptr++; |
255 | n_sz--; |
256 | } |
257 | diff --git a/crypto/salsa20_generic.c b/crypto/salsa20_generic.c |
258 | index f550b5d94630..d7da0eea5622 100644 |
259 | --- a/crypto/salsa20_generic.c |
260 | +++ b/crypto/salsa20_generic.c |
261 | @@ -188,13 +188,6 @@ static int encrypt(struct blkcipher_desc *desc, |
262 | |
263 | salsa20_ivsetup(ctx, walk.iv); |
264 | |
265 | - if (likely(walk.nbytes == nbytes)) |
266 | - { |
267 | - salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, |
268 | - walk.src.virt.addr, nbytes); |
269 | - return blkcipher_walk_done(desc, &walk, 0); |
270 | - } |
271 | - |
272 | while (walk.nbytes >= 64) { |
273 | salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, |
274 | walk.src.virt.addr, |
275 | diff --git a/crypto/shash.c b/crypto/shash.c |
276 | index 4d8a671d1614..9bd5044d467b 100644 |
277 | --- a/crypto/shash.c |
278 | +++ b/crypto/shash.c |
279 | @@ -24,11 +24,12 @@ |
280 | |
281 | static const struct crypto_type crypto_shash_type; |
282 | |
283 | -static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, |
284 | - unsigned int keylen) |
285 | +int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, |
286 | + unsigned int keylen) |
287 | { |
288 | return -ENOSYS; |
289 | } |
290 | +EXPORT_SYMBOL_GPL(shash_no_setkey); |
291 | |
292 | static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, |
293 | unsigned int keylen) |
294 | diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c |
295 | index ae22f05d5936..e3af318af2db 100644 |
296 | --- a/crypto/tcrypt.c |
297 | +++ b/crypto/tcrypt.c |
298 | @@ -342,7 +342,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, |
299 | } |
300 | |
301 | sg_init_aead(sg, xbuf, |
302 | - *b_size + (enc ? authsize : 0)); |
303 | + *b_size + (enc ? 0 : authsize)); |
304 | |
305 | sg_init_aead(sgout, xoutbuf, |
306 | *b_size + (enc ? authsize : 0)); |
307 | @@ -350,7 +350,9 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, |
308 | sg_set_buf(&sg[0], assoc, aad_size); |
309 | sg_set_buf(&sgout[0], assoc, aad_size); |
310 | |
311 | - aead_request_set_crypt(req, sg, sgout, *b_size, iv); |
312 | + aead_request_set_crypt(req, sg, sgout, |
313 | + *b_size + (enc ? 0 : authsize), |
314 | + iv); |
315 | aead_request_set_ad(req, aad_size); |
316 | |
317 | if (secs) |
318 | diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c |
319 | index 3de3b6b8f0f1..f43a586236ea 100644 |
320 | --- a/drivers/acpi/acpi_processor.c |
321 | +++ b/drivers/acpi/acpi_processor.c |
322 | @@ -182,11 +182,6 @@ int __weak arch_register_cpu(int cpu) |
323 | |
324 | void __weak arch_unregister_cpu(int cpu) {} |
325 | |
326 | -int __weak acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
327 | -{ |
328 | - return -ENODEV; |
329 | -} |
330 | - |
331 | static int acpi_processor_hotadd_init(struct acpi_processor *pr) |
332 | { |
333 | unsigned long long sta; |
334 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c |
335 | index 56190d00fd87..0a3ca20f99af 100644 |
336 | --- a/drivers/acpi/bus.c |
337 | +++ b/drivers/acpi/bus.c |
338 | @@ -1197,7 +1197,6 @@ static int __init acpi_init(void) |
339 | acpi_wakeup_device_init(); |
340 | acpi_debugger_init(); |
341 | acpi_setup_sb_notify_handler(); |
342 | - acpi_set_processor_mapping(); |
343 | return 0; |
344 | } |
345 | |
346 | diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c |
347 | index 5c78ee1860b0..fd59ae871db3 100644 |
348 | --- a/drivers/acpi/processor_core.c |
349 | +++ b/drivers/acpi/processor_core.c |
350 | @@ -280,79 +280,6 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) |
351 | } |
352 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); |
353 | |
354 | -#ifdef CONFIG_ACPI_HOTPLUG_CPU |
355 | -static bool __init |
356 | -map_processor(acpi_handle handle, phys_cpuid_t *phys_id, int *cpuid) |
357 | -{ |
358 | - int type, id; |
359 | - u32 acpi_id; |
360 | - acpi_status status; |
361 | - acpi_object_type acpi_type; |
362 | - unsigned long long tmp; |
363 | - union acpi_object object = { 0 }; |
364 | - struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; |
365 | - |
366 | - status = acpi_get_type(handle, &acpi_type); |
367 | - if (ACPI_FAILURE(status)) |
368 | - return false; |
369 | - |
370 | - switch (acpi_type) { |
371 | - case ACPI_TYPE_PROCESSOR: |
372 | - status = acpi_evaluate_object(handle, NULL, NULL, &buffer); |
373 | - if (ACPI_FAILURE(status)) |
374 | - return false; |
375 | - acpi_id = object.processor.proc_id; |
376 | - |
377 | - /* validate the acpi_id */ |
378 | - if(acpi_processor_validate_proc_id(acpi_id)) |
379 | - return false; |
380 | - break; |
381 | - case ACPI_TYPE_DEVICE: |
382 | - status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); |
383 | - if (ACPI_FAILURE(status)) |
384 | - return false; |
385 | - acpi_id = tmp; |
386 | - break; |
387 | - default: |
388 | - return false; |
389 | - } |
390 | - |
391 | - type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; |
392 | - |
393 | - *phys_id = __acpi_get_phys_id(handle, type, acpi_id, false); |
394 | - id = acpi_map_cpuid(*phys_id, acpi_id); |
395 | - |
396 | - if (id < 0) |
397 | - return false; |
398 | - *cpuid = id; |
399 | - return true; |
400 | -} |
401 | - |
402 | -static acpi_status __init |
403 | -set_processor_node_mapping(acpi_handle handle, u32 lvl, void *context, |
404 | - void **rv) |
405 | -{ |
406 | - phys_cpuid_t phys_id; |
407 | - int cpu_id; |
408 | - |
409 | - if (!map_processor(handle, &phys_id, &cpu_id)) |
410 | - return AE_ERROR; |
411 | - |
412 | - acpi_map_cpu2node(handle, cpu_id, phys_id); |
413 | - return AE_OK; |
414 | -} |
415 | - |
416 | -void __init acpi_set_processor_mapping(void) |
417 | -{ |
418 | - /* Set persistent cpu <-> node mapping for all processors. */ |
419 | - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, |
420 | - ACPI_UINT32_MAX, set_processor_node_mapping, |
421 | - NULL, NULL, NULL); |
422 | -} |
423 | -#else |
424 | -void __init acpi_set_processor_mapping(void) {} |
425 | -#endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
426 | - |
427 | #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC |
428 | static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base, |
429 | u64 *phys_addr, int *ioapic_id) |
430 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
431 | index 693028659ccc..3ae950c82922 100644 |
432 | --- a/drivers/bluetooth/btusb.c |
433 | +++ b/drivers/bluetooth/btusb.c |
434 | @@ -1059,6 +1059,10 @@ static int btusb_open(struct hci_dev *hdev) |
435 | } |
436 | |
437 | data->intf->needs_remote_wakeup = 1; |
438 | + /* device specific wakeup source enabled and required for USB |
439 | + * remote wakeup while host is suspended |
440 | + */ |
441 | + device_wakeup_enable(&data->udev->dev); |
442 | |
443 | if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) |
444 | goto done; |
445 | @@ -1122,6 +1126,7 @@ static int btusb_close(struct hci_dev *hdev) |
446 | goto failed; |
447 | |
448 | data->intf->needs_remote_wakeup = 0; |
449 | + device_wakeup_disable(&data->udev->dev); |
450 | usb_autopm_put_interface(data->intf); |
451 | |
452 | failed: |
453 | diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c |
454 | index f0249899fc96..45d7ecc66b22 100644 |
455 | --- a/drivers/bus/arm-ccn.c |
456 | +++ b/drivers/bus/arm-ccn.c |
457 | @@ -1280,6 +1280,7 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) |
458 | |
459 | /* Perf driver registration */ |
460 | ccn->dt.pmu = (struct pmu) { |
461 | + .module = THIS_MODULE, |
462 | .attr_groups = arm_ccn_pmu_attr_groups, |
463 | .task_ctx_nr = perf_invalid_context, |
464 | .event_init = arm_ccn_pmu_event_init, |
465 | diff --git a/drivers/clk/hisilicon/clk-hi6220.c b/drivers/clk/hisilicon/clk-hi6220.c |
466 | index c0e8e1f196aa..2bfaf22e6ffc 100644 |
467 | --- a/drivers/clk/hisilicon/clk-hi6220.c |
468 | +++ b/drivers/clk/hisilicon/clk-hi6220.c |
469 | @@ -144,7 +144,7 @@ static struct hisi_gate_clock hi6220_separated_gate_clks_sys[] __initdata = { |
470 | { HI6220_BBPPLL_SEL, "bbppll_sel", "pll0_bbp_gate", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 9, 0, }, |
471 | { HI6220_MEDIA_PLL_SRC, "media_pll_src", "pll_media_gate", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 10, 0, }, |
472 | { HI6220_MMC2_SEL, "mmc2_sel", "mmc2_mux1", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 11, 0, }, |
473 | - { HI6220_CS_ATB_SYSPLL, "cs_atb_syspll", "syspll", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 12, 0, }, |
474 | + { HI6220_CS_ATB_SYSPLL, "cs_atb_syspll", "syspll", CLK_SET_RATE_PARENT|CLK_IS_CRITICAL, 0x270, 12, 0, }, |
475 | }; |
476 | |
477 | static struct hisi_mux_clock hi6220_mux_clks_sys[] __initdata = { |
478 | diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c |
479 | index ce8ea10407e4..93a19667003d 100644 |
480 | --- a/drivers/clk/imx/clk-imx6q.c |
481 | +++ b/drivers/clk/imx/clk-imx6q.c |
482 | @@ -487,7 +487,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) |
483 | clk[IMX6QDL_CLK_GPU2D_CORE] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24); |
484 | clk[IMX6QDL_CLK_GPU3D_CORE] = imx_clk_gate2("gpu3d_core", "gpu3d_core_podf", base + 0x6c, 26); |
485 | clk[IMX6QDL_CLK_HDMI_IAHB] = imx_clk_gate2("hdmi_iahb", "ahb", base + 0x70, 0); |
486 | - clk[IMX6QDL_CLK_HDMI_ISFR] = imx_clk_gate2("hdmi_isfr", "video_27m", base + 0x70, 4); |
487 | + clk[IMX6QDL_CLK_HDMI_ISFR] = imx_clk_gate2("hdmi_isfr", "mipi_core_cfg", base + 0x70, 4); |
488 | clk[IMX6QDL_CLK_I2C1] = imx_clk_gate2("i2c1", "ipg_per", base + 0x70, 6); |
489 | clk[IMX6QDL_CLK_I2C2] = imx_clk_gate2("i2c2", "ipg_per", base + 0x70, 8); |
490 | clk[IMX6QDL_CLK_I2C3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10); |
491 | diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h |
492 | index 9f24fcfa304f..e425e50173c5 100644 |
493 | --- a/drivers/clk/mediatek/clk-mtk.h |
494 | +++ b/drivers/clk/mediatek/clk-mtk.h |
495 | @@ -185,6 +185,7 @@ struct mtk_pll_data { |
496 | uint32_t pcw_reg; |
497 | int pcw_shift; |
498 | const struct mtk_pll_div_table *div_table; |
499 | + const char *parent_name; |
500 | }; |
501 | |
502 | void mtk_clk_register_plls(struct device_node *node, |
503 | diff --git a/drivers/clk/mediatek/clk-pll.c b/drivers/clk/mediatek/clk-pll.c |
504 | index 0c2deac17ce9..1502384a3093 100644 |
505 | --- a/drivers/clk/mediatek/clk-pll.c |
506 | +++ b/drivers/clk/mediatek/clk-pll.c |
507 | @@ -302,7 +302,10 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data, |
508 | |
509 | init.name = data->name; |
510 | init.ops = &mtk_pll_ops; |
511 | - init.parent_names = &parent_name; |
512 | + if (data->parent_name) |
513 | + init.parent_names = &data->parent_name; |
514 | + else |
515 | + init.parent_names = &parent_name; |
516 | init.num_parents = 1; |
517 | |
518 | clk = clk_register(NULL, &pll->hw); |
519 | diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c |
520 | index 8e2db5ead8da..af520d81525f 100644 |
521 | --- a/drivers/clk/tegra/clk-tegra30.c |
522 | +++ b/drivers/clk/tegra/clk-tegra30.c |
523 | @@ -963,7 +963,7 @@ static void __init tegra30_super_clk_init(void) |
524 | * U71 divider of cclk_lp. |
525 | */ |
526 | clk = tegra_clk_register_divider("pll_p_out3_cclklp", "pll_p_out3", |
527 | - clk_base + SUPER_CCLKG_DIVIDER, 0, |
528 | + clk_base + SUPER_CCLKLP_DIVIDER, 0, |
529 | TEGRA_DIVIDER_INT, 16, 8, 1, NULL); |
530 | clk_register_clkdev(clk, "pll_p_out3_cclklp", NULL); |
531 | |
532 | diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c |
533 | index 6b535262ac5d..3db94e81bc14 100644 |
534 | --- a/drivers/dma/dmaengine.c |
535 | +++ b/drivers/dma/dmaengine.c |
536 | @@ -1107,12 +1107,14 @@ static struct dmaengine_unmap_pool *__get_unmap_pool(int nr) |
537 | switch (order) { |
538 | case 0 ... 1: |
539 | return &unmap_pool[0]; |
540 | +#if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) |
541 | case 2 ... 4: |
542 | return &unmap_pool[1]; |
543 | case 5 ... 7: |
544 | return &unmap_pool[2]; |
545 | case 8: |
546 | return &unmap_pool[3]; |
547 | +#endif |
548 | default: |
549 | BUG(); |
550 | return NULL; |
551 | diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c |
552 | index fbb75514dfb4..e0bd578a253a 100644 |
553 | --- a/drivers/dma/dmatest.c |
554 | +++ b/drivers/dma/dmatest.c |
555 | @@ -158,6 +158,12 @@ MODULE_PARM_DESC(run, "Run the test (default: false)"); |
556 | #define PATTERN_OVERWRITE 0x20 |
557 | #define PATTERN_COUNT_MASK 0x1f |
558 | |
559 | +/* poor man's completion - we want to use wait_event_freezable() on it */ |
560 | +struct dmatest_done { |
561 | + bool done; |
562 | + wait_queue_head_t *wait; |
563 | +}; |
564 | + |
565 | struct dmatest_thread { |
566 | struct list_head node; |
567 | struct dmatest_info *info; |
568 | @@ -166,6 +172,8 @@ struct dmatest_thread { |
569 | u8 **srcs; |
570 | u8 **dsts; |
571 | enum dma_transaction_type type; |
572 | + wait_queue_head_t done_wait; |
573 | + struct dmatest_done test_done; |
574 | bool done; |
575 | }; |
576 | |
577 | @@ -326,18 +334,25 @@ static unsigned int dmatest_verify(u8 **bufs, unsigned int start, |
578 | return error_count; |
579 | } |
580 | |
581 | -/* poor man's completion - we want to use wait_event_freezable() on it */ |
582 | -struct dmatest_done { |
583 | - bool done; |
584 | - wait_queue_head_t *wait; |
585 | -}; |
586 | |
587 | static void dmatest_callback(void *arg) |
588 | { |
589 | struct dmatest_done *done = arg; |
590 | - |
591 | - done->done = true; |
592 | - wake_up_all(done->wait); |
593 | + struct dmatest_thread *thread = |
594 | + container_of(arg, struct dmatest_thread, done_wait); |
595 | + if (!thread->done) { |
596 | + done->done = true; |
597 | + wake_up_all(done->wait); |
598 | + } else { |
599 | + /* |
600 | + * If thread->done, it means that this callback occurred |
601 | + * after the parent thread has cleaned up. This can |
602 | + * happen in the case that driver doesn't implement |
603 | + * the terminate_all() functionality and a dma operation |
604 | + * did not occur within the timeout period |
605 | + */ |
606 | + WARN(1, "dmatest: Kernel memory may be corrupted!!\n"); |
607 | + } |
608 | } |
609 | |
610 | static unsigned int min_odd(unsigned int x, unsigned int y) |
611 | @@ -408,9 +423,8 @@ static unsigned long long dmatest_KBs(s64 runtime, unsigned long long len) |
612 | */ |
613 | static int dmatest_func(void *data) |
614 | { |
615 | - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_wait); |
616 | struct dmatest_thread *thread = data; |
617 | - struct dmatest_done done = { .wait = &done_wait }; |
618 | + struct dmatest_done *done = &thread->test_done; |
619 | struct dmatest_info *info; |
620 | struct dmatest_params *params; |
621 | struct dma_chan *chan; |
622 | @@ -637,9 +651,9 @@ static int dmatest_func(void *data) |
623 | continue; |
624 | } |
625 | |
626 | - done.done = false; |
627 | + done->done = false; |
628 | tx->callback = dmatest_callback; |
629 | - tx->callback_param = &done; |
630 | + tx->callback_param = done; |
631 | cookie = tx->tx_submit(tx); |
632 | |
633 | if (dma_submit_error(cookie)) { |
634 | @@ -652,21 +666,12 @@ static int dmatest_func(void *data) |
635 | } |
636 | dma_async_issue_pending(chan); |
637 | |
638 | - wait_event_freezable_timeout(done_wait, done.done, |
639 | + wait_event_freezable_timeout(thread->done_wait, done->done, |
640 | msecs_to_jiffies(params->timeout)); |
641 | |
642 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); |
643 | |
644 | - if (!done.done) { |
645 | - /* |
646 | - * We're leaving the timed out dma operation with |
647 | - * dangling pointer to done_wait. To make this |
648 | - * correct, we'll need to allocate wait_done for |
649 | - * each test iteration and perform "who's gonna |
650 | - * free it this time?" dancing. For now, just |
651 | - * leave it dangling. |
652 | - */ |
653 | - WARN(1, "dmatest: Kernel stack may be corrupted!!\n"); |
654 | + if (!done->done) { |
655 | dmaengine_unmap_put(um); |
656 | result("test timed out", total_tests, src_off, dst_off, |
657 | len, 0); |
658 | @@ -747,7 +752,7 @@ static int dmatest_func(void *data) |
659 | dmatest_KBs(runtime, total_len), ret); |
660 | |
661 | /* terminate all transfers on specified channels */ |
662 | - if (ret) |
663 | + if (ret || failed_tests) |
664 | dmaengine_terminate_all(chan); |
665 | |
666 | thread->done = true; |
667 | @@ -807,6 +812,8 @@ static int dmatest_add_threads(struct dmatest_info *info, |
668 | thread->info = info; |
669 | thread->chan = dtc->chan; |
670 | thread->type = type; |
671 | + thread->test_done.wait = &thread->done_wait; |
672 | + init_waitqueue_head(&thread->done_wait); |
673 | smp_wmb(); |
674 | thread->task = kthread_create(dmatest_func, thread, "%s-%s%u", |
675 | dma_chan_name(chan), op, i); |
676 | diff --git a/drivers/dma/ti-dma-crossbar.c b/drivers/dma/ti-dma-crossbar.c |
677 | index 88a00d06def6..43e88d85129e 100644 |
678 | --- a/drivers/dma/ti-dma-crossbar.c |
679 | +++ b/drivers/dma/ti-dma-crossbar.c |
680 | @@ -49,12 +49,12 @@ struct ti_am335x_xbar_data { |
681 | |
682 | struct ti_am335x_xbar_map { |
683 | u16 dma_line; |
684 | - u16 mux_val; |
685 | + u8 mux_val; |
686 | }; |
687 | |
688 | -static inline void ti_am335x_xbar_write(void __iomem *iomem, int event, u16 val) |
689 | +static inline void ti_am335x_xbar_write(void __iomem *iomem, int event, u8 val) |
690 | { |
691 | - writeb_relaxed(val & 0x1f, iomem + event); |
692 | + writeb_relaxed(val, iomem + event); |
693 | } |
694 | |
695 | static void ti_am335x_xbar_free(struct device *dev, void *route_data) |
696 | @@ -105,7 +105,7 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec, |
697 | } |
698 | |
699 | map->dma_line = (u16)dma_spec->args[0]; |
700 | - map->mux_val = (u16)dma_spec->args[2]; |
701 | + map->mux_val = (u8)dma_spec->args[2]; |
702 | |
703 | dma_spec->args[2] = 0; |
704 | dma_spec->args_count = 2; |
705 | diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c |
706 | index 2f48f848865f..2f47c5b5f4cb 100644 |
707 | --- a/drivers/firmware/efi/efi.c |
708 | +++ b/drivers/firmware/efi/efi.c |
709 | @@ -384,7 +384,6 @@ int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md) |
710 | return 0; |
711 | } |
712 | } |
713 | - pr_err_once("requested map not found.\n"); |
714 | return -ENOENT; |
715 | } |
716 | |
717 | diff --git a/drivers/firmware/efi/esrt.c b/drivers/firmware/efi/esrt.c |
718 | index 307ec1c11276..311c9d0e8cbb 100644 |
719 | --- a/drivers/firmware/efi/esrt.c |
720 | +++ b/drivers/firmware/efi/esrt.c |
721 | @@ -251,7 +251,7 @@ void __init efi_esrt_init(void) |
722 | |
723 | rc = efi_mem_desc_lookup(efi.esrt, &md); |
724 | if (rc < 0) { |
725 | - pr_err("ESRT header is not in the memory map.\n"); |
726 | + pr_warn("ESRT header is not in the memory map.\n"); |
727 | return; |
728 | } |
729 | |
730 | diff --git a/drivers/gpu/drm/amd/acp/Makefile b/drivers/gpu/drm/amd/acp/Makefile |
731 | index 8363cb57915b..8a08e81ee90d 100644 |
732 | --- a/drivers/gpu/drm/amd/acp/Makefile |
733 | +++ b/drivers/gpu/drm/amd/acp/Makefile |
734 | @@ -3,6 +3,4 @@ |
735 | # of AMDSOC/AMDGPU drm driver. |
736 | # It provides the HW control for ACP related functionalities. |
737 | |
738 | -subdir-ccflags-y += -I$(AMDACPPATH)/ -I$(AMDACPPATH)/include |
739 | - |
740 | AMD_ACP_FILES := $(AMDACPPATH)/acp_hw.o |
741 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
742 | index bfb4b91869e7..f26d1fd53bef 100644 |
743 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
744 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c |
745 | @@ -240,6 +240,8 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) |
746 | for (; i >= 0; i--) |
747 | drm_free_large(p->chunks[i].kdata); |
748 | kfree(p->chunks); |
749 | + p->chunks = NULL; |
750 | + p->nchunks = 0; |
751 | put_ctx: |
752 | amdgpu_ctx_put(p->ctx); |
753 | free_chunk: |
754 | diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c |
755 | index af267c35d813..ee5883f59be5 100644 |
756 | --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c |
757 | +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c |
758 | @@ -147,9 +147,6 @@ static int omap_gem_dmabuf_mmap(struct dma_buf *buffer, |
759 | struct drm_gem_object *obj = buffer->priv; |
760 | int ret = 0; |
761 | |
762 | - if (WARN_ON(!obj->filp)) |
763 | - return -EINVAL; |
764 | - |
765 | ret = drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma); |
766 | if (ret < 0) |
767 | return ret; |
768 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c |
769 | index 13ba73fd9b68..8bd9e6c371d1 100644 |
770 | --- a/drivers/gpu/drm/radeon/si_dpm.c |
771 | +++ b/drivers/gpu/drm/radeon/si_dpm.c |
772 | @@ -3029,6 +3029,16 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, |
773 | max_sclk = 75000; |
774 | max_mclk = 80000; |
775 | } |
776 | + } else if (rdev->family == CHIP_OLAND) { |
777 | + if ((rdev->pdev->revision == 0xC7) || |
778 | + (rdev->pdev->revision == 0x80) || |
779 | + (rdev->pdev->revision == 0x81) || |
780 | + (rdev->pdev->revision == 0x83) || |
781 | + (rdev->pdev->revision == 0x87) || |
782 | + (rdev->pdev->device == 0x6604) || |
783 | + (rdev->pdev->device == 0x6605)) { |
784 | + max_sclk = 75000; |
785 | + } |
786 | } |
787 | /* Apply dpm quirks */ |
788 | while (p && p->chip_device != 0) { |
789 | diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c |
790 | index e06c1344c913..7af77818efc3 100644 |
791 | --- a/drivers/hid/hid-cp2112.c |
792 | +++ b/drivers/hid/hid-cp2112.c |
793 | @@ -188,6 +188,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
794 | HID_REQ_GET_REPORT); |
795 | if (ret != CP2112_GPIO_CONFIG_LENGTH) { |
796 | hid_err(hdev, "error requesting GPIO config: %d\n", ret); |
797 | + if (ret >= 0) |
798 | + ret = -EIO; |
799 | goto exit; |
800 | } |
801 | |
802 | @@ -197,8 +199,10 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
803 | ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, |
804 | CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, |
805 | HID_REQ_SET_REPORT); |
806 | - if (ret < 0) { |
807 | + if (ret != CP2112_GPIO_CONFIG_LENGTH) { |
808 | hid_err(hdev, "error setting GPIO config: %d\n", ret); |
809 | + if (ret >= 0) |
810 | + ret = -EIO; |
811 | goto exit; |
812 | } |
813 | |
814 | @@ -206,7 +210,7 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
815 | |
816 | exit: |
817 | mutex_unlock(&dev->lock); |
818 | - return ret < 0 ? ret : -EIO; |
819 | + return ret; |
820 | } |
821 | |
822 | static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
823 | diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c |
824 | index 75126e4e3f05..44420073edda 100644 |
825 | --- a/drivers/hv/hv_fcopy.c |
826 | +++ b/drivers/hv/hv_fcopy.c |
827 | @@ -61,7 +61,6 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data); |
828 | static const char fcopy_devname[] = "vmbus/hv_fcopy"; |
829 | static u8 *recv_buffer; |
830 | static struct hvutil_transport *hvt; |
831 | -static struct completion release_event; |
832 | /* |
833 | * This state maintains the version number registered by the daemon. |
834 | */ |
835 | @@ -322,7 +321,6 @@ static void fcopy_on_reset(void) |
836 | |
837 | if (cancel_delayed_work_sync(&fcopy_timeout_work)) |
838 | fcopy_respond_to_host(HV_E_FAIL); |
839 | - complete(&release_event); |
840 | } |
841 | |
842 | int hv_fcopy_init(struct hv_util_service *srv) |
843 | @@ -330,7 +328,6 @@ int hv_fcopy_init(struct hv_util_service *srv) |
844 | recv_buffer = srv->recv_buffer; |
845 | fcopy_transaction.recv_channel = srv->channel; |
846 | |
847 | - init_completion(&release_event); |
848 | /* |
849 | * When this driver loads, the user level daemon that |
850 | * processes the host requests may not yet be running. |
851 | @@ -352,5 +349,4 @@ void hv_fcopy_deinit(void) |
852 | fcopy_transaction.state = HVUTIL_DEVICE_DYING; |
853 | cancel_delayed_work_sync(&fcopy_timeout_work); |
854 | hvutil_transport_destroy(hvt); |
855 | - wait_for_completion(&release_event); |
856 | } |
857 | diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c |
858 | index 3abfc5983c97..5e1fdc8d32ab 100644 |
859 | --- a/drivers/hv/hv_kvp.c |
860 | +++ b/drivers/hv/hv_kvp.c |
861 | @@ -88,7 +88,6 @@ static DECLARE_WORK(kvp_sendkey_work, kvp_send_key); |
862 | static const char kvp_devname[] = "vmbus/hv_kvp"; |
863 | static u8 *recv_buffer; |
864 | static struct hvutil_transport *hvt; |
865 | -static struct completion release_event; |
866 | /* |
867 | * Register the kernel component with the user-level daemon. |
868 | * As part of this registration, pass the LIC version number. |
869 | @@ -717,7 +716,6 @@ static void kvp_on_reset(void) |
870 | if (cancel_delayed_work_sync(&kvp_timeout_work)) |
871 | kvp_respond_to_host(NULL, HV_E_FAIL); |
872 | kvp_transaction.state = HVUTIL_DEVICE_INIT; |
873 | - complete(&release_event); |
874 | } |
875 | |
876 | int |
877 | @@ -726,7 +724,6 @@ hv_kvp_init(struct hv_util_service *srv) |
878 | recv_buffer = srv->recv_buffer; |
879 | kvp_transaction.recv_channel = srv->channel; |
880 | |
881 | - init_completion(&release_event); |
882 | /* |
883 | * When this driver loads, the user level daemon that |
884 | * processes the host requests may not yet be running. |
885 | @@ -750,5 +747,4 @@ void hv_kvp_deinit(void) |
886 | cancel_delayed_work_sync(&kvp_timeout_work); |
887 | cancel_work_sync(&kvp_sendkey_work); |
888 | hvutil_transport_destroy(hvt); |
889 | - wait_for_completion(&release_event); |
890 | } |
891 | diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c |
892 | index a76e3db0d01f..a6707133c297 100644 |
893 | --- a/drivers/hv/hv_snapshot.c |
894 | +++ b/drivers/hv/hv_snapshot.c |
895 | @@ -66,7 +66,6 @@ static int dm_reg_value; |
896 | static const char vss_devname[] = "vmbus/hv_vss"; |
897 | static __u8 *recv_buffer; |
898 | static struct hvutil_transport *hvt; |
899 | -static struct completion release_event; |
900 | |
901 | static void vss_timeout_func(struct work_struct *dummy); |
902 | static void vss_handle_request(struct work_struct *dummy); |
903 | @@ -331,13 +330,11 @@ static void vss_on_reset(void) |
904 | if (cancel_delayed_work_sync(&vss_timeout_work)) |
905 | vss_respond_to_host(HV_E_FAIL); |
906 | vss_transaction.state = HVUTIL_DEVICE_INIT; |
907 | - complete(&release_event); |
908 | } |
909 | |
910 | int |
911 | hv_vss_init(struct hv_util_service *srv) |
912 | { |
913 | - init_completion(&release_event); |
914 | if (vmbus_proto_version < VERSION_WIN8_1) { |
915 | pr_warn("Integration service 'Backup (volume snapshot)'" |
916 | " not supported on this host version.\n"); |
917 | @@ -368,5 +365,4 @@ void hv_vss_deinit(void) |
918 | cancel_delayed_work_sync(&vss_timeout_work); |
919 | cancel_work_sync(&vss_handle_request_work); |
920 | hvutil_transport_destroy(hvt); |
921 | - wait_for_completion(&release_event); |
922 | } |
923 | diff --git a/drivers/hv/hv_utils_transport.c b/drivers/hv/hv_utils_transport.c |
924 | index c235a9515267..4402a71e23f7 100644 |
925 | --- a/drivers/hv/hv_utils_transport.c |
926 | +++ b/drivers/hv/hv_utils_transport.c |
927 | @@ -182,10 +182,11 @@ static int hvt_op_release(struct inode *inode, struct file *file) |
928 | * connects back. |
929 | */ |
930 | hvt_reset(hvt); |
931 | - mutex_unlock(&hvt->lock); |
932 | |
933 | if (mode_old == HVUTIL_TRANSPORT_DESTROY) |
934 | - hvt_transport_free(hvt); |
935 | + complete(&hvt->release); |
936 | + |
937 | + mutex_unlock(&hvt->lock); |
938 | |
939 | return 0; |
940 | } |
941 | @@ -304,6 +305,7 @@ struct hvutil_transport *hvutil_transport_init(const char *name, |
942 | |
943 | init_waitqueue_head(&hvt->outmsg_q); |
944 | mutex_init(&hvt->lock); |
945 | + init_completion(&hvt->release); |
946 | |
947 | spin_lock(&hvt_list_lock); |
948 | list_add(&hvt->list, &hvt_list); |
949 | @@ -351,6 +353,8 @@ void hvutil_transport_destroy(struct hvutil_transport *hvt) |
950 | if (hvt->cn_id.idx > 0 && hvt->cn_id.val > 0) |
951 | cn_del_callback(&hvt->cn_id); |
952 | |
953 | - if (mode_old != HVUTIL_TRANSPORT_CHARDEV) |
954 | - hvt_transport_free(hvt); |
955 | + if (mode_old == HVUTIL_TRANSPORT_CHARDEV) |
956 | + wait_for_completion(&hvt->release); |
957 | + |
958 | + hvt_transport_free(hvt); |
959 | } |
960 | diff --git a/drivers/hv/hv_utils_transport.h b/drivers/hv/hv_utils_transport.h |
961 | index d98f5225c3e6..79afb626e166 100644 |
962 | --- a/drivers/hv/hv_utils_transport.h |
963 | +++ b/drivers/hv/hv_utils_transport.h |
964 | @@ -41,6 +41,7 @@ struct hvutil_transport { |
965 | int outmsg_len; /* its length */ |
966 | wait_queue_head_t outmsg_q; /* poll/read wait queue */ |
967 | struct mutex lock; /* protects struct members */ |
968 | + struct completion release; /* synchronize with fd release */ |
969 | }; |
970 | |
971 | struct hvutil_transport *hvutil_transport_init(const char *name, |
972 | diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c |
973 | index 63b5db4e4070..e0f3244505d3 100644 |
974 | --- a/drivers/hwtracing/intel_th/pci.c |
975 | +++ b/drivers/hwtracing/intel_th/pci.c |
976 | @@ -95,6 +95,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { |
977 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), |
978 | .driver_data = (kernel_ulong_t)0, |
979 | }, |
980 | + { |
981 | + /* Gemini Lake */ |
982 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), |
983 | + .driver_data = (kernel_ulong_t)0, |
984 | + }, |
985 | { 0 }, |
986 | }; |
987 | |
988 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
989 | index 809a02800102..a09d6eed3b88 100644 |
990 | --- a/drivers/infiniband/core/cma.c |
991 | +++ b/drivers/infiniband/core/cma.c |
992 | @@ -1482,7 +1482,7 @@ static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id, |
993 | return id_priv; |
994 | } |
995 | |
996 | -static inline int cma_user_data_offset(struct rdma_id_private *id_priv) |
997 | +static inline u8 cma_user_data_offset(struct rdma_id_private *id_priv) |
998 | { |
999 | return cma_family(id_priv) == AF_IB ? 0 : sizeof(struct cma_hdr); |
1000 | } |
1001 | @@ -1877,7 +1877,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) |
1002 | struct rdma_id_private *listen_id, *conn_id = NULL; |
1003 | struct rdma_cm_event event; |
1004 | struct net_device *net_dev; |
1005 | - int offset, ret; |
1006 | + u8 offset; |
1007 | + int ret; |
1008 | |
1009 | listen_id = cma_id_from_event(cm_id, ib_event, &net_dev); |
1010 | if (IS_ERR(listen_id)) |
1011 | @@ -3309,7 +3310,8 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv, |
1012 | struct ib_cm_sidr_req_param req; |
1013 | struct ib_cm_id *id; |
1014 | void *private_data; |
1015 | - int offset, ret; |
1016 | + u8 offset; |
1017 | + int ret; |
1018 | |
1019 | memset(&req, 0, sizeof req); |
1020 | offset = cma_user_data_offset(id_priv); |
1021 | @@ -3366,7 +3368,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv, |
1022 | struct rdma_route *route; |
1023 | void *private_data; |
1024 | struct ib_cm_id *id; |
1025 | - int offset, ret; |
1026 | + u8 offset; |
1027 | + int ret; |
1028 | |
1029 | memset(&req, 0, sizeof req); |
1030 | offset = cma_user_data_offset(id_priv); |
1031 | diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h |
1032 | index 862381aa83c8..b55adf53c758 100644 |
1033 | --- a/drivers/infiniband/hw/cxgb4/t4.h |
1034 | +++ b/drivers/infiniband/hw/cxgb4/t4.h |
1035 | @@ -171,7 +171,7 @@ struct t4_cqe { |
1036 | __be32 msn; |
1037 | } rcqe; |
1038 | struct { |
1039 | - u32 stag; |
1040 | + __be32 stag; |
1041 | u16 nada2; |
1042 | u16 cidx; |
1043 | } scqe; |
1044 | diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c |
1045 | index 24d0820873cf..4682909b021b 100644 |
1046 | --- a/drivers/infiniband/hw/hfi1/chip.c |
1047 | +++ b/drivers/infiniband/hw/hfi1/chip.c |
1048 | @@ -9769,7 +9769,7 @@ int hfi1_get_ib_cfg(struct hfi1_pportdata *ppd, int which) |
1049 | goto unimplemented; |
1050 | |
1051 | case HFI1_IB_CFG_OP_VLS: |
1052 | - val = ppd->vls_operational; |
1053 | + val = ppd->actual_vls_operational; |
1054 | break; |
1055 | case HFI1_IB_CFG_VL_HIGH_CAP: /* VL arb high priority table size */ |
1056 | val = VL_ARB_HIGH_PRIO_TABLE_SIZE; |
1057 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
1058 | index 830fecb6934c..335bd2c9e16e 100644 |
1059 | --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
1060 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c |
1061 | @@ -1177,10 +1177,15 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, |
1062 | ipoib_ib_dev_down(dev); |
1063 | |
1064 | if (level == IPOIB_FLUSH_HEAVY) { |
1065 | + rtnl_lock(); |
1066 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
1067 | ipoib_ib_dev_stop(dev); |
1068 | - if (ipoib_ib_dev_open(dev) != 0) |
1069 | + |
1070 | + result = ipoib_ib_dev_open(dev); |
1071 | + rtnl_unlock(); |
1072 | + if (result) |
1073 | return; |
1074 | + |
1075 | if (netif_queue_stopped(dev)) |
1076 | netif_start_queue(dev); |
1077 | } |
1078 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
1079 | index dbf09836ff30..d1051e3ce819 100644 |
1080 | --- a/drivers/input/serio/i8042-x86ia64io.h |
1081 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
1082 | @@ -520,6 +520,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
1083 | DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), |
1084 | }, |
1085 | }, |
1086 | + { |
1087 | + /* TUXEDO BU1406 */ |
1088 | + .matches = { |
1089 | + DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), |
1090 | + DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), |
1091 | + }, |
1092 | + }, |
1093 | { } |
1094 | }; |
1095 | |
1096 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
1097 | index 1a0b110f12c0..0c910a863581 100644 |
1098 | --- a/drivers/iommu/amd_iommu.c |
1099 | +++ b/drivers/iommu/amd_iommu.c |
1100 | @@ -3211,7 +3211,7 @@ static void amd_iommu_apply_dm_region(struct device *dev, |
1101 | unsigned long start, end; |
1102 | |
1103 | start = IOVA_PFN(region->start); |
1104 | - end = IOVA_PFN(region->start + region->length); |
1105 | + end = IOVA_PFN(region->start + region->length - 1); |
1106 | |
1107 | WARN_ON_ONCE(reserve_iova(&dma_dom->iovad, start, end) == NULL); |
1108 | } |
1109 | diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c |
1110 | index f50e51c1a9c8..d68a552cfe8d 100644 |
1111 | --- a/drivers/iommu/io-pgtable-arm-v7s.c |
1112 | +++ b/drivers/iommu/io-pgtable-arm-v7s.c |
1113 | @@ -418,8 +418,12 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova, |
1114 | pte |= ARM_V7S_ATTR_NS_TABLE; |
1115 | |
1116 | __arm_v7s_set_pte(ptep, pte, 1, cfg); |
1117 | - } else { |
1118 | + } else if (ARM_V7S_PTE_IS_TABLE(pte, lvl)) { |
1119 | cptep = iopte_deref(pte, lvl); |
1120 | + } else { |
1121 | + /* We require an unmap first */ |
1122 | + WARN_ON(!selftest_running); |
1123 | + return -EEXIST; |
1124 | } |
1125 | |
1126 | /* Rinse, repeat */ |
1127 | diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c |
1128 | index b8aeb0768483..68c6050d1efb 100644 |
1129 | --- a/drivers/iommu/mtk_iommu_v1.c |
1130 | +++ b/drivers/iommu/mtk_iommu_v1.c |
1131 | @@ -703,7 +703,7 @@ static struct platform_driver mtk_iommu_driver = { |
1132 | .probe = mtk_iommu_probe, |
1133 | .remove = mtk_iommu_remove, |
1134 | .driver = { |
1135 | - .name = "mtk-iommu", |
1136 | + .name = "mtk-iommu-v1", |
1137 | .of_match_table = mtk_iommu_of_ids, |
1138 | .pm = &mtk_iommu_pm_ops, |
1139 | } |
1140 | diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig |
1141 | index bc0af3307bbf..910cb5e23371 100644 |
1142 | --- a/drivers/irqchip/Kconfig |
1143 | +++ b/drivers/irqchip/Kconfig |
1144 | @@ -258,6 +258,7 @@ config IRQ_MXS |
1145 | |
1146 | config MVEBU_ODMI |
1147 | bool |
1148 | + select GENERIC_MSI_IRQ_DOMAIN |
1149 | |
1150 | config MVEBU_PIC |
1151 | bool |
1152 | diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c |
1153 | index ab8a1b36af21..edb8d1a1a69f 100644 |
1154 | --- a/drivers/md/bcache/request.c |
1155 | +++ b/drivers/md/bcache/request.c |
1156 | @@ -468,6 +468,7 @@ struct search { |
1157 | unsigned recoverable:1; |
1158 | unsigned write:1; |
1159 | unsigned read_dirty_data:1; |
1160 | + unsigned cache_missed:1; |
1161 | |
1162 | unsigned long start_time; |
1163 | |
1164 | @@ -653,6 +654,7 @@ static inline struct search *search_alloc(struct bio *bio, |
1165 | |
1166 | s->orig_bio = bio; |
1167 | s->cache_miss = NULL; |
1168 | + s->cache_missed = 0; |
1169 | s->d = d; |
1170 | s->recoverable = 1; |
1171 | s->write = op_is_write(bio_op(bio)); |
1172 | @@ -771,7 +773,7 @@ static void cached_dev_read_done_bh(struct closure *cl) |
1173 | struct cached_dev *dc = container_of(s->d, struct cached_dev, disk); |
1174 | |
1175 | bch_mark_cache_accounting(s->iop.c, s->d, |
1176 | - !s->cache_miss, s->iop.bypass); |
1177 | + !s->cache_missed, s->iop.bypass); |
1178 | trace_bcache_read(s->orig_bio, !s->cache_miss, s->iop.bypass); |
1179 | |
1180 | if (s->iop.error) |
1181 | @@ -790,6 +792,8 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s, |
1182 | struct cached_dev *dc = container_of(s->d, struct cached_dev, disk); |
1183 | struct bio *miss, *cache_bio; |
1184 | |
1185 | + s->cache_missed = 1; |
1186 | + |
1187 | if (s->cache_miss || s->iop.bypass) { |
1188 | miss = bio_next_split(bio, sectors, GFP_NOIO, s->d->bio_split); |
1189 | ret = miss == bio ? MAP_DONE : MAP_CONTINUE; |
1190 | diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c |
1191 | index f4557f558b24..28ce342348a9 100644 |
1192 | --- a/drivers/md/bcache/super.c |
1193 | +++ b/drivers/md/bcache/super.c |
1194 | @@ -2091,6 +2091,7 @@ static void bcache_exit(void) |
1195 | if (bcache_major) |
1196 | unregister_blkdev(bcache_major, "bcache"); |
1197 | unregister_reboot_notifier(&reboot); |
1198 | + mutex_destroy(&bch_register_lock); |
1199 | } |
1200 | |
1201 | static int __init bcache_init(void) |
1202 | @@ -2109,14 +2110,15 @@ static int __init bcache_init(void) |
1203 | bcache_major = register_blkdev(0, "bcache"); |
1204 | if (bcache_major < 0) { |
1205 | unregister_reboot_notifier(&reboot); |
1206 | + mutex_destroy(&bch_register_lock); |
1207 | return bcache_major; |
1208 | } |
1209 | |
1210 | if (!(bcache_wq = alloc_workqueue("bcache", WQ_MEM_RECLAIM, 0)) || |
1211 | !(bcache_kobj = kobject_create_and_add("bcache", fs_kobj)) || |
1212 | - sysfs_create_files(bcache_kobj, files) || |
1213 | bch_request_init() || |
1214 | - bch_debug_init(bcache_kobj)) |
1215 | + bch_debug_init(bcache_kobj) || |
1216 | + sysfs_create_files(bcache_kobj, files)) |
1217 | goto err; |
1218 | |
1219 | return 0; |
1220 | diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c |
1221 | index 2b13117fb918..ba7edcdd09ce 100644 |
1222 | --- a/drivers/md/md-cluster.c |
1223 | +++ b/drivers/md/md-cluster.c |
1224 | @@ -974,6 +974,7 @@ static int leave(struct mddev *mddev) |
1225 | lockres_free(cinfo->bitmap_lockres); |
1226 | unlock_all_bitmaps(mddev); |
1227 | dlm_release_lockspace(cinfo->lockspace, 2); |
1228 | + kfree(cinfo); |
1229 | return 0; |
1230 | } |
1231 | |
1232 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
1233 | index 7aea0221530c..475a7a1bcfe0 100644 |
1234 | --- a/drivers/md/raid5.c |
1235 | +++ b/drivers/md/raid5.c |
1236 | @@ -1689,8 +1689,11 @@ static void ops_complete_reconstruct(void *stripe_head_ref) |
1237 | struct r5dev *dev = &sh->dev[i]; |
1238 | |
1239 | if (dev->written || i == pd_idx || i == qd_idx) { |
1240 | - if (!discard && !test_bit(R5_SkipCopy, &dev->flags)) |
1241 | + if (!discard && !test_bit(R5_SkipCopy, &dev->flags)) { |
1242 | set_bit(R5_UPTODATE, &dev->flags); |
1243 | + if (test_bit(STRIPE_EXPAND_READY, &sh->state)) |
1244 | + set_bit(R5_Expanded, &dev->flags); |
1245 | + } |
1246 | if (fua) |
1247 | set_bit(R5_WantFUA, &dev->flags); |
1248 | if (sync) |
1249 | diff --git a/drivers/mfd/fsl-imx25-tsadc.c b/drivers/mfd/fsl-imx25-tsadc.c |
1250 | index 77b2675cf8f5..92e176009ffe 100644 |
1251 | --- a/drivers/mfd/fsl-imx25-tsadc.c |
1252 | +++ b/drivers/mfd/fsl-imx25-tsadc.c |
1253 | @@ -183,6 +183,19 @@ static int mx25_tsadc_probe(struct platform_device *pdev) |
1254 | return 0; |
1255 | } |
1256 | |
1257 | +static int mx25_tsadc_remove(struct platform_device *pdev) |
1258 | +{ |
1259 | + struct mx25_tsadc *tsadc = platform_get_drvdata(pdev); |
1260 | + int irq = platform_get_irq(pdev, 0); |
1261 | + |
1262 | + if (irq) { |
1263 | + irq_set_chained_handler_and_data(irq, NULL, NULL); |
1264 | + irq_domain_remove(tsadc->domain); |
1265 | + } |
1266 | + |
1267 | + return 0; |
1268 | +} |
1269 | + |
1270 | static const struct of_device_id mx25_tsadc_ids[] = { |
1271 | { .compatible = "fsl,imx25-tsadc" }, |
1272 | { /* Sentinel */ } |
1273 | @@ -194,6 +207,7 @@ static struct platform_driver mx25_tsadc_driver = { |
1274 | .of_match_table = of_match_ptr(mx25_tsadc_ids), |
1275 | }, |
1276 | .probe = mx25_tsadc_probe, |
1277 | + .remove = mx25_tsadc_remove, |
1278 | }; |
1279 | module_platform_driver(mx25_tsadc_driver); |
1280 | |
1281 | diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c |
1282 | index 19c10dc56513..d8a485f1798b 100644 |
1283 | --- a/drivers/misc/eeprom/at24.c |
1284 | +++ b/drivers/misc/eeprom/at24.c |
1285 | @@ -783,7 +783,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) |
1286 | at24->nvmem_config.reg_read = at24_read; |
1287 | at24->nvmem_config.reg_write = at24_write; |
1288 | at24->nvmem_config.priv = at24; |
1289 | - at24->nvmem_config.stride = 4; |
1290 | + at24->nvmem_config.stride = 1; |
1291 | at24->nvmem_config.word_size = 1; |
1292 | at24->nvmem_config.size = chip.byte_len; |
1293 | |
1294 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c |
1295 | index 84e9afcb5c09..6f9535e5e584 100644 |
1296 | --- a/drivers/mmc/host/mtk-sd.c |
1297 | +++ b/drivers/mmc/host/mtk-sd.c |
1298 | @@ -579,7 +579,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) |
1299 | } |
1300 | } |
1301 | sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD | MSDC_CFG_CKDIV, |
1302 | - (mode << 8) | (div % 0xff)); |
1303 | + (mode << 8) | div); |
1304 | sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); |
1305 | while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB)) |
1306 | cpu_relax(); |
1307 | @@ -1562,7 +1562,7 @@ static int msdc_drv_probe(struct platform_device *pdev) |
1308 | host->src_clk_freq = clk_get_rate(host->src_clk); |
1309 | /* Set host parameters to mmc */ |
1310 | mmc->ops = &mt_msdc_ops; |
1311 | - mmc->f_min = host->src_clk_freq / (4 * 255); |
1312 | + mmc->f_min = DIV_ROUND_UP(host->src_clk_freq, 4 * 255); |
1313 | |
1314 | mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23; |
1315 | /* MMC core transfer sizes tunable parameters */ |
1316 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1317 | index 5d2cf56aed0e..0b894d76aa41 100644 |
1318 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1319 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
1320 | @@ -5132,8 +5132,9 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp) |
1321 | bp->lpi_tmr_hi = le32_to_cpu(resp->valid_tx_lpi_timer_high) & |
1322 | PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_HIGH_MASK; |
1323 | } |
1324 | - link_info->support_auto_speeds = |
1325 | - le16_to_cpu(resp->supported_speeds_auto_mode); |
1326 | + if (resp->supported_speeds_auto_mode) |
1327 | + link_info->support_auto_speeds = |
1328 | + le16_to_cpu(resp->supported_speeds_auto_mode); |
1329 | |
1330 | hwrm_phy_qcaps_exit: |
1331 | mutex_unlock(&bp->hwrm_cmd_lock); |
1332 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1333 | index 0975af2903ef..3480b3078775 100644 |
1334 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1335 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1336 | @@ -1,7 +1,7 @@ |
1337 | /* |
1338 | * Broadcom GENET (Gigabit Ethernet) controller driver |
1339 | * |
1340 | - * Copyright (c) 2014 Broadcom Corporation |
1341 | + * Copyright (c) 2014-2017 Broadcom |
1342 | * |
1343 | * This program is free software; you can redistribute it and/or modify |
1344 | * it under the terms of the GNU General Public License version 2 as |
1345 | @@ -778,8 +778,9 @@ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = { |
1346 | STAT_GENET_RUNT("rx_runt_bytes", mib.rx_runt_bytes), |
1347 | /* Misc UniMAC counters */ |
1348 | STAT_GENET_MISC("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, |
1349 | - UMAC_RBUF_OVFL_CNT), |
1350 | - STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, UMAC_RBUF_ERR_CNT), |
1351 | + UMAC_RBUF_OVFL_CNT_V1), |
1352 | + STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, |
1353 | + UMAC_RBUF_ERR_CNT_V1), |
1354 | STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT), |
1355 | STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), |
1356 | STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed), |
1357 | @@ -821,6 +822,45 @@ static void bcmgenet_get_strings(struct net_device *dev, u32 stringset, |
1358 | } |
1359 | } |
1360 | |
1361 | +static u32 bcmgenet_update_stat_misc(struct bcmgenet_priv *priv, u16 offset) |
1362 | +{ |
1363 | + u16 new_offset; |
1364 | + u32 val; |
1365 | + |
1366 | + switch (offset) { |
1367 | + case UMAC_RBUF_OVFL_CNT_V1: |
1368 | + if (GENET_IS_V2(priv)) |
1369 | + new_offset = RBUF_OVFL_CNT_V2; |
1370 | + else |
1371 | + new_offset = RBUF_OVFL_CNT_V3PLUS; |
1372 | + |
1373 | + val = bcmgenet_rbuf_readl(priv, new_offset); |
1374 | + /* clear if overflowed */ |
1375 | + if (val == ~0) |
1376 | + bcmgenet_rbuf_writel(priv, 0, new_offset); |
1377 | + break; |
1378 | + case UMAC_RBUF_ERR_CNT_V1: |
1379 | + if (GENET_IS_V2(priv)) |
1380 | + new_offset = RBUF_ERR_CNT_V2; |
1381 | + else |
1382 | + new_offset = RBUF_ERR_CNT_V3PLUS; |
1383 | + |
1384 | + val = bcmgenet_rbuf_readl(priv, new_offset); |
1385 | + /* clear if overflowed */ |
1386 | + if (val == ~0) |
1387 | + bcmgenet_rbuf_writel(priv, 0, new_offset); |
1388 | + break; |
1389 | + default: |
1390 | + val = bcmgenet_umac_readl(priv, offset); |
1391 | + /* clear if overflowed */ |
1392 | + if (val == ~0) |
1393 | + bcmgenet_umac_writel(priv, 0, offset); |
1394 | + break; |
1395 | + } |
1396 | + |
1397 | + return val; |
1398 | +} |
1399 | + |
1400 | static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) |
1401 | { |
1402 | int i, j = 0; |
1403 | @@ -836,19 +876,28 @@ static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) |
1404 | case BCMGENET_STAT_NETDEV: |
1405 | case BCMGENET_STAT_SOFT: |
1406 | continue; |
1407 | - case BCMGENET_STAT_MIB_RX: |
1408 | - case BCMGENET_STAT_MIB_TX: |
1409 | case BCMGENET_STAT_RUNT: |
1410 | - if (s->type != BCMGENET_STAT_MIB_RX) |
1411 | - offset = BCMGENET_STAT_OFFSET; |
1412 | + offset += BCMGENET_STAT_OFFSET; |
1413 | + /* fall through */ |
1414 | + case BCMGENET_STAT_MIB_TX: |
1415 | + offset += BCMGENET_STAT_OFFSET; |
1416 | + /* fall through */ |
1417 | + case BCMGENET_STAT_MIB_RX: |
1418 | val = bcmgenet_umac_readl(priv, |
1419 | UMAC_MIB_START + j + offset); |
1420 | + offset = 0; /* Reset Offset */ |
1421 | break; |
1422 | case BCMGENET_STAT_MISC: |
1423 | - val = bcmgenet_umac_readl(priv, s->reg_offset); |
1424 | - /* clear if overflowed */ |
1425 | - if (val == ~0) |
1426 | - bcmgenet_umac_writel(priv, 0, s->reg_offset); |
1427 | + if (GENET_IS_V1(priv)) { |
1428 | + val = bcmgenet_umac_readl(priv, s->reg_offset); |
1429 | + /* clear if overflowed */ |
1430 | + if (val == ~0) |
1431 | + bcmgenet_umac_writel(priv, 0, |
1432 | + s->reg_offset); |
1433 | + } else { |
1434 | + val = bcmgenet_update_stat_misc(priv, |
1435 | + s->reg_offset); |
1436 | + } |
1437 | break; |
1438 | } |
1439 | |
1440 | @@ -2464,24 +2513,28 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) |
1441 | /* Interrupt bottom half */ |
1442 | static void bcmgenet_irq_task(struct work_struct *work) |
1443 | { |
1444 | + unsigned long flags; |
1445 | + unsigned int status; |
1446 | struct bcmgenet_priv *priv = container_of( |
1447 | work, struct bcmgenet_priv, bcmgenet_irq_work); |
1448 | |
1449 | netif_dbg(priv, intr, priv->dev, "%s\n", __func__); |
1450 | |
1451 | - if (priv->irq0_stat & UMAC_IRQ_MPD_R) { |
1452 | - priv->irq0_stat &= ~UMAC_IRQ_MPD_R; |
1453 | + spin_lock_irqsave(&priv->lock, flags); |
1454 | + status = priv->irq0_stat; |
1455 | + priv->irq0_stat = 0; |
1456 | + spin_unlock_irqrestore(&priv->lock, flags); |
1457 | + |
1458 | + if (status & UMAC_IRQ_MPD_R) { |
1459 | netif_dbg(priv, wol, priv->dev, |
1460 | "magic packet detected, waking up\n"); |
1461 | bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC); |
1462 | } |
1463 | |
1464 | /* Link UP/DOWN event */ |
1465 | - if (priv->irq0_stat & UMAC_IRQ_LINK_EVENT) { |
1466 | + if (status & UMAC_IRQ_LINK_EVENT) |
1467 | phy_mac_interrupt(priv->phydev, |
1468 | - !!(priv->irq0_stat & UMAC_IRQ_LINK_UP)); |
1469 | - priv->irq0_stat &= ~UMAC_IRQ_LINK_EVENT; |
1470 | - } |
1471 | + !!(status & UMAC_IRQ_LINK_UP)); |
1472 | } |
1473 | |
1474 | /* bcmgenet_isr1: handle Rx and Tx priority queues */ |
1475 | @@ -2490,22 +2543,21 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) |
1476 | struct bcmgenet_priv *priv = dev_id; |
1477 | struct bcmgenet_rx_ring *rx_ring; |
1478 | struct bcmgenet_tx_ring *tx_ring; |
1479 | - unsigned int index; |
1480 | + unsigned int index, status; |
1481 | |
1482 | - /* Save irq status for bottom-half processing. */ |
1483 | - priv->irq1_stat = |
1484 | - bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & |
1485 | + /* Read irq status */ |
1486 | + status = bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & |
1487 | ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS); |
1488 | |
1489 | /* clear interrupts */ |
1490 | - bcmgenet_intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); |
1491 | + bcmgenet_intrl2_1_writel(priv, status, INTRL2_CPU_CLEAR); |
1492 | |
1493 | netif_dbg(priv, intr, priv->dev, |
1494 | - "%s: IRQ=0x%x\n", __func__, priv->irq1_stat); |
1495 | + "%s: IRQ=0x%x\n", __func__, status); |
1496 | |
1497 | /* Check Rx priority queue interrupts */ |
1498 | for (index = 0; index < priv->hw_params->rx_queues; index++) { |
1499 | - if (!(priv->irq1_stat & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index))) |
1500 | + if (!(status & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index))) |
1501 | continue; |
1502 | |
1503 | rx_ring = &priv->rx_rings[index]; |
1504 | @@ -2518,7 +2570,7 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) |
1505 | |
1506 | /* Check Tx priority queue interrupts */ |
1507 | for (index = 0; index < priv->hw_params->tx_queues; index++) { |
1508 | - if (!(priv->irq1_stat & BIT(index))) |
1509 | + if (!(status & BIT(index))) |
1510 | continue; |
1511 | |
1512 | tx_ring = &priv->tx_rings[index]; |
1513 | @@ -2538,19 +2590,20 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) |
1514 | struct bcmgenet_priv *priv = dev_id; |
1515 | struct bcmgenet_rx_ring *rx_ring; |
1516 | struct bcmgenet_tx_ring *tx_ring; |
1517 | + unsigned int status; |
1518 | + unsigned long flags; |
1519 | |
1520 | - /* Save irq status for bottom-half processing. */ |
1521 | - priv->irq0_stat = |
1522 | - bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT) & |
1523 | + /* Read irq status */ |
1524 | + status = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT) & |
1525 | ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS); |
1526 | |
1527 | /* clear interrupts */ |
1528 | - bcmgenet_intrl2_0_writel(priv, priv->irq0_stat, INTRL2_CPU_CLEAR); |
1529 | + bcmgenet_intrl2_0_writel(priv, status, INTRL2_CPU_CLEAR); |
1530 | |
1531 | netif_dbg(priv, intr, priv->dev, |
1532 | - "IRQ=0x%x\n", priv->irq0_stat); |
1533 | + "IRQ=0x%x\n", status); |
1534 | |
1535 | - if (priv->irq0_stat & UMAC_IRQ_RXDMA_DONE) { |
1536 | + if (status & UMAC_IRQ_RXDMA_DONE) { |
1537 | rx_ring = &priv->rx_rings[DESC_INDEX]; |
1538 | |
1539 | if (likely(napi_schedule_prep(&rx_ring->napi))) { |
1540 | @@ -2559,7 +2612,7 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) |
1541 | } |
1542 | } |
1543 | |
1544 | - if (priv->irq0_stat & UMAC_IRQ_TXDMA_DONE) { |
1545 | + if (status & UMAC_IRQ_TXDMA_DONE) { |
1546 | tx_ring = &priv->tx_rings[DESC_INDEX]; |
1547 | |
1548 | if (likely(napi_schedule_prep(&tx_ring->napi))) { |
1549 | @@ -2568,22 +2621,23 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) |
1550 | } |
1551 | } |
1552 | |
1553 | - if (priv->irq0_stat & (UMAC_IRQ_PHY_DET_R | |
1554 | - UMAC_IRQ_PHY_DET_F | |
1555 | - UMAC_IRQ_LINK_EVENT | |
1556 | - UMAC_IRQ_HFB_SM | |
1557 | - UMAC_IRQ_HFB_MM | |
1558 | - UMAC_IRQ_MPD_R)) { |
1559 | - /* all other interested interrupts handled in bottom half */ |
1560 | - schedule_work(&priv->bcmgenet_irq_work); |
1561 | - } |
1562 | - |
1563 | if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) && |
1564 | - priv->irq0_stat & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { |
1565 | - priv->irq0_stat &= ~(UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR); |
1566 | + status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { |
1567 | wake_up(&priv->wq); |
1568 | } |
1569 | |
1570 | + /* all other interested interrupts handled in bottom half */ |
1571 | + status &= (UMAC_IRQ_LINK_EVENT | |
1572 | + UMAC_IRQ_MPD_R); |
1573 | + if (status) { |
1574 | + /* Save irq status for bottom-half processing. */ |
1575 | + spin_lock_irqsave(&priv->lock, flags); |
1576 | + priv->irq0_stat |= status; |
1577 | + spin_unlock_irqrestore(&priv->lock, flags); |
1578 | + |
1579 | + schedule_work(&priv->bcmgenet_irq_work); |
1580 | + } |
1581 | + |
1582 | return IRQ_HANDLED; |
1583 | } |
1584 | |
1585 | @@ -2808,6 +2862,8 @@ static int bcmgenet_open(struct net_device *dev) |
1586 | err_fini_dma: |
1587 | bcmgenet_fini_dma(priv); |
1588 | err_clk_disable: |
1589 | + if (priv->internal_phy) |
1590 | + bcmgenet_power_down(priv, GENET_POWER_PASSIVE); |
1591 | clk_disable_unprepare(priv->clk); |
1592 | return ret; |
1593 | } |
1594 | @@ -3184,6 +3240,12 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) |
1595 | */ |
1596 | gphy_rev = reg & 0xffff; |
1597 | |
1598 | + /* This is reserved so should require special treatment */ |
1599 | + if (gphy_rev == 0 || gphy_rev == 0x01ff) { |
1600 | + pr_warn("Invalid GPHY revision detected: 0x%04x\n", gphy_rev); |
1601 | + return; |
1602 | + } |
1603 | + |
1604 | /* This is the good old scheme, just GPHY major, no minor nor patch */ |
1605 | if ((gphy_rev & 0xf0) != 0) |
1606 | priv->gphy_rev = gphy_rev << 8; |
1607 | @@ -3192,12 +3254,6 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) |
1608 | else if ((gphy_rev & 0xff00) != 0) |
1609 | priv->gphy_rev = gphy_rev; |
1610 | |
1611 | - /* This is reserved so should require special treatment */ |
1612 | - else if (gphy_rev == 0 || gphy_rev == 0x01ff) { |
1613 | - pr_warn("Invalid GPHY revision detected: 0x%04x\n", gphy_rev); |
1614 | - return; |
1615 | - } |
1616 | - |
1617 | #ifdef CONFIG_PHYS_ADDR_T_64BIT |
1618 | if (!(params->flags & GENET_HAS_40BITS)) |
1619 | pr_warn("GENET does not support 40-bits PA\n"); |
1620 | @@ -3240,6 +3296,7 @@ static int bcmgenet_probe(struct platform_device *pdev) |
1621 | const void *macaddr; |
1622 | struct resource *r; |
1623 | int err = -EIO; |
1624 | + const char *phy_mode_str; |
1625 | |
1626 | /* Up to GENET_MAX_MQ_CNT + 1 TX queues and RX queues */ |
1627 | dev = alloc_etherdev_mqs(sizeof(*priv), GENET_MAX_MQ_CNT + 1, |
1628 | @@ -3283,6 +3340,8 @@ static int bcmgenet_probe(struct platform_device *pdev) |
1629 | goto err; |
1630 | } |
1631 | |
1632 | + spin_lock_init(&priv->lock); |
1633 | + |
1634 | SET_NETDEV_DEV(dev, &pdev->dev); |
1635 | dev_set_drvdata(&pdev->dev, dev); |
1636 | ether_addr_copy(dev->dev_addr, macaddr); |
1637 | @@ -3345,6 +3404,13 @@ static int bcmgenet_probe(struct platform_device *pdev) |
1638 | priv->clk_eee = NULL; |
1639 | } |
1640 | |
1641 | + /* If this is an internal GPHY, power it on now, before UniMAC is |
1642 | + * brought out of reset as absolutely no UniMAC activity is allowed |
1643 | + */ |
1644 | + if (dn && !of_property_read_string(dn, "phy-mode", &phy_mode_str) && |
1645 | + !strcasecmp(phy_mode_str, "internal")) |
1646 | + bcmgenet_power_up(priv, GENET_POWER_PASSIVE); |
1647 | + |
1648 | err = reset_umac(priv); |
1649 | if (err) |
1650 | goto err_clk_disable; |
1651 | @@ -3511,6 +3577,8 @@ static int bcmgenet_resume(struct device *d) |
1652 | return 0; |
1653 | |
1654 | out_clk_disable: |
1655 | + if (priv->internal_phy) |
1656 | + bcmgenet_power_down(priv, GENET_POWER_PASSIVE); |
1657 | clk_disable_unprepare(priv->clk); |
1658 | return ret; |
1659 | } |
1660 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
1661 | index 1e2dc34d331a..db7f289d65ae 100644 |
1662 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
1663 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
1664 | @@ -1,5 +1,5 @@ |
1665 | /* |
1666 | - * Copyright (c) 2014 Broadcom Corporation |
1667 | + * Copyright (c) 2014-2017 Broadcom |
1668 | * |
1669 | * This program is free software; you can redistribute it and/or modify |
1670 | * it under the terms of the GNU General Public License version 2 as |
1671 | @@ -214,7 +214,9 @@ struct bcmgenet_mib_counters { |
1672 | #define MDIO_REG_SHIFT 16 |
1673 | #define MDIO_REG_MASK 0x1F |
1674 | |
1675 | -#define UMAC_RBUF_OVFL_CNT 0x61C |
1676 | +#define UMAC_RBUF_OVFL_CNT_V1 0x61C |
1677 | +#define RBUF_OVFL_CNT_V2 0x80 |
1678 | +#define RBUF_OVFL_CNT_V3PLUS 0x94 |
1679 | |
1680 | #define UMAC_MPD_CTRL 0x620 |
1681 | #define MPD_EN (1 << 0) |
1682 | @@ -224,7 +226,9 @@ struct bcmgenet_mib_counters { |
1683 | |
1684 | #define UMAC_MPD_PW_MS 0x624 |
1685 | #define UMAC_MPD_PW_LS 0x628 |
1686 | -#define UMAC_RBUF_ERR_CNT 0x634 |
1687 | +#define UMAC_RBUF_ERR_CNT_V1 0x634 |
1688 | +#define RBUF_ERR_CNT_V2 0x84 |
1689 | +#define RBUF_ERR_CNT_V3PLUS 0x98 |
1690 | #define UMAC_MDF_ERR_CNT 0x638 |
1691 | #define UMAC_MDF_CTRL 0x650 |
1692 | #define UMAC_MDF_ADDR 0x654 |
1693 | @@ -619,11 +623,13 @@ struct bcmgenet_priv { |
1694 | struct work_struct bcmgenet_irq_work; |
1695 | int irq0; |
1696 | int irq1; |
1697 | - unsigned int irq0_stat; |
1698 | - unsigned int irq1_stat; |
1699 | int wol_irq; |
1700 | bool wol_irq_disabled; |
1701 | |
1702 | + /* shared status */ |
1703 | + spinlock_t lock; |
1704 | + unsigned int irq0_stat; |
1705 | + |
1706 | /* HW descriptors/checksum variables */ |
1707 | bool desc_64b_en; |
1708 | bool desc_rxchk_en; |
1709 | diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c |
1710 | index e36bebcab3f2..dae9dcfa8f36 100644 |
1711 | --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c |
1712 | +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c |
1713 | @@ -2304,6 +2304,17 @@ static int sync_toggles(struct mlx4_dev *dev) |
1714 | rd_toggle = swab32(readl(&priv->mfunc.comm->slave_read)); |
1715 | if (wr_toggle == 0xffffffff || rd_toggle == 0xffffffff) { |
1716 | /* PCI might be offline */ |
1717 | + |
1718 | + /* If device removal has been requested, |
1719 | + * do not continue retrying. |
1720 | + */ |
1721 | + if (dev->persist->interface_state & |
1722 | + MLX4_INTERFACE_STATE_NOWAIT) { |
1723 | + mlx4_warn(dev, |
1724 | + "communication channel is offline\n"); |
1725 | + return -EIO; |
1726 | + } |
1727 | + |
1728 | msleep(100); |
1729 | wr_toggle = swab32(readl(&priv->mfunc.comm-> |
1730 | slave_write)); |
1731 | diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c |
1732 | index 727122de7df0..5411ca48978a 100644 |
1733 | --- a/drivers/net/ethernet/mellanox/mlx4/main.c |
1734 | +++ b/drivers/net/ethernet/mellanox/mlx4/main.c |
1735 | @@ -1940,6 +1940,14 @@ static int mlx4_comm_check_offline(struct mlx4_dev *dev) |
1736 | (u32)(1 << COMM_CHAN_OFFLINE_OFFSET)); |
1737 | if (!offline_bit) |
1738 | return 0; |
1739 | + |
1740 | + /* If device removal has been requested, |
1741 | + * do not continue retrying. |
1742 | + */ |
1743 | + if (dev->persist->interface_state & |
1744 | + MLX4_INTERFACE_STATE_NOWAIT) |
1745 | + break; |
1746 | + |
1747 | /* There are cases as part of AER/Reset flow that PF needs |
1748 | * around 100 msec to load. We therefore sleep for 100 msec |
1749 | * to allow other tasks to make use of that CPU during this |
1750 | @@ -3954,6 +3962,9 @@ static void mlx4_remove_one(struct pci_dev *pdev) |
1751 | struct devlink *devlink = priv_to_devlink(priv); |
1752 | int active_vfs = 0; |
1753 | |
1754 | + if (mlx4_is_slave(dev)) |
1755 | + persist->interface_state |= MLX4_INTERFACE_STATE_NOWAIT; |
1756 | + |
1757 | mutex_lock(&persist->interface_state_mutex); |
1758 | persist->interface_state |= MLX4_INTERFACE_STATE_DELETION; |
1759 | mutex_unlock(&persist->interface_state_mutex); |
1760 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
1761 | index 4de3c28b0547..331a6ca4856d 100644 |
1762 | --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
1763 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
1764 | @@ -1015,7 +1015,7 @@ static struct mlx5_flow_group *create_autogroup(struct mlx5_flow_table *ft, |
1765 | u32 *match_criteria) |
1766 | { |
1767 | int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in); |
1768 | - struct list_head *prev = ft->node.children.prev; |
1769 | + struct list_head *prev = &ft->node.children; |
1770 | unsigned int candidate_index = 0; |
1771 | struct mlx5_flow_group *fg; |
1772 | void *match_criteria_addr; |
1773 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1774 | index b3309f2ed7dc..981cd1d84a5b 100644 |
1775 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1776 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1777 | @@ -1283,6 +1283,7 @@ static int init_one(struct pci_dev *pdev, |
1778 | if (err) |
1779 | goto clean_load; |
1780 | |
1781 | + pci_save_state(pdev); |
1782 | return 0; |
1783 | |
1784 | clean_load: |
1785 | @@ -1331,9 +1332,8 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev, |
1786 | |
1787 | mlx5_enter_error_state(dev); |
1788 | mlx5_unload_one(dev, priv, false); |
1789 | - /* In case of kernel call save the pci state and drain the health wq */ |
1790 | + /* In case of kernel call drain the health wq */ |
1791 | if (state) { |
1792 | - pci_save_state(pdev); |
1793 | mlx5_drain_health_wq(dev); |
1794 | mlx5_pci_disable_device(dev); |
1795 | } |
1796 | @@ -1385,6 +1385,7 @@ static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev) |
1797 | |
1798 | pci_set_master(pdev); |
1799 | pci_restore_state(pdev); |
1800 | + pci_save_state(pdev); |
1801 | |
1802 | if (wait_vital(pdev)) { |
1803 | dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__); |
1804 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h |
1805 | index 6460c7256f2b..a01e6c0d0cd1 100644 |
1806 | --- a/drivers/net/ethernet/mellanox/mlxsw/reg.h |
1807 | +++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h |
1808 | @@ -788,7 +788,7 @@ static inline void mlxsw_reg_spvid_pack(char *payload, u8 local_port, u16 pvid) |
1809 | #define MLXSW_REG_SPVM_ID 0x200F |
1810 | #define MLXSW_REG_SPVM_BASE_LEN 0x04 /* base length, without records */ |
1811 | #define MLXSW_REG_SPVM_REC_LEN 0x04 /* record length */ |
1812 | -#define MLXSW_REG_SPVM_REC_MAX_COUNT 256 |
1813 | +#define MLXSW_REG_SPVM_REC_MAX_COUNT 255 |
1814 | #define MLXSW_REG_SPVM_LEN (MLXSW_REG_SPVM_BASE_LEN + \ |
1815 | MLXSW_REG_SPVM_REC_LEN * MLXSW_REG_SPVM_REC_MAX_COUNT) |
1816 | |
1817 | @@ -1757,7 +1757,7 @@ static inline void mlxsw_reg_sfmr_pack(char *payload, |
1818 | #define MLXSW_REG_SPVMLR_ID 0x2020 |
1819 | #define MLXSW_REG_SPVMLR_BASE_LEN 0x04 /* base length, without records */ |
1820 | #define MLXSW_REG_SPVMLR_REC_LEN 0x04 /* record length */ |
1821 | -#define MLXSW_REG_SPVMLR_REC_MAX_COUNT 256 |
1822 | +#define MLXSW_REG_SPVMLR_REC_MAX_COUNT 255 |
1823 | #define MLXSW_REG_SPVMLR_LEN (MLXSW_REG_SPVMLR_BASE_LEN + \ |
1824 | MLXSW_REG_SPVMLR_REC_LEN * \ |
1825 | MLXSW_REG_SPVMLR_REC_MAX_COUNT) |
1826 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c |
1827 | index 0c42c240b5cf..ed014bdbbabd 100644 |
1828 | --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c |
1829 | +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c |
1830 | @@ -373,8 +373,9 @@ static void qed_cxt_set_proto_cid_count(struct qed_hwfn *p_hwfn, |
1831 | u32 page_sz = p_mgr->clients[ILT_CLI_CDUC].p_size.val; |
1832 | u32 cxt_size = CONN_CXT_SIZE(p_hwfn); |
1833 | u32 elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size; |
1834 | + u32 align = elems_per_page * DQ_RANGE_ALIGN; |
1835 | |
1836 | - p_conn->cid_count = roundup(p_conn->cid_count, elems_per_page); |
1837 | + p_conn->cid_count = roundup(p_conn->cid_count, align); |
1838 | } |
1839 | } |
1840 | |
1841 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
1842 | index 62ae55bd81b8..a3360cbdb30b 100644 |
1843 | --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
1844 | +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c |
1845 | @@ -187,6 +187,8 @@ static void qed_ll2b_complete_rx_packet(struct qed_hwfn *p_hwfn, |
1846 | /* If need to reuse or there's no replacement buffer, repost this */ |
1847 | if (rc) |
1848 | goto out_post; |
1849 | + dma_unmap_single(&cdev->pdev->dev, buffer->phys_addr, |
1850 | + cdev->ll2->rx_size, DMA_FROM_DEVICE); |
1851 | |
1852 | skb = build_skb(buffer->data, 0); |
1853 | if (!skb) { |
1854 | @@ -441,7 +443,7 @@ qed_ll2_rxq_completion_gsi(struct qed_hwfn *p_hwfn, |
1855 | static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn, |
1856 | struct qed_ll2_info *p_ll2_conn, |
1857 | union core_rx_cqe_union *p_cqe, |
1858 | - unsigned long lock_flags, |
1859 | + unsigned long *p_lock_flags, |
1860 | bool b_last_cqe) |
1861 | { |
1862 | struct qed_ll2_rx_queue *p_rx = &p_ll2_conn->rx_queue; |
1863 | @@ -462,10 +464,10 @@ static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn, |
1864 | "Mismatch between active_descq and the LL2 Rx chain\n"); |
1865 | list_add_tail(&p_pkt->list_entry, &p_rx->free_descq); |
1866 | |
1867 | - spin_unlock_irqrestore(&p_rx->lock, lock_flags); |
1868 | + spin_unlock_irqrestore(&p_rx->lock, *p_lock_flags); |
1869 | qed_ll2b_complete_rx_packet(p_hwfn, p_ll2_conn->my_id, |
1870 | p_pkt, &p_cqe->rx_cqe_fp, b_last_cqe); |
1871 | - spin_lock_irqsave(&p_rx->lock, lock_flags); |
1872 | + spin_lock_irqsave(&p_rx->lock, *p_lock_flags); |
1873 | |
1874 | return 0; |
1875 | } |
1876 | @@ -505,7 +507,8 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie) |
1877 | break; |
1878 | case CORE_RX_CQE_TYPE_REGULAR: |
1879 | rc = qed_ll2_rxq_completion_reg(p_hwfn, p_ll2_conn, |
1880 | - cqe, flags, b_last_cqe); |
1881 | + cqe, &flags, |
1882 | + b_last_cqe); |
1883 | break; |
1884 | default: |
1885 | rc = -EIO; |
1886 | diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c |
1887 | index 1d85109cb8ed..3d5d5d54c103 100644 |
1888 | --- a/drivers/net/ethernet/sfc/ef10.c |
1889 | +++ b/drivers/net/ethernet/sfc/ef10.c |
1890 | @@ -4967,7 +4967,7 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx) |
1891 | * MCFW do not support VFs. |
1892 | */ |
1893 | rc = efx_ef10_vport_set_mac_address(efx); |
1894 | - } else { |
1895 | + } else if (rc) { |
1896 | efx_mcdi_display_error(efx, MC_CMD_VADAPTOR_SET_MAC, |
1897 | sizeof(inbuf), NULL, 0, rc); |
1898 | } |
1899 | diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c |
1900 | index e46b1ebbbff4..7ea8ead4fd1c 100644 |
1901 | --- a/drivers/net/fjes/fjes_main.c |
1902 | +++ b/drivers/net/fjes/fjes_main.c |
1903 | @@ -1277,7 +1277,7 @@ static void fjes_netdev_setup(struct net_device *netdev) |
1904 | fjes_set_ethtool_ops(netdev); |
1905 | netdev->mtu = fjes_support_mtu[3]; |
1906 | netdev->flags |= IFF_BROADCAST; |
1907 | - netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER; |
1908 | + netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; |
1909 | } |
1910 | |
1911 | static void fjes_irq_watch_task(struct work_struct *work) |
1912 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
1913 | index dc8ccac0a01d..6d55049cd3dc 100644 |
1914 | --- a/drivers/net/macvlan.c |
1915 | +++ b/drivers/net/macvlan.c |
1916 | @@ -452,7 +452,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) |
1917 | struct macvlan_dev, list); |
1918 | else |
1919 | vlan = macvlan_hash_lookup(port, eth->h_dest); |
1920 | - if (vlan == NULL) |
1921 | + if (!vlan || vlan->mode == MACVLAN_MODE_SOURCE) |
1922 | return RX_HANDLER_PASS; |
1923 | |
1924 | dev = vlan->dev; |
1925 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c |
1926 | index 440d5f42810f..b883af93929c 100644 |
1927 | --- a/drivers/net/ppp/ppp_generic.c |
1928 | +++ b/drivers/net/ppp/ppp_generic.c |
1929 | @@ -958,6 +958,7 @@ static __net_exit void ppp_exit_net(struct net *net) |
1930 | unregister_netdevice_many(&list); |
1931 | rtnl_unlock(); |
1932 | |
1933 | + mutex_destroy(&pn->all_ppp_mutex); |
1934 | idr_destroy(&pn->units_idr); |
1935 | } |
1936 | |
1937 | diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c |
1938 | index e7f5910a6519..f8eb66ef2944 100644 |
1939 | --- a/drivers/net/wimax/i2400m/usb.c |
1940 | +++ b/drivers/net/wimax/i2400m/usb.c |
1941 | @@ -467,6 +467,9 @@ int i2400mu_probe(struct usb_interface *iface, |
1942 | struct i2400mu *i2400mu; |
1943 | struct usb_device *usb_dev = interface_to_usbdev(iface); |
1944 | |
1945 | + if (iface->cur_altsetting->desc.bNumEndpoints < 4) |
1946 | + return -ENODEV; |
1947 | + |
1948 | if (usb_dev->speed != USB_SPEED_HIGH) |
1949 | dev_err(dev, "device not connected as high speed\n"); |
1950 | |
1951 | diff --git a/drivers/net/wireless/ath/ath9k/tx99.c b/drivers/net/wireless/ath/ath9k/tx99.c |
1952 | index 1fa7f844b5da..8e9480cc33e1 100644 |
1953 | --- a/drivers/net/wireless/ath/ath9k/tx99.c |
1954 | +++ b/drivers/net/wireless/ath/ath9k/tx99.c |
1955 | @@ -179,6 +179,9 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf, |
1956 | ssize_t len; |
1957 | int r; |
1958 | |
1959 | + if (count < 1) |
1960 | + return -EINVAL; |
1961 | + |
1962 | if (sc->cur_chan->nvifs > 1) |
1963 | return -EOPNOTSUPP; |
1964 | |
1965 | @@ -186,6 +189,8 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf, |
1966 | if (copy_from_user(buf, user_buf, len)) |
1967 | return -EFAULT; |
1968 | |
1969 | + buf[len] = '\0'; |
1970 | + |
1971 | if (strtobool(buf, &start)) |
1972 | return -EINVAL; |
1973 | |
1974 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c |
1975 | index 9789f3c5a785..f1231c0ea336 100644 |
1976 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c |
1977 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c |
1978 | @@ -2320,7 +2320,7 @@ iwl_mvm_mac_release_buffered_frames(struct ieee80211_hw *hw, |
1979 | { |
1980 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); |
1981 | |
1982 | - /* Called when we need to transmit (a) frame(s) from agg queue */ |
1983 | + /* Called when we need to transmit (a) frame(s) from agg or dqa queue */ |
1984 | |
1985 | iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames, |
1986 | tids, more_data, true); |
1987 | @@ -2340,7 +2340,8 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw, |
1988 | for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) { |
1989 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; |
1990 | |
1991 | - if (tid_data->state != IWL_AGG_ON && |
1992 | + if (!iwl_mvm_is_dqa_supported(mvm) && |
1993 | + tid_data->state != IWL_AGG_ON && |
1994 | tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA) |
1995 | continue; |
1996 | |
1997 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c |
1998 | index e64aeb4a2204..bdd1deed55a4 100644 |
1999 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c |
2000 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c |
2001 | @@ -3032,7 +3032,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, |
2002 | struct ieee80211_sta *sta, |
2003 | enum ieee80211_frame_release_type reason, |
2004 | u16 cnt, u16 tids, bool more_data, |
2005 | - bool agg) |
2006 | + bool single_sta_queue) |
2007 | { |
2008 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); |
2009 | struct iwl_mvm_add_sta_cmd cmd = { |
2010 | @@ -3052,14 +3052,14 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, |
2011 | for_each_set_bit(tid, &_tids, IWL_MAX_TID_COUNT) |
2012 | cmd.awake_acs |= BIT(tid_to_ucode_ac[tid]); |
2013 | |
2014 | - /* If we're releasing frames from aggregation queues then check if the |
2015 | - * all queues combined that we're releasing frames from have |
2016 | + /* If we're releasing frames from aggregation or dqa queues then check |
2017 | + * if all the queues that we're releasing frames from, combined, have: |
2018 | * - more frames than the service period, in which case more_data |
2019 | * needs to be set |
2020 | * - fewer than 'cnt' frames, in which case we need to adjust the |
2021 | * firmware command (but do that unconditionally) |
2022 | */ |
2023 | - if (agg) { |
2024 | + if (single_sta_queue) { |
2025 | int remaining = cnt; |
2026 | int sleep_tx_count; |
2027 | |
2028 | @@ -3069,7 +3069,8 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, |
2029 | u16 n_queued; |
2030 | |
2031 | tid_data = &mvmsta->tid_data[tid]; |
2032 | - if (WARN(tid_data->state != IWL_AGG_ON && |
2033 | + if (WARN(!iwl_mvm_is_dqa_supported(mvm) && |
2034 | + tid_data->state != IWL_AGG_ON && |
2035 | tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA, |
2036 | "TID %d state is %d\n", |
2037 | tid, tid_data->state)) { |
2038 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h |
2039 | index e068d5355865..f65950e91ed5 100644 |
2040 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h |
2041 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h |
2042 | @@ -545,7 +545,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, |
2043 | struct ieee80211_sta *sta, |
2044 | enum ieee80211_frame_release_type reason, |
2045 | u16 cnt, u16 tids, bool more_data, |
2046 | - bool agg); |
2047 | + bool single_sta_queue); |
2048 | int iwl_mvm_drain_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, |
2049 | bool drain); |
2050 | void iwl_mvm_sta_modify_disable_tx(struct iwl_mvm *mvm, |
2051 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c |
2052 | index 092ae0024f22..7465d4db136f 100644 |
2053 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c |
2054 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c |
2055 | @@ -7,7 +7,7 @@ |
2056 | * |
2057 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
2058 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
2059 | - * Copyright(c) 2016 Intel Deutschland GmbH |
2060 | + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
2061 | * |
2062 | * This program is free software; you can redistribute it and/or modify |
2063 | * it under the terms of version 2 of the GNU General Public License as |
2064 | @@ -34,6 +34,7 @@ |
2065 | * |
2066 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
2067 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
2068 | + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
2069 | * All rights reserved. |
2070 | * |
2071 | * Redistribution and use in source and binary forms, with or without |
2072 | @@ -621,8 +622,10 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) |
2073 | * values. |
2074 | * Note that we don't need to make sure it isn't agg'd, since we're |
2075 | * TXing non-sta |
2076 | + * For DQA mode - we shouldn't increase it though |
2077 | */ |
2078 | - atomic_inc(&mvm->pending_frames[sta_id]); |
2079 | + if (!iwl_mvm_is_dqa_supported(mvm)) |
2080 | + atomic_inc(&mvm->pending_frames[sta_id]); |
2081 | |
2082 | return 0; |
2083 | } |
2084 | @@ -1009,11 +1012,8 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb, |
2085 | |
2086 | spin_unlock(&mvmsta->lock); |
2087 | |
2088 | - /* Increase pending frames count if this isn't AMPDU */ |
2089 | - if ((iwl_mvm_is_dqa_supported(mvm) && |
2090 | - mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_ON && |
2091 | - mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_STARTING) || |
2092 | - (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu)) |
2093 | + /* Increase pending frames count if this isn't AMPDU or DQA queue */ |
2094 | + if (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu) |
2095 | atomic_inc(&mvm->pending_frames[mvmsta->sta_id]); |
2096 | |
2097 | return 0; |
2098 | @@ -1083,12 +1083,13 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm, |
2099 | lockdep_assert_held(&mvmsta->lock); |
2100 | |
2101 | if ((tid_data->state == IWL_AGG_ON || |
2102 | - tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA) && |
2103 | + tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA || |
2104 | + iwl_mvm_is_dqa_supported(mvm)) && |
2105 | iwl_mvm_tid_queued(tid_data) == 0) { |
2106 | /* |
2107 | - * Now that this aggregation queue is empty tell mac80211 so it |
2108 | - * knows we no longer have frames buffered for the station on |
2109 | - * this TID (for the TIM bitmap calculation.) |
2110 | + * Now that this aggregation or DQA queue is empty tell |
2111 | + * mac80211 so it knows we no longer have frames buffered for |
2112 | + * the station on this TID (for the TIM bitmap calculation.) |
2113 | */ |
2114 | ieee80211_sta_set_buffered(sta, tid, false); |
2115 | } |
2116 | @@ -1261,7 +1262,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, |
2117 | u8 skb_freed = 0; |
2118 | u16 next_reclaimed, seq_ctl; |
2119 | bool is_ndp = false; |
2120 | - bool txq_agg = false; /* Is this TXQ aggregated */ |
2121 | |
2122 | __skb_queue_head_init(&skbs); |
2123 | |
2124 | @@ -1287,6 +1287,10 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, |
2125 | info->flags |= IEEE80211_TX_STAT_ACK; |
2126 | break; |
2127 | case TX_STATUS_FAIL_DEST_PS: |
2128 | + /* In DQA, the FW should have stopped the queue and not |
2129 | + * return this status |
2130 | + */ |
2131 | + WARN_ON(iwl_mvm_is_dqa_supported(mvm)); |
2132 | info->flags |= IEEE80211_TX_STAT_TX_FILTERED; |
2133 | break; |
2134 | default: |
2135 | @@ -1391,15 +1395,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, |
2136 | bool send_eosp_ndp = false; |
2137 | |
2138 | spin_lock_bh(&mvmsta->lock); |
2139 | - if (iwl_mvm_is_dqa_supported(mvm)) { |
2140 | - enum iwl_mvm_agg_state state; |
2141 | - |
2142 | - state = mvmsta->tid_data[tid].state; |
2143 | - txq_agg = (state == IWL_AGG_ON || |
2144 | - state == IWL_EMPTYING_HW_QUEUE_DELBA); |
2145 | - } else { |
2146 | - txq_agg = txq_id >= mvm->first_agg_queue; |
2147 | - } |
2148 | |
2149 | if (!is_ndp) { |
2150 | tid_data->next_reclaimed = next_reclaimed; |
2151 | @@ -1456,11 +1451,11 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, |
2152 | * If the txq is not an AMPDU queue, there is no chance we freed |
2153 | * several skbs. Check that out... |
2154 | */ |
2155 | - if (txq_agg) |
2156 | + if (iwl_mvm_is_dqa_supported(mvm) || txq_id >= mvm->first_agg_queue) |
2157 | goto out; |
2158 | |
2159 | /* We can't free more than one frame at once on a shared queue */ |
2160 | - WARN_ON(!iwl_mvm_is_dqa_supported(mvm) && (skb_freed > 1)); |
2161 | + WARN_ON(skb_freed > 1); |
2162 | |
2163 | /* If we have still frames for this STA nothing to do here */ |
2164 | if (!atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id])) |
2165 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
2166 | index fbeca065f18c..719ee5fb2626 100644 |
2167 | --- a/drivers/nvme/host/core.c |
2168 | +++ b/drivers/nvme/host/core.c |
2169 | @@ -1619,7 +1619,8 @@ static struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid) |
2170 | mutex_lock(&ctrl->namespaces_mutex); |
2171 | list_for_each_entry(ns, &ctrl->namespaces, list) { |
2172 | if (ns->ns_id == nsid) { |
2173 | - kref_get(&ns->kref); |
2174 | + if (!kref_get_unless_zero(&ns->kref)) |
2175 | + continue; |
2176 | ret = ns; |
2177 | break; |
2178 | } |
2179 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c |
2180 | index fbd6d487103f..c89d68a76f3d 100644 |
2181 | --- a/drivers/nvme/target/core.c |
2182 | +++ b/drivers/nvme/target/core.c |
2183 | @@ -422,6 +422,13 @@ void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq, |
2184 | ctrl->sqs[qid] = sq; |
2185 | } |
2186 | |
2187 | +static void nvmet_confirm_sq(struct percpu_ref *ref) |
2188 | +{ |
2189 | + struct nvmet_sq *sq = container_of(ref, struct nvmet_sq, ref); |
2190 | + |
2191 | + complete(&sq->confirm_done); |
2192 | +} |
2193 | + |
2194 | void nvmet_sq_destroy(struct nvmet_sq *sq) |
2195 | { |
2196 | /* |
2197 | @@ -430,7 +437,8 @@ void nvmet_sq_destroy(struct nvmet_sq *sq) |
2198 | */ |
2199 | if (sq->ctrl && sq->ctrl->sqs && sq->ctrl->sqs[0] == sq) |
2200 | nvmet_async_events_free(sq->ctrl); |
2201 | - percpu_ref_kill(&sq->ref); |
2202 | + percpu_ref_kill_and_confirm(&sq->ref, nvmet_confirm_sq); |
2203 | + wait_for_completion(&sq->confirm_done); |
2204 | wait_for_completion(&sq->free_done); |
2205 | percpu_ref_exit(&sq->ref); |
2206 | |
2207 | @@ -458,6 +466,7 @@ int nvmet_sq_init(struct nvmet_sq *sq) |
2208 | return ret; |
2209 | } |
2210 | init_completion(&sq->free_done); |
2211 | + init_completion(&sq->confirm_done); |
2212 | |
2213 | return 0; |
2214 | } |
2215 | diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c |
2216 | index d5df77d686b2..c8e612c1c72f 100644 |
2217 | --- a/drivers/nvme/target/loop.c |
2218 | +++ b/drivers/nvme/target/loop.c |
2219 | @@ -288,9 +288,9 @@ static struct blk_mq_ops nvme_loop_admin_mq_ops = { |
2220 | |
2221 | static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl) |
2222 | { |
2223 | + nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); |
2224 | blk_cleanup_queue(ctrl->ctrl.admin_q); |
2225 | blk_mq_free_tag_set(&ctrl->admin_tag_set); |
2226 | - nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); |
2227 | } |
2228 | |
2229 | static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl) |
2230 | diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h |
2231 | index 7655a351320f..26b87dc843d2 100644 |
2232 | --- a/drivers/nvme/target/nvmet.h |
2233 | +++ b/drivers/nvme/target/nvmet.h |
2234 | @@ -73,6 +73,7 @@ struct nvmet_sq { |
2235 | u16 qid; |
2236 | u16 size; |
2237 | struct completion free_done; |
2238 | + struct completion confirm_done; |
2239 | }; |
2240 | |
2241 | /** |
2242 | diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c |
2243 | index ca8ddc3fb19e..53bd32550867 100644 |
2244 | --- a/drivers/nvme/target/rdma.c |
2245 | +++ b/drivers/nvme/target/rdma.c |
2246 | @@ -703,11 +703,6 @@ static void nvmet_rdma_handle_command(struct nvmet_rdma_queue *queue, |
2247 | { |
2248 | u16 status; |
2249 | |
2250 | - cmd->queue = queue; |
2251 | - cmd->n_rdma = 0; |
2252 | - cmd->req.port = queue->port; |
2253 | - |
2254 | - |
2255 | ib_dma_sync_single_for_cpu(queue->dev->device, |
2256 | cmd->cmd->sge[0].addr, cmd->cmd->sge[0].length, |
2257 | DMA_FROM_DEVICE); |
2258 | @@ -760,9 +755,12 @@ static void nvmet_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc) |
2259 | |
2260 | cmd->queue = queue; |
2261 | rsp = nvmet_rdma_get_rsp(queue); |
2262 | + rsp->queue = queue; |
2263 | rsp->cmd = cmd; |
2264 | rsp->flags = 0; |
2265 | rsp->req.cmd = cmd->nvme_cmd; |
2266 | + rsp->req.port = queue->port; |
2267 | + rsp->n_rdma = 0; |
2268 | |
2269 | if (unlikely(queue->state != NVMET_RDMA_Q_LIVE)) { |
2270 | unsigned long flags; |
2271 | diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c |
2272 | index 4b703492376a..00f61225386c 100644 |
2273 | --- a/drivers/pci/pcie/pme.c |
2274 | +++ b/drivers/pci/pcie/pme.c |
2275 | @@ -232,6 +232,9 @@ static void pcie_pme_work_fn(struct work_struct *work) |
2276 | break; |
2277 | |
2278 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); |
2279 | + if (rtsta == (u32) ~0) |
2280 | + break; |
2281 | + |
2282 | if (rtsta & PCI_EXP_RTSTA_PME) { |
2283 | /* |
2284 | * Clear PME status of the port. If there are other |
2285 | @@ -279,7 +282,7 @@ static irqreturn_t pcie_pme_irq(int irq, void *context) |
2286 | spin_lock_irqsave(&data->lock, flags); |
2287 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); |
2288 | |
2289 | - if (!(rtsta & PCI_EXP_RTSTA_PME)) { |
2290 | + if (rtsta == (u32) ~0 || !(rtsta & PCI_EXP_RTSTA_PME)) { |
2291 | spin_unlock_irqrestore(&data->lock, flags); |
2292 | return IRQ_NONE; |
2293 | } |
2294 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c |
2295 | index 60bada90cd75..a98be6db7e93 100644 |
2296 | --- a/drivers/pci/probe.c |
2297 | +++ b/drivers/pci/probe.c |
2298 | @@ -932,7 +932,8 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) |
2299 | child = pci_add_new_bus(bus, dev, max+1); |
2300 | if (!child) |
2301 | goto out; |
2302 | - pci_bus_insert_busn_res(child, max+1, 0xff); |
2303 | + pci_bus_insert_busn_res(child, max+1, |
2304 | + bus->busn_res.end); |
2305 | } |
2306 | max++; |
2307 | buses = (buses & 0xff000000) |
2308 | @@ -2136,6 +2137,10 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus) |
2309 | if (bus->self && bus->self->is_hotplug_bridge && pci_hotplug_bus_size) { |
2310 | if (max - bus->busn_res.start < pci_hotplug_bus_size - 1) |
2311 | max = bus->busn_res.start + pci_hotplug_bus_size - 1; |
2312 | + |
2313 | + /* Do not allocate more buses than we have room left */ |
2314 | + if (max > bus->busn_res.end) |
2315 | + max = bus->busn_res.end; |
2316 | } |
2317 | |
2318 | /* |
2319 | diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c |
2320 | index f9357e09e9b3..b6b9b5b74e30 100644 |
2321 | --- a/drivers/pci/remove.c |
2322 | +++ b/drivers/pci/remove.c |
2323 | @@ -19,9 +19,9 @@ static void pci_stop_dev(struct pci_dev *dev) |
2324 | pci_pme_active(dev, false); |
2325 | |
2326 | if (dev->is_added) { |
2327 | + device_release_driver(&dev->dev); |
2328 | pci_proc_detach_device(dev); |
2329 | pci_remove_sysfs_dev_files(dev); |
2330 | - device_release_driver(&dev->dev); |
2331 | dev->is_added = 0; |
2332 | } |
2333 | |
2334 | diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig |
2335 | index 671610c989b6..b0c0fa0444dd 100644 |
2336 | --- a/drivers/pinctrl/Kconfig |
2337 | +++ b/drivers/pinctrl/Kconfig |
2338 | @@ -26,7 +26,8 @@ config DEBUG_PINCTRL |
2339 | |
2340 | config PINCTRL_ADI2 |
2341 | bool "ADI pin controller driver" |
2342 | - depends on BLACKFIN |
2343 | + depends on (BF54x || BF60x) |
2344 | + depends on !GPIO_ADI |
2345 | select PINMUX |
2346 | select IRQ_DOMAIN |
2347 | help |
2348 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c |
2349 | index 09356684c32f..abd9d83f6009 100644 |
2350 | --- a/drivers/platform/x86/hp_accel.c |
2351 | +++ b/drivers/platform/x86/hp_accel.c |
2352 | @@ -240,6 +240,7 @@ static const struct dmi_system_id lis3lv02d_dmi_ids[] = { |
2353 | AXIS_DMI_MATCH("HDX18", "HP HDX 18", x_inverted), |
2354 | AXIS_DMI_MATCH("HPB432x", "HP ProBook 432", xy_rotated_left), |
2355 | AXIS_DMI_MATCH("HPB440G3", "HP ProBook 440 G3", x_inverted_usd), |
2356 | + AXIS_DMI_MATCH("HPB440G4", "HP ProBook 440 G4", x_inverted), |
2357 | AXIS_DMI_MATCH("HPB442x", "HP ProBook 442", xy_rotated_left), |
2358 | AXIS_DMI_MATCH("HPB452x", "HP ProBook 452", y_inverted), |
2359 | AXIS_DMI_MATCH("HPB522x", "HP ProBook 522", xy_swap), |
2360 | diff --git a/drivers/platform/x86/intel_punit_ipc.c b/drivers/platform/x86/intel_punit_ipc.c |
2361 | index a47a41fc10ad..b5b890127479 100644 |
2362 | --- a/drivers/platform/x86/intel_punit_ipc.c |
2363 | +++ b/drivers/platform/x86/intel_punit_ipc.c |
2364 | @@ -252,28 +252,28 @@ static int intel_punit_get_bars(struct platform_device *pdev) |
2365 | * - GTDRIVER_IPC BASE_IFACE |
2366 | */ |
2367 | res = platform_get_resource(pdev, IORESOURCE_MEM, 2); |
2368 | - if (res) { |
2369 | + if (res && resource_size(res) > 1) { |
2370 | addr = devm_ioremap_resource(&pdev->dev, res); |
2371 | if (!IS_ERR(addr)) |
2372 | punit_ipcdev->base[ISPDRIVER_IPC][BASE_DATA] = addr; |
2373 | } |
2374 | |
2375 | res = platform_get_resource(pdev, IORESOURCE_MEM, 3); |
2376 | - if (res) { |
2377 | + if (res && resource_size(res) > 1) { |
2378 | addr = devm_ioremap_resource(&pdev->dev, res); |
2379 | if (!IS_ERR(addr)) |
2380 | punit_ipcdev->base[ISPDRIVER_IPC][BASE_IFACE] = addr; |
2381 | } |
2382 | |
2383 | res = platform_get_resource(pdev, IORESOURCE_MEM, 4); |
2384 | - if (res) { |
2385 | + if (res && resource_size(res) > 1) { |
2386 | addr = devm_ioremap_resource(&pdev->dev, res); |
2387 | if (!IS_ERR(addr)) |
2388 | punit_ipcdev->base[GTDRIVER_IPC][BASE_DATA] = addr; |
2389 | } |
2390 | |
2391 | res = platform_get_resource(pdev, IORESOURCE_MEM, 5); |
2392 | - if (res) { |
2393 | + if (res && resource_size(res) > 1) { |
2394 | addr = devm_ioremap_resource(&pdev->dev, res); |
2395 | if (!IS_ERR(addr)) |
2396 | punit_ipcdev->base[GTDRIVER_IPC][BASE_IFACE] = addr; |
2397 | diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c |
2398 | index 1227ceab61ee..a4b8b603c807 100644 |
2399 | --- a/drivers/rtc/rtc-pcf8563.c |
2400 | +++ b/drivers/rtc/rtc-pcf8563.c |
2401 | @@ -422,7 +422,7 @@ static unsigned long pcf8563_clkout_recalc_rate(struct clk_hw *hw, |
2402 | return 0; |
2403 | |
2404 | buf &= PCF8563_REG_CLKO_F_MASK; |
2405 | - return clkout_rates[ret]; |
2406 | + return clkout_rates[buf]; |
2407 | } |
2408 | |
2409 | static long pcf8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate, |
2410 | diff --git a/drivers/scsi/bfa/bfad_debugfs.c b/drivers/scsi/bfa/bfad_debugfs.c |
2411 | index 8dcd8c70c7ee..05f523971348 100644 |
2412 | --- a/drivers/scsi/bfa/bfad_debugfs.c |
2413 | +++ b/drivers/scsi/bfa/bfad_debugfs.c |
2414 | @@ -255,7 +255,8 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf, |
2415 | struct bfad_s *bfad = port->bfad; |
2416 | struct bfa_s *bfa = &bfad->bfa; |
2417 | struct bfa_ioc_s *ioc = &bfa->ioc; |
2418 | - int addr, len, rc, i; |
2419 | + int addr, rc, i; |
2420 | + u32 len; |
2421 | u32 *regbuf; |
2422 | void __iomem *rb, *reg_addr; |
2423 | unsigned long flags; |
2424 | @@ -266,7 +267,7 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf, |
2425 | return PTR_ERR(kern_buf); |
2426 | |
2427 | rc = sscanf(kern_buf, "%x:%x", &addr, &len); |
2428 | - if (rc < 2) { |
2429 | + if (rc < 2 || len > (UINT_MAX >> 2)) { |
2430 | printk(KERN_INFO |
2431 | "bfad[%d]: %s failed to read user buf\n", |
2432 | bfad->inst_no, __func__); |
2433 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c |
2434 | index a1d6ab76a514..99623701fc3d 100644 |
2435 | --- a/drivers/scsi/hpsa.c |
2436 | +++ b/drivers/scsi/hpsa.c |
2437 | @@ -2951,7 +2951,7 @@ static int hpsa_send_reset(struct ctlr_info *h, unsigned char *scsi3addr, |
2438 | /* fill_cmd can't fail here, no data buffer to map. */ |
2439 | (void) fill_cmd(c, reset_type, h, NULL, 0, 0, |
2440 | scsi3addr, TYPE_MSG); |
2441 | - rc = hpsa_scsi_do_simple_cmd(h, c, reply_queue, DEFAULT_TIMEOUT); |
2442 | + rc = hpsa_scsi_do_simple_cmd(h, c, reply_queue, NO_TIMEOUT); |
2443 | if (rc) { |
2444 | dev_warn(&h->pdev->dev, "Failed to send reset command\n"); |
2445 | goto out; |
2446 | @@ -3686,7 +3686,7 @@ static int hpsa_get_volume_status(struct ctlr_info *h, |
2447 | * # (integer code indicating one of several NOT READY states |
2448 | * describing why a volume is to be kept offline) |
2449 | */ |
2450 | -static int hpsa_volume_offline(struct ctlr_info *h, |
2451 | +static unsigned char hpsa_volume_offline(struct ctlr_info *h, |
2452 | unsigned char scsi3addr[]) |
2453 | { |
2454 | struct CommandList *c; |
2455 | @@ -3707,7 +3707,7 @@ static int hpsa_volume_offline(struct ctlr_info *h, |
2456 | DEFAULT_TIMEOUT); |
2457 | if (rc) { |
2458 | cmd_free(h, c); |
2459 | - return 0; |
2460 | + return HPSA_VPD_LV_STATUS_UNSUPPORTED; |
2461 | } |
2462 | sense = c->err_info->SenseInfo; |
2463 | if (c->err_info->SenseLen > sizeof(c->err_info->SenseInfo)) |
2464 | @@ -3718,19 +3718,13 @@ static int hpsa_volume_offline(struct ctlr_info *h, |
2465 | cmd_status = c->err_info->CommandStatus; |
2466 | scsi_status = c->err_info->ScsiStatus; |
2467 | cmd_free(h, c); |
2468 | - /* Is the volume 'not ready'? */ |
2469 | - if (cmd_status != CMD_TARGET_STATUS || |
2470 | - scsi_status != SAM_STAT_CHECK_CONDITION || |
2471 | - sense_key != NOT_READY || |
2472 | - asc != ASC_LUN_NOT_READY) { |
2473 | - return 0; |
2474 | - } |
2475 | |
2476 | /* Determine the reason for not ready state */ |
2477 | ldstat = hpsa_get_volume_status(h, scsi3addr); |
2478 | |
2479 | /* Keep volume offline in certain cases: */ |
2480 | switch (ldstat) { |
2481 | + case HPSA_LV_FAILED: |
2482 | case HPSA_LV_UNDERGOING_ERASE: |
2483 | case HPSA_LV_NOT_AVAILABLE: |
2484 | case HPSA_LV_UNDERGOING_RPI: |
2485 | @@ -3752,7 +3746,7 @@ static int hpsa_volume_offline(struct ctlr_info *h, |
2486 | default: |
2487 | break; |
2488 | } |
2489 | - return 0; |
2490 | + return HPSA_LV_OK; |
2491 | } |
2492 | |
2493 | /* |
2494 | @@ -3825,10 +3819,10 @@ static int hpsa_update_device_info(struct ctlr_info *h, |
2495 | /* Do an inquiry to the device to see what it is. */ |
2496 | if (hpsa_scsi_do_inquiry(h, scsi3addr, 0, inq_buff, |
2497 | (unsigned char) OBDR_TAPE_INQ_SIZE) != 0) { |
2498 | - /* Inquiry failed (msg printed already) */ |
2499 | dev_err(&h->pdev->dev, |
2500 | - "hpsa_update_device_info: inquiry failed\n"); |
2501 | - rc = -EIO; |
2502 | + "%s: inquiry failed, device will be skipped.\n", |
2503 | + __func__); |
2504 | + rc = HPSA_INQUIRY_FAILED; |
2505 | goto bail_out; |
2506 | } |
2507 | |
2508 | @@ -3857,15 +3851,19 @@ static int hpsa_update_device_info(struct ctlr_info *h, |
2509 | if ((this_device->devtype == TYPE_DISK || |
2510 | this_device->devtype == TYPE_ZBC) && |
2511 | is_logical_dev_addr_mode(scsi3addr)) { |
2512 | - int volume_offline; |
2513 | + unsigned char volume_offline; |
2514 | |
2515 | hpsa_get_raid_level(h, scsi3addr, &this_device->raid_level); |
2516 | if (h->fw_support & MISC_FW_RAID_OFFLOAD_BASIC) |
2517 | hpsa_get_ioaccel_status(h, scsi3addr, this_device); |
2518 | volume_offline = hpsa_volume_offline(h, scsi3addr); |
2519 | - if (volume_offline < 0 || volume_offline > 0xff) |
2520 | - volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED; |
2521 | - this_device->volume_offline = volume_offline & 0xff; |
2522 | + if (volume_offline == HPSA_LV_FAILED) { |
2523 | + rc = HPSA_LV_FAILED; |
2524 | + dev_err(&h->pdev->dev, |
2525 | + "%s: LV failed, device will be skipped.\n", |
2526 | + __func__); |
2527 | + goto bail_out; |
2528 | + } |
2529 | } else { |
2530 | this_device->raid_level = RAID_UNKNOWN; |
2531 | this_device->offload_config = 0; |
2532 | @@ -4353,8 +4351,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) |
2533 | goto out; |
2534 | } |
2535 | if (rc) { |
2536 | - dev_warn(&h->pdev->dev, |
2537 | - "Inquiry failed, skipping device.\n"); |
2538 | + h->drv_req_rescan = 1; |
2539 | continue; |
2540 | } |
2541 | |
2542 | @@ -5532,7 +5529,7 @@ static void hpsa_scan_complete(struct ctlr_info *h) |
2543 | |
2544 | spin_lock_irqsave(&h->scan_lock, flags); |
2545 | h->scan_finished = 1; |
2546 | - wake_up_all(&h->scan_wait_queue); |
2547 | + wake_up(&h->scan_wait_queue); |
2548 | spin_unlock_irqrestore(&h->scan_lock, flags); |
2549 | } |
2550 | |
2551 | @@ -5550,11 +5547,23 @@ static void hpsa_scan_start(struct Scsi_Host *sh) |
2552 | if (unlikely(lockup_detected(h))) |
2553 | return hpsa_scan_complete(h); |
2554 | |
2555 | + /* |
2556 | + * If a scan is already waiting to run, no need to add another |
2557 | + */ |
2558 | + spin_lock_irqsave(&h->scan_lock, flags); |
2559 | + if (h->scan_waiting) { |
2560 | + spin_unlock_irqrestore(&h->scan_lock, flags); |
2561 | + return; |
2562 | + } |
2563 | + |
2564 | + spin_unlock_irqrestore(&h->scan_lock, flags); |
2565 | + |
2566 | /* wait until any scan already in progress is finished. */ |
2567 | while (1) { |
2568 | spin_lock_irqsave(&h->scan_lock, flags); |
2569 | if (h->scan_finished) |
2570 | break; |
2571 | + h->scan_waiting = 1; |
2572 | spin_unlock_irqrestore(&h->scan_lock, flags); |
2573 | wait_event(h->scan_wait_queue, h->scan_finished); |
2574 | /* Note: We don't need to worry about a race between this |
2575 | @@ -5564,6 +5573,7 @@ static void hpsa_scan_start(struct Scsi_Host *sh) |
2576 | */ |
2577 | } |
2578 | h->scan_finished = 0; /* mark scan as in progress */ |
2579 | + h->scan_waiting = 0; |
2580 | spin_unlock_irqrestore(&h->scan_lock, flags); |
2581 | |
2582 | if (unlikely(lockup_detected(h))) |
2583 | @@ -8802,6 +8812,7 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
2584 | init_waitqueue_head(&h->event_sync_wait_queue); |
2585 | mutex_init(&h->reset_mutex); |
2586 | h->scan_finished = 1; /* no scan currently in progress */ |
2587 | + h->scan_waiting = 0; |
2588 | |
2589 | pci_set_drvdata(pdev, h); |
2590 | h->ndevices = 0; |
2591 | @@ -9094,6 +9105,8 @@ static void hpsa_remove_one(struct pci_dev *pdev) |
2592 | destroy_workqueue(h->rescan_ctlr_wq); |
2593 | destroy_workqueue(h->resubmit_wq); |
2594 | |
2595 | + hpsa_delete_sas_host(h); |
2596 | + |
2597 | /* |
2598 | * Call before disabling interrupts. |
2599 | * scsi_remove_host can trigger I/O operations especially |
2600 | @@ -9128,8 +9141,6 @@ static void hpsa_remove_one(struct pci_dev *pdev) |
2601 | h->lockup_detected = NULL; /* init_one 2 */ |
2602 | /* (void) pci_disable_pcie_error_reporting(pdev); */ /* init_one 1 */ |
2603 | |
2604 | - hpsa_delete_sas_host(h); |
2605 | - |
2606 | kfree(h); /* init_one 1 */ |
2607 | } |
2608 | |
2609 | @@ -9621,9 +9632,9 @@ static void hpsa_free_sas_phy(struct hpsa_sas_phy *hpsa_sas_phy) |
2610 | struct sas_phy *phy = hpsa_sas_phy->phy; |
2611 | |
2612 | sas_port_delete_phy(hpsa_sas_phy->parent_port->port, phy); |
2613 | - sas_phy_free(phy); |
2614 | if (hpsa_sas_phy->added_to_port) |
2615 | list_del(&hpsa_sas_phy->phy_list_entry); |
2616 | + sas_phy_delete(phy); |
2617 | kfree(hpsa_sas_phy); |
2618 | } |
2619 | |
2620 | diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h |
2621 | index 9ea162de80dc..e16f2945f6ac 100644 |
2622 | --- a/drivers/scsi/hpsa.h |
2623 | +++ b/drivers/scsi/hpsa.h |
2624 | @@ -203,6 +203,7 @@ struct ctlr_info { |
2625 | dma_addr_t errinfo_pool_dhandle; |
2626 | unsigned long *cmd_pool_bits; |
2627 | int scan_finished; |
2628 | + u8 scan_waiting : 1; |
2629 | spinlock_t scan_lock; |
2630 | wait_queue_head_t scan_wait_queue; |
2631 | |
2632 | diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h |
2633 | index a584cdf07058..5961705eef76 100644 |
2634 | --- a/drivers/scsi/hpsa_cmd.h |
2635 | +++ b/drivers/scsi/hpsa_cmd.h |
2636 | @@ -156,6 +156,7 @@ |
2637 | #define CFGTBL_BusType_Fibre2G 0x00000200l |
2638 | |
2639 | /* VPD Inquiry types */ |
2640 | +#define HPSA_INQUIRY_FAILED 0x02 |
2641 | #define HPSA_VPD_SUPPORTED_PAGES 0x00 |
2642 | #define HPSA_VPD_LV_DEVICE_ID 0x83 |
2643 | #define HPSA_VPD_LV_DEVICE_GEOMETRY 0xC1 |
2644 | @@ -166,6 +167,7 @@ |
2645 | /* Logical volume states */ |
2646 | #define HPSA_VPD_LV_STATUS_UNSUPPORTED 0xff |
2647 | #define HPSA_LV_OK 0x0 |
2648 | +#define HPSA_LV_FAILED 0x01 |
2649 | #define HPSA_LV_NOT_AVAILABLE 0x0b |
2650 | #define HPSA_LV_UNDERGOING_ERASE 0x0F |
2651 | #define HPSA_LV_UNDERGOING_RPI 0x12 |
2652 | diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c |
2653 | index cf04a364fd8b..2b0e61557317 100644 |
2654 | --- a/drivers/scsi/scsi_debug.c |
2655 | +++ b/drivers/scsi/scsi_debug.c |
2656 | @@ -2996,11 +2996,11 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num, |
2657 | if (-1 == ret) { |
2658 | write_unlock_irqrestore(&atomic_rw, iflags); |
2659 | return DID_ERROR << 16; |
2660 | - } else if (sdebug_verbose && (ret < (num * sdebug_sector_size))) |
2661 | + } else if (sdebug_verbose && !ndob && (ret < sdebug_sector_size)) |
2662 | sdev_printk(KERN_INFO, scp->device, |
2663 | - "%s: %s: cdb indicated=%u, IO sent=%d bytes\n", |
2664 | + "%s: %s: lb size=%u, IO sent=%d bytes\n", |
2665 | my_name, "write same", |
2666 | - num * sdebug_sector_size, ret); |
2667 | + sdebug_sector_size, ret); |
2668 | |
2669 | /* Copy first sector to remaining blocks */ |
2670 | for (i = 1 ; i < num ; i++) |
2671 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
2672 | index 246456925335..26e6b05d05fc 100644 |
2673 | --- a/drivers/scsi/scsi_devinfo.c |
2674 | +++ b/drivers/scsi/scsi_devinfo.c |
2675 | @@ -160,7 +160,7 @@ static struct { |
2676 | {"DGC", "RAID", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, storage on LUN 0 */ |
2677 | {"DGC", "DISK", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, no storage on LUN 0 */ |
2678 | {"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, |
2679 | - {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN}, |
2680 | + {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_REPORTLUN2}, |
2681 | {"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN}, |
2682 | {"easyRAID", "16P", NULL, BLIST_NOREPORTLUN}, |
2683 | {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN}, |
2684 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2685 | index 09fa1fd0c4ce..ace56c5e61e1 100644 |
2686 | --- a/drivers/scsi/sd.c |
2687 | +++ b/drivers/scsi/sd.c |
2688 | @@ -234,11 +234,15 @@ manage_start_stop_store(struct device *dev, struct device_attribute *attr, |
2689 | { |
2690 | struct scsi_disk *sdkp = to_scsi_disk(dev); |
2691 | struct scsi_device *sdp = sdkp->device; |
2692 | + bool v; |
2693 | |
2694 | if (!capable(CAP_SYS_ADMIN)) |
2695 | return -EACCES; |
2696 | |
2697 | - sdp->manage_start_stop = simple_strtoul(buf, NULL, 10); |
2698 | + if (kstrtobool(buf, &v)) |
2699 | + return -EINVAL; |
2700 | + |
2701 | + sdp->manage_start_stop = v; |
2702 | |
2703 | return count; |
2704 | } |
2705 | @@ -256,6 +260,7 @@ static ssize_t |
2706 | allow_restart_store(struct device *dev, struct device_attribute *attr, |
2707 | const char *buf, size_t count) |
2708 | { |
2709 | + bool v; |
2710 | struct scsi_disk *sdkp = to_scsi_disk(dev); |
2711 | struct scsi_device *sdp = sdkp->device; |
2712 | |
2713 | @@ -265,7 +270,10 @@ allow_restart_store(struct device *dev, struct device_attribute *attr, |
2714 | if (sdp->type != TYPE_DISK) |
2715 | return -EINVAL; |
2716 | |
2717 | - sdp->allow_restart = simple_strtoul(buf, NULL, 10); |
2718 | + if (kstrtobool(buf, &v)) |
2719 | + return -EINVAL; |
2720 | + |
2721 | + sdp->allow_restart = v; |
2722 | |
2723 | return count; |
2724 | } |
2725 | diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c |
2726 | index a5f10936fb9c..e929f5142862 100644 |
2727 | --- a/drivers/soc/mediatek/mtk-pmic-wrap.c |
2728 | +++ b/drivers/soc/mediatek/mtk-pmic-wrap.c |
2729 | @@ -522,7 +522,7 @@ struct pmic_wrapper_type { |
2730 | u32 int_en_all; |
2731 | u32 spi_w; |
2732 | u32 wdt_src; |
2733 | - int has_bridge:1; |
2734 | + unsigned int has_bridge:1; |
2735 | int (*init_reg_clock)(struct pmic_wrapper *wrp); |
2736 | int (*init_soc_specific)(struct pmic_wrapper *wrp); |
2737 | }; |
2738 | diff --git a/drivers/staging/rtl8188eu/core/rtw_cmd.c b/drivers/staging/rtl8188eu/core/rtw_cmd.c |
2739 | index f1f4788dbd86..6051a7ba0797 100644 |
2740 | --- a/drivers/staging/rtl8188eu/core/rtw_cmd.c |
2741 | +++ b/drivers/staging/rtl8188eu/core/rtw_cmd.c |
2742 | @@ -342,7 +342,7 @@ u8 rtw_createbss_cmd(struct adapter *padapter) |
2743 | else |
2744 | RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, (" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); |
2745 | |
2746 | - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); |
2747 | + pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); |
2748 | if (!pcmd) { |
2749 | res = _FAIL; |
2750 | goto exit; |
2751 | @@ -522,7 +522,7 @@ u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueu |
2752 | |
2753 | if (enqueue) { |
2754 | /* need enqueue, prepare cmd_obj and enqueue */ |
2755 | - cmdobj = kzalloc(sizeof(*cmdobj), GFP_KERNEL); |
2756 | + cmdobj = kzalloc(sizeof(*cmdobj), GFP_ATOMIC); |
2757 | if (!cmdobj) { |
2758 | res = _FAIL; |
2759 | kfree(param); |
2760 | diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c |
2761 | index f109eeac358d..ab96629b7889 100644 |
2762 | --- a/drivers/staging/vt6655/device_main.c |
2763 | +++ b/drivers/staging/vt6655/device_main.c |
2764 | @@ -1698,10 +1698,11 @@ static int vt6655_suspend(struct pci_dev *pcid, pm_message_t state) |
2765 | MACbShutdown(priv); |
2766 | |
2767 | pci_disable_device(pcid); |
2768 | - pci_set_power_state(pcid, pci_choose_state(pcid, state)); |
2769 | |
2770 | spin_unlock_irqrestore(&priv->lock, flags); |
2771 | |
2772 | + pci_set_power_state(pcid, pci_choose_state(pcid, state)); |
2773 | + |
2774 | return 0; |
2775 | } |
2776 | |
2777 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
2778 | index 0d578297d9f9..72e926d9868f 100644 |
2779 | --- a/drivers/target/iscsi/iscsi_target.c |
2780 | +++ b/drivers/target/iscsi/iscsi_target.c |
2781 | @@ -841,6 +841,7 @@ static int iscsit_add_reject_from_cmd( |
2782 | unsigned char *buf) |
2783 | { |
2784 | struct iscsi_conn *conn; |
2785 | + const bool do_put = cmd->se_cmd.se_tfo != NULL; |
2786 | |
2787 | if (!cmd->conn) { |
2788 | pr_err("cmd->conn is NULL for ITT: 0x%08x\n", |
2789 | @@ -871,7 +872,7 @@ static int iscsit_add_reject_from_cmd( |
2790 | * Perform the kref_put now if se_cmd has already been setup by |
2791 | * scsit_setup_scsi_cmd() |
2792 | */ |
2793 | - if (cmd->se_cmd.se_tfo != NULL) { |
2794 | + if (do_put) { |
2795 | pr_debug("iscsi reject: calling target_put_sess_cmd >>>>>>\n"); |
2796 | target_put_sess_cmd(&cmd->se_cmd); |
2797 | } |
2798 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c |
2799 | index 9cbbc9cf63fb..8a4bc15bc3f5 100644 |
2800 | --- a/drivers/target/iscsi/iscsi_target_configfs.c |
2801 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c |
2802 | @@ -1144,7 +1144,7 @@ static struct se_portal_group *lio_target_tiqn_addtpg( |
2803 | |
2804 | ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI); |
2805 | if (ret < 0) |
2806 | - return NULL; |
2807 | + goto free_out; |
2808 | |
2809 | ret = iscsit_tpg_add_portal_group(tiqn, tpg); |
2810 | if (ret != 0) |
2811 | @@ -1156,6 +1156,7 @@ static struct se_portal_group *lio_target_tiqn_addtpg( |
2812 | return &tpg->tpg_se_tpg; |
2813 | out: |
2814 | core_tpg_deregister(&tpg->tpg_se_tpg); |
2815 | +free_out: |
2816 | kfree(tpg); |
2817 | return NULL; |
2818 | } |
2819 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c |
2820 | index 4c82bbe19003..ee5b29aed54b 100644 |
2821 | --- a/drivers/target/target_core_alua.c |
2822 | +++ b/drivers/target/target_core_alua.c |
2823 | @@ -1010,7 +1010,7 @@ static void core_alua_queue_state_change_ua(struct t10_alua_tg_pt_gp *tg_pt_gp) |
2824 | static void core_alua_do_transition_tg_pt_work(struct work_struct *work) |
2825 | { |
2826 | struct t10_alua_tg_pt_gp *tg_pt_gp = container_of(work, |
2827 | - struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work.work); |
2828 | + struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work); |
2829 | struct se_device *dev = tg_pt_gp->tg_pt_gp_dev; |
2830 | bool explicit = (tg_pt_gp->tg_pt_gp_alua_access_status == |
2831 | ALUA_STATUS_ALTERED_BY_EXPLICIT_STPG); |
2832 | @@ -1073,17 +1073,8 @@ static int core_alua_do_transition_tg_pt( |
2833 | /* |
2834 | * Flush any pending transitions |
2835 | */ |
2836 | - if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs && |
2837 | - atomic_read(&tg_pt_gp->tg_pt_gp_alua_access_state) == |
2838 | - ALUA_ACCESS_STATE_TRANSITION) { |
2839 | - /* Just in case */ |
2840 | - tg_pt_gp->tg_pt_gp_alua_pending_state = new_state; |
2841 | - tg_pt_gp->tg_pt_gp_transition_complete = &wait; |
2842 | - flush_delayed_work(&tg_pt_gp->tg_pt_gp_transition_work); |
2843 | - wait_for_completion(&wait); |
2844 | - tg_pt_gp->tg_pt_gp_transition_complete = NULL; |
2845 | - return 0; |
2846 | - } |
2847 | + if (!explicit) |
2848 | + flush_work(&tg_pt_gp->tg_pt_gp_transition_work); |
2849 | |
2850 | /* |
2851 | * Save the old primary ALUA access state, and set the current state |
2852 | @@ -1114,17 +1105,9 @@ static int core_alua_do_transition_tg_pt( |
2853 | atomic_inc(&tg_pt_gp->tg_pt_gp_ref_cnt); |
2854 | spin_unlock(&dev->t10_alua.tg_pt_gps_lock); |
2855 | |
2856 | - if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs) { |
2857 | - unsigned long transition_tmo; |
2858 | - |
2859 | - transition_tmo = tg_pt_gp->tg_pt_gp_implicit_trans_secs * HZ; |
2860 | - queue_delayed_work(tg_pt_gp->tg_pt_gp_dev->tmr_wq, |
2861 | - &tg_pt_gp->tg_pt_gp_transition_work, |
2862 | - transition_tmo); |
2863 | - } else { |
2864 | + schedule_work(&tg_pt_gp->tg_pt_gp_transition_work); |
2865 | + if (explicit) { |
2866 | tg_pt_gp->tg_pt_gp_transition_complete = &wait; |
2867 | - queue_delayed_work(tg_pt_gp->tg_pt_gp_dev->tmr_wq, |
2868 | - &tg_pt_gp->tg_pt_gp_transition_work, 0); |
2869 | wait_for_completion(&wait); |
2870 | tg_pt_gp->tg_pt_gp_transition_complete = NULL; |
2871 | } |
2872 | @@ -1692,8 +1675,8 @@ struct t10_alua_tg_pt_gp *core_alua_allocate_tg_pt_gp(struct se_device *dev, |
2873 | mutex_init(&tg_pt_gp->tg_pt_gp_md_mutex); |
2874 | spin_lock_init(&tg_pt_gp->tg_pt_gp_lock); |
2875 | atomic_set(&tg_pt_gp->tg_pt_gp_ref_cnt, 0); |
2876 | - INIT_DELAYED_WORK(&tg_pt_gp->tg_pt_gp_transition_work, |
2877 | - core_alua_do_transition_tg_pt_work); |
2878 | + INIT_WORK(&tg_pt_gp->tg_pt_gp_transition_work, |
2879 | + core_alua_do_transition_tg_pt_work); |
2880 | tg_pt_gp->tg_pt_gp_dev = dev; |
2881 | atomic_set(&tg_pt_gp->tg_pt_gp_alua_access_state, |
2882 | ALUA_ACCESS_STATE_ACTIVE_OPTIMIZED); |
2883 | @@ -1801,7 +1784,7 @@ void core_alua_free_tg_pt_gp( |
2884 | dev->t10_alua.alua_tg_pt_gps_counter--; |
2885 | spin_unlock(&dev->t10_alua.tg_pt_gps_lock); |
2886 | |
2887 | - flush_delayed_work(&tg_pt_gp->tg_pt_gp_transition_work); |
2888 | + flush_work(&tg_pt_gp->tg_pt_gp_transition_work); |
2889 | |
2890 | /* |
2891 | * Allow a struct t10_alua_tg_pt_gp_member * referenced by |
2892 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c |
2893 | index 29f807b29e74..97928b42ad62 100644 |
2894 | --- a/drivers/target/target_core_file.c |
2895 | +++ b/drivers/target/target_core_file.c |
2896 | @@ -466,6 +466,10 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) |
2897 | struct inode *inode = file->f_mapping->host; |
2898 | int ret; |
2899 | |
2900 | + if (!nolb) { |
2901 | + return 0; |
2902 | + } |
2903 | + |
2904 | if (cmd->se_dev->dev_attrib.pi_prot_type) { |
2905 | ret = fd_do_prot_unmap(cmd, lba, nolb); |
2906 | if (ret) |
2907 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
2908 | index 47463c99c318..df20921c233c 100644 |
2909 | --- a/drivers/target/target_core_pr.c |
2910 | +++ b/drivers/target/target_core_pr.c |
2911 | @@ -56,8 +56,10 @@ void core_pr_dump_initiator_port( |
2912 | char *buf, |
2913 | u32 size) |
2914 | { |
2915 | - if (!pr_reg->isid_present_at_reg) |
2916 | + if (!pr_reg->isid_present_at_reg) { |
2917 | buf[0] = '\0'; |
2918 | + return; |
2919 | + } |
2920 | |
2921 | snprintf(buf, size, ",i,0x%s", pr_reg->pr_reg_isid); |
2922 | } |
2923 | diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c |
2924 | index bcef2e7c4ec9..1eea63caa451 100644 |
2925 | --- a/drivers/thermal/step_wise.c |
2926 | +++ b/drivers/thermal/step_wise.c |
2927 | @@ -31,8 +31,7 @@ |
2928 | * If the temperature is higher than a trip point, |
2929 | * a. if the trend is THERMAL_TREND_RAISING, use higher cooling |
2930 | * state for this trip point |
2931 | - * b. if the trend is THERMAL_TREND_DROPPING, use lower cooling |
2932 | - * state for this trip point |
2933 | + * b. if the trend is THERMAL_TREND_DROPPING, do nothing |
2934 | * c. if the trend is THERMAL_TREND_RAISE_FULL, use upper limit |
2935 | * for this trip point |
2936 | * d. if the trend is THERMAL_TREND_DROP_FULL, use lower limit |
2937 | @@ -94,9 +93,11 @@ static unsigned long get_target_state(struct thermal_instance *instance, |
2938 | if (!throttle) |
2939 | next_target = THERMAL_NO_TARGET; |
2940 | } else { |
2941 | - next_target = cur_state - 1; |
2942 | - if (next_target > instance->upper) |
2943 | - next_target = instance->upper; |
2944 | + if (!throttle) { |
2945 | + next_target = cur_state - 1; |
2946 | + if (next_target > instance->upper) |
2947 | + next_target = instance->upper; |
2948 | + } |
2949 | } |
2950 | break; |
2951 | case THERMAL_TREND_DROP_FULL: |
2952 | diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c |
2953 | index 68947f6de5ad..b0500a0a87b8 100644 |
2954 | --- a/drivers/tty/tty_ldisc.c |
2955 | +++ b/drivers/tty/tty_ldisc.c |
2956 | @@ -271,10 +271,13 @@ const struct file_operations tty_ldiscs_proc_fops = { |
2957 | |
2958 | struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty) |
2959 | { |
2960 | + struct tty_ldisc *ld; |
2961 | + |
2962 | ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT); |
2963 | - if (!tty->ldisc) |
2964 | + ld = tty->ldisc; |
2965 | + if (!ld) |
2966 | ldsem_up_read(&tty->ldisc_sem); |
2967 | - return tty->ldisc; |
2968 | + return ld; |
2969 | } |
2970 | EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait); |
2971 | |
2972 | @@ -488,41 +491,6 @@ static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld) |
2973 | tty_ldisc_debug(tty, "%p: closed\n", ld); |
2974 | } |
2975 | |
2976 | -/** |
2977 | - * tty_ldisc_restore - helper for tty ldisc change |
2978 | - * @tty: tty to recover |
2979 | - * @old: previous ldisc |
2980 | - * |
2981 | - * Restore the previous line discipline or N_TTY when a line discipline |
2982 | - * change fails due to an open error |
2983 | - */ |
2984 | - |
2985 | -static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) |
2986 | -{ |
2987 | - struct tty_ldisc *new_ldisc; |
2988 | - int r; |
2989 | - |
2990 | - /* There is an outstanding reference here so this is safe */ |
2991 | - old = tty_ldisc_get(tty, old->ops->num); |
2992 | - WARN_ON(IS_ERR(old)); |
2993 | - tty->ldisc = old; |
2994 | - tty_set_termios_ldisc(tty, old->ops->num); |
2995 | - if (tty_ldisc_open(tty, old) < 0) { |
2996 | - tty_ldisc_put(old); |
2997 | - /* This driver is always present */ |
2998 | - new_ldisc = tty_ldisc_get(tty, N_TTY); |
2999 | - if (IS_ERR(new_ldisc)) |
3000 | - panic("n_tty: get"); |
3001 | - tty->ldisc = new_ldisc; |
3002 | - tty_set_termios_ldisc(tty, N_TTY); |
3003 | - r = tty_ldisc_open(tty, new_ldisc); |
3004 | - if (r < 0) |
3005 | - panic("Couldn't open N_TTY ldisc for " |
3006 | - "%s --- error %d.", |
3007 | - tty_name(tty), r); |
3008 | - } |
3009 | -} |
3010 | - |
3011 | /** |
3012 | * tty_set_ldisc - set line discipline |
3013 | * @tty: the terminal to set |
3014 | @@ -536,12 +504,7 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) |
3015 | |
3016 | int tty_set_ldisc(struct tty_struct *tty, int disc) |
3017 | { |
3018 | - int retval; |
3019 | - struct tty_ldisc *old_ldisc, *new_ldisc; |
3020 | - |
3021 | - new_ldisc = tty_ldisc_get(tty, disc); |
3022 | - if (IS_ERR(new_ldisc)) |
3023 | - return PTR_ERR(new_ldisc); |
3024 | + int retval, old_disc; |
3025 | |
3026 | tty_lock(tty); |
3027 | retval = tty_ldisc_lock(tty, 5 * HZ); |
3028 | @@ -554,7 +517,8 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) |
3029 | } |
3030 | |
3031 | /* Check the no-op case */ |
3032 | - if (tty->ldisc->ops->num == disc) |
3033 | + old_disc = tty->ldisc->ops->num; |
3034 | + if (old_disc == disc) |
3035 | goto out; |
3036 | |
3037 | if (test_bit(TTY_HUPPED, &tty->flags)) { |
3038 | @@ -563,34 +527,25 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) |
3039 | goto out; |
3040 | } |
3041 | |
3042 | - old_ldisc = tty->ldisc; |
3043 | - |
3044 | - /* Shutdown the old discipline. */ |
3045 | - tty_ldisc_close(tty, old_ldisc); |
3046 | - |
3047 | - /* Now set up the new line discipline. */ |
3048 | - tty->ldisc = new_ldisc; |
3049 | - tty_set_termios_ldisc(tty, disc); |
3050 | - |
3051 | - retval = tty_ldisc_open(tty, new_ldisc); |
3052 | + retval = tty_ldisc_reinit(tty, disc); |
3053 | if (retval < 0) { |
3054 | /* Back to the old one or N_TTY if we can't */ |
3055 | - tty_ldisc_put(new_ldisc); |
3056 | - tty_ldisc_restore(tty, old_ldisc); |
3057 | + if (tty_ldisc_reinit(tty, old_disc) < 0) { |
3058 | + pr_err("tty: TIOCSETD failed, reinitializing N_TTY\n"); |
3059 | + if (tty_ldisc_reinit(tty, N_TTY) < 0) { |
3060 | + /* At this point we have tty->ldisc == NULL. */ |
3061 | + pr_err("tty: reinitializing N_TTY failed\n"); |
3062 | + } |
3063 | + } |
3064 | } |
3065 | |
3066 | - if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) { |
3067 | + if (tty->ldisc && tty->ldisc->ops->num != old_disc && |
3068 | + tty->ops->set_ldisc) { |
3069 | down_read(&tty->termios_rwsem); |
3070 | tty->ops->set_ldisc(tty); |
3071 | up_read(&tty->termios_rwsem); |
3072 | } |
3073 | |
3074 | - /* At this point we hold a reference to the new ldisc and a |
3075 | - reference to the old ldisc, or we hold two references to |
3076 | - the old ldisc (if it was restored as part of error cleanup |
3077 | - above). In either case, releasing a single reference from |
3078 | - the old ldisc is correct. */ |
3079 | - new_ldisc = old_ldisc; |
3080 | out: |
3081 | tty_ldisc_unlock(tty); |
3082 | |
3083 | @@ -598,7 +553,6 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) |
3084 | already running */ |
3085 | tty_buffer_restart_work(tty->port); |
3086 | err: |
3087 | - tty_ldisc_put(new_ldisc); /* drop the extra reference */ |
3088 | tty_unlock(tty); |
3089 | return retval; |
3090 | } |
3091 | @@ -659,10 +613,8 @@ int tty_ldisc_reinit(struct tty_struct *tty, int disc) |
3092 | int retval; |
3093 | |
3094 | ld = tty_ldisc_get(tty, disc); |
3095 | - if (IS_ERR(ld)) { |
3096 | - BUG_ON(disc == N_TTY); |
3097 | + if (IS_ERR(ld)) |
3098 | return PTR_ERR(ld); |
3099 | - } |
3100 | |
3101 | if (tty->ldisc) { |
3102 | tty_ldisc_close(tty, tty->ldisc); |
3103 | @@ -674,10 +626,8 @@ int tty_ldisc_reinit(struct tty_struct *tty, int disc) |
3104 | tty_set_termios_ldisc(tty, disc); |
3105 | retval = tty_ldisc_open(tty, tty->ldisc); |
3106 | if (retval) { |
3107 | - if (!WARN_ON(disc == N_TTY)) { |
3108 | - tty_ldisc_put(tty->ldisc); |
3109 | - tty->ldisc = NULL; |
3110 | - } |
3111 | + tty_ldisc_put(tty->ldisc); |
3112 | + tty->ldisc = NULL; |
3113 | } |
3114 | return retval; |
3115 | } |
3116 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
3117 | index 5ebe04d3598b..ba9b29bc441f 100644 |
3118 | --- a/drivers/usb/core/config.c |
3119 | +++ b/drivers/usb/core/config.c |
3120 | @@ -550,6 +550,9 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, |
3121 | unsigned iad_num = 0; |
3122 | |
3123 | memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); |
3124 | + nintf = nintf_orig = config->desc.bNumInterfaces; |
3125 | + config->desc.bNumInterfaces = 0; // Adjusted later |
3126 | + |
3127 | if (config->desc.bDescriptorType != USB_DT_CONFIG || |
3128 | config->desc.bLength < USB_DT_CONFIG_SIZE || |
3129 | config->desc.bLength > size) { |
3130 | @@ -563,7 +566,6 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, |
3131 | buffer += config->desc.bLength; |
3132 | size -= config->desc.bLength; |
3133 | |
3134 | - nintf = nintf_orig = config->desc.bNumInterfaces; |
3135 | if (nintf > USB_MAXINTERFACES) { |
3136 | dev_warn(ddev, "config %d has too many interfaces: %d, " |
3137 | "using maximum allowed: %d\n", |
3138 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
3139 | index a3ecd8bd5324..82eea55a7b5c 100644 |
3140 | --- a/drivers/usb/host/xhci-mem.c |
3141 | +++ b/drivers/usb/host/xhci-mem.c |
3142 | @@ -1032,10 +1032,9 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, |
3143 | return 0; |
3144 | } |
3145 | |
3146 | - xhci->devs[slot_id] = kzalloc(sizeof(*xhci->devs[slot_id]), flags); |
3147 | - if (!xhci->devs[slot_id]) |
3148 | + dev = kzalloc(sizeof(*dev), flags); |
3149 | + if (!dev) |
3150 | return 0; |
3151 | - dev = xhci->devs[slot_id]; |
3152 | |
3153 | /* Allocate the (output) device context that will be used in the HC. */ |
3154 | dev->out_ctx = xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_DEVICE, flags); |
3155 | @@ -1083,9 +1082,17 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, |
3156 | &xhci->dcbaa->dev_context_ptrs[slot_id], |
3157 | le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id])); |
3158 | |
3159 | + xhci->devs[slot_id] = dev; |
3160 | + |
3161 | return 1; |
3162 | fail: |
3163 | - xhci_free_virt_device(xhci, slot_id); |
3164 | + |
3165 | + if (dev->in_ctx) |
3166 | + xhci_free_container_ctx(xhci, dev->in_ctx); |
3167 | + if (dev->out_ctx) |
3168 | + xhci_free_container_ctx(xhci, dev->out_ctx); |
3169 | + kfree(dev); |
3170 | + |
3171 | return 0; |
3172 | } |
3173 | |
3174 | diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c |
3175 | index f2365a47fa4a..ce9e457e60c3 100644 |
3176 | --- a/drivers/usb/host/xhci-mtk.c |
3177 | +++ b/drivers/usb/host/xhci-mtk.c |
3178 | @@ -632,13 +632,13 @@ static int xhci_mtk_probe(struct platform_device *pdev) |
3179 | goto power_off_phys; |
3180 | } |
3181 | |
3182 | - if (HCC_MAX_PSA(xhci->hcc_params) >= 4) |
3183 | - xhci->shared_hcd->can_do_streams = 1; |
3184 | - |
3185 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); |
3186 | if (ret) |
3187 | goto put_usb3_hcd; |
3188 | |
3189 | + if (HCC_MAX_PSA(xhci->hcc_params) >= 4) |
3190 | + xhci->shared_hcd->can_do_streams = 1; |
3191 | + |
3192 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); |
3193 | if (ret) |
3194 | goto dealloc_usb2_hcd; |
3195 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
3196 | index 63735b5310bb..89a14d5f6ad8 100644 |
3197 | --- a/drivers/usb/host/xhci-ring.c |
3198 | +++ b/drivers/usb/host/xhci-ring.c |
3199 | @@ -3132,7 +3132,7 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred, |
3200 | { |
3201 | u32 maxp, total_packet_count; |
3202 | |
3203 | - /* MTK xHCI is mostly 0.97 but contains some features from 1.0 */ |
3204 | + /* MTK xHCI 0.96 contains some features from 1.0 */ |
3205 | if (xhci->hci_version < 0x100 && !(xhci->quirks & XHCI_MTK_HOST)) |
3206 | return ((td_total_len - transferred) >> 10); |
3207 | |
3208 | @@ -3141,8 +3141,8 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred, |
3209 | trb_buff_len == td_total_len) |
3210 | return 0; |
3211 | |
3212 | - /* for MTK xHCI, TD size doesn't include this TRB */ |
3213 | - if (xhci->quirks & XHCI_MTK_HOST) |
3214 | + /* for MTK xHCI 0.96, TD size include this TRB, but not in 1.x */ |
3215 | + if ((xhci->quirks & XHCI_MTK_HOST) && (xhci->hci_version < 0x100)) |
3216 | trb_buff_len = 0; |
3217 | |
3218 | maxp = GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc)); |
3219 | diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c |
3220 | index bacee0fd4dd3..ea5bad49394b 100644 |
3221 | --- a/drivers/usb/musb/da8xx.c |
3222 | +++ b/drivers/usb/musb/da8xx.c |
3223 | @@ -302,7 +302,15 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) |
3224 | musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; |
3225 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); |
3226 | del_timer(&otg_workaround); |
3227 | - } else { |
3228 | + } else if (!(musb->int_usb & MUSB_INTR_BABBLE)){ |
3229 | + /* |
3230 | + * When babble condition happens, drvvbus interrupt |
3231 | + * is also generated. Ignore this drvvbus interrupt |
3232 | + * and let babble interrupt handler recovers the |
3233 | + * controller; otherwise, the host-mode flag is lost |
3234 | + * due to the MUSB_DEV_MODE() call below and babble |
3235 | + * recovery logic will not called. |
3236 | + */ |
3237 | musb->is_active = 0; |
3238 | MUSB_DEV_MODE(musb); |
3239 | otg->default_a = 0; |
3240 | diff --git a/drivers/usb/phy/phy-isp1301.c b/drivers/usb/phy/phy-isp1301.c |
3241 | index db68156568e6..b3b33cf7ddf6 100644 |
3242 | --- a/drivers/usb/phy/phy-isp1301.c |
3243 | +++ b/drivers/usb/phy/phy-isp1301.c |
3244 | @@ -33,6 +33,12 @@ static const struct i2c_device_id isp1301_id[] = { |
3245 | }; |
3246 | MODULE_DEVICE_TABLE(i2c, isp1301_id); |
3247 | |
3248 | +static const struct of_device_id isp1301_of_match[] = { |
3249 | + {.compatible = "nxp,isp1301" }, |
3250 | + { }, |
3251 | +}; |
3252 | +MODULE_DEVICE_TABLE(of, isp1301_of_match); |
3253 | + |
3254 | static struct i2c_client *isp1301_i2c_client; |
3255 | |
3256 | static int __isp1301_write(struct isp1301 *isp, u8 reg, u8 value, u8 clear) |
3257 | @@ -130,6 +136,7 @@ static int isp1301_remove(struct i2c_client *client) |
3258 | static struct i2c_driver isp1301_driver = { |
3259 | .driver = { |
3260 | .name = DRV_NAME, |
3261 | + .of_match_table = of_match_ptr(isp1301_of_match), |
3262 | }, |
3263 | .probe = isp1301_probe, |
3264 | .remove = isp1301_remove, |
3265 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
3266 | index 2572fd5cd2bb..b605115eb47a 100644 |
3267 | --- a/drivers/usb/storage/unusual_devs.h |
3268 | +++ b/drivers/usb/storage/unusual_devs.h |
3269 | @@ -2113,6 +2113,13 @@ UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116, |
3270 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3271 | US_FL_BROKEN_FUA ), |
3272 | |
3273 | +/* Reported by David Kozub <zub@linux.fjfi.cvut.cz> */ |
3274 | +UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, |
3275 | + "JMicron", |
3276 | + "JMS567", |
3277 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3278 | + US_FL_BROKEN_FUA), |
3279 | + |
3280 | /* |
3281 | * Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br> |
3282 | * JMicron responds to USN and several other SCSI ioctls with a |
3283 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h |
3284 | index cde115359793..9f356f7cf7d5 100644 |
3285 | --- a/drivers/usb/storage/unusual_uas.h |
3286 | +++ b/drivers/usb/storage/unusual_uas.h |
3287 | @@ -142,6 +142,13 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, |
3288 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3289 | US_FL_BROKEN_FUA | US_FL_NO_REPORT_OPCODES), |
3290 | |
3291 | +/* Reported-by: David Kozub <zub@linux.fjfi.cvut.cz> */ |
3292 | +UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, |
3293 | + "JMicron", |
3294 | + "JMS567", |
3295 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
3296 | + US_FL_BROKEN_FUA), |
3297 | + |
3298 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ |
3299 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, |
3300 | "VIA", |
3301 | diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c |
3302 | index 191b176ffedf..283a9be77a22 100644 |
3303 | --- a/drivers/usb/usbip/stub_rx.c |
3304 | +++ b/drivers/usb/usbip/stub_rx.c |
3305 | @@ -336,23 +336,34 @@ static struct stub_priv *stub_priv_alloc(struct stub_device *sdev, |
3306 | return priv; |
3307 | } |
3308 | |
3309 | -static int get_pipe(struct stub_device *sdev, int epnum, int dir) |
3310 | +static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) |
3311 | { |
3312 | struct usb_device *udev = sdev->udev; |
3313 | struct usb_host_endpoint *ep; |
3314 | struct usb_endpoint_descriptor *epd = NULL; |
3315 | + int epnum = pdu->base.ep; |
3316 | + int dir = pdu->base.direction; |
3317 | + |
3318 | + if (epnum < 0 || epnum > 15) |
3319 | + goto err_ret; |
3320 | |
3321 | if (dir == USBIP_DIR_IN) |
3322 | ep = udev->ep_in[epnum & 0x7f]; |
3323 | else |
3324 | ep = udev->ep_out[epnum & 0x7f]; |
3325 | - if (!ep) { |
3326 | - dev_err(&sdev->udev->dev, "no such endpoint?, %d\n", |
3327 | - epnum); |
3328 | - BUG(); |
3329 | - } |
3330 | + if (!ep) |
3331 | + goto err_ret; |
3332 | |
3333 | epd = &ep->desc; |
3334 | + |
3335 | + /* validate transfer_buffer_length */ |
3336 | + if (pdu->u.cmd_submit.transfer_buffer_length > INT_MAX) { |
3337 | + dev_err(&sdev->udev->dev, |
3338 | + "CMD_SUBMIT: -EMSGSIZE transfer_buffer_length %d\n", |
3339 | + pdu->u.cmd_submit.transfer_buffer_length); |
3340 | + return -1; |
3341 | + } |
3342 | + |
3343 | if (usb_endpoint_xfer_control(epd)) { |
3344 | if (dir == USBIP_DIR_OUT) |
3345 | return usb_sndctrlpipe(udev, epnum); |
3346 | @@ -375,15 +386,31 @@ static int get_pipe(struct stub_device *sdev, int epnum, int dir) |
3347 | } |
3348 | |
3349 | if (usb_endpoint_xfer_isoc(epd)) { |
3350 | + /* validate packet size and number of packets */ |
3351 | + unsigned int maxp, packets, bytes; |
3352 | + |
3353 | + maxp = usb_endpoint_maxp(epd); |
3354 | + maxp *= usb_endpoint_maxp_mult(epd); |
3355 | + bytes = pdu->u.cmd_submit.transfer_buffer_length; |
3356 | + packets = DIV_ROUND_UP(bytes, maxp); |
3357 | + |
3358 | + if (pdu->u.cmd_submit.number_of_packets < 0 || |
3359 | + pdu->u.cmd_submit.number_of_packets > packets) { |
3360 | + dev_err(&sdev->udev->dev, |
3361 | + "CMD_SUBMIT: isoc invalid num packets %d\n", |
3362 | + pdu->u.cmd_submit.number_of_packets); |
3363 | + return -1; |
3364 | + } |
3365 | if (dir == USBIP_DIR_OUT) |
3366 | return usb_sndisocpipe(udev, epnum); |
3367 | else |
3368 | return usb_rcvisocpipe(udev, epnum); |
3369 | } |
3370 | |
3371 | +err_ret: |
3372 | /* NOT REACHED */ |
3373 | - dev_err(&sdev->udev->dev, "get pipe, epnum %d\n", epnum); |
3374 | - return 0; |
3375 | + dev_err(&sdev->udev->dev, "CMD_SUBMIT: invalid epnum %d\n", epnum); |
3376 | + return -1; |
3377 | } |
3378 | |
3379 | static void masking_bogus_flags(struct urb *urb) |
3380 | @@ -447,7 +474,10 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, |
3381 | struct stub_priv *priv; |
3382 | struct usbip_device *ud = &sdev->ud; |
3383 | struct usb_device *udev = sdev->udev; |
3384 | - int pipe = get_pipe(sdev, pdu->base.ep, pdu->base.direction); |
3385 | + int pipe = get_pipe(sdev, pdu); |
3386 | + |
3387 | + if (pipe == -1) |
3388 | + return; |
3389 | |
3390 | priv = stub_priv_alloc(sdev, pdu); |
3391 | if (!priv) |
3392 | @@ -466,7 +496,8 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, |
3393 | } |
3394 | |
3395 | /* allocate urb transfer buffer, if needed */ |
3396 | - if (pdu->u.cmd_submit.transfer_buffer_length > 0) { |
3397 | + if (pdu->u.cmd_submit.transfer_buffer_length > 0 && |
3398 | + pdu->u.cmd_submit.transfer_buffer_length <= INT_MAX) { |
3399 | priv->urb->transfer_buffer = |
3400 | kzalloc(pdu->u.cmd_submit.transfer_buffer_length, |
3401 | GFP_KERNEL); |
3402 | diff --git a/drivers/usb/usbip/stub_tx.c b/drivers/usb/usbip/stub_tx.c |
3403 | index be50cef645d8..87ff94be4235 100644 |
3404 | --- a/drivers/usb/usbip/stub_tx.c |
3405 | +++ b/drivers/usb/usbip/stub_tx.c |
3406 | @@ -181,6 +181,13 @@ static int stub_send_ret_submit(struct stub_device *sdev) |
3407 | memset(&pdu_header, 0, sizeof(pdu_header)); |
3408 | memset(&msg, 0, sizeof(msg)); |
3409 | |
3410 | + if (urb->actual_length > 0 && !urb->transfer_buffer) { |
3411 | + dev_err(&sdev->udev->dev, |
3412 | + "urb: actual_length %d transfer_buffer null\n", |
3413 | + urb->actual_length); |
3414 | + return -1; |
3415 | + } |
3416 | + |
3417 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) |
3418 | iovnum = 2 + urb->number_of_packets; |
3419 | else |
3420 | diff --git a/drivers/video/fbdev/au1200fb.c b/drivers/video/fbdev/au1200fb.c |
3421 | index 6c2b2ca4a909..44c2be15a08b 100644 |
3422 | --- a/drivers/video/fbdev/au1200fb.c |
3423 | +++ b/drivers/video/fbdev/au1200fb.c |
3424 | @@ -1681,8 +1681,10 @@ static int au1200fb_drv_probe(struct platform_device *dev) |
3425 | |
3426 | fbi = framebuffer_alloc(sizeof(struct au1200fb_device), |
3427 | &dev->dev); |
3428 | - if (!fbi) |
3429 | + if (!fbi) { |
3430 | + ret = -ENOMEM; |
3431 | goto failed; |
3432 | + } |
3433 | |
3434 | _au1200fb_infos[plane] = fbi; |
3435 | fbdev = fbi->par; |
3436 | @@ -1700,7 +1702,8 @@ static int au1200fb_drv_probe(struct platform_device *dev) |
3437 | if (!fbdev->fb_mem) { |
3438 | print_err("fail to allocate frambuffer (size: %dK))", |
3439 | fbdev->fb_len / 1024); |
3440 | - return -ENOMEM; |
3441 | + ret = -ENOMEM; |
3442 | + goto failed; |
3443 | } |
3444 | |
3445 | /* |
3446 | diff --git a/drivers/video/fbdev/controlfb.h b/drivers/video/fbdev/controlfb.h |
3447 | index 6026c60fc100..261522fabdac 100644 |
3448 | --- a/drivers/video/fbdev/controlfb.h |
3449 | +++ b/drivers/video/fbdev/controlfb.h |
3450 | @@ -141,5 +141,7 @@ static struct max_cmodes control_mac_modes[] = { |
3451 | {{ 1, 2}}, /* 1152x870, 75Hz */ |
3452 | {{ 0, 1}}, /* 1280x960, 75Hz */ |
3453 | {{ 0, 1}}, /* 1280x1024, 75Hz */ |
3454 | + {{ 1, 2}}, /* 1152x768, 60Hz */ |
3455 | + {{ 0, 1}}, /* 1600x1024, 60Hz */ |
3456 | }; |
3457 | |
3458 | diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c |
3459 | index e9c2f7ba3c8e..53326badfb61 100644 |
3460 | --- a/drivers/video/fbdev/udlfb.c |
3461 | +++ b/drivers/video/fbdev/udlfb.c |
3462 | @@ -769,11 +769,11 @@ static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len) |
3463 | |
3464 | for (i = 0; i < len; i++) { |
3465 | ret = usb_control_msg(dev->udev, |
3466 | - usb_rcvctrlpipe(dev->udev, 0), (0x02), |
3467 | - (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, |
3468 | - HZ); |
3469 | - if (ret < 1) { |
3470 | - pr_err("Read EDID byte %d failed err %x\n", i, ret); |
3471 | + usb_rcvctrlpipe(dev->udev, 0), 0x02, |
3472 | + (0x80 | (0x02 << 5)), i << 8, 0xA1, |
3473 | + rbuf, 2, USB_CTRL_GET_TIMEOUT); |
3474 | + if (ret < 2) { |
3475 | + pr_err("Read EDID byte %d failed: %d\n", i, ret); |
3476 | i--; |
3477 | break; |
3478 | } |
3479 | diff --git a/fs/afs/callback.c b/fs/afs/callback.c |
3480 | index 1e9d2f84e5b5..1592dc613200 100644 |
3481 | --- a/fs/afs/callback.c |
3482 | +++ b/fs/afs/callback.c |
3483 | @@ -362,7 +362,7 @@ static void afs_callback_updater(struct work_struct *work) |
3484 | { |
3485 | struct afs_server *server; |
3486 | struct afs_vnode *vnode, *xvnode; |
3487 | - time_t now; |
3488 | + time64_t now; |
3489 | long timeout; |
3490 | int ret; |
3491 | |
3492 | @@ -370,7 +370,7 @@ static void afs_callback_updater(struct work_struct *work) |
3493 | |
3494 | _enter(""); |
3495 | |
3496 | - now = get_seconds(); |
3497 | + now = ktime_get_real_seconds(); |
3498 | |
3499 | /* find the first vnode to update */ |
3500 | spin_lock(&server->cb_lock); |
3501 | @@ -424,7 +424,8 @@ static void afs_callback_updater(struct work_struct *work) |
3502 | |
3503 | /* and then reschedule */ |
3504 | _debug("reschedule"); |
3505 | - vnode->update_at = get_seconds() + afs_vnode_update_timeout; |
3506 | + vnode->update_at = ktime_get_real_seconds() + |
3507 | + afs_vnode_update_timeout; |
3508 | |
3509 | spin_lock(&server->cb_lock); |
3510 | |
3511 | diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c |
3512 | index 8d2c5180e015..168f2a4d1180 100644 |
3513 | --- a/fs/afs/cmservice.c |
3514 | +++ b/fs/afs/cmservice.c |
3515 | @@ -168,7 +168,6 @@ static int afs_deliver_cb_callback(struct afs_call *call) |
3516 | struct afs_callback *cb; |
3517 | struct afs_server *server; |
3518 | __be32 *bp; |
3519 | - u32 tmp; |
3520 | int ret, loop; |
3521 | |
3522 | _enter("{%u}", call->unmarshall); |
3523 | @@ -230,9 +229,9 @@ static int afs_deliver_cb_callback(struct afs_call *call) |
3524 | if (ret < 0) |
3525 | return ret; |
3526 | |
3527 | - tmp = ntohl(call->tmp); |
3528 | - _debug("CB count: %u", tmp); |
3529 | - if (tmp != call->count && tmp != 0) |
3530 | + call->count2 = ntohl(call->tmp); |
3531 | + _debug("CB count: %u", call->count2); |
3532 | + if (call->count2 != call->count && call->count2 != 0) |
3533 | return -EBADMSG; |
3534 | call->offset = 0; |
3535 | call->unmarshall++; |
3536 | @@ -240,14 +239,14 @@ static int afs_deliver_cb_callback(struct afs_call *call) |
3537 | case 4: |
3538 | _debug("extract CB array"); |
3539 | ret = afs_extract_data(call, call->buffer, |
3540 | - call->count * 3 * 4, false); |
3541 | + call->count2 * 3 * 4, false); |
3542 | if (ret < 0) |
3543 | return ret; |
3544 | |
3545 | _debug("unmarshall CB array"); |
3546 | cb = call->request; |
3547 | bp = call->buffer; |
3548 | - for (loop = call->count; loop > 0; loop--, cb++) { |
3549 | + for (loop = call->count2; loop > 0; loop--, cb++) { |
3550 | cb->version = ntohl(*bp++); |
3551 | cb->expiry = ntohl(*bp++); |
3552 | cb->type = ntohl(*bp++); |
3553 | diff --git a/fs/afs/file.c b/fs/afs/file.c |
3554 | index 6344aee4ac4b..72372970725b 100644 |
3555 | --- a/fs/afs/file.c |
3556 | +++ b/fs/afs/file.c |
3557 | @@ -29,6 +29,7 @@ static int afs_readpages(struct file *filp, struct address_space *mapping, |
3558 | |
3559 | const struct file_operations afs_file_operations = { |
3560 | .open = afs_open, |
3561 | + .flush = afs_flush, |
3562 | .release = afs_release, |
3563 | .llseek = generic_file_llseek, |
3564 | .read_iter = generic_file_read_iter, |
3565 | diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c |
3566 | index 31c616ab9b40..88e440607ed7 100644 |
3567 | --- a/fs/afs/fsclient.c |
3568 | +++ b/fs/afs/fsclient.c |
3569 | @@ -105,7 +105,7 @@ static void xdr_decode_AFSFetchStatus(const __be32 **_bp, |
3570 | vnode->vfs_inode.i_mode = mode; |
3571 | } |
3572 | |
3573 | - vnode->vfs_inode.i_ctime.tv_sec = status->mtime_server; |
3574 | + vnode->vfs_inode.i_ctime.tv_sec = status->mtime_client; |
3575 | vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime; |
3576 | vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime; |
3577 | vnode->vfs_inode.i_version = data_version; |
3578 | @@ -139,7 +139,7 @@ static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode) |
3579 | vnode->cb_version = ntohl(*bp++); |
3580 | vnode->cb_expiry = ntohl(*bp++); |
3581 | vnode->cb_type = ntohl(*bp++); |
3582 | - vnode->cb_expires = vnode->cb_expiry + get_seconds(); |
3583 | + vnode->cb_expires = vnode->cb_expiry + ktime_get_real_seconds(); |
3584 | *_bp = bp; |
3585 | } |
3586 | |
3587 | @@ -676,8 +676,8 @@ int afs_fs_create(struct afs_server *server, |
3588 | memset(bp, 0, padsz); |
3589 | bp = (void *) bp + padsz; |
3590 | } |
3591 | - *bp++ = htonl(AFS_SET_MODE); |
3592 | - *bp++ = 0; /* mtime */ |
3593 | + *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); |
3594 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
3595 | *bp++ = 0; /* owner */ |
3596 | *bp++ = 0; /* group */ |
3597 | *bp++ = htonl(mode & S_IALLUGO); /* unix mode */ |
3598 | @@ -945,8 +945,8 @@ int afs_fs_symlink(struct afs_server *server, |
3599 | memset(bp, 0, c_padsz); |
3600 | bp = (void *) bp + c_padsz; |
3601 | } |
3602 | - *bp++ = htonl(AFS_SET_MODE); |
3603 | - *bp++ = 0; /* mtime */ |
3604 | + *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); |
3605 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
3606 | *bp++ = 0; /* owner */ |
3607 | *bp++ = 0; /* group */ |
3608 | *bp++ = htonl(S_IRWXUGO); /* unix mode */ |
3609 | @@ -1145,8 +1145,8 @@ static int afs_fs_store_data64(struct afs_server *server, |
3610 | *bp++ = htonl(vnode->fid.vnode); |
3611 | *bp++ = htonl(vnode->fid.unique); |
3612 | |
3613 | - *bp++ = 0; /* mask */ |
3614 | - *bp++ = 0; /* mtime */ |
3615 | + *bp++ = htonl(AFS_SET_MTIME); /* mask */ |
3616 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
3617 | *bp++ = 0; /* owner */ |
3618 | *bp++ = 0; /* group */ |
3619 | *bp++ = 0; /* unix mode */ |
3620 | @@ -1178,7 +1178,7 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, |
3621 | _enter(",%x,{%x:%u},,", |
3622 | key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode); |
3623 | |
3624 | - size = to - offset; |
3625 | + size = (loff_t)to - (loff_t)offset; |
3626 | if (first != last) |
3627 | size += (loff_t)(last - first) << PAGE_SHIFT; |
3628 | pos = (loff_t)first << PAGE_SHIFT; |
3629 | @@ -1222,8 +1222,8 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, |
3630 | *bp++ = htonl(vnode->fid.vnode); |
3631 | *bp++ = htonl(vnode->fid.unique); |
3632 | |
3633 | - *bp++ = 0; /* mask */ |
3634 | - *bp++ = 0; /* mtime */ |
3635 | + *bp++ = htonl(AFS_SET_MTIME); /* mask */ |
3636 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ |
3637 | *bp++ = 0; /* owner */ |
3638 | *bp++ = 0; /* group */ |
3639 | *bp++ = 0; /* unix mode */ |
3640 | diff --git a/fs/afs/inode.c b/fs/afs/inode.c |
3641 | index 86cc7264c21c..42582e41948f 100644 |
3642 | --- a/fs/afs/inode.c |
3643 | +++ b/fs/afs/inode.c |
3644 | @@ -70,9 +70,9 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key) |
3645 | |
3646 | set_nlink(inode, vnode->status.nlink); |
3647 | inode->i_uid = vnode->status.owner; |
3648 | - inode->i_gid = GLOBAL_ROOT_GID; |
3649 | + inode->i_gid = vnode->status.group; |
3650 | inode->i_size = vnode->status.size; |
3651 | - inode->i_ctime.tv_sec = vnode->status.mtime_server; |
3652 | + inode->i_ctime.tv_sec = vnode->status.mtime_client; |
3653 | inode->i_ctime.tv_nsec = 0; |
3654 | inode->i_atime = inode->i_mtime = inode->i_ctime; |
3655 | inode->i_blocks = 0; |
3656 | @@ -245,12 +245,13 @@ struct inode *afs_iget(struct super_block *sb, struct key *key, |
3657 | vnode->cb_version = 0; |
3658 | vnode->cb_expiry = 0; |
3659 | vnode->cb_type = 0; |
3660 | - vnode->cb_expires = get_seconds(); |
3661 | + vnode->cb_expires = ktime_get_real_seconds(); |
3662 | } else { |
3663 | vnode->cb_version = cb->version; |
3664 | vnode->cb_expiry = cb->expiry; |
3665 | vnode->cb_type = cb->type; |
3666 | - vnode->cb_expires = vnode->cb_expiry + get_seconds(); |
3667 | + vnode->cb_expires = vnode->cb_expiry + |
3668 | + ktime_get_real_seconds(); |
3669 | } |
3670 | } |
3671 | |
3672 | @@ -323,7 +324,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key) |
3673 | !test_bit(AFS_VNODE_CB_BROKEN, &vnode->flags) && |
3674 | !test_bit(AFS_VNODE_MODIFIED, &vnode->flags) && |
3675 | !test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) { |
3676 | - if (vnode->cb_expires < get_seconds() + 10) { |
3677 | + if (vnode->cb_expires < ktime_get_real_seconds() + 10) { |
3678 | _debug("callback expired"); |
3679 | set_bit(AFS_VNODE_CB_BROKEN, &vnode->flags); |
3680 | } else { |
3681 | diff --git a/fs/afs/internal.h b/fs/afs/internal.h |
3682 | index 535a38d2c1d0..dd98dcda6a3f 100644 |
3683 | --- a/fs/afs/internal.h |
3684 | +++ b/fs/afs/internal.h |
3685 | @@ -11,6 +11,7 @@ |
3686 | |
3687 | #include <linux/compiler.h> |
3688 | #include <linux/kernel.h> |
3689 | +#include <linux/ktime.h> |
3690 | #include <linux/fs.h> |
3691 | #include <linux/pagemap.h> |
3692 | #include <linux/rxrpc.h> |
3693 | @@ -105,7 +106,10 @@ struct afs_call { |
3694 | unsigned request_size; /* size of request data */ |
3695 | unsigned reply_max; /* maximum size of reply */ |
3696 | unsigned first_offset; /* offset into mapping[first] */ |
3697 | - unsigned last_to; /* amount of mapping[last] */ |
3698 | + union { |
3699 | + unsigned last_to; /* amount of mapping[last] */ |
3700 | + unsigned count2; /* count used in unmarshalling */ |
3701 | + }; |
3702 | unsigned char unmarshall; /* unmarshalling phase */ |
3703 | bool incoming; /* T if incoming call */ |
3704 | bool send_pages; /* T if data from mapping should be sent */ |
3705 | @@ -242,7 +246,7 @@ struct afs_cache_vhash { |
3706 | */ |
3707 | struct afs_vlocation { |
3708 | atomic_t usage; |
3709 | - time_t time_of_death; /* time at which put reduced usage to 0 */ |
3710 | + time64_t time_of_death; /* time at which put reduced usage to 0 */ |
3711 | struct list_head link; /* link in cell volume location list */ |
3712 | struct list_head grave; /* link in master graveyard list */ |
3713 | struct list_head update; /* link in master update list */ |
3714 | @@ -253,7 +257,7 @@ struct afs_vlocation { |
3715 | struct afs_cache_vlocation vldb; /* volume information DB record */ |
3716 | struct afs_volume *vols[3]; /* volume access record pointer (index by type) */ |
3717 | wait_queue_head_t waitq; /* status change waitqueue */ |
3718 | - time_t update_at; /* time at which record should be updated */ |
3719 | + time64_t update_at; /* time at which record should be updated */ |
3720 | spinlock_t lock; /* access lock */ |
3721 | afs_vlocation_state_t state; /* volume location state */ |
3722 | unsigned short upd_rej_cnt; /* ENOMEDIUM count during update */ |
3723 | @@ -266,7 +270,7 @@ struct afs_vlocation { |
3724 | */ |
3725 | struct afs_server { |
3726 | atomic_t usage; |
3727 | - time_t time_of_death; /* time at which put reduced usage to 0 */ |
3728 | + time64_t time_of_death; /* time at which put reduced usage to 0 */ |
3729 | struct in_addr addr; /* server address */ |
3730 | struct afs_cell *cell; /* cell in which server resides */ |
3731 | struct list_head link; /* link in cell's server list */ |
3732 | @@ -369,8 +373,8 @@ struct afs_vnode { |
3733 | struct rb_node server_rb; /* link in server->fs_vnodes */ |
3734 | struct rb_node cb_promise; /* link in server->cb_promises */ |
3735 | struct work_struct cb_broken_work; /* work to be done on callback break */ |
3736 | - time_t cb_expires; /* time at which callback expires */ |
3737 | - time_t cb_expires_at; /* time used to order cb_promise */ |
3738 | + time64_t cb_expires; /* time at which callback expires */ |
3739 | + time64_t cb_expires_at; /* time used to order cb_promise */ |
3740 | unsigned cb_version; /* callback version */ |
3741 | unsigned cb_expiry; /* callback expiry time */ |
3742 | afs_callback_type_t cb_type; /* type of callback */ |
3743 | @@ -749,6 +753,7 @@ extern int afs_writepages(struct address_space *, struct writeback_control *); |
3744 | extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *); |
3745 | extern ssize_t afs_file_write(struct kiocb *, struct iov_iter *); |
3746 | extern int afs_writeback_all(struct afs_vnode *); |
3747 | +extern int afs_flush(struct file *, fl_owner_t); |
3748 | extern int afs_fsync(struct file *, loff_t, loff_t, int); |
3749 | |
3750 | |
3751 | diff --git a/fs/afs/misc.c b/fs/afs/misc.c |
3752 | index 91ea1aa0d8b3..100b207efc9e 100644 |
3753 | --- a/fs/afs/misc.c |
3754 | +++ b/fs/afs/misc.c |
3755 | @@ -84,6 +84,8 @@ int afs_abort_to_error(u32 abort_code) |
3756 | case RXKADDATALEN: return -EKEYREJECTED; |
3757 | case RXKADILLEGALLEVEL: return -EKEYREJECTED; |
3758 | |
3759 | + case RXGEN_OPCODE: return -ENOTSUPP; |
3760 | + |
3761 | default: return -EREMOTEIO; |
3762 | } |
3763 | } |
3764 | diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c |
3765 | index 25f05a8d21b1..523b1d3ca2c6 100644 |
3766 | --- a/fs/afs/rxrpc.c |
3767 | +++ b/fs/afs/rxrpc.c |
3768 | @@ -321,6 +321,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, |
3769 | struct rxrpc_call *rxcall; |
3770 | struct msghdr msg; |
3771 | struct kvec iov[1]; |
3772 | + size_t offset; |
3773 | + u32 abort_code; |
3774 | int ret; |
3775 | |
3776 | _enter("%x,{%d},", addr->s_addr, ntohs(call->port)); |
3777 | @@ -368,9 +370,11 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, |
3778 | msg.msg_controllen = 0; |
3779 | msg.msg_flags = (call->send_pages ? MSG_MORE : 0); |
3780 | |
3781 | - /* have to change the state *before* sending the last packet as RxRPC |
3782 | - * might give us the reply before it returns from sending the |
3783 | - * request */ |
3784 | + /* We have to change the state *before* sending the last packet as |
3785 | + * rxrpc might give us the reply before it returns from sending the |
3786 | + * request. Further, if the send fails, we may already have been given |
3787 | + * a notification and may have collected it. |
3788 | + */ |
3789 | if (!call->send_pages) |
3790 | call->state = AFS_CALL_AWAIT_REPLY; |
3791 | ret = rxrpc_kernel_send_data(afs_socket, rxcall, |
3792 | @@ -389,7 +393,17 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, |
3793 | return wait_mode->wait(call); |
3794 | |
3795 | error_do_abort: |
3796 | - rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT, -ret, "KSD"); |
3797 | + call->state = AFS_CALL_COMPLETE; |
3798 | + if (ret != -ECONNABORTED) { |
3799 | + rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT, |
3800 | + -ret, "KSD"); |
3801 | + } else { |
3802 | + abort_code = 0; |
3803 | + offset = 0; |
3804 | + rxrpc_kernel_recv_data(afs_socket, rxcall, NULL, 0, &offset, |
3805 | + false, &abort_code); |
3806 | + ret = call->type->abort_to_error(abort_code); |
3807 | + } |
3808 | error_kill_call: |
3809 | afs_end_call(call); |
3810 | _leave(" = %d", ret); |
3811 | @@ -434,16 +448,18 @@ static void afs_deliver_to_call(struct afs_call *call) |
3812 | case -EINPROGRESS: |
3813 | case -EAGAIN: |
3814 | goto out; |
3815 | + case -ECONNABORTED: |
3816 | + goto call_complete; |
3817 | case -ENOTCONN: |
3818 | abort_code = RX_CALL_DEAD; |
3819 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, |
3820 | abort_code, -ret, "KNC"); |
3821 | - goto do_abort; |
3822 | + goto save_error; |
3823 | case -ENOTSUPP: |
3824 | - abort_code = RX_INVALID_OPERATION; |
3825 | + abort_code = RXGEN_OPCODE; |
3826 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, |
3827 | abort_code, -ret, "KIV"); |
3828 | - goto do_abort; |
3829 | + goto save_error; |
3830 | case -ENODATA: |
3831 | case -EBADMSG: |
3832 | case -EMSGSIZE: |
3833 | @@ -453,7 +469,7 @@ static void afs_deliver_to_call(struct afs_call *call) |
3834 | abort_code = RXGEN_SS_UNMARSHAL; |
3835 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, |
3836 | abort_code, EBADMSG, "KUM"); |
3837 | - goto do_abort; |
3838 | + goto save_error; |
3839 | } |
3840 | } |
3841 | |
3842 | @@ -464,8 +480,9 @@ static void afs_deliver_to_call(struct afs_call *call) |
3843 | _leave(""); |
3844 | return; |
3845 | |
3846 | -do_abort: |
3847 | +save_error: |
3848 | call->error = ret; |
3849 | +call_complete: |
3850 | call->state = AFS_CALL_COMPLETE; |
3851 | goto done; |
3852 | } |
3853 | @@ -475,7 +492,6 @@ static void afs_deliver_to_call(struct afs_call *call) |
3854 | */ |
3855 | static int afs_wait_for_call_to_complete(struct afs_call *call) |
3856 | { |
3857 | - const char *abort_why; |
3858 | int ret; |
3859 | |
3860 | DECLARE_WAITQUEUE(myself, current); |
3861 | @@ -494,13 +510,8 @@ static int afs_wait_for_call_to_complete(struct afs_call *call) |
3862 | continue; |
3863 | } |
3864 | |
3865 | - abort_why = "KWC"; |
3866 | - ret = call->error; |
3867 | - if (call->state == AFS_CALL_COMPLETE) |
3868 | - break; |
3869 | - abort_why = "KWI"; |
3870 | - ret = -EINTR; |
3871 | - if (signal_pending(current)) |
3872 | + if (call->state == AFS_CALL_COMPLETE || |
3873 | + signal_pending(current)) |
3874 | break; |
3875 | schedule(); |
3876 | } |
3877 | @@ -508,13 +519,14 @@ static int afs_wait_for_call_to_complete(struct afs_call *call) |
3878 | remove_wait_queue(&call->waitq, &myself); |
3879 | __set_current_state(TASK_RUNNING); |
3880 | |
3881 | - /* kill the call */ |
3882 | + /* Kill off the call if it's still live. */ |
3883 | if (call->state < AFS_CALL_COMPLETE) { |
3884 | - _debug("call incomplete"); |
3885 | + _debug("call interrupted"); |
3886 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, |
3887 | - RX_CALL_DEAD, -ret, abort_why); |
3888 | + RX_USER_ABORT, -EINTR, "KWI"); |
3889 | } |
3890 | |
3891 | + ret = call->error; |
3892 | _debug("call complete"); |
3893 | afs_end_call(call); |
3894 | _leave(" = %d", ret); |
3895 | diff --git a/fs/afs/security.c b/fs/afs/security.c |
3896 | index 8d010422dc89..bfa9d3428383 100644 |
3897 | --- a/fs/afs/security.c |
3898 | +++ b/fs/afs/security.c |
3899 | @@ -340,17 +340,22 @@ int afs_permission(struct inode *inode, int mask) |
3900 | } else { |
3901 | if (!(access & AFS_ACE_LOOKUP)) |
3902 | goto permission_denied; |
3903 | + if ((mask & MAY_EXEC) && !(inode->i_mode & S_IXUSR)) |
3904 | + goto permission_denied; |
3905 | if (mask & (MAY_EXEC | MAY_READ)) { |
3906 | if (!(access & AFS_ACE_READ)) |
3907 | goto permission_denied; |
3908 | + if (!(inode->i_mode & S_IRUSR)) |
3909 | + goto permission_denied; |
3910 | } else if (mask & MAY_WRITE) { |
3911 | if (!(access & AFS_ACE_WRITE)) |
3912 | goto permission_denied; |
3913 | + if (!(inode->i_mode & S_IWUSR)) |
3914 | + goto permission_denied; |
3915 | } |
3916 | } |
3917 | |
3918 | key_put(key); |
3919 | - ret = generic_permission(inode, mask); |
3920 | _leave(" = %d", ret); |
3921 | return ret; |
3922 | |
3923 | diff --git a/fs/afs/server.c b/fs/afs/server.c |
3924 | index d4066ab7dd55..c001b1f2455f 100644 |
3925 | --- a/fs/afs/server.c |
3926 | +++ b/fs/afs/server.c |
3927 | @@ -242,7 +242,7 @@ void afs_put_server(struct afs_server *server) |
3928 | spin_lock(&afs_server_graveyard_lock); |
3929 | if (atomic_read(&server->usage) == 0) { |
3930 | list_move_tail(&server->grave, &afs_server_graveyard); |
3931 | - server->time_of_death = get_seconds(); |
3932 | + server->time_of_death = ktime_get_real_seconds(); |
3933 | queue_delayed_work(afs_wq, &afs_server_reaper, |
3934 | afs_server_timeout * HZ); |
3935 | } |
3936 | @@ -277,9 +277,9 @@ static void afs_reap_server(struct work_struct *work) |
3937 | LIST_HEAD(corpses); |
3938 | struct afs_server *server; |
3939 | unsigned long delay, expiry; |
3940 | - time_t now; |
3941 | + time64_t now; |
3942 | |
3943 | - now = get_seconds(); |
3944 | + now = ktime_get_real_seconds(); |
3945 | spin_lock(&afs_server_graveyard_lock); |
3946 | |
3947 | while (!list_empty(&afs_server_graveyard)) { |
3948 | diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c |
3949 | index 45a86396fd2d..92bd5553b8c9 100644 |
3950 | --- a/fs/afs/vlocation.c |
3951 | +++ b/fs/afs/vlocation.c |
3952 | @@ -340,7 +340,8 @@ static void afs_vlocation_queue_for_updates(struct afs_vlocation *vl) |
3953 | struct afs_vlocation *xvl; |
3954 | |
3955 | /* wait at least 10 minutes before updating... */ |
3956 | - vl->update_at = get_seconds() + afs_vlocation_update_timeout; |
3957 | + vl->update_at = ktime_get_real_seconds() + |
3958 | + afs_vlocation_update_timeout; |
3959 | |
3960 | spin_lock(&afs_vlocation_updates_lock); |
3961 | |
3962 | @@ -506,7 +507,7 @@ void afs_put_vlocation(struct afs_vlocation *vl) |
3963 | if (atomic_read(&vl->usage) == 0) { |
3964 | _debug("buried"); |
3965 | list_move_tail(&vl->grave, &afs_vlocation_graveyard); |
3966 | - vl->time_of_death = get_seconds(); |
3967 | + vl->time_of_death = ktime_get_real_seconds(); |
3968 | queue_delayed_work(afs_wq, &afs_vlocation_reap, |
3969 | afs_vlocation_timeout * HZ); |
3970 | |
3971 | @@ -543,11 +544,11 @@ static void afs_vlocation_reaper(struct work_struct *work) |
3972 | LIST_HEAD(corpses); |
3973 | struct afs_vlocation *vl; |
3974 | unsigned long delay, expiry; |
3975 | - time_t now; |
3976 | + time64_t now; |
3977 | |
3978 | _enter(""); |
3979 | |
3980 | - now = get_seconds(); |
3981 | + now = ktime_get_real_seconds(); |
3982 | spin_lock(&afs_vlocation_graveyard_lock); |
3983 | |
3984 | while (!list_empty(&afs_vlocation_graveyard)) { |
3985 | @@ -622,13 +623,13 @@ static void afs_vlocation_updater(struct work_struct *work) |
3986 | { |
3987 | struct afs_cache_vlocation vldb; |
3988 | struct afs_vlocation *vl, *xvl; |
3989 | - time_t now; |
3990 | + time64_t now; |
3991 | long timeout; |
3992 | int ret; |
3993 | |
3994 | _enter(""); |
3995 | |
3996 | - now = get_seconds(); |
3997 | + now = ktime_get_real_seconds(); |
3998 | |
3999 | /* find a record to update */ |
4000 | spin_lock(&afs_vlocation_updates_lock); |
4001 | @@ -684,7 +685,8 @@ static void afs_vlocation_updater(struct work_struct *work) |
4002 | |
4003 | /* and then reschedule */ |
4004 | _debug("reschedule"); |
4005 | - vl->update_at = get_seconds() + afs_vlocation_update_timeout; |
4006 | + vl->update_at = ktime_get_real_seconds() + |
4007 | + afs_vlocation_update_timeout; |
4008 | |
4009 | spin_lock(&afs_vlocation_updates_lock); |
4010 | |
4011 | diff --git a/fs/afs/write.c b/fs/afs/write.c |
4012 | index f865c3f05bea..3fba2b573c86 100644 |
4013 | --- a/fs/afs/write.c |
4014 | +++ b/fs/afs/write.c |
4015 | @@ -148,12 +148,12 @@ int afs_write_begin(struct file *file, struct address_space *mapping, |
4016 | kfree(candidate); |
4017 | return -ENOMEM; |
4018 | } |
4019 | - *pagep = page; |
4020 | - /* page won't leak in error case: it eventually gets cleaned off LRU */ |
4021 | |
4022 | if (!PageUptodate(page) && len != PAGE_SIZE) { |
4023 | ret = afs_fill_page(vnode, key, index << PAGE_SHIFT, page); |
4024 | if (ret < 0) { |
4025 | + unlock_page(page); |
4026 | + put_page(page); |
4027 | kfree(candidate); |
4028 | _leave(" = %d [prep]", ret); |
4029 | return ret; |
4030 | @@ -161,6 +161,9 @@ int afs_write_begin(struct file *file, struct address_space *mapping, |
4031 | SetPageUptodate(page); |
4032 | } |
4033 | |
4034 | + /* page won't leak in error case: it eventually gets cleaned off LRU */ |
4035 | + *pagep = page; |
4036 | + |
4037 | try_again: |
4038 | spin_lock(&vnode->writeback_lock); |
4039 | |
4040 | @@ -296,10 +299,14 @@ static void afs_kill_pages(struct afs_vnode *vnode, bool error, |
4041 | ASSERTCMP(pv.nr, ==, count); |
4042 | |
4043 | for (loop = 0; loop < count; loop++) { |
4044 | - ClearPageUptodate(pv.pages[loop]); |
4045 | + struct page *page = pv.pages[loop]; |
4046 | + ClearPageUptodate(page); |
4047 | if (error) |
4048 | - SetPageError(pv.pages[loop]); |
4049 | - end_page_writeback(pv.pages[loop]); |
4050 | + SetPageError(page); |
4051 | + if (PageWriteback(page)) |
4052 | + end_page_writeback(page); |
4053 | + if (page->index >= first) |
4054 | + first = page->index + 1; |
4055 | } |
4056 | |
4057 | __pagevec_release(&pv); |
4058 | @@ -502,6 +509,7 @@ static int afs_writepages_region(struct address_space *mapping, |
4059 | |
4060 | if (PageWriteback(page) || !PageDirty(page)) { |
4061 | unlock_page(page); |
4062 | + put_page(page); |
4063 | continue; |
4064 | } |
4065 | |
4066 | @@ -734,6 +742,20 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
4067 | return ret; |
4068 | } |
4069 | |
4070 | +/* |
4071 | + * Flush out all outstanding writes on a file opened for writing when it is |
4072 | + * closed. |
4073 | + */ |
4074 | +int afs_flush(struct file *file, fl_owner_t id) |
4075 | +{ |
4076 | + _enter(""); |
4077 | + |
4078 | + if ((file->f_mode & FMODE_WRITE) == 0) |
4079 | + return 0; |
4080 | + |
4081 | + return vfs_fsync(file, 0); |
4082 | +} |
4083 | + |
4084 | /* |
4085 | * notification that a previously read-only page is about to become writable |
4086 | * - if it returns an error, the caller will deliver a bus error signal |
4087 | diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c |
4088 | index 4c71dba90120..0ea31a53fd5b 100644 |
4089 | --- a/fs/autofs4/waitq.c |
4090 | +++ b/fs/autofs4/waitq.c |
4091 | @@ -176,7 +176,6 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, |
4092 | |
4093 | mutex_unlock(&sbi->wq_mutex); |
4094 | |
4095 | - if (autofs4_write(sbi, pipe, &pkt, pktsz)) |
4096 | switch (ret = autofs4_write(sbi, pipe, &pkt, pktsz)) { |
4097 | case 0: |
4098 | break; |
4099 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
4100 | index f089d7d8afe7..894d56361ea9 100644 |
4101 | --- a/fs/btrfs/inode.c |
4102 | +++ b/fs/btrfs/inode.c |
4103 | @@ -6812,6 +6812,20 @@ static noinline int uncompress_inline(struct btrfs_path *path, |
4104 | max_size = min_t(unsigned long, PAGE_SIZE, max_size); |
4105 | ret = btrfs_decompress(compress_type, tmp, page, |
4106 | extent_offset, inline_size, max_size); |
4107 | + |
4108 | + /* |
4109 | + * decompression code contains a memset to fill in any space between the end |
4110 | + * of the uncompressed data and the end of max_size in case the decompressed |
4111 | + * data ends up shorter than ram_bytes. That doesn't cover the hole between |
4112 | + * the end of an inline extent and the beginning of the next block, so we |
4113 | + * cover that region here. |
4114 | + */ |
4115 | + |
4116 | + if (max_size + pg_offset < PAGE_SIZE) { |
4117 | + char *map = kmap(page); |
4118 | + memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - pg_offset); |
4119 | + kunmap(page); |
4120 | + } |
4121 | kfree(tmp); |
4122 | return ret; |
4123 | } |
4124 | diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c |
4125 | index 6e144048a72e..a724d9a79bd2 100644 |
4126 | --- a/fs/btrfs/tests/free-space-tree-tests.c |
4127 | +++ b/fs/btrfs/tests/free-space-tree-tests.c |
4128 | @@ -501,7 +501,8 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, |
4129 | path = btrfs_alloc_path(); |
4130 | if (!path) { |
4131 | test_msg("Couldn't allocate path\n"); |
4132 | - return -ENOMEM; |
4133 | + ret = -ENOMEM; |
4134 | + goto out; |
4135 | } |
4136 | |
4137 | ret = add_block_group_free_space(&trans, root->fs_info, cache); |
4138 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c |
4139 | index c0f52c443c34..3d2639c30018 100644 |
4140 | --- a/fs/ceph/mds_client.c |
4141 | +++ b/fs/ceph/mds_client.c |
4142 | @@ -1396,6 +1396,29 @@ static int __close_session(struct ceph_mds_client *mdsc, |
4143 | return request_close_session(mdsc, session); |
4144 | } |
4145 | |
4146 | +static bool drop_negative_children(struct dentry *dentry) |
4147 | +{ |
4148 | + struct dentry *child; |
4149 | + bool all_negative = true; |
4150 | + |
4151 | + if (!d_is_dir(dentry)) |
4152 | + goto out; |
4153 | + |
4154 | + spin_lock(&dentry->d_lock); |
4155 | + list_for_each_entry(child, &dentry->d_subdirs, d_child) { |
4156 | + if (d_really_is_positive(child)) { |
4157 | + all_negative = false; |
4158 | + break; |
4159 | + } |
4160 | + } |
4161 | + spin_unlock(&dentry->d_lock); |
4162 | + |
4163 | + if (all_negative) |
4164 | + shrink_dcache_parent(dentry); |
4165 | +out: |
4166 | + return all_negative; |
4167 | +} |
4168 | + |
4169 | /* |
4170 | * Trim old(er) caps. |
4171 | * |
4172 | @@ -1441,16 +1464,27 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) |
4173 | if ((used | wanted) & ~oissued & mine) |
4174 | goto out; /* we need these caps */ |
4175 | |
4176 | - session->s_trim_caps--; |
4177 | if (oissued) { |
4178 | /* we aren't the only cap.. just remove us */ |
4179 | __ceph_remove_cap(cap, true); |
4180 | + session->s_trim_caps--; |
4181 | } else { |
4182 | + struct dentry *dentry; |
4183 | /* try dropping referring dentries */ |
4184 | spin_unlock(&ci->i_ceph_lock); |
4185 | - d_prune_aliases(inode); |
4186 | - dout("trim_caps_cb %p cap %p pruned, count now %d\n", |
4187 | - inode, cap, atomic_read(&inode->i_count)); |
4188 | + dentry = d_find_any_alias(inode); |
4189 | + if (dentry && drop_negative_children(dentry)) { |
4190 | + int count; |
4191 | + dput(dentry); |
4192 | + d_prune_aliases(inode); |
4193 | + count = atomic_read(&inode->i_count); |
4194 | + if (count == 1) |
4195 | + session->s_trim_caps--; |
4196 | + dout("trim_caps_cb %p cap %p pruned, count now %d\n", |
4197 | + inode, cap, count); |
4198 | + } else { |
4199 | + dput(dentry); |
4200 | + } |
4201 | return 0; |
4202 | } |
4203 | |
4204 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
4205 | index a77cbc5b657b..1a0c57100f28 100644 |
4206 | --- a/fs/ext4/extents.c |
4207 | +++ b/fs/ext4/extents.c |
4208 | @@ -4731,6 +4731,7 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset, |
4209 | EXT4_INODE_EOFBLOCKS); |
4210 | } |
4211 | ext4_mark_inode_dirty(handle, inode); |
4212 | + ext4_update_inode_fsync_trans(handle, inode, 1); |
4213 | ret2 = ext4_journal_stop(handle); |
4214 | if (ret2) |
4215 | break; |
4216 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c |
4217 | index 4438b93f6fd6..b1766a67d2eb 100644 |
4218 | --- a/fs/ext4/namei.c |
4219 | +++ b/fs/ext4/namei.c |
4220 | @@ -1417,6 +1417,10 @@ static struct buffer_head * ext4_find_entry (struct inode *dir, |
4221 | "falling back\n")); |
4222 | } |
4223 | nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb); |
4224 | + if (!nblocks) { |
4225 | + ret = NULL; |
4226 | + goto cleanup_and_exit; |
4227 | + } |
4228 | start = EXT4_I(dir)->i_dir_start_lookup; |
4229 | if (start >= nblocks) |
4230 | start = 0; |
4231 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c |
4232 | index 05713a5da083..0703a1179847 100644 |
4233 | --- a/fs/fs-writeback.c |
4234 | +++ b/fs/fs-writeback.c |
4235 | @@ -173,19 +173,33 @@ static void wb_wakeup(struct bdi_writeback *wb) |
4236 | spin_unlock_bh(&wb->work_lock); |
4237 | } |
4238 | |
4239 | +static void finish_writeback_work(struct bdi_writeback *wb, |
4240 | + struct wb_writeback_work *work) |
4241 | +{ |
4242 | + struct wb_completion *done = work->done; |
4243 | + |
4244 | + if (work->auto_free) |
4245 | + kfree(work); |
4246 | + if (done && atomic_dec_and_test(&done->cnt)) |
4247 | + wake_up_all(&wb->bdi->wb_waitq); |
4248 | +} |
4249 | + |
4250 | static void wb_queue_work(struct bdi_writeback *wb, |
4251 | struct wb_writeback_work *work) |
4252 | { |
4253 | trace_writeback_queue(wb, work); |
4254 | |
4255 | - spin_lock_bh(&wb->work_lock); |
4256 | - if (!test_bit(WB_registered, &wb->state)) |
4257 | - goto out_unlock; |
4258 | if (work->done) |
4259 | atomic_inc(&work->done->cnt); |
4260 | - list_add_tail(&work->list, &wb->work_list); |
4261 | - mod_delayed_work(bdi_wq, &wb->dwork, 0); |
4262 | -out_unlock: |
4263 | + |
4264 | + spin_lock_bh(&wb->work_lock); |
4265 | + |
4266 | + if (test_bit(WB_registered, &wb->state)) { |
4267 | + list_add_tail(&work->list, &wb->work_list); |
4268 | + mod_delayed_work(bdi_wq, &wb->dwork, 0); |
4269 | + } else |
4270 | + finish_writeback_work(wb, work); |
4271 | + |
4272 | spin_unlock_bh(&wb->work_lock); |
4273 | } |
4274 | |
4275 | @@ -1875,16 +1889,9 @@ static long wb_do_writeback(struct bdi_writeback *wb) |
4276 | |
4277 | set_bit(WB_writeback_running, &wb->state); |
4278 | while ((work = get_next_work_item(wb)) != NULL) { |
4279 | - struct wb_completion *done = work->done; |
4280 | - |
4281 | trace_writeback_exec(wb, work); |
4282 | - |
4283 | wrote += wb_writeback(wb, work); |
4284 | - |
4285 | - if (work->auto_free) |
4286 | - kfree(work); |
4287 | - if (done && atomic_dec_and_test(&done->cnt)) |
4288 | - wake_up_all(&wb->bdi->wb_waitq); |
4289 | + finish_writeback_work(wb, work); |
4290 | } |
4291 | |
4292 | /* |
4293 | diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c |
4294 | index e23ff70b3435..39c382f16272 100644 |
4295 | --- a/fs/gfs2/file.c |
4296 | +++ b/fs/gfs2/file.c |
4297 | @@ -256,7 +256,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) |
4298 | goto out; |
4299 | } |
4300 | if ((flags ^ new_flags) & GFS2_DIF_JDATA) { |
4301 | - if (flags & GFS2_DIF_JDATA) |
4302 | + if (new_flags & GFS2_DIF_JDATA) |
4303 | gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH); |
4304 | error = filemap_fdatawrite(inode->i_mapping); |
4305 | if (error) |
4306 | @@ -264,6 +264,8 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) |
4307 | error = filemap_fdatawait(inode->i_mapping); |
4308 | if (error) |
4309 | goto out; |
4310 | + if (new_flags & GFS2_DIF_JDATA) |
4311 | + gfs2_ordered_del_inode(ip); |
4312 | } |
4313 | error = gfs2_trans_begin(sdp, RES_DINODE, 0); |
4314 | if (error) |
4315 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c |
4316 | index 074ac7131459..f6b0848cc831 100644 |
4317 | --- a/fs/nfs/nfs4client.c |
4318 | +++ b/fs/nfs/nfs4client.c |
4319 | @@ -1004,9 +1004,9 @@ static void nfs4_session_set_rwsize(struct nfs_server *server) |
4320 | server_resp_sz = sess->fc_attrs.max_resp_sz - nfs41_maxread_overhead; |
4321 | server_rqst_sz = sess->fc_attrs.max_rqst_sz - nfs41_maxwrite_overhead; |
4322 | |
4323 | - if (server->rsize > server_resp_sz) |
4324 | + if (!server->rsize || server->rsize > server_resp_sz) |
4325 | server->rsize = server_resp_sz; |
4326 | - if (server->wsize > server_rqst_sz) |
4327 | + if (!server->wsize || server->wsize > server_rqst_sz) |
4328 | server->wsize = server_rqst_sz; |
4329 | #endif /* CONFIG_NFS_V4_1 */ |
4330 | } |
4331 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
4332 | index e4772a8340f8..9905735463a4 100644 |
4333 | --- a/fs/nfs/write.c |
4334 | +++ b/fs/nfs/write.c |
4335 | @@ -1859,6 +1859,8 @@ int nfs_commit_inode(struct inode *inode, int how) |
4336 | if (res) |
4337 | error = nfs_generic_commit_list(inode, &head, how, &cinfo); |
4338 | nfs_commit_end(cinfo.mds); |
4339 | + if (res == 0) |
4340 | + return res; |
4341 | if (error < 0) |
4342 | goto out_error; |
4343 | if (!may_wait) |
4344 | diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c |
4345 | index 1645b977c9c6..5c4800626f13 100644 |
4346 | --- a/fs/nfsd/nfssvc.c |
4347 | +++ b/fs/nfsd/nfssvc.c |
4348 | @@ -155,7 +155,8 @@ int nfsd_vers(int vers, enum vers_op change) |
4349 | |
4350 | int nfsd_minorversion(u32 minorversion, enum vers_op change) |
4351 | { |
4352 | - if (minorversion > NFSD_SUPPORTED_MINOR_VERSION) |
4353 | + if (minorversion > NFSD_SUPPORTED_MINOR_VERSION && |
4354 | + change != NFSD_AVAIL) |
4355 | return -1; |
4356 | switch(change) { |
4357 | case NFSD_SET: |
4358 | @@ -399,23 +400,20 @@ static void nfsd_last_thread(struct svc_serv *serv, struct net *net) |
4359 | |
4360 | void nfsd_reset_versions(void) |
4361 | { |
4362 | - int found_one = 0; |
4363 | int i; |
4364 | |
4365 | - for (i = NFSD_MINVERS; i < NFSD_NRVERS; i++) { |
4366 | - if (nfsd_program.pg_vers[i]) |
4367 | - found_one = 1; |
4368 | - } |
4369 | - |
4370 | - if (!found_one) { |
4371 | - for (i = NFSD_MINVERS; i < NFSD_NRVERS; i++) |
4372 | - nfsd_program.pg_vers[i] = nfsd_version[i]; |
4373 | -#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) |
4374 | - for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) |
4375 | - nfsd_acl_program.pg_vers[i] = |
4376 | - nfsd_acl_version[i]; |
4377 | -#endif |
4378 | - } |
4379 | + for (i = 0; i < NFSD_NRVERS; i++) |
4380 | + if (nfsd_vers(i, NFSD_TEST)) |
4381 | + return; |
4382 | + |
4383 | + for (i = 0; i < NFSD_NRVERS; i++) |
4384 | + if (i != 4) |
4385 | + nfsd_vers(i, NFSD_SET); |
4386 | + else { |
4387 | + int minor = 0; |
4388 | + while (nfsd_minorversion(minor, NFSD_SET) >= 0) |
4389 | + minor++; |
4390 | + } |
4391 | } |
4392 | |
4393 | /* |
4394 | diff --git a/fs/proc/proc_tty.c b/fs/proc/proc_tty.c |
4395 | index 15f327bed8c6..7340c36978a3 100644 |
4396 | --- a/fs/proc/proc_tty.c |
4397 | +++ b/fs/proc/proc_tty.c |
4398 | @@ -14,6 +14,7 @@ |
4399 | #include <linux/tty.h> |
4400 | #include <linux/seq_file.h> |
4401 | #include <linux/bitops.h> |
4402 | +#include "internal.h" |
4403 | |
4404 | /* |
4405 | * The /proc/tty directory inodes... |
4406 | @@ -164,7 +165,7 @@ void proc_tty_unregister_driver(struct tty_driver *driver) |
4407 | if (!ent) |
4408 | return; |
4409 | |
4410 | - remove_proc_entry(driver->driver_name, proc_tty_driver); |
4411 | + remove_proc_entry(ent->name, proc_tty_driver); |
4412 | |
4413 | driver->proc_entry = NULL; |
4414 | } |
4415 | diff --git a/fs/udf/super.c b/fs/udf/super.c |
4416 | index 4942549e7dc8..4b1f6d5372c3 100644 |
4417 | --- a/fs/udf/super.c |
4418 | +++ b/fs/udf/super.c |
4419 | @@ -710,7 +710,7 @@ static loff_t udf_check_vsd(struct super_block *sb) |
4420 | else |
4421 | sectorsize = sb->s_blocksize; |
4422 | |
4423 | - sector += (sbi->s_session << sb->s_blocksize_bits); |
4424 | + sector += (((loff_t)sbi->s_session) << sb->s_blocksize_bits); |
4425 | |
4426 | udf_debug("Starting at sector %u (%ld byte sectors)\n", |
4427 | (unsigned int)(sector >> sb->s_blocksize_bits), |
4428 | diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c |
4429 | index b86054cc41db..784d667475ae 100644 |
4430 | --- a/fs/userfaultfd.c |
4431 | +++ b/fs/userfaultfd.c |
4432 | @@ -419,7 +419,7 @@ int handle_userfault(struct fault_env *fe, unsigned long reason) |
4433 | * in such case. |
4434 | */ |
4435 | down_read(&mm->mmap_sem); |
4436 | - ret = 0; |
4437 | + ret = VM_FAULT_NOPAGE; |
4438 | } |
4439 | } |
4440 | |
4441 | diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c |
4442 | index 7eb99701054f..8ad65d43b65d 100644 |
4443 | --- a/fs/xfs/libxfs/xfs_bmap.c |
4444 | +++ b/fs/xfs/libxfs/xfs_bmap.c |
4445 | @@ -2713,7 +2713,7 @@ xfs_bmap_add_extent_unwritten_real( |
4446 | &i))) |
4447 | goto done; |
4448 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); |
4449 | - cur->bc_rec.b.br_state = XFS_EXT_NORM; |
4450 | + cur->bc_rec.b.br_state = new->br_state; |
4451 | if ((error = xfs_btree_insert(cur, &i))) |
4452 | goto done; |
4453 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); |
4454 | diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c |
4455 | index 5b81f7f41b80..33c389934238 100644 |
4456 | --- a/fs/xfs/xfs_iops.c |
4457 | +++ b/fs/xfs/xfs_iops.c |
4458 | @@ -870,22 +870,6 @@ xfs_setattr_size( |
4459 | if (error) |
4460 | return error; |
4461 | |
4462 | - /* |
4463 | - * We are going to log the inode size change in this transaction so |
4464 | - * any previous writes that are beyond the on disk EOF and the new |
4465 | - * EOF that have not been written out need to be written here. If we |
4466 | - * do not write the data out, we expose ourselves to the null files |
4467 | - * problem. Note that this includes any block zeroing we did above; |
4468 | - * otherwise those blocks may not be zeroed after a crash. |
4469 | - */ |
4470 | - if (did_zeroing || |
4471 | - (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { |
4472 | - error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, |
4473 | - ip->i_d.di_size, newsize); |
4474 | - if (error) |
4475 | - return error; |
4476 | - } |
4477 | - |
4478 | /* |
4479 | * We've already locked out new page faults, so now we can safely remove |
4480 | * pages from the page cache knowing they won't get refaulted until we |
4481 | @@ -902,9 +886,29 @@ xfs_setattr_size( |
4482 | * user visible changes). There's not much we can do about this, except |
4483 | * to hope that the caller sees ENOMEM and retries the truncate |
4484 | * operation. |
4485 | + * |
4486 | + * And we update in-core i_size and truncate page cache beyond newsize |
4487 | + * before writeback the [di_size, newsize] range, so we're guaranteed |
4488 | + * not to write stale data past the new EOF on truncate down. |
4489 | */ |
4490 | truncate_setsize(inode, newsize); |
4491 | |
4492 | + /* |
4493 | + * We are going to log the inode size change in this transaction so |
4494 | + * any previous writes that are beyond the on disk EOF and the new |
4495 | + * EOF that have not been written out need to be written here. If we |
4496 | + * do not write the data out, we expose ourselves to the null files |
4497 | + * problem. Note that this includes any block zeroing we did above; |
4498 | + * otherwise those blocks may not be zeroed after a crash. |
4499 | + */ |
4500 | + if (did_zeroing || |
4501 | + (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { |
4502 | + error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, |
4503 | + ip->i_d.di_size, newsize - 1); |
4504 | + if (error) |
4505 | + return error; |
4506 | + } |
4507 | + |
4508 | error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); |
4509 | if (error) |
4510 | return error; |
4511 | diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c |
4512 | index 05909269f973..1e26f4504eed 100644 |
4513 | --- a/fs/xfs/xfs_log_recover.c |
4514 | +++ b/fs/xfs/xfs_log_recover.c |
4515 | @@ -753,7 +753,7 @@ xlog_find_head( |
4516 | * in the in-core log. The following number can be made tighter if |
4517 | * we actually look at the block size of the filesystem. |
4518 | */ |
4519 | - num_scan_bblks = XLOG_TOTAL_REC_SHIFT(log); |
4520 | + num_scan_bblks = min_t(int, log_bbnum, XLOG_TOTAL_REC_SHIFT(log)); |
4521 | if (head_blk >= num_scan_bblks) { |
4522 | /* |
4523 | * We are guaranteed that the entire check can be performed |
4524 | diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h |
4525 | index f6d9af3efa45..cac57358f7af 100644 |
4526 | --- a/include/crypto/internal/hash.h |
4527 | +++ b/include/crypto/internal/hash.h |
4528 | @@ -80,6 +80,14 @@ int ahash_register_instance(struct crypto_template *tmpl, |
4529 | struct ahash_instance *inst); |
4530 | void ahash_free_instance(struct crypto_instance *inst); |
4531 | |
4532 | +int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, |
4533 | + unsigned int keylen); |
4534 | + |
4535 | +static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg) |
4536 | +{ |
4537 | + return alg->setkey != shash_no_setkey; |
4538 | +} |
4539 | + |
4540 | int crypto_init_ahash_spawn(struct crypto_ahash_spawn *spawn, |
4541 | struct hash_alg_common *alg, |
4542 | struct crypto_instance *inst); |
4543 | diff --git a/include/linux/acpi.h b/include/linux/acpi.h |
4544 | index 61a3d90f32b3..ca2b4c4aec42 100644 |
4545 | --- a/include/linux/acpi.h |
4546 | +++ b/include/linux/acpi.h |
4547 | @@ -276,11 +276,8 @@ bool acpi_processor_validate_proc_id(int proc_id); |
4548 | /* Arch dependent functions for cpu hotplug support */ |
4549 | int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu); |
4550 | int acpi_unmap_cpu(int cpu); |
4551 | -int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid); |
4552 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ |
4553 | |
4554 | -void acpi_set_processor_mapping(void); |
4555 | - |
4556 | #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC |
4557 | int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr); |
4558 | #endif |
4559 | diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h |
4560 | index 80faf44b8887..dd1b009106a5 100644 |
4561 | --- a/include/linux/mlx4/device.h |
4562 | +++ b/include/linux/mlx4/device.h |
4563 | @@ -476,6 +476,7 @@ enum { |
4564 | enum { |
4565 | MLX4_INTERFACE_STATE_UP = 1 << 0, |
4566 | MLX4_INTERFACE_STATE_DELETION = 1 << 1, |
4567 | + MLX4_INTERFACE_STATE_NOWAIT = 1 << 2, |
4568 | }; |
4569 | |
4570 | #define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ |
4571 | diff --git a/include/linux/mman.h b/include/linux/mman.h |
4572 | index 634c4c51fe3a..c540001ca861 100644 |
4573 | --- a/include/linux/mman.h |
4574 | +++ b/include/linux/mman.h |
4575 | @@ -63,8 +63,9 @@ static inline bool arch_validate_prot(unsigned long prot) |
4576 | * ("bit1" and "bit2" must be single bits) |
4577 | */ |
4578 | #define _calc_vm_trans(x, bit1, bit2) \ |
4579 | + ((!(bit1) || !(bit2)) ? 0 : \ |
4580 | ((bit1) <= (bit2) ? ((x) & (bit1)) * ((bit2) / (bit1)) \ |
4581 | - : ((x) & (bit1)) / ((bit1) / (bit2))) |
4582 | + : ((x) & (bit1)) / ((bit1) / (bit2)))) |
4583 | |
4584 | /* |
4585 | * Combine the mmap "prot" argument into "vm_flags" used internally. |
4586 | diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h |
4587 | index 1beab5532035..818a38f99221 100644 |
4588 | --- a/include/rdma/ib_addr.h |
4589 | +++ b/include/rdma/ib_addr.h |
4590 | @@ -243,10 +243,11 @@ static inline void rdma_addr_set_dgid(struct rdma_dev_addr *dev_addr, union ib_g |
4591 | static inline enum ib_mtu iboe_get_mtu(int mtu) |
4592 | { |
4593 | /* |
4594 | - * reduce IB headers from effective IBoE MTU. 28 stands for |
4595 | - * atomic header which is the biggest possible header after BTH |
4596 | + * Reduce IB headers from effective IBoE MTU. |
4597 | */ |
4598 | - mtu = mtu - IB_GRH_BYTES - IB_BTH_BYTES - 28; |
4599 | + mtu = mtu - (IB_GRH_BYTES + IB_UDP_BYTES + IB_BTH_BYTES + |
4600 | + IB_EXT_XRC_BYTES + IB_EXT_ATOMICETH_BYTES + |
4601 | + IB_ICRC_BYTES); |
4602 | |
4603 | if (mtu >= ib_mtu_enum_to_int(IB_MTU_4096)) |
4604 | return IB_MTU_4096; |
4605 | diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h |
4606 | index b13419ce99ff..e02b78a38eba 100644 |
4607 | --- a/include/rdma/ib_pack.h |
4608 | +++ b/include/rdma/ib_pack.h |
4609 | @@ -37,14 +37,17 @@ |
4610 | #include <uapi/linux/if_ether.h> |
4611 | |
4612 | enum { |
4613 | - IB_LRH_BYTES = 8, |
4614 | - IB_ETH_BYTES = 14, |
4615 | - IB_VLAN_BYTES = 4, |
4616 | - IB_GRH_BYTES = 40, |
4617 | - IB_IP4_BYTES = 20, |
4618 | - IB_UDP_BYTES = 8, |
4619 | - IB_BTH_BYTES = 12, |
4620 | - IB_DETH_BYTES = 8 |
4621 | + IB_LRH_BYTES = 8, |
4622 | + IB_ETH_BYTES = 14, |
4623 | + IB_VLAN_BYTES = 4, |
4624 | + IB_GRH_BYTES = 40, |
4625 | + IB_IP4_BYTES = 20, |
4626 | + IB_UDP_BYTES = 8, |
4627 | + IB_BTH_BYTES = 12, |
4628 | + IB_DETH_BYTES = 8, |
4629 | + IB_EXT_ATOMICETH_BYTES = 28, |
4630 | + IB_EXT_XRC_BYTES = 4, |
4631 | + IB_ICRC_BYTES = 4 |
4632 | }; |
4633 | |
4634 | struct ib_field { |
4635 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h |
4636 | index a87e8940fe57..eb3b23b6ec54 100644 |
4637 | --- a/include/target/target_core_base.h |
4638 | +++ b/include/target/target_core_base.h |
4639 | @@ -297,7 +297,7 @@ struct t10_alua_tg_pt_gp { |
4640 | struct list_head tg_pt_gp_lun_list; |
4641 | struct se_lun *tg_pt_gp_alua_lun; |
4642 | struct se_node_acl *tg_pt_gp_alua_nacl; |
4643 | - struct delayed_work tg_pt_gp_transition_work; |
4644 | + struct work_struct tg_pt_gp_transition_work; |
4645 | struct completion *tg_pt_gp_transition_complete; |
4646 | }; |
4647 | |
4648 | diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h |
4649 | index ab1dadba9923..33c603dd7cd3 100644 |
4650 | --- a/include/uapi/linux/usb/ch9.h |
4651 | +++ b/include/uapi/linux/usb/ch9.h |
4652 | @@ -423,6 +423,11 @@ struct usb_endpoint_descriptor { |
4653 | #define USB_ENDPOINT_XFER_INT 3 |
4654 | #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 |
4655 | |
4656 | +#define USB_EP_MAXP_MULT_SHIFT 11 |
4657 | +#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT) |
4658 | +#define USB_EP_MAXP_MULT(m) \ |
4659 | + (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT) |
4660 | + |
4661 | /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */ |
4662 | #define USB_ENDPOINT_INTRTYPE 0x30 |
4663 | #define USB_ENDPOINT_INTR_PERIODIC (0 << 4) |
4664 | @@ -630,6 +635,20 @@ static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) |
4665 | return __le16_to_cpu(epd->wMaxPacketSize); |
4666 | } |
4667 | |
4668 | +/** |
4669 | + * usb_endpoint_maxp_mult - get endpoint's transactional opportunities |
4670 | + * @epd: endpoint to be checked |
4671 | + * |
4672 | + * Return @epd's wMaxPacketSize[12:11] + 1 |
4673 | + */ |
4674 | +static inline int |
4675 | +usb_endpoint_maxp_mult(const struct usb_endpoint_descriptor *epd) |
4676 | +{ |
4677 | + int maxp = __le16_to_cpu(epd->wMaxPacketSize); |
4678 | + |
4679 | + return USB_EP_MAXP_MULT(maxp) + 1; |
4680 | +} |
4681 | + |
4682 | static inline int usb_endpoint_interrupt_type( |
4683 | const struct usb_endpoint_descriptor *epd) |
4684 | { |
4685 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c |
4686 | index c95c5122b105..df5c32a0c6ed 100644 |
4687 | --- a/kernel/sched/deadline.c |
4688 | +++ b/kernel/sched/deadline.c |
4689 | @@ -445,13 +445,13 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se, |
4690 | * |
4691 | * This function returns true if: |
4692 | * |
4693 | - * runtime / (deadline - t) > dl_runtime / dl_period , |
4694 | + * runtime / (deadline - t) > dl_runtime / dl_deadline , |
4695 | * |
4696 | * IOW we can't recycle current parameters. |
4697 | * |
4698 | - * Notice that the bandwidth check is done against the period. For |
4699 | + * Notice that the bandwidth check is done against the deadline. For |
4700 | * task with deadline equal to period this is the same of using |
4701 | - * dl_deadline instead of dl_period in the equation above. |
4702 | + * dl_period instead of dl_deadline in the equation above. |
4703 | */ |
4704 | static bool dl_entity_overflow(struct sched_dl_entity *dl_se, |
4705 | struct sched_dl_entity *pi_se, u64 t) |
4706 | @@ -476,7 +476,7 @@ static bool dl_entity_overflow(struct sched_dl_entity *dl_se, |
4707 | * of anything below microseconds resolution is actually fiction |
4708 | * (but still we want to give the user that illusion >;). |
4709 | */ |
4710 | - left = (pi_se->dl_period >> DL_SCALE) * (dl_se->runtime >> DL_SCALE); |
4711 | + left = (pi_se->dl_deadline >> DL_SCALE) * (dl_se->runtime >> DL_SCALE); |
4712 | right = ((dl_se->deadline - t) >> DL_SCALE) * |
4713 | (pi_se->dl_runtime >> DL_SCALE); |
4714 | |
4715 | @@ -505,10 +505,15 @@ static void update_dl_entity(struct sched_dl_entity *dl_se, |
4716 | } |
4717 | } |
4718 | |
4719 | +static inline u64 dl_next_period(struct sched_dl_entity *dl_se) |
4720 | +{ |
4721 | + return dl_se->deadline - dl_se->dl_deadline + dl_se->dl_period; |
4722 | +} |
4723 | + |
4724 | /* |
4725 | * If the entity depleted all its runtime, and if we want it to sleep |
4726 | * while waiting for some new execution time to become available, we |
4727 | - * set the bandwidth enforcement timer to the replenishment instant |
4728 | + * set the bandwidth replenishment timer to the replenishment instant |
4729 | * and try to activate it. |
4730 | * |
4731 | * Notice that it is important for the caller to know if the timer |
4732 | @@ -530,7 +535,7 @@ static int start_dl_timer(struct task_struct *p) |
4733 | * that it is actually coming from rq->clock and not from |
4734 | * hrtimer's time base reading. |
4735 | */ |
4736 | - act = ns_to_ktime(dl_se->deadline); |
4737 | + act = ns_to_ktime(dl_next_period(dl_se)); |
4738 | now = hrtimer_cb_get_time(timer); |
4739 | delta = ktime_to_ns(now) - rq_clock(rq); |
4740 | act = ktime_add_ns(act, delta); |
4741 | @@ -638,6 +643,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) |
4742 | lockdep_unpin_lock(&rq->lock, rf.cookie); |
4743 | rq = dl_task_offline_migration(rq, p); |
4744 | rf.cookie = lockdep_pin_lock(&rq->lock); |
4745 | + update_rq_clock(rq); |
4746 | |
4747 | /* |
4748 | * Now that the task has been migrated to the new RQ and we |
4749 | @@ -689,6 +695,37 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) |
4750 | timer->function = dl_task_timer; |
4751 | } |
4752 | |
4753 | +/* |
4754 | + * During the activation, CBS checks if it can reuse the current task's |
4755 | + * runtime and period. If the deadline of the task is in the past, CBS |
4756 | + * cannot use the runtime, and so it replenishes the task. This rule |
4757 | + * works fine for implicit deadline tasks (deadline == period), and the |
4758 | + * CBS was designed for implicit deadline tasks. However, a task with |
4759 | + * constrained deadline (deadine < period) might be awakened after the |
4760 | + * deadline, but before the next period. In this case, replenishing the |
4761 | + * task would allow it to run for runtime / deadline. As in this case |
4762 | + * deadline < period, CBS enables a task to run for more than the |
4763 | + * runtime / period. In a very loaded system, this can cause a domino |
4764 | + * effect, making other tasks miss their deadlines. |
4765 | + * |
4766 | + * To avoid this problem, in the activation of a constrained deadline |
4767 | + * task after the deadline but before the next period, throttle the |
4768 | + * task and set the replenishing timer to the begin of the next period, |
4769 | + * unless it is boosted. |
4770 | + */ |
4771 | +static inline void dl_check_constrained_dl(struct sched_dl_entity *dl_se) |
4772 | +{ |
4773 | + struct task_struct *p = dl_task_of(dl_se); |
4774 | + struct rq *rq = rq_of_dl_rq(dl_rq_of_se(dl_se)); |
4775 | + |
4776 | + if (dl_time_before(dl_se->deadline, rq_clock(rq)) && |
4777 | + dl_time_before(rq_clock(rq), dl_next_period(dl_se))) { |
4778 | + if (unlikely(dl_se->dl_boosted || !start_dl_timer(p))) |
4779 | + return; |
4780 | + dl_se->dl_throttled = 1; |
4781 | + } |
4782 | +} |
4783 | + |
4784 | static |
4785 | int dl_runtime_exceeded(struct sched_dl_entity *dl_se) |
4786 | { |
4787 | @@ -922,6 +959,11 @@ static void dequeue_dl_entity(struct sched_dl_entity *dl_se) |
4788 | __dequeue_dl_entity(dl_se); |
4789 | } |
4790 | |
4791 | +static inline bool dl_is_constrained(struct sched_dl_entity *dl_se) |
4792 | +{ |
4793 | + return dl_se->dl_deadline < dl_se->dl_period; |
4794 | +} |
4795 | + |
4796 | static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags) |
4797 | { |
4798 | struct task_struct *pi_task = rt_mutex_get_top_task(p); |
4799 | @@ -947,6 +989,15 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags) |
4800 | return; |
4801 | } |
4802 | |
4803 | + /* |
4804 | + * Check if a constrained deadline task was activated |
4805 | + * after the deadline but before the next period. |
4806 | + * If that is the case, the task will be throttled and |
4807 | + * the replenishment timer will be set to the next period. |
4808 | + */ |
4809 | + if (!p->dl.dl_throttled && dl_is_constrained(&p->dl)) |
4810 | + dl_check_constrained_dl(&p->dl); |
4811 | + |
4812 | /* |
4813 | * If p is throttled, we do nothing. In fact, if it exhausted |
4814 | * its budget it needs a replenishment and, since it now is on |
4815 | diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c |
4816 | index 9c131168d933..7a360d6f6798 100644 |
4817 | --- a/kernel/sched/rt.c |
4818 | +++ b/kernel/sched/rt.c |
4819 | @@ -2022,8 +2022,9 @@ static void pull_rt_task(struct rq *this_rq) |
4820 | bool resched = false; |
4821 | struct task_struct *p; |
4822 | struct rq *src_rq; |
4823 | + int rt_overload_count = rt_overloaded(this_rq); |
4824 | |
4825 | - if (likely(!rt_overloaded(this_rq))) |
4826 | + if (likely(!rt_overload_count)) |
4827 | return; |
4828 | |
4829 | /* |
4830 | @@ -2032,6 +2033,11 @@ static void pull_rt_task(struct rq *this_rq) |
4831 | */ |
4832 | smp_rmb(); |
4833 | |
4834 | + /* If we are the only overloaded CPU do nothing */ |
4835 | + if (rt_overload_count == 1 && |
4836 | + cpumask_test_cpu(this_rq->cpu, this_rq->rd->rto_mask)) |
4837 | + return; |
4838 | + |
4839 | #ifdef HAVE_RT_PUSH_IPI |
4840 | if (sched_feat(RT_PUSH_IPI)) { |
4841 | tell_cpu_to_push(this_rq); |
4842 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
4843 | index c1e50cc0d7b0..4214cd960b8e 100644 |
4844 | --- a/kernel/trace/trace.c |
4845 | +++ b/kernel/trace/trace.c |
4846 | @@ -3727,37 +3727,30 @@ static const struct file_operations show_traces_fops = { |
4847 | .llseek = seq_lseek, |
4848 | }; |
4849 | |
4850 | -/* |
4851 | - * The tracer itself will not take this lock, but still we want |
4852 | - * to provide a consistent cpumask to user-space: |
4853 | - */ |
4854 | -static DEFINE_MUTEX(tracing_cpumask_update_lock); |
4855 | - |
4856 | -/* |
4857 | - * Temporary storage for the character representation of the |
4858 | - * CPU bitmask (and one more byte for the newline): |
4859 | - */ |
4860 | -static char mask_str[NR_CPUS + 1]; |
4861 | - |
4862 | static ssize_t |
4863 | tracing_cpumask_read(struct file *filp, char __user *ubuf, |
4864 | size_t count, loff_t *ppos) |
4865 | { |
4866 | struct trace_array *tr = file_inode(filp)->i_private; |
4867 | + char *mask_str; |
4868 | int len; |
4869 | |
4870 | - mutex_lock(&tracing_cpumask_update_lock); |
4871 | + len = snprintf(NULL, 0, "%*pb\n", |
4872 | + cpumask_pr_args(tr->tracing_cpumask)) + 1; |
4873 | + mask_str = kmalloc(len, GFP_KERNEL); |
4874 | + if (!mask_str) |
4875 | + return -ENOMEM; |
4876 | |
4877 | - len = snprintf(mask_str, count, "%*pb\n", |
4878 | + len = snprintf(mask_str, len, "%*pb\n", |
4879 | cpumask_pr_args(tr->tracing_cpumask)); |
4880 | if (len >= count) { |
4881 | count = -EINVAL; |
4882 | goto out_err; |
4883 | } |
4884 | - count = simple_read_from_buffer(ubuf, count, ppos, mask_str, NR_CPUS+1); |
4885 | + count = simple_read_from_buffer(ubuf, count, ppos, mask_str, len); |
4886 | |
4887 | out_err: |
4888 | - mutex_unlock(&tracing_cpumask_update_lock); |
4889 | + kfree(mask_str); |
4890 | |
4891 | return count; |
4892 | } |
4893 | @@ -3777,8 +3770,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf, |
4894 | if (err) |
4895 | goto err_unlock; |
4896 | |
4897 | - mutex_lock(&tracing_cpumask_update_lock); |
4898 | - |
4899 | local_irq_disable(); |
4900 | arch_spin_lock(&tr->max_lock); |
4901 | for_each_tracing_cpu(cpu) { |
4902 | @@ -3801,8 +3792,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf, |
4903 | local_irq_enable(); |
4904 | |
4905 | cpumask_copy(tr->tracing_cpumask, tracing_cpumask_new); |
4906 | - |
4907 | - mutex_unlock(&tracing_cpumask_update_lock); |
4908 | free_cpumask_var(tracing_cpumask_new); |
4909 | |
4910 | return count; |
4911 | diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c |
4912 | index aa1df1a10dd7..82ce5713f744 100644 |
4913 | --- a/net/bridge/br_netfilter_hooks.c |
4914 | +++ b/net/bridge/br_netfilter_hooks.c |
4915 | @@ -706,18 +706,20 @@ static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) |
4916 | |
4917 | static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) |
4918 | { |
4919 | - struct nf_bridge_info *nf_bridge; |
4920 | - unsigned int mtu_reserved; |
4921 | + struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); |
4922 | + unsigned int mtu, mtu_reserved; |
4923 | |
4924 | mtu_reserved = nf_bridge_mtu_reduction(skb); |
4925 | + mtu = skb->dev->mtu; |
4926 | + |
4927 | + if (nf_bridge->frag_max_size && nf_bridge->frag_max_size < mtu) |
4928 | + mtu = nf_bridge->frag_max_size; |
4929 | |
4930 | - if (skb_is_gso(skb) || skb->len + mtu_reserved <= skb->dev->mtu) { |
4931 | + if (skb_is_gso(skb) || skb->len + mtu_reserved <= mtu) { |
4932 | nf_bridge_info_free(skb); |
4933 | return br_dev_queue_push_xmit(net, sk, skb); |
4934 | } |
4935 | |
4936 | - nf_bridge = nf_bridge_info_get(skb); |
4937 | - |
4938 | /* This is wrong! We should preserve the original fragment |
4939 | * boundaries by preserving frag_list rather than refragmenting. |
4940 | */ |
4941 | diff --git a/net/core/dev.c b/net/core/dev.c |
4942 | index c37891828e4e..09007a71c8dd 100644 |
4943 | --- a/net/core/dev.c |
4944 | +++ b/net/core/dev.c |
4945 | @@ -1304,6 +1304,7 @@ void netdev_notify_peers(struct net_device *dev) |
4946 | { |
4947 | rtnl_lock(); |
4948 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev); |
4949 | + call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev); |
4950 | rtnl_unlock(); |
4951 | } |
4952 | EXPORT_SYMBOL(netdev_notify_peers); |
4953 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c |
4954 | index 48734ee6293f..31f17f0bbd1c 100644 |
4955 | --- a/net/ipv4/icmp.c |
4956 | +++ b/net/ipv4/icmp.c |
4957 | @@ -766,7 +766,7 @@ static bool icmp_tag_validation(int proto) |
4958 | } |
4959 | |
4960 | /* |
4961 | - * Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEED, ICMP_QUENCH, and |
4962 | + * Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEEDED, ICMP_QUENCH, and |
4963 | * ICMP_PARAMETERPROB. |
4964 | */ |
4965 | |
4966 | @@ -794,7 +794,8 @@ static bool icmp_unreach(struct sk_buff *skb) |
4967 | if (iph->ihl < 5) /* Mangled header, drop. */ |
4968 | goto out_err; |
4969 | |
4970 | - if (icmph->type == ICMP_DEST_UNREACH) { |
4971 | + switch (icmph->type) { |
4972 | + case ICMP_DEST_UNREACH: |
4973 | switch (icmph->code & 15) { |
4974 | case ICMP_NET_UNREACH: |
4975 | case ICMP_HOST_UNREACH: |
4976 | @@ -830,8 +831,16 @@ static bool icmp_unreach(struct sk_buff *skb) |
4977 | } |
4978 | if (icmph->code > NR_ICMP_UNREACH) |
4979 | goto out; |
4980 | - } else if (icmph->type == ICMP_PARAMETERPROB) |
4981 | + break; |
4982 | + case ICMP_PARAMETERPROB: |
4983 | info = ntohl(icmph->un.gateway) >> 24; |
4984 | + break; |
4985 | + case ICMP_TIME_EXCEEDED: |
4986 | + __ICMP_INC_STATS(net, ICMP_MIB_INTIMEEXCDS); |
4987 | + if (icmph->code == ICMP_EXC_FRAGTIME) |
4988 | + goto out; |
4989 | + break; |
4990 | + } |
4991 | |
4992 | /* |
4993 | * Throw it at our lower layers |
4994 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
4995 | index b06acd0f400d..cfc4dd8997e5 100644 |
4996 | --- a/net/l2tp/l2tp_core.c |
4997 | +++ b/net/l2tp/l2tp_core.c |
4998 | @@ -1944,7 +1944,7 @@ static __net_exit void l2tp_exit_net(struct net *net) |
4999 | |
5000 | rcu_read_lock_bh(); |
5001 | list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { |
5002 | - (void)l2tp_tunnel_delete(tunnel); |
5003 | + l2tp_tunnel_delete(tunnel); |
5004 | } |
5005 | rcu_read_unlock_bh(); |
5006 | |
5007 | diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c |
5008 | index 1ccd310d01a5..ee03bc866d1b 100644 |
5009 | --- a/net/l2tp/l2tp_netlink.c |
5010 | +++ b/net/l2tp/l2tp_netlink.c |
5011 | @@ -287,7 +287,7 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info |
5012 | l2tp_tunnel_notify(&l2tp_nl_family, info, |
5013 | tunnel, L2TP_CMD_TUNNEL_DELETE); |
5014 | |
5015 | - (void) l2tp_tunnel_delete(tunnel); |
5016 | + l2tp_tunnel_delete(tunnel); |
5017 | |
5018 | out: |
5019 | return ret; |
5020 | diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c |
5021 | index 5c67a696e046..b4b3fe078868 100644 |
5022 | --- a/net/mac80211/mesh.c |
5023 | +++ b/net/mac80211/mesh.c |
5024 | @@ -279,8 +279,6 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, |
5025 | /* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */ |
5026 | *pos |= ifmsh->ps_peers_deep_sleep ? |
5027 | IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL : 0x00; |
5028 | - *pos++ = 0x00; |
5029 | - |
5030 | return 0; |
5031 | } |
5032 | |
5033 | diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c |
5034 | index 1309e2c34764..c5a5a6959c1b 100644 |
5035 | --- a/net/mpls/af_mpls.c |
5036 | +++ b/net/mpls/af_mpls.c |
5037 | @@ -937,6 +937,8 @@ static void mpls_ifdown(struct net_device *dev, int event) |
5038 | { |
5039 | struct mpls_route __rcu **platform_label; |
5040 | struct net *net = dev_net(dev); |
5041 | + unsigned int nh_flags = RTNH_F_DEAD | RTNH_F_LINKDOWN; |
5042 | + unsigned int alive; |
5043 | unsigned index; |
5044 | |
5045 | platform_label = rtnl_dereference(net->mpls.platform_label); |
5046 | @@ -946,9 +948,11 @@ static void mpls_ifdown(struct net_device *dev, int event) |
5047 | if (!rt) |
5048 | continue; |
5049 | |
5050 | + alive = 0; |
5051 | change_nexthops(rt) { |
5052 | if (rtnl_dereference(nh->nh_dev) != dev) |
5053 | - continue; |
5054 | + goto next; |
5055 | + |
5056 | switch (event) { |
5057 | case NETDEV_DOWN: |
5058 | case NETDEV_UNREGISTER: |
5059 | @@ -956,13 +960,16 @@ static void mpls_ifdown(struct net_device *dev, int event) |
5060 | /* fall through */ |
5061 | case NETDEV_CHANGE: |
5062 | nh->nh_flags |= RTNH_F_LINKDOWN; |
5063 | - if (event != NETDEV_UNREGISTER) |
5064 | - ACCESS_ONCE(rt->rt_nhn_alive) = rt->rt_nhn_alive - 1; |
5065 | break; |
5066 | } |
5067 | if (event == NETDEV_UNREGISTER) |
5068 | RCU_INIT_POINTER(nh->nh_dev, NULL); |
5069 | +next: |
5070 | + if (!(nh->nh_flags & nh_flags)) |
5071 | + alive++; |
5072 | } endfor_nexthops(rt); |
5073 | + |
5074 | + WRITE_ONCE(rt->rt_nhn_alive, alive); |
5075 | } |
5076 | } |
5077 | |
5078 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c |
5079 | index a6e44ef2ec9a..2155c2498aed 100644 |
5080 | --- a/net/netfilter/ipvs/ip_vs_ctl.c |
5081 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c |
5082 | @@ -2040,12 +2040,16 @@ static int ip_vs_info_seq_show(struct seq_file *seq, void *v) |
5083 | seq_puts(seq, |
5084 | " -> RemoteAddress:Port Forward Weight ActiveConn InActConn\n"); |
5085 | } else { |
5086 | + struct net *net = seq_file_net(seq); |
5087 | + struct netns_ipvs *ipvs = net_ipvs(net); |
5088 | const struct ip_vs_service *svc = v; |
5089 | const struct ip_vs_iter *iter = seq->private; |
5090 | const struct ip_vs_dest *dest; |
5091 | struct ip_vs_scheduler *sched = rcu_dereference(svc->scheduler); |
5092 | char *sched_name = sched ? sched->name : "none"; |
5093 | |
5094 | + if (svc->ipvs != ipvs) |
5095 | + return 0; |
5096 | if (iter->table == ip_vs_svc_table) { |
5097 | #ifdef CONFIG_IP_VS_IPV6 |
5098 | if (svc->af == AF_INET6) |
5099 | diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c |
5100 | index 3f9d8d7ec632..b099b64366f3 100644 |
5101 | --- a/net/rxrpc/conn_event.c |
5102 | +++ b/net/rxrpc/conn_event.c |
5103 | @@ -275,6 +275,10 @@ static int rxrpc_process_event(struct rxrpc_connection *conn, |
5104 | rxrpc_conn_retransmit_call(conn, skb); |
5105 | return 0; |
5106 | |
5107 | + case RXRPC_PACKET_TYPE_BUSY: |
5108 | + /* Just ignore BUSY packets for now. */ |
5109 | + return 0; |
5110 | + |
5111 | case RXRPC_PACKET_TYPE_ABORT: |
5112 | if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header), |
5113 | &wtmp, sizeof(wtmp)) < 0) |
5114 | diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c |
5115 | index 44fb8d893c7d..1060d14d4e6a 100644 |
5116 | --- a/net/rxrpc/input.c |
5117 | +++ b/net/rxrpc/input.c |
5118 | @@ -649,6 +649,7 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, |
5119 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
5120 | struct rxrpc_peer *peer; |
5121 | unsigned int mtu; |
5122 | + bool wake = false; |
5123 | u32 rwind = ntohl(ackinfo->rwind); |
5124 | |
5125 | _proto("Rx ACK %%%u Info { rx=%u max=%u rwin=%u jm=%u }", |
5126 | @@ -656,9 +657,14 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, |
5127 | ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU), |
5128 | rwind, ntohl(ackinfo->jumbo_max)); |
5129 | |
5130 | - if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) |
5131 | - rwind = RXRPC_RXTX_BUFF_SIZE - 1; |
5132 | - call->tx_winsize = rwind; |
5133 | + if (call->tx_winsize != rwind) { |
5134 | + if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) |
5135 | + rwind = RXRPC_RXTX_BUFF_SIZE - 1; |
5136 | + if (rwind > call->tx_winsize) |
5137 | + wake = true; |
5138 | + call->tx_winsize = rwind; |
5139 | + } |
5140 | + |
5141 | if (call->cong_ssthresh > rwind) |
5142 | call->cong_ssthresh = rwind; |
5143 | |
5144 | @@ -672,6 +678,9 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, |
5145 | spin_unlock_bh(&peer->lock); |
5146 | _net("Net MTU %u (maxdata %u)", peer->mtu, peer->maxdata); |
5147 | } |
5148 | + |
5149 | + if (wake) |
5150 | + wake_up(&call->waitq); |
5151 | } |
5152 | |
5153 | /* |
5154 | diff --git a/net/socket.c b/net/socket.c |
5155 | index 6bbccf05854f..05f13b24572c 100644 |
5156 | --- a/net/socket.c |
5157 | +++ b/net/socket.c |
5158 | @@ -1702,6 +1702,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, |
5159 | /* We assume all kernel code knows the size of sockaddr_storage */ |
5160 | msg.msg_namelen = 0; |
5161 | msg.msg_iocb = NULL; |
5162 | + msg.msg_flags = 0; |
5163 | if (sock->file->f_flags & O_NONBLOCK) |
5164 | flags |= MSG_DONTWAIT; |
5165 | err = sock_recvmsg(sock, &msg, flags); |
5166 | diff --git a/sound/soc/intel/skylake/skl-sst-utils.c b/sound/soc/intel/skylake/skl-sst-utils.c |
5167 | index ea162fbf68e5..d5adc04bb724 100644 |
5168 | --- a/sound/soc/intel/skylake/skl-sst-utils.c |
5169 | +++ b/sound/soc/intel/skylake/skl-sst-utils.c |
5170 | @@ -295,6 +295,7 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, |
5171 | struct uuid_module *module; |
5172 | struct firmware stripped_fw; |
5173 | unsigned int safe_file; |
5174 | + int ret = 0; |
5175 | |
5176 | /* Get the FW pointer to derive ADSP header */ |
5177 | stripped_fw.data = fw->data; |
5178 | @@ -343,8 +344,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, |
5179 | |
5180 | for (i = 0; i < num_entry; i++, mod_entry++) { |
5181 | module = kzalloc(sizeof(*module), GFP_KERNEL); |
5182 | - if (!module) |
5183 | - return -ENOMEM; |
5184 | + if (!module) { |
5185 | + ret = -ENOMEM; |
5186 | + goto free_uuid_list; |
5187 | + } |
5188 | |
5189 | uuid_bin = (uuid_le *)mod_entry->uuid.id; |
5190 | memcpy(&module->uuid, uuid_bin, sizeof(module->uuid)); |
5191 | @@ -355,8 +358,8 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, |
5192 | size = sizeof(int) * mod_entry->instance_max_count; |
5193 | module->instance_id = devm_kzalloc(ctx->dev, size, GFP_KERNEL); |
5194 | if (!module->instance_id) { |
5195 | - kfree(module); |
5196 | - return -ENOMEM; |
5197 | + ret = -ENOMEM; |
5198 | + goto free_uuid_list; |
5199 | } |
5200 | |
5201 | list_add_tail(&module->list, &skl->uuid_list); |
5202 | @@ -367,6 +370,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, |
5203 | } |
5204 | |
5205 | return 0; |
5206 | + |
5207 | +free_uuid_list: |
5208 | + skl_freeup_uuid_list(skl); |
5209 | + return ret; |
5210 | } |
5211 | |
5212 | void skl_freeup_uuid_list(struct skl_sst *ctx) |
5213 | diff --git a/sound/soc/sh/rcar/cmd.c b/sound/soc/sh/rcar/cmd.c |
5214 | index abb5eaac854a..7d92a24b7cfa 100644 |
5215 | --- a/sound/soc/sh/rcar/cmd.c |
5216 | +++ b/sound/soc/sh/rcar/cmd.c |
5217 | @@ -31,23 +31,24 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, |
5218 | struct rsnd_mod *mix = rsnd_io_to_mod_mix(io); |
5219 | struct device *dev = rsnd_priv_to_dev(priv); |
5220 | u32 data; |
5221 | + u32 path[] = { |
5222 | + [1] = 1 << 0, |
5223 | + [5] = 1 << 8, |
5224 | + [6] = 1 << 12, |
5225 | + [9] = 1 << 15, |
5226 | + }; |
5227 | |
5228 | if (!mix && !dvc) |
5229 | return 0; |
5230 | |
5231 | + if (ARRAY_SIZE(path) < rsnd_mod_id(mod) + 1) |
5232 | + return -ENXIO; |
5233 | + |
5234 | if (mix) { |
5235 | struct rsnd_dai *rdai; |
5236 | struct rsnd_mod *src; |
5237 | struct rsnd_dai_stream *tio; |
5238 | int i; |
5239 | - u32 path[] = { |
5240 | - [0] = 0, |
5241 | - [1] = 1 << 0, |
5242 | - [2] = 0, |
5243 | - [3] = 0, |
5244 | - [4] = 0, |
5245 | - [5] = 1 << 8 |
5246 | - }; |
5247 | |
5248 | /* |
5249 | * it is assuming that integrater is well understanding about |
5250 | @@ -70,16 +71,19 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, |
5251 | } else { |
5252 | struct rsnd_mod *src = rsnd_io_to_mod_src(io); |
5253 | |
5254 | - u32 path[] = { |
5255 | - [0] = 0x30000, |
5256 | - [1] = 0x30001, |
5257 | - [2] = 0x40000, |
5258 | - [3] = 0x10000, |
5259 | - [4] = 0x20000, |
5260 | - [5] = 0x40100 |
5261 | + u8 cmd_case[] = { |
5262 | + [0] = 0x3, |
5263 | + [1] = 0x3, |
5264 | + [2] = 0x4, |
5265 | + [3] = 0x1, |
5266 | + [4] = 0x2, |
5267 | + [5] = 0x4, |
5268 | + [6] = 0x1, |
5269 | + [9] = 0x2, |
5270 | }; |
5271 | |
5272 | - data = path[rsnd_mod_id(src)]; |
5273 | + data = path[rsnd_mod_id(src)] | |
5274 | + cmd_case[rsnd_mod_id(src)] << 16; |
5275 | } |
5276 | |
5277 | dev_dbg(dev, "ctu/mix path = 0x%08x", data); |
5278 | diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c |
5279 | index 6bc93cbb3049..edeb74a13c0f 100644 |
5280 | --- a/sound/soc/sh/rcar/dma.c |
5281 | +++ b/sound/soc/sh/rcar/dma.c |
5282 | @@ -361,6 +361,20 @@ static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg) |
5283 | return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); |
5284 | } |
5285 | |
5286 | +static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg) |
5287 | +{ |
5288 | + struct rsnd_mod *mod = rsnd_mod_get(dma); |
5289 | + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
5290 | + struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); |
5291 | + volatile void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg); |
5292 | + u32 val = ioread32(addr); |
5293 | + |
5294 | + val &= ~mask; |
5295 | + val |= (data & mask); |
5296 | + |
5297 | + iowrite32(val, addr); |
5298 | +} |
5299 | + |
5300 | static int rsnd_dmapp_stop(struct rsnd_mod *mod, |
5301 | struct rsnd_dai_stream *io, |
5302 | struct rsnd_priv *priv) |
5303 | @@ -368,10 +382,10 @@ static int rsnd_dmapp_stop(struct rsnd_mod *mod, |
5304 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); |
5305 | int i; |
5306 | |
5307 | - rsnd_dmapp_write(dma, 0, PDMACHCR); |
5308 | + rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR); |
5309 | |
5310 | for (i = 0; i < 1024; i++) { |
5311 | - if (0 == rsnd_dmapp_read(dma, PDMACHCR)) |
5312 | + if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE)) |
5313 | return 0; |
5314 | udelay(1); |
5315 | } |
5316 | diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c |
5317 | index 6cb6db005fc4..560cf4b51a99 100644 |
5318 | --- a/sound/soc/sh/rcar/ssi.c |
5319 | +++ b/sound/soc/sh/rcar/ssi.c |
5320 | @@ -172,10 +172,15 @@ static u32 rsnd_ssi_run_mods(struct rsnd_dai_stream *io) |
5321 | { |
5322 | struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io); |
5323 | struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io); |
5324 | + u32 mods; |
5325 | |
5326 | - return rsnd_ssi_multi_slaves_runtime(io) | |
5327 | - 1 << rsnd_mod_id(ssi_mod) | |
5328 | - 1 << rsnd_mod_id(ssi_parent_mod); |
5329 | + mods = rsnd_ssi_multi_slaves_runtime(io) | |
5330 | + 1 << rsnd_mod_id(ssi_mod); |
5331 | + |
5332 | + if (ssi_parent_mod) |
5333 | + mods |= 1 << rsnd_mod_id(ssi_parent_mod); |
5334 | + |
5335 | + return mods; |
5336 | } |
5337 | |
5338 | u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io) |
5339 | diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c |
5340 | index f7b35e178582..f199d5b11d76 100644 |
5341 | --- a/tools/perf/util/symbol.c |
5342 | +++ b/tools/perf/util/symbol.c |
5343 | @@ -202,7 +202,7 @@ void symbols__fixup_end(struct rb_root *symbols) |
5344 | |
5345 | /* Last entry */ |
5346 | if (curr->end == curr->start) |
5347 | - curr->end = roundup(curr->start, 4096); |
5348 | + curr->end = roundup(curr->start, 4096) + 4096; |
5349 | } |
5350 | |
5351 | void __map_groups__fixup_end(struct map_groups *mg, enum map_type type) |
5352 | diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile |
5353 | index bbab7f4664ac..d116a19477a7 100644 |
5354 | --- a/tools/testing/selftests/vm/Makefile |
5355 | +++ b/tools/testing/selftests/vm/Makefile |
5356 | @@ -1,5 +1,9 @@ |
5357 | # Makefile for vm selftests |
5358 | |
5359 | +ifndef OUTPUT |
5360 | + OUTPUT := $(shell pwd) |
5361 | +endif |
5362 | + |
5363 | CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS) |
5364 | BINARIES = compaction_test |
5365 | BINARIES += hugepage-mmap |