Contents of /trunk/kernel-alx-legacy/patches-4.9/0106-4.9.7-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: 71811 byte(s)
Fri Aug 14 07:34:29 2020 UTC (4 years, 1 month ago) by niro
File size: 71811 byte(s)
-added kerenl-alx-legacy pkg
1 | diff --git a/Makefile b/Makefile |
2 | index ef95231d1625..da704d903321 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 6 |
9 | +SUBLEVEL = 7 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h |
14 | index a36e8601114d..d5da2115d78a 100644 |
15 | --- a/arch/arc/include/asm/delay.h |
16 | +++ b/arch/arc/include/asm/delay.h |
17 | @@ -26,7 +26,9 @@ static inline void __delay(unsigned long loops) |
18 | " lp 1f \n" |
19 | " nop \n" |
20 | "1: \n" |
21 | - : : "r"(loops)); |
22 | + : |
23 | + : "r"(loops) |
24 | + : "lp_count"); |
25 | } |
26 | |
27 | extern void __bad_udelay(void); |
28 | diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c |
29 | index abd961f3e763..91ebe382147f 100644 |
30 | --- a/arch/arc/kernel/unaligned.c |
31 | +++ b/arch/arc/kernel/unaligned.c |
32 | @@ -241,8 +241,9 @@ int misaligned_fixup(unsigned long address, struct pt_regs *regs, |
33 | if (state.fault) |
34 | goto fault; |
35 | |
36 | + /* clear any remanants of delay slot */ |
37 | if (delay_mode(regs)) { |
38 | - regs->ret = regs->bta; |
39 | + regs->ret = regs->bta ~1U; |
40 | regs->status32 &= ~STATUS_DE_MASK; |
41 | } else { |
42 | regs->ret += state.instr_len; |
43 | diff --git a/arch/parisc/include/asm/bitops.h b/arch/parisc/include/asm/bitops.h |
44 | index 3f9406d9b9d6..da87943328a5 100644 |
45 | --- a/arch/parisc/include/asm/bitops.h |
46 | +++ b/arch/parisc/include/asm/bitops.h |
47 | @@ -6,7 +6,7 @@ |
48 | #endif |
49 | |
50 | #include <linux/compiler.h> |
51 | -#include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */ |
52 | +#include <asm/types.h> |
53 | #include <asm/byteorder.h> |
54 | #include <asm/barrier.h> |
55 | #include <linux/atomic.h> |
56 | @@ -17,6 +17,12 @@ |
57 | * to include/asm-i386/bitops.h or kerneldoc |
58 | */ |
59 | |
60 | +#if __BITS_PER_LONG == 64 |
61 | +#define SHIFT_PER_LONG 6 |
62 | +#else |
63 | +#define SHIFT_PER_LONG 5 |
64 | +#endif |
65 | + |
66 | #define CHOP_SHIFTCOUNT(x) (((unsigned long) (x)) & (BITS_PER_LONG - 1)) |
67 | |
68 | |
69 | diff --git a/arch/parisc/include/uapi/asm/bitsperlong.h b/arch/parisc/include/uapi/asm/bitsperlong.h |
70 | index e0a23c7bdd43..07fa7e50bdc0 100644 |
71 | --- a/arch/parisc/include/uapi/asm/bitsperlong.h |
72 | +++ b/arch/parisc/include/uapi/asm/bitsperlong.h |
73 | @@ -3,10 +3,8 @@ |
74 | |
75 | #if defined(__LP64__) |
76 | #define __BITS_PER_LONG 64 |
77 | -#define SHIFT_PER_LONG 6 |
78 | #else |
79 | #define __BITS_PER_LONG 32 |
80 | -#define SHIFT_PER_LONG 5 |
81 | #endif |
82 | |
83 | #include <asm-generic/bitsperlong.h> |
84 | diff --git a/arch/parisc/include/uapi/asm/swab.h b/arch/parisc/include/uapi/asm/swab.h |
85 | index e78403b129ef..928e1bbac98f 100644 |
86 | --- a/arch/parisc/include/uapi/asm/swab.h |
87 | +++ b/arch/parisc/include/uapi/asm/swab.h |
88 | @@ -1,6 +1,7 @@ |
89 | #ifndef _PARISC_SWAB_H |
90 | #define _PARISC_SWAB_H |
91 | |
92 | +#include <asm/bitsperlong.h> |
93 | #include <linux/types.h> |
94 | #include <linux/compiler.h> |
95 | |
96 | @@ -38,7 +39,7 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x) |
97 | } |
98 | #define __arch_swab32 __arch_swab32 |
99 | |
100 | -#if BITS_PER_LONG > 32 |
101 | +#if __BITS_PER_LONG > 32 |
102 | /* |
103 | ** From "PA-RISC 2.0 Architecture", HP Professional Books. |
104 | ** See Appendix I page 8 , "Endian Byte Swapping". |
105 | @@ -61,6 +62,6 @@ static inline __attribute_const__ __u64 __arch_swab64(__u64 x) |
106 | return x; |
107 | } |
108 | #define __arch_swab64 __arch_swab64 |
109 | -#endif /* BITS_PER_LONG > 32 */ |
110 | +#endif /* __BITS_PER_LONG > 32 */ |
111 | |
112 | #endif /* _PARISC_SWAB_H */ |
113 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c |
114 | index 9336e824e2db..fc2974b929c3 100644 |
115 | --- a/arch/s390/kernel/ptrace.c |
116 | +++ b/arch/s390/kernel/ptrace.c |
117 | @@ -963,6 +963,11 @@ static int s390_fpregs_set(struct task_struct *target, |
118 | if (target == current) |
119 | save_fpu_regs(); |
120 | |
121 | + if (MACHINE_HAS_VX) |
122 | + convert_vx_to_fp(fprs, target->thread.fpu.vxrs); |
123 | + else |
124 | + memcpy(&fprs, target->thread.fpu.fprs, sizeof(fprs)); |
125 | + |
126 | /* If setting FPC, must validate it first. */ |
127 | if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) { |
128 | u32 ufpc[2] = { target->thread.fpu.fpc, 0 }; |
129 | @@ -1067,6 +1072,9 @@ static int s390_vxrs_low_set(struct task_struct *target, |
130 | if (target == current) |
131 | save_fpu_regs(); |
132 | |
133 | + for (i = 0; i < __NUM_VXRS_LOW; i++) |
134 | + vxrs[i] = *((__u64 *)(target->thread.fpu.vxrs + i) + 1); |
135 | + |
136 | rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1); |
137 | if (rc == 0) |
138 | for (i = 0; i < __NUM_VXRS_LOW; i++) |
139 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c |
140 | index 7a1897c51c54..d56ef26d4681 100644 |
141 | --- a/arch/s390/mm/pgtable.c |
142 | +++ b/arch/s390/mm/pgtable.c |
143 | @@ -202,7 +202,7 @@ static inline pgste_t ptep_xchg_start(struct mm_struct *mm, |
144 | return pgste; |
145 | } |
146 | |
147 | -static inline void ptep_xchg_commit(struct mm_struct *mm, |
148 | +static inline pte_t ptep_xchg_commit(struct mm_struct *mm, |
149 | unsigned long addr, pte_t *ptep, |
150 | pgste_t pgste, pte_t old, pte_t new) |
151 | { |
152 | @@ -220,6 +220,7 @@ static inline void ptep_xchg_commit(struct mm_struct *mm, |
153 | } else { |
154 | *ptep = new; |
155 | } |
156 | + return old; |
157 | } |
158 | |
159 | pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr, |
160 | @@ -231,7 +232,7 @@ pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr, |
161 | preempt_disable(); |
162 | pgste = ptep_xchg_start(mm, addr, ptep); |
163 | old = ptep_flush_direct(mm, addr, ptep); |
164 | - ptep_xchg_commit(mm, addr, ptep, pgste, old, new); |
165 | + old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new); |
166 | preempt_enable(); |
167 | return old; |
168 | } |
169 | @@ -246,7 +247,7 @@ pte_t ptep_xchg_lazy(struct mm_struct *mm, unsigned long addr, |
170 | preempt_disable(); |
171 | pgste = ptep_xchg_start(mm, addr, ptep); |
172 | old = ptep_flush_lazy(mm, addr, ptep); |
173 | - ptep_xchg_commit(mm, addr, ptep, pgste, old, new); |
174 | + old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new); |
175 | preempt_enable(); |
176 | return old; |
177 | } |
178 | diff --git a/arch/tile/kernel/ptrace.c b/arch/tile/kernel/ptrace.c |
179 | index d89b7011667c..e279572824b1 100644 |
180 | --- a/arch/tile/kernel/ptrace.c |
181 | +++ b/arch/tile/kernel/ptrace.c |
182 | @@ -111,7 +111,7 @@ static int tile_gpr_set(struct task_struct *target, |
183 | const void *kbuf, const void __user *ubuf) |
184 | { |
185 | int ret; |
186 | - struct pt_regs regs; |
187 | + struct pt_regs regs = *task_pt_regs(target); |
188 | |
189 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ®s, 0, |
190 | sizeof(regs)); |
191 | diff --git a/arch/x86/platform/mellanox/mlx-platform.c b/arch/x86/platform/mellanox/mlx-platform.c |
192 | index 7dcfcca97399..c0355d789fce 100644 |
193 | --- a/arch/x86/platform/mellanox/mlx-platform.c |
194 | +++ b/arch/x86/platform/mellanox/mlx-platform.c |
195 | @@ -233,7 +233,7 @@ static int __init mlxplat_init(void) |
196 | return 0; |
197 | |
198 | fail_platform_mux_register: |
199 | - for (i--; i > 0 ; i--) |
200 | + while (--i >= 0) |
201 | platform_device_unregister(priv->pdev_mux[i]); |
202 | platform_device_unregister(priv->pdev_i2c); |
203 | fail_alloc: |
204 | diff --git a/drivers/base/memory.c b/drivers/base/memory.c |
205 | index 62c63c0c5c22..e7f86a8887d2 100644 |
206 | --- a/drivers/base/memory.c |
207 | +++ b/drivers/base/memory.c |
208 | @@ -410,14 +410,14 @@ static ssize_t show_valid_zones(struct device *dev, |
209 | sprintf(buf, "%s", zone->name); |
210 | |
211 | /* MMOP_ONLINE_KERNEL */ |
212 | - zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL); |
213 | + zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL, &zone_shift); |
214 | if (zone_shift) { |
215 | strcat(buf, " "); |
216 | strcat(buf, (zone + zone_shift)->name); |
217 | } |
218 | |
219 | /* MMOP_ONLINE_MOVABLE */ |
220 | - zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE); |
221 | + zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE, &zone_shift); |
222 | if (zone_shift) { |
223 | strcat(buf, " "); |
224 | strcat(buf, (zone + zone_shift)->name); |
225 | diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c |
226 | index 338766c64c99..a05bb3891119 100644 |
227 | --- a/drivers/gpu/drm/drm_atomic_helper.c |
228 | +++ b/drivers/gpu/drm/drm_atomic_helper.c |
229 | @@ -3115,6 +3115,8 @@ void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, |
230 | |
231 | if (state->fb) |
232 | drm_framebuffer_reference(state->fb); |
233 | + |
234 | + state->fence = NULL; |
235 | } |
236 | EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state); |
237 | |
238 | diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c |
239 | index 53f07ac7c174..e14366de0e6e 100644 |
240 | --- a/drivers/gpu/drm/drm_modes.c |
241 | +++ b/drivers/gpu/drm/drm_modes.c |
242 | @@ -1462,6 +1462,13 @@ drm_mode_create_from_cmdline_mode(struct drm_device *dev, |
243 | return NULL; |
244 | |
245 | mode->type |= DRM_MODE_TYPE_USERDEF; |
246 | + /* fix up 1368x768: GFT/CVT can't express 1366 width due to alignment */ |
247 | + if (cmd->xres == 1366 && mode->hdisplay == 1368) { |
248 | + mode->hdisplay = 1366; |
249 | + mode->hsync_start--; |
250 | + mode->hsync_end--; |
251 | + drm_mode_set_name(mode); |
252 | + } |
253 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
254 | return mode; |
255 | } |
256 | diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c |
257 | index f6b64d7d3528..276474d13763 100644 |
258 | --- a/drivers/gpu/drm/drm_probe_helper.c |
259 | +++ b/drivers/gpu/drm/drm_probe_helper.c |
260 | @@ -143,8 +143,18 @@ void drm_kms_helper_poll_enable_locked(struct drm_device *dev) |
261 | } |
262 | |
263 | if (dev->mode_config.delayed_event) { |
264 | + /* |
265 | + * FIXME: |
266 | + * |
267 | + * Use short (1s) delay to handle the initial delayed event. |
268 | + * This delay should not be needed, but Optimus/nouveau will |
269 | + * fail in a mysterious way if the delayed event is handled as |
270 | + * soon as possible like it is done in |
271 | + * drm_helper_probe_single_connector_modes() in case the poll |
272 | + * was enabled before. |
273 | + */ |
274 | poll = true; |
275 | - delay = 0; |
276 | + delay = HZ; |
277 | } |
278 | |
279 | if (poll) |
280 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
281 | index 18dfdd5c1b3b..670beebc32f6 100644 |
282 | --- a/drivers/gpu/drm/i915/i915_drv.c |
283 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
284 | @@ -2372,7 +2372,7 @@ static int intel_runtime_suspend(struct device *kdev) |
285 | |
286 | assert_forcewakes_inactive(dev_priv); |
287 | |
288 | - if (!IS_VALLEYVIEW(dev_priv) || !IS_CHERRYVIEW(dev_priv)) |
289 | + if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) |
290 | intel_hpd_poll_init(dev_priv); |
291 | |
292 | DRM_DEBUG_KMS("Device suspended\n"); |
293 | diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c |
294 | index 5b6f81c1dbca..7467355e4a18 100644 |
295 | --- a/drivers/gpu/drm/i915/i915_gem_evict.c |
296 | +++ b/drivers/gpu/drm/i915/i915_gem_evict.c |
297 | @@ -194,6 +194,7 @@ i915_gem_evict_something(struct i915_address_space *vm, |
298 | } |
299 | |
300 | /* Unbinding will emit any required flushes */ |
301 | + ret = 0; |
302 | while (!list_empty(&eviction_list)) { |
303 | vma = list_first_entry(&eviction_list, |
304 | struct i915_vma, |
305 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c |
306 | index dfbcf16b41df..4149a0fbe8bd 100644 |
307 | --- a/drivers/gpu/drm/i915/intel_crt.c |
308 | +++ b/drivers/gpu/drm/i915/intel_crt.c |
309 | @@ -499,6 +499,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) |
310 | struct drm_i915_private *dev_priv = to_i915(crt->base.base.dev); |
311 | struct edid *edid; |
312 | struct i2c_adapter *i2c; |
313 | + bool ret = false; |
314 | |
315 | BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG); |
316 | |
317 | @@ -515,17 +516,17 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) |
318 | */ |
319 | if (!is_digital) { |
320 | DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n"); |
321 | - return true; |
322 | + ret = true; |
323 | + } else { |
324 | + DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n"); |
325 | } |
326 | - |
327 | - DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n"); |
328 | } else { |
329 | DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [no valid EDID found]\n"); |
330 | } |
331 | |
332 | kfree(edid); |
333 | |
334 | - return false; |
335 | + return ret; |
336 | } |
337 | |
338 | static enum drm_connector_status |
339 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
340 | index 869b29fe9ec4..8079e5b380cb 100644 |
341 | --- a/drivers/gpu/drm/i915/intel_display.c |
342 | +++ b/drivers/gpu/drm/i915/intel_display.c |
343 | @@ -2587,8 +2587,9 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv, |
344 | * We only keep the x/y offsets, so push all of the |
345 | * gtt offset into the x/y offsets. |
346 | */ |
347 | - _intel_adjust_tile_offset(&x, &y, tile_size, |
348 | - tile_width, tile_height, pitch_tiles, |
349 | + _intel_adjust_tile_offset(&x, &y, |
350 | + tile_width, tile_height, |
351 | + tile_size, pitch_tiles, |
352 | gtt_offset_rotated * tile_size, 0); |
353 | |
354 | gtt_offset_rotated += rot_info->plane[i].width * rot_info->plane[i].height; |
355 | @@ -2975,6 +2976,9 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state) |
356 | unsigned int rotation = plane_state->base.rotation; |
357 | int ret; |
358 | |
359 | + if (!plane_state->base.visible) |
360 | + return 0; |
361 | + |
362 | /* Rotate src coordinates to match rotated GTT view */ |
363 | if (intel_rotation_90_or_270(rotation)) |
364 | drm_rect_rotate(&plane_state->base.src, |
365 | @@ -6865,6 +6869,12 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc) |
366 | } |
367 | |
368 | state = drm_atomic_state_alloc(crtc->dev); |
369 | + if (!state) { |
370 | + DRM_DEBUG_KMS("failed to disable [CRTC:%d:%s], out of memory", |
371 | + crtc->base.id, crtc->name); |
372 | + return; |
373 | + } |
374 | + |
375 | state->acquire_ctx = crtc->dev->mode_config.acquire_ctx; |
376 | |
377 | /* Everything's already locked, -EDEADLK can't happen. */ |
378 | diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c |
379 | index b7098f98bb67..9127e57f383c 100644 |
380 | --- a/drivers/gpu/drm/i915/intel_fbdev.c |
381 | +++ b/drivers/gpu/drm/i915/intel_fbdev.c |
382 | @@ -745,6 +745,9 @@ void intel_fbdev_initial_config_async(struct drm_device *dev) |
383 | { |
384 | struct intel_fbdev *ifbdev = to_i915(dev)->fbdev; |
385 | |
386 | + if (!ifbdev) |
387 | + return; |
388 | + |
389 | ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev); |
390 | } |
391 | |
392 | diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c |
393 | index 0adb879833ff..67db1577ee49 100644 |
394 | --- a/drivers/gpu/drm/i915/intel_lrc.c |
395 | +++ b/drivers/gpu/drm/i915/intel_lrc.c |
396 | @@ -858,8 +858,7 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, |
397 | * this batch updates GEN8_L3SQCREG4 with default value we need to |
398 | * set this bit here to retain the WA during flush. |
399 | */ |
400 | - if (IS_SKL_REVID(dev_priv, 0, SKL_REVID_E0) || |
401 | - IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0)) |
402 | + if (IS_SKL_REVID(dev_priv, 0, SKL_REVID_E0)) |
403 | l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; |
404 | |
405 | wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | |
406 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
407 | index ed9955dce156..8babfe0ce4e3 100644 |
408 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
409 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
410 | @@ -1153,14 +1153,6 @@ static int kbl_init_workarounds(struct intel_engine_cs *engine) |
411 | WA_SET_BIT_MASKED(HDC_CHICKEN0, |
412 | HDC_FENCE_DEST_SLM_DISABLE); |
413 | |
414 | - /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes |
415 | - * involving this register should also be added to WA batch as required. |
416 | - */ |
417 | - if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0)) |
418 | - /* WaDisableLSQCROPERFforOCL:kbl */ |
419 | - I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | |
420 | - GEN8_LQSC_RO_PERF_DIS); |
421 | - |
422 | /* WaToEnableHwFixForPushConstHWBug:kbl */ |
423 | if (IS_KBL_REVID(dev_priv, KBL_REVID_C0, REVID_FOREVER)) |
424 | WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, |
425 | diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c |
426 | index 00ea0002b539..e0c143b865f3 100644 |
427 | --- a/drivers/gpu/drm/radeon/radeon_drv.c |
428 | +++ b/drivers/gpu/drm/radeon/radeon_drv.c |
429 | @@ -366,11 +366,10 @@ static void |
430 | radeon_pci_shutdown(struct pci_dev *pdev) |
431 | { |
432 | /* if we are running in a VM, make sure the device |
433 | - * torn down properly on reboot/shutdown. |
434 | - * unfortunately we can't detect certain |
435 | - * hypervisors so just do this all the time. |
436 | + * torn down properly on reboot/shutdown |
437 | */ |
438 | - radeon_pci_remove(pdev); |
439 | + if (radeon_device_is_virtual()) |
440 | + radeon_pci_remove(pdev); |
441 | } |
442 | |
443 | static int radeon_pmops_suspend(struct device *dev) |
444 | diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c |
445 | index 7f08d681a74b..d544ff9b0d46 100644 |
446 | --- a/drivers/gpu/drm/vc4/vc4_crtc.c |
447 | +++ b/drivers/gpu/drm/vc4/vc4_crtc.c |
448 | @@ -832,7 +832,7 @@ static void vc4_crtc_destroy_state(struct drm_crtc *crtc, |
449 | |
450 | } |
451 | |
452 | - __drm_atomic_helper_crtc_destroy_state(state); |
453 | + drm_atomic_helper_crtc_destroy_state(crtc, state); |
454 | } |
455 | |
456 | static const struct drm_crtc_funcs vc4_crtc_funcs = { |
457 | diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c |
458 | index 303f23c96220..18e37171e9c8 100644 |
459 | --- a/drivers/gpu/drm/vc4/vc4_gem.c |
460 | +++ b/drivers/gpu/drm/vc4/vc4_gem.c |
461 | @@ -594,12 +594,14 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) |
462 | args->shader_rec_count); |
463 | struct vc4_bo *bo; |
464 | |
465 | - if (uniforms_offset < shader_rec_offset || |
466 | + if (shader_rec_offset < args->bin_cl_size || |
467 | + uniforms_offset < shader_rec_offset || |
468 | exec_size < uniforms_offset || |
469 | args->shader_rec_count >= (UINT_MAX / |
470 | sizeof(struct vc4_shader_state)) || |
471 | temp_size < exec_size) { |
472 | DRM_ERROR("overflow in exec arguments\n"); |
473 | + ret = -EINVAL; |
474 | goto fail; |
475 | } |
476 | |
477 | diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c b/drivers/gpu/drm/vc4/vc4_render_cl.c |
478 | index 08886a309757..5cdd003605f5 100644 |
479 | --- a/drivers/gpu/drm/vc4/vc4_render_cl.c |
480 | +++ b/drivers/gpu/drm/vc4/vc4_render_cl.c |
481 | @@ -461,7 +461,7 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec, |
482 | } |
483 | |
484 | ret = vc4_full_res_bounds_check(exec, *obj, surf); |
485 | - if (!ret) |
486 | + if (ret) |
487 | return ret; |
488 | |
489 | return 0; |
490 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
491 | index 2a6fc47a1dfb..c25768c2dd3b 100644 |
492 | --- a/drivers/infiniband/core/cma.c |
493 | +++ b/drivers/infiniband/core/cma.c |
494 | @@ -2768,7 +2768,8 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, |
495 | if (!src_addr || !src_addr->sa_family) { |
496 | src_addr = (struct sockaddr *) &id->route.addr.src_addr; |
497 | src_addr->sa_family = dst_addr->sa_family; |
498 | - if (dst_addr->sa_family == AF_INET6) { |
499 | + if (IS_ENABLED(CONFIG_IPV6) && |
500 | + dst_addr->sa_family == AF_INET6) { |
501 | struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr; |
502 | struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr; |
503 | src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id; |
504 | diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c |
505 | index 84b4eff90395..c22fde6207d1 100644 |
506 | --- a/drivers/infiniband/core/umem.c |
507 | +++ b/drivers/infiniband/core/umem.c |
508 | @@ -134,6 +134,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, |
509 | IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_MW_BIND)); |
510 | |
511 | if (access & IB_ACCESS_ON_DEMAND) { |
512 | + put_pid(umem->pid); |
513 | ret = ib_umem_odp_get(context, umem); |
514 | if (ret) { |
515 | kfree(umem); |
516 | @@ -149,6 +150,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, |
517 | |
518 | page_list = (struct page **) __get_free_page(GFP_KERNEL); |
519 | if (!page_list) { |
520 | + put_pid(umem->pid); |
521 | kfree(umem); |
522 | return ERR_PTR(-ENOMEM); |
523 | } |
524 | diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c |
525 | index b99dc9e0ffb2..b85a1a983e07 100644 |
526 | --- a/drivers/infiniband/hw/cxgb4/device.c |
527 | +++ b/drivers/infiniband/hw/cxgb4/device.c |
528 | @@ -848,9 +848,17 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev) |
529 | } |
530 | } |
531 | |
532 | + rdev->free_workq = create_singlethread_workqueue("iw_cxgb4_free"); |
533 | + if (!rdev->free_workq) { |
534 | + err = -ENOMEM; |
535 | + goto err_free_status_page; |
536 | + } |
537 | + |
538 | rdev->status_page->db_off = 0; |
539 | |
540 | return 0; |
541 | +err_free_status_page: |
542 | + free_page((unsigned long)rdev->status_page); |
543 | destroy_ocqp_pool: |
544 | c4iw_ocqp_pool_destroy(rdev); |
545 | destroy_rqtpool: |
546 | @@ -864,6 +872,7 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev) |
547 | |
548 | static void c4iw_rdev_close(struct c4iw_rdev *rdev) |
549 | { |
550 | + destroy_workqueue(rdev->free_workq); |
551 | kfree(rdev->wr_log); |
552 | free_page((unsigned long)rdev->status_page); |
553 | c4iw_pblpool_destroy(rdev); |
554 | diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h |
555 | index 4788e1a46fde..7d540667dad2 100644 |
556 | --- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h |
557 | +++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h |
558 | @@ -45,6 +45,7 @@ |
559 | #include <linux/kref.h> |
560 | #include <linux/timer.h> |
561 | #include <linux/io.h> |
562 | +#include <linux/workqueue.h> |
563 | |
564 | #include <asm/byteorder.h> |
565 | |
566 | @@ -107,6 +108,7 @@ struct c4iw_dev_ucontext { |
567 | struct list_head qpids; |
568 | struct list_head cqids; |
569 | struct mutex lock; |
570 | + struct kref kref; |
571 | }; |
572 | |
573 | enum c4iw_rdev_flags { |
574 | @@ -183,6 +185,7 @@ struct c4iw_rdev { |
575 | atomic_t wr_log_idx; |
576 | struct wr_log_entry *wr_log; |
577 | int wr_log_size; |
578 | + struct workqueue_struct *free_workq; |
579 | }; |
580 | |
581 | static inline int c4iw_fatal_error(struct c4iw_rdev *rdev) |
582 | @@ -482,6 +485,8 @@ struct c4iw_qp { |
583 | int sq_sig_all; |
584 | struct completion rq_drained; |
585 | struct completion sq_drained; |
586 | + struct work_struct free_work; |
587 | + struct c4iw_ucontext *ucontext; |
588 | }; |
589 | |
590 | static inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp) |
591 | @@ -495,6 +500,7 @@ struct c4iw_ucontext { |
592 | u32 key; |
593 | spinlock_t mmap_lock; |
594 | struct list_head mmaps; |
595 | + struct kref kref; |
596 | }; |
597 | |
598 | static inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c) |
599 | @@ -502,6 +508,18 @@ static inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c) |
600 | return container_of(c, struct c4iw_ucontext, ibucontext); |
601 | } |
602 | |
603 | +void _c4iw_free_ucontext(struct kref *kref); |
604 | + |
605 | +static inline void c4iw_put_ucontext(struct c4iw_ucontext *ucontext) |
606 | +{ |
607 | + kref_put(&ucontext->kref, _c4iw_free_ucontext); |
608 | +} |
609 | + |
610 | +static inline void c4iw_get_ucontext(struct c4iw_ucontext *ucontext) |
611 | +{ |
612 | + kref_get(&ucontext->kref); |
613 | +} |
614 | + |
615 | struct c4iw_mm_entry { |
616 | struct list_head entry; |
617 | u64 addr; |
618 | diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw/cxgb4/provider.c |
619 | index 645e606a17c5..8278ba06f995 100644 |
620 | --- a/drivers/infiniband/hw/cxgb4/provider.c |
621 | +++ b/drivers/infiniband/hw/cxgb4/provider.c |
622 | @@ -91,17 +91,28 @@ static int c4iw_process_mad(struct ib_device *ibdev, int mad_flags, |
623 | return -ENOSYS; |
624 | } |
625 | |
626 | -static int c4iw_dealloc_ucontext(struct ib_ucontext *context) |
627 | +void _c4iw_free_ucontext(struct kref *kref) |
628 | { |
629 | - struct c4iw_dev *rhp = to_c4iw_dev(context->device); |
630 | - struct c4iw_ucontext *ucontext = to_c4iw_ucontext(context); |
631 | + struct c4iw_ucontext *ucontext; |
632 | + struct c4iw_dev *rhp; |
633 | struct c4iw_mm_entry *mm, *tmp; |
634 | |
635 | - PDBG("%s context %p\n", __func__, context); |
636 | + ucontext = container_of(kref, struct c4iw_ucontext, kref); |
637 | + rhp = to_c4iw_dev(ucontext->ibucontext.device); |
638 | + |
639 | + PDBG("%s ucontext %p\n", __func__, ucontext); |
640 | list_for_each_entry_safe(mm, tmp, &ucontext->mmaps, entry) |
641 | kfree(mm); |
642 | c4iw_release_dev_ucontext(&rhp->rdev, &ucontext->uctx); |
643 | kfree(ucontext); |
644 | +} |
645 | + |
646 | +static int c4iw_dealloc_ucontext(struct ib_ucontext *context) |
647 | +{ |
648 | + struct c4iw_ucontext *ucontext = to_c4iw_ucontext(context); |
649 | + |
650 | + PDBG("%s context %p\n", __func__, context); |
651 | + c4iw_put_ucontext(ucontext); |
652 | return 0; |
653 | } |
654 | |
655 | @@ -125,6 +136,7 @@ static struct ib_ucontext *c4iw_alloc_ucontext(struct ib_device *ibdev, |
656 | c4iw_init_dev_ucontext(&rhp->rdev, &context->uctx); |
657 | INIT_LIST_HEAD(&context->mmaps); |
658 | spin_lock_init(&context->mmap_lock); |
659 | + kref_init(&context->kref); |
660 | |
661 | if (udata->outlen < sizeof(uresp) - sizeof(uresp.reserved)) { |
662 | if (!warned++) |
663 | diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c |
664 | index b7ac97b27c88..bb0fde6e2047 100644 |
665 | --- a/drivers/infiniband/hw/cxgb4/qp.c |
666 | +++ b/drivers/infiniband/hw/cxgb4/qp.c |
667 | @@ -714,13 +714,32 @@ static int build_inv_stag(union t4_wr *wqe, struct ib_send_wr *wr, u8 *len16) |
668 | return 0; |
669 | } |
670 | |
671 | -static void _free_qp(struct kref *kref) |
672 | +static void free_qp_work(struct work_struct *work) |
673 | +{ |
674 | + struct c4iw_ucontext *ucontext; |
675 | + struct c4iw_qp *qhp; |
676 | + struct c4iw_dev *rhp; |
677 | + |
678 | + qhp = container_of(work, struct c4iw_qp, free_work); |
679 | + ucontext = qhp->ucontext; |
680 | + rhp = qhp->rhp; |
681 | + |
682 | + PDBG("%s qhp %p ucontext %p\n", __func__, qhp, ucontext); |
683 | + destroy_qp(&rhp->rdev, &qhp->wq, |
684 | + ucontext ? &ucontext->uctx : &rhp->rdev.uctx); |
685 | + |
686 | + if (ucontext) |
687 | + c4iw_put_ucontext(ucontext); |
688 | + kfree(qhp); |
689 | +} |
690 | + |
691 | +static void queue_qp_free(struct kref *kref) |
692 | { |
693 | struct c4iw_qp *qhp; |
694 | |
695 | qhp = container_of(kref, struct c4iw_qp, kref); |
696 | PDBG("%s qhp %p\n", __func__, qhp); |
697 | - kfree(qhp); |
698 | + queue_work(qhp->rhp->rdev.free_workq, &qhp->free_work); |
699 | } |
700 | |
701 | void c4iw_qp_add_ref(struct ib_qp *qp) |
702 | @@ -732,7 +751,7 @@ void c4iw_qp_add_ref(struct ib_qp *qp) |
703 | void c4iw_qp_rem_ref(struct ib_qp *qp) |
704 | { |
705 | PDBG("%s ib_qp %p\n", __func__, qp); |
706 | - kref_put(&to_c4iw_qp(qp)->kref, _free_qp); |
707 | + kref_put(&to_c4iw_qp(qp)->kref, queue_qp_free); |
708 | } |
709 | |
710 | static void add_to_fc_list(struct list_head *head, struct list_head *entry) |
711 | @@ -1642,7 +1661,6 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp) |
712 | struct c4iw_dev *rhp; |
713 | struct c4iw_qp *qhp; |
714 | struct c4iw_qp_attributes attrs; |
715 | - struct c4iw_ucontext *ucontext; |
716 | |
717 | qhp = to_c4iw_qp(ib_qp); |
718 | rhp = qhp->rhp; |
719 | @@ -1662,11 +1680,6 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp) |
720 | spin_unlock_irq(&rhp->lock); |
721 | free_ird(rhp, qhp->attr.max_ird); |
722 | |
723 | - ucontext = ib_qp->uobject ? |
724 | - to_c4iw_ucontext(ib_qp->uobject->context) : NULL; |
725 | - destroy_qp(&rhp->rdev, &qhp->wq, |
726 | - ucontext ? &ucontext->uctx : &rhp->rdev.uctx); |
727 | - |
728 | c4iw_qp_rem_ref(ib_qp); |
729 | |
730 | PDBG("%s ib_qp %p qpid 0x%0x\n", __func__, ib_qp, qhp->wq.sq.qid); |
731 | @@ -1767,6 +1780,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, |
732 | mutex_init(&qhp->mutex); |
733 | init_waitqueue_head(&qhp->wait); |
734 | kref_init(&qhp->kref); |
735 | + INIT_WORK(&qhp->free_work, free_qp_work); |
736 | |
737 | ret = insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.sq.qid); |
738 | if (ret) |
739 | @@ -1853,6 +1867,9 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, |
740 | ma_sync_key_mm->len = PAGE_SIZE; |
741 | insert_mmap(ucontext, ma_sync_key_mm); |
742 | } |
743 | + |
744 | + c4iw_get_ucontext(ucontext); |
745 | + qhp->ucontext = ucontext; |
746 | } |
747 | qhp->ibqp.qp_num = qhp->wq.sq.qid; |
748 | init_timer(&(qhp->timer)); |
749 | diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c |
750 | index ffff5a54cb34..f4f3942ebbd1 100644 |
751 | --- a/drivers/infiniband/sw/rxe/rxe_net.c |
752 | +++ b/drivers/infiniband/sw/rxe/rxe_net.c |
753 | @@ -554,7 +554,7 @@ struct rxe_dev *rxe_net_add(struct net_device *ndev) |
754 | } |
755 | |
756 | spin_lock_bh(&dev_list_lock); |
757 | - list_add_tail(&rxe_dev_list, &rxe->list); |
758 | + list_add_tail(&rxe->list, &rxe_dev_list); |
759 | spin_unlock_bh(&dev_list_lock); |
760 | return rxe; |
761 | } |
762 | diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c |
763 | index 486d576e55bc..44b2108253bd 100644 |
764 | --- a/drivers/infiniband/sw/rxe/rxe_qp.c |
765 | +++ b/drivers/infiniband/sw/rxe/rxe_qp.c |
766 | @@ -813,8 +813,7 @@ void rxe_qp_destroy(struct rxe_qp *qp) |
767 | del_timer_sync(&qp->rnr_nak_timer); |
768 | |
769 | rxe_cleanup_task(&qp->req.task); |
770 | - if (qp_type(qp) == IB_QPT_RC) |
771 | - rxe_cleanup_task(&qp->comp.task); |
772 | + rxe_cleanup_task(&qp->comp.task); |
773 | |
774 | /* flush out any receive wr's or pending requests */ |
775 | __rxe_do_task(&qp->req.task); |
776 | diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c |
777 | index 64b3d11dcf1e..140f3f354cf3 100644 |
778 | --- a/drivers/infiniband/ulp/iser/iscsi_iser.c |
779 | +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c |
780 | @@ -651,13 +651,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep, |
781 | SHOST_DIX_GUARD_CRC); |
782 | } |
783 | |
784 | - /* |
785 | - * Limit the sg_tablesize and max_sectors based on the device |
786 | - * max fastreg page list length. |
787 | - */ |
788 | - shost->sg_tablesize = min_t(unsigned short, shost->sg_tablesize, |
789 | - ib_conn->device->ib_device->attrs.max_fast_reg_page_list_len); |
790 | - |
791 | if (iscsi_host_add(shost, |
792 | ib_conn->device->ib_device->dma_device)) { |
793 | mutex_unlock(&iser_conn->state_mutex); |
794 | diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c |
795 | index d980fb458ad4..e7dcf14a76e2 100644 |
796 | --- a/drivers/infiniband/ulp/srp/ib_srp.c |
797 | +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
798 | @@ -366,6 +366,7 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device, |
799 | struct srp_fr_desc *d; |
800 | struct ib_mr *mr; |
801 | int i, ret = -EINVAL; |
802 | + enum ib_mr_type mr_type; |
803 | |
804 | if (pool_size <= 0) |
805 | goto err; |
806 | @@ -379,9 +380,13 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device, |
807 | spin_lock_init(&pool->lock); |
808 | INIT_LIST_HEAD(&pool->free_list); |
809 | |
810 | + if (device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG) |
811 | + mr_type = IB_MR_TYPE_SG_GAPS; |
812 | + else |
813 | + mr_type = IB_MR_TYPE_MEM_REG; |
814 | + |
815 | for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) { |
816 | - mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, |
817 | - max_page_list_len); |
818 | + mr = ib_alloc_mr(pd, mr_type, max_page_list_len); |
819 | if (IS_ERR(mr)) { |
820 | ret = PTR_ERR(mr); |
821 | goto destroy_pool; |
822 | @@ -3678,6 +3683,12 @@ static int __init srp_init_module(void) |
823 | indirect_sg_entries = cmd_sg_entries; |
824 | } |
825 | |
826 | + if (indirect_sg_entries > SG_MAX_SEGMENTS) { |
827 | + pr_warn("Clamping indirect_sg_entries to %u\n", |
828 | + SG_MAX_SEGMENTS); |
829 | + indirect_sg_entries = SG_MAX_SEGMENTS; |
830 | + } |
831 | + |
832 | srp_remove_wq = create_workqueue("srp_remove"); |
833 | if (!srp_remove_wq) { |
834 | ret = -ENOMEM; |
835 | diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c |
836 | index 1a1d99704fe6..296f1411fe84 100644 |
837 | --- a/drivers/isdn/hardware/eicon/message.c |
838 | +++ b/drivers/isdn/hardware/eicon/message.c |
839 | @@ -11297,7 +11297,8 @@ static void mixer_notify_update(PLCI *plci, byte others) |
840 | ((CAPI_MSG *) msg)->header.ncci = 0; |
841 | ((CAPI_MSG *) msg)->info.facility_req.Selector = SELECTOR_LINE_INTERCONNECT; |
842 | ((CAPI_MSG *) msg)->info.facility_req.structs[0] = 3; |
843 | - PUT_WORD(&(((CAPI_MSG *) msg)->info.facility_req.structs[1]), LI_REQ_SILENT_UPDATE); |
844 | + ((CAPI_MSG *) msg)->info.facility_req.structs[1] = LI_REQ_SILENT_UPDATE & 0xff; |
845 | + ((CAPI_MSG *) msg)->info.facility_req.structs[2] = LI_REQ_SILENT_UPDATE >> 8; |
846 | ((CAPI_MSG *) msg)->info.facility_req.structs[3] = 0; |
847 | w = api_put(notify_plci->appl, (CAPI_MSG *) msg); |
848 | if (w != _QUEUE_FULL) |
849 | diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig |
850 | index 2669b4bad910..5a27bffa02fb 100644 |
851 | --- a/drivers/media/i2c/Kconfig |
852 | +++ b/drivers/media/i2c/Kconfig |
853 | @@ -655,6 +655,7 @@ config VIDEO_S5K6A3 |
854 | config VIDEO_S5K4ECGX |
855 | tristate "Samsung S5K4ECGX sensor support" |
856 | depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API |
857 | + select CRC32 |
858 | ---help--- |
859 | This is a V4L2 sensor-level driver for Samsung S5K4ECGX 5M |
860 | camera sensor with an embedded SoC image signal processor. |
861 | diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c |
862 | index 7268e706e216..59aa4dafb60b 100644 |
863 | --- a/drivers/media/i2c/tvp5150.c |
864 | +++ b/drivers/media/i2c/tvp5150.c |
865 | @@ -288,8 +288,12 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd) |
866 | tvp5150_write(sd, TVP5150_OP_MODE_CTL, opmode); |
867 | tvp5150_write(sd, TVP5150_VD_IN_SRC_SEL_1, input); |
868 | |
869 | - /* Svideo should enable YCrCb output and disable GPCL output |
870 | - * For Composite and TV, it should be the reverse |
871 | + /* |
872 | + * Setup the FID/GLCO/VLK/HVLK and INTREQ/GPCL/VBLK output signals. For |
873 | + * S-Video we output the vertical lock (VLK) signal on FID/GLCO/VLK/HVLK |
874 | + * and set INTREQ/GPCL/VBLK to logic 0. For composite we output the |
875 | + * field indicator (FID) signal on FID/GLCO/VLK/HVLK and set |
876 | + * INTREQ/GPCL/VBLK to logic 1. |
877 | */ |
878 | val = tvp5150_read(sd, TVP5150_MISC_CTL); |
879 | if (val < 0) { |
880 | @@ -298,9 +302,9 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd) |
881 | } |
882 | |
883 | if (decoder->input == TVP5150_SVIDEO) |
884 | - val = (val & ~0x40) | 0x10; |
885 | + val = (val & ~TVP5150_MISC_CTL_GPCL) | TVP5150_MISC_CTL_HVLK; |
886 | else |
887 | - val = (val & ~0x10) | 0x40; |
888 | + val = (val & ~TVP5150_MISC_CTL_HVLK) | TVP5150_MISC_CTL_GPCL; |
889 | tvp5150_write(sd, TVP5150_MISC_CTL, val); |
890 | }; |
891 | |
892 | @@ -452,7 +456,12 @@ static const struct i2c_reg_value tvp5150_init_enable[] = { |
893 | },{ /* Automatic offset and AGC enabled */ |
894 | TVP5150_ANAL_CHL_CTL, 0x15 |
895 | },{ /* Activate YCrCb output 0x9 or 0xd ? */ |
896 | - TVP5150_MISC_CTL, 0x6f |
897 | + TVP5150_MISC_CTL, TVP5150_MISC_CTL_GPCL | |
898 | + TVP5150_MISC_CTL_INTREQ_OE | |
899 | + TVP5150_MISC_CTL_YCBCR_OE | |
900 | + TVP5150_MISC_CTL_SYNC_OE | |
901 | + TVP5150_MISC_CTL_VBLANK | |
902 | + TVP5150_MISC_CTL_CLOCK_OE, |
903 | },{ /* Activates video std autodetection for all standards */ |
904 | TVP5150_AUTOSW_MSK, 0x0 |
905 | },{ /* Default format: 0x47. For 4:2:2: 0x40 */ |
906 | @@ -858,8 +867,6 @@ static int tvp5150_fill_fmt(struct v4l2_subdev *sd, |
907 | |
908 | f = &format->format; |
909 | |
910 | - tvp5150_reset(sd, 0); |
911 | - |
912 | f->width = decoder->rect.width; |
913 | f->height = decoder->rect.height / 2; |
914 | |
915 | @@ -1048,21 +1055,27 @@ static const struct media_entity_operations tvp5150_sd_media_ops = { |
916 | static int tvp5150_s_stream(struct v4l2_subdev *sd, int enable) |
917 | { |
918 | struct tvp5150 *decoder = to_tvp5150(sd); |
919 | - /* Output format: 8-bit ITU-R BT.656 with embedded syncs */ |
920 | - int val = 0x09; |
921 | - |
922 | - /* Output format: 8-bit 4:2:2 YUV with discrete sync */ |
923 | - if (decoder->mbus_type == V4L2_MBUS_PARALLEL) |
924 | - val = 0x0d; |
925 | + int val; |
926 | |
927 | - /* Initializes TVP5150 to its default values */ |
928 | - /* # set PCLK (27MHz) */ |
929 | - tvp5150_write(sd, TVP5150_CONF_SHARED_PIN, 0x00); |
930 | + /* Enable or disable the video output signals. */ |
931 | + val = tvp5150_read(sd, TVP5150_MISC_CTL); |
932 | + if (val < 0) |
933 | + return val; |
934 | + |
935 | + val &= ~(TVP5150_MISC_CTL_YCBCR_OE | TVP5150_MISC_CTL_SYNC_OE | |
936 | + TVP5150_MISC_CTL_CLOCK_OE); |
937 | + |
938 | + if (enable) { |
939 | + /* |
940 | + * Enable the YCbCr and clock outputs. In discrete sync mode |
941 | + * (non-BT.656) additionally enable the the sync outputs. |
942 | + */ |
943 | + val |= TVP5150_MISC_CTL_YCBCR_OE | TVP5150_MISC_CTL_CLOCK_OE; |
944 | + if (decoder->mbus_type == V4L2_MBUS_PARALLEL) |
945 | + val |= TVP5150_MISC_CTL_SYNC_OE; |
946 | + } |
947 | |
948 | - if (enable) |
949 | - tvp5150_write(sd, TVP5150_MISC_CTL, val); |
950 | - else |
951 | - tvp5150_write(sd, TVP5150_MISC_CTL, 0x00); |
952 | + tvp5150_write(sd, TVP5150_MISC_CTL, val); |
953 | |
954 | return 0; |
955 | } |
956 | @@ -1521,7 +1534,6 @@ static int tvp5150_probe(struct i2c_client *c, |
957 | res = core->hdl.error; |
958 | goto err; |
959 | } |
960 | - v4l2_ctrl_handler_setup(&core->hdl); |
961 | |
962 | /* Default is no cropping */ |
963 | core->rect.top = 0; |
964 | @@ -1532,6 +1544,8 @@ static int tvp5150_probe(struct i2c_client *c, |
965 | core->rect.left = 0; |
966 | core->rect.width = TVP5150_H_MAX; |
967 | |
968 | + tvp5150_reset(sd, 0); /* Calls v4l2_ctrl_handler_setup() */ |
969 | + |
970 | res = v4l2_async_register_subdev(sd); |
971 | if (res < 0) |
972 | goto err; |
973 | diff --git a/drivers/media/i2c/tvp5150_reg.h b/drivers/media/i2c/tvp5150_reg.h |
974 | index 25a994944918..30a48c28d05a 100644 |
975 | --- a/drivers/media/i2c/tvp5150_reg.h |
976 | +++ b/drivers/media/i2c/tvp5150_reg.h |
977 | @@ -9,6 +9,15 @@ |
978 | #define TVP5150_ANAL_CHL_CTL 0x01 /* Analog channel controls */ |
979 | #define TVP5150_OP_MODE_CTL 0x02 /* Operation mode controls */ |
980 | #define TVP5150_MISC_CTL 0x03 /* Miscellaneous controls */ |
981 | +#define TVP5150_MISC_CTL_VBLK_GPCL BIT(7) |
982 | +#define TVP5150_MISC_CTL_GPCL BIT(6) |
983 | +#define TVP5150_MISC_CTL_INTREQ_OE BIT(5) |
984 | +#define TVP5150_MISC_CTL_HVLK BIT(4) |
985 | +#define TVP5150_MISC_CTL_YCBCR_OE BIT(3) |
986 | +#define TVP5150_MISC_CTL_SYNC_OE BIT(2) |
987 | +#define TVP5150_MISC_CTL_VBLANK BIT(1) |
988 | +#define TVP5150_MISC_CTL_CLOCK_OE BIT(0) |
989 | + |
990 | #define TVP5150_AUTOSW_MSK 0x04 /* Autoswitch mask: TVP5150A / TVP5150AM */ |
991 | |
992 | /* Reserved 05h */ |
993 | diff --git a/drivers/media/usb/dvb-usb/pctv452e.c b/drivers/media/usb/dvb-usb/pctv452e.c |
994 | index 07fa08be9e99..d54ebe7e0215 100644 |
995 | --- a/drivers/media/usb/dvb-usb/pctv452e.c |
996 | +++ b/drivers/media/usb/dvb-usb/pctv452e.c |
997 | @@ -97,14 +97,13 @@ struct pctv452e_state { |
998 | u8 c; /* transaction counter, wraps around... */ |
999 | u8 initialized; /* set to 1 if 0x15 has been sent */ |
1000 | u16 last_rc_key; |
1001 | - |
1002 | - unsigned char data[80]; |
1003 | }; |
1004 | |
1005 | static int tt3650_ci_msg(struct dvb_usb_device *d, u8 cmd, u8 *data, |
1006 | unsigned int write_len, unsigned int read_len) |
1007 | { |
1008 | struct pctv452e_state *state = (struct pctv452e_state *)d->priv; |
1009 | + u8 *buf; |
1010 | u8 id; |
1011 | unsigned int rlen; |
1012 | int ret; |
1013 | @@ -114,36 +113,39 @@ static int tt3650_ci_msg(struct dvb_usb_device *d, u8 cmd, u8 *data, |
1014 | return -EIO; |
1015 | } |
1016 | |
1017 | - mutex_lock(&state->ca_mutex); |
1018 | + buf = kmalloc(64, GFP_KERNEL); |
1019 | + if (!buf) |
1020 | + return -ENOMEM; |
1021 | + |
1022 | id = state->c++; |
1023 | |
1024 | - state->data[0] = SYNC_BYTE_OUT; |
1025 | - state->data[1] = id; |
1026 | - state->data[2] = cmd; |
1027 | - state->data[3] = write_len; |
1028 | + buf[0] = SYNC_BYTE_OUT; |
1029 | + buf[1] = id; |
1030 | + buf[2] = cmd; |
1031 | + buf[3] = write_len; |
1032 | |
1033 | - memcpy(state->data + 4, data, write_len); |
1034 | + memcpy(buf + 4, data, write_len); |
1035 | |
1036 | rlen = (read_len > 0) ? 64 : 0; |
1037 | - ret = dvb_usb_generic_rw(d, state->data, 4 + write_len, |
1038 | - state->data, rlen, /* delay_ms */ 0); |
1039 | + ret = dvb_usb_generic_rw(d, buf, 4 + write_len, |
1040 | + buf, rlen, /* delay_ms */ 0); |
1041 | if (0 != ret) |
1042 | goto failed; |
1043 | |
1044 | ret = -EIO; |
1045 | - if (SYNC_BYTE_IN != state->data[0] || id != state->data[1]) |
1046 | + if (SYNC_BYTE_IN != buf[0] || id != buf[1]) |
1047 | goto failed; |
1048 | |
1049 | - memcpy(data, state->data + 4, read_len); |
1050 | + memcpy(data, buf + 4, read_len); |
1051 | |
1052 | - mutex_unlock(&state->ca_mutex); |
1053 | + kfree(buf); |
1054 | return 0; |
1055 | |
1056 | failed: |
1057 | err("CI error %d; %02X %02X %02X -> %*ph.", |
1058 | - ret, SYNC_BYTE_OUT, id, cmd, 3, state->data); |
1059 | + ret, SYNC_BYTE_OUT, id, cmd, 3, buf); |
1060 | |
1061 | - mutex_unlock(&state->ca_mutex); |
1062 | + kfree(buf); |
1063 | return ret; |
1064 | } |
1065 | |
1066 | @@ -410,53 +412,57 @@ static int pctv452e_i2c_msg(struct dvb_usb_device *d, u8 addr, |
1067 | u8 *rcv_buf, u8 rcv_len) |
1068 | { |
1069 | struct pctv452e_state *state = (struct pctv452e_state *)d->priv; |
1070 | + u8 *buf; |
1071 | u8 id; |
1072 | int ret; |
1073 | |
1074 | - mutex_lock(&state->ca_mutex); |
1075 | + buf = kmalloc(64, GFP_KERNEL); |
1076 | + if (!buf) |
1077 | + return -ENOMEM; |
1078 | + |
1079 | id = state->c++; |
1080 | |
1081 | ret = -EINVAL; |
1082 | if (snd_len > 64 - 7 || rcv_len > 64 - 7) |
1083 | goto failed; |
1084 | |
1085 | - state->data[0] = SYNC_BYTE_OUT; |
1086 | - state->data[1] = id; |
1087 | - state->data[2] = PCTV_CMD_I2C; |
1088 | - state->data[3] = snd_len + 3; |
1089 | - state->data[4] = addr << 1; |
1090 | - state->data[5] = snd_len; |
1091 | - state->data[6] = rcv_len; |
1092 | + buf[0] = SYNC_BYTE_OUT; |
1093 | + buf[1] = id; |
1094 | + buf[2] = PCTV_CMD_I2C; |
1095 | + buf[3] = snd_len + 3; |
1096 | + buf[4] = addr << 1; |
1097 | + buf[5] = snd_len; |
1098 | + buf[6] = rcv_len; |
1099 | |
1100 | - memcpy(state->data + 7, snd_buf, snd_len); |
1101 | + memcpy(buf + 7, snd_buf, snd_len); |
1102 | |
1103 | - ret = dvb_usb_generic_rw(d, state->data, 7 + snd_len, |
1104 | - state->data, /* rcv_len */ 64, |
1105 | + ret = dvb_usb_generic_rw(d, buf, 7 + snd_len, |
1106 | + buf, /* rcv_len */ 64, |
1107 | /* delay_ms */ 0); |
1108 | if (ret < 0) |
1109 | goto failed; |
1110 | |
1111 | /* TT USB protocol error. */ |
1112 | ret = -EIO; |
1113 | - if (SYNC_BYTE_IN != state->data[0] || id != state->data[1]) |
1114 | + if (SYNC_BYTE_IN != buf[0] || id != buf[1]) |
1115 | goto failed; |
1116 | |
1117 | /* I2C device didn't respond as expected. */ |
1118 | ret = -EREMOTEIO; |
1119 | - if (state->data[5] < snd_len || state->data[6] < rcv_len) |
1120 | + if (buf[5] < snd_len || buf[6] < rcv_len) |
1121 | goto failed; |
1122 | |
1123 | - memcpy(rcv_buf, state->data + 7, rcv_len); |
1124 | - mutex_unlock(&state->ca_mutex); |
1125 | + memcpy(rcv_buf, buf + 7, rcv_len); |
1126 | |
1127 | + kfree(buf); |
1128 | return rcv_len; |
1129 | |
1130 | failed: |
1131 | err("I2C error %d; %02X %02X %02X %02X %02X -> %*ph", |
1132 | ret, SYNC_BYTE_OUT, id, addr << 1, snd_len, rcv_len, |
1133 | - 7, state->data); |
1134 | + 7, buf); |
1135 | |
1136 | - mutex_unlock(&state->ca_mutex); |
1137 | + kfree(buf); |
1138 | return ret; |
1139 | } |
1140 | |
1141 | @@ -505,7 +511,7 @@ static u32 pctv452e_i2c_func(struct i2c_adapter *adapter) |
1142 | static int pctv452e_power_ctrl(struct dvb_usb_device *d, int i) |
1143 | { |
1144 | struct pctv452e_state *state = (struct pctv452e_state *)d->priv; |
1145 | - u8 *rx; |
1146 | + u8 *b0, *rx; |
1147 | int ret; |
1148 | |
1149 | info("%s: %d\n", __func__, i); |
1150 | @@ -516,11 +522,12 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d, int i) |
1151 | if (state->initialized) |
1152 | return 0; |
1153 | |
1154 | - rx = kmalloc(PCTV_ANSWER_LEN, GFP_KERNEL); |
1155 | - if (!rx) |
1156 | + b0 = kmalloc(5 + PCTV_ANSWER_LEN, GFP_KERNEL); |
1157 | + if (!b0) |
1158 | return -ENOMEM; |
1159 | |
1160 | - mutex_lock(&state->ca_mutex); |
1161 | + rx = b0 + 5; |
1162 | + |
1163 | /* hmm where shoud this should go? */ |
1164 | ret = usb_set_interface(d->udev, 0, ISOC_INTERFACE_ALTERNATIVE); |
1165 | if (ret != 0) |
1166 | @@ -528,66 +535,70 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d, int i) |
1167 | __func__, ret); |
1168 | |
1169 | /* this is a one-time initialization, dont know where to put */ |
1170 | - state->data[0] = 0xaa; |
1171 | - state->data[1] = state->c++; |
1172 | - state->data[2] = PCTV_CMD_RESET; |
1173 | - state->data[3] = 1; |
1174 | - state->data[4] = 0; |
1175 | + b0[0] = 0xaa; |
1176 | + b0[1] = state->c++; |
1177 | + b0[2] = PCTV_CMD_RESET; |
1178 | + b0[3] = 1; |
1179 | + b0[4] = 0; |
1180 | /* reset board */ |
1181 | - ret = dvb_usb_generic_rw(d, state->data, 5, rx, PCTV_ANSWER_LEN, 0); |
1182 | + ret = dvb_usb_generic_rw(d, b0, 5, rx, PCTV_ANSWER_LEN, 0); |
1183 | if (ret) |
1184 | goto ret; |
1185 | |
1186 | - state->data[1] = state->c++; |
1187 | - state->data[4] = 1; |
1188 | + b0[1] = state->c++; |
1189 | + b0[4] = 1; |
1190 | /* reset board (again?) */ |
1191 | - ret = dvb_usb_generic_rw(d, state->data, 5, rx, PCTV_ANSWER_LEN, 0); |
1192 | + ret = dvb_usb_generic_rw(d, b0, 5, rx, PCTV_ANSWER_LEN, 0); |
1193 | if (ret) |
1194 | goto ret; |
1195 | |
1196 | state->initialized = 1; |
1197 | |
1198 | ret: |
1199 | - mutex_unlock(&state->ca_mutex); |
1200 | - kfree(rx); |
1201 | + kfree(b0); |
1202 | return ret; |
1203 | } |
1204 | |
1205 | static int pctv452e_rc_query(struct dvb_usb_device *d) |
1206 | { |
1207 | struct pctv452e_state *state = (struct pctv452e_state *)d->priv; |
1208 | + u8 *b, *rx; |
1209 | int ret, i; |
1210 | u8 id; |
1211 | |
1212 | - mutex_lock(&state->ca_mutex); |
1213 | + b = kmalloc(CMD_BUFFER_SIZE + PCTV_ANSWER_LEN, GFP_KERNEL); |
1214 | + if (!b) |
1215 | + return -ENOMEM; |
1216 | + |
1217 | + rx = b + CMD_BUFFER_SIZE; |
1218 | + |
1219 | id = state->c++; |
1220 | |
1221 | /* prepare command header */ |
1222 | - state->data[0] = SYNC_BYTE_OUT; |
1223 | - state->data[1] = id; |
1224 | - state->data[2] = PCTV_CMD_IR; |
1225 | - state->data[3] = 0; |
1226 | + b[0] = SYNC_BYTE_OUT; |
1227 | + b[1] = id; |
1228 | + b[2] = PCTV_CMD_IR; |
1229 | + b[3] = 0; |
1230 | |
1231 | /* send ir request */ |
1232 | - ret = dvb_usb_generic_rw(d, state->data, 4, |
1233 | - state->data, PCTV_ANSWER_LEN, 0); |
1234 | + ret = dvb_usb_generic_rw(d, b, 4, rx, PCTV_ANSWER_LEN, 0); |
1235 | if (ret != 0) |
1236 | goto ret; |
1237 | |
1238 | if (debug > 3) { |
1239 | - info("%s: read: %2d: %*ph: ", __func__, ret, 3, state->data); |
1240 | - for (i = 0; (i < state->data[3]) && ((i + 3) < PCTV_ANSWER_LEN); i++) |
1241 | - info(" %02x", state->data[i + 3]); |
1242 | + info("%s: read: %2d: %*ph: ", __func__, ret, 3, rx); |
1243 | + for (i = 0; (i < rx[3]) && ((i+3) < PCTV_ANSWER_LEN); i++) |
1244 | + info(" %02x", rx[i+3]); |
1245 | |
1246 | info("\n"); |
1247 | } |
1248 | |
1249 | - if ((state->data[3] == 9) && (state->data[12] & 0x01)) { |
1250 | + if ((rx[3] == 9) && (rx[12] & 0x01)) { |
1251 | /* got a "press" event */ |
1252 | - state->last_rc_key = RC_SCANCODE_RC5(state->data[7], state->data[6]); |
1253 | + state->last_rc_key = RC_SCANCODE_RC5(rx[7], rx[6]); |
1254 | if (debug > 2) |
1255 | info("%s: cmd=0x%02x sys=0x%02x\n", |
1256 | - __func__, state->data[6], state->data[7]); |
1257 | + __func__, rx[6], rx[7]); |
1258 | |
1259 | rc_keydown(d->rc_dev, RC_TYPE_RC5, state->last_rc_key, 0); |
1260 | } else if (state->last_rc_key) { |
1261 | @@ -595,7 +606,7 @@ static int pctv452e_rc_query(struct dvb_usb_device *d) |
1262 | state->last_rc_key = 0; |
1263 | } |
1264 | ret: |
1265 | - mutex_unlock(&state->ca_mutex); |
1266 | + kfree(b); |
1267 | return ret; |
1268 | } |
1269 | |
1270 | diff --git a/drivers/net/can/c_can/c_can_pci.c b/drivers/net/can/c_can/c_can_pci.c |
1271 | index 7be393c96b1a..cf7c18947189 100644 |
1272 | --- a/drivers/net/can/c_can/c_can_pci.c |
1273 | +++ b/drivers/net/can/c_can/c_can_pci.c |
1274 | @@ -161,6 +161,7 @@ static int c_can_pci_probe(struct pci_dev *pdev, |
1275 | |
1276 | dev->irq = pdev->irq; |
1277 | priv->base = addr; |
1278 | + priv->device = &pdev->dev; |
1279 | |
1280 | if (!c_can_pci_data->freq) { |
1281 | dev_err(&pdev->dev, "no clock frequency defined\n"); |
1282 | diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c |
1283 | index 680d1ff07a55..6749b1829469 100644 |
1284 | --- a/drivers/net/can/ti_hecc.c |
1285 | +++ b/drivers/net/can/ti_hecc.c |
1286 | @@ -948,7 +948,12 @@ static int ti_hecc_probe(struct platform_device *pdev) |
1287 | netif_napi_add(ndev, &priv->napi, ti_hecc_rx_poll, |
1288 | HECC_DEF_NAPI_WEIGHT); |
1289 | |
1290 | - clk_enable(priv->clk); |
1291 | + err = clk_prepare_enable(priv->clk); |
1292 | + if (err) { |
1293 | + dev_err(&pdev->dev, "clk_prepare_enable() failed\n"); |
1294 | + goto probe_exit_clk; |
1295 | + } |
1296 | + |
1297 | err = register_candev(ndev); |
1298 | if (err) { |
1299 | dev_err(&pdev->dev, "register_candev() failed\n"); |
1300 | @@ -981,7 +986,7 @@ static int ti_hecc_remove(struct platform_device *pdev) |
1301 | struct ti_hecc_priv *priv = netdev_priv(ndev); |
1302 | |
1303 | unregister_candev(ndev); |
1304 | - clk_disable(priv->clk); |
1305 | + clk_disable_unprepare(priv->clk); |
1306 | clk_put(priv->clk); |
1307 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1308 | iounmap(priv->base); |
1309 | @@ -1006,7 +1011,7 @@ static int ti_hecc_suspend(struct platform_device *pdev, pm_message_t state) |
1310 | hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_PDR); |
1311 | priv->can.state = CAN_STATE_SLEEPING; |
1312 | |
1313 | - clk_disable(priv->clk); |
1314 | + clk_disable_unprepare(priv->clk); |
1315 | |
1316 | return 0; |
1317 | } |
1318 | @@ -1015,8 +1020,11 @@ static int ti_hecc_resume(struct platform_device *pdev) |
1319 | { |
1320 | struct net_device *dev = platform_get_drvdata(pdev); |
1321 | struct ti_hecc_priv *priv = netdev_priv(dev); |
1322 | + int err; |
1323 | |
1324 | - clk_enable(priv->clk); |
1325 | + err = clk_prepare_enable(priv->clk); |
1326 | + if (err) |
1327 | + return err; |
1328 | |
1329 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_PDR); |
1330 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
1331 | diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c |
1332 | index 71bbeb9321ba..079015385fd8 100644 |
1333 | --- a/drivers/pinctrl/intel/pinctrl-baytrail.c |
1334 | +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c |
1335 | @@ -1092,6 +1092,7 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset, |
1336 | enum pin_config_param param = pinconf_to_config_param(*config); |
1337 | void __iomem *conf_reg = byt_gpio_reg(vg, offset, BYT_CONF0_REG); |
1338 | void __iomem *val_reg = byt_gpio_reg(vg, offset, BYT_VAL_REG); |
1339 | + void __iomem *db_reg = byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG); |
1340 | unsigned long flags; |
1341 | u32 conf, pull, val, debounce; |
1342 | u16 arg = 0; |
1343 | @@ -1128,7 +1129,7 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset, |
1344 | return -EINVAL; |
1345 | |
1346 | raw_spin_lock_irqsave(&vg->lock, flags); |
1347 | - debounce = readl(byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG)); |
1348 | + debounce = readl(db_reg); |
1349 | raw_spin_unlock_irqrestore(&vg->lock, flags); |
1350 | |
1351 | switch (debounce & BYT_DEBOUNCE_PULSE_MASK) { |
1352 | @@ -1176,6 +1177,7 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, |
1353 | unsigned int param, arg; |
1354 | void __iomem *conf_reg = byt_gpio_reg(vg, offset, BYT_CONF0_REG); |
1355 | void __iomem *val_reg = byt_gpio_reg(vg, offset, BYT_VAL_REG); |
1356 | + void __iomem *db_reg = byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG); |
1357 | unsigned long flags; |
1358 | u32 conf, val, debounce; |
1359 | int i, ret = 0; |
1360 | @@ -1238,36 +1240,40 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, |
1361 | |
1362 | break; |
1363 | case PIN_CONFIG_INPUT_DEBOUNCE: |
1364 | - debounce = readl(byt_gpio_reg(vg, offset, |
1365 | - BYT_DEBOUNCE_REG)); |
1366 | - conf &= ~BYT_DEBOUNCE_PULSE_MASK; |
1367 | + debounce = readl(db_reg); |
1368 | + debounce &= ~BYT_DEBOUNCE_PULSE_MASK; |
1369 | |
1370 | switch (arg) { |
1371 | + case 0: |
1372 | + conf &= BYT_DEBOUNCE_EN; |
1373 | + break; |
1374 | case 375: |
1375 | - conf |= BYT_DEBOUNCE_PULSE_375US; |
1376 | + debounce |= BYT_DEBOUNCE_PULSE_375US; |
1377 | break; |
1378 | case 750: |
1379 | - conf |= BYT_DEBOUNCE_PULSE_750US; |
1380 | + debounce |= BYT_DEBOUNCE_PULSE_750US; |
1381 | break; |
1382 | case 1500: |
1383 | - conf |= BYT_DEBOUNCE_PULSE_1500US; |
1384 | + debounce |= BYT_DEBOUNCE_PULSE_1500US; |
1385 | break; |
1386 | case 3000: |
1387 | - conf |= BYT_DEBOUNCE_PULSE_3MS; |
1388 | + debounce |= BYT_DEBOUNCE_PULSE_3MS; |
1389 | break; |
1390 | case 6000: |
1391 | - conf |= BYT_DEBOUNCE_PULSE_6MS; |
1392 | + debounce |= BYT_DEBOUNCE_PULSE_6MS; |
1393 | break; |
1394 | case 12000: |
1395 | - conf |= BYT_DEBOUNCE_PULSE_12MS; |
1396 | + debounce |= BYT_DEBOUNCE_PULSE_12MS; |
1397 | break; |
1398 | case 24000: |
1399 | - conf |= BYT_DEBOUNCE_PULSE_24MS; |
1400 | + debounce |= BYT_DEBOUNCE_PULSE_24MS; |
1401 | break; |
1402 | default: |
1403 | ret = -EINVAL; |
1404 | } |
1405 | |
1406 | + if (!ret) |
1407 | + writel(debounce, db_reg); |
1408 | break; |
1409 | default: |
1410 | ret = -ENOTSUPP; |
1411 | diff --git a/drivers/pinctrl/intel/pinctrl-broxton.c b/drivers/pinctrl/intel/pinctrl-broxton.c |
1412 | index 59cb7a6fc5be..901b356b09d7 100644 |
1413 | --- a/drivers/pinctrl/intel/pinctrl-broxton.c |
1414 | +++ b/drivers/pinctrl/intel/pinctrl-broxton.c |
1415 | @@ -19,7 +19,7 @@ |
1416 | |
1417 | #define BXT_PAD_OWN 0x020 |
1418 | #define BXT_HOSTSW_OWN 0x080 |
1419 | -#define BXT_PADCFGLOCK 0x090 |
1420 | +#define BXT_PADCFGLOCK 0x060 |
1421 | #define BXT_GPI_IE 0x110 |
1422 | |
1423 | #define BXT_COMMUNITY(s, e) \ |
1424 | diff --git a/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c b/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c |
1425 | index aa8bd9794683..96686336e3a3 100644 |
1426 | --- a/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c |
1427 | +++ b/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c |
1428 | @@ -561,7 +561,7 @@ static const int ether_rgmii_muxvals[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
1429 | 0, 0, 0, 0}; |
1430 | static const unsigned ether_rmii_pins[] = {30, 31, 32, 33, 34, 35, 36, 37, 39, |
1431 | 41, 42, 45}; |
1432 | -static const int ether_rmii_muxvals[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; |
1433 | +static const int ether_rmii_muxvals[] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}; |
1434 | static const unsigned i2c0_pins[] = {63, 64}; |
1435 | static const int i2c0_muxvals[] = {0, 0}; |
1436 | static const unsigned i2c1_pins[] = {65, 66}; |
1437 | diff --git a/drivers/platform/x86/intel_mid_powerbtn.c b/drivers/platform/x86/intel_mid_powerbtn.c |
1438 | index 1fc0de870ff8..361770568ad0 100644 |
1439 | --- a/drivers/platform/x86/intel_mid_powerbtn.c |
1440 | +++ b/drivers/platform/x86/intel_mid_powerbtn.c |
1441 | @@ -77,7 +77,7 @@ static int mfld_pb_probe(struct platform_device *pdev) |
1442 | |
1443 | input_set_capability(input, EV_KEY, KEY_POWER); |
1444 | |
1445 | - error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0, |
1446 | + error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_ONESHOT, |
1447 | DRIVER_NAME, input); |
1448 | if (error) { |
1449 | dev_err(&pdev->dev, "Unable to request irq %d for mfld power" |
1450 | diff --git a/drivers/video/fbdev/core/fbcmap.c b/drivers/video/fbdev/core/fbcmap.c |
1451 | index f89245b8ba8e..68a113594808 100644 |
1452 | --- a/drivers/video/fbdev/core/fbcmap.c |
1453 | +++ b/drivers/video/fbdev/core/fbcmap.c |
1454 | @@ -163,17 +163,18 @@ void fb_dealloc_cmap(struct fb_cmap *cmap) |
1455 | |
1456 | int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to) |
1457 | { |
1458 | - int tooff = 0, fromoff = 0; |
1459 | - int size; |
1460 | + unsigned int tooff = 0, fromoff = 0; |
1461 | + size_t size; |
1462 | |
1463 | if (to->start > from->start) |
1464 | fromoff = to->start - from->start; |
1465 | else |
1466 | tooff = from->start - to->start; |
1467 | - size = to->len - tooff; |
1468 | - if (size > (int) (from->len - fromoff)) |
1469 | - size = from->len - fromoff; |
1470 | - if (size <= 0) |
1471 | + if (fromoff >= from->len || tooff >= to->len) |
1472 | + return -EINVAL; |
1473 | + |
1474 | + size = min_t(size_t, to->len - tooff, from->len - fromoff); |
1475 | + if (size == 0) |
1476 | return -EINVAL; |
1477 | size *= sizeof(u16); |
1478 | |
1479 | @@ -187,17 +188,18 @@ int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to) |
1480 | |
1481 | int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to) |
1482 | { |
1483 | - int tooff = 0, fromoff = 0; |
1484 | - int size; |
1485 | + unsigned int tooff = 0, fromoff = 0; |
1486 | + size_t size; |
1487 | |
1488 | if (to->start > from->start) |
1489 | fromoff = to->start - from->start; |
1490 | else |
1491 | tooff = from->start - to->start; |
1492 | - size = to->len - tooff; |
1493 | - if (size > (int) (from->len - fromoff)) |
1494 | - size = from->len - fromoff; |
1495 | - if (size <= 0) |
1496 | + if (fromoff >= from->len || tooff >= to->len) |
1497 | + return -EINVAL; |
1498 | + |
1499 | + size = min_t(size_t, to->len - tooff, from->len - fromoff); |
1500 | + if (size == 0) |
1501 | return -EINVAL; |
1502 | size *= sizeof(u16); |
1503 | |
1504 | diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c |
1505 | index 48bfea91dbca..50840984fbfa 100644 |
1506 | --- a/drivers/virtio/virtio_mmio.c |
1507 | +++ b/drivers/virtio/virtio_mmio.c |
1508 | @@ -59,6 +59,7 @@ |
1509 | #define pr_fmt(fmt) "virtio-mmio: " fmt |
1510 | |
1511 | #include <linux/acpi.h> |
1512 | +#include <linux/dma-mapping.h> |
1513 | #include <linux/highmem.h> |
1514 | #include <linux/interrupt.h> |
1515 | #include <linux/io.h> |
1516 | @@ -497,6 +498,7 @@ static int virtio_mmio_probe(struct platform_device *pdev) |
1517 | struct virtio_mmio_device *vm_dev; |
1518 | struct resource *mem; |
1519 | unsigned long magic; |
1520 | + int rc; |
1521 | |
1522 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1523 | if (!mem) |
1524 | @@ -545,9 +547,25 @@ static int virtio_mmio_probe(struct platform_device *pdev) |
1525 | } |
1526 | vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID); |
1527 | |
1528 | - if (vm_dev->version == 1) |
1529 | + if (vm_dev->version == 1) { |
1530 | writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE); |
1531 | |
1532 | + rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); |
1533 | + /* |
1534 | + * In the legacy case, ensure our coherently-allocated virtio |
1535 | + * ring will be at an address expressable as a 32-bit PFN. |
1536 | + */ |
1537 | + if (!rc) |
1538 | + dma_set_coherent_mask(&pdev->dev, |
1539 | + DMA_BIT_MASK(32 + PAGE_SHIFT)); |
1540 | + } else { |
1541 | + rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); |
1542 | + } |
1543 | + if (rc) |
1544 | + rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
1545 | + if (rc) |
1546 | + dev_warn(&pdev->dev, "Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.\n"); |
1547 | + |
1548 | platform_set_drvdata(pdev, vm_dev); |
1549 | |
1550 | return register_virtio_device(&vm_dev->vdev); |
1551 | diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c |
1552 | index 489bfc61cf30..f1360487a594 100644 |
1553 | --- a/drivers/virtio/virtio_ring.c |
1554 | +++ b/drivers/virtio/virtio_ring.c |
1555 | @@ -159,6 +159,13 @@ static bool vring_use_dma_api(struct virtio_device *vdev) |
1556 | if (xen_domain()) |
1557 | return true; |
1558 | |
1559 | + /* |
1560 | + * On ARM-based machines, the DMA ops will do the right thing, |
1561 | + * so always use them with legacy devices. |
1562 | + */ |
1563 | + if (IS_ENABLED(CONFIG_ARM) || IS_ENABLED(CONFIG_ARM64)) |
1564 | + return !virtio_has_feature(vdev, VIRTIO_F_VERSION_1); |
1565 | + |
1566 | return false; |
1567 | } |
1568 | |
1569 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
1570 | index 8e3a5a266917..be4da91d880f 100644 |
1571 | --- a/fs/btrfs/inode.c |
1572 | +++ b/fs/btrfs/inode.c |
1573 | @@ -3819,10 +3819,7 @@ static int btrfs_read_locked_inode(struct inode *inode) |
1574 | break; |
1575 | case S_IFDIR: |
1576 | inode->i_fop = &btrfs_dir_file_operations; |
1577 | - if (root == root->fs_info->tree_root) |
1578 | - inode->i_op = &btrfs_dir_ro_inode_operations; |
1579 | - else |
1580 | - inode->i_op = &btrfs_dir_inode_operations; |
1581 | + inode->i_op = &btrfs_dir_inode_operations; |
1582 | break; |
1583 | case S_IFLNK: |
1584 | inode->i_op = &btrfs_symlink_inode_operations; |
1585 | @@ -5682,6 +5679,7 @@ static struct inode *new_simple_dir(struct super_block *s, |
1586 | |
1587 | inode->i_ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID; |
1588 | inode->i_op = &btrfs_dir_ro_inode_operations; |
1589 | + inode->i_opflags &= ~IOP_XATTR; |
1590 | inode->i_fop = &simple_dir_operations; |
1591 | inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO; |
1592 | inode->i_mtime = current_time(inode); |
1593 | @@ -10587,8 +10585,6 @@ static const struct inode_operations btrfs_dir_inode_operations = { |
1594 | static const struct inode_operations btrfs_dir_ro_inode_operations = { |
1595 | .lookup = btrfs_lookup, |
1596 | .permission = btrfs_permission, |
1597 | - .get_acl = btrfs_get_acl, |
1598 | - .set_acl = btrfs_set_acl, |
1599 | .update_time = btrfs_update_time, |
1600 | }; |
1601 | |
1602 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1603 | index 241da19b7da4..78ff8b63d5f7 100644 |
1604 | --- a/fs/nfs/nfs4proc.c |
1605 | +++ b/fs/nfs/nfs4proc.c |
1606 | @@ -2678,7 +2678,8 @@ static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, |
1607 | sattr->ia_valid |= ATTR_MTIME; |
1608 | |
1609 | /* Except MODE, it seems harmless of setting twice. */ |
1610 | - if ((attrset[1] & FATTR4_WORD1_MODE)) |
1611 | + if (opendata->o_arg.createmode != NFS4_CREATE_EXCLUSIVE && |
1612 | + attrset[1] & FATTR4_WORD1_MODE) |
1613 | sattr->ia_valid &= ~ATTR_MODE; |
1614 | |
1615 | if (attrset[2] & FATTR4_WORD2_SECURITY_LABEL) |
1616 | @@ -8371,6 +8372,7 @@ nfs4_layoutget_handle_exception(struct rpc_task *task, |
1617 | goto out; |
1618 | } |
1619 | |
1620 | + nfs4_sequence_free_slot(&lgp->res.seq_res); |
1621 | err = nfs4_handle_exception(server, nfs4err, exception); |
1622 | if (!status) { |
1623 | if (exception->retry) |
1624 | diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c |
1625 | index 45e50ea90769..b669b123287b 100644 |
1626 | --- a/fs/xfs/xfs_qm.c |
1627 | +++ b/fs/xfs/xfs_qm.c |
1628 | @@ -1177,7 +1177,8 @@ xfs_qm_dqusage_adjust( |
1629 | * the case in all other instances. It's OK that we do this because |
1630 | * quotacheck is done only at mount time. |
1631 | */ |
1632 | - error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip); |
1633 | + error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, XFS_ILOCK_EXCL, |
1634 | + &ip); |
1635 | if (error) { |
1636 | *res = BULKSTAT_RV_NOTHING; |
1637 | return error; |
1638 | diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h |
1639 | index 01033fadea47..c1784c0b4f35 100644 |
1640 | --- a/include/linux/memory_hotplug.h |
1641 | +++ b/include/linux/memory_hotplug.h |
1642 | @@ -284,7 +284,7 @@ extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms, |
1643 | unsigned long map_offset); |
1644 | extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map, |
1645 | unsigned long pnum); |
1646 | -extern int zone_can_shift(unsigned long pfn, unsigned long nr_pages, |
1647 | - enum zone_type target); |
1648 | +extern bool zone_can_shift(unsigned long pfn, unsigned long nr_pages, |
1649 | + enum zone_type target, int *zone_shift); |
1650 | |
1651 | #endif /* __LINUX_MEMORY_HOTPLUG_H */ |
1652 | diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h |
1653 | index 0f088f3a2fed..f99c993dd500 100644 |
1654 | --- a/include/linux/mmzone.h |
1655 | +++ b/include/linux/mmzone.h |
1656 | @@ -972,12 +972,16 @@ static __always_inline struct zoneref *next_zones_zonelist(struct zoneref *z, |
1657 | * @zonelist - The zonelist to search for a suitable zone |
1658 | * @highest_zoneidx - The zone index of the highest zone to return |
1659 | * @nodes - An optional nodemask to filter the zonelist with |
1660 | - * @zone - The first suitable zone found is returned via this parameter |
1661 | + * @return - Zoneref pointer for the first suitable zone found (see below) |
1662 | * |
1663 | * This function returns the first zone at or below a given zone index that is |
1664 | * within the allowed nodemask. The zoneref returned is a cursor that can be |
1665 | * used to iterate the zonelist with next_zones_zonelist by advancing it by |
1666 | * one before calling. |
1667 | + * |
1668 | + * When no eligible zone is found, zoneref->zone is NULL (zoneref itself is |
1669 | + * never NULL). This may happen either genuinely, or due to concurrent nodemask |
1670 | + * update due to cpuset modification. |
1671 | */ |
1672 | static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist, |
1673 | enum zone_type highest_zoneidx, |
1674 | diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h |
1675 | index 9094faf0699d..039e76e91896 100644 |
1676 | --- a/include/linux/nfs4.h |
1677 | +++ b/include/linux/nfs4.h |
1678 | @@ -282,7 +282,7 @@ enum nfsstat4 { |
1679 | |
1680 | static inline bool seqid_mutating_err(u32 err) |
1681 | { |
1682 | - /* rfc 3530 section 8.1.5: */ |
1683 | + /* See RFC 7530, section 9.1.7 */ |
1684 | switch (err) { |
1685 | case NFS4ERR_STALE_CLIENTID: |
1686 | case NFS4ERR_STALE_STATEID: |
1687 | @@ -291,6 +291,7 @@ static inline bool seqid_mutating_err(u32 err) |
1688 | case NFS4ERR_BADXDR: |
1689 | case NFS4ERR_RESOURCE: |
1690 | case NFS4ERR_NOFILEHANDLE: |
1691 | + case NFS4ERR_MOVED: |
1692 | return false; |
1693 | }; |
1694 | return true; |
1695 | diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h |
1696 | index 85cc819676e8..333ad11b3dd9 100644 |
1697 | --- a/include/linux/sunrpc/clnt.h |
1698 | +++ b/include/linux/sunrpc/clnt.h |
1699 | @@ -216,5 +216,6 @@ void rpc_clnt_xprt_switch_put(struct rpc_clnt *); |
1700 | void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *); |
1701 | bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt, |
1702 | const struct sockaddr *sap); |
1703 | +void rpc_cleanup_clids(void); |
1704 | #endif /* __KERNEL__ */ |
1705 | #endif /* _LINUX_SUNRPC_CLNT_H */ |
1706 | diff --git a/include/uapi/rdma/cxgb3-abi.h b/include/uapi/rdma/cxgb3-abi.h |
1707 | index 48a19bda071b..d24eee12128f 100644 |
1708 | --- a/include/uapi/rdma/cxgb3-abi.h |
1709 | +++ b/include/uapi/rdma/cxgb3-abi.h |
1710 | @@ -30,7 +30,7 @@ |
1711 | * SOFTWARE. |
1712 | */ |
1713 | #ifndef CXGB3_ABI_USER_H |
1714 | -#define CXBG3_ABI_USER_H |
1715 | +#define CXGB3_ABI_USER_H |
1716 | |
1717 | #include <linux/types.h> |
1718 | |
1719 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
1720 | index 02c8421f8c01..e5a8839e7076 100644 |
1721 | --- a/kernel/events/core.c |
1722 | +++ b/kernel/events/core.c |
1723 | @@ -9503,6 +9503,37 @@ static int perf_event_set_clock(struct perf_event *event, clockid_t clk_id) |
1724 | return 0; |
1725 | } |
1726 | |
1727 | +/* |
1728 | + * Variation on perf_event_ctx_lock_nested(), except we take two context |
1729 | + * mutexes. |
1730 | + */ |
1731 | +static struct perf_event_context * |
1732 | +__perf_event_ctx_lock_double(struct perf_event *group_leader, |
1733 | + struct perf_event_context *ctx) |
1734 | +{ |
1735 | + struct perf_event_context *gctx; |
1736 | + |
1737 | +again: |
1738 | + rcu_read_lock(); |
1739 | + gctx = READ_ONCE(group_leader->ctx); |
1740 | + if (!atomic_inc_not_zero(&gctx->refcount)) { |
1741 | + rcu_read_unlock(); |
1742 | + goto again; |
1743 | + } |
1744 | + rcu_read_unlock(); |
1745 | + |
1746 | + mutex_lock_double(&gctx->mutex, &ctx->mutex); |
1747 | + |
1748 | + if (group_leader->ctx != gctx) { |
1749 | + mutex_unlock(&ctx->mutex); |
1750 | + mutex_unlock(&gctx->mutex); |
1751 | + put_ctx(gctx); |
1752 | + goto again; |
1753 | + } |
1754 | + |
1755 | + return gctx; |
1756 | +} |
1757 | + |
1758 | /** |
1759 | * sys_perf_event_open - open a performance event, associate it to a task/cpu |
1760 | * |
1761 | @@ -9746,12 +9777,31 @@ SYSCALL_DEFINE5(perf_event_open, |
1762 | } |
1763 | |
1764 | if (move_group) { |
1765 | - gctx = group_leader->ctx; |
1766 | - mutex_lock_double(&gctx->mutex, &ctx->mutex); |
1767 | + gctx = __perf_event_ctx_lock_double(group_leader, ctx); |
1768 | + |
1769 | if (gctx->task == TASK_TOMBSTONE) { |
1770 | err = -ESRCH; |
1771 | goto err_locked; |
1772 | } |
1773 | + |
1774 | + /* |
1775 | + * Check if we raced against another sys_perf_event_open() call |
1776 | + * moving the software group underneath us. |
1777 | + */ |
1778 | + if (!(group_leader->group_caps & PERF_EV_CAP_SOFTWARE)) { |
1779 | + /* |
1780 | + * If someone moved the group out from under us, check |
1781 | + * if this new event wound up on the same ctx, if so |
1782 | + * its the regular !move_group case, otherwise fail. |
1783 | + */ |
1784 | + if (gctx != ctx) { |
1785 | + err = -EINVAL; |
1786 | + goto err_locked; |
1787 | + } else { |
1788 | + perf_event_ctx_unlock(group_leader, gctx); |
1789 | + move_group = 0; |
1790 | + } |
1791 | + } |
1792 | } else { |
1793 | mutex_lock(&ctx->mutex); |
1794 | } |
1795 | @@ -9853,7 +9903,7 @@ SYSCALL_DEFINE5(perf_event_open, |
1796 | perf_unpin_context(ctx); |
1797 | |
1798 | if (move_group) |
1799 | - mutex_unlock(&gctx->mutex); |
1800 | + perf_event_ctx_unlock(group_leader, gctx); |
1801 | mutex_unlock(&ctx->mutex); |
1802 | |
1803 | if (task) { |
1804 | @@ -9879,7 +9929,7 @@ SYSCALL_DEFINE5(perf_event_open, |
1805 | |
1806 | err_locked: |
1807 | if (move_group) |
1808 | - mutex_unlock(&gctx->mutex); |
1809 | + perf_event_ctx_unlock(group_leader, gctx); |
1810 | mutex_unlock(&ctx->mutex); |
1811 | /* err_file: */ |
1812 | fput(event_file); |
1813 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
1814 | index 706309f9ed84..c1095cdc0fe2 100644 |
1815 | --- a/kernel/sysctl.c |
1816 | +++ b/kernel/sysctl.c |
1817 | @@ -2487,6 +2487,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int |
1818 | break; |
1819 | if (neg) |
1820 | continue; |
1821 | + val = convmul * val / convdiv; |
1822 | if ((min && val < *min) || (max && val > *max)) |
1823 | continue; |
1824 | *i = val; |
1825 | diff --git a/kernel/ucount.c b/kernel/ucount.c |
1826 | index 9d20d5dd298a..4bbd38ec3788 100644 |
1827 | --- a/kernel/ucount.c |
1828 | +++ b/kernel/ucount.c |
1829 | @@ -128,10 +128,10 @@ static struct ucounts *get_ucounts(struct user_namespace *ns, kuid_t uid) |
1830 | struct hlist_head *hashent = ucounts_hashentry(ns, uid); |
1831 | struct ucounts *ucounts, *new; |
1832 | |
1833 | - spin_lock(&ucounts_lock); |
1834 | + spin_lock_irq(&ucounts_lock); |
1835 | ucounts = find_ucounts(ns, uid, hashent); |
1836 | if (!ucounts) { |
1837 | - spin_unlock(&ucounts_lock); |
1838 | + spin_unlock_irq(&ucounts_lock); |
1839 | |
1840 | new = kzalloc(sizeof(*new), GFP_KERNEL); |
1841 | if (!new) |
1842 | @@ -141,7 +141,7 @@ static struct ucounts *get_ucounts(struct user_namespace *ns, kuid_t uid) |
1843 | new->uid = uid; |
1844 | atomic_set(&new->count, 0); |
1845 | |
1846 | - spin_lock(&ucounts_lock); |
1847 | + spin_lock_irq(&ucounts_lock); |
1848 | ucounts = find_ucounts(ns, uid, hashent); |
1849 | if (ucounts) { |
1850 | kfree(new); |
1851 | @@ -152,16 +152,18 @@ static struct ucounts *get_ucounts(struct user_namespace *ns, kuid_t uid) |
1852 | } |
1853 | if (!atomic_add_unless(&ucounts->count, 1, INT_MAX)) |
1854 | ucounts = NULL; |
1855 | - spin_unlock(&ucounts_lock); |
1856 | + spin_unlock_irq(&ucounts_lock); |
1857 | return ucounts; |
1858 | } |
1859 | |
1860 | static void put_ucounts(struct ucounts *ucounts) |
1861 | { |
1862 | + unsigned long flags; |
1863 | + |
1864 | if (atomic_dec_and_test(&ucounts->count)) { |
1865 | - spin_lock(&ucounts_lock); |
1866 | + spin_lock_irqsave(&ucounts_lock, flags); |
1867 | hlist_del_init(&ucounts->node); |
1868 | - spin_unlock(&ucounts_lock); |
1869 | + spin_unlock_irqrestore(&ucounts_lock, flags); |
1870 | |
1871 | kfree(ucounts); |
1872 | } |
1873 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
1874 | index 8ca40b70beae..917555cf6be0 100644 |
1875 | --- a/mm/huge_memory.c |
1876 | +++ b/mm/huge_memory.c |
1877 | @@ -772,6 +772,12 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, |
1878 | |
1879 | assert_spin_locked(pmd_lockptr(mm, pmd)); |
1880 | |
1881 | + /* |
1882 | + * When we COW a devmap PMD entry, we split it into PTEs, so we should |
1883 | + * not be in this function with `flags & FOLL_COW` set. |
1884 | + */ |
1885 | + WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW set"); |
1886 | + |
1887 | if (flags & FOLL_WRITE && !pmd_write(*pmd)) |
1888 | return NULL; |
1889 | |
1890 | @@ -1118,6 +1124,16 @@ int do_huge_pmd_wp_page(struct fault_env *fe, pmd_t orig_pmd) |
1891 | return ret; |
1892 | } |
1893 | |
1894 | +/* |
1895 | + * FOLL_FORCE can write to even unwritable pmd's, but only |
1896 | + * after we've gone through a COW cycle and they are dirty. |
1897 | + */ |
1898 | +static inline bool can_follow_write_pmd(pmd_t pmd, unsigned int flags) |
1899 | +{ |
1900 | + return pmd_write(pmd) || |
1901 | + ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pmd_dirty(pmd)); |
1902 | +} |
1903 | + |
1904 | struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, |
1905 | unsigned long addr, |
1906 | pmd_t *pmd, |
1907 | @@ -1128,7 +1144,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, |
1908 | |
1909 | assert_spin_locked(pmd_lockptr(mm, pmd)); |
1910 | |
1911 | - if (flags & FOLL_WRITE && !pmd_write(*pmd)) |
1912 | + if (flags & FOLL_WRITE && !can_follow_write_pmd(*pmd, flags)) |
1913 | goto out; |
1914 | |
1915 | /* Avoid dumping huge zero page */ |
1916 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
1917 | index d536a9daa511..4c6ade54d833 100644 |
1918 | --- a/mm/memcontrol.c |
1919 | +++ b/mm/memcontrol.c |
1920 | @@ -4360,9 +4360,9 @@ static int mem_cgroup_do_precharge(unsigned long count) |
1921 | return ret; |
1922 | } |
1923 | |
1924 | - /* Try charges one by one with reclaim */ |
1925 | + /* Try charges one by one with reclaim, but do not retry */ |
1926 | while (count--) { |
1927 | - ret = try_charge(mc.to, GFP_KERNEL & ~__GFP_NORETRY, 1); |
1928 | + ret = try_charge(mc.to, GFP_KERNEL | __GFP_NORETRY, 1); |
1929 | if (ret) |
1930 | return ret; |
1931 | mc.precharge++; |
1932 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c |
1933 | index cad4b9125695..c3a8141ac788 100644 |
1934 | --- a/mm/memory_hotplug.c |
1935 | +++ b/mm/memory_hotplug.c |
1936 | @@ -1033,36 +1033,39 @@ static void node_states_set_node(int node, struct memory_notify *arg) |
1937 | node_set_state(node, N_MEMORY); |
1938 | } |
1939 | |
1940 | -int zone_can_shift(unsigned long pfn, unsigned long nr_pages, |
1941 | - enum zone_type target) |
1942 | +bool zone_can_shift(unsigned long pfn, unsigned long nr_pages, |
1943 | + enum zone_type target, int *zone_shift) |
1944 | { |
1945 | struct zone *zone = page_zone(pfn_to_page(pfn)); |
1946 | enum zone_type idx = zone_idx(zone); |
1947 | int i; |
1948 | |
1949 | + *zone_shift = 0; |
1950 | + |
1951 | if (idx < target) { |
1952 | /* pages must be at end of current zone */ |
1953 | if (pfn + nr_pages != zone_end_pfn(zone)) |
1954 | - return 0; |
1955 | + return false; |
1956 | |
1957 | /* no zones in use between current zone and target */ |
1958 | for (i = idx + 1; i < target; i++) |
1959 | if (zone_is_initialized(zone - idx + i)) |
1960 | - return 0; |
1961 | + return false; |
1962 | } |
1963 | |
1964 | if (target < idx) { |
1965 | /* pages must be at beginning of current zone */ |
1966 | if (pfn != zone->zone_start_pfn) |
1967 | - return 0; |
1968 | + return false; |
1969 | |
1970 | /* no zones in use between current zone and target */ |
1971 | for (i = target + 1; i < idx; i++) |
1972 | if (zone_is_initialized(zone - idx + i)) |
1973 | - return 0; |
1974 | + return false; |
1975 | } |
1976 | |
1977 | - return target - idx; |
1978 | + *zone_shift = target - idx; |
1979 | + return true; |
1980 | } |
1981 | |
1982 | /* Must be protected by mem_hotplug_begin() */ |
1983 | @@ -1089,10 +1092,13 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ |
1984 | !can_online_high_movable(zone)) |
1985 | return -EINVAL; |
1986 | |
1987 | - if (online_type == MMOP_ONLINE_KERNEL) |
1988 | - zone_shift = zone_can_shift(pfn, nr_pages, ZONE_NORMAL); |
1989 | - else if (online_type == MMOP_ONLINE_MOVABLE) |
1990 | - zone_shift = zone_can_shift(pfn, nr_pages, ZONE_MOVABLE); |
1991 | + if (online_type == MMOP_ONLINE_KERNEL) { |
1992 | + if (!zone_can_shift(pfn, nr_pages, ZONE_NORMAL, &zone_shift)) |
1993 | + return -EINVAL; |
1994 | + } else if (online_type == MMOP_ONLINE_MOVABLE) { |
1995 | + if (!zone_can_shift(pfn, nr_pages, ZONE_MOVABLE, &zone_shift)) |
1996 | + return -EINVAL; |
1997 | + } |
1998 | |
1999 | zone = move_pfn_range(zone_shift, pfn, pfn + nr_pages); |
2000 | if (!zone) |
2001 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
2002 | index 0b859af06b87..f75704717e47 100644 |
2003 | --- a/mm/mempolicy.c |
2004 | +++ b/mm/mempolicy.c |
2005 | @@ -2023,8 +2023,8 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, |
2006 | |
2007 | nmask = policy_nodemask(gfp, pol); |
2008 | zl = policy_zonelist(gfp, pol, node); |
2009 | - mpol_cond_put(pol); |
2010 | page = __alloc_pages_nodemask(gfp, order, zl, nmask); |
2011 | + mpol_cond_put(pol); |
2012 | out: |
2013 | if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie))) |
2014 | goto retry_cpuset; |
2015 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
2016 | index 34ada718ef47..f4a02e240fb6 100644 |
2017 | --- a/mm/page_alloc.c |
2018 | +++ b/mm/page_alloc.c |
2019 | @@ -3502,12 +3502,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
2020 | struct page *page = NULL; |
2021 | unsigned int alloc_flags; |
2022 | unsigned long did_some_progress; |
2023 | - enum compact_priority compact_priority = DEF_COMPACT_PRIORITY; |
2024 | + enum compact_priority compact_priority; |
2025 | enum compact_result compact_result; |
2026 | - int compaction_retries = 0; |
2027 | - int no_progress_loops = 0; |
2028 | + int compaction_retries; |
2029 | + int no_progress_loops; |
2030 | unsigned long alloc_start = jiffies; |
2031 | unsigned int stall_timeout = 10 * HZ; |
2032 | + unsigned int cpuset_mems_cookie; |
2033 | |
2034 | /* |
2035 | * In the slowpath, we sanity check order to avoid ever trying to |
2036 | @@ -3528,6 +3529,23 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
2037 | (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM))) |
2038 | gfp_mask &= ~__GFP_ATOMIC; |
2039 | |
2040 | +retry_cpuset: |
2041 | + compaction_retries = 0; |
2042 | + no_progress_loops = 0; |
2043 | + compact_priority = DEF_COMPACT_PRIORITY; |
2044 | + cpuset_mems_cookie = read_mems_allowed_begin(); |
2045 | + /* |
2046 | + * We need to recalculate the starting point for the zonelist iterator |
2047 | + * because we might have used different nodemask in the fast path, or |
2048 | + * there was a cpuset modification and we are retrying - otherwise we |
2049 | + * could end up iterating over non-eligible zones endlessly. |
2050 | + */ |
2051 | + ac->preferred_zoneref = first_zones_zonelist(ac->zonelist, |
2052 | + ac->high_zoneidx, ac->nodemask); |
2053 | + if (!ac->preferred_zoneref->zone) |
2054 | + goto nopage; |
2055 | + |
2056 | + |
2057 | /* |
2058 | * The fast path uses conservative alloc_flags to succeed only until |
2059 | * kswapd needs to be woken up, and to avoid the cost of setting up |
2060 | @@ -3687,6 +3705,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
2061 | &compaction_retries)) |
2062 | goto retry; |
2063 | |
2064 | + /* |
2065 | + * It's possible we raced with cpuset update so the OOM would be |
2066 | + * premature (see below the nopage: label for full explanation). |
2067 | + */ |
2068 | + if (read_mems_allowed_retry(cpuset_mems_cookie)) |
2069 | + goto retry_cpuset; |
2070 | + |
2071 | /* Reclaim has failed us, start killing things */ |
2072 | page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress); |
2073 | if (page) |
2074 | @@ -3699,6 +3724,16 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
2075 | } |
2076 | |
2077 | nopage: |
2078 | + /* |
2079 | + * When updating a task's mems_allowed or mempolicy nodemask, it is |
2080 | + * possible to race with parallel threads in such a way that our |
2081 | + * allocation can fail while the mask is being updated. If we are about |
2082 | + * to fail, check if the cpuset changed during allocation and if so, |
2083 | + * retry. |
2084 | + */ |
2085 | + if (read_mems_allowed_retry(cpuset_mems_cookie)) |
2086 | + goto retry_cpuset; |
2087 | + |
2088 | warn_alloc(gfp_mask, |
2089 | "page allocation failure: order:%u", order); |
2090 | got_pg: |
2091 | @@ -3713,7 +3748,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
2092 | struct zonelist *zonelist, nodemask_t *nodemask) |
2093 | { |
2094 | struct page *page; |
2095 | - unsigned int cpuset_mems_cookie; |
2096 | unsigned int alloc_flags = ALLOC_WMARK_LOW; |
2097 | gfp_t alloc_mask = gfp_mask; /* The gfp_t that was actually used for allocation */ |
2098 | struct alloc_context ac = { |
2099 | @@ -3750,9 +3784,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
2100 | if (IS_ENABLED(CONFIG_CMA) && ac.migratetype == MIGRATE_MOVABLE) |
2101 | alloc_flags |= ALLOC_CMA; |
2102 | |
2103 | -retry_cpuset: |
2104 | - cpuset_mems_cookie = read_mems_allowed_begin(); |
2105 | - |
2106 | /* Dirty zone balancing only done in the fast path */ |
2107 | ac.spread_dirty_pages = (gfp_mask & __GFP_WRITE); |
2108 | |
2109 | @@ -3763,8 +3794,13 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
2110 | */ |
2111 | ac.preferred_zoneref = first_zones_zonelist(ac.zonelist, |
2112 | ac.high_zoneidx, ac.nodemask); |
2113 | - if (!ac.preferred_zoneref) { |
2114 | + if (!ac.preferred_zoneref->zone) { |
2115 | page = NULL; |
2116 | + /* |
2117 | + * This might be due to race with cpuset_current_mems_allowed |
2118 | + * update, so make sure we retry with original nodemask in the |
2119 | + * slow path. |
2120 | + */ |
2121 | goto no_zone; |
2122 | } |
2123 | |
2124 | @@ -3773,6 +3809,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
2125 | if (likely(page)) |
2126 | goto out; |
2127 | |
2128 | +no_zone: |
2129 | /* |
2130 | * Runtime PM, block IO and its error handling path can deadlock |
2131 | * because I/O on the device might not complete. |
2132 | @@ -3784,21 +3821,10 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
2133 | * Restore the original nodemask if it was potentially replaced with |
2134 | * &cpuset_current_mems_allowed to optimize the fast-path attempt. |
2135 | */ |
2136 | - if (cpusets_enabled()) |
2137 | + if (unlikely(ac.nodemask != nodemask)) |
2138 | ac.nodemask = nodemask; |
2139 | - page = __alloc_pages_slowpath(alloc_mask, order, &ac); |
2140 | |
2141 | -no_zone: |
2142 | - /* |
2143 | - * When updating a task's mems_allowed, it is possible to race with |
2144 | - * parallel threads in such a way that an allocation can fail while |
2145 | - * the mask is being updated. If a page allocation is about to fail, |
2146 | - * check if the cpuset changed during allocation and if so, retry. |
2147 | - */ |
2148 | - if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie))) { |
2149 | - alloc_mask = gfp_mask; |
2150 | - goto retry_cpuset; |
2151 | - } |
2152 | + page = __alloc_pages_slowpath(alloc_mask, order, &ac); |
2153 | |
2154 | out: |
2155 | if (memcg_kmem_enabled() && (gfp_mask & __GFP_ACCOUNT) && page && |
2156 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
2157 | index 62a482790937..b2ae4f150ec6 100644 |
2158 | --- a/net/sunrpc/clnt.c |
2159 | +++ b/net/sunrpc/clnt.c |
2160 | @@ -336,6 +336,11 @@ static int rpc_client_register(struct rpc_clnt *clnt, |
2161 | |
2162 | static DEFINE_IDA(rpc_clids); |
2163 | |
2164 | +void rpc_cleanup_clids(void) |
2165 | +{ |
2166 | + ida_destroy(&rpc_clids); |
2167 | +} |
2168 | + |
2169 | static int rpc_alloc_clid(struct rpc_clnt *clnt) |
2170 | { |
2171 | int clid; |
2172 | diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c |
2173 | index ee5d3d253102..3142f38d1104 100644 |
2174 | --- a/net/sunrpc/sunrpc_syms.c |
2175 | +++ b/net/sunrpc/sunrpc_syms.c |
2176 | @@ -119,6 +119,7 @@ init_sunrpc(void) |
2177 | static void __exit |
2178 | cleanup_sunrpc(void) |
2179 | { |
2180 | + rpc_cleanup_clids(); |
2181 | rpcauth_remove_module(); |
2182 | cleanup_socket_xprt(); |
2183 | svc_cleanup_xprt_sock(); |