Contents of /trunk/kernel-alx-legacy/patches-4.9/0318-4.9.219-all-fixes.patch
Parent Directory | Revision Log
Revision 3608 -
(show annotations)
(download)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 34130 byte(s)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 34130 byte(s)
-added kerenl-alx-legacy pkg
1 | diff --git a/Makefile b/Makefile |
2 | index 1a491b3afc0c..26ad7b28a193 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 218 |
9 | +SUBLEVEL = 219 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S |
14 | index 3b10b9395960..aba534959377 100644 |
15 | --- a/arch/arm64/kernel/head.S |
16 | +++ b/arch/arm64/kernel/head.S |
17 | @@ -650,7 +650,7 @@ ENTRY(__boot_cpu_mode) |
18 | * with MMU turned off. |
19 | */ |
20 | ENTRY(__early_cpu_boot_status) |
21 | - .long 0 |
22 | + .quad 0 |
23 | |
24 | .popsection |
25 | |
26 | diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c |
27 | index 4bc701b32ce2..89bb6250633d 100644 |
28 | --- a/block/blk-mq-tag.c |
29 | +++ b/block/blk-mq-tag.c |
30 | @@ -336,6 +336,13 @@ void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn, |
31 | struct blk_mq_hw_ctx *hctx; |
32 | int i; |
33 | |
34 | + /* |
35 | + * __blk_mq_update_nr_hw_queues will update the nr_hw_queues and |
36 | + * queue_hw_ctx after freeze the queue, so we use q_usage_counter |
37 | + * to avoid race with it. |
38 | + */ |
39 | + if (!percpu_ref_tryget(&q->q_usage_counter)) |
40 | + return; |
41 | |
42 | queue_for_each_hw_ctx(q, hctx, i) { |
43 | struct blk_mq_tags *tags = hctx->tags; |
44 | @@ -351,7 +358,7 @@ void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn, |
45 | bt_for_each(hctx, &tags->breserved_tags, fn, priv, true); |
46 | bt_for_each(hctx, &tags->bitmap_tags, fn, priv, false); |
47 | } |
48 | - |
49 | + blk_queue_exit(q); |
50 | } |
51 | |
52 | static unsigned int bt_unused_tags(const struct sbitmap_queue *bt) |
53 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
54 | index 24fc09cf7f17..58be2eaa5aaa 100644 |
55 | --- a/block/blk-mq.c |
56 | +++ b/block/blk-mq.c |
57 | @@ -2346,6 +2346,10 @@ void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues) |
58 | |
59 | list_for_each_entry(q, &set->tag_list, tag_set_list) |
60 | blk_mq_unfreeze_queue(q); |
61 | + /* |
62 | + * Sync with blk_mq_queue_tag_busy_iter. |
63 | + */ |
64 | + synchronize_rcu(); |
65 | } |
66 | EXPORT_SYMBOL_GPL(blk_mq_update_nr_hw_queues); |
67 | |
68 | diff --git a/drivers/char/random.c b/drivers/char/random.c |
69 | index 81b65d0e7563..4cbc73173701 100644 |
70 | --- a/drivers/char/random.c |
71 | +++ b/drivers/char/random.c |
72 | @@ -2118,8 +2118,8 @@ struct batched_entropy { |
73 | |
74 | /* |
75 | * Get a random word for internal kernel use only. The quality of the random |
76 | - * number is either as good as RDRAND or as good as /dev/urandom, with the |
77 | - * goal of being quite fast and not depleting entropy. |
78 | + * number is good as /dev/urandom, but there is no backtrack protection, with |
79 | + * the goal of being quite fast and not depleting entropy. |
80 | */ |
81 | static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_long); |
82 | unsigned long get_random_long(void) |
83 | @@ -2127,9 +2127,6 @@ unsigned long get_random_long(void) |
84 | unsigned long ret; |
85 | struct batched_entropy *batch; |
86 | |
87 | - if (arch_get_random_long(&ret)) |
88 | - return ret; |
89 | - |
90 | batch = &get_cpu_var(batched_entropy_long); |
91 | if (batch->position % ARRAY_SIZE(batch->entropy_long) == 0) { |
92 | extract_crng((u8 *)batch->entropy_long); |
93 | @@ -2153,9 +2150,6 @@ unsigned int get_random_int(void) |
94 | unsigned int ret; |
95 | struct batched_entropy *batch; |
96 | |
97 | - if (arch_get_random_int(&ret)) |
98 | - return ret; |
99 | - |
100 | batch = &get_cpu_var(batched_entropy_int); |
101 | if (batch->position % ARRAY_SIZE(batch->entropy_int) == 0) { |
102 | extract_crng((u8 *)batch->entropy_int); |
103 | diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c |
104 | index d8601b138dc1..29abb600d7e1 100644 |
105 | --- a/drivers/clk/qcom/clk-rcg2.c |
106 | +++ b/drivers/clk/qcom/clk-rcg2.c |
107 | @@ -107,7 +107,7 @@ static int update_config(struct clk_rcg2 *rcg) |
108 | } |
109 | |
110 | WARN(1, "%s: rcg didn't update its configuration.", name); |
111 | - return 0; |
112 | + return -EBUSY; |
113 | } |
114 | |
115 | static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index) |
116 | diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c |
117 | index a39b0343c197..401c218567af 100644 |
118 | --- a/drivers/gpu/drm/bochs/bochs_hw.c |
119 | +++ b/drivers/gpu/drm/bochs/bochs_hw.c |
120 | @@ -97,10 +97,8 @@ int bochs_hw_init(struct drm_device *dev, uint32_t flags) |
121 | size = min(size, mem); |
122 | } |
123 | |
124 | - if (pci_request_region(pdev, 0, "bochs-drm") != 0) { |
125 | - DRM_ERROR("Cannot request framebuffer\n"); |
126 | - return -EBUSY; |
127 | - } |
128 | + if (pci_request_region(pdev, 0, "bochs-drm") != 0) |
129 | + DRM_WARN("Cannot request framebuffer, boot fb still active?\n"); |
130 | |
131 | bochs->fb_map = ioremap(addr, size); |
132 | if (bochs->fb_map == NULL) { |
133 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c |
134 | index e05dda92398c..592ebcd440b6 100644 |
135 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c |
136 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c |
137 | @@ -431,6 +431,7 @@ static bool drm_dp_sideband_parse_remote_dpcd_read(struct drm_dp_sideband_msg_rx |
138 | if (idx > raw->curlen) |
139 | goto fail_len; |
140 | repmsg->u.remote_dpcd_read_ack.num_bytes = raw->msg[idx]; |
141 | + idx++; |
142 | if (idx > raw->curlen) |
143 | goto fail_len; |
144 | |
145 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_buffer.c b/drivers/gpu/drm/etnaviv/etnaviv_buffer.c |
146 | index d9230132dfbc..d71fa2d9a196 100644 |
147 | --- a/drivers/gpu/drm/etnaviv/etnaviv_buffer.c |
148 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_buffer.c |
149 | @@ -257,6 +257,8 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event, |
150 | unsigned int waitlink_offset = buffer->user_size - 16; |
151 | u32 return_target, return_dwords; |
152 | u32 link_target, link_dwords; |
153 | + unsigned int new_flush_seq = READ_ONCE(gpu->mmu->flush_seq); |
154 | + bool need_flush = gpu->flush_seq != new_flush_seq; |
155 | |
156 | if (drm_debug & DRM_UT_DRIVER) |
157 | etnaviv_buffer_dump(gpu, buffer, 0, 0x50); |
158 | @@ -269,14 +271,14 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event, |
159 | * need to append a mmu flush load state, followed by a new |
160 | * link to this buffer - a total of four additional words. |
161 | */ |
162 | - if (gpu->mmu->need_flush || gpu->switch_context) { |
163 | + if (need_flush || gpu->switch_context) { |
164 | u32 target, extra_dwords; |
165 | |
166 | /* link command */ |
167 | extra_dwords = 1; |
168 | |
169 | /* flush command */ |
170 | - if (gpu->mmu->need_flush) { |
171 | + if (need_flush) { |
172 | if (gpu->mmu->version == ETNAVIV_IOMMU_V1) |
173 | extra_dwords += 1; |
174 | else |
175 | @@ -289,7 +291,7 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event, |
176 | |
177 | target = etnaviv_buffer_reserve(gpu, buffer, extra_dwords); |
178 | |
179 | - if (gpu->mmu->need_flush) { |
180 | + if (need_flush) { |
181 | /* Add the MMU flush */ |
182 | if (gpu->mmu->version == ETNAVIV_IOMMU_V1) { |
183 | CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_MMU, |
184 | @@ -309,7 +311,7 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event, |
185 | SYNC_RECIPIENT_PE); |
186 | } |
187 | |
188 | - gpu->mmu->need_flush = false; |
189 | + gpu->flush_seq = new_flush_seq; |
190 | } |
191 | |
192 | if (gpu->switch_context) { |
193 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c |
194 | index a336754698f8..dba0d769d17a 100644 |
195 | --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c |
196 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c |
197 | @@ -1313,7 +1313,7 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu, |
198 | gpu->active_fence = submit->fence; |
199 | |
200 | if (gpu->lastctx != cmdbuf->ctx) { |
201 | - gpu->mmu->need_flush = true; |
202 | + gpu->mmu->flush_seq++; |
203 | gpu->switch_context = true; |
204 | gpu->lastctx = cmdbuf->ctx; |
205 | } |
206 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h |
207 | index 73c278dc3706..416940b254a6 100644 |
208 | --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h |
209 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h |
210 | @@ -135,6 +135,7 @@ struct etnaviv_gpu { |
211 | int irq; |
212 | |
213 | struct etnaviv_iommu *mmu; |
214 | + unsigned int flush_seq; |
215 | |
216 | /* Power Control: */ |
217 | struct clk *clk_bus; |
218 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
219 | index fe0e85b41310..ef9df6158dc1 100644 |
220 | --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
221 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c |
222 | @@ -134,7 +134,7 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu, |
223 | */ |
224 | if (mmu->last_iova) { |
225 | mmu->last_iova = 0; |
226 | - mmu->need_flush = true; |
227 | + mmu->flush_seq++; |
228 | continue; |
229 | } |
230 | |
231 | @@ -197,7 +197,7 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu, |
232 | * associated commit requesting this mapping, and retry the |
233 | * allocation one more time. |
234 | */ |
235 | - mmu->need_flush = true; |
236 | + mmu->flush_seq++; |
237 | } |
238 | |
239 | return ret; |
240 | @@ -354,7 +354,7 @@ u32 etnaviv_iommu_get_cmdbuf_va(struct etnaviv_gpu *gpu, |
241 | * that the FE MMU prefetch won't load invalid entries. |
242 | */ |
243 | mmu->last_iova = buf->vram_node.start + buf->size + SZ_64K; |
244 | - gpu->mmu->need_flush = true; |
245 | + mmu->flush_seq++; |
246 | mutex_unlock(&mmu->lock); |
247 | |
248 | return (u32)buf->vram_node.start; |
249 | diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h |
250 | index e787e49c9693..5bdc5f5601b1 100644 |
251 | --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h |
252 | +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h |
253 | @@ -44,7 +44,7 @@ struct etnaviv_iommu { |
254 | struct list_head mappings; |
255 | struct drm_mm mm; |
256 | u32 last_iova; |
257 | - bool need_flush; |
258 | + unsigned int flush_seq; |
259 | }; |
260 | |
261 | struct etnaviv_gem_object; |
262 | diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c |
263 | index 795660e29b2c..569e8c45a59a 100644 |
264 | --- a/drivers/gpu/drm/msm/msm_gem.c |
265 | +++ b/drivers/gpu/drm/msm/msm_gem.c |
266 | @@ -40,6 +40,46 @@ static bool use_pages(struct drm_gem_object *obj) |
267 | return !msm_obj->vram_node; |
268 | } |
269 | |
270 | +/* |
271 | + * Cache sync.. this is a bit over-complicated, to fit dma-mapping |
272 | + * API. Really GPU cache is out of scope here (handled on cmdstream) |
273 | + * and all we need to do is invalidate newly allocated pages before |
274 | + * mapping to CPU as uncached/writecombine. |
275 | + * |
276 | + * On top of this, we have the added headache, that depending on |
277 | + * display generation, the display's iommu may be wired up to either |
278 | + * the toplevel drm device (mdss), or to the mdp sub-node, meaning |
279 | + * that here we either have dma-direct or iommu ops. |
280 | + * |
281 | + * Let this be a cautionary tail of abstraction gone wrong. |
282 | + */ |
283 | + |
284 | +static void sync_for_device(struct msm_gem_object *msm_obj) |
285 | +{ |
286 | + struct device *dev = msm_obj->base.dev->dev; |
287 | + |
288 | + if (get_dma_ops(dev)) { |
289 | + dma_sync_sg_for_device(dev, msm_obj->sgt->sgl, |
290 | + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); |
291 | + } else { |
292 | + dma_map_sg(dev, msm_obj->sgt->sgl, |
293 | + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); |
294 | + } |
295 | +} |
296 | + |
297 | +static void sync_for_cpu(struct msm_gem_object *msm_obj) |
298 | +{ |
299 | + struct device *dev = msm_obj->base.dev->dev; |
300 | + |
301 | + if (get_dma_ops(dev)) { |
302 | + dma_sync_sg_for_cpu(dev, msm_obj->sgt->sgl, |
303 | + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); |
304 | + } else { |
305 | + dma_unmap_sg(dev, msm_obj->sgt->sgl, |
306 | + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); |
307 | + } |
308 | +} |
309 | + |
310 | /* allocate pages from VRAM carveout, used when no IOMMU: */ |
311 | static struct page **get_pages_vram(struct drm_gem_object *obj, |
312 | int npages) |
313 | @@ -106,8 +146,7 @@ static struct page **get_pages(struct drm_gem_object *obj) |
314 | * because display controller, GPU, etc. are not coherent: |
315 | */ |
316 | if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) |
317 | - dma_map_sg(dev->dev, msm_obj->sgt->sgl, |
318 | - msm_obj->sgt->nents, DMA_BIDIRECTIONAL); |
319 | + sync_for_device(msm_obj); |
320 | } |
321 | |
322 | return msm_obj->pages; |
323 | @@ -124,9 +163,7 @@ static void put_pages(struct drm_gem_object *obj) |
324 | * GPU, etc. are not coherent: |
325 | */ |
326 | if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) |
327 | - dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, |
328 | - msm_obj->sgt->nents, |
329 | - DMA_BIDIRECTIONAL); |
330 | + sync_for_cpu(msm_obj); |
331 | |
332 | sg_free_table(msm_obj->sgt); |
333 | kfree(msm_obj->sgt); |
334 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
335 | index 27653aad8f21..0a6cc78ebcf7 100644 |
336 | --- a/drivers/infiniband/core/cma.c |
337 | +++ b/drivers/infiniband/core/cma.c |
338 | @@ -2568,6 +2568,7 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv) |
339 | err2: |
340 | kfree(route->path_rec); |
341 | route->path_rec = NULL; |
342 | + route->num_paths = 0; |
343 | err1: |
344 | kfree(work); |
345 | return ret; |
346 | diff --git a/drivers/infiniband/hw/hfi1/sysfs.c b/drivers/infiniband/hw/hfi1/sysfs.c |
347 | index 621b60ab74ee..5df1e368096c 100644 |
348 | --- a/drivers/infiniband/hw/hfi1/sysfs.c |
349 | +++ b/drivers/infiniband/hw/hfi1/sysfs.c |
350 | @@ -670,7 +670,11 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num, |
351 | dd_dev_err(dd, |
352 | "Skipping sc2vl sysfs info, (err %d) port %u\n", |
353 | ret, port_num); |
354 | - goto bail; |
355 | + /* |
356 | + * Based on the documentation for kobject_init_and_add(), the |
357 | + * caller should call kobject_put even if this call fails. |
358 | + */ |
359 | + goto bail_sc2vl; |
360 | } |
361 | kobject_uevent(&ppd->sc2vl_kobj, KOBJ_ADD); |
362 | |
363 | @@ -680,7 +684,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num, |
364 | dd_dev_err(dd, |
365 | "Skipping sl2sc sysfs info, (err %d) port %u\n", |
366 | ret, port_num); |
367 | - goto bail_sc2vl; |
368 | + goto bail_sl2sc; |
369 | } |
370 | kobject_uevent(&ppd->sl2sc_kobj, KOBJ_ADD); |
371 | |
372 | @@ -690,7 +694,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num, |
373 | dd_dev_err(dd, |
374 | "Skipping vl2mtu sysfs info, (err %d) port %u\n", |
375 | ret, port_num); |
376 | - goto bail_sl2sc; |
377 | + goto bail_vl2mtu; |
378 | } |
379 | kobject_uevent(&ppd->vl2mtu_kobj, KOBJ_ADD); |
380 | |
381 | @@ -700,7 +704,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num, |
382 | dd_dev_err(dd, |
383 | "Skipping Congestion Control sysfs info, (err %d) port %u\n", |
384 | ret, port_num); |
385 | - goto bail_vl2mtu; |
386 | + goto bail_cc; |
387 | } |
388 | |
389 | kobject_uevent(&ppd->pport_cc_kobj, KOBJ_ADD); |
390 | @@ -738,7 +742,6 @@ bail_sl2sc: |
391 | kobject_put(&ppd->sl2sc_kobj); |
392 | bail_sc2vl: |
393 | kobject_put(&ppd->sc2vl_kobj); |
394 | -bail: |
395 | return ret; |
396 | } |
397 | |
398 | @@ -858,8 +861,13 @@ bail: |
399 | for (i = 0; i < ARRAY_SIZE(hfi1_attributes); ++i) |
400 | device_remove_file(&dev->dev, hfi1_attributes[i]); |
401 | |
402 | - for (i = 0; i < dd->num_sdma; i++) |
403 | - kobject_del(&dd->per_sdma[i].kobj); |
404 | + /* |
405 | + * The function kobject_put() will call kobject_del() if the kobject |
406 | + * has been added successfully. The sysfs files created under the |
407 | + * kobject directory will also be removed during the process. |
408 | + */ |
409 | + for (; i >= 0; i--) |
410 | + kobject_put(&dd->per_sdma[i].kobj); |
411 | |
412 | return ret; |
413 | } |
414 | @@ -872,6 +880,10 @@ void hfi1_verbs_unregister_sysfs(struct hfi1_devdata *dd) |
415 | struct hfi1_pportdata *ppd; |
416 | int i; |
417 | |
418 | + /* Unwind operations in hfi1_verbs_register_sysfs() */ |
419 | + for (i = 0; i < dd->num_sdma; i++) |
420 | + kobject_put(&dd->per_sdma[i].kobj); |
421 | + |
422 | for (i = 0; i < dd->num_pports; i++) { |
423 | ppd = &dd->pport[i]; |
424 | |
425 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c |
426 | index 94b37c60fdd0..d0435c7631ff 100644 |
427 | --- a/drivers/net/can/slcan.c |
428 | +++ b/drivers/net/can/slcan.c |
429 | @@ -147,7 +147,7 @@ static void slc_bump(struct slcan *sl) |
430 | u32 tmpid; |
431 | char *cmd = sl->rbuff; |
432 | |
433 | - cf.can_id = 0; |
434 | + memset(&cf, 0, sizeof(cf)); |
435 | |
436 | switch (*cmd) { |
437 | case 'r': |
438 | @@ -186,8 +186,6 @@ static void slc_bump(struct slcan *sl) |
439 | else |
440 | return; |
441 | |
442 | - *(u64 *) (&cf.data) = 0; /* clear payload */ |
443 | - |
444 | /* RTR frames may have a dlc > 0 but they never have any data bytes */ |
445 | if (!(cf.can_id & CAN_RTR_FLAG)) { |
446 | for (i = 0; i < cf.can_dlc; i++) { |
447 | diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c |
448 | index a3a8d7b62f3f..796571fccba7 100644 |
449 | --- a/drivers/net/dsa/bcm_sf2.c |
450 | +++ b/drivers/net/dsa/bcm_sf2.c |
451 | @@ -976,6 +976,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) |
452 | struct device_node *dn = pdev->dev.of_node; |
453 | struct b53_platform_data *pdata; |
454 | struct dsa_switch_ops *ops; |
455 | + struct device_node *ports; |
456 | struct bcm_sf2_priv *priv; |
457 | struct b53_device *dev; |
458 | struct dsa_switch *ds; |
459 | @@ -1038,7 +1039,11 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) |
460 | spin_lock_init(&priv->indir_lock); |
461 | mutex_init(&priv->stats_mutex); |
462 | |
463 | - bcm_sf2_identify_ports(priv, dn->child); |
464 | + ports = of_find_node_by_name(dn, "ports"); |
465 | + if (ports) { |
466 | + bcm_sf2_identify_ports(priv, ports); |
467 | + of_node_put(ports); |
468 | + } |
469 | |
470 | priv->irq0 = irq_of_parse_and_map(dn, 0); |
471 | priv->irq1 = irq_of_parse_and_map(dn, 1); |
472 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c |
473 | index 093e58e94075..3a2edf9f51e2 100644 |
474 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c |
475 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c |
476 | @@ -214,7 +214,7 @@ static void dwmac1000_set_filter(struct mac_device_info *hw, |
477 | reg++; |
478 | } |
479 | |
480 | - while (reg <= perfect_addr_number) { |
481 | + while (reg < perfect_addr_number) { |
482 | writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); |
483 | writel(0, ioaddr + GMAC_ADDR_LOW(reg)); |
484 | reg++; |
485 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c |
486 | index 16f074408813..adb38a4ec9ac 100644 |
487 | --- a/drivers/net/phy/micrel.c |
488 | +++ b/drivers/net/phy/micrel.c |
489 | @@ -28,6 +28,7 @@ |
490 | #include <linux/micrel_phy.h> |
491 | #include <linux/of.h> |
492 | #include <linux/clk.h> |
493 | +#include <linux/delay.h> |
494 | |
495 | /* Operation Mode Strap Override */ |
496 | #define MII_KSZPHY_OMSO 0x16 |
497 | @@ -728,6 +729,12 @@ static int kszphy_resume(struct phy_device *phydev) |
498 | { |
499 | genphy_resume(phydev); |
500 | |
501 | + /* After switching from power-down to normal mode, an internal global |
502 | + * reset is automatically generated. Wait a minimum of 1 ms before |
503 | + * read/write access to the PHY registers. |
504 | + */ |
505 | + usleep_range(1000, 2000); |
506 | + |
507 | /* Enable PHY Interrupts */ |
508 | if (phy_interrupt_is_valid(phydev)) { |
509 | phydev->interrupts = PHY_INTERRUPT_ENABLED; |
510 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
511 | index 712bd450f857..bf36eda082d6 100644 |
512 | --- a/drivers/usb/dwc3/gadget.c |
513 | +++ b/drivers/usb/dwc3/gadget.c |
514 | @@ -2996,7 +2996,6 @@ int dwc3_gadget_init(struct dwc3 *dwc) |
515 | dwc->gadget.speed = USB_SPEED_UNKNOWN; |
516 | dwc->gadget.sg_supported = true; |
517 | dwc->gadget.name = "dwc3-gadget"; |
518 | - dwc->gadget.is_otg = dwc->dr_mode == USB_DR_MODE_OTG; |
519 | |
520 | /* |
521 | * FIXME We might be setting max_speed to <SUPER, however versions |
522 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c |
523 | index c42cbd19ff05..ec1640f3167b 100644 |
524 | --- a/fs/ceph/super.c |
525 | +++ b/fs/ceph/super.c |
526 | @@ -85,7 +85,6 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) |
527 | return 0; |
528 | } |
529 | |
530 | - |
531 | static int ceph_sync_fs(struct super_block *sb, int wait) |
532 | { |
533 | struct ceph_fs_client *fsc = ceph_sb_to_client(sb); |
534 | @@ -178,6 +177,26 @@ static match_table_t fsopt_tokens = { |
535 | {-1, NULL} |
536 | }; |
537 | |
538 | +/* |
539 | + * Remove adjacent slashes and then the trailing slash, unless it is |
540 | + * the only remaining character. |
541 | + * |
542 | + * E.g. "//dir1////dir2///" --> "/dir1/dir2", "///" --> "/". |
543 | + */ |
544 | +static void canonicalize_path(char *path) |
545 | +{ |
546 | + int i, j = 0; |
547 | + |
548 | + for (i = 0; path[i] != '\0'; i++) { |
549 | + if (path[i] != '/' || j < 1 || path[j - 1] != '/') |
550 | + path[j++] = path[i]; |
551 | + } |
552 | + |
553 | + if (j > 1 && path[j - 1] == '/') |
554 | + j--; |
555 | + path[j] = '\0'; |
556 | +} |
557 | + |
558 | static int parse_fsopt_token(char *c, void *private) |
559 | { |
560 | struct ceph_mount_options *fsopt = private; |
561 | @@ -337,6 +356,7 @@ static int compare_mount_options(struct ceph_mount_options *new_fsopt, |
562 | ret = strcmp_null(fsopt1->snapdir_name, fsopt2->snapdir_name); |
563 | if (ret) |
564 | return ret; |
565 | + |
566 | ret = strcmp_null(fsopt1->mds_namespace, fsopt2->mds_namespace); |
567 | if (ret) |
568 | return ret; |
569 | @@ -396,13 +416,17 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt, |
570 | */ |
571 | dev_name_end = strchr(dev_name, '/'); |
572 | if (dev_name_end) { |
573 | - if (strlen(dev_name_end) > 1) { |
574 | - fsopt->server_path = kstrdup(dev_name_end, GFP_KERNEL); |
575 | - if (!fsopt->server_path) { |
576 | - err = -ENOMEM; |
577 | - goto out; |
578 | - } |
579 | + /* |
580 | + * The server_path will include the whole chars from userland |
581 | + * including the leading '/'. |
582 | + */ |
583 | + fsopt->server_path = kstrdup(dev_name_end, GFP_KERNEL); |
584 | + if (!fsopt->server_path) { |
585 | + err = -ENOMEM; |
586 | + goto out; |
587 | } |
588 | + |
589 | + canonicalize_path(fsopt->server_path); |
590 | } else { |
591 | dev_name_end = dev_name + strlen(dev_name); |
592 | } |
593 | @@ -725,7 +749,6 @@ static void destroy_caches(void) |
594 | ceph_fscache_unregister(); |
595 | } |
596 | |
597 | - |
598 | /* |
599 | * ceph_umount_begin - initiate forced umount. Tear down down the |
600 | * mount, skipping steps that may hang while waiting for server(s). |
601 | @@ -812,9 +835,6 @@ out: |
602 | return root; |
603 | } |
604 | |
605 | - |
606 | - |
607 | - |
608 | /* |
609 | * mount: join the ceph cluster, and open root directory. |
610 | */ |
611 | @@ -828,18 +848,14 @@ static struct dentry *ceph_real_mount(struct ceph_fs_client *fsc) |
612 | mutex_lock(&fsc->client->mount_mutex); |
613 | |
614 | if (!fsc->sb->s_root) { |
615 | - const char *path; |
616 | + const char *path = fsc->mount_options->server_path ? |
617 | + fsc->mount_options->server_path + 1 : ""; |
618 | + |
619 | err = __ceph_open_session(fsc->client, started); |
620 | if (err < 0) |
621 | goto out; |
622 | |
623 | - if (!fsc->mount_options->server_path) { |
624 | - path = ""; |
625 | - dout("mount opening path \\t\n"); |
626 | - } else { |
627 | - path = fsc->mount_options->server_path + 1; |
628 | - dout("mount opening path %s\n", path); |
629 | - } |
630 | + dout("mount opening path '%s'\n", path); |
631 | |
632 | err = ceph_fs_debugfs_init(fsc); |
633 | if (err < 0) |
634 | diff --git a/fs/ceph/super.h b/fs/ceph/super.h |
635 | index 9bd0d928057b..9f18635f78c7 100644 |
636 | --- a/fs/ceph/super.h |
637 | +++ b/fs/ceph/super.h |
638 | @@ -70,7 +70,7 @@ struct ceph_mount_options { |
639 | |
640 | char *snapdir_name; /* default ".snap" */ |
641 | char *mds_namespace; /* default NULL */ |
642 | - char *server_path; /* default "/" */ |
643 | + char *server_path; /* default NULL (means "/") */ |
644 | }; |
645 | |
646 | struct ceph_fs_client { |
647 | diff --git a/include/uapi/linux/coresight-stm.h b/include/uapi/linux/coresight-stm.h |
648 | index 7e4272cf1fb2..741309cedd2c 100644 |
649 | --- a/include/uapi/linux/coresight-stm.h |
650 | +++ b/include/uapi/linux/coresight-stm.h |
651 | @@ -1,8 +1,10 @@ |
652 | #ifndef __UAPI_CORESIGHT_STM_H_ |
653 | #define __UAPI_CORESIGHT_STM_H_ |
654 | |
655 | -#define STM_FLAG_TIMESTAMPED BIT(3) |
656 | -#define STM_FLAG_GUARANTEED BIT(7) |
657 | +#include <linux/const.h> |
658 | + |
659 | +#define STM_FLAG_TIMESTAMPED _BITUL(3) |
660 | +#define STM_FLAG_GUARANTEED _BITUL(7) |
661 | |
662 | /* |
663 | * The CoreSight STM supports guaranteed and invariant timing |
664 | diff --git a/kernel/padata.c b/kernel/padata.c |
665 | index 286c5142a0f7..6939111b3cbe 100644 |
666 | --- a/kernel/padata.c |
667 | +++ b/kernel/padata.c |
668 | @@ -614,8 +614,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, |
669 | struct cpumask *serial_mask, *parallel_mask; |
670 | int err = -EINVAL; |
671 | |
672 | - mutex_lock(&pinst->lock); |
673 | get_online_cpus(); |
674 | + mutex_lock(&pinst->lock); |
675 | |
676 | switch (cpumask_type) { |
677 | case PADATA_CPU_PARALLEL: |
678 | @@ -633,8 +633,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, |
679 | err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); |
680 | |
681 | out: |
682 | - put_online_cpus(); |
683 | mutex_unlock(&pinst->lock); |
684 | + put_online_cpus(); |
685 | |
686 | return err; |
687 | } |
688 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
689 | index da7a932922cb..a2be65bf5d8c 100644 |
690 | --- a/mm/mempolicy.c |
691 | +++ b/mm/mempolicy.c |
692 | @@ -2768,7 +2768,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) |
693 | switch (mode) { |
694 | case MPOL_PREFERRED: |
695 | /* |
696 | - * Insist on a nodelist of one node only |
697 | + * Insist on a nodelist of one node only, although later |
698 | + * we use first_node(nodes) to grab a single node, so here |
699 | + * nodelist (or nodes) cannot be empty. |
700 | */ |
701 | if (nodelist) { |
702 | char *rest = nodelist; |
703 | @@ -2776,6 +2778,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) |
704 | rest++; |
705 | if (*rest) |
706 | goto out; |
707 | + if (nodes_empty(nodes)) |
708 | + goto out; |
709 | } |
710 | break; |
711 | case MPOL_INTERLEAVE: |
712 | diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c |
713 | index 2f2cb5e27cdd..a8c63ef75f73 100644 |
714 | --- a/net/bluetooth/rfcomm/tty.c |
715 | +++ b/net/bluetooth/rfcomm/tty.c |
716 | @@ -413,10 +413,8 @@ static int __rfcomm_create_dev(struct sock *sk, void __user *arg) |
717 | dlc = rfcomm_dlc_exists(&req.src, &req.dst, req.channel); |
718 | if (IS_ERR(dlc)) |
719 | return PTR_ERR(dlc); |
720 | - else if (dlc) { |
721 | - rfcomm_dlc_put(dlc); |
722 | + if (dlc) |
723 | return -EBUSY; |
724 | - } |
725 | dlc = rfcomm_dlc_alloc(GFP_KERNEL); |
726 | if (!dlc) |
727 | return -ENOMEM; |
728 | diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c |
729 | index 76d55a80f3b9..98074338cd83 100644 |
730 | --- a/net/dsa/tag_brcm.c |
731 | +++ b/net/dsa/tag_brcm.c |
732 | @@ -84,8 +84,6 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev |
733 | brcm_tag[2] = BRCM_IG_DSTMAP2_MASK; |
734 | brcm_tag[3] = (1 << p->port) & BRCM_IG_DSTMAP1_MASK; |
735 | |
736 | - skb->offload_fwd_mark = 1; |
737 | - |
738 | return skb; |
739 | |
740 | out_free: |
741 | @@ -148,6 +146,8 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev, |
742 | skb->dev->stats.rx_packets++; |
743 | skb->dev->stats.rx_bytes += skb->len; |
744 | |
745 | + skb->offload_fwd_mark = 1; |
746 | + |
747 | netif_receive_skb(skb); |
748 | |
749 | return 0; |
750 | diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c |
751 | index 36f0a8c581d0..a1a7ed6fc8dd 100644 |
752 | --- a/net/ipv4/fib_trie.c |
753 | +++ b/net/ipv4/fib_trie.c |
754 | @@ -2256,6 +2256,7 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v) |
755 | " %Zd bytes, size of tnode: %Zd bytes.\n", |
756 | LEAF_SIZE, TNODE_SIZE(0)); |
757 | |
758 | + rcu_read_lock(); |
759 | for (h = 0; h < FIB_TABLE_HASHSZ; h++) { |
760 | struct hlist_head *head = &net->ipv4.fib_table_hash[h]; |
761 | struct fib_table *tb; |
762 | @@ -2275,7 +2276,9 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v) |
763 | trie_show_usage(seq, t->stats); |
764 | #endif |
765 | } |
766 | + cond_resched_rcu(); |
767 | } |
768 | + rcu_read_unlock(); |
769 | |
770 | return 0; |
771 | } |
772 | diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c |
773 | index 65c47b1f0da4..dd5db4cc7d06 100644 |
774 | --- a/net/ipv4/ip_tunnel.c |
775 | +++ b/net/ipv4/ip_tunnel.c |
776 | @@ -155,11 +155,8 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, |
777 | cand = t; |
778 | } |
779 | |
780 | - if (flags & TUNNEL_NO_KEY) |
781 | - goto skip_key_lookup; |
782 | - |
783 | hlist_for_each_entry_rcu(t, head, hash_node) { |
784 | - if (t->parms.i_key != key || |
785 | + if ((!(flags & TUNNEL_NO_KEY) && t->parms.i_key != key) || |
786 | t->parms.iph.saddr != 0 || |
787 | t->parms.iph.daddr != 0 || |
788 | !(t->dev->flags & IFF_UP)) |
789 | @@ -171,7 +168,6 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, |
790 | cand = t; |
791 | } |
792 | |
793 | -skip_key_lookup: |
794 | if (cand) |
795 | return cand; |
796 | |
797 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
798 | index 394a1ddb0782..7c3da29fad8e 100644 |
799 | --- a/net/l2tp/l2tp_core.c |
800 | +++ b/net/l2tp/l2tp_core.c |
801 | @@ -1351,6 +1351,9 @@ again: |
802 | |
803 | hlist_del_init(&session->hlist); |
804 | |
805 | + if (test_and_set_bit(0, &session->dead)) |
806 | + goto again; |
807 | + |
808 | if (session->ref != NULL) |
809 | (*session->ref)(session); |
810 | |
811 | @@ -1799,6 +1802,9 @@ EXPORT_SYMBOL_GPL(__l2tp_session_unhash); |
812 | */ |
813 | int l2tp_session_delete(struct l2tp_session *session) |
814 | { |
815 | + if (test_and_set_bit(0, &session->dead)) |
816 | + return 0; |
817 | + |
818 | if (session->ref) |
819 | (*session->ref)(session); |
820 | __l2tp_session_unhash(session); |
821 | diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h |
822 | index 7cc49715606e..7c2037184b6c 100644 |
823 | --- a/net/l2tp/l2tp_core.h |
824 | +++ b/net/l2tp/l2tp_core.h |
825 | @@ -84,6 +84,7 @@ struct l2tp_session_cfg { |
826 | struct l2tp_session { |
827 | int magic; /* should be |
828 | * L2TP_SESSION_MAGIC */ |
829 | + long dead; |
830 | |
831 | struct l2tp_tunnel *tunnel; /* back pointer to tunnel |
832 | * context */ |
833 | diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c |
834 | index 16b63e60396f..d919b3e6b548 100644 |
835 | --- a/net/l2tp/l2tp_ppp.c |
836 | +++ b/net/l2tp/l2tp_ppp.c |
837 | @@ -437,11 +437,11 @@ static void pppol2tp_session_close(struct l2tp_session *session) |
838 | |
839 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); |
840 | |
841 | - if (sock) { |
842 | + if (sock) |
843 | inet_shutdown(sock, SEND_SHUTDOWN); |
844 | - /* Don't let the session go away before our socket does */ |
845 | - l2tp_session_inc_refcount(session); |
846 | - } |
847 | + |
848 | + /* Don't let the session go away before our socket does */ |
849 | + l2tp_session_inc_refcount(session); |
850 | } |
851 | |
852 | /* Really kill the session socket. (Called from sock_put() if |
853 | diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c |
854 | index 824ebbffea33..34ab7f92f064 100644 |
855 | --- a/net/sctp/ipv6.c |
856 | +++ b/net/sctp/ipv6.c |
857 | @@ -235,7 +235,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
858 | { |
859 | struct sctp_association *asoc = t->asoc; |
860 | struct dst_entry *dst = NULL; |
861 | - struct flowi6 *fl6 = &fl->u.ip6; |
862 | + struct flowi _fl; |
863 | + struct flowi6 *fl6 = &_fl.u.ip6; |
864 | struct sctp_bind_addr *bp; |
865 | struct ipv6_pinfo *np = inet6_sk(sk); |
866 | struct sctp_sockaddr_entry *laddr; |
867 | @@ -245,7 +246,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
868 | __u8 matchlen = 0; |
869 | sctp_scope_t scope; |
870 | |
871 | - memset(fl6, 0, sizeof(struct flowi6)); |
872 | + memset(&_fl, 0, sizeof(_fl)); |
873 | fl6->daddr = daddr->v6.sin6_addr; |
874 | fl6->fl6_dport = daddr->v6.sin6_port; |
875 | fl6->flowi6_proto = IPPROTO_SCTP; |
876 | @@ -269,8 +270,11 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
877 | rcu_read_unlock(); |
878 | |
879 | dst = ip6_dst_lookup_flow(sk, fl6, final_p); |
880 | - if (!asoc || saddr) |
881 | + if (!asoc || saddr) { |
882 | + t->dst = dst; |
883 | + memcpy(fl, &_fl, sizeof(_fl)); |
884 | goto out; |
885 | + } |
886 | |
887 | bp = &asoc->base.bind_addr; |
888 | scope = sctp_scope(daddr); |
889 | @@ -293,6 +297,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
890 | if ((laddr->a.sa.sa_family == AF_INET6) && |
891 | (sctp_v6_cmp_addr(&dst_saddr, &laddr->a))) { |
892 | rcu_read_unlock(); |
893 | + t->dst = dst; |
894 | + memcpy(fl, &_fl, sizeof(_fl)); |
895 | goto out; |
896 | } |
897 | } |
898 | @@ -331,6 +337,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
899 | if (!IS_ERR_OR_NULL(dst)) |
900 | dst_release(dst); |
901 | dst = bdst; |
902 | + t->dst = dst; |
903 | + memcpy(fl, &_fl, sizeof(_fl)); |
904 | break; |
905 | } |
906 | |
907 | @@ -344,6 +352,8 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
908 | dst_release(dst); |
909 | dst = bdst; |
910 | matchlen = bmatchlen; |
911 | + t->dst = dst; |
912 | + memcpy(fl, &_fl, sizeof(_fl)); |
913 | } |
914 | rcu_read_unlock(); |
915 | |
916 | @@ -352,14 +362,12 @@ out: |
917 | struct rt6_info *rt; |
918 | |
919 | rt = (struct rt6_info *)dst; |
920 | - t->dst = dst; |
921 | t->dst_cookie = rt6_get_cookie(rt); |
922 | pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n", |
923 | &rt->rt6i_dst.addr, rt->rt6i_dst.plen, |
924 | - &fl6->saddr); |
925 | + &fl->u.ip6.saddr); |
926 | } else { |
927 | t->dst = NULL; |
928 | - |
929 | pr_debug("no route\n"); |
930 | } |
931 | } |
932 | diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c |
933 | index 446503d3b80c..c5a2a538279b 100644 |
934 | --- a/net/sctp/protocol.c |
935 | +++ b/net/sctp/protocol.c |
936 | @@ -430,14 +430,15 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
937 | { |
938 | struct sctp_association *asoc = t->asoc; |
939 | struct rtable *rt; |
940 | - struct flowi4 *fl4 = &fl->u.ip4; |
941 | + struct flowi _fl; |
942 | + struct flowi4 *fl4 = &_fl.u.ip4; |
943 | struct sctp_bind_addr *bp; |
944 | struct sctp_sockaddr_entry *laddr; |
945 | struct dst_entry *dst = NULL; |
946 | union sctp_addr *daddr = &t->ipaddr; |
947 | union sctp_addr dst_saddr; |
948 | |
949 | - memset(fl4, 0x0, sizeof(struct flowi4)); |
950 | + memset(&_fl, 0x0, sizeof(_fl)); |
951 | fl4->daddr = daddr->v4.sin_addr.s_addr; |
952 | fl4->fl4_dport = daddr->v4.sin_port; |
953 | fl4->flowi4_proto = IPPROTO_SCTP; |
954 | @@ -455,8 +456,11 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
955 | &fl4->saddr); |
956 | |
957 | rt = ip_route_output_key(sock_net(sk), fl4); |
958 | - if (!IS_ERR(rt)) |
959 | + if (!IS_ERR(rt)) { |
960 | dst = &rt->dst; |
961 | + t->dst = dst; |
962 | + memcpy(fl, &_fl, sizeof(_fl)); |
963 | + } |
964 | |
965 | /* If there is no association or if a source address is passed, no |
966 | * more validation is required. |
967 | @@ -519,27 +523,33 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, |
968 | odev = __ip_dev_find(sock_net(sk), laddr->a.v4.sin_addr.s_addr, |
969 | false); |
970 | if (!odev || odev->ifindex != fl4->flowi4_oif) { |
971 | - if (!dst) |
972 | + if (!dst) { |
973 | dst = &rt->dst; |
974 | - else |
975 | + t->dst = dst; |
976 | + memcpy(fl, &_fl, sizeof(_fl)); |
977 | + } else { |
978 | dst_release(&rt->dst); |
979 | + } |
980 | continue; |
981 | } |
982 | |
983 | dst_release(dst); |
984 | dst = &rt->dst; |
985 | + t->dst = dst; |
986 | + memcpy(fl, &_fl, sizeof(_fl)); |
987 | break; |
988 | } |
989 | |
990 | out_unlock: |
991 | rcu_read_unlock(); |
992 | out: |
993 | - t->dst = dst; |
994 | - if (dst) |
995 | + if (dst) { |
996 | pr_debug("rt_dst:%pI4, rt_src:%pI4\n", |
997 | - &fl4->daddr, &fl4->saddr); |
998 | - else |
999 | + &fl->u.ip4.daddr, &fl->u.ip4.saddr); |
1000 | + } else { |
1001 | + t->dst = NULL; |
1002 | pr_debug("no route\n"); |
1003 | + } |
1004 | } |
1005 | |
1006 | /* For v4, the source address is cached in the route entry(dst). So no need |
1007 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
1008 | index 21ec92011585..95f39dde1e08 100644 |
1009 | --- a/net/sctp/socket.c |
1010 | +++ b/net/sctp/socket.c |
1011 | @@ -173,29 +173,44 @@ static void sctp_clear_owner_w(struct sctp_chunk *chunk) |
1012 | skb_orphan(chunk->skb); |
1013 | } |
1014 | |
1015 | +#define traverse_and_process() \ |
1016 | +do { \ |
1017 | + msg = chunk->msg; \ |
1018 | + if (msg == prev_msg) \ |
1019 | + continue; \ |
1020 | + list_for_each_entry(c, &msg->chunks, frag_list) { \ |
1021 | + if ((clear && asoc->base.sk == c->skb->sk) || \ |
1022 | + (!clear && asoc->base.sk != c->skb->sk)) \ |
1023 | + cb(c); \ |
1024 | + } \ |
1025 | + prev_msg = msg; \ |
1026 | +} while (0) |
1027 | + |
1028 | static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, |
1029 | + bool clear, |
1030 | void (*cb)(struct sctp_chunk *)) |
1031 | |
1032 | { |
1033 | + struct sctp_datamsg *msg, *prev_msg = NULL; |
1034 | struct sctp_outq *q = &asoc->outqueue; |
1035 | + struct sctp_chunk *chunk, *c; |
1036 | struct sctp_transport *t; |
1037 | - struct sctp_chunk *chunk; |
1038 | |
1039 | list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) |
1040 | list_for_each_entry(chunk, &t->transmitted, transmitted_list) |
1041 | - cb(chunk); |
1042 | + traverse_and_process(); |
1043 | |
1044 | list_for_each_entry(chunk, &q->retransmit, transmitted_list) |
1045 | - cb(chunk); |
1046 | + traverse_and_process(); |
1047 | |
1048 | list_for_each_entry(chunk, &q->sacked, transmitted_list) |
1049 | - cb(chunk); |
1050 | + traverse_and_process(); |
1051 | |
1052 | list_for_each_entry(chunk, &q->abandoned, transmitted_list) |
1053 | - cb(chunk); |
1054 | + traverse_and_process(); |
1055 | |
1056 | list_for_each_entry(chunk, &q->out_chunk_list, list) |
1057 | - cb(chunk); |
1058 | + traverse_and_process(); |
1059 | } |
1060 | |
1061 | /* Verify that this is a valid address. */ |
1062 | @@ -7878,9 +7893,9 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, |
1063 | * paths won't try to lock it and then oldsk. |
1064 | */ |
1065 | lock_sock_nested(newsk, SINGLE_DEPTH_NESTING); |
1066 | - sctp_for_each_tx_datachunk(assoc, sctp_clear_owner_w); |
1067 | + sctp_for_each_tx_datachunk(assoc, true, sctp_clear_owner_w); |
1068 | sctp_assoc_migrate(assoc, newsk); |
1069 | - sctp_for_each_tx_datachunk(assoc, sctp_set_owner_w); |
1070 | + sctp_for_each_tx_datachunk(assoc, false, sctp_set_owner_w); |
1071 | |
1072 | /* If the association on the newsk is already closed before accept() |
1073 | * is called, set RCV_SHUTDOWN flag. |
1074 | diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c |
1075 | index 794a3499e567..0dc1ab48fceb 100644 |
1076 | --- a/sound/soc/jz4740/jz4740-i2s.c |
1077 | +++ b/sound/soc/jz4740/jz4740-i2s.c |
1078 | @@ -92,7 +92,7 @@ |
1079 | #define JZ_AIC_I2S_STATUS_BUSY BIT(2) |
1080 | |
1081 | #define JZ_AIC_CLK_DIV_MASK 0xf |
1082 | -#define I2SDIV_DV_SHIFT 8 |
1083 | +#define I2SDIV_DV_SHIFT 0 |
1084 | #define I2SDIV_DV_MASK (0xf << I2SDIV_DV_SHIFT) |
1085 | #define I2SDIV_IDV_SHIFT 8 |
1086 | #define I2SDIV_IDV_MASK (0xf << I2SDIV_IDV_SHIFT) |
1087 | diff --git a/tools/accounting/getdelays.c b/tools/accounting/getdelays.c |
1088 | index b5ca536e56a8..34df10a43ef0 100644 |
1089 | --- a/tools/accounting/getdelays.c |
1090 | +++ b/tools/accounting/getdelays.c |
1091 | @@ -135,7 +135,7 @@ static int send_cmd(int sd, __u16 nlmsg_type, __u32 nlmsg_pid, |
1092 | msg.g.version = 0x1; |
1093 | na = (struct nlattr *) GENLMSG_DATA(&msg); |
1094 | na->nla_type = nla_type; |
1095 | - na->nla_len = nla_len + 1 + NLA_HDRLEN; |
1096 | + na->nla_len = nla_len + NLA_HDRLEN; |
1097 | memcpy(NLA_DATA(na), nla_data, nla_len); |
1098 | msg.n.nlmsg_len += NLMSG_ALIGN(na->nla_len); |
1099 |