1 |
commit: 5eb02d5ddb6475c1c30455c59af7fbeb47158762 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Jan 16 10:22:22 2022 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Jan 16 10:22:22 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=5eb02d5d |
7 |
|
8 |
Linuxpatch 5.4.172 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1171_linux-5.4.172.patch | 1290 ++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 1294 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 5d64761b..85a7c8aa 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -727,6 +727,10 @@ Patch: 1170_linux-5.4.171.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 5.4.171 |
23 |
|
24 |
+Patch: 1171_linux-5.4.172.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 5.4.172 |
27 |
+ |
28 |
Patch: 1500_XATTR_USER_PREFIX.patch |
29 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
30 |
Desc: Support for namespace user.pax.* on tmpfs. |
31 |
|
32 |
diff --git a/1171_linux-5.4.172.patch b/1171_linux-5.4.172.patch |
33 |
new file mode 100644 |
34 |
index 00000000..e28d266b |
35 |
--- /dev/null |
36 |
+++ b/1171_linux-5.4.172.patch |
37 |
@@ -0,0 +1,1290 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index 062052f71a976..2f914dd223c81 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,7 +1,7 @@ |
43 |
+ # SPDX-License-Identifier: GPL-2.0 |
44 |
+ VERSION = 5 |
45 |
+ PATCHLEVEL = 4 |
46 |
+-SUBLEVEL = 171 |
47 |
++SUBLEVEL = 172 |
48 |
+ EXTRAVERSION = |
49 |
+ NAME = Kleptomaniac Octopus |
50 |
+ |
51 |
+diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c |
52 |
+index 83e26fd188cc9..d5f64018044b0 100644 |
53 |
+--- a/drivers/base/arch_topology.c |
54 |
++++ b/drivers/base/arch_topology.c |
55 |
+@@ -48,7 +48,7 @@ static ssize_t cpu_capacity_show(struct device *dev, |
56 |
+ { |
57 |
+ struct cpu *cpu = container_of(dev, struct cpu, dev); |
58 |
+ |
59 |
+- return sprintf(buf, "%lu\n", topology_get_cpu_scale(cpu->dev.id)); |
60 |
++ return sysfs_emit(buf, "%lu\n", topology_get_cpu_scale(cpu->dev.id)); |
61 |
+ } |
62 |
+ |
63 |
+ static void update_topology_flags_workfn(struct work_struct *work); |
64 |
+diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c |
65 |
+index 8d553c92cd322..6a8c2b5881be3 100644 |
66 |
+--- a/drivers/base/cacheinfo.c |
67 |
++++ b/drivers/base/cacheinfo.c |
68 |
+@@ -377,7 +377,7 @@ static ssize_t size_show(struct device *dev, |
69 |
+ { |
70 |
+ struct cacheinfo *this_leaf = dev_get_drvdata(dev); |
71 |
+ |
72 |
+- return sprintf(buf, "%uK\n", this_leaf->size >> 10); |
73 |
++ return sysfs_emit(buf, "%uK\n", this_leaf->size >> 10); |
74 |
+ } |
75 |
+ |
76 |
+ static ssize_t shared_cpumap_show_func(struct device *dev, bool list, char *buf) |
77 |
+@@ -407,11 +407,11 @@ static ssize_t type_show(struct device *dev, |
78 |
+ |
79 |
+ switch (this_leaf->type) { |
80 |
+ case CACHE_TYPE_DATA: |
81 |
+- return sprintf(buf, "Data\n"); |
82 |
++ return sysfs_emit(buf, "Data\n"); |
83 |
+ case CACHE_TYPE_INST: |
84 |
+- return sprintf(buf, "Instruction\n"); |
85 |
++ return sysfs_emit(buf, "Instruction\n"); |
86 |
+ case CACHE_TYPE_UNIFIED: |
87 |
+- return sprintf(buf, "Unified\n"); |
88 |
++ return sysfs_emit(buf, "Unified\n"); |
89 |
+ default: |
90 |
+ return -EINVAL; |
91 |
+ } |
92 |
+@@ -425,11 +425,11 @@ static ssize_t allocation_policy_show(struct device *dev, |
93 |
+ int n = 0; |
94 |
+ |
95 |
+ if ((ci_attr & CACHE_READ_ALLOCATE) && (ci_attr & CACHE_WRITE_ALLOCATE)) |
96 |
+- n = sprintf(buf, "ReadWriteAllocate\n"); |
97 |
++ n = sysfs_emit(buf, "ReadWriteAllocate\n"); |
98 |
+ else if (ci_attr & CACHE_READ_ALLOCATE) |
99 |
+- n = sprintf(buf, "ReadAllocate\n"); |
100 |
++ n = sysfs_emit(buf, "ReadAllocate\n"); |
101 |
+ else if (ci_attr & CACHE_WRITE_ALLOCATE) |
102 |
+- n = sprintf(buf, "WriteAllocate\n"); |
103 |
++ n = sysfs_emit(buf, "WriteAllocate\n"); |
104 |
+ return n; |
105 |
+ } |
106 |
+ |
107 |
+@@ -441,9 +441,9 @@ static ssize_t write_policy_show(struct device *dev, |
108 |
+ int n = 0; |
109 |
+ |
110 |
+ if (ci_attr & CACHE_WRITE_THROUGH) |
111 |
+- n = sprintf(buf, "WriteThrough\n"); |
112 |
++ n = sysfs_emit(buf, "WriteThrough\n"); |
113 |
+ else if (ci_attr & CACHE_WRITE_BACK) |
114 |
+- n = sprintf(buf, "WriteBack\n"); |
115 |
++ n = sysfs_emit(buf, "WriteBack\n"); |
116 |
+ return n; |
117 |
+ } |
118 |
+ |
119 |
+diff --git a/drivers/base/core.c b/drivers/base/core.c |
120 |
+index 8b651bfc1d88e..1b016fdd1a750 100644 |
121 |
+--- a/drivers/base/core.c |
122 |
++++ b/drivers/base/core.c |
123 |
+@@ -1027,7 +1027,7 @@ ssize_t device_show_ulong(struct device *dev, |
124 |
+ char *buf) |
125 |
+ { |
126 |
+ struct dev_ext_attribute *ea = to_ext_attr(attr); |
127 |
+- return snprintf(buf, PAGE_SIZE, "%lx\n", *(unsigned long *)(ea->var)); |
128 |
++ return sysfs_emit(buf, "%lx\n", *(unsigned long *)(ea->var)); |
129 |
+ } |
130 |
+ EXPORT_SYMBOL_GPL(device_show_ulong); |
131 |
+ |
132 |
+@@ -1057,7 +1057,7 @@ ssize_t device_show_int(struct device *dev, |
133 |
+ { |
134 |
+ struct dev_ext_attribute *ea = to_ext_attr(attr); |
135 |
+ |
136 |
+- return snprintf(buf, PAGE_SIZE, "%d\n", *(int *)(ea->var)); |
137 |
++ return sysfs_emit(buf, "%d\n", *(int *)(ea->var)); |
138 |
+ } |
139 |
+ EXPORT_SYMBOL_GPL(device_show_int); |
140 |
+ |
141 |
+@@ -1078,7 +1078,7 @@ ssize_t device_show_bool(struct device *dev, struct device_attribute *attr, |
142 |
+ { |
143 |
+ struct dev_ext_attribute *ea = to_ext_attr(attr); |
144 |
+ |
145 |
+- return snprintf(buf, PAGE_SIZE, "%d\n", *(bool *)(ea->var)); |
146 |
++ return sysfs_emit(buf, "%d\n", *(bool *)(ea->var)); |
147 |
+ } |
148 |
+ EXPORT_SYMBOL_GPL(device_show_bool); |
149 |
+ |
150 |
+@@ -1310,7 +1310,7 @@ static ssize_t online_show(struct device *dev, struct device_attribute *attr, |
151 |
+ device_lock(dev); |
152 |
+ val = !dev->offline; |
153 |
+ device_unlock(dev); |
154 |
+- return sprintf(buf, "%u\n", val); |
155 |
++ return sysfs_emit(buf, "%u\n", val); |
156 |
+ } |
157 |
+ |
158 |
+ static ssize_t online_store(struct device *dev, struct device_attribute *attr, |
159 |
+diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c |
160 |
+index f00da44ae6fe0..81ec0a1020d60 100644 |
161 |
+--- a/drivers/base/cpu.c |
162 |
++++ b/drivers/base/cpu.c |
163 |
+@@ -156,7 +156,7 @@ static ssize_t show_crash_notes(struct device *dev, struct device_attribute *att |
164 |
+ * operation should be safe. No locking required. |
165 |
+ */ |
166 |
+ addr = per_cpu_ptr_to_phys(per_cpu_ptr(crash_notes, cpunum)); |
167 |
+- rc = sprintf(buf, "%Lx\n", addr); |
168 |
++ rc = sysfs_emit(buf, "%Lx\n", addr); |
169 |
+ return rc; |
170 |
+ } |
171 |
+ static DEVICE_ATTR(crash_notes, 0400, show_crash_notes, NULL); |
172 |
+@@ -167,7 +167,7 @@ static ssize_t show_crash_notes_size(struct device *dev, |
173 |
+ { |
174 |
+ ssize_t rc; |
175 |
+ |
176 |
+- rc = sprintf(buf, "%zu\n", sizeof(note_buf_t)); |
177 |
++ rc = sysfs_emit(buf, "%zu\n", sizeof(note_buf_t)); |
178 |
+ return rc; |
179 |
+ } |
180 |
+ static DEVICE_ATTR(crash_notes_size, 0400, show_crash_notes_size, NULL); |
181 |
+@@ -231,8 +231,7 @@ static struct cpu_attr cpu_attrs[] = { |
182 |
+ static ssize_t print_cpus_kernel_max(struct device *dev, |
183 |
+ struct device_attribute *attr, char *buf) |
184 |
+ { |
185 |
+- int n = snprintf(buf, PAGE_SIZE-2, "%d\n", NR_CPUS - 1); |
186 |
+- return n; |
187 |
++ return sprintf(buf, "%d\n", NR_CPUS - 1); |
188 |
+ } |
189 |
+ static DEVICE_ATTR(kernel_max, 0444, print_cpus_kernel_max, NULL); |
190 |
+ |
191 |
+@@ -272,7 +271,7 @@ static DEVICE_ATTR(offline, 0444, print_cpus_offline, NULL); |
192 |
+ static ssize_t print_cpus_isolated(struct device *dev, |
193 |
+ struct device_attribute *attr, char *buf) |
194 |
+ { |
195 |
+- int n = 0, len = PAGE_SIZE-2; |
196 |
++ int n; |
197 |
+ cpumask_var_t isolated; |
198 |
+ |
199 |
+ if (!alloc_cpumask_var(&isolated, GFP_KERNEL)) |
200 |
+@@ -280,7 +279,7 @@ static ssize_t print_cpus_isolated(struct device *dev, |
201 |
+ |
202 |
+ cpumask_andnot(isolated, cpu_possible_mask, |
203 |
+ housekeeping_cpumask(HK_FLAG_DOMAIN)); |
204 |
+- n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(isolated)); |
205 |
++ n = sysfs_emit(buf, "%*pbl\n", cpumask_pr_args(isolated)); |
206 |
+ |
207 |
+ free_cpumask_var(isolated); |
208 |
+ |
209 |
+@@ -292,11 +291,7 @@ static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL); |
210 |
+ static ssize_t print_cpus_nohz_full(struct device *dev, |
211 |
+ struct device_attribute *attr, char *buf) |
212 |
+ { |
213 |
+- int n = 0, len = PAGE_SIZE-2; |
214 |
+- |
215 |
+- n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(tick_nohz_full_mask)); |
216 |
+- |
217 |
+- return n; |
218 |
++ return sysfs_emit(buf, "%*pbl\n", cpumask_pr_args(tick_nohz_full_mask)); |
219 |
+ } |
220 |
+ static DEVICE_ATTR(nohz_full, 0444, print_cpus_nohz_full, NULL); |
221 |
+ #endif |
222 |
+@@ -328,8 +323,8 @@ static ssize_t print_cpu_modalias(struct device *dev, |
223 |
+ ssize_t n; |
224 |
+ u32 i; |
225 |
+ |
226 |
+- n = sprintf(buf, "cpu:type:" CPU_FEATURE_TYPEFMT ":feature:", |
227 |
+- CPU_FEATURE_TYPEVAL); |
228 |
++ n = sysfs_emit(buf, "cpu:type:" CPU_FEATURE_TYPEFMT ":feature:", |
229 |
++ CPU_FEATURE_TYPEVAL); |
230 |
+ |
231 |
+ for (i = 0; i < MAX_CPU_FEATURES; i++) |
232 |
+ if (cpu_have_feature(i)) { |
233 |
+@@ -521,56 +516,56 @@ static void __init cpu_dev_register_generic(void) |
234 |
+ ssize_t __weak cpu_show_meltdown(struct device *dev, |
235 |
+ struct device_attribute *attr, char *buf) |
236 |
+ { |
237 |
+- return sprintf(buf, "Not affected\n"); |
238 |
++ return sysfs_emit(buf, "Not affected\n"); |
239 |
+ } |
240 |
+ |
241 |
+ ssize_t __weak cpu_show_spectre_v1(struct device *dev, |
242 |
+ struct device_attribute *attr, char *buf) |
243 |
+ { |
244 |
+- return sprintf(buf, "Not affected\n"); |
245 |
++ return sysfs_emit(buf, "Not affected\n"); |
246 |
+ } |
247 |
+ |
248 |
+ ssize_t __weak cpu_show_spectre_v2(struct device *dev, |
249 |
+ struct device_attribute *attr, char *buf) |
250 |
+ { |
251 |
+- return sprintf(buf, "Not affected\n"); |
252 |
++ return sysfs_emit(buf, "Not affected\n"); |
253 |
+ } |
254 |
+ |
255 |
+ ssize_t __weak cpu_show_spec_store_bypass(struct device *dev, |
256 |
+ struct device_attribute *attr, char *buf) |
257 |
+ { |
258 |
+- return sprintf(buf, "Not affected\n"); |
259 |
++ return sysfs_emit(buf, "Not affected\n"); |
260 |
+ } |
261 |
+ |
262 |
+ ssize_t __weak cpu_show_l1tf(struct device *dev, |
263 |
+ struct device_attribute *attr, char *buf) |
264 |
+ { |
265 |
+- return sprintf(buf, "Not affected\n"); |
266 |
++ return sysfs_emit(buf, "Not affected\n"); |
267 |
+ } |
268 |
+ |
269 |
+ ssize_t __weak cpu_show_mds(struct device *dev, |
270 |
+ struct device_attribute *attr, char *buf) |
271 |
+ { |
272 |
+- return sprintf(buf, "Not affected\n"); |
273 |
++ return sysfs_emit(buf, "Not affected\n"); |
274 |
+ } |
275 |
+ |
276 |
+ ssize_t __weak cpu_show_tsx_async_abort(struct device *dev, |
277 |
+ struct device_attribute *attr, |
278 |
+ char *buf) |
279 |
+ { |
280 |
+- return sprintf(buf, "Not affected\n"); |
281 |
++ return sysfs_emit(buf, "Not affected\n"); |
282 |
+ } |
283 |
+ |
284 |
+ ssize_t __weak cpu_show_itlb_multihit(struct device *dev, |
285 |
+ struct device_attribute *attr, char *buf) |
286 |
+ { |
287 |
+- return sprintf(buf, "Not affected\n"); |
288 |
++ return sysfs_emit(buf, "Not affected\n"); |
289 |
+ } |
290 |
+ |
291 |
+ ssize_t __weak cpu_show_srbds(struct device *dev, |
292 |
+ struct device_attribute *attr, char *buf) |
293 |
+ { |
294 |
+- return sprintf(buf, "Not affected\n"); |
295 |
++ return sysfs_emit(buf, "Not affected\n"); |
296 |
+ } |
297 |
+ |
298 |
+ static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); |
299 |
+diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c |
300 |
+index 5f3e5d8372590..19d18afb30864 100644 |
301 |
+--- a/drivers/base/firmware_loader/fallback.c |
302 |
++++ b/drivers/base/firmware_loader/fallback.c |
303 |
+@@ -215,7 +215,7 @@ static ssize_t firmware_loading_show(struct device *dev, |
304 |
+ loading = fw_sysfs_loading(fw_sysfs->fw_priv); |
305 |
+ mutex_unlock(&fw_lock); |
306 |
+ |
307 |
+- return sprintf(buf, "%d\n", loading); |
308 |
++ return sysfs_emit(buf, "%d\n", loading); |
309 |
+ } |
310 |
+ |
311 |
+ /** |
312 |
+diff --git a/drivers/base/memory.c b/drivers/base/memory.c |
313 |
+index 5a8c430fb8ffa..729e93e0c1c13 100644 |
314 |
+--- a/drivers/base/memory.c |
315 |
++++ b/drivers/base/memory.c |
316 |
+@@ -110,7 +110,7 @@ static ssize_t phys_index_show(struct device *dev, |
317 |
+ unsigned long phys_index; |
318 |
+ |
319 |
+ phys_index = mem->start_section_nr / sections_per_block; |
320 |
+- return sprintf(buf, "%08lx\n", phys_index); |
321 |
++ return sysfs_emit(buf, "%08lx\n", phys_index); |
322 |
+ } |
323 |
+ |
324 |
+ /* |
325 |
+@@ -120,7 +120,7 @@ static ssize_t phys_index_show(struct device *dev, |
326 |
+ static ssize_t removable_show(struct device *dev, struct device_attribute *attr, |
327 |
+ char *buf) |
328 |
+ { |
329 |
+- return sprintf(buf, "%d\n", (int)IS_ENABLED(CONFIG_MEMORY_HOTREMOVE)); |
330 |
++ return sysfs_emit(buf, "%d\n", (int)IS_ENABLED(CONFIG_MEMORY_HOTREMOVE)); |
331 |
+ } |
332 |
+ |
333 |
+ /* |
334 |
+@@ -138,17 +138,17 @@ static ssize_t state_show(struct device *dev, struct device_attribute *attr, |
335 |
+ */ |
336 |
+ switch (mem->state) { |
337 |
+ case MEM_ONLINE: |
338 |
+- len = sprintf(buf, "online\n"); |
339 |
++ len = sysfs_emit(buf, "online\n"); |
340 |
+ break; |
341 |
+ case MEM_OFFLINE: |
342 |
+- len = sprintf(buf, "offline\n"); |
343 |
++ len = sysfs_emit(buf, "offline\n"); |
344 |
+ break; |
345 |
+ case MEM_GOING_OFFLINE: |
346 |
+- len = sprintf(buf, "going-offline\n"); |
347 |
++ len = sysfs_emit(buf, "going-offline\n"); |
348 |
+ break; |
349 |
+ default: |
350 |
+- len = sprintf(buf, "ERROR-UNKNOWN-%ld\n", |
351 |
+- mem->state); |
352 |
++ len = sysfs_emit(buf, "ERROR-UNKNOWN-%ld\n", |
353 |
++ mem->state); |
354 |
+ WARN_ON(1); |
355 |
+ break; |
356 |
+ } |
357 |
+@@ -358,7 +358,7 @@ static ssize_t phys_device_show(struct device *dev, |
358 |
+ struct device_attribute *attr, char *buf) |
359 |
+ { |
360 |
+ struct memory_block *mem = to_memory_block(dev); |
361 |
+- return sprintf(buf, "%d\n", mem->phys_device); |
362 |
++ return sysfs_emit(buf, "%d\n", mem->phys_device); |
363 |
+ } |
364 |
+ |
365 |
+ #ifdef CONFIG_MEMORY_HOTREMOVE |
366 |
+@@ -396,7 +396,7 @@ static ssize_t valid_zones_show(struct device *dev, |
367 |
+ */ |
368 |
+ if (!test_pages_in_a_zone(start_pfn, start_pfn + nr_pages, |
369 |
+ &valid_start_pfn, &valid_end_pfn)) |
370 |
+- return sprintf(buf, "none\n"); |
371 |
++ return sysfs_emit(buf, "none\n"); |
372 |
+ start_pfn = valid_start_pfn; |
373 |
+ strcat(buf, page_zone(pfn_to_page(start_pfn))->name); |
374 |
+ goto out; |
375 |
+@@ -429,7 +429,7 @@ static DEVICE_ATTR_RO(removable); |
376 |
+ static ssize_t block_size_bytes_show(struct device *dev, |
377 |
+ struct device_attribute *attr, char *buf) |
378 |
+ { |
379 |
+- return sprintf(buf, "%lx\n", memory_block_size_bytes()); |
380 |
++ return sysfs_emit(buf, "%lx\n", memory_block_size_bytes()); |
381 |
+ } |
382 |
+ |
383 |
+ static DEVICE_ATTR_RO(block_size_bytes); |
384 |
+@@ -442,9 +442,9 @@ static ssize_t auto_online_blocks_show(struct device *dev, |
385 |
+ struct device_attribute *attr, char *buf) |
386 |
+ { |
387 |
+ if (memhp_auto_online) |
388 |
+- return sprintf(buf, "online\n"); |
389 |
++ return sysfs_emit(buf, "online\n"); |
390 |
+ else |
391 |
+- return sprintf(buf, "offline\n"); |
392 |
++ return sysfs_emit(buf, "offline\n"); |
393 |
+ } |
394 |
+ |
395 |
+ static ssize_t auto_online_blocks_store(struct device *dev, |
396 |
+diff --git a/drivers/base/node.c b/drivers/base/node.c |
397 |
+index c9976dc4aa65f..62a052990bb9b 100644 |
398 |
+--- a/drivers/base/node.c |
399 |
++++ b/drivers/base/node.c |
400 |
+@@ -368,7 +368,7 @@ static ssize_t node_read_meminfo(struct device *dev, |
401 |
+ si_meminfo_node(&i, nid); |
402 |
+ sreclaimable = node_page_state(pgdat, NR_SLAB_RECLAIMABLE); |
403 |
+ sunreclaimable = node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE); |
404 |
+- n = sprintf(buf, |
405 |
++ n = sysfs_emit(buf, |
406 |
+ "Node %d MemTotal: %8lu kB\n" |
407 |
+ "Node %d MemFree: %8lu kB\n" |
408 |
+ "Node %d MemUsed: %8lu kB\n" |
409 |
+@@ -469,19 +469,19 @@ static DEVICE_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); |
410 |
+ static ssize_t node_read_numastat(struct device *dev, |
411 |
+ struct device_attribute *attr, char *buf) |
412 |
+ { |
413 |
+- return sprintf(buf, |
414 |
+- "numa_hit %lu\n" |
415 |
+- "numa_miss %lu\n" |
416 |
+- "numa_foreign %lu\n" |
417 |
+- "interleave_hit %lu\n" |
418 |
+- "local_node %lu\n" |
419 |
+- "other_node %lu\n", |
420 |
+- sum_zone_numa_state(dev->id, NUMA_HIT), |
421 |
+- sum_zone_numa_state(dev->id, NUMA_MISS), |
422 |
+- sum_zone_numa_state(dev->id, NUMA_FOREIGN), |
423 |
+- sum_zone_numa_state(dev->id, NUMA_INTERLEAVE_HIT), |
424 |
+- sum_zone_numa_state(dev->id, NUMA_LOCAL), |
425 |
+- sum_zone_numa_state(dev->id, NUMA_OTHER)); |
426 |
++ return sysfs_emit(buf, |
427 |
++ "numa_hit %lu\n" |
428 |
++ "numa_miss %lu\n" |
429 |
++ "numa_foreign %lu\n" |
430 |
++ "interleave_hit %lu\n" |
431 |
++ "local_node %lu\n" |
432 |
++ "other_node %lu\n", |
433 |
++ sum_zone_numa_state(dev->id, NUMA_HIT), |
434 |
++ sum_zone_numa_state(dev->id, NUMA_MISS), |
435 |
++ sum_zone_numa_state(dev->id, NUMA_FOREIGN), |
436 |
++ sum_zone_numa_state(dev->id, NUMA_INTERLEAVE_HIT), |
437 |
++ sum_zone_numa_state(dev->id, NUMA_LOCAL), |
438 |
++ sum_zone_numa_state(dev->id, NUMA_OTHER)); |
439 |
+ } |
440 |
+ static DEVICE_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); |
441 |
+ |
442 |
+diff --git a/drivers/base/platform.c b/drivers/base/platform.c |
443 |
+index 0b67d41bab8ff..75623b914b8c2 100644 |
444 |
+--- a/drivers/base/platform.c |
445 |
++++ b/drivers/base/platform.c |
446 |
+@@ -1009,7 +1009,7 @@ static ssize_t driver_override_show(struct device *dev, |
447 |
+ ssize_t len; |
448 |
+ |
449 |
+ device_lock(dev); |
450 |
+- len = sprintf(buf, "%s\n", pdev->driver_override); |
451 |
++ len = sysfs_emit(buf, "%s\n", pdev->driver_override); |
452 |
+ device_unlock(dev); |
453 |
+ return len; |
454 |
+ } |
455 |
+diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c |
456 |
+index d7d82db2e4bc4..2786962e08107 100644 |
457 |
+--- a/drivers/base/power/sysfs.c |
458 |
++++ b/drivers/base/power/sysfs.c |
459 |
+@@ -100,7 +100,7 @@ static const char ctrl_on[] = "on"; |
460 |
+ static ssize_t control_show(struct device *dev, struct device_attribute *attr, |
461 |
+ char *buf) |
462 |
+ { |
463 |
+- return sprintf(buf, "%s\n", |
464 |
++ return sysfs_emit(buf, "%s\n", |
465 |
+ dev->power.runtime_auto ? ctrl_auto : ctrl_on); |
466 |
+ } |
467 |
+ |
468 |
+@@ -126,7 +126,7 @@ static ssize_t runtime_active_time_show(struct device *dev, |
469 |
+ int ret; |
470 |
+ u64 tmp = pm_runtime_active_time(dev); |
471 |
+ do_div(tmp, NSEC_PER_MSEC); |
472 |
+- ret = sprintf(buf, "%llu\n", tmp); |
473 |
++ ret = sysfs_emit(buf, "%llu\n", tmp); |
474 |
+ return ret; |
475 |
+ } |
476 |
+ |
477 |
+@@ -138,7 +138,7 @@ static ssize_t runtime_suspended_time_show(struct device *dev, |
478 |
+ int ret; |
479 |
+ u64 tmp = pm_runtime_suspended_time(dev); |
480 |
+ do_div(tmp, NSEC_PER_MSEC); |
481 |
+- ret = sprintf(buf, "%llu\n", tmp); |
482 |
++ ret = sysfs_emit(buf, "%llu\n", tmp); |
483 |
+ return ret; |
484 |
+ } |
485 |
+ |
486 |
+@@ -171,7 +171,7 @@ static ssize_t runtime_status_show(struct device *dev, |
487 |
+ return -EIO; |
488 |
+ } |
489 |
+ } |
490 |
+- return sprintf(buf, p); |
491 |
++ return sysfs_emit(buf, p); |
492 |
+ } |
493 |
+ |
494 |
+ static DEVICE_ATTR_RO(runtime_status); |
495 |
+@@ -181,7 +181,7 @@ static ssize_t autosuspend_delay_ms_show(struct device *dev, |
496 |
+ { |
497 |
+ if (!dev->power.use_autosuspend) |
498 |
+ return -EIO; |
499 |
+- return sprintf(buf, "%d\n", dev->power.autosuspend_delay); |
500 |
++ return sysfs_emit(buf, "%d\n", dev->power.autosuspend_delay); |
501 |
+ } |
502 |
+ |
503 |
+ static ssize_t autosuspend_delay_ms_store(struct device *dev, |
504 |
+@@ -210,11 +210,11 @@ static ssize_t pm_qos_resume_latency_us_show(struct device *dev, |
505 |
+ s32 value = dev_pm_qos_requested_resume_latency(dev); |
506 |
+ |
507 |
+ if (value == 0) |
508 |
+- return sprintf(buf, "n/a\n"); |
509 |
++ return sysfs_emit(buf, "n/a\n"); |
510 |
+ if (value == PM_QOS_RESUME_LATENCY_NO_CONSTRAINT) |
511 |
+ value = 0; |
512 |
+ |
513 |
+- return sprintf(buf, "%d\n", value); |
514 |
++ return sysfs_emit(buf, "%d\n", value); |
515 |
+ } |
516 |
+ |
517 |
+ static ssize_t pm_qos_resume_latency_us_store(struct device *dev, |
518 |
+@@ -254,11 +254,11 @@ static ssize_t pm_qos_latency_tolerance_us_show(struct device *dev, |
519 |
+ s32 value = dev_pm_qos_get_user_latency_tolerance(dev); |
520 |
+ |
521 |
+ if (value < 0) |
522 |
+- return sprintf(buf, "auto\n"); |
523 |
++ return sysfs_emit(buf, "auto\n"); |
524 |
+ if (value == PM_QOS_LATENCY_ANY) |
525 |
+- return sprintf(buf, "any\n"); |
526 |
++ return sysfs_emit(buf, "any\n"); |
527 |
+ |
528 |
+- return sprintf(buf, "%d\n", value); |
529 |
++ return sysfs_emit(buf, "%d\n", value); |
530 |
+ } |
531 |
+ |
532 |
+ static ssize_t pm_qos_latency_tolerance_us_store(struct device *dev, |
533 |
+@@ -290,8 +290,8 @@ static ssize_t pm_qos_no_power_off_show(struct device *dev, |
534 |
+ struct device_attribute *attr, |
535 |
+ char *buf) |
536 |
+ { |
537 |
+- return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev) |
538 |
+- & PM_QOS_FLAG_NO_POWER_OFF)); |
539 |
++ return sysfs_emit(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev) |
540 |
++ & PM_QOS_FLAG_NO_POWER_OFF)); |
541 |
+ } |
542 |
+ |
543 |
+ static ssize_t pm_qos_no_power_off_store(struct device *dev, |
544 |
+@@ -319,9 +319,9 @@ static const char _disabled[] = "disabled"; |
545 |
+ static ssize_t wakeup_show(struct device *dev, struct device_attribute *attr, |
546 |
+ char *buf) |
547 |
+ { |
548 |
+- return sprintf(buf, "%s\n", device_can_wakeup(dev) |
549 |
+- ? (device_may_wakeup(dev) ? _enabled : _disabled) |
550 |
+- : ""); |
551 |
++ return sysfs_emit(buf, "%s\n", device_can_wakeup(dev) |
552 |
++ ? (device_may_wakeup(dev) ? _enabled : _disabled) |
553 |
++ : ""); |
554 |
+ } |
555 |
+ |
556 |
+ static ssize_t wakeup_store(struct device *dev, struct device_attribute *attr, |
557 |
+@@ -507,7 +507,7 @@ static DEVICE_ATTR_RO(wakeup_prevent_sleep_time_ms); |
558 |
+ static ssize_t runtime_usage_show(struct device *dev, |
559 |
+ struct device_attribute *attr, char *buf) |
560 |
+ { |
561 |
+- return sprintf(buf, "%d\n", atomic_read(&dev->power.usage_count)); |
562 |
++ return sysfs_emit(buf, "%d\n", atomic_read(&dev->power.usage_count)); |
563 |
+ } |
564 |
+ static DEVICE_ATTR_RO(runtime_usage); |
565 |
+ |
566 |
+@@ -515,8 +515,8 @@ static ssize_t runtime_active_kids_show(struct device *dev, |
567 |
+ struct device_attribute *attr, |
568 |
+ char *buf) |
569 |
+ { |
570 |
+- return sprintf(buf, "%d\n", dev->power.ignore_children ? |
571 |
+- 0 : atomic_read(&dev->power.child_count)); |
572 |
++ return sysfs_emit(buf, "%d\n", dev->power.ignore_children ? |
573 |
++ 0 : atomic_read(&dev->power.child_count)); |
574 |
+ } |
575 |
+ static DEVICE_ATTR_RO(runtime_active_kids); |
576 |
+ |
577 |
+@@ -524,12 +524,12 @@ static ssize_t runtime_enabled_show(struct device *dev, |
578 |
+ struct device_attribute *attr, char *buf) |
579 |
+ { |
580 |
+ if (dev->power.disable_depth && (dev->power.runtime_auto == false)) |
581 |
+- return sprintf(buf, "disabled & forbidden\n"); |
582 |
++ return sysfs_emit(buf, "disabled & forbidden\n"); |
583 |
+ if (dev->power.disable_depth) |
584 |
+- return sprintf(buf, "disabled\n"); |
585 |
++ return sysfs_emit(buf, "disabled\n"); |
586 |
+ if (dev->power.runtime_auto == false) |
587 |
+- return sprintf(buf, "forbidden\n"); |
588 |
+- return sprintf(buf, "enabled\n"); |
589 |
++ return sysfs_emit(buf, "forbidden\n"); |
590 |
++ return sysfs_emit(buf, "enabled\n"); |
591 |
+ } |
592 |
+ static DEVICE_ATTR_RO(runtime_enabled); |
593 |
+ |
594 |
+@@ -537,9 +537,9 @@ static DEVICE_ATTR_RO(runtime_enabled); |
595 |
+ static ssize_t async_show(struct device *dev, struct device_attribute *attr, |
596 |
+ char *buf) |
597 |
+ { |
598 |
+- return sprintf(buf, "%s\n", |
599 |
+- device_async_suspend_enabled(dev) ? |
600 |
+- _enabled : _disabled); |
601 |
++ return sysfs_emit(buf, "%s\n", |
602 |
++ device_async_suspend_enabled(dev) ? |
603 |
++ _enabled : _disabled); |
604 |
+ } |
605 |
+ |
606 |
+ static ssize_t async_store(struct device *dev, struct device_attribute *attr, |
607 |
+diff --git a/drivers/base/power/wakeup_stats.c b/drivers/base/power/wakeup_stats.c |
608 |
+index c7734914d9144..5568e25d7c9c2 100644 |
609 |
+--- a/drivers/base/power/wakeup_stats.c |
610 |
++++ b/drivers/base/power/wakeup_stats.c |
611 |
+@@ -42,7 +42,7 @@ static ssize_t active_time_ms_show(struct device *dev, |
612 |
+ ktime_t active_time = |
613 |
+ ws->active ? ktime_sub(ktime_get(), ws->last_time) : 0; |
614 |
+ |
615 |
+- return sprintf(buf, "%lld\n", ktime_to_ms(active_time)); |
616 |
++ return sysfs_emit(buf, "%lld\n", ktime_to_ms(active_time)); |
617 |
+ } |
618 |
+ static DEVICE_ATTR_RO(active_time_ms); |
619 |
+ |
620 |
+@@ -57,7 +57,7 @@ static ssize_t total_time_ms_show(struct device *dev, |
621 |
+ active_time = ktime_sub(ktime_get(), ws->last_time); |
622 |
+ total_time = ktime_add(total_time, active_time); |
623 |
+ } |
624 |
+- return sprintf(buf, "%lld\n", ktime_to_ms(total_time)); |
625 |
++ return sysfs_emit(buf, "%lld\n", ktime_to_ms(total_time)); |
626 |
+ } |
627 |
+ static DEVICE_ATTR_RO(total_time_ms); |
628 |
+ |
629 |
+@@ -73,7 +73,7 @@ static ssize_t max_time_ms_show(struct device *dev, |
630 |
+ if (active_time > max_time) |
631 |
+ max_time = active_time; |
632 |
+ } |
633 |
+- return sprintf(buf, "%lld\n", ktime_to_ms(max_time)); |
634 |
++ return sysfs_emit(buf, "%lld\n", ktime_to_ms(max_time)); |
635 |
+ } |
636 |
+ static DEVICE_ATTR_RO(max_time_ms); |
637 |
+ |
638 |
+@@ -82,7 +82,7 @@ static ssize_t last_change_ms_show(struct device *dev, |
639 |
+ { |
640 |
+ struct wakeup_source *ws = dev_get_drvdata(dev); |
641 |
+ |
642 |
+- return sprintf(buf, "%lld\n", ktime_to_ms(ws->last_time)); |
643 |
++ return sysfs_emit(buf, "%lld\n", ktime_to_ms(ws->last_time)); |
644 |
+ } |
645 |
+ static DEVICE_ATTR_RO(last_change_ms); |
646 |
+ |
647 |
+@@ -91,7 +91,7 @@ static ssize_t name_show(struct device *dev, struct device_attribute *attr, |
648 |
+ { |
649 |
+ struct wakeup_source *ws = dev_get_drvdata(dev); |
650 |
+ |
651 |
+- return sprintf(buf, "%s\n", ws->name); |
652 |
++ return sysfs_emit(buf, "%s\n", ws->name); |
653 |
+ } |
654 |
+ static DEVICE_ATTR_RO(name); |
655 |
+ |
656 |
+@@ -106,7 +106,7 @@ static ssize_t prevent_suspend_time_ms_show(struct device *dev, |
657 |
+ prevent_sleep_time = ktime_add(prevent_sleep_time, |
658 |
+ ktime_sub(ktime_get(), ws->start_prevent_time)); |
659 |
+ } |
660 |
+- return sprintf(buf, "%lld\n", ktime_to_ms(prevent_sleep_time)); |
661 |
++ return sysfs_emit(buf, "%lld\n", ktime_to_ms(prevent_sleep_time)); |
662 |
+ } |
663 |
+ static DEVICE_ATTR_RO(prevent_suspend_time_ms); |
664 |
+ |
665 |
+diff --git a/drivers/base/soc.c b/drivers/base/soc.c |
666 |
+index 7c0c5ca5953d2..735f122c2ba31 100644 |
667 |
+--- a/drivers/base/soc.c |
668 |
++++ b/drivers/base/soc.c |
669 |
+@@ -76,15 +76,15 @@ static ssize_t soc_info_get(struct device *dev, |
670 |
+ struct soc_device *soc_dev = container_of(dev, struct soc_device, dev); |
671 |
+ |
672 |
+ if (attr == &dev_attr_machine) |
673 |
+- return sprintf(buf, "%s\n", soc_dev->attr->machine); |
674 |
++ return sysfs_emit(buf, "%s\n", soc_dev->attr->machine); |
675 |
+ if (attr == &dev_attr_family) |
676 |
+- return sprintf(buf, "%s\n", soc_dev->attr->family); |
677 |
++ return sysfs_emit(buf, "%s\n", soc_dev->attr->family); |
678 |
+ if (attr == &dev_attr_revision) |
679 |
+- return sprintf(buf, "%s\n", soc_dev->attr->revision); |
680 |
++ return sysfs_emit(buf, "%s\n", soc_dev->attr->revision); |
681 |
+ if (attr == &dev_attr_serial_number) |
682 |
+- return sprintf(buf, "%s\n", soc_dev->attr->serial_number); |
683 |
++ return sysfs_emit(buf, "%s\n", soc_dev->attr->serial_number); |
684 |
+ if (attr == &dev_attr_soc_id) |
685 |
+- return sprintf(buf, "%s\n", soc_dev->attr->soc_id); |
686 |
++ return sysfs_emit(buf, "%s\n", soc_dev->attr->soc_id); |
687 |
+ |
688 |
+ return -EINVAL; |
689 |
+ |
690 |
+diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c |
691 |
+index 0e5954cac98e0..00d72f6d8e8e2 100644 |
692 |
+--- a/drivers/bluetooth/bfusb.c |
693 |
++++ b/drivers/bluetooth/bfusb.c |
694 |
+@@ -629,6 +629,9 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i |
695 |
+ data->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress; |
696 |
+ data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize); |
697 |
+ |
698 |
++ if (!data->bulk_pkt_size) |
699 |
++ goto done; |
700 |
++ |
701 |
+ rwlock_init(&data->lock); |
702 |
+ |
703 |
+ data->reassembly = NULL; |
704 |
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
705 |
+index 6d643651d69f7..c8f2b991e9cf7 100644 |
706 |
+--- a/drivers/bluetooth/btusb.c |
707 |
++++ b/drivers/bluetooth/btusb.c |
708 |
+@@ -2568,6 +2568,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) |
709 |
+ skb = bt_skb_alloc(HCI_WMT_MAX_EVENT_SIZE, GFP_ATOMIC); |
710 |
+ if (!skb) { |
711 |
+ hdev->stat.err_rx++; |
712 |
++ kfree(urb->setup_packet); |
713 |
+ return; |
714 |
+ } |
715 |
+ |
716 |
+@@ -2588,6 +2589,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) |
717 |
+ data->evt_skb = skb_clone(skb, GFP_ATOMIC); |
718 |
+ if (!data->evt_skb) { |
719 |
+ kfree_skb(skb); |
720 |
++ kfree(urb->setup_packet); |
721 |
+ return; |
722 |
+ } |
723 |
+ } |
724 |
+@@ -2596,6 +2598,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) |
725 |
+ if (err < 0) { |
726 |
+ kfree_skb(data->evt_skb); |
727 |
+ data->evt_skb = NULL; |
728 |
++ kfree(urb->setup_packet); |
729 |
+ return; |
730 |
+ } |
731 |
+ |
732 |
+@@ -2606,6 +2609,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) |
733 |
+ wake_up_bit(&data->flags, |
734 |
+ BTUSB_TX_WAIT_VND_EVT); |
735 |
+ } |
736 |
++ kfree(urb->setup_packet); |
737 |
+ return; |
738 |
+ } else if (urb->status == -ENOENT) { |
739 |
+ /* Avoid suspend failed when usb_kill_urb */ |
740 |
+@@ -2626,6 +2630,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) |
741 |
+ usb_anchor_urb(urb, &data->ctrl_anchor); |
742 |
+ err = usb_submit_urb(urb, GFP_ATOMIC); |
743 |
+ if (err < 0) { |
744 |
++ kfree(urb->setup_packet); |
745 |
+ /* -EPERM: urb is being killed; |
746 |
+ * -ENODEV: device got disconnected |
747 |
+ */ |
748 |
+diff --git a/drivers/char/random.c b/drivers/char/random.c |
749 |
+index ffd61aadb7614..60b39af1279a4 100644 |
750 |
+--- a/drivers/char/random.c |
751 |
++++ b/drivers/char/random.c |
752 |
+@@ -497,6 +497,7 @@ static struct crng_state primary_crng = { |
753 |
+ * its value (from 0->1->2). |
754 |
+ */ |
755 |
+ static int crng_init = 0; |
756 |
++static bool crng_need_final_init = false; |
757 |
+ #define crng_ready() (likely(crng_init > 1)) |
758 |
+ static int crng_init_cnt = 0; |
759 |
+ static unsigned long crng_global_init_time = 0; |
760 |
+@@ -889,6 +890,38 @@ static void crng_initialize(struct crng_state *crng) |
761 |
+ crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; |
762 |
+ } |
763 |
+ |
764 |
++static void crng_finalize_init(struct crng_state *crng) |
765 |
++{ |
766 |
++ if (crng != &primary_crng || crng_init >= 2) |
767 |
++ return; |
768 |
++ if (!system_wq) { |
769 |
++ /* We can't call numa_crng_init until we have workqueues, |
770 |
++ * so mark this for processing later. */ |
771 |
++ crng_need_final_init = true; |
772 |
++ return; |
773 |
++ } |
774 |
++ |
775 |
++ invalidate_batched_entropy(); |
776 |
++ numa_crng_init(); |
777 |
++ crng_init = 2; |
778 |
++ process_random_ready_list(); |
779 |
++ wake_up_interruptible(&crng_init_wait); |
780 |
++ kill_fasync(&fasync, SIGIO, POLL_IN); |
781 |
++ pr_notice("crng init done\n"); |
782 |
++ if (unseeded_warning.missed) { |
783 |
++ pr_notice("random: %d get_random_xx warning(s) missed " |
784 |
++ "due to ratelimiting\n", |
785 |
++ unseeded_warning.missed); |
786 |
++ unseeded_warning.missed = 0; |
787 |
++ } |
788 |
++ if (urandom_warning.missed) { |
789 |
++ pr_notice("random: %d urandom warning(s) missed " |
790 |
++ "due to ratelimiting\n", |
791 |
++ urandom_warning.missed); |
792 |
++ urandom_warning.missed = 0; |
793 |
++ } |
794 |
++} |
795 |
++ |
796 |
+ #ifdef CONFIG_NUMA |
797 |
+ static void do_numa_crng_init(struct work_struct *work) |
798 |
+ { |
799 |
+@@ -904,8 +937,8 @@ static void do_numa_crng_init(struct work_struct *work) |
800 |
+ crng_initialize(crng); |
801 |
+ pool[i] = crng; |
802 |
+ } |
803 |
+- mb(); |
804 |
+- if (cmpxchg(&crng_node_pool, NULL, pool)) { |
805 |
++ /* pairs with READ_ONCE() in select_crng() */ |
806 |
++ if (cmpxchg_release(&crng_node_pool, NULL, pool) != NULL) { |
807 |
+ for_each_node(i) |
808 |
+ kfree(pool[i]); |
809 |
+ kfree(pool); |
810 |
+@@ -918,8 +951,26 @@ static void numa_crng_init(void) |
811 |
+ { |
812 |
+ schedule_work(&numa_crng_init_work); |
813 |
+ } |
814 |
++ |
815 |
++static struct crng_state *select_crng(void) |
816 |
++{ |
817 |
++ struct crng_state **pool; |
818 |
++ int nid = numa_node_id(); |
819 |
++ |
820 |
++ /* pairs with cmpxchg_release() in do_numa_crng_init() */ |
821 |
++ pool = READ_ONCE(crng_node_pool); |
822 |
++ if (pool && pool[nid]) |
823 |
++ return pool[nid]; |
824 |
++ |
825 |
++ return &primary_crng; |
826 |
++} |
827 |
+ #else |
828 |
+ static void numa_crng_init(void) {} |
829 |
++ |
830 |
++static struct crng_state *select_crng(void) |
831 |
++{ |
832 |
++ return &primary_crng; |
833 |
++} |
834 |
+ #endif |
835 |
+ |
836 |
+ /* |
837 |
+@@ -1024,39 +1075,23 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r) |
838 |
+ crng->state[i+4] ^= buf.key[i] ^ rv; |
839 |
+ } |
840 |
+ memzero_explicit(&buf, sizeof(buf)); |
841 |
+- crng->init_time = jiffies; |
842 |
++ WRITE_ONCE(crng->init_time, jiffies); |
843 |
+ spin_unlock_irqrestore(&crng->lock, flags); |
844 |
+- if (crng == &primary_crng && crng_init < 2) { |
845 |
+- invalidate_batched_entropy(); |
846 |
+- numa_crng_init(); |
847 |
+- crng_init = 2; |
848 |
+- process_random_ready_list(); |
849 |
+- wake_up_interruptible(&crng_init_wait); |
850 |
+- pr_notice("random: crng init done\n"); |
851 |
+- if (unseeded_warning.missed) { |
852 |
+- pr_notice("random: %d get_random_xx warning(s) missed " |
853 |
+- "due to ratelimiting\n", |
854 |
+- unseeded_warning.missed); |
855 |
+- unseeded_warning.missed = 0; |
856 |
+- } |
857 |
+- if (urandom_warning.missed) { |
858 |
+- pr_notice("random: %d urandom warning(s) missed " |
859 |
+- "due to ratelimiting\n", |
860 |
+- urandom_warning.missed); |
861 |
+- urandom_warning.missed = 0; |
862 |
+- } |
863 |
+- } |
864 |
++ crng_finalize_init(crng); |
865 |
+ } |
866 |
+ |
867 |
+ static void _extract_crng(struct crng_state *crng, |
868 |
+ __u8 out[CHACHA_BLOCK_SIZE]) |
869 |
+ { |
870 |
+- unsigned long v, flags; |
871 |
++ unsigned long v, flags, init_time; |
872 |
+ |
873 |
+- if (crng_ready() && |
874 |
+- (time_after(crng_global_init_time, crng->init_time) || |
875 |
+- time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL))) |
876 |
+- crng_reseed(crng, crng == &primary_crng ? &input_pool : NULL); |
877 |
++ if (crng_ready()) { |
878 |
++ init_time = READ_ONCE(crng->init_time); |
879 |
++ if (time_after(READ_ONCE(crng_global_init_time), init_time) || |
880 |
++ time_after(jiffies, init_time + CRNG_RESEED_INTERVAL)) |
881 |
++ crng_reseed(crng, crng == &primary_crng ? |
882 |
++ &input_pool : NULL); |
883 |
++ } |
884 |
+ spin_lock_irqsave(&crng->lock, flags); |
885 |
+ if (arch_get_random_long(&v)) |
886 |
+ crng->state[14] ^= v; |
887 |
+@@ -1068,15 +1103,7 @@ static void _extract_crng(struct crng_state *crng, |
888 |
+ |
889 |
+ static void extract_crng(__u8 out[CHACHA_BLOCK_SIZE]) |
890 |
+ { |
891 |
+- struct crng_state *crng = NULL; |
892 |
+- |
893 |
+-#ifdef CONFIG_NUMA |
894 |
+- if (crng_node_pool) |
895 |
+- crng = crng_node_pool[numa_node_id()]; |
896 |
+- if (crng == NULL) |
897 |
+-#endif |
898 |
+- crng = &primary_crng; |
899 |
+- _extract_crng(crng, out); |
900 |
++ _extract_crng(select_crng(), out); |
901 |
+ } |
902 |
+ |
903 |
+ /* |
904 |
+@@ -1105,15 +1132,7 @@ static void _crng_backtrack_protect(struct crng_state *crng, |
905 |
+ |
906 |
+ static void crng_backtrack_protect(__u8 tmp[CHACHA_BLOCK_SIZE], int used) |
907 |
+ { |
908 |
+- struct crng_state *crng = NULL; |
909 |
+- |
910 |
+-#ifdef CONFIG_NUMA |
911 |
+- if (crng_node_pool) |
912 |
+- crng = crng_node_pool[numa_node_id()]; |
913 |
+- if (crng == NULL) |
914 |
+-#endif |
915 |
+- crng = &primary_crng; |
916 |
+- _crng_backtrack_protect(crng, tmp, used); |
917 |
++ _crng_backtrack_protect(select_crng(), tmp, used); |
918 |
+ } |
919 |
+ |
920 |
+ static ssize_t extract_crng_user(void __user *buf, size_t nbytes) |
921 |
+@@ -1957,6 +1976,8 @@ int __init rand_initialize(void) |
922 |
+ { |
923 |
+ init_std_data(&input_pool); |
924 |
+ init_std_data(&blocking_pool); |
925 |
++ if (crng_need_final_init) |
926 |
++ crng_finalize_init(&primary_crng); |
927 |
+ crng_initialize(&primary_crng); |
928 |
+ crng_global_init_time = jiffies; |
929 |
+ if (ratelimit_disable) { |
930 |
+@@ -2150,7 +2171,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg) |
931 |
+ if (crng_init < 2) |
932 |
+ return -ENODATA; |
933 |
+ crng_reseed(&primary_crng, &input_pool); |
934 |
+- crng_global_init_time = jiffies - 1; |
935 |
++ WRITE_ONCE(crng_global_init_time, jiffies - 1); |
936 |
+ return 0; |
937 |
+ default: |
938 |
+ return -EINVAL; |
939 |
+@@ -2488,7 +2509,8 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, |
940 |
+ * We'll be woken up again once below random_write_wakeup_thresh, |
941 |
+ * or when the calling thread is about to terminate. |
942 |
+ */ |
943 |
+- wait_event_interruptible(random_write_wait, kthread_should_stop() || |
944 |
++ wait_event_interruptible(random_write_wait, |
945 |
++ !system_wq || kthread_should_stop() || |
946 |
+ ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); |
947 |
+ mix_pool_bytes(poolp, buffer, count); |
948 |
+ credit_entropy_bits(poolp, entropy); |
949 |
+diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
950 |
+index 91afeca0c6f82..e43a76b027a2a 100644 |
951 |
+--- a/drivers/gpu/drm/i915/intel_pm.c |
952 |
++++ b/drivers/gpu/drm/i915/intel_pm.c |
953 |
+@@ -3017,9 +3017,9 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv) |
954 |
+ * The BIOS provided WM memory latency values are often |
955 |
+ * inadequate for high resolution displays. Adjust them. |
956 |
+ */ |
957 |
+- changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) | |
958 |
+- ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12) | |
959 |
+- ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12); |
960 |
++ changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12); |
961 |
++ changed |= ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12); |
962 |
++ changed |= ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12); |
963 |
+ |
964 |
+ if (!changed) |
965 |
+ return; |
966 |
+diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c |
967 |
+index 378cfc46fc195..40ca1d4e03483 100644 |
968 |
+--- a/drivers/media/usb/uvc/uvc_driver.c |
969 |
++++ b/drivers/media/usb/uvc/uvc_driver.c |
970 |
+@@ -1972,7 +1972,6 @@ int uvc_register_video_device(struct uvc_device *dev, |
971 |
+ const struct v4l2_file_operations *fops, |
972 |
+ const struct v4l2_ioctl_ops *ioctl_ops) |
973 |
+ { |
974 |
+- const char *name; |
975 |
+ int ret; |
976 |
+ |
977 |
+ /* Initialize the video buffers queue. */ |
978 |
+@@ -2001,20 +2000,16 @@ int uvc_register_video_device(struct uvc_device *dev, |
979 |
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
980 |
+ default: |
981 |
+ vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
982 |
+- name = "Video Capture"; |
983 |
+ break; |
984 |
+ case V4L2_BUF_TYPE_VIDEO_OUTPUT: |
985 |
+ vdev->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; |
986 |
+- name = "Video Output"; |
987 |
+ break; |
988 |
+ case V4L2_BUF_TYPE_META_CAPTURE: |
989 |
+ vdev->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; |
990 |
+- name = "Metadata"; |
991 |
+ break; |
992 |
+ } |
993 |
+ |
994 |
+- snprintf(vdev->name, sizeof(vdev->name), "%s %u", name, |
995 |
+- stream->header.bTerminalLink); |
996 |
++ strscpy(vdev->name, dev->name, sizeof(vdev->name)); |
997 |
+ |
998 |
+ /* |
999 |
+ * Set the driver data before calling video_register_device, otherwise |
1000 |
+diff --git a/drivers/mfd/intel-lpss-acpi.c b/drivers/mfd/intel-lpss-acpi.c |
1001 |
+index c8fe334b5fe8b..045cbf0cbe53a 100644 |
1002 |
+--- a/drivers/mfd/intel-lpss-acpi.c |
1003 |
++++ b/drivers/mfd/intel-lpss-acpi.c |
1004 |
+@@ -102,6 +102,7 @@ static int intel_lpss_acpi_probe(struct platform_device *pdev) |
1005 |
+ { |
1006 |
+ struct intel_lpss_platform_info *info; |
1007 |
+ const struct acpi_device_id *id; |
1008 |
++ int ret; |
1009 |
+ |
1010 |
+ id = acpi_match_device(intel_lpss_acpi_ids, &pdev->dev); |
1011 |
+ if (!id) |
1012 |
+@@ -115,10 +116,14 @@ static int intel_lpss_acpi_probe(struct platform_device *pdev) |
1013 |
+ info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1014 |
+ info->irq = platform_get_irq(pdev, 0); |
1015 |
+ |
1016 |
++ ret = intel_lpss_probe(&pdev->dev, info); |
1017 |
++ if (ret) |
1018 |
++ return ret; |
1019 |
++ |
1020 |
+ pm_runtime_set_active(&pdev->dev); |
1021 |
+ pm_runtime_enable(&pdev->dev); |
1022 |
+ |
1023 |
+- return intel_lpss_probe(&pdev->dev, info); |
1024 |
++ return 0; |
1025 |
+ } |
1026 |
+ |
1027 |
+ static int intel_lpss_acpi_remove(struct platform_device *pdev) |
1028 |
+diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c |
1029 |
+index a9151bd27211a..1e19c0d0bca80 100644 |
1030 |
+--- a/drivers/mmc/host/sdhci-pci-core.c |
1031 |
++++ b/drivers/mmc/host/sdhci-pci-core.c |
1032 |
+@@ -1936,6 +1936,7 @@ static const struct pci_device_id pci_ids[] = { |
1033 |
+ SDHCI_PCI_DEVICE(INTEL, JSL_SD, intel_byt_sd), |
1034 |
+ SDHCI_PCI_DEVICE(INTEL, LKF_EMMC, intel_glk_emmc), |
1035 |
+ SDHCI_PCI_DEVICE(INTEL, LKF_SD, intel_byt_sd), |
1036 |
++ SDHCI_PCI_DEVICE(INTEL, ADL_EMMC, intel_glk_emmc), |
1037 |
+ SDHCI_PCI_DEVICE(O2, 8120, o2), |
1038 |
+ SDHCI_PCI_DEVICE(O2, 8220, o2), |
1039 |
+ SDHCI_PCI_DEVICE(O2, 8221, o2), |
1040 |
+diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h |
1041 |
+index 779156ce1ee17..b4ac314790b2c 100644 |
1042 |
+--- a/drivers/mmc/host/sdhci-pci.h |
1043 |
++++ b/drivers/mmc/host/sdhci-pci.h |
1044 |
+@@ -59,6 +59,7 @@ |
1045 |
+ #define PCI_DEVICE_ID_INTEL_JSL_SD 0x4df8 |
1046 |
+ #define PCI_DEVICE_ID_INTEL_LKF_EMMC 0x98c4 |
1047 |
+ #define PCI_DEVICE_ID_INTEL_LKF_SD 0x98f8 |
1048 |
++#define PCI_DEVICE_ID_INTEL_ADL_EMMC 0x54c4 |
1049 |
+ |
1050 |
+ #define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000 |
1051 |
+ #define PCI_DEVICE_ID_VIA_95D0 0x95d0 |
1052 |
+diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c |
1053 |
+index 0ad13d78815c5..8b4c1bb77c334 100644 |
1054 |
+--- a/drivers/net/can/usb/gs_usb.c |
1055 |
++++ b/drivers/net/can/usb/gs_usb.c |
1056 |
+@@ -320,7 +320,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) |
1057 |
+ |
1058 |
+ /* device reports out of range channel id */ |
1059 |
+ if (hf->channel >= GS_MAX_INTF) |
1060 |
+- goto resubmit_urb; |
1061 |
++ goto device_detach; |
1062 |
+ |
1063 |
+ dev = usbcan->canch[hf->channel]; |
1064 |
+ |
1065 |
+@@ -405,6 +405,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) |
1066 |
+ |
1067 |
+ /* USB failure take down all interfaces */ |
1068 |
+ if (rc == -ENODEV) { |
1069 |
++ device_detach: |
1070 |
+ for (rc = 0; rc < GS_MAX_INTF; rc++) { |
1071 |
+ if (usbcan->canch[rc]) |
1072 |
+ netif_device_detach(usbcan->canch[rc]->netdev); |
1073 |
+@@ -506,6 +507,8 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, |
1074 |
+ |
1075 |
+ hf->echo_id = idx; |
1076 |
+ hf->channel = dev->channel; |
1077 |
++ hf->flags = 0; |
1078 |
++ hf->reserved = 0; |
1079 |
+ |
1080 |
+ cf = (struct can_frame *)skb->data; |
1081 |
+ |
1082 |
+diff --git a/drivers/net/veth.c b/drivers/net/veth.c |
1083 |
+index 44ad412f9a06f..81a79e7132483 100644 |
1084 |
+--- a/drivers/net/veth.c |
1085 |
++++ b/drivers/net/veth.c |
1086 |
+@@ -254,7 +254,6 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev) |
1087 |
+ if (rxq < rcv->real_num_rx_queues) { |
1088 |
+ rq = &rcv_priv->rq[rxq]; |
1089 |
+ rcv_xdp = rcu_access_pointer(rq->xdp_prog); |
1090 |
+- skb_record_rx_queue(skb, rxq); |
1091 |
+ } |
1092 |
+ |
1093 |
+ skb_tx_timestamp(skb); |
1094 |
+diff --git a/drivers/staging/greybus/audio_topology.c b/drivers/staging/greybus/audio_topology.c |
1095 |
+index cc329b990e165..a8cfea957868a 100644 |
1096 |
+--- a/drivers/staging/greybus/audio_topology.c |
1097 |
++++ b/drivers/staging/greybus/audio_topology.c |
1098 |
+@@ -983,6 +983,44 @@ static int gbaudio_widget_event(struct snd_soc_dapm_widget *w, |
1099 |
+ return ret; |
1100 |
+ } |
1101 |
+ |
1102 |
++static const struct snd_soc_dapm_widget gbaudio_widgets[] = { |
1103 |
++ [snd_soc_dapm_spk] = SND_SOC_DAPM_SPK(NULL, gbcodec_event_spk), |
1104 |
++ [snd_soc_dapm_hp] = SND_SOC_DAPM_HP(NULL, gbcodec_event_hp), |
1105 |
++ [snd_soc_dapm_mic] = SND_SOC_DAPM_MIC(NULL, gbcodec_event_int_mic), |
1106 |
++ [snd_soc_dapm_output] = SND_SOC_DAPM_OUTPUT(NULL), |
1107 |
++ [snd_soc_dapm_input] = SND_SOC_DAPM_INPUT(NULL), |
1108 |
++ [snd_soc_dapm_switch] = SND_SOC_DAPM_SWITCH_E(NULL, SND_SOC_NOPM, |
1109 |
++ 0, 0, NULL, |
1110 |
++ gbaudio_widget_event, |
1111 |
++ SND_SOC_DAPM_PRE_PMU | |
1112 |
++ SND_SOC_DAPM_POST_PMD), |
1113 |
++ [snd_soc_dapm_pga] = SND_SOC_DAPM_PGA_E(NULL, SND_SOC_NOPM, |
1114 |
++ 0, 0, NULL, 0, |
1115 |
++ gbaudio_widget_event, |
1116 |
++ SND_SOC_DAPM_PRE_PMU | |
1117 |
++ SND_SOC_DAPM_POST_PMD), |
1118 |
++ [snd_soc_dapm_mixer] = SND_SOC_DAPM_MIXER_E(NULL, SND_SOC_NOPM, |
1119 |
++ 0, 0, NULL, 0, |
1120 |
++ gbaudio_widget_event, |
1121 |
++ SND_SOC_DAPM_PRE_PMU | |
1122 |
++ SND_SOC_DAPM_POST_PMD), |
1123 |
++ [snd_soc_dapm_mux] = SND_SOC_DAPM_MUX_E(NULL, SND_SOC_NOPM, |
1124 |
++ 0, 0, NULL, |
1125 |
++ gbaudio_widget_event, |
1126 |
++ SND_SOC_DAPM_PRE_PMU | |
1127 |
++ SND_SOC_DAPM_POST_PMD), |
1128 |
++ [snd_soc_dapm_aif_in] = SND_SOC_DAPM_AIF_IN_E(NULL, NULL, 0, |
1129 |
++ SND_SOC_NOPM, 0, 0, |
1130 |
++ gbaudio_widget_event, |
1131 |
++ SND_SOC_DAPM_PRE_PMU | |
1132 |
++ SND_SOC_DAPM_POST_PMD), |
1133 |
++ [snd_soc_dapm_aif_out] = SND_SOC_DAPM_AIF_OUT_E(NULL, NULL, 0, |
1134 |
++ SND_SOC_NOPM, 0, 0, |
1135 |
++ gbaudio_widget_event, |
1136 |
++ SND_SOC_DAPM_PRE_PMU | |
1137 |
++ SND_SOC_DAPM_POST_PMD), |
1138 |
++}; |
1139 |
++ |
1140 |
+ static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module, |
1141 |
+ struct snd_soc_dapm_widget *dw, |
1142 |
+ struct gb_audio_widget *w, int *w_size) |
1143 |
+@@ -1061,77 +1099,37 @@ static int gbaudio_tplg_create_widget(struct gbaudio_module_info *module, |
1144 |
+ |
1145 |
+ switch (w->type) { |
1146 |
+ case snd_soc_dapm_spk: |
1147 |
+- *dw = (struct snd_soc_dapm_widget) |
1148 |
+- SND_SOC_DAPM_SPK(w->name, gbcodec_event_spk); |
1149 |
++ *dw = gbaudio_widgets[w->type]; |
1150 |
+ module->op_devices |= GBAUDIO_DEVICE_OUT_SPEAKER; |
1151 |
+ break; |
1152 |
+ case snd_soc_dapm_hp: |
1153 |
+- *dw = (struct snd_soc_dapm_widget) |
1154 |
+- SND_SOC_DAPM_HP(w->name, gbcodec_event_hp); |
1155 |
++ *dw = gbaudio_widgets[w->type]; |
1156 |
+ module->op_devices |= (GBAUDIO_DEVICE_OUT_WIRED_HEADSET |
1157 |
+ | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE); |
1158 |
+ module->ip_devices |= GBAUDIO_DEVICE_IN_WIRED_HEADSET; |
1159 |
+ break; |
1160 |
+ case snd_soc_dapm_mic: |
1161 |
+- *dw = (struct snd_soc_dapm_widget) |
1162 |
+- SND_SOC_DAPM_MIC(w->name, gbcodec_event_int_mic); |
1163 |
++ *dw = gbaudio_widgets[w->type]; |
1164 |
+ module->ip_devices |= GBAUDIO_DEVICE_IN_BUILTIN_MIC; |
1165 |
+ break; |
1166 |
+ case snd_soc_dapm_output: |
1167 |
+- *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_OUTPUT(w->name); |
1168 |
+- break; |
1169 |
+ case snd_soc_dapm_input: |
1170 |
+- *dw = (struct snd_soc_dapm_widget)SND_SOC_DAPM_INPUT(w->name); |
1171 |
+- break; |
1172 |
+ case snd_soc_dapm_switch: |
1173 |
+- *dw = (struct snd_soc_dapm_widget) |
1174 |
+- SND_SOC_DAPM_SWITCH_E(w->name, SND_SOC_NOPM, 0, 0, |
1175 |
+- widget_kctls, |
1176 |
+- gbaudio_widget_event, |
1177 |
+- SND_SOC_DAPM_PRE_PMU | |
1178 |
+- SND_SOC_DAPM_POST_PMD); |
1179 |
+- break; |
1180 |
+ case snd_soc_dapm_pga: |
1181 |
+- *dw = (struct snd_soc_dapm_widget) |
1182 |
+- SND_SOC_DAPM_PGA_E(w->name, SND_SOC_NOPM, 0, 0, NULL, 0, |
1183 |
+- gbaudio_widget_event, |
1184 |
+- SND_SOC_DAPM_PRE_PMU | |
1185 |
+- SND_SOC_DAPM_POST_PMD); |
1186 |
+- break; |
1187 |
+ case snd_soc_dapm_mixer: |
1188 |
+- *dw = (struct snd_soc_dapm_widget) |
1189 |
+- SND_SOC_DAPM_MIXER_E(w->name, SND_SOC_NOPM, 0, 0, NULL, |
1190 |
+- 0, gbaudio_widget_event, |
1191 |
+- SND_SOC_DAPM_PRE_PMU | |
1192 |
+- SND_SOC_DAPM_POST_PMD); |
1193 |
+- break; |
1194 |
+ case snd_soc_dapm_mux: |
1195 |
+- *dw = (struct snd_soc_dapm_widget) |
1196 |
+- SND_SOC_DAPM_MUX_E(w->name, SND_SOC_NOPM, 0, 0, |
1197 |
+- widget_kctls, gbaudio_widget_event, |
1198 |
+- SND_SOC_DAPM_PRE_PMU | |
1199 |
+- SND_SOC_DAPM_POST_PMD); |
1200 |
++ *dw = gbaudio_widgets[w->type]; |
1201 |
+ break; |
1202 |
+ case snd_soc_dapm_aif_in: |
1203 |
+- *dw = (struct snd_soc_dapm_widget) |
1204 |
+- SND_SOC_DAPM_AIF_IN_E(w->name, w->sname, 0, |
1205 |
+- SND_SOC_NOPM, |
1206 |
+- 0, 0, gbaudio_widget_event, |
1207 |
+- SND_SOC_DAPM_PRE_PMU | |
1208 |
+- SND_SOC_DAPM_POST_PMD); |
1209 |
+- break; |
1210 |
+ case snd_soc_dapm_aif_out: |
1211 |
+- *dw = (struct snd_soc_dapm_widget) |
1212 |
+- SND_SOC_DAPM_AIF_OUT_E(w->name, w->sname, 0, |
1213 |
+- SND_SOC_NOPM, |
1214 |
+- 0, 0, gbaudio_widget_event, |
1215 |
+- SND_SOC_DAPM_PRE_PMU | |
1216 |
+- SND_SOC_DAPM_POST_PMD); |
1217 |
++ *dw = gbaudio_widgets[w->type]; |
1218 |
++ dw->sname = w->sname; |
1219 |
+ break; |
1220 |
+ default: |
1221 |
+ ret = -EINVAL; |
1222 |
+ goto error; |
1223 |
+ } |
1224 |
++ dw->name = w->name; |
1225 |
+ |
1226 |
+ dev_dbg(module->dev, "%s: widget of type %d created\n", dw->name, |
1227 |
+ dw->id); |
1228 |
+diff --git a/drivers/staging/wlan-ng/hfa384x_usb.c b/drivers/staging/wlan-ng/hfa384x_usb.c |
1229 |
+index ed4ff78dd02aa..71cca6e1dea46 100644 |
1230 |
+--- a/drivers/staging/wlan-ng/hfa384x_usb.c |
1231 |
++++ b/drivers/staging/wlan-ng/hfa384x_usb.c |
1232 |
+@@ -3779,18 +3779,18 @@ static void hfa384x_usb_throttlefn(struct timer_list *t) |
1233 |
+ |
1234 |
+ spin_lock_irqsave(&hw->ctlxq.lock, flags); |
1235 |
+ |
1236 |
+- /* |
1237 |
+- * We need to check BOTH the RX and the TX throttle controls, |
1238 |
+- * so we use the bitwise OR instead of the logical OR. |
1239 |
+- */ |
1240 |
+ pr_debug("flags=0x%lx\n", hw->usb_flags); |
1241 |
+- if (!hw->wlandev->hwremoved && |
1242 |
+- ((test_and_clear_bit(THROTTLE_RX, &hw->usb_flags) && |
1243 |
+- !test_and_set_bit(WORK_RX_RESUME, &hw->usb_flags)) | |
1244 |
+- (test_and_clear_bit(THROTTLE_TX, &hw->usb_flags) && |
1245 |
+- !test_and_set_bit(WORK_TX_RESUME, &hw->usb_flags)) |
1246 |
+- )) { |
1247 |
+- schedule_work(&hw->usb_work); |
1248 |
++ if (!hw->wlandev->hwremoved) { |
1249 |
++ bool rx_throttle = test_and_clear_bit(THROTTLE_RX, &hw->usb_flags) && |
1250 |
++ !test_and_set_bit(WORK_RX_RESUME, &hw->usb_flags); |
1251 |
++ bool tx_throttle = test_and_clear_bit(THROTTLE_TX, &hw->usb_flags) && |
1252 |
++ !test_and_set_bit(WORK_TX_RESUME, &hw->usb_flags); |
1253 |
++ /* |
1254 |
++ * We need to check BOTH the RX and the TX throttle controls, |
1255 |
++ * so we use the bitwise OR instead of the logical OR. |
1256 |
++ */ |
1257 |
++ if (rx_throttle | tx_throttle) |
1258 |
++ schedule_work(&hw->usb_work); |
1259 |
+ } |
1260 |
+ |
1261 |
+ spin_unlock_irqrestore(&hw->ctlxq.lock, flags); |
1262 |
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c |
1263 |
+index d0f45600b6698..fe9b392bffee3 100644 |
1264 |
+--- a/drivers/usb/core/hcd.c |
1265 |
++++ b/drivers/usb/core/hcd.c |
1266 |
+@@ -753,6 +753,7 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd) |
1267 |
+ { |
1268 |
+ struct urb *urb; |
1269 |
+ int length; |
1270 |
++ int status; |
1271 |
+ unsigned long flags; |
1272 |
+ char buffer[6]; /* Any root hubs with > 31 ports? */ |
1273 |
+ |
1274 |
+@@ -770,11 +771,17 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd) |
1275 |
+ if (urb) { |
1276 |
+ clear_bit(HCD_FLAG_POLL_PENDING, &hcd->flags); |
1277 |
+ hcd->status_urb = NULL; |
1278 |
++ if (urb->transfer_buffer_length >= length) { |
1279 |
++ status = 0; |
1280 |
++ } else { |
1281 |
++ status = -EOVERFLOW; |
1282 |
++ length = urb->transfer_buffer_length; |
1283 |
++ } |
1284 |
+ urb->actual_length = length; |
1285 |
+ memcpy(urb->transfer_buffer, buffer, length); |
1286 |
+ |
1287 |
+ usb_hcd_unlink_urb_from_ep(hcd, urb); |
1288 |
+- usb_hcd_giveback_urb(hcd, urb, 0); |
1289 |
++ usb_hcd_giveback_urb(hcd, urb, status); |
1290 |
+ } else { |
1291 |
+ length = 0; |
1292 |
+ set_bit(HCD_FLAG_POLL_PENDING, &hcd->flags); |
1293 |
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1294 |
+index d7ab2e88631a0..69dd48f9507e5 100644 |
1295 |
+--- a/drivers/usb/core/hub.c |
1296 |
++++ b/drivers/usb/core/hub.c |
1297 |
+@@ -1223,7 +1223,7 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) |
1298 |
+ */ |
1299 |
+ if (portchange || (hub_is_superspeed(hub->hdev) && |
1300 |
+ port_resumed)) |
1301 |
+- set_bit(port1, hub->change_bits); |
1302 |
++ set_bit(port1, hub->event_bits); |
1303 |
+ |
1304 |
+ } else if (udev->persist_enabled) { |
1305 |
+ #ifdef CONFIG_PM |
1306 |
+diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
1307 |
+index 77e6964ae1a99..e90f37e22202a 100644 |
1308 |
+--- a/kernel/workqueue.c |
1309 |
++++ b/kernel/workqueue.c |
1310 |
+@@ -855,8 +855,17 @@ void wq_worker_running(struct task_struct *task) |
1311 |
+ |
1312 |
+ if (!worker->sleeping) |
1313 |
+ return; |
1314 |
++ |
1315 |
++ /* |
1316 |
++ * If preempted by unbind_workers() between the WORKER_NOT_RUNNING check |
1317 |
++ * and the nr_running increment below, we may ruin the nr_running reset |
1318 |
++ * and leave with an unexpected pool->nr_running == 1 on the newly unbound |
1319 |
++ * pool. Protect against such race. |
1320 |
++ */ |
1321 |
++ preempt_disable(); |
1322 |
+ if (!(worker->flags & WORKER_NOT_RUNNING)) |
1323 |
+ atomic_inc(&worker->pool->nr_running); |
1324 |
++ preempt_enable(); |
1325 |
+ worker->sleeping = 0; |
1326 |
+ } |
1327 |
+ |