Contents of /trunk/kernel-magellan/patches-4.7/0101-4.7.2-all-fixes.patch
Parent Directory | Revision Log
Revision 2821 -
(show annotations)
(download)
Wed Aug 31 12:36:25 2016 UTC (8 years ago) by niro
File size: 253567 byte(s)
Wed Aug 31 12:36:25 2016 UTC (8 years ago) by niro
File size: 253567 byte(s)
-linux-4.7.2
1 | diff --git a/Documentation/module-signing.txt b/Documentation/module-signing.txt |
2 | index 696d5caf4fd8..f0e3361db20c 100644 |
3 | --- a/Documentation/module-signing.txt |
4 | +++ b/Documentation/module-signing.txt |
5 | @@ -271,3 +271,9 @@ Since the private key is used to sign modules, viruses and malware could use |
6 | the private key to sign modules and compromise the operating system. The |
7 | private key must be either destroyed or moved to a secure location and not kept |
8 | in the root node of the kernel source tree. |
9 | + |
10 | +If you use the same private key to sign modules for multiple kernel |
11 | +configurations, you must ensure that the module version information is |
12 | +sufficient to prevent loading a module into a different kernel. Either |
13 | +set CONFIG_MODVERSIONS=y or ensure that each configuration has a different |
14 | +kernel release string by changing EXTRAVERSION or CONFIG_LOCALVERSION. |
15 | diff --git a/Makefile b/Makefile |
16 | index 84335c0b2eda..bb98f1ce854e 100644 |
17 | --- a/Makefile |
18 | +++ b/Makefile |
19 | @@ -1,6 +1,6 @@ |
20 | VERSION = 4 |
21 | PATCHLEVEL = 7 |
22 | -SUBLEVEL = 1 |
23 | +SUBLEVEL = 2 |
24 | EXTRAVERSION = |
25 | NAME = Psychotic Stoned Sheep |
26 | |
27 | diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h |
28 | index 858f98ef7f1b..0f92d97432a2 100644 |
29 | --- a/arch/arc/include/asm/pgtable.h |
30 | +++ b/arch/arc/include/asm/pgtable.h |
31 | @@ -110,7 +110,7 @@ |
32 | #define ___DEF (_PAGE_PRESENT | _PAGE_CACHEABLE) |
33 | |
34 | /* Set of bits not changed in pte_modify */ |
35 | -#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) |
36 | +#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_SPECIAL) |
37 | |
38 | /* More Abbrevaited helpers */ |
39 | #define PAGE_U_NONE __pgprot(___DEF) |
40 | diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c |
41 | index 73d7e4c75b7d..ab74b5d9186c 100644 |
42 | --- a/arch/arc/mm/dma.c |
43 | +++ b/arch/arc/mm/dma.c |
44 | @@ -92,7 +92,8 @@ static void *arc_dma_alloc(struct device *dev, size_t size, |
45 | static void arc_dma_free(struct device *dev, size_t size, void *vaddr, |
46 | dma_addr_t dma_handle, struct dma_attrs *attrs) |
47 | { |
48 | - struct page *page = virt_to_page(dma_handle); |
49 | + phys_addr_t paddr = plat_dma_to_phys(dev, dma_handle); |
50 | + struct page *page = virt_to_page(paddr); |
51 | int is_non_coh = 1; |
52 | |
53 | is_non_coh = dma_get_attr(DMA_ATTR_NON_CONSISTENT, attrs) || |
54 | diff --git a/arch/arm/boot/dts/arm-realview-pbx-a9.dts b/arch/arm/boot/dts/arm-realview-pbx-a9.dts |
55 | index db808f92dd79..90d00b407f85 100644 |
56 | --- a/arch/arm/boot/dts/arm-realview-pbx-a9.dts |
57 | +++ b/arch/arm/boot/dts/arm-realview-pbx-a9.dts |
58 | @@ -70,13 +70,12 @@ |
59 | * associativity as these may be erroneously set |
60 | * up by boot loader(s). |
61 | */ |
62 | - cache-size = <1048576>; // 1MB |
63 | - cache-sets = <4096>; |
64 | + cache-size = <131072>; // 128KB |
65 | + cache-sets = <512>; |
66 | cache-line-size = <32>; |
67 | arm,parity-disable; |
68 | - arm,tag-latency = <1>; |
69 | - arm,data-latency = <1 1>; |
70 | - arm,dirty-latency = <1>; |
71 | + arm,tag-latency = <1 1 1>; |
72 | + arm,data-latency = <1 1 1>; |
73 | }; |
74 | |
75 | scu: scu@1f000000 { |
76 | diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts b/arch/arm/boot/dts/sun4i-a10-a1000.dts |
77 | index c92a1ae33a1e..fa70b8fbf221 100644 |
78 | --- a/arch/arm/boot/dts/sun4i-a10-a1000.dts |
79 | +++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts |
80 | @@ -84,6 +84,7 @@ |
81 | regulator-name = "emac-3v3"; |
82 | regulator-min-microvolt = <3300000>; |
83 | regulator-max-microvolt = <3300000>; |
84 | + startup-delay-us = <20000>; |
85 | enable-active-high; |
86 | gpio = <&pio 7 15 GPIO_ACTIVE_HIGH>; |
87 | }; |
88 | diff --git a/arch/arm/boot/dts/sun4i-a10-hackberry.dts b/arch/arm/boot/dts/sun4i-a10-hackberry.dts |
89 | index 2b17c5199151..6de83a6187d0 100644 |
90 | --- a/arch/arm/boot/dts/sun4i-a10-hackberry.dts |
91 | +++ b/arch/arm/boot/dts/sun4i-a10-hackberry.dts |
92 | @@ -66,6 +66,7 @@ |
93 | regulator-name = "emac-3v3"; |
94 | regulator-min-microvolt = <3300000>; |
95 | regulator-max-microvolt = <3300000>; |
96 | + startup-delay-us = <20000>; |
97 | enable-active-high; |
98 | gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>; |
99 | }; |
100 | diff --git a/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts b/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts |
101 | index 7afc7a64eef1..e28f080b1fd5 100644 |
102 | --- a/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts |
103 | +++ b/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts |
104 | @@ -80,6 +80,7 @@ |
105 | regulator-name = "emac-3v3"; |
106 | regulator-min-microvolt = <3300000>; |
107 | regulator-max-microvolt = <3300000>; |
108 | + startup-delay-us = <20000>; |
109 | enable-active-high; |
110 | gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>; /* PH19 */ |
111 | }; |
112 | diff --git a/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts b/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts |
113 | index 9fea918f949e..39731a78f087 100644 |
114 | --- a/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts |
115 | +++ b/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts |
116 | @@ -79,6 +79,7 @@ |
117 | regulator-name = "emac-3v3"; |
118 | regulator-min-microvolt = <3300000>; |
119 | regulator-max-microvolt = <3300000>; |
120 | + startup-delay-us = <20000>; |
121 | enable-active-high; |
122 | gpio = <&pio 0 2 GPIO_ACTIVE_HIGH>; |
123 | }; |
124 | diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts |
125 | index 941f36263c8f..f4d8125c1bfc 100644 |
126 | --- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts |
127 | +++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts |
128 | @@ -1386,7 +1386,7 @@ |
129 | * Pin 41: BR_UART1_TXD |
130 | * Pin 44: BR_UART1_RXD |
131 | */ |
132 | - serial@70006000 { |
133 | + serial@0,70006000 { |
134 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
135 | status = "okay"; |
136 | }; |
137 | @@ -1398,7 +1398,7 @@ |
138 | * Pin 71: UART2_CTS_L |
139 | * Pin 74: UART2_RTS_L |
140 | */ |
141 | - serial@70006040 { |
142 | + serial@0,70006040 { |
143 | compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; |
144 | status = "okay"; |
145 | }; |
146 | diff --git a/arch/arm/configs/aspeed_g4_defconfig b/arch/arm/configs/aspeed_g4_defconfig |
147 | index b6e54ee9bdbd..ca39c04fec6b 100644 |
148 | --- a/arch/arm/configs/aspeed_g4_defconfig |
149 | +++ b/arch/arm/configs/aspeed_g4_defconfig |
150 | @@ -58,7 +58,7 @@ CONFIG_SERIAL_OF_PLATFORM=y |
151 | # CONFIG_IOMMU_SUPPORT is not set |
152 | CONFIG_FIRMWARE_MEMMAP=y |
153 | CONFIG_FANOTIFY=y |
154 | -CONFIG_PRINTK_TIME=1 |
155 | +CONFIG_PRINTK_TIME=y |
156 | CONFIG_DYNAMIC_DEBUG=y |
157 | CONFIG_STRIP_ASM_SYMS=y |
158 | CONFIG_PAGE_POISONING=y |
159 | diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig |
160 | index 892605167357..4f366b0370e9 100644 |
161 | --- a/arch/arm/configs/aspeed_g5_defconfig |
162 | +++ b/arch/arm/configs/aspeed_g5_defconfig |
163 | @@ -59,7 +59,7 @@ CONFIG_SERIAL_OF_PLATFORM=y |
164 | # CONFIG_IOMMU_SUPPORT is not set |
165 | CONFIG_FIRMWARE_MEMMAP=y |
166 | CONFIG_FANOTIFY=y |
167 | -CONFIG_PRINTK_TIME=1 |
168 | +CONFIG_PRINTK_TIME=y |
169 | CONFIG_DYNAMIC_DEBUG=y |
170 | CONFIG_STRIP_ASM_SYMS=y |
171 | CONFIG_PAGE_POISONING=y |
172 | diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
173 | index ff7ed5697d3e..d2485c749ad5 100644 |
174 | --- a/arch/arm/mm/dma-mapping.c |
175 | +++ b/arch/arm/mm/dma-mapping.c |
176 | @@ -49,6 +49,7 @@ struct arm_dma_alloc_args { |
177 | pgprot_t prot; |
178 | const void *caller; |
179 | bool want_vaddr; |
180 | + int coherent_flag; |
181 | }; |
182 | |
183 | struct arm_dma_free_args { |
184 | @@ -59,6 +60,9 @@ struct arm_dma_free_args { |
185 | bool want_vaddr; |
186 | }; |
187 | |
188 | +#define NORMAL 0 |
189 | +#define COHERENT 1 |
190 | + |
191 | struct arm_dma_allocator { |
192 | void *(*alloc)(struct arm_dma_alloc_args *args, |
193 | struct page **ret_page); |
194 | @@ -272,7 +276,7 @@ static u64 get_coherent_dma_mask(struct device *dev) |
195 | return mask; |
196 | } |
197 | |
198 | -static void __dma_clear_buffer(struct page *page, size_t size) |
199 | +static void __dma_clear_buffer(struct page *page, size_t size, int coherent_flag) |
200 | { |
201 | /* |
202 | * Ensure that the allocated pages are zeroed, and that any data |
203 | @@ -284,17 +288,21 @@ static void __dma_clear_buffer(struct page *page, size_t size) |
204 | while (size > 0) { |
205 | void *ptr = kmap_atomic(page); |
206 | memset(ptr, 0, PAGE_SIZE); |
207 | - dmac_flush_range(ptr, ptr + PAGE_SIZE); |
208 | + if (coherent_flag != COHERENT) |
209 | + dmac_flush_range(ptr, ptr + PAGE_SIZE); |
210 | kunmap_atomic(ptr); |
211 | page++; |
212 | size -= PAGE_SIZE; |
213 | } |
214 | - outer_flush_range(base, end); |
215 | + if (coherent_flag != COHERENT) |
216 | + outer_flush_range(base, end); |
217 | } else { |
218 | void *ptr = page_address(page); |
219 | memset(ptr, 0, size); |
220 | - dmac_flush_range(ptr, ptr + size); |
221 | - outer_flush_range(__pa(ptr), __pa(ptr) + size); |
222 | + if (coherent_flag != COHERENT) { |
223 | + dmac_flush_range(ptr, ptr + size); |
224 | + outer_flush_range(__pa(ptr), __pa(ptr) + size); |
225 | + } |
226 | } |
227 | } |
228 | |
229 | @@ -302,7 +310,8 @@ static void __dma_clear_buffer(struct page *page, size_t size) |
230 | * Allocate a DMA buffer for 'dev' of size 'size' using the |
231 | * specified gfp mask. Note that 'size' must be page aligned. |
232 | */ |
233 | -static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gfp) |
234 | +static struct page *__dma_alloc_buffer(struct device *dev, size_t size, |
235 | + gfp_t gfp, int coherent_flag) |
236 | { |
237 | unsigned long order = get_order(size); |
238 | struct page *page, *p, *e; |
239 | @@ -318,7 +327,7 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf |
240 | for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) |
241 | __free_page(p); |
242 | |
243 | - __dma_clear_buffer(page, size); |
244 | + __dma_clear_buffer(page, size, coherent_flag); |
245 | |
246 | return page; |
247 | } |
248 | @@ -340,7 +349,8 @@ static void __dma_free_buffer(struct page *page, size_t size) |
249 | |
250 | static void *__alloc_from_contiguous(struct device *dev, size_t size, |
251 | pgprot_t prot, struct page **ret_page, |
252 | - const void *caller, bool want_vaddr); |
253 | + const void *caller, bool want_vaddr, |
254 | + int coherent_flag); |
255 | |
256 | static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, |
257 | pgprot_t prot, struct page **ret_page, |
258 | @@ -405,10 +415,13 @@ static int __init atomic_pool_init(void) |
259 | atomic_pool = gen_pool_create(PAGE_SHIFT, -1); |
260 | if (!atomic_pool) |
261 | goto out; |
262 | - |
263 | + /* |
264 | + * The atomic pool is only used for non-coherent allocations |
265 | + * so we must pass NORMAL for coherent_flag. |
266 | + */ |
267 | if (dev_get_cma_area(NULL)) |
268 | ptr = __alloc_from_contiguous(NULL, atomic_pool_size, prot, |
269 | - &page, atomic_pool_init, true); |
270 | + &page, atomic_pool_init, true, NORMAL); |
271 | else |
272 | ptr = __alloc_remap_buffer(NULL, atomic_pool_size, gfp, prot, |
273 | &page, atomic_pool_init, true); |
274 | @@ -522,7 +535,11 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, |
275 | { |
276 | struct page *page; |
277 | void *ptr = NULL; |
278 | - page = __dma_alloc_buffer(dev, size, gfp); |
279 | + /* |
280 | + * __alloc_remap_buffer is only called when the device is |
281 | + * non-coherent |
282 | + */ |
283 | + page = __dma_alloc_buffer(dev, size, gfp, NORMAL); |
284 | if (!page) |
285 | return NULL; |
286 | if (!want_vaddr) |
287 | @@ -577,7 +594,8 @@ static int __free_from_pool(void *start, size_t size) |
288 | |
289 | static void *__alloc_from_contiguous(struct device *dev, size_t size, |
290 | pgprot_t prot, struct page **ret_page, |
291 | - const void *caller, bool want_vaddr) |
292 | + const void *caller, bool want_vaddr, |
293 | + int coherent_flag) |
294 | { |
295 | unsigned long order = get_order(size); |
296 | size_t count = size >> PAGE_SHIFT; |
297 | @@ -588,7 +606,7 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, |
298 | if (!page) |
299 | return NULL; |
300 | |
301 | - __dma_clear_buffer(page, size); |
302 | + __dma_clear_buffer(page, size, coherent_flag); |
303 | |
304 | if (!want_vaddr) |
305 | goto out; |
306 | @@ -638,7 +656,7 @@ static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot) |
307 | #define __get_dma_pgprot(attrs, prot) __pgprot(0) |
308 | #define __alloc_remap_buffer(dev, size, gfp, prot, ret, c, wv) NULL |
309 | #define __alloc_from_pool(size, ret_page) NULL |
310 | -#define __alloc_from_contiguous(dev, size, prot, ret, c, wv) NULL |
311 | +#define __alloc_from_contiguous(dev, size, prot, ret, c, wv, coherent_flag) NULL |
312 | #define __free_from_pool(cpu_addr, size) do { } while (0) |
313 | #define __free_from_contiguous(dev, page, cpu_addr, size, wv) do { } while (0) |
314 | #define __dma_free_remap(cpu_addr, size) do { } while (0) |
315 | @@ -649,7 +667,8 @@ static void *__alloc_simple_buffer(struct device *dev, size_t size, gfp_t gfp, |
316 | struct page **ret_page) |
317 | { |
318 | struct page *page; |
319 | - page = __dma_alloc_buffer(dev, size, gfp); |
320 | + /* __alloc_simple_buffer is only called when the device is coherent */ |
321 | + page = __dma_alloc_buffer(dev, size, gfp, COHERENT); |
322 | if (!page) |
323 | return NULL; |
324 | |
325 | @@ -679,7 +698,7 @@ static void *cma_allocator_alloc(struct arm_dma_alloc_args *args, |
326 | { |
327 | return __alloc_from_contiguous(args->dev, args->size, args->prot, |
328 | ret_page, args->caller, |
329 | - args->want_vaddr); |
330 | + args->want_vaddr, args->coherent_flag); |
331 | } |
332 | |
333 | static void cma_allocator_free(struct arm_dma_free_args *args) |
334 | @@ -746,6 +765,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, |
335 | .prot = prot, |
336 | .caller = caller, |
337 | .want_vaddr = !dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs), |
338 | + .coherent_flag = is_coherent ? COHERENT : NORMAL, |
339 | }; |
340 | |
341 | #ifdef CONFIG_DMA_API_DEBUG |
342 | @@ -1253,7 +1273,8 @@ static inline void __free_iova(struct dma_iommu_mapping *mapping, |
343 | static const int iommu_order_array[] = { 9, 8, 4, 0 }; |
344 | |
345 | static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, |
346 | - gfp_t gfp, struct dma_attrs *attrs) |
347 | + gfp_t gfp, struct dma_attrs *attrs, |
348 | + int coherent_flag) |
349 | { |
350 | struct page **pages; |
351 | int count = size >> PAGE_SHIFT; |
352 | @@ -1277,7 +1298,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, |
353 | if (!page) |
354 | goto error; |
355 | |
356 | - __dma_clear_buffer(page, size); |
357 | + __dma_clear_buffer(page, size, coherent_flag); |
358 | |
359 | for (i = 0; i < count; i++) |
360 | pages[i] = page + i; |
361 | @@ -1327,7 +1348,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, |
362 | pages[i + j] = pages[i] + j; |
363 | } |
364 | |
365 | - __dma_clear_buffer(pages[i], PAGE_SIZE << order); |
366 | + __dma_clear_buffer(pages[i], PAGE_SIZE << order, coherent_flag); |
367 | i += 1 << order; |
368 | count -= 1 << order; |
369 | } |
370 | @@ -1505,7 +1526,8 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, |
371 | */ |
372 | gfp &= ~(__GFP_COMP); |
373 | |
374 | - pages = __iommu_alloc_buffer(dev, size, gfp, attrs); |
375 | + /* For now always consider we are in a non-coherent case */ |
376 | + pages = __iommu_alloc_buffer(dev, size, gfp, attrs, NORMAL); |
377 | if (!pages) |
378 | return NULL; |
379 | |
380 | diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig |
381 | index 5a0a691d4220..20384925bb0f 100644 |
382 | --- a/arch/arm64/Kconfig |
383 | +++ b/arch/arm64/Kconfig |
384 | @@ -872,7 +872,7 @@ config RELOCATABLE |
385 | |
386 | config RANDOMIZE_BASE |
387 | bool "Randomize the address of the kernel image" |
388 | - select ARM64_MODULE_PLTS |
389 | + select ARM64_MODULE_PLTS if MODULES |
390 | select RELOCATABLE |
391 | help |
392 | Randomizes the virtual address at which the kernel image is |
393 | diff --git a/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/arch/arm64/boot/dts/rockchip/rk3368.dtsi |
394 | index 8b4a7c9154e9..080203e3aa2f 100644 |
395 | --- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi |
396 | +++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi |
397 | @@ -670,7 +670,7 @@ |
398 | #address-cells = <0>; |
399 | |
400 | reg = <0x0 0xffb71000 0x0 0x1000>, |
401 | - <0x0 0xffb72000 0x0 0x1000>, |
402 | + <0x0 0xffb72000 0x0 0x2000>, |
403 | <0x0 0xffb74000 0x0 0x2000>, |
404 | <0x0 0xffb76000 0x0 0x2000>; |
405 | interrupts = <GIC_PPI 9 |
406 | diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c |
407 | index 4fbf3c54275c..0800d23e2fdd 100644 |
408 | --- a/arch/arm64/kernel/debug-monitors.c |
409 | +++ b/arch/arm64/kernel/debug-monitors.c |
410 | @@ -151,7 +151,6 @@ static int debug_monitors_init(void) |
411 | /* Clear the OS lock. */ |
412 | on_each_cpu(clear_os_lock, NULL, 1); |
413 | isb(); |
414 | - local_dbg_enable(); |
415 | |
416 | /* Register hotplug handler. */ |
417 | __register_cpu_notifier(&os_lock_nb); |
418 | diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c |
419 | index 21ab5df9fa76..65d81f965e74 100644 |
420 | --- a/arch/arm64/kernel/hibernate.c |
421 | +++ b/arch/arm64/kernel/hibernate.c |
422 | @@ -35,6 +35,7 @@ |
423 | #include <asm/sections.h> |
424 | #include <asm/smp.h> |
425 | #include <asm/suspend.h> |
426 | +#include <asm/sysreg.h> |
427 | #include <asm/virt.h> |
428 | |
429 | /* |
430 | @@ -217,12 +218,22 @@ static int create_safe_exec_page(void *src_start, size_t length, |
431 | set_pte(pte, __pte(virt_to_phys((void *)dst) | |
432 | pgprot_val(PAGE_KERNEL_EXEC))); |
433 | |
434 | - /* Load our new page tables */ |
435 | - asm volatile("msr ttbr0_el1, %0;" |
436 | - "isb;" |
437 | - "tlbi vmalle1is;" |
438 | - "dsb ish;" |
439 | - "isb" : : "r"(virt_to_phys(pgd))); |
440 | + /* |
441 | + * Load our new page tables. A strict BBM approach requires that we |
442 | + * ensure that TLBs are free of any entries that may overlap with the |
443 | + * global mappings we are about to install. |
444 | + * |
445 | + * For a real hibernate/resume cycle TTBR0 currently points to a zero |
446 | + * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI |
447 | + * runtime services), while for a userspace-driven test_resume cycle it |
448 | + * points to userspace page tables (and we must point it at a zero page |
449 | + * ourselves). Elsewhere we only (un)install the idmap with preemption |
450 | + * disabled, so T0SZ should be as required regardless. |
451 | + */ |
452 | + cpu_set_reserved_ttbr0(); |
453 | + local_flush_tlb_all(); |
454 | + write_sysreg(virt_to_phys(pgd), ttbr0_el1); |
455 | + isb(); |
456 | |
457 | *phys_dst_addr = virt_to_phys((void *)dst); |
458 | |
459 | @@ -394,6 +405,38 @@ int swsusp_arch_resume(void) |
460 | void *, phys_addr_t, phys_addr_t); |
461 | |
462 | /* |
463 | + * Restoring the memory image will overwrite the ttbr1 page tables. |
464 | + * Create a second copy of just the linear map, and use this when |
465 | + * restoring. |
466 | + */ |
467 | + tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); |
468 | + if (!tmp_pg_dir) { |
469 | + pr_err("Failed to allocate memory for temporary page tables."); |
470 | + rc = -ENOMEM; |
471 | + goto out; |
472 | + } |
473 | + rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); |
474 | + if (rc) |
475 | + goto out; |
476 | + |
477 | + /* |
478 | + * Since we only copied the linear map, we need to find restore_pblist's |
479 | + * linear map address. |
480 | + */ |
481 | + lm_restore_pblist = LMADDR(restore_pblist); |
482 | + |
483 | + /* |
484 | + * We need a zero page that is zero before & after resume in order to |
485 | + * to break before make on the ttbr1 page tables. |
486 | + */ |
487 | + zero_page = (void *)get_safe_page(GFP_ATOMIC); |
488 | + if (!zero_page) { |
489 | + pr_err("Failed to allocate zero page."); |
490 | + rc = -ENOMEM; |
491 | + goto out; |
492 | + } |
493 | + |
494 | + /* |
495 | * Locate the exit code in the bottom-but-one page, so that *NULL |
496 | * still has disastrous affects. |
497 | */ |
498 | @@ -419,27 +462,6 @@ int swsusp_arch_resume(void) |
499 | __flush_dcache_area(hibernate_exit, exit_size); |
500 | |
501 | /* |
502 | - * Restoring the memory image will overwrite the ttbr1 page tables. |
503 | - * Create a second copy of just the linear map, and use this when |
504 | - * restoring. |
505 | - */ |
506 | - tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); |
507 | - if (!tmp_pg_dir) { |
508 | - pr_err("Failed to allocate memory for temporary page tables."); |
509 | - rc = -ENOMEM; |
510 | - goto out; |
511 | - } |
512 | - rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); |
513 | - if (rc) |
514 | - goto out; |
515 | - |
516 | - /* |
517 | - * Since we only copied the linear map, we need to find restore_pblist's |
518 | - * linear map address. |
519 | - */ |
520 | - lm_restore_pblist = LMADDR(restore_pblist); |
521 | - |
522 | - /* |
523 | * KASLR will cause the el2 vectors to be in a different location in |
524 | * the resumed kernel. Load hibernate's temporary copy into el2. |
525 | * |
526 | @@ -453,12 +475,6 @@ int swsusp_arch_resume(void) |
527 | __hyp_set_vectors(el2_vectors); |
528 | } |
529 | |
530 | - /* |
531 | - * We need a zero page that is zero before & after resume in order to |
532 | - * to break before make on the ttbr1 page tables. |
533 | - */ |
534 | - zero_page = (void *)get_safe_page(GFP_ATOMIC); |
535 | - |
536 | hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1, |
537 | resume_hdr.reenter_kernel, lm_restore_pblist, |
538 | resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page)); |
539 | diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c |
540 | index 62ff3c0622e2..490db85dec23 100644 |
541 | --- a/arch/arm64/kernel/smp.c |
542 | +++ b/arch/arm64/kernel/smp.c |
543 | @@ -267,7 +267,6 @@ asmlinkage void secondary_start_kernel(void) |
544 | set_cpu_online(cpu, true); |
545 | complete(&cpu_running); |
546 | |
547 | - local_dbg_enable(); |
548 | local_irq_enable(); |
549 | local_async_enable(); |
550 | |
551 | @@ -437,9 +436,9 @@ void __init smp_cpus_done(unsigned int max_cpus) |
552 | |
553 | void __init smp_prepare_boot_cpu(void) |
554 | { |
555 | + set_my_cpu_offset(per_cpu_offset(smp_processor_id())); |
556 | cpuinfo_store_boot_cpu(); |
557 | save_boot_cpu_run_el(); |
558 | - set_my_cpu_offset(per_cpu_offset(smp_processor_id())); |
559 | } |
560 | |
561 | static u64 __init of_get_cpu_mpidr(struct device_node *dn) |
562 | @@ -694,6 +693,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus) |
563 | smp_store_cpu_info(smp_processor_id()); |
564 | |
565 | /* |
566 | + * If UP is mandated by "nosmp" (which implies "maxcpus=0"), don't set |
567 | + * secondary CPUs present. |
568 | + */ |
569 | + if (max_cpus == 0) |
570 | + return; |
571 | + |
572 | + /* |
573 | * Initialise the present map (which describes the set of CPUs |
574 | * actually populated at the present time) and release the |
575 | * secondaries from the bootloader. |
576 | diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S |
577 | index 435e820e898d..e564d4595998 100644 |
578 | --- a/arch/arm64/kernel/vmlinux.lds.S |
579 | +++ b/arch/arm64/kernel/vmlinux.lds.S |
580 | @@ -181,9 +181,9 @@ SECTIONS |
581 | *(.hash) |
582 | } |
583 | |
584 | - __rela_offset = ADDR(.rela) - KIMAGE_VADDR; |
585 | + __rela_offset = ABSOLUTE(ADDR(.rela) - KIMAGE_VADDR); |
586 | __rela_size = SIZEOF(.rela); |
587 | - __dynsym_offset = ADDR(.dynsym) - KIMAGE_VADDR; |
588 | + __dynsym_offset = ABSOLUTE(ADDR(.dynsym) - KIMAGE_VADDR); |
589 | |
590 | . = ALIGN(SEGMENT_ALIGN); |
591 | __init_end = .; |
592 | diff --git a/arch/arm64/kvm/hyp/sysreg-sr.c b/arch/arm64/kvm/hyp/sysreg-sr.c |
593 | index 0f7c40eb3f53..934137647837 100644 |
594 | --- a/arch/arm64/kvm/hyp/sysreg-sr.c |
595 | +++ b/arch/arm64/kvm/hyp/sysreg-sr.c |
596 | @@ -27,8 +27,8 @@ static void __hyp_text __sysreg_do_nothing(struct kvm_cpu_context *ctxt) { } |
597 | /* |
598 | * Non-VHE: Both host and guest must save everything. |
599 | * |
600 | - * VHE: Host must save tpidr*_el[01], actlr_el1, sp0, pc, pstate, and |
601 | - * guest must save everything. |
602 | + * VHE: Host must save tpidr*_el[01], actlr_el1, mdscr_el1, sp0, pc, |
603 | + * pstate, and guest must save everything. |
604 | */ |
605 | |
606 | static void __hyp_text __sysreg_save_common_state(struct kvm_cpu_context *ctxt) |
607 | @@ -37,6 +37,7 @@ static void __hyp_text __sysreg_save_common_state(struct kvm_cpu_context *ctxt) |
608 | ctxt->sys_regs[TPIDR_EL0] = read_sysreg(tpidr_el0); |
609 | ctxt->sys_regs[TPIDRRO_EL0] = read_sysreg(tpidrro_el0); |
610 | ctxt->sys_regs[TPIDR_EL1] = read_sysreg(tpidr_el1); |
611 | + ctxt->sys_regs[MDSCR_EL1] = read_sysreg(mdscr_el1); |
612 | ctxt->gp_regs.regs.sp = read_sysreg(sp_el0); |
613 | ctxt->gp_regs.regs.pc = read_sysreg_el2(elr); |
614 | ctxt->gp_regs.regs.pstate = read_sysreg_el2(spsr); |
615 | @@ -61,7 +62,6 @@ static void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt) |
616 | ctxt->sys_regs[AMAIR_EL1] = read_sysreg_el1(amair); |
617 | ctxt->sys_regs[CNTKCTL_EL1] = read_sysreg_el1(cntkctl); |
618 | ctxt->sys_regs[PAR_EL1] = read_sysreg(par_el1); |
619 | - ctxt->sys_regs[MDSCR_EL1] = read_sysreg(mdscr_el1); |
620 | |
621 | ctxt->gp_regs.sp_el1 = read_sysreg(sp_el1); |
622 | ctxt->gp_regs.elr_el1 = read_sysreg_el1(elr); |
623 | @@ -90,6 +90,7 @@ static void __hyp_text __sysreg_restore_common_state(struct kvm_cpu_context *ctx |
624 | write_sysreg(ctxt->sys_regs[TPIDR_EL0], tpidr_el0); |
625 | write_sysreg(ctxt->sys_regs[TPIDRRO_EL0], tpidrro_el0); |
626 | write_sysreg(ctxt->sys_regs[TPIDR_EL1], tpidr_el1); |
627 | + write_sysreg(ctxt->sys_regs[MDSCR_EL1], mdscr_el1); |
628 | write_sysreg(ctxt->gp_regs.regs.sp, sp_el0); |
629 | write_sysreg_el2(ctxt->gp_regs.regs.pc, elr); |
630 | write_sysreg_el2(ctxt->gp_regs.regs.pstate, spsr); |
631 | @@ -114,7 +115,6 @@ static void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt) |
632 | write_sysreg_el1(ctxt->sys_regs[AMAIR_EL1], amair); |
633 | write_sysreg_el1(ctxt->sys_regs[CNTKCTL_EL1], cntkctl); |
634 | write_sysreg(ctxt->sys_regs[PAR_EL1], par_el1); |
635 | - write_sysreg(ctxt->sys_regs[MDSCR_EL1], mdscr_el1); |
636 | |
637 | write_sysreg(ctxt->gp_regs.sp_el1, sp_el1); |
638 | write_sysreg_el1(ctxt->gp_regs.elr_el1, elr); |
639 | diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c |
640 | index e9e0e6db73f6..898c0e6aedd4 100644 |
641 | --- a/arch/arm64/kvm/inject_fault.c |
642 | +++ b/arch/arm64/kvm/inject_fault.c |
643 | @@ -132,16 +132,14 @@ static u64 get_except_vector(struct kvm_vcpu *vcpu, enum exception_type type) |
644 | static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr) |
645 | { |
646 | unsigned long cpsr = *vcpu_cpsr(vcpu); |
647 | - bool is_aarch32; |
648 | + bool is_aarch32 = vcpu_mode_is_32bit(vcpu); |
649 | u32 esr = 0; |
650 | |
651 | - is_aarch32 = vcpu_mode_is_32bit(vcpu); |
652 | - |
653 | - *vcpu_spsr(vcpu) = cpsr; |
654 | *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu); |
655 | - |
656 | *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); |
657 | + |
658 | *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; |
659 | + *vcpu_spsr(vcpu) = cpsr; |
660 | |
661 | vcpu_sys_reg(vcpu, FAR_EL1) = addr; |
662 | |
663 | @@ -172,11 +170,11 @@ static void inject_undef64(struct kvm_vcpu *vcpu) |
664 | unsigned long cpsr = *vcpu_cpsr(vcpu); |
665 | u32 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT); |
666 | |
667 | - *vcpu_spsr(vcpu) = cpsr; |
668 | *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu); |
669 | - |
670 | *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); |
671 | + |
672 | *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; |
673 | + *vcpu_spsr(vcpu) = cpsr; |
674 | |
675 | /* |
676 | * Build an unknown exception, depending on the instruction |
677 | diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c |
678 | index 0f85a46c3e18..3e90a2cad995 100644 |
679 | --- a/arch/arm64/mm/mmu.c |
680 | +++ b/arch/arm64/mm/mmu.c |
681 | @@ -748,9 +748,9 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot) |
682 | /* |
683 | * Check whether the physical FDT address is set and meets the minimum |
684 | * alignment requirement. Since we are relying on MIN_FDT_ALIGN to be |
685 | - * at least 8 bytes so that we can always access the size field of the |
686 | - * FDT header after mapping the first chunk, double check here if that |
687 | - * is indeed the case. |
688 | + * at least 8 bytes so that we can always access the magic and size |
689 | + * fields of the FDT header after mapping the first chunk, double check |
690 | + * here if that is indeed the case. |
691 | */ |
692 | BUILD_BUG_ON(MIN_FDT_ALIGN < 8); |
693 | if (!dt_phys || dt_phys % MIN_FDT_ALIGN) |
694 | @@ -778,7 +778,7 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot) |
695 | create_mapping_noalloc(round_down(dt_phys, SWAPPER_BLOCK_SIZE), |
696 | dt_virt_base, SWAPPER_BLOCK_SIZE, prot); |
697 | |
698 | - if (fdt_check_header(dt_virt) != 0) |
699 | + if (fdt_magic(dt_virt) != FDT_MAGIC) |
700 | return NULL; |
701 | |
702 | *size = fdt_totalsize(dt_virt); |
703 | diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S |
704 | index c4317879b938..5bb61de23201 100644 |
705 | --- a/arch/arm64/mm/proc.S |
706 | +++ b/arch/arm64/mm/proc.S |
707 | @@ -180,6 +180,8 @@ ENTRY(__cpu_setup) |
708 | msr cpacr_el1, x0 // Enable FP/ASIMD |
709 | mov x0, #1 << 12 // Reset mdscr_el1 and disable |
710 | msr mdscr_el1, x0 // access to the DCC from EL0 |
711 | + isb // Unmask debug exceptions now, |
712 | + enable_dbg // since this is per-cpu |
713 | reset_pmuserenr_el0 x0 // Disable PMU access from EL0 |
714 | /* |
715 | * Memory region attributes for LPAE: |
716 | diff --git a/arch/metag/include/asm/cmpxchg_lnkget.h b/arch/metag/include/asm/cmpxchg_lnkget.h |
717 | index 0154e2807ebb..2369ad394876 100644 |
718 | --- a/arch/metag/include/asm/cmpxchg_lnkget.h |
719 | +++ b/arch/metag/include/asm/cmpxchg_lnkget.h |
720 | @@ -73,7 +73,7 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, |
721 | " DCACHE [%2], %0\n" |
722 | #endif |
723 | "2:\n" |
724 | - : "=&d" (temp), "=&da" (retval) |
725 | + : "=&d" (temp), "=&d" (retval) |
726 | : "da" (m), "bd" (old), "da" (new) |
727 | : "cc" |
728 | ); |
729 | diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c |
730 | index e4c21bbf9422..804d2a2a19fe 100644 |
731 | --- a/arch/mips/kernel/cevt-r4k.c |
732 | +++ b/arch/mips/kernel/cevt-r4k.c |
733 | @@ -276,12 +276,7 @@ int r4k_clockevent_init(void) |
734 | CLOCK_EVT_FEAT_C3STOP | |
735 | CLOCK_EVT_FEAT_PERCPU; |
736 | |
737 | - clockevent_set_clock(cd, mips_hpt_frequency); |
738 | - |
739 | - /* Calculate the min / max delta */ |
740 | - cd->max_delta_ns = clockevent_delta2ns(0x7fffffff, cd); |
741 | min_delta = calculate_min_delta(); |
742 | - cd->min_delta_ns = clockevent_delta2ns(min_delta, cd); |
743 | |
744 | cd->rating = 300; |
745 | cd->irq = irq; |
746 | @@ -289,7 +284,7 @@ int r4k_clockevent_init(void) |
747 | cd->set_next_event = mips_next_event; |
748 | cd->event_handler = mips_event_handler; |
749 | |
750 | - clockevents_register_device(cd); |
751 | + clockevents_config_and_register(cd, mips_hpt_frequency, min_delta, 0x7fffffff); |
752 | |
753 | if (cp0_timer_irq_installed) |
754 | return 0; |
755 | diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c |
756 | index 1f910563fdf6..d76275da54cb 100644 |
757 | --- a/arch/mips/kernel/csrc-r4k.c |
758 | +++ b/arch/mips/kernel/csrc-r4k.c |
759 | @@ -23,7 +23,7 @@ static struct clocksource clocksource_mips = { |
760 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
761 | }; |
762 | |
763 | -static u64 notrace r4k_read_sched_clock(void) |
764 | +static u64 __maybe_unused notrace r4k_read_sched_clock(void) |
765 | { |
766 | return read_c0_count(); |
767 | } |
768 | @@ -82,7 +82,9 @@ int __init init_r4k_clocksource(void) |
769 | |
770 | clocksource_register_hz(&clocksource_mips, mips_hpt_frequency); |
771 | |
772 | +#ifndef CONFIG_CPU_FREQ |
773 | sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency); |
774 | +#endif |
775 | |
776 | return 0; |
777 | } |
778 | diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c |
779 | index 645c8a1982a7..2b42a74ed771 100644 |
780 | --- a/arch/mips/kvm/emulate.c |
781 | +++ b/arch/mips/kvm/emulate.c |
782 | @@ -1615,8 +1615,14 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, |
783 | |
784 | preempt_disable(); |
785 | if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) { |
786 | - if (kvm_mips_host_tlb_lookup(vcpu, va) < 0) |
787 | - kvm_mips_handle_kseg0_tlb_fault(va, vcpu); |
788 | + if (kvm_mips_host_tlb_lookup(vcpu, va) < 0 && |
789 | + kvm_mips_handle_kseg0_tlb_fault(va, vcpu)) { |
790 | + kvm_err("%s: handling mapped kseg0 tlb fault for %lx, vcpu: %p, ASID: %#lx\n", |
791 | + __func__, va, vcpu, read_c0_entryhi()); |
792 | + er = EMULATE_FAIL; |
793 | + preempt_enable(); |
794 | + goto done; |
795 | + } |
796 | } else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) || |
797 | KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) { |
798 | int index; |
799 | @@ -1654,14 +1660,19 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, |
800 | run, vcpu); |
801 | preempt_enable(); |
802 | goto dont_update_pc; |
803 | - } else { |
804 | - /* |
805 | - * We fault an entry from the guest tlb to the |
806 | - * shadow host TLB |
807 | - */ |
808 | - kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, |
809 | - NULL, |
810 | - NULL); |
811 | + } |
812 | + /* |
813 | + * We fault an entry from the guest tlb to the |
814 | + * shadow host TLB |
815 | + */ |
816 | + if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, |
817 | + NULL, NULL)) { |
818 | + kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", |
819 | + __func__, va, index, vcpu, |
820 | + read_c0_entryhi()); |
821 | + er = EMULATE_FAIL; |
822 | + preempt_enable(); |
823 | + goto done; |
824 | } |
825 | } |
826 | } else { |
827 | @@ -2625,8 +2636,13 @@ enum emulation_result kvm_mips_handle_tlbmiss(unsigned long cause, |
828 | * OK we have a Guest TLB entry, now inject it into the |
829 | * shadow host TLB |
830 | */ |
831 | - kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, NULL, |
832 | - NULL); |
833 | + if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, |
834 | + NULL, NULL)) { |
835 | + kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", |
836 | + __func__, va, index, vcpu, |
837 | + read_c0_entryhi()); |
838 | + er = EMULATE_FAIL; |
839 | + } |
840 | } |
841 | } |
842 | |
843 | diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c |
844 | index ed021ae7867a..ad2270ff83d1 100644 |
845 | --- a/arch/mips/kvm/tlb.c |
846 | +++ b/arch/mips/kvm/tlb.c |
847 | @@ -284,7 +284,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr, |
848 | } |
849 | |
850 | gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT); |
851 | - if (gfn >= kvm->arch.guest_pmap_npages) { |
852 | + if ((gfn | 1) >= kvm->arch.guest_pmap_npages) { |
853 | kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__, |
854 | gfn, badvaddr); |
855 | kvm_mips_dump_host_tlbs(); |
856 | @@ -373,26 +373,40 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, |
857 | unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; |
858 | struct kvm *kvm = vcpu->kvm; |
859 | kvm_pfn_t pfn0, pfn1; |
860 | + gfn_t gfn0, gfn1; |
861 | + long tlb_lo[2]; |
862 | int ret; |
863 | |
864 | - if ((tlb->tlb_hi & VPN2_MASK) == 0) { |
865 | - pfn0 = 0; |
866 | - pfn1 = 0; |
867 | - } else { |
868 | - if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo0) |
869 | - >> PAGE_SHIFT) < 0) |
870 | - return -1; |
871 | - |
872 | - if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo1) |
873 | - >> PAGE_SHIFT) < 0) |
874 | - return -1; |
875 | - |
876 | - pfn0 = kvm->arch.guest_pmap[mips3_tlbpfn_to_paddr(tlb->tlb_lo0) |
877 | - >> PAGE_SHIFT]; |
878 | - pfn1 = kvm->arch.guest_pmap[mips3_tlbpfn_to_paddr(tlb->tlb_lo1) |
879 | - >> PAGE_SHIFT]; |
880 | + tlb_lo[0] = tlb->tlb_lo0; |
881 | + tlb_lo[1] = tlb->tlb_lo1; |
882 | + |
883 | + /* |
884 | + * The commpage address must not be mapped to anything else if the guest |
885 | + * TLB contains entries nearby, or commpage accesses will break. |
886 | + */ |
887 | + if (!((tlb->tlb_hi ^ KVM_GUEST_COMMPAGE_ADDR) & |
888 | + VPN2_MASK & (PAGE_MASK << 1))) |
889 | + tlb_lo[(KVM_GUEST_COMMPAGE_ADDR >> PAGE_SHIFT) & 1] = 0; |
890 | + |
891 | + gfn0 = mips3_tlbpfn_to_paddr(tlb_lo[0]) >> PAGE_SHIFT; |
892 | + gfn1 = mips3_tlbpfn_to_paddr(tlb_lo[1]) >> PAGE_SHIFT; |
893 | + if (gfn0 >= kvm->arch.guest_pmap_npages || |
894 | + gfn1 >= kvm->arch.guest_pmap_npages) { |
895 | + kvm_err("%s: Invalid gfn: [%#llx, %#llx], EHi: %#lx\n", |
896 | + __func__, gfn0, gfn1, tlb->tlb_hi); |
897 | + kvm_mips_dump_guest_tlbs(vcpu); |
898 | + return -1; |
899 | } |
900 | |
901 | + if (kvm_mips_map_page(kvm, gfn0) < 0) |
902 | + return -1; |
903 | + |
904 | + if (kvm_mips_map_page(kvm, gfn1) < 0) |
905 | + return -1; |
906 | + |
907 | + pfn0 = kvm->arch.guest_pmap[gfn0]; |
908 | + pfn1 = kvm->arch.guest_pmap[gfn1]; |
909 | + |
910 | if (hpa0) |
911 | *hpa0 = pfn0 << PAGE_SHIFT; |
912 | |
913 | @@ -401,9 +415,9 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, |
914 | |
915 | /* Get attributes from the Guest TLB */ |
916 | entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) | |
917 | - (tlb->tlb_lo0 & MIPS3_PG_D) | (tlb->tlb_lo0 & MIPS3_PG_V); |
918 | + (tlb_lo[0] & MIPS3_PG_D) | (tlb_lo[0] & MIPS3_PG_V); |
919 | entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | (0x3 << 3) | |
920 | - (tlb->tlb_lo1 & MIPS3_PG_D) | (tlb->tlb_lo1 & MIPS3_PG_V); |
921 | + (tlb_lo[1] & MIPS3_PG_D) | (tlb_lo[1] & MIPS3_PG_V); |
922 | |
923 | kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, |
924 | tlb->tlb_lo0, tlb->tlb_lo1); |
925 | @@ -776,10 +790,16 @@ uint32_t kvm_get_inst(uint32_t *opc, struct kvm_vcpu *vcpu) |
926 | local_irq_restore(flags); |
927 | return KVM_INVALID_INST; |
928 | } |
929 | - kvm_mips_handle_mapped_seg_tlb_fault(vcpu, |
930 | - &vcpu->arch. |
931 | - guest_tlb[index], |
932 | - NULL, NULL); |
933 | + if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, |
934 | + &vcpu->arch.guest_tlb[index], |
935 | + NULL, NULL)) { |
936 | + kvm_err("%s: handling mapped seg tlb fault failed for %p, index: %u, vcpu: %p, ASID: %#lx\n", |
937 | + __func__, opc, index, vcpu, |
938 | + read_c0_entryhi()); |
939 | + kvm_mips_dump_guest_tlbs(vcpu); |
940 | + local_irq_restore(flags); |
941 | + return KVM_INVALID_INST; |
942 | + } |
943 | inst = *(opc); |
944 | } |
945 | local_irq_restore(flags); |
946 | diff --git a/arch/mips/loongson64/loongson-3/hpet.c b/arch/mips/loongson64/loongson-3/hpet.c |
947 | index 249039af66c4..4788bea62a6a 100644 |
948 | --- a/arch/mips/loongson64/loongson-3/hpet.c |
949 | +++ b/arch/mips/loongson64/loongson-3/hpet.c |
950 | @@ -13,8 +13,8 @@ |
951 | #define SMBUS_PCI_REG64 0x64 |
952 | #define SMBUS_PCI_REGB4 0xb4 |
953 | |
954 | -#define HPET_MIN_CYCLES 64 |
955 | -#define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1)) |
956 | +#define HPET_MIN_CYCLES 16 |
957 | +#define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES * 12) |
958 | |
959 | static DEFINE_SPINLOCK(hpet_lock); |
960 | DEFINE_PER_CPU(struct clock_event_device, hpet_clockevent_device); |
961 | @@ -157,14 +157,14 @@ static int hpet_tick_resume(struct clock_event_device *evt) |
962 | static int hpet_next_event(unsigned long delta, |
963 | struct clock_event_device *evt) |
964 | { |
965 | - unsigned int cnt; |
966 | - int res; |
967 | + u32 cnt; |
968 | + s32 res; |
969 | |
970 | cnt = hpet_read(HPET_COUNTER); |
971 | - cnt += delta; |
972 | + cnt += (u32) delta; |
973 | hpet_write(HPET_T0_CMP, cnt); |
974 | |
975 | - res = (int)(cnt - hpet_read(HPET_COUNTER)); |
976 | + res = (s32)(cnt - hpet_read(HPET_COUNTER)); |
977 | |
978 | return res < HPET_MIN_CYCLES ? -ETIME : 0; |
979 | } |
980 | @@ -230,7 +230,7 @@ void __init setup_hpet_timer(void) |
981 | |
982 | cd = &per_cpu(hpet_clockevent_device, cpu); |
983 | cd->name = "hpet"; |
984 | - cd->rating = 320; |
985 | + cd->rating = 100; |
986 | cd->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; |
987 | cd->set_state_shutdown = hpet_set_state_shutdown; |
988 | cd->set_state_periodic = hpet_set_state_periodic; |
989 | diff --git a/arch/mips/mm/uasm-mips.c b/arch/mips/mm/uasm-mips.c |
990 | index 9c2220a45189..45e3b8799ed0 100644 |
991 | --- a/arch/mips/mm/uasm-mips.c |
992 | +++ b/arch/mips/mm/uasm-mips.c |
993 | @@ -65,7 +65,7 @@ static struct insn insn_table[] = { |
994 | #ifndef CONFIG_CPU_MIPSR6 |
995 | { insn_cache, M(cache_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
996 | #else |
997 | - { insn_cache, M6(cache_op, 0, 0, 0, cache6_op), RS | RT | SIMM9 }, |
998 | + { insn_cache, M6(spec3_op, 0, 0, 0, cache6_op), RS | RT | SIMM9 }, |
999 | #endif |
1000 | { insn_daddiu, M(daddiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
1001 | { insn_daddu, M(spec_op, 0, 0, 0, 0, daddu_op), RS | RT | RD }, |
1002 | diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S |
1003 | index b7019b559ddb..298afcf3bf2a 100644 |
1004 | --- a/arch/powerpc/kernel/tm.S |
1005 | +++ b/arch/powerpc/kernel/tm.S |
1006 | @@ -338,8 +338,6 @@ _GLOBAL(__tm_recheckpoint) |
1007 | */ |
1008 | subi r7, r7, STACK_FRAME_OVERHEAD |
1009 | |
1010 | - SET_SCRATCH0(r1) |
1011 | - |
1012 | mfmsr r6 |
1013 | /* R4 = original MSR to indicate whether thread used FP/Vector etc. */ |
1014 | |
1015 | @@ -468,6 +466,7 @@ restore_gprs: |
1016 | * until we turn MSR RI back on. |
1017 | */ |
1018 | |
1019 | + SET_SCRATCH0(r1) |
1020 | ld r5, -8(r1) |
1021 | ld r1, -16(r1) |
1022 | |
1023 | diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
1024 | index e571ad277398..38e108eaeafe 100644 |
1025 | --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
1026 | +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
1027 | @@ -655,112 +655,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
1028 | |
1029 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1030 | BEGIN_FTR_SECTION |
1031 | - b skip_tm |
1032 | -END_FTR_SECTION_IFCLR(CPU_FTR_TM) |
1033 | - |
1034 | - /* Turn on TM/FP/VSX/VMX so we can restore them. */ |
1035 | - mfmsr r5 |
1036 | - li r6, MSR_TM >> 32 |
1037 | - sldi r6, r6, 32 |
1038 | - or r5, r5, r6 |
1039 | - ori r5, r5, MSR_FP |
1040 | - oris r5, r5, (MSR_VEC | MSR_VSX)@h |
1041 | - mtmsrd r5 |
1042 | - |
1043 | - /* |
1044 | - * The user may change these outside of a transaction, so they must |
1045 | - * always be context switched. |
1046 | - */ |
1047 | - ld r5, VCPU_TFHAR(r4) |
1048 | - ld r6, VCPU_TFIAR(r4) |
1049 | - ld r7, VCPU_TEXASR(r4) |
1050 | - mtspr SPRN_TFHAR, r5 |
1051 | - mtspr SPRN_TFIAR, r6 |
1052 | - mtspr SPRN_TEXASR, r7 |
1053 | - |
1054 | - ld r5, VCPU_MSR(r4) |
1055 | - rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 |
1056 | - beq skip_tm /* TM not active in guest */ |
1057 | - |
1058 | - /* Make sure the failure summary is set, otherwise we'll program check |
1059 | - * when we trechkpt. It's possible that this might have been not set |
1060 | - * on a kvmppc_set_one_reg() call but we shouldn't let this crash the |
1061 | - * host. |
1062 | - */ |
1063 | - oris r7, r7, (TEXASR_FS)@h |
1064 | - mtspr SPRN_TEXASR, r7 |
1065 | - |
1066 | - /* |
1067 | - * We need to load up the checkpointed state for the guest. |
1068 | - * We need to do this early as it will blow away any GPRs, VSRs and |
1069 | - * some SPRs. |
1070 | - */ |
1071 | - |
1072 | - mr r31, r4 |
1073 | - addi r3, r31, VCPU_FPRS_TM |
1074 | - bl load_fp_state |
1075 | - addi r3, r31, VCPU_VRS_TM |
1076 | - bl load_vr_state |
1077 | - mr r4, r31 |
1078 | - lwz r7, VCPU_VRSAVE_TM(r4) |
1079 | - mtspr SPRN_VRSAVE, r7 |
1080 | - |
1081 | - ld r5, VCPU_LR_TM(r4) |
1082 | - lwz r6, VCPU_CR_TM(r4) |
1083 | - ld r7, VCPU_CTR_TM(r4) |
1084 | - ld r8, VCPU_AMR_TM(r4) |
1085 | - ld r9, VCPU_TAR_TM(r4) |
1086 | - mtlr r5 |
1087 | - mtcr r6 |
1088 | - mtctr r7 |
1089 | - mtspr SPRN_AMR, r8 |
1090 | - mtspr SPRN_TAR, r9 |
1091 | - |
1092 | - /* |
1093 | - * Load up PPR and DSCR values but don't put them in the actual SPRs |
1094 | - * till the last moment to avoid running with userspace PPR and DSCR for |
1095 | - * too long. |
1096 | - */ |
1097 | - ld r29, VCPU_DSCR_TM(r4) |
1098 | - ld r30, VCPU_PPR_TM(r4) |
1099 | - |
1100 | - std r2, PACATMSCRATCH(r13) /* Save TOC */ |
1101 | - |
1102 | - /* Clear the MSR RI since r1, r13 are all going to be foobar. */ |
1103 | - li r5, 0 |
1104 | - mtmsrd r5, 1 |
1105 | - |
1106 | - /* Load GPRs r0-r28 */ |
1107 | - reg = 0 |
1108 | - .rept 29 |
1109 | - ld reg, VCPU_GPRS_TM(reg)(r31) |
1110 | - reg = reg + 1 |
1111 | - .endr |
1112 | - |
1113 | - mtspr SPRN_DSCR, r29 |
1114 | - mtspr SPRN_PPR, r30 |
1115 | - |
1116 | - /* Load final GPRs */ |
1117 | - ld 29, VCPU_GPRS_TM(29)(r31) |
1118 | - ld 30, VCPU_GPRS_TM(30)(r31) |
1119 | - ld 31, VCPU_GPRS_TM(31)(r31) |
1120 | - |
1121 | - /* TM checkpointed state is now setup. All GPRs are now volatile. */ |
1122 | - TRECHKPT |
1123 | - |
1124 | - /* Now let's get back the state we need. */ |
1125 | - HMT_MEDIUM |
1126 | - GET_PACA(r13) |
1127 | - ld r29, HSTATE_DSCR(r13) |
1128 | - mtspr SPRN_DSCR, r29 |
1129 | - ld r4, HSTATE_KVM_VCPU(r13) |
1130 | - ld r1, HSTATE_HOST_R1(r13) |
1131 | - ld r2, PACATMSCRATCH(r13) |
1132 | - |
1133 | - /* Set the MSR RI since we have our registers back. */ |
1134 | - li r5, MSR_RI |
1135 | - mtmsrd r5, 1 |
1136 | -skip_tm: |
1137 | + bl kvmppc_restore_tm |
1138 | +END_FTR_SECTION_IFSET(CPU_FTR_TM) |
1139 | #endif |
1140 | |
1141 | /* Load guest PMU registers */ |
1142 | @@ -841,12 +737,6 @@ BEGIN_FTR_SECTION |
1143 | /* Skip next section on POWER7 */ |
1144 | b 8f |
1145 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
1146 | - /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */ |
1147 | - mfmsr r8 |
1148 | - li r0, 1 |
1149 | - rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG |
1150 | - mtmsrd r8 |
1151 | - |
1152 | /* Load up POWER8-specific registers */ |
1153 | ld r5, VCPU_IAMR(r4) |
1154 | lwz r6, VCPU_PSPB(r4) |
1155 | @@ -1436,106 +1326,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
1156 | |
1157 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1158 | BEGIN_FTR_SECTION |
1159 | - b 2f |
1160 | -END_FTR_SECTION_IFCLR(CPU_FTR_TM) |
1161 | - /* Turn on TM. */ |
1162 | - mfmsr r8 |
1163 | - li r0, 1 |
1164 | - rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG |
1165 | - mtmsrd r8 |
1166 | - |
1167 | - ld r5, VCPU_MSR(r9) |
1168 | - rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 |
1169 | - beq 1f /* TM not active in guest. */ |
1170 | - |
1171 | - li r3, TM_CAUSE_KVM_RESCHED |
1172 | - |
1173 | - /* Clear the MSR RI since r1, r13 are all going to be foobar. */ |
1174 | - li r5, 0 |
1175 | - mtmsrd r5, 1 |
1176 | - |
1177 | - /* All GPRs are volatile at this point. */ |
1178 | - TRECLAIM(R3) |
1179 | - |
1180 | - /* Temporarily store r13 and r9 so we have some regs to play with */ |
1181 | - SET_SCRATCH0(r13) |
1182 | - GET_PACA(r13) |
1183 | - std r9, PACATMSCRATCH(r13) |
1184 | - ld r9, HSTATE_KVM_VCPU(r13) |
1185 | - |
1186 | - /* Get a few more GPRs free. */ |
1187 | - std r29, VCPU_GPRS_TM(29)(r9) |
1188 | - std r30, VCPU_GPRS_TM(30)(r9) |
1189 | - std r31, VCPU_GPRS_TM(31)(r9) |
1190 | - |
1191 | - /* Save away PPR and DSCR soon so don't run with user values. */ |
1192 | - mfspr r31, SPRN_PPR |
1193 | - HMT_MEDIUM |
1194 | - mfspr r30, SPRN_DSCR |
1195 | - ld r29, HSTATE_DSCR(r13) |
1196 | - mtspr SPRN_DSCR, r29 |
1197 | - |
1198 | - /* Save all but r9, r13 & r29-r31 */ |
1199 | - reg = 0 |
1200 | - .rept 29 |
1201 | - .if (reg != 9) && (reg != 13) |
1202 | - std reg, VCPU_GPRS_TM(reg)(r9) |
1203 | - .endif |
1204 | - reg = reg + 1 |
1205 | - .endr |
1206 | - /* ... now save r13 */ |
1207 | - GET_SCRATCH0(r4) |
1208 | - std r4, VCPU_GPRS_TM(13)(r9) |
1209 | - /* ... and save r9 */ |
1210 | - ld r4, PACATMSCRATCH(r13) |
1211 | - std r4, VCPU_GPRS_TM(9)(r9) |
1212 | - |
1213 | - /* Reload stack pointer and TOC. */ |
1214 | - ld r1, HSTATE_HOST_R1(r13) |
1215 | - ld r2, PACATOC(r13) |
1216 | - |
1217 | - /* Set MSR RI now we have r1 and r13 back. */ |
1218 | - li r5, MSR_RI |
1219 | - mtmsrd r5, 1 |
1220 | - |
1221 | - /* Save away checkpinted SPRs. */ |
1222 | - std r31, VCPU_PPR_TM(r9) |
1223 | - std r30, VCPU_DSCR_TM(r9) |
1224 | - mflr r5 |
1225 | - mfcr r6 |
1226 | - mfctr r7 |
1227 | - mfspr r8, SPRN_AMR |
1228 | - mfspr r10, SPRN_TAR |
1229 | - std r5, VCPU_LR_TM(r9) |
1230 | - stw r6, VCPU_CR_TM(r9) |
1231 | - std r7, VCPU_CTR_TM(r9) |
1232 | - std r8, VCPU_AMR_TM(r9) |
1233 | - std r10, VCPU_TAR_TM(r9) |
1234 | - |
1235 | - /* Restore r12 as trap number. */ |
1236 | - lwz r12, VCPU_TRAP(r9) |
1237 | - |
1238 | - /* Save FP/VSX. */ |
1239 | - addi r3, r9, VCPU_FPRS_TM |
1240 | - bl store_fp_state |
1241 | - addi r3, r9, VCPU_VRS_TM |
1242 | - bl store_vr_state |
1243 | - mfspr r6, SPRN_VRSAVE |
1244 | - stw r6, VCPU_VRSAVE_TM(r9) |
1245 | -1: |
1246 | - /* |
1247 | - * We need to save these SPRs after the treclaim so that the software |
1248 | - * error code is recorded correctly in the TEXASR. Also the user may |
1249 | - * change these outside of a transaction, so they must always be |
1250 | - * context switched. |
1251 | - */ |
1252 | - mfspr r5, SPRN_TFHAR |
1253 | - mfspr r6, SPRN_TFIAR |
1254 | - mfspr r7, SPRN_TEXASR |
1255 | - std r5, VCPU_TFHAR(r9) |
1256 | - std r6, VCPU_TFIAR(r9) |
1257 | - std r7, VCPU_TEXASR(r9) |
1258 | -2: |
1259 | + bl kvmppc_save_tm |
1260 | +END_FTR_SECTION_IFSET(CPU_FTR_TM) |
1261 | #endif |
1262 | |
1263 | /* Increment yield count if they have a VPA */ |
1264 | @@ -2245,6 +2037,13 @@ _GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */ |
1265 | /* save FP state */ |
1266 | bl kvmppc_save_fp |
1267 | |
1268 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1269 | +BEGIN_FTR_SECTION |
1270 | + ld r9, HSTATE_KVM_VCPU(r13) |
1271 | + bl kvmppc_save_tm |
1272 | +END_FTR_SECTION_IFSET(CPU_FTR_TM) |
1273 | +#endif |
1274 | + |
1275 | /* |
1276 | * Set DEC to the smaller of DEC and HDEC, so that we wake |
1277 | * no later than the end of our timeslice (HDEC interrupts |
1278 | @@ -2321,6 +2120,12 @@ kvm_end_cede: |
1279 | bl kvmhv_accumulate_time |
1280 | #endif |
1281 | |
1282 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1283 | +BEGIN_FTR_SECTION |
1284 | + bl kvmppc_restore_tm |
1285 | +END_FTR_SECTION_IFSET(CPU_FTR_TM) |
1286 | +#endif |
1287 | + |
1288 | /* load up FP state */ |
1289 | bl kvmppc_load_fp |
1290 | |
1291 | @@ -2631,6 +2436,239 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
1292 | mr r4,r31 |
1293 | blr |
1294 | |
1295 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1296 | +/* |
1297 | + * Save transactional state and TM-related registers. |
1298 | + * Called with r9 pointing to the vcpu struct. |
1299 | + * This can modify all checkpointed registers, but |
1300 | + * restores r1, r2 and r9 (vcpu pointer) before exit. |
1301 | + */ |
1302 | +kvmppc_save_tm: |
1303 | + mflr r0 |
1304 | + std r0, PPC_LR_STKOFF(r1) |
1305 | + |
1306 | + /* Turn on TM. */ |
1307 | + mfmsr r8 |
1308 | + li r0, 1 |
1309 | + rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG |
1310 | + mtmsrd r8 |
1311 | + |
1312 | + ld r5, VCPU_MSR(r9) |
1313 | + rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 |
1314 | + beq 1f /* TM not active in guest. */ |
1315 | + |
1316 | + std r1, HSTATE_HOST_R1(r13) |
1317 | + li r3, TM_CAUSE_KVM_RESCHED |
1318 | + |
1319 | + /* Clear the MSR RI since r1, r13 are all going to be foobar. */ |
1320 | + li r5, 0 |
1321 | + mtmsrd r5, 1 |
1322 | + |
1323 | + /* All GPRs are volatile at this point. */ |
1324 | + TRECLAIM(R3) |
1325 | + |
1326 | + /* Temporarily store r13 and r9 so we have some regs to play with */ |
1327 | + SET_SCRATCH0(r13) |
1328 | + GET_PACA(r13) |
1329 | + std r9, PACATMSCRATCH(r13) |
1330 | + ld r9, HSTATE_KVM_VCPU(r13) |
1331 | + |
1332 | + /* Get a few more GPRs free. */ |
1333 | + std r29, VCPU_GPRS_TM(29)(r9) |
1334 | + std r30, VCPU_GPRS_TM(30)(r9) |
1335 | + std r31, VCPU_GPRS_TM(31)(r9) |
1336 | + |
1337 | + /* Save away PPR and DSCR soon so don't run with user values. */ |
1338 | + mfspr r31, SPRN_PPR |
1339 | + HMT_MEDIUM |
1340 | + mfspr r30, SPRN_DSCR |
1341 | + ld r29, HSTATE_DSCR(r13) |
1342 | + mtspr SPRN_DSCR, r29 |
1343 | + |
1344 | + /* Save all but r9, r13 & r29-r31 */ |
1345 | + reg = 0 |
1346 | + .rept 29 |
1347 | + .if (reg != 9) && (reg != 13) |
1348 | + std reg, VCPU_GPRS_TM(reg)(r9) |
1349 | + .endif |
1350 | + reg = reg + 1 |
1351 | + .endr |
1352 | + /* ... now save r13 */ |
1353 | + GET_SCRATCH0(r4) |
1354 | + std r4, VCPU_GPRS_TM(13)(r9) |
1355 | + /* ... and save r9 */ |
1356 | + ld r4, PACATMSCRATCH(r13) |
1357 | + std r4, VCPU_GPRS_TM(9)(r9) |
1358 | + |
1359 | + /* Reload stack pointer and TOC. */ |
1360 | + ld r1, HSTATE_HOST_R1(r13) |
1361 | + ld r2, PACATOC(r13) |
1362 | + |
1363 | + /* Set MSR RI now we have r1 and r13 back. */ |
1364 | + li r5, MSR_RI |
1365 | + mtmsrd r5, 1 |
1366 | + |
1367 | + /* Save away checkpinted SPRs. */ |
1368 | + std r31, VCPU_PPR_TM(r9) |
1369 | + std r30, VCPU_DSCR_TM(r9) |
1370 | + mflr r5 |
1371 | + mfcr r6 |
1372 | + mfctr r7 |
1373 | + mfspr r8, SPRN_AMR |
1374 | + mfspr r10, SPRN_TAR |
1375 | + std r5, VCPU_LR_TM(r9) |
1376 | + stw r6, VCPU_CR_TM(r9) |
1377 | + std r7, VCPU_CTR_TM(r9) |
1378 | + std r8, VCPU_AMR_TM(r9) |
1379 | + std r10, VCPU_TAR_TM(r9) |
1380 | + |
1381 | + /* Restore r12 as trap number. */ |
1382 | + lwz r12, VCPU_TRAP(r9) |
1383 | + |
1384 | + /* Save FP/VSX. */ |
1385 | + addi r3, r9, VCPU_FPRS_TM |
1386 | + bl store_fp_state |
1387 | + addi r3, r9, VCPU_VRS_TM |
1388 | + bl store_vr_state |
1389 | + mfspr r6, SPRN_VRSAVE |
1390 | + stw r6, VCPU_VRSAVE_TM(r9) |
1391 | +1: |
1392 | + /* |
1393 | + * We need to save these SPRs after the treclaim so that the software |
1394 | + * error code is recorded correctly in the TEXASR. Also the user may |
1395 | + * change these outside of a transaction, so they must always be |
1396 | + * context switched. |
1397 | + */ |
1398 | + mfspr r5, SPRN_TFHAR |
1399 | + mfspr r6, SPRN_TFIAR |
1400 | + mfspr r7, SPRN_TEXASR |
1401 | + std r5, VCPU_TFHAR(r9) |
1402 | + std r6, VCPU_TFIAR(r9) |
1403 | + std r7, VCPU_TEXASR(r9) |
1404 | + |
1405 | + ld r0, PPC_LR_STKOFF(r1) |
1406 | + mtlr r0 |
1407 | + blr |
1408 | + |
1409 | +/* |
1410 | + * Restore transactional state and TM-related registers. |
1411 | + * Called with r4 pointing to the vcpu struct. |
1412 | + * This potentially modifies all checkpointed registers. |
1413 | + * It restores r1, r2, r4 from the PACA. |
1414 | + */ |
1415 | +kvmppc_restore_tm: |
1416 | + mflr r0 |
1417 | + std r0, PPC_LR_STKOFF(r1) |
1418 | + |
1419 | + /* Turn on TM/FP/VSX/VMX so we can restore them. */ |
1420 | + mfmsr r5 |
1421 | + li r6, MSR_TM >> 32 |
1422 | + sldi r6, r6, 32 |
1423 | + or r5, r5, r6 |
1424 | + ori r5, r5, MSR_FP |
1425 | + oris r5, r5, (MSR_VEC | MSR_VSX)@h |
1426 | + mtmsrd r5 |
1427 | + |
1428 | + /* |
1429 | + * The user may change these outside of a transaction, so they must |
1430 | + * always be context switched. |
1431 | + */ |
1432 | + ld r5, VCPU_TFHAR(r4) |
1433 | + ld r6, VCPU_TFIAR(r4) |
1434 | + ld r7, VCPU_TEXASR(r4) |
1435 | + mtspr SPRN_TFHAR, r5 |
1436 | + mtspr SPRN_TFIAR, r6 |
1437 | + mtspr SPRN_TEXASR, r7 |
1438 | + |
1439 | + ld r5, VCPU_MSR(r4) |
1440 | + rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 |
1441 | + beqlr /* TM not active in guest */ |
1442 | + std r1, HSTATE_HOST_R1(r13) |
1443 | + |
1444 | + /* Make sure the failure summary is set, otherwise we'll program check |
1445 | + * when we trechkpt. It's possible that this might have been not set |
1446 | + * on a kvmppc_set_one_reg() call but we shouldn't let this crash the |
1447 | + * host. |
1448 | + */ |
1449 | + oris r7, r7, (TEXASR_FS)@h |
1450 | + mtspr SPRN_TEXASR, r7 |
1451 | + |
1452 | + /* |
1453 | + * We need to load up the checkpointed state for the guest. |
1454 | + * We need to do this early as it will blow away any GPRs, VSRs and |
1455 | + * some SPRs. |
1456 | + */ |
1457 | + |
1458 | + mr r31, r4 |
1459 | + addi r3, r31, VCPU_FPRS_TM |
1460 | + bl load_fp_state |
1461 | + addi r3, r31, VCPU_VRS_TM |
1462 | + bl load_vr_state |
1463 | + mr r4, r31 |
1464 | + lwz r7, VCPU_VRSAVE_TM(r4) |
1465 | + mtspr SPRN_VRSAVE, r7 |
1466 | + |
1467 | + ld r5, VCPU_LR_TM(r4) |
1468 | + lwz r6, VCPU_CR_TM(r4) |
1469 | + ld r7, VCPU_CTR_TM(r4) |
1470 | + ld r8, VCPU_AMR_TM(r4) |
1471 | + ld r9, VCPU_TAR_TM(r4) |
1472 | + mtlr r5 |
1473 | + mtcr r6 |
1474 | + mtctr r7 |
1475 | + mtspr SPRN_AMR, r8 |
1476 | + mtspr SPRN_TAR, r9 |
1477 | + |
1478 | + /* |
1479 | + * Load up PPR and DSCR values but don't put them in the actual SPRs |
1480 | + * till the last moment to avoid running with userspace PPR and DSCR for |
1481 | + * too long. |
1482 | + */ |
1483 | + ld r29, VCPU_DSCR_TM(r4) |
1484 | + ld r30, VCPU_PPR_TM(r4) |
1485 | + |
1486 | + std r2, PACATMSCRATCH(r13) /* Save TOC */ |
1487 | + |
1488 | + /* Clear the MSR RI since r1, r13 are all going to be foobar. */ |
1489 | + li r5, 0 |
1490 | + mtmsrd r5, 1 |
1491 | + |
1492 | + /* Load GPRs r0-r28 */ |
1493 | + reg = 0 |
1494 | + .rept 29 |
1495 | + ld reg, VCPU_GPRS_TM(reg)(r31) |
1496 | + reg = reg + 1 |
1497 | + .endr |
1498 | + |
1499 | + mtspr SPRN_DSCR, r29 |
1500 | + mtspr SPRN_PPR, r30 |
1501 | + |
1502 | + /* Load final GPRs */ |
1503 | + ld 29, VCPU_GPRS_TM(29)(r31) |
1504 | + ld 30, VCPU_GPRS_TM(30)(r31) |
1505 | + ld 31, VCPU_GPRS_TM(31)(r31) |
1506 | + |
1507 | + /* TM checkpointed state is now setup. All GPRs are now volatile. */ |
1508 | + TRECHKPT |
1509 | + |
1510 | + /* Now let's get back the state we need. */ |
1511 | + HMT_MEDIUM |
1512 | + GET_PACA(r13) |
1513 | + ld r29, HSTATE_DSCR(r13) |
1514 | + mtspr SPRN_DSCR, r29 |
1515 | + ld r4, HSTATE_KVM_VCPU(r13) |
1516 | + ld r1, HSTATE_HOST_R1(r13) |
1517 | + ld r2, PACATMSCRATCH(r13) |
1518 | + |
1519 | + /* Set the MSR RI since we have our registers back. */ |
1520 | + li r5, MSR_RI |
1521 | + mtmsrd r5, 1 |
1522 | + |
1523 | + ld r0, PPC_LR_STKOFF(r1) |
1524 | + mtlr r0 |
1525 | + blr |
1526 | +#endif |
1527 | + |
1528 | /* |
1529 | * We come here if we get any exception or interrupt while we are |
1530 | * executing host real mode code while in guest MMU context. |
1531 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h |
1532 | index 18d2beb89340..42b968a85863 100644 |
1533 | --- a/arch/s390/include/asm/pgtable.h |
1534 | +++ b/arch/s390/include/asm/pgtable.h |
1535 | @@ -893,7 +893,7 @@ void ptep_zap_key(struct mm_struct *mm, unsigned long addr, pte_t *ptep); |
1536 | bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long address); |
1537 | int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, |
1538 | unsigned char key, bool nq); |
1539 | -unsigned char get_guest_storage_key(struct mm_struct *mm, unsigned long addr); |
1540 | +unsigned long get_guest_storage_key(struct mm_struct *mm, unsigned long addr); |
1541 | |
1542 | /* |
1543 | * Certain architectures need to do special things when PTEs |
1544 | diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h |
1545 | index a2e6ef32e054..0a2031618f7f 100644 |
1546 | --- a/arch/s390/include/asm/tlbflush.h |
1547 | +++ b/arch/s390/include/asm/tlbflush.h |
1548 | @@ -81,7 +81,8 @@ static inline void __tlb_flush_full(struct mm_struct *mm) |
1549 | } |
1550 | |
1551 | /* |
1552 | - * Flush TLB entries for a specific ASCE on all CPUs. |
1553 | + * Flush TLB entries for a specific ASCE on all CPUs. Should never be used |
1554 | + * when more than one asce (e.g. gmap) ran on this mm. |
1555 | */ |
1556 | static inline void __tlb_flush_asce(struct mm_struct *mm, unsigned long asce) |
1557 | { |
1558 | diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c |
1559 | index cace818d86eb..313c3b8cf7dd 100644 |
1560 | --- a/arch/s390/mm/gmap.c |
1561 | +++ b/arch/s390/mm/gmap.c |
1562 | @@ -85,7 +85,7 @@ EXPORT_SYMBOL_GPL(gmap_alloc); |
1563 | static void gmap_flush_tlb(struct gmap *gmap) |
1564 | { |
1565 | if (MACHINE_HAS_IDTE) |
1566 | - __tlb_flush_asce(gmap->mm, gmap->asce); |
1567 | + __tlb_flush_idte(gmap->asce); |
1568 | else |
1569 | __tlb_flush_global(); |
1570 | } |
1571 | @@ -124,7 +124,7 @@ void gmap_free(struct gmap *gmap) |
1572 | |
1573 | /* Flush tlb. */ |
1574 | if (MACHINE_HAS_IDTE) |
1575 | - __tlb_flush_asce(gmap->mm, gmap->asce); |
1576 | + __tlb_flush_idte(gmap->asce); |
1577 | else |
1578 | __tlb_flush_global(); |
1579 | |
1580 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c |
1581 | index 9f0ce0e6eeb4..ebb4f87112f4 100644 |
1582 | --- a/arch/s390/mm/pgtable.c |
1583 | +++ b/arch/s390/mm/pgtable.c |
1584 | @@ -543,7 +543,7 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, |
1585 | } |
1586 | EXPORT_SYMBOL(set_guest_storage_key); |
1587 | |
1588 | -unsigned char get_guest_storage_key(struct mm_struct *mm, unsigned long addr) |
1589 | +unsigned long get_guest_storage_key(struct mm_struct *mm, unsigned long addr) |
1590 | { |
1591 | unsigned char key; |
1592 | spinlock_t *ptl; |
1593 | diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c |
1594 | index 8acaf4e384c0..a86d7cc2c2d8 100644 |
1595 | --- a/arch/um/os-Linux/signal.c |
1596 | +++ b/arch/um/os-Linux/signal.c |
1597 | @@ -15,6 +15,7 @@ |
1598 | #include <kern_util.h> |
1599 | #include <os.h> |
1600 | #include <sysdep/mcontext.h> |
1601 | +#include <um_malloc.h> |
1602 | |
1603 | void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = { |
1604 | [SIGTRAP] = relay_signal, |
1605 | @@ -32,7 +33,7 @@ static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc) |
1606 | struct uml_pt_regs *r; |
1607 | int save_errno = errno; |
1608 | |
1609 | - r = malloc(sizeof(struct uml_pt_regs)); |
1610 | + r = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); |
1611 | if (!r) |
1612 | panic("out of memory"); |
1613 | |
1614 | @@ -91,7 +92,7 @@ static void timer_real_alarm_handler(mcontext_t *mc) |
1615 | { |
1616 | struct uml_pt_regs *regs; |
1617 | |
1618 | - regs = malloc(sizeof(struct uml_pt_regs)); |
1619 | + regs = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); |
1620 | if (!regs) |
1621 | panic("out of memory"); |
1622 | |
1623 | diff --git a/arch/unicore32/include/asm/mmu_context.h b/arch/unicore32/include/asm/mmu_context.h |
1624 | index e35632ef23c7..62dfc644c908 100644 |
1625 | --- a/arch/unicore32/include/asm/mmu_context.h |
1626 | +++ b/arch/unicore32/include/asm/mmu_context.h |
1627 | @@ -98,7 +98,7 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, |
1628 | } |
1629 | |
1630 | static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, |
1631 | - bool write, bool foreign) |
1632 | + bool write, bool execute, bool foreign) |
1633 | { |
1634 | /* by default, allow everything */ |
1635 | return true; |
1636 | diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c |
1637 | index 874e8bd64d1d..bd136ac140be 100644 |
1638 | --- a/arch/x86/events/intel/uncore_snbep.c |
1639 | +++ b/arch/x86/events/intel/uncore_snbep.c |
1640 | @@ -2546,7 +2546,7 @@ void hswep_uncore_cpu_init(void) |
1641 | |
1642 | static struct intel_uncore_type hswep_uncore_ha = { |
1643 | .name = "ha", |
1644 | - .num_counters = 5, |
1645 | + .num_counters = 4, |
1646 | .num_boxes = 2, |
1647 | .perf_ctr_bits = 48, |
1648 | SNBEP_UNCORE_PCI_COMMON_INIT(), |
1649 | @@ -2565,7 +2565,7 @@ static struct uncore_event_desc hswep_uncore_imc_events[] = { |
1650 | |
1651 | static struct intel_uncore_type hswep_uncore_imc = { |
1652 | .name = "imc", |
1653 | - .num_counters = 5, |
1654 | + .num_counters = 4, |
1655 | .num_boxes = 8, |
1656 | .perf_ctr_bits = 48, |
1657 | .fixed_ctr_bits = 48, |
1658 | @@ -2611,7 +2611,7 @@ static struct intel_uncore_type hswep_uncore_irp = { |
1659 | |
1660 | static struct intel_uncore_type hswep_uncore_qpi = { |
1661 | .name = "qpi", |
1662 | - .num_counters = 5, |
1663 | + .num_counters = 4, |
1664 | .num_boxes = 3, |
1665 | .perf_ctr_bits = 48, |
1666 | .perf_ctr = SNBEP_PCI_PMON_CTR0, |
1667 | @@ -2693,7 +2693,7 @@ static struct event_constraint hswep_uncore_r3qpi_constraints[] = { |
1668 | |
1669 | static struct intel_uncore_type hswep_uncore_r3qpi = { |
1670 | .name = "r3qpi", |
1671 | - .num_counters = 4, |
1672 | + .num_counters = 3, |
1673 | .num_boxes = 3, |
1674 | .perf_ctr_bits = 44, |
1675 | .constraints = hswep_uncore_r3qpi_constraints, |
1676 | @@ -2892,7 +2892,7 @@ static struct intel_uncore_type bdx_uncore_ha = { |
1677 | |
1678 | static struct intel_uncore_type bdx_uncore_imc = { |
1679 | .name = "imc", |
1680 | - .num_counters = 5, |
1681 | + .num_counters = 4, |
1682 | .num_boxes = 8, |
1683 | .perf_ctr_bits = 48, |
1684 | .fixed_ctr_bits = 48, |
1685 | diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c |
1686 | index c146f3c262c3..0149ac59c273 100644 |
1687 | --- a/arch/x86/kvm/mtrr.c |
1688 | +++ b/arch/x86/kvm/mtrr.c |
1689 | @@ -539,6 +539,7 @@ static void mtrr_lookup_var_start(struct mtrr_iter *iter) |
1690 | |
1691 | iter->fixed = false; |
1692 | iter->start_max = iter->start; |
1693 | + iter->range = NULL; |
1694 | iter->range = list_prepare_entry(iter->range, &mtrr_state->head, node); |
1695 | |
1696 | __mtrr_lookup_var_next(iter); |
1697 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
1698 | index 64a79f271276..8326d6891395 100644 |
1699 | --- a/arch/x86/kvm/vmx.c |
1700 | +++ b/arch/x86/kvm/vmx.c |
1701 | @@ -8224,6 +8224,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu) |
1702 | if ((vectoring_info & VECTORING_INFO_VALID_MASK) && |
1703 | (exit_reason != EXIT_REASON_EXCEPTION_NMI && |
1704 | exit_reason != EXIT_REASON_EPT_VIOLATION && |
1705 | + exit_reason != EXIT_REASON_PML_FULL && |
1706 | exit_reason != EXIT_REASON_TASK_SWITCH)) { |
1707 | vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR; |
1708 | vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV; |
1709 | @@ -8854,6 +8855,22 @@ static void vmx_load_vmcs01(struct kvm_vcpu *vcpu) |
1710 | put_cpu(); |
1711 | } |
1712 | |
1713 | +/* |
1714 | + * Ensure that the current vmcs of the logical processor is the |
1715 | + * vmcs01 of the vcpu before calling free_nested(). |
1716 | + */ |
1717 | +static void vmx_free_vcpu_nested(struct kvm_vcpu *vcpu) |
1718 | +{ |
1719 | + struct vcpu_vmx *vmx = to_vmx(vcpu); |
1720 | + int r; |
1721 | + |
1722 | + r = vcpu_load(vcpu); |
1723 | + BUG_ON(r); |
1724 | + vmx_load_vmcs01(vcpu); |
1725 | + free_nested(vmx); |
1726 | + vcpu_put(vcpu); |
1727 | +} |
1728 | + |
1729 | static void vmx_free_vcpu(struct kvm_vcpu *vcpu) |
1730 | { |
1731 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
1732 | @@ -8862,8 +8879,7 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) |
1733 | vmx_destroy_pml_buffer(vmx); |
1734 | free_vpid(vmx->vpid); |
1735 | leave_guest_mode(vcpu); |
1736 | - vmx_load_vmcs01(vcpu); |
1737 | - free_nested(vmx); |
1738 | + vmx_free_vcpu_nested(vcpu); |
1739 | free_loaded_vmcs(vmx->loaded_vmcs); |
1740 | kfree(vmx->guest_msrs); |
1741 | kvm_vcpu_uninit(vcpu); |
1742 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
1743 | index 7da5dd2057a9..fea2c5717ec1 100644 |
1744 | --- a/arch/x86/kvm/x86.c |
1745 | +++ b/arch/x86/kvm/x86.c |
1746 | @@ -91,6 +91,7 @@ static u64 __read_mostly efer_reserved_bits = ~((u64)EFER_SCE); |
1747 | |
1748 | static void update_cr8_intercept(struct kvm_vcpu *vcpu); |
1749 | static void process_nmi(struct kvm_vcpu *vcpu); |
1750 | +static void process_smi(struct kvm_vcpu *vcpu); |
1751 | static void __kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags); |
1752 | |
1753 | struct kvm_x86_ops *kvm_x86_ops __read_mostly; |
1754 | @@ -5296,13 +5297,8 @@ static void kvm_smm_changed(struct kvm_vcpu *vcpu) |
1755 | /* This is a good place to trace that we are exiting SMM. */ |
1756 | trace_kvm_enter_smm(vcpu->vcpu_id, vcpu->arch.smbase, false); |
1757 | |
1758 | - if (unlikely(vcpu->arch.smi_pending)) { |
1759 | - kvm_make_request(KVM_REQ_SMI, vcpu); |
1760 | - vcpu->arch.smi_pending = 0; |
1761 | - } else { |
1762 | - /* Process a latched INIT, if any. */ |
1763 | - kvm_make_request(KVM_REQ_EVENT, vcpu); |
1764 | - } |
1765 | + /* Process a latched INIT or SMI, if any. */ |
1766 | + kvm_make_request(KVM_REQ_EVENT, vcpu); |
1767 | } |
1768 | |
1769 | kvm_mmu_reset_context(vcpu); |
1770 | @@ -6102,7 +6098,10 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) |
1771 | } |
1772 | |
1773 | /* try to inject new event if pending */ |
1774 | - if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) { |
1775 | + if (vcpu->arch.smi_pending && !is_smm(vcpu)) { |
1776 | + vcpu->arch.smi_pending = false; |
1777 | + process_smi(vcpu); |
1778 | + } else if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) { |
1779 | --vcpu->arch.nmi_pending; |
1780 | vcpu->arch.nmi_injected = true; |
1781 | kvm_x86_ops->set_nmi(vcpu); |
1782 | @@ -6312,11 +6311,6 @@ static void process_smi(struct kvm_vcpu *vcpu) |
1783 | char buf[512]; |
1784 | u32 cr0; |
1785 | |
1786 | - if (is_smm(vcpu)) { |
1787 | - vcpu->arch.smi_pending = true; |
1788 | - return; |
1789 | - } |
1790 | - |
1791 | trace_kvm_enter_smm(vcpu->vcpu_id, vcpu->arch.smbase, true); |
1792 | vcpu->arch.hflags |= HF_SMM_MASK; |
1793 | memset(buf, 0, 512); |
1794 | @@ -6379,6 +6373,12 @@ static void process_smi(struct kvm_vcpu *vcpu) |
1795 | kvm_mmu_reset_context(vcpu); |
1796 | } |
1797 | |
1798 | +static void process_smi_request(struct kvm_vcpu *vcpu) |
1799 | +{ |
1800 | + vcpu->arch.smi_pending = true; |
1801 | + kvm_make_request(KVM_REQ_EVENT, vcpu); |
1802 | +} |
1803 | + |
1804 | void kvm_make_scan_ioapic_request(struct kvm *kvm) |
1805 | { |
1806 | kvm_make_all_cpus_request(kvm, KVM_REQ_SCAN_IOAPIC); |
1807 | @@ -6500,7 +6500,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) |
1808 | if (kvm_check_request(KVM_REQ_STEAL_UPDATE, vcpu)) |
1809 | record_steal_time(vcpu); |
1810 | if (kvm_check_request(KVM_REQ_SMI, vcpu)) |
1811 | - process_smi(vcpu); |
1812 | + process_smi_request(vcpu); |
1813 | if (kvm_check_request(KVM_REQ_NMI, vcpu)) |
1814 | process_nmi(vcpu); |
1815 | if (kvm_check_request(KVM_REQ_PMU, vcpu)) |
1816 | @@ -6573,8 +6573,18 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) |
1817 | |
1818 | if (inject_pending_event(vcpu, req_int_win) != 0) |
1819 | req_immediate_exit = true; |
1820 | - /* enable NMI/IRQ window open exits if needed */ |
1821 | else { |
1822 | + /* Enable NMI/IRQ window open exits if needed. |
1823 | + * |
1824 | + * SMIs have two cases: 1) they can be nested, and |
1825 | + * then there is nothing to do here because RSM will |
1826 | + * cause a vmexit anyway; 2) or the SMI can be pending |
1827 | + * because inject_pending_event has completed the |
1828 | + * injection of an IRQ or NMI from the previous vmexit, |
1829 | + * and then we request an immediate exit to inject the SMI. |
1830 | + */ |
1831 | + if (vcpu->arch.smi_pending && !is_smm(vcpu)) |
1832 | + req_immediate_exit = true; |
1833 | if (vcpu->arch.nmi_pending) |
1834 | kvm_x86_ops->enable_nmi_window(vcpu); |
1835 | if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) |
1836 | @@ -6625,8 +6635,10 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) |
1837 | |
1838 | kvm_load_guest_xcr0(vcpu); |
1839 | |
1840 | - if (req_immediate_exit) |
1841 | + if (req_immediate_exit) { |
1842 | + kvm_make_request(KVM_REQ_EVENT, vcpu); |
1843 | smp_send_reschedule(vcpu->cpu); |
1844 | + } |
1845 | |
1846 | trace_kvm_entry(vcpu->vcpu_id); |
1847 | wait_lapic_expire(vcpu); |
1848 | @@ -7427,6 +7439,7 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) |
1849 | { |
1850 | vcpu->arch.hflags = 0; |
1851 | |
1852 | + vcpu->arch.smi_pending = 0; |
1853 | atomic_set(&vcpu->arch.nmi_queued, 0); |
1854 | vcpu->arch.nmi_pending = 0; |
1855 | vcpu->arch.nmi_injected = false; |
1856 | diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c |
1857 | index 8b93e634af84..ae97f24a4371 100644 |
1858 | --- a/arch/x86/pci/intel_mid_pci.c |
1859 | +++ b/arch/x86/pci/intel_mid_pci.c |
1860 | @@ -37,6 +37,7 @@ |
1861 | |
1862 | /* Quirks for the listed devices */ |
1863 | #define PCI_DEVICE_ID_INTEL_MRFL_MMC 0x1190 |
1864 | +#define PCI_DEVICE_ID_INTEL_MRFL_HSU 0x1191 |
1865 | |
1866 | /* Fixed BAR fields */ |
1867 | #define PCIE_VNDR_CAP_ID_FIXED_BAR 0x00 /* Fixed BAR (TBD) */ |
1868 | @@ -225,13 +226,20 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) |
1869 | /* Special treatment for IRQ0 */ |
1870 | if (dev->irq == 0) { |
1871 | /* |
1872 | + * Skip HS UART common registers device since it has |
1873 | + * IRQ0 assigned and not used by the kernel. |
1874 | + */ |
1875 | + if (dev->device == PCI_DEVICE_ID_INTEL_MRFL_HSU) |
1876 | + return -EBUSY; |
1877 | + /* |
1878 | * TNG has IRQ0 assigned to eMMC controller. But there |
1879 | * are also other devices with bogus PCI configuration |
1880 | * that have IRQ0 assigned. This check ensures that |
1881 | - * eMMC gets it. |
1882 | + * eMMC gets it. The rest of devices still could be |
1883 | + * enabled without interrupt line being allocated. |
1884 | */ |
1885 | if (dev->device != PCI_DEVICE_ID_INTEL_MRFL_MMC) |
1886 | - return -EBUSY; |
1887 | + return 0; |
1888 | } |
1889 | break; |
1890 | default: |
1891 | diff --git a/block/bio.c b/block/bio.c |
1892 | index 0e4aa42bc30d..462386908835 100644 |
1893 | --- a/block/bio.c |
1894 | +++ b/block/bio.c |
1895 | @@ -579,6 +579,8 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) |
1896 | bio->bi_rw = bio_src->bi_rw; |
1897 | bio->bi_iter = bio_src->bi_iter; |
1898 | bio->bi_io_vec = bio_src->bi_io_vec; |
1899 | + |
1900 | + bio_clone_blkcg_association(bio, bio_src); |
1901 | } |
1902 | EXPORT_SYMBOL(__bio_clone_fast); |
1903 | |
1904 | @@ -684,6 +686,8 @@ integrity_clone: |
1905 | } |
1906 | } |
1907 | |
1908 | + bio_clone_blkcg_association(bio, bio_src); |
1909 | + |
1910 | return bio; |
1911 | } |
1912 | EXPORT_SYMBOL(bio_clone_bioset); |
1913 | @@ -2005,6 +2009,17 @@ void bio_disassociate_task(struct bio *bio) |
1914 | } |
1915 | } |
1916 | |
1917 | +/** |
1918 | + * bio_clone_blkcg_association - clone blkcg association from src to dst bio |
1919 | + * @dst: destination bio |
1920 | + * @src: source bio |
1921 | + */ |
1922 | +void bio_clone_blkcg_association(struct bio *dst, struct bio *src) |
1923 | +{ |
1924 | + if (src->bi_css) |
1925 | + WARN_ON(bio_associate_blkcg(dst, src->bi_css)); |
1926 | +} |
1927 | + |
1928 | #endif /* CONFIG_BLK_CGROUP */ |
1929 | |
1930 | static void __init biovec_init_slabs(void) |
1931 | diff --git a/block/genhd.c b/block/genhd.c |
1932 | index 3eebd256b765..086f1a357734 100644 |
1933 | --- a/block/genhd.c |
1934 | +++ b/block/genhd.c |
1935 | @@ -613,7 +613,7 @@ void add_disk(struct gendisk *disk) |
1936 | |
1937 | /* Register BDI before referencing it from bdev */ |
1938 | bdi = &disk->queue->backing_dev_info; |
1939 | - bdi_register_dev(bdi, disk_devt(disk)); |
1940 | + bdi_register_owner(bdi, disk_to_dev(disk)); |
1941 | |
1942 | blk_register_region(disk_devt(disk), disk->minors, NULL, |
1943 | exact_match, exact_lock, disk); |
1944 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
1945 | index 290d6f5be44b..f4218df00883 100644 |
1946 | --- a/drivers/acpi/ec.c |
1947 | +++ b/drivers/acpi/ec.c |
1948 | @@ -101,6 +101,7 @@ enum ec_command { |
1949 | #define ACPI_EC_UDELAY_POLL 550 /* Wait 1ms for EC transaction polling */ |
1950 | #define ACPI_EC_CLEAR_MAX 100 /* Maximum number of events to query |
1951 | * when trying to clear the EC */ |
1952 | +#define ACPI_EC_MAX_QUERIES 16 /* Maximum number of parallel queries */ |
1953 | |
1954 | enum { |
1955 | EC_FLAGS_QUERY_PENDING, /* Query is pending */ |
1956 | @@ -121,6 +122,10 @@ static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY; |
1957 | module_param(ec_delay, uint, 0644); |
1958 | MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes"); |
1959 | |
1960 | +static unsigned int ec_max_queries __read_mostly = ACPI_EC_MAX_QUERIES; |
1961 | +module_param(ec_max_queries, uint, 0644); |
1962 | +MODULE_PARM_DESC(ec_max_queries, "Maximum parallel _Qxx evaluations"); |
1963 | + |
1964 | static bool ec_busy_polling __read_mostly; |
1965 | module_param(ec_busy_polling, bool, 0644); |
1966 | MODULE_PARM_DESC(ec_busy_polling, "Use busy polling to advance EC transaction"); |
1967 | @@ -174,6 +179,7 @@ static void acpi_ec_event_processor(struct work_struct *work); |
1968 | |
1969 | struct acpi_ec *boot_ec, *first_ec; |
1970 | EXPORT_SYMBOL(first_ec); |
1971 | +static struct workqueue_struct *ec_query_wq; |
1972 | |
1973 | static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ |
1974 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ |
1975 | @@ -1098,7 +1104,7 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data) |
1976 | * work queue execution. |
1977 | */ |
1978 | ec_dbg_evt("Query(0x%02x) scheduled", value); |
1979 | - if (!schedule_work(&q->work)) { |
1980 | + if (!queue_work(ec_query_wq, &q->work)) { |
1981 | ec_dbg_evt("Query(0x%02x) overlapped", value); |
1982 | result = -EBUSY; |
1983 | } |
1984 | @@ -1660,15 +1666,41 @@ static struct acpi_driver acpi_ec_driver = { |
1985 | }, |
1986 | }; |
1987 | |
1988 | +static inline int acpi_ec_query_init(void) |
1989 | +{ |
1990 | + if (!ec_query_wq) { |
1991 | + ec_query_wq = alloc_workqueue("kec_query", 0, |
1992 | + ec_max_queries); |
1993 | + if (!ec_query_wq) |
1994 | + return -ENODEV; |
1995 | + } |
1996 | + return 0; |
1997 | +} |
1998 | + |
1999 | +static inline void acpi_ec_query_exit(void) |
2000 | +{ |
2001 | + if (ec_query_wq) { |
2002 | + destroy_workqueue(ec_query_wq); |
2003 | + ec_query_wq = NULL; |
2004 | + } |
2005 | +} |
2006 | + |
2007 | int __init acpi_ec_init(void) |
2008 | { |
2009 | - int result = 0; |
2010 | + int result; |
2011 | |
2012 | + /* register workqueue for _Qxx evaluations */ |
2013 | + result = acpi_ec_query_init(); |
2014 | + if (result) |
2015 | + goto err_exit; |
2016 | /* Now register the driver for the EC */ |
2017 | result = acpi_bus_register_driver(&acpi_ec_driver); |
2018 | - if (result < 0) |
2019 | - return -ENODEV; |
2020 | + if (result) |
2021 | + goto err_exit; |
2022 | |
2023 | +err_exit: |
2024 | + if (result) |
2025 | + acpi_ec_query_exit(); |
2026 | return result; |
2027 | } |
2028 | |
2029 | @@ -1678,5 +1710,6 @@ static void __exit acpi_ec_exit(void) |
2030 | { |
2031 | |
2032 | acpi_bus_unregister_driver(&acpi_ec_driver); |
2033 | + acpi_ec_query_exit(); |
2034 | } |
2035 | #endif /* 0 */ |
2036 | diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c |
2037 | index cae5385cf499..bd46569e0e52 100644 |
2038 | --- a/drivers/bcma/host_pci.c |
2039 | +++ b/drivers/bcma/host_pci.c |
2040 | @@ -295,6 +295,7 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = { |
2041 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, |
2042 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) }, |
2043 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_DELL, 0x0016) }, |
2044 | + { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_FOXCONN, 0xe092) }, |
2045 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) }, |
2046 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, |
2047 | { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) }, |
2048 | diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c |
2049 | index 84708a5f8c52..a1dcf12d3dad 100644 |
2050 | --- a/drivers/block/floppy.c |
2051 | +++ b/drivers/block/floppy.c |
2052 | @@ -3663,11 +3663,6 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) |
2053 | |
2054 | opened_bdev[drive] = bdev; |
2055 | |
2056 | - if (!(mode & (FMODE_READ|FMODE_WRITE))) { |
2057 | - res = -EINVAL; |
2058 | - goto out; |
2059 | - } |
2060 | - |
2061 | res = -ENXIO; |
2062 | |
2063 | if (!floppy_track_buffer) { |
2064 | @@ -3711,13 +3706,15 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) |
2065 | if (UFDCS->rawcmd == 1) |
2066 | UFDCS->rawcmd = 2; |
2067 | |
2068 | - UDRS->last_checked = 0; |
2069 | - clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); |
2070 | - check_disk_change(bdev); |
2071 | - if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) |
2072 | - goto out; |
2073 | - if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags)) |
2074 | - goto out; |
2075 | + if (mode & (FMODE_READ|FMODE_WRITE)) { |
2076 | + UDRS->last_checked = 0; |
2077 | + clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); |
2078 | + check_disk_change(bdev); |
2079 | + if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) |
2080 | + goto out; |
2081 | + if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags)) |
2082 | + goto out; |
2083 | + } |
2084 | |
2085 | res = -EROFS; |
2086 | |
2087 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c |
2088 | index 25894687c168..fadba88745dc 100644 |
2089 | --- a/drivers/bluetooth/ath3k.c |
2090 | +++ b/drivers/bluetooth/ath3k.c |
2091 | @@ -123,6 +123,7 @@ static const struct usb_device_id ath3k_table[] = { |
2092 | { USB_DEVICE(0x13d3, 0x3472) }, |
2093 | { USB_DEVICE(0x13d3, 0x3474) }, |
2094 | { USB_DEVICE(0x13d3, 0x3487) }, |
2095 | + { USB_DEVICE(0x13d3, 0x3490) }, |
2096 | |
2097 | /* Atheros AR5BBU12 with sflash firmware */ |
2098 | { USB_DEVICE(0x0489, 0xE02C) }, |
2099 | @@ -190,6 +191,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { |
2100 | { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, |
2101 | { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, |
2102 | { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 }, |
2103 | + { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 }, |
2104 | |
2105 | /* Atheros AR5BBU22 with sflash firmware */ |
2106 | { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, |
2107 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
2108 | index a3be65e6231a..9f40c3426f0c 100644 |
2109 | --- a/drivers/bluetooth/btusb.c |
2110 | +++ b/drivers/bluetooth/btusb.c |
2111 | @@ -237,6 +237,7 @@ static const struct usb_device_id blacklist_table[] = { |
2112 | { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, |
2113 | { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, |
2114 | { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 }, |
2115 | + { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 }, |
2116 | |
2117 | /* Atheros AR5BBU12 with sflash firmware */ |
2118 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, |
2119 | diff --git a/drivers/char/random.c b/drivers/char/random.c |
2120 | index 87ab9f6b4112..d72c6d14a1c9 100644 |
2121 | --- a/drivers/char/random.c |
2122 | +++ b/drivers/char/random.c |
2123 | @@ -949,6 +949,7 @@ void add_interrupt_randomness(int irq, int irq_flags) |
2124 | /* award one bit for the contents of the fast pool */ |
2125 | credit_entropy_bits(r, credit + 1); |
2126 | } |
2127 | +EXPORT_SYMBOL_GPL(add_interrupt_randomness); |
2128 | |
2129 | #ifdef CONFIG_BLOCK |
2130 | void add_disk_randomness(struct gendisk *disk) |
2131 | @@ -1461,12 +1462,16 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) |
2132 | static ssize_t |
2133 | urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) |
2134 | { |
2135 | + static int maxwarn = 10; |
2136 | int ret; |
2137 | |
2138 | - if (unlikely(nonblocking_pool.initialized == 0)) |
2139 | - printk_once(KERN_NOTICE "random: %s urandom read " |
2140 | - "with %d bits of entropy available\n", |
2141 | - current->comm, nonblocking_pool.entropy_total); |
2142 | + if (unlikely(nonblocking_pool.initialized == 0) && |
2143 | + maxwarn > 0) { |
2144 | + maxwarn--; |
2145 | + printk(KERN_NOTICE "random: %s: uninitialized urandom read " |
2146 | + "(%zd bytes read, %d bits of entropy available)\n", |
2147 | + current->comm, nbytes, nonblocking_pool.entropy_total); |
2148 | + } |
2149 | |
2150 | nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3)); |
2151 | ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); |
2152 | @@ -1774,13 +1779,15 @@ int random_int_secret_init(void) |
2153 | return 0; |
2154 | } |
2155 | |
2156 | +static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash) |
2157 | + __aligned(sizeof(unsigned long)); |
2158 | + |
2159 | /* |
2160 | * Get a random word for internal kernel use only. Similar to urandom but |
2161 | * with the goal of minimal entropy pool depletion. As a result, the random |
2162 | * value is not cryptographically secure but for several uses the cost of |
2163 | * depleting entropy is too high |
2164 | */ |
2165 | -static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash); |
2166 | unsigned int get_random_int(void) |
2167 | { |
2168 | __u32 *hash; |
2169 | @@ -1850,12 +1857,18 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, |
2170 | { |
2171 | struct entropy_store *poolp = &input_pool; |
2172 | |
2173 | - /* Suspend writing if we're above the trickle threshold. |
2174 | - * We'll be woken up again once below random_write_wakeup_thresh, |
2175 | - * or when the calling thread is about to terminate. |
2176 | - */ |
2177 | - wait_event_interruptible(random_write_wait, kthread_should_stop() || |
2178 | + if (unlikely(nonblocking_pool.initialized == 0)) |
2179 | + poolp = &nonblocking_pool; |
2180 | + else { |
2181 | + /* Suspend writing if we're above the trickle |
2182 | + * threshold. We'll be woken up again once below |
2183 | + * random_write_wakeup_thresh, or when the calling |
2184 | + * thread is about to terminate. |
2185 | + */ |
2186 | + wait_event_interruptible(random_write_wait, |
2187 | + kthread_should_stop() || |
2188 | ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); |
2189 | + } |
2190 | mix_pool_bytes(poolp, buffer, count); |
2191 | credit_entropy_bits(poolp, entropy); |
2192 | } |
2193 | diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c |
2194 | index a12b31940344..e9fd1d83f9f1 100644 |
2195 | --- a/drivers/char/tpm/tpm_crb.c |
2196 | +++ b/drivers/char/tpm/tpm_crb.c |
2197 | @@ -246,7 +246,7 @@ static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv, |
2198 | |
2199 | /* Detect a 64 bit address on a 32 bit system */ |
2200 | if (start != new_res.start) |
2201 | - return ERR_PTR(-EINVAL); |
2202 | + return (void __iomem *) ERR_PTR(-EINVAL); |
2203 | |
2204 | if (!resource_contains(&priv->res, &new_res)) |
2205 | return devm_ioremap_resource(dev, &new_res); |
2206 | diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c |
2207 | index 8059a8d3ea36..31b77f71313f 100644 |
2208 | --- a/drivers/clk/rockchip/clk-rk3399.c |
2209 | +++ b/drivers/clk/rockchip/clk-rk3399.c |
2210 | @@ -586,7 +586,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { |
2211 | RK3399_CLKGATE_CON(8), 15, GFLAGS), |
2212 | |
2213 | COMPOSITE(SCLK_SPDIF_REC_DPTX, "clk_spdif_rec_dptx", mux_pll_src_cpll_gpll_p, 0, |
2214 | - RK3399_CLKSEL_CON(32), 15, 1, MFLAGS, 0, 5, DFLAGS, |
2215 | + RK3399_CLKSEL_CON(32), 15, 1, MFLAGS, 8, 5, DFLAGS, |
2216 | RK3399_CLKGATE_CON(10), 6, GFLAGS), |
2217 | /* i2s */ |
2218 | COMPOSITE(0, "clk_i2s0_div", mux_pll_src_cpll_gpll_p, 0, |
2219 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
2220 | index 1fa1a32928d7..1b159171f1f9 100644 |
2221 | --- a/drivers/cpufreq/intel_pstate.c |
2222 | +++ b/drivers/cpufreq/intel_pstate.c |
2223 | @@ -944,7 +944,7 @@ static int core_get_max_pstate(void) |
2224 | if (err) |
2225 | goto skip_tar; |
2226 | |
2227 | - tdp_msr = MSR_CONFIG_TDP_NOMINAL + tdp_ctrl; |
2228 | + tdp_msr = MSR_CONFIG_TDP_NOMINAL + (tdp_ctrl & 0x3); |
2229 | err = rdmsrl_safe(tdp_msr, &tdp_ratio); |
2230 | if (err) |
2231 | goto skip_tar; |
2232 | diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c |
2233 | index 10c305b4a2e1..4e0f8e720ad9 100644 |
2234 | --- a/drivers/edac/edac_mc_sysfs.c |
2235 | +++ b/drivers/edac/edac_mc_sysfs.c |
2236 | @@ -313,7 +313,6 @@ static struct device_type csrow_attr_type = { |
2237 | * possible dynamic channel DIMM Label attribute files |
2238 | * |
2239 | */ |
2240 | - |
2241 | DEVICE_CHANNEL(ch0_dimm_label, S_IRUGO | S_IWUSR, |
2242 | channel_dimm_label_show, channel_dimm_label_store, 0); |
2243 | DEVICE_CHANNEL(ch1_dimm_label, S_IRUGO | S_IWUSR, |
2244 | @@ -326,6 +325,10 @@ DEVICE_CHANNEL(ch4_dimm_label, S_IRUGO | S_IWUSR, |
2245 | channel_dimm_label_show, channel_dimm_label_store, 4); |
2246 | DEVICE_CHANNEL(ch5_dimm_label, S_IRUGO | S_IWUSR, |
2247 | channel_dimm_label_show, channel_dimm_label_store, 5); |
2248 | +DEVICE_CHANNEL(ch6_dimm_label, S_IRUGO | S_IWUSR, |
2249 | + channel_dimm_label_show, channel_dimm_label_store, 6); |
2250 | +DEVICE_CHANNEL(ch7_dimm_label, S_IRUGO | S_IWUSR, |
2251 | + channel_dimm_label_show, channel_dimm_label_store, 7); |
2252 | |
2253 | /* Total possible dynamic DIMM Label attribute file table */ |
2254 | static struct attribute *dynamic_csrow_dimm_attr[] = { |
2255 | @@ -335,6 +338,8 @@ static struct attribute *dynamic_csrow_dimm_attr[] = { |
2256 | &dev_attr_legacy_ch3_dimm_label.attr.attr, |
2257 | &dev_attr_legacy_ch4_dimm_label.attr.attr, |
2258 | &dev_attr_legacy_ch5_dimm_label.attr.attr, |
2259 | + &dev_attr_legacy_ch6_dimm_label.attr.attr, |
2260 | + &dev_attr_legacy_ch7_dimm_label.attr.attr, |
2261 | NULL |
2262 | }; |
2263 | |
2264 | @@ -351,6 +356,10 @@ DEVICE_CHANNEL(ch4_ce_count, S_IRUGO, |
2265 | channel_ce_count_show, NULL, 4); |
2266 | DEVICE_CHANNEL(ch5_ce_count, S_IRUGO, |
2267 | channel_ce_count_show, NULL, 5); |
2268 | +DEVICE_CHANNEL(ch6_ce_count, S_IRUGO, |
2269 | + channel_ce_count_show, NULL, 6); |
2270 | +DEVICE_CHANNEL(ch7_ce_count, S_IRUGO, |
2271 | + channel_ce_count_show, NULL, 7); |
2272 | |
2273 | /* Total possible dynamic ce_count attribute file table */ |
2274 | static struct attribute *dynamic_csrow_ce_count_attr[] = { |
2275 | @@ -360,6 +369,8 @@ static struct attribute *dynamic_csrow_ce_count_attr[] = { |
2276 | &dev_attr_legacy_ch3_ce_count.attr.attr, |
2277 | &dev_attr_legacy_ch4_ce_count.attr.attr, |
2278 | &dev_attr_legacy_ch5_ce_count.attr.attr, |
2279 | + &dev_attr_legacy_ch6_ce_count.attr.attr, |
2280 | + &dev_attr_legacy_ch7_ce_count.attr.attr, |
2281 | NULL |
2282 | }; |
2283 | |
2284 | @@ -371,9 +382,16 @@ static umode_t csrow_dev_is_visible(struct kobject *kobj, |
2285 | |
2286 | if (idx >= csrow->nr_channels) |
2287 | return 0; |
2288 | + |
2289 | + if (idx >= ARRAY_SIZE(dynamic_csrow_ce_count_attr) - 1) { |
2290 | + WARN_ONCE(1, "idx: %d\n", idx); |
2291 | + return 0; |
2292 | + } |
2293 | + |
2294 | /* Only expose populated DIMMs */ |
2295 | if (!csrow->channels[idx]->dimm->nr_pages) |
2296 | return 0; |
2297 | + |
2298 | return attr->mode; |
2299 | } |
2300 | |
2301 | diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c |
2302 | index cdaba13cb8e8..c0f7cce23f62 100644 |
2303 | --- a/drivers/gpio/gpio-intel-mid.c |
2304 | +++ b/drivers/gpio/gpio-intel-mid.c |
2305 | @@ -17,7 +17,6 @@ |
2306 | * Moorestown platform Langwell chip. |
2307 | * Medfield platform Penwell chip. |
2308 | * Clovertrail platform Cloverview chip. |
2309 | - * Merrifield platform Tangier chip. |
2310 | */ |
2311 | |
2312 | #include <linux/module.h> |
2313 | @@ -64,10 +63,6 @@ enum GPIO_REG { |
2314 | /* intel_mid gpio driver data */ |
2315 | struct intel_mid_gpio_ddata { |
2316 | u16 ngpio; /* number of gpio pins */ |
2317 | - u32 gplr_offset; /* offset of first GPLR register from base */ |
2318 | - u32 flis_base; /* base address of FLIS registers */ |
2319 | - u32 flis_len; /* length of FLIS registers */ |
2320 | - u32 (*get_flis_offset)(int gpio); |
2321 | u32 chip_irq_type; /* chip interrupt type */ |
2322 | }; |
2323 | |
2324 | @@ -252,15 +247,6 @@ static const struct intel_mid_gpio_ddata gpio_cloverview_core = { |
2325 | .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE, |
2326 | }; |
2327 | |
2328 | -static const struct intel_mid_gpio_ddata gpio_tangier = { |
2329 | - .ngpio = 192, |
2330 | - .gplr_offset = 4, |
2331 | - .flis_base = 0xff0c0000, |
2332 | - .flis_len = 0x8000, |
2333 | - .get_flis_offset = NULL, |
2334 | - .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE, |
2335 | -}; |
2336 | - |
2337 | static const struct pci_device_id intel_gpio_ids[] = { |
2338 | { |
2339 | /* Lincroft */ |
2340 | @@ -287,11 +273,6 @@ static const struct pci_device_id intel_gpio_ids[] = { |
2341 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08f7), |
2342 | .driver_data = (kernel_ulong_t)&gpio_cloverview_core, |
2343 | }, |
2344 | - { |
2345 | - /* Tangier */ |
2346 | - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1199), |
2347 | - .driver_data = (kernel_ulong_t)&gpio_tangier, |
2348 | - }, |
2349 | { 0 } |
2350 | }; |
2351 | MODULE_DEVICE_TABLE(pci, intel_gpio_ids); |
2352 | @@ -401,7 +382,7 @@ static int intel_gpio_probe(struct pci_dev *pdev, |
2353 | spin_lock_init(&priv->lock); |
2354 | |
2355 | pci_set_drvdata(pdev, priv); |
2356 | - retval = gpiochip_add_data(&priv->chip, priv); |
2357 | + retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv); |
2358 | if (retval) { |
2359 | dev_err(&pdev->dev, "gpiochip_add error %d\n", retval); |
2360 | return retval; |
2361 | diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c |
2362 | index 5e3be32ebb8d..3745de659594 100644 |
2363 | --- a/drivers/gpio/gpio-pca953x.c |
2364 | +++ b/drivers/gpio/gpio-pca953x.c |
2365 | @@ -90,7 +90,7 @@ MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids); |
2366 | #define MAX_BANK 5 |
2367 | #define BANK_SZ 8 |
2368 | |
2369 | -#define NBANK(chip) (chip->gpio_chip.ngpio / BANK_SZ) |
2370 | +#define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ) |
2371 | |
2372 | struct pca953x_chip { |
2373 | unsigned gpio_start; |
2374 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
2375 | index 9df1bcb35bf0..983175363b06 100644 |
2376 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
2377 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
2378 | @@ -551,28 +551,19 @@ int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev) |
2379 | le16_to_cpu(firmware_info->info.usReferenceClock); |
2380 | ppll->reference_div = 0; |
2381 | |
2382 | - if (crev < 2) |
2383 | - ppll->pll_out_min = |
2384 | - le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output); |
2385 | - else |
2386 | - ppll->pll_out_min = |
2387 | - le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output); |
2388 | + ppll->pll_out_min = |
2389 | + le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output); |
2390 | ppll->pll_out_max = |
2391 | le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); |
2392 | |
2393 | - if (crev >= 4) { |
2394 | - ppll->lcd_pll_out_min = |
2395 | - le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; |
2396 | - if (ppll->lcd_pll_out_min == 0) |
2397 | - ppll->lcd_pll_out_min = ppll->pll_out_min; |
2398 | - ppll->lcd_pll_out_max = |
2399 | - le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100; |
2400 | - if (ppll->lcd_pll_out_max == 0) |
2401 | - ppll->lcd_pll_out_max = ppll->pll_out_max; |
2402 | - } else { |
2403 | + ppll->lcd_pll_out_min = |
2404 | + le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; |
2405 | + if (ppll->lcd_pll_out_min == 0) |
2406 | ppll->lcd_pll_out_min = ppll->pll_out_min; |
2407 | + ppll->lcd_pll_out_max = |
2408 | + le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100; |
2409 | + if (ppll->lcd_pll_out_max == 0) |
2410 | ppll->lcd_pll_out_max = ppll->pll_out_max; |
2411 | - } |
2412 | |
2413 | if (ppll->pll_out_min == 0) |
2414 | ppll->pll_out_min = 64800; |
2415 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
2416 | index 35a1248aaa77..1b4c069f7765 100644 |
2417 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
2418 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
2419 | @@ -10,6 +10,7 @@ |
2420 | #include <linux/slab.h> |
2421 | #include <linux/acpi.h> |
2422 | #include <linux/pci.h> |
2423 | +#include <linux/delay.h> |
2424 | |
2425 | #include "amd_acpi.h" |
2426 | |
2427 | @@ -259,6 +260,10 @@ static int amdgpu_atpx_set_discrete_state(struct amdgpu_atpx *atpx, u8 state) |
2428 | if (!info) |
2429 | return -EIO; |
2430 | kfree(info); |
2431 | + |
2432 | + /* 200ms delay is required after off */ |
2433 | + if (state == 0) |
2434 | + msleep(200); |
2435 | } |
2436 | return 0; |
2437 | } |
2438 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2439 | index cb07da41152b..ff0b55a65ca3 100644 |
2440 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2441 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
2442 | @@ -1690,7 +1690,6 @@ amdgpu_connector_add(struct amdgpu_device *adev, |
2443 | DRM_MODE_SCALE_NONE); |
2444 | /* no HPD on analog connectors */ |
2445 | amdgpu_connector->hpd.hpd = AMDGPU_HPD_NONE; |
2446 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2447 | connector->interlace_allowed = true; |
2448 | connector->doublescan_allowed = true; |
2449 | break; |
2450 | @@ -1893,8 +1892,10 @@ amdgpu_connector_add(struct amdgpu_device *adev, |
2451 | } |
2452 | |
2453 | if (amdgpu_connector->hpd.hpd == AMDGPU_HPD_NONE) { |
2454 | - if (i2c_bus->valid) |
2455 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2456 | + if (i2c_bus->valid) { |
2457 | + connector->polled = DRM_CONNECTOR_POLL_CONNECT | |
2458 | + DRM_CONNECTOR_POLL_DISCONNECT; |
2459 | + } |
2460 | } else |
2461 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2462 | |
2463 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
2464 | index 6e920086af46..b7f5650d8218 100644 |
2465 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
2466 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
2467 | @@ -1841,7 +1841,23 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) |
2468 | } |
2469 | |
2470 | drm_kms_helper_poll_enable(dev); |
2471 | + |
2472 | + /* |
2473 | + * Most of the connector probing functions try to acquire runtime pm |
2474 | + * refs to ensure that the GPU is powered on when connector polling is |
2475 | + * performed. Since we're calling this from a runtime PM callback, |
2476 | + * trying to acquire rpm refs will cause us to deadlock. |
2477 | + * |
2478 | + * Since we're guaranteed to be holding the rpm lock, it's safe to |
2479 | + * temporarily disable the rpm helpers so this doesn't deadlock us. |
2480 | + */ |
2481 | +#ifdef CONFIG_PM |
2482 | + dev->dev->power.disable_depth++; |
2483 | +#endif |
2484 | drm_helper_hpd_irq_event(dev); |
2485 | +#ifdef CONFIG_PM |
2486 | + dev->dev->power.disable_depth--; |
2487 | +#endif |
2488 | |
2489 | if (fbcon) { |
2490 | amdgpu_fbdev_set_suspend(adev, 0); |
2491 | diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c |
2492 | index 48b6bd671cda..c32eca26155c 100644 |
2493 | --- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c |
2494 | +++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c |
2495 | @@ -98,6 +98,7 @@ amdgpu_atombios_encoder_set_backlight_level(struct amdgpu_encoder *amdgpu_encode |
2496 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
2497 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
2498 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
2499 | + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: |
2500 | if (dig->backlight_level == 0) |
2501 | amdgpu_atombios_encoder_setup_dig_transmitter(encoder, |
2502 | ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); |
2503 | diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c |
2504 | index 1feb6439cb0b..92695481093e 100644 |
2505 | --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c |
2506 | +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c |
2507 | @@ -167,6 +167,7 @@ static int gmc_v7_0_init_microcode(struct amdgpu_device *adev) |
2508 | break; |
2509 | case CHIP_KAVERI: |
2510 | case CHIP_KABINI: |
2511 | + case CHIP_MULLINS: |
2512 | return 0; |
2513 | default: BUG(); |
2514 | } |
2515 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c |
2516 | index 90b35c5c10a4..ffc7c0dd3f14 100644 |
2517 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c |
2518 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c |
2519 | @@ -592,12 +592,12 @@ bool atomctrl_get_pp_assign_pin( |
2520 | const uint32_t pinId, |
2521 | pp_atomctrl_gpio_pin_assignment *gpio_pin_assignment) |
2522 | { |
2523 | - bool bRet = 0; |
2524 | + bool bRet = false; |
2525 | ATOM_GPIO_PIN_LUT *gpio_lookup_table = |
2526 | get_gpio_lookup_table(hwmgr->device); |
2527 | |
2528 | PP_ASSERT_WITH_CODE((NULL != gpio_lookup_table), |
2529 | - "Could not find GPIO lookup Table in BIOS.", return -1); |
2530 | + "Could not find GPIO lookup Table in BIOS.", return false); |
2531 | |
2532 | bRet = atomctrl_lookup_gpio_pin(gpio_lookup_table, pinId, |
2533 | gpio_pin_assignment); |
2534 | diff --git a/drivers/gpu/drm/drm_cache.c b/drivers/gpu/drm/drm_cache.c |
2535 | index 059f7c39c582..a7916e5f8864 100644 |
2536 | --- a/drivers/gpu/drm/drm_cache.c |
2537 | +++ b/drivers/gpu/drm/drm_cache.c |
2538 | @@ -136,6 +136,7 @@ drm_clflush_virt_range(void *addr, unsigned long length) |
2539 | mb(); |
2540 | for (; addr < end; addr += size) |
2541 | clflushopt(addr); |
2542 | + clflushopt(end - 1); /* force serialisation */ |
2543 | mb(); |
2544 | return; |
2545 | } |
2546 | diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c |
2547 | index eeaf5a7c3aa7..67b28f8018d2 100644 |
2548 | --- a/drivers/gpu/drm/drm_dp_helper.c |
2549 | +++ b/drivers/gpu/drm/drm_dp_helper.c |
2550 | @@ -203,7 +203,7 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, |
2551 | |
2552 | ret = aux->transfer(aux, &msg); |
2553 | |
2554 | - if (ret > 0) { |
2555 | + if (ret >= 0) { |
2556 | native_reply = msg.reply & DP_AUX_NATIVE_REPLY_MASK; |
2557 | if (native_reply == DP_AUX_NATIVE_REPLY_ACK) { |
2558 | if (ret == size) |
2559 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c |
2560 | index 7df26d4b7ad8..2cb472b9976a 100644 |
2561 | --- a/drivers/gpu/drm/drm_edid.c |
2562 | +++ b/drivers/gpu/drm/drm_edid.c |
2563 | @@ -74,6 +74,8 @@ |
2564 | #define EDID_QUIRK_FORCE_8BPC (1 << 8) |
2565 | /* Force 12bpc */ |
2566 | #define EDID_QUIRK_FORCE_12BPC (1 << 9) |
2567 | +/* Force 6bpc */ |
2568 | +#define EDID_QUIRK_FORCE_6BPC (1 << 10) |
2569 | |
2570 | struct detailed_mode_closure { |
2571 | struct drm_connector *connector; |
2572 | @@ -100,6 +102,9 @@ static struct edid_quirk { |
2573 | /* Unknown Acer */ |
2574 | { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
2575 | |
2576 | + /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ |
2577 | + { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, |
2578 | + |
2579 | /* Belinea 10 15 55 */ |
2580 | { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, |
2581 | { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, |
2582 | @@ -4082,6 +4087,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) |
2583 | |
2584 | drm_add_display_info(edid, &connector->display_info, connector); |
2585 | |
2586 | + if (quirks & EDID_QUIRK_FORCE_6BPC) |
2587 | + connector->display_info.bpc = 6; |
2588 | + |
2589 | if (quirks & EDID_QUIRK_FORCE_8BPC) |
2590 | connector->display_info.bpc = 8; |
2591 | |
2592 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
2593 | index bc3f2e6842e7..227a63ee0067 100644 |
2594 | --- a/drivers/gpu/drm/i915/i915_drv.h |
2595 | +++ b/drivers/gpu/drm/i915/i915_drv.h |
2596 | @@ -2591,6 +2591,8 @@ struct drm_i915_cmd_table { |
2597 | #define SKL_REVID_D0 0x3 |
2598 | #define SKL_REVID_E0 0x4 |
2599 | #define SKL_REVID_F0 0x5 |
2600 | +#define SKL_REVID_G0 0x6 |
2601 | +#define SKL_REVID_H0 0x7 |
2602 | |
2603 | #define IS_SKL_REVID(p, since, until) (IS_SKYLAKE(p) && IS_REVID(p, since, until)) |
2604 | |
2605 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
2606 | index 3fcf7dd5b6ca..bc3b6dde7b4b 100644 |
2607 | --- a/drivers/gpu/drm/i915/i915_reg.h |
2608 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
2609 | @@ -1672,6 +1672,9 @@ enum skl_disp_power_wells { |
2610 | |
2611 | #define GEN7_TLB_RD_ADDR _MMIO(0x4700) |
2612 | |
2613 | +#define GEN9_GAMT_ECO_REG_RW_IA _MMIO(0x4ab0) |
2614 | +#define GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS (1<<18) |
2615 | + |
2616 | #define GAMT_CHKN_BIT_REG _MMIO(0x4ab8) |
2617 | #define GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING (1<<28) |
2618 | |
2619 | @@ -7538,6 +7541,8 @@ enum skl_disp_power_wells { |
2620 | |
2621 | #define CDCLK_FREQ _MMIO(0x46200) |
2622 | |
2623 | +#define CDCLK_FREQ _MMIO(0x46200) |
2624 | + |
2625 | #define _TRANSA_MSA_MISC 0x60410 |
2626 | #define _TRANSB_MSA_MISC 0x61410 |
2627 | #define _TRANSC_MSA_MISC 0x62410 |
2628 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
2629 | index 3074c56a643d..32893195d7c4 100644 |
2630 | --- a/drivers/gpu/drm/i915/intel_display.c |
2631 | +++ b/drivers/gpu/drm/i915/intel_display.c |
2632 | @@ -9700,6 +9700,8 @@ static void broadwell_set_cdclk(struct drm_device *dev, int cdclk) |
2633 | |
2634 | I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1); |
2635 | |
2636 | + I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1); |
2637 | + |
2638 | intel_update_cdclk(dev); |
2639 | |
2640 | WARN(cdclk != dev_priv->cdclk_freq, |
2641 | @@ -12095,21 +12097,11 @@ connected_sink_compute_bpp(struct intel_connector *connector, |
2642 | pipe_config->pipe_bpp = connector->base.display_info.bpc*3; |
2643 | } |
2644 | |
2645 | - /* Clamp bpp to default limit on screens without EDID 1.4 */ |
2646 | - if (connector->base.display_info.bpc == 0) { |
2647 | - int type = connector->base.connector_type; |
2648 | - int clamp_bpp = 24; |
2649 | - |
2650 | - /* Fall back to 18 bpp when DP sink capability is unknown. */ |
2651 | - if (type == DRM_MODE_CONNECTOR_DisplayPort || |
2652 | - type == DRM_MODE_CONNECTOR_eDP) |
2653 | - clamp_bpp = 18; |
2654 | - |
2655 | - if (bpp > clamp_bpp) { |
2656 | - DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of %d\n", |
2657 | - bpp, clamp_bpp); |
2658 | - pipe_config->pipe_bpp = clamp_bpp; |
2659 | - } |
2660 | + /* Clamp bpp to 8 on screens without EDID 1.4 */ |
2661 | + if (connector->base.display_info.bpc == 0 && bpp > 24) { |
2662 | + DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of 24\n", |
2663 | + bpp); |
2664 | + pipe_config->pipe_bpp = 24; |
2665 | } |
2666 | } |
2667 | |
2668 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
2669 | index 2863b92c9da6..c1ca5a7ba86f 100644 |
2670 | --- a/drivers/gpu/drm/i915/intel_pm.c |
2671 | +++ b/drivers/gpu/drm/i915/intel_pm.c |
2672 | @@ -4563,7 +4563,8 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) |
2673 | else |
2674 | gen6_set_rps(dev_priv->dev, dev_priv->rps.idle_freq); |
2675 | dev_priv->rps.last_adj = 0; |
2676 | - I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); |
2677 | + I915_WRITE(GEN6_PMINTRMSK, |
2678 | + gen6_sanitize_rps_pm_mask(dev_priv, ~0)); |
2679 | } |
2680 | mutex_unlock(&dev_priv->rps.hw_lock); |
2681 | |
2682 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
2683 | index 68c5af079ef8..9d778f3ab27d 100644 |
2684 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
2685 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
2686 | @@ -1135,6 +1135,11 @@ static int skl_init_workarounds(struct intel_engine_cs *engine) |
2687 | /* WaDisableGafsUnitClkGating:skl */ |
2688 | WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); |
2689 | |
2690 | + /* WaInPlaceDecompressionHang:skl */ |
2691 | + if (IS_SKL_REVID(dev_priv, SKL_REVID_H0, REVID_FOREVER)) |
2692 | + WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, |
2693 | + GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); |
2694 | + |
2695 | /* WaDisableLSQCROPERFforOCL:skl */ |
2696 | ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); |
2697 | if (ret) |
2698 | @@ -1194,6 +1199,11 @@ static int bxt_init_workarounds(struct intel_engine_cs *engine) |
2699 | WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, |
2700 | GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION); |
2701 | |
2702 | + /* WaInPlaceDecompressionHang:bxt */ |
2703 | + if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER)) |
2704 | + WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, |
2705 | + GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); |
2706 | + |
2707 | return 0; |
2708 | } |
2709 | |
2710 | @@ -1241,6 +1251,10 @@ static int kbl_init_workarounds(struct intel_engine_cs *engine) |
2711 | GEN7_HALF_SLICE_CHICKEN1, |
2712 | GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); |
2713 | |
2714 | + /* WaInPlaceDecompressionHang:kbl */ |
2715 | + WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, |
2716 | + GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); |
2717 | + |
2718 | /* WaDisableLSQCROPERFforOCL:kbl */ |
2719 | ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); |
2720 | if (ret) |
2721 | diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c |
2722 | index 11f8dd9c0edb..d6c134b01833 100644 |
2723 | --- a/drivers/gpu/drm/nouveau/nouveau_drm.c |
2724 | +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c |
2725 | @@ -324,7 +324,16 @@ static int nouveau_drm_probe(struct pci_dev *pdev, |
2726 | !vga_switcheroo_handler_flags()) |
2727 | return -EPROBE_DEFER; |
2728 | |
2729 | - /* remove conflicting drivers (vesafb, efifb etc) */ |
2730 | + /* We need to check that the chipset is supported before booting |
2731 | + * fbdev off the hardware, as there's no way to put it back. |
2732 | + */ |
2733 | + ret = nvkm_device_pci_new(pdev, NULL, "error", true, false, 0, &device); |
2734 | + if (ret) |
2735 | + return ret; |
2736 | + |
2737 | + nvkm_device_del(&device); |
2738 | + |
2739 | + /* Remove conflicting drivers (vesafb, efifb etc). */ |
2740 | aper = alloc_apertures(3); |
2741 | if (!aper) |
2742 | return -ENOMEM; |
2743 | diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c |
2744 | index 7d9248b8c664..da8fd5ff9d0f 100644 |
2745 | --- a/drivers/gpu/drm/nouveau/nv04_fbcon.c |
2746 | +++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c |
2747 | @@ -107,11 +107,11 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) |
2748 | ((image->dx + image->width) & 0xffff)); |
2749 | OUT_RING(chan, bg); |
2750 | OUT_RING(chan, fg); |
2751 | - OUT_RING(chan, (image->height << 16) | image->width); |
2752 | + OUT_RING(chan, (image->height << 16) | ALIGN(image->width, 8)); |
2753 | OUT_RING(chan, (image->height << 16) | image->width); |
2754 | OUT_RING(chan, (image->dy << 16) | (image->dx & 0xffff)); |
2755 | |
2756 | - dsize = ALIGN(image->width * image->height, 32) >> 5; |
2757 | + dsize = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; |
2758 | while (dsize) { |
2759 | int iter_len = dsize > 128 ? 128 : dsize; |
2760 | |
2761 | diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c |
2762 | index 1aeb698e9707..af3d3c49411a 100644 |
2763 | --- a/drivers/gpu/drm/nouveau/nv50_fbcon.c |
2764 | +++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c |
2765 | @@ -125,7 +125,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) |
2766 | OUT_RING(chan, 0); |
2767 | OUT_RING(chan, image->dy); |
2768 | |
2769 | - dwords = ALIGN(image->width * image->height, 32) >> 5; |
2770 | + dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; |
2771 | while (dwords) { |
2772 | int push = dwords > 2047 ? 2047 : dwords; |
2773 | |
2774 | diff --git a/drivers/gpu/drm/nouveau/nvc0_fbcon.c b/drivers/gpu/drm/nouveau/nvc0_fbcon.c |
2775 | index 839f4c8c1805..054b6a056d99 100644 |
2776 | --- a/drivers/gpu/drm/nouveau/nvc0_fbcon.c |
2777 | +++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c |
2778 | @@ -125,7 +125,7 @@ nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) |
2779 | OUT_RING (chan, 0); |
2780 | OUT_RING (chan, image->dy); |
2781 | |
2782 | - dwords = ALIGN(image->width * image->height, 32) >> 5; |
2783 | + dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; |
2784 | while (dwords) { |
2785 | int push = dwords > 2047 ? 2047 : dwords; |
2786 | |
2787 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c |
2788 | index 69de8c6259fe..f1e15a4d4f64 100644 |
2789 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c |
2790 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c |
2791 | @@ -76,8 +76,8 @@ nv30_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, |
2792 | nvkm_wo32(chan->inst, i, 0x00040004); |
2793 | for (i = 0x1f18; i <= 0x3088 ; i += 16) { |
2794 | nvkm_wo32(chan->inst, i + 0, 0x10700ff9); |
2795 | - nvkm_wo32(chan->inst, i + 1, 0x0436086c); |
2796 | - nvkm_wo32(chan->inst, i + 2, 0x000c001b); |
2797 | + nvkm_wo32(chan->inst, i + 4, 0x0436086c); |
2798 | + nvkm_wo32(chan->inst, i + 8, 0x000c001b); |
2799 | } |
2800 | for (i = 0x30b8; i < 0x30c8; i += 4) |
2801 | nvkm_wo32(chan->inst, i, 0x0000ffff); |
2802 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c |
2803 | index 2207dac23981..300f5ed5de0b 100644 |
2804 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c |
2805 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c |
2806 | @@ -75,8 +75,8 @@ nv34_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, |
2807 | nvkm_wo32(chan->inst, i, 0x00040004); |
2808 | for (i = 0x15ac; i <= 0x271c ; i += 16) { |
2809 | nvkm_wo32(chan->inst, i + 0, 0x10700ff9); |
2810 | - nvkm_wo32(chan->inst, i + 1, 0x0436086c); |
2811 | - nvkm_wo32(chan->inst, i + 2, 0x000c001b); |
2812 | + nvkm_wo32(chan->inst, i + 4, 0x0436086c); |
2813 | + nvkm_wo32(chan->inst, i + 8, 0x000c001b); |
2814 | } |
2815 | for (i = 0x274c; i < 0x275c; i += 4) |
2816 | nvkm_wo32(chan->inst, i, 0x0000ffff); |
2817 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
2818 | index 587cae4e73c9..56bb758f4e33 100644 |
2819 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
2820 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
2821 | @@ -120,6 +120,7 @@ atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) |
2822 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
2823 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
2824 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
2825 | + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: |
2826 | if (dig->backlight_level == 0) |
2827 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); |
2828 | else { |
2829 | diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c |
2830 | index f8097a0e7a79..5df3ec73021b 100644 |
2831 | --- a/drivers/gpu/drm/radeon/radeon_atombios.c |
2832 | +++ b/drivers/gpu/drm/radeon/radeon_atombios.c |
2833 | @@ -1155,7 +1155,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) |
2834 | le16_to_cpu(firmware_info->info.usReferenceClock); |
2835 | p1pll->reference_div = 0; |
2836 | |
2837 | - if (crev < 2) |
2838 | + if ((frev < 2) && (crev < 2)) |
2839 | p1pll->pll_out_min = |
2840 | le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output); |
2841 | else |
2842 | @@ -1164,7 +1164,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) |
2843 | p1pll->pll_out_max = |
2844 | le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); |
2845 | |
2846 | - if (crev >= 4) { |
2847 | + if (((frev < 2) && (crev >= 4)) || (frev >= 2)) { |
2848 | p1pll->lcd_pll_out_min = |
2849 | le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; |
2850 | if (p1pll->lcd_pll_out_min == 0) |
2851 | diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
2852 | index 95f4fea89302..1b3f4e51f5dc 100644 |
2853 | --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
2854 | +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
2855 | @@ -10,6 +10,7 @@ |
2856 | #include <linux/slab.h> |
2857 | #include <linux/acpi.h> |
2858 | #include <linux/pci.h> |
2859 | +#include <linux/delay.h> |
2860 | |
2861 | #include "radeon_acpi.h" |
2862 | |
2863 | @@ -258,6 +259,10 @@ static int radeon_atpx_set_discrete_state(struct radeon_atpx *atpx, u8 state) |
2864 | if (!info) |
2865 | return -EIO; |
2866 | kfree(info); |
2867 | + |
2868 | + /* 200ms delay is required after off */ |
2869 | + if (state == 0) |
2870 | + msleep(200); |
2871 | } |
2872 | return 0; |
2873 | } |
2874 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
2875 | index 81a63d7f5cd9..b79f3b002471 100644 |
2876 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
2877 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
2878 | @@ -2064,7 +2064,6 @@ radeon_add_atom_connector(struct drm_device *dev, |
2879 | RADEON_OUTPUT_CSC_BYPASS); |
2880 | /* no HPD on analog connectors */ |
2881 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2882 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2883 | connector->interlace_allowed = true; |
2884 | connector->doublescan_allowed = true; |
2885 | break; |
2886 | @@ -2314,8 +2313,10 @@ radeon_add_atom_connector(struct drm_device *dev, |
2887 | } |
2888 | |
2889 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { |
2890 | - if (i2c_bus->valid) |
2891 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2892 | + if (i2c_bus->valid) { |
2893 | + connector->polled = DRM_CONNECTOR_POLL_CONNECT | |
2894 | + DRM_CONNECTOR_POLL_DISCONNECT; |
2895 | + } |
2896 | } else |
2897 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2898 | |
2899 | @@ -2391,7 +2392,6 @@ radeon_add_legacy_connector(struct drm_device *dev, |
2900 | 1); |
2901 | /* no HPD on analog connectors */ |
2902 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2903 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2904 | connector->interlace_allowed = true; |
2905 | connector->doublescan_allowed = true; |
2906 | break; |
2907 | @@ -2476,10 +2476,13 @@ radeon_add_legacy_connector(struct drm_device *dev, |
2908 | } |
2909 | |
2910 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { |
2911 | - if (i2c_bus->valid) |
2912 | - connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2913 | + if (i2c_bus->valid) { |
2914 | + connector->polled = DRM_CONNECTOR_POLL_CONNECT | |
2915 | + DRM_CONNECTOR_POLL_DISCONNECT; |
2916 | + } |
2917 | } else |
2918 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2919 | + |
2920 | connector->display_info.subpixel_order = subpixel_order; |
2921 | drm_connector_register(connector); |
2922 | } |
2923 | diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
2924 | index 1c4d5b5a70a2..b1673236c356 100644 |
2925 | --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
2926 | +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
2927 | @@ -1048,6 +1048,17 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) |
2928 | drm_crtc_cleanup(crtc); |
2929 | } |
2930 | |
2931 | +static void vop_crtc_reset(struct drm_crtc *crtc) |
2932 | +{ |
2933 | + if (crtc->state) |
2934 | + __drm_atomic_helper_crtc_destroy_state(crtc->state); |
2935 | + kfree(crtc->state); |
2936 | + |
2937 | + crtc->state = kzalloc(sizeof(struct rockchip_crtc_state), GFP_KERNEL); |
2938 | + if (crtc->state) |
2939 | + crtc->state->crtc = crtc; |
2940 | +} |
2941 | + |
2942 | static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) |
2943 | { |
2944 | struct rockchip_crtc_state *rockchip_state; |
2945 | @@ -1073,7 +1084,7 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { |
2946 | .set_config = drm_atomic_helper_set_config, |
2947 | .page_flip = drm_atomic_helper_page_flip, |
2948 | .destroy = vop_crtc_destroy, |
2949 | - .reset = drm_atomic_helper_crtc_reset, |
2950 | + .reset = vop_crtc_reset, |
2951 | .atomic_duplicate_state = vop_crtc_duplicate_state, |
2952 | .atomic_destroy_state = vop_crtc_destroy_state, |
2953 | }; |
2954 | diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c |
2955 | index 16b6f11a0700..99ec3ff7563b 100644 |
2956 | --- a/drivers/hid/uhid.c |
2957 | +++ b/drivers/hid/uhid.c |
2958 | @@ -51,10 +51,26 @@ struct uhid_device { |
2959 | u32 report_id; |
2960 | u32 report_type; |
2961 | struct uhid_event report_buf; |
2962 | + struct work_struct worker; |
2963 | }; |
2964 | |
2965 | static struct miscdevice uhid_misc; |
2966 | |
2967 | +static void uhid_device_add_worker(struct work_struct *work) |
2968 | +{ |
2969 | + struct uhid_device *uhid = container_of(work, struct uhid_device, worker); |
2970 | + int ret; |
2971 | + |
2972 | + ret = hid_add_device(uhid->hid); |
2973 | + if (ret) { |
2974 | + hid_err(uhid->hid, "Cannot register HID device: error %d\n", ret); |
2975 | + |
2976 | + hid_destroy_device(uhid->hid); |
2977 | + uhid->hid = NULL; |
2978 | + uhid->running = false; |
2979 | + } |
2980 | +} |
2981 | + |
2982 | static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev) |
2983 | { |
2984 | __u8 newhead; |
2985 | @@ -498,18 +514,14 @@ static int uhid_dev_create2(struct uhid_device *uhid, |
2986 | uhid->hid = hid; |
2987 | uhid->running = true; |
2988 | |
2989 | - ret = hid_add_device(hid); |
2990 | - if (ret) { |
2991 | - hid_err(hid, "Cannot register HID device\n"); |
2992 | - goto err_hid; |
2993 | - } |
2994 | + /* Adding of a HID device is done through a worker, to allow HID drivers |
2995 | + * which use feature requests during .probe to work, without they would |
2996 | + * be blocked on devlock, which is held by uhid_char_write. |
2997 | + */ |
2998 | + schedule_work(&uhid->worker); |
2999 | |
3000 | return 0; |
3001 | |
3002 | -err_hid: |
3003 | - hid_destroy_device(hid); |
3004 | - uhid->hid = NULL; |
3005 | - uhid->running = false; |
3006 | err_free: |
3007 | kfree(uhid->rd_data); |
3008 | uhid->rd_data = NULL; |
3009 | @@ -550,6 +562,8 @@ static int uhid_dev_destroy(struct uhid_device *uhid) |
3010 | uhid->running = false; |
3011 | wake_up_interruptible(&uhid->report_wait); |
3012 | |
3013 | + cancel_work_sync(&uhid->worker); |
3014 | + |
3015 | hid_destroy_device(uhid->hid); |
3016 | kfree(uhid->rd_data); |
3017 | |
3018 | @@ -612,6 +626,7 @@ static int uhid_char_open(struct inode *inode, struct file *file) |
3019 | init_waitqueue_head(&uhid->waitq); |
3020 | init_waitqueue_head(&uhid->report_wait); |
3021 | uhid->running = false; |
3022 | + INIT_WORK(&uhid->worker, uhid_device_add_worker); |
3023 | |
3024 | file->private_data = uhid; |
3025 | nonseekable_open(inode, file); |
3026 | diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c |
3027 | index 952f20fdc7e3..e82f7e1c217c 100644 |
3028 | --- a/drivers/hv/vmbus_drv.c |
3029 | +++ b/drivers/hv/vmbus_drv.c |
3030 | @@ -42,6 +42,7 @@ |
3031 | #include <linux/screen_info.h> |
3032 | #include <linux/kdebug.h> |
3033 | #include <linux/efi.h> |
3034 | +#include <linux/random.h> |
3035 | #include "hyperv_vmbus.h" |
3036 | |
3037 | static struct acpi_device *hv_acpi_dev; |
3038 | @@ -806,6 +807,8 @@ static void vmbus_isr(void) |
3039 | else |
3040 | tasklet_schedule(hv_context.msg_dpc[cpu]); |
3041 | } |
3042 | + |
3043 | + add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); |
3044 | } |
3045 | |
3046 | |
3047 | diff --git a/drivers/i2c/busses/i2c-efm32.c b/drivers/i2c/busses/i2c-efm32.c |
3048 | index 8eff62738877..e253598d764c 100644 |
3049 | --- a/drivers/i2c/busses/i2c-efm32.c |
3050 | +++ b/drivers/i2c/busses/i2c-efm32.c |
3051 | @@ -433,7 +433,7 @@ static int efm32_i2c_probe(struct platform_device *pdev) |
3052 | ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata); |
3053 | if (ret < 0) { |
3054 | dev_err(&pdev->dev, "failed to request irq (%d)\n", ret); |
3055 | - return ret; |
3056 | + goto err_disable_clk; |
3057 | } |
3058 | |
3059 | ret = i2c_add_adapter(&ddata->adapter); |
3060 | diff --git a/drivers/infiniband/core/rw.c b/drivers/infiniband/core/rw.c |
3061 | index 1eb9b1294a63..dbfd854c32c9 100644 |
3062 | --- a/drivers/infiniband/core/rw.c |
3063 | +++ b/drivers/infiniband/core/rw.c |
3064 | @@ -58,19 +58,13 @@ static inline bool rdma_rw_io_needs_mr(struct ib_device *dev, u8 port_num, |
3065 | return false; |
3066 | } |
3067 | |
3068 | -static inline u32 rdma_rw_max_sge(struct ib_device *dev, |
3069 | - enum dma_data_direction dir) |
3070 | -{ |
3071 | - return dir == DMA_TO_DEVICE ? |
3072 | - dev->attrs.max_sge : dev->attrs.max_sge_rd; |
3073 | -} |
3074 | - |
3075 | static inline u32 rdma_rw_fr_page_list_len(struct ib_device *dev) |
3076 | { |
3077 | /* arbitrary limit to avoid allocating gigantic resources */ |
3078 | return min_t(u32, dev->attrs.max_fast_reg_page_list_len, 256); |
3079 | } |
3080 | |
3081 | +/* Caller must have zero-initialized *reg. */ |
3082 | static int rdma_rw_init_one_mr(struct ib_qp *qp, u8 port_num, |
3083 | struct rdma_rw_reg_ctx *reg, struct scatterlist *sg, |
3084 | u32 sg_cnt, u32 offset) |
3085 | @@ -114,6 +108,7 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3086 | u8 port_num, struct scatterlist *sg, u32 sg_cnt, u32 offset, |
3087 | u64 remote_addr, u32 rkey, enum dma_data_direction dir) |
3088 | { |
3089 | + struct rdma_rw_reg_ctx *prev = NULL; |
3090 | u32 pages_per_mr = rdma_rw_fr_page_list_len(qp->pd->device); |
3091 | int i, j, ret = 0, count = 0; |
3092 | |
3093 | @@ -125,7 +120,6 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3094 | } |
3095 | |
3096 | for (i = 0; i < ctx->nr_ops; i++) { |
3097 | - struct rdma_rw_reg_ctx *prev = i ? &ctx->reg[i - 1] : NULL; |
3098 | struct rdma_rw_reg_ctx *reg = &ctx->reg[i]; |
3099 | u32 nents = min(sg_cnt, pages_per_mr); |
3100 | |
3101 | @@ -162,9 +156,13 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3102 | sg_cnt -= nents; |
3103 | for (j = 0; j < nents; j++) |
3104 | sg = sg_next(sg); |
3105 | + prev = reg; |
3106 | offset = 0; |
3107 | } |
3108 | |
3109 | + if (prev) |
3110 | + prev->wr.wr.next = NULL; |
3111 | + |
3112 | ctx->type = RDMA_RW_MR; |
3113 | return count; |
3114 | |
3115 | @@ -181,7 +179,8 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3116 | u64 remote_addr, u32 rkey, enum dma_data_direction dir) |
3117 | { |
3118 | struct ib_device *dev = qp->pd->device; |
3119 | - u32 max_sge = rdma_rw_max_sge(dev, dir); |
3120 | + u32 max_sge = dir == DMA_TO_DEVICE ? qp->max_write_sge : |
3121 | + qp->max_read_sge; |
3122 | struct ib_sge *sge; |
3123 | u32 total_len = 0, i, j; |
3124 | |
3125 | @@ -205,11 +204,10 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3126 | rdma_wr->wr.opcode = IB_WR_RDMA_READ; |
3127 | rdma_wr->remote_addr = remote_addr + total_len; |
3128 | rdma_wr->rkey = rkey; |
3129 | + rdma_wr->wr.num_sge = nr_sge; |
3130 | rdma_wr->wr.sg_list = sge; |
3131 | |
3132 | for (j = 0; j < nr_sge; j++, sg = sg_next(sg)) { |
3133 | - rdma_wr->wr.num_sge++; |
3134 | - |
3135 | sge->addr = ib_sg_dma_address(dev, sg) + offset; |
3136 | sge->length = ib_sg_dma_len(dev, sg) - offset; |
3137 | sge->lkey = qp->pd->local_dma_lkey; |
3138 | @@ -220,8 +218,8 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, |
3139 | offset = 0; |
3140 | } |
3141 | |
3142 | - if (i + 1 < ctx->nr_ops) |
3143 | - rdma_wr->wr.next = &ctx->map.wrs[i + 1].wr; |
3144 | + rdma_wr->wr.next = i + 1 < ctx->nr_ops ? |
3145 | + &ctx->map.wrs[i + 1].wr : NULL; |
3146 | } |
3147 | |
3148 | ctx->type = RDMA_RW_MULTI_WR; |
3149 | diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c |
3150 | index 6298f54b4137..e39a0b597234 100644 |
3151 | --- a/drivers/infiniband/core/verbs.c |
3152 | +++ b/drivers/infiniband/core/verbs.c |
3153 | @@ -814,6 +814,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, |
3154 | } |
3155 | } |
3156 | |
3157 | + /* |
3158 | + * Note: all hw drivers guarantee that max_send_sge is lower than |
3159 | + * the device RDMA WRITE SGE limit but not all hw drivers ensure that |
3160 | + * max_send_sge <= max_sge_rd. |
3161 | + */ |
3162 | + qp->max_write_sge = qp_init_attr->cap.max_send_sge; |
3163 | + qp->max_read_sge = min_t(u32, qp_init_attr->cap.max_send_sge, |
3164 | + device->attrs.max_sge_rd); |
3165 | + |
3166 | return qp; |
3167 | } |
3168 | EXPORT_SYMBOL(ib_create_qp); |
3169 | diff --git a/drivers/infiniband/hw/mlx5/gsi.c b/drivers/infiniband/hw/mlx5/gsi.c |
3170 | index 53e03c8ede79..79e6309460dc 100644 |
3171 | --- a/drivers/infiniband/hw/mlx5/gsi.c |
3172 | +++ b/drivers/infiniband/hw/mlx5/gsi.c |
3173 | @@ -69,15 +69,6 @@ static bool mlx5_ib_deth_sqpn_cap(struct mlx5_ib_dev *dev) |
3174 | return MLX5_CAP_GEN(dev->mdev, set_deth_sqpn); |
3175 | } |
3176 | |
3177 | -static u32 next_outstanding(struct mlx5_ib_gsi_qp *gsi, u32 index) |
3178 | -{ |
3179 | - return ++index % gsi->cap.max_send_wr; |
3180 | -} |
3181 | - |
3182 | -#define for_each_outstanding_wr(gsi, index) \ |
3183 | - for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; \ |
3184 | - index = next_outstanding(gsi, index)) |
3185 | - |
3186 | /* Call with gsi->lock locked */ |
3187 | static void generate_completions(struct mlx5_ib_gsi_qp *gsi) |
3188 | { |
3189 | @@ -85,8 +76,9 @@ static void generate_completions(struct mlx5_ib_gsi_qp *gsi) |
3190 | struct mlx5_ib_gsi_wr *wr; |
3191 | u32 index; |
3192 | |
3193 | - for_each_outstanding_wr(gsi, index) { |
3194 | - wr = &gsi->outstanding_wrs[index]; |
3195 | + for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; |
3196 | + index++) { |
3197 | + wr = &gsi->outstanding_wrs[index % gsi->cap.max_send_wr]; |
3198 | |
3199 | if (!wr->completed) |
3200 | break; |
3201 | @@ -430,8 +422,9 @@ static int mlx5_ib_add_outstanding_wr(struct mlx5_ib_gsi_qp *gsi, |
3202 | return -ENOMEM; |
3203 | } |
3204 | |
3205 | - gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi]; |
3206 | - gsi->outstanding_pi = next_outstanding(gsi, gsi->outstanding_pi); |
3207 | + gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi % |
3208 | + gsi->cap.max_send_wr]; |
3209 | + gsi->outstanding_pi++; |
3210 | |
3211 | if (!wc) { |
3212 | memset(&gsi_wr->wc, 0, sizeof(gsi_wr->wc)); |
3213 | diff --git a/drivers/infiniband/sw/rdmavt/Kconfig b/drivers/infiniband/sw/rdmavt/Kconfig |
3214 | index 11aa6a34bd71..1da8d01a6855 100644 |
3215 | --- a/drivers/infiniband/sw/rdmavt/Kconfig |
3216 | +++ b/drivers/infiniband/sw/rdmavt/Kconfig |
3217 | @@ -1,6 +1,5 @@ |
3218 | config INFINIBAND_RDMAVT |
3219 | tristate "RDMA verbs transport library" |
3220 | depends on 64BIT |
3221 | - default m |
3222 | ---help--- |
3223 | This is a common software verbs provider for RDMA networks. |
3224 | diff --git a/drivers/infiniband/sw/rdmavt/cq.c b/drivers/infiniband/sw/rdmavt/cq.c |
3225 | index 6ca6fa80dd6e..f2f229efbe64 100644 |
3226 | --- a/drivers/infiniband/sw/rdmavt/cq.c |
3227 | +++ b/drivers/infiniband/sw/rdmavt/cq.c |
3228 | @@ -510,6 +510,7 @@ int rvt_driver_cq_init(struct rvt_dev_info *rdi) |
3229 | |
3230 | if (rdi->worker) |
3231 | return 0; |
3232 | + spin_lock_init(&rdi->n_cqs_lock); |
3233 | rdi->worker = kzalloc(sizeof(*rdi->worker), GFP_KERNEL); |
3234 | if (!rdi->worker) |
3235 | return -ENOMEM; |
3236 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
3237 | index 4a4155640d51..9a3b954e862d 100644 |
3238 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
3239 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
3240 | @@ -1601,6 +1601,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch) |
3241 | struct ib_qp_init_attr *qp_init; |
3242 | struct srpt_port *sport = ch->sport; |
3243 | struct srpt_device *sdev = sport->sdev; |
3244 | + const struct ib_device_attr *attrs = &sdev->device->attrs; |
3245 | u32 srp_sq_size = sport->port_attrib.srp_sq_size; |
3246 | int ret; |
3247 | |
3248 | @@ -1638,7 +1639,7 @@ retry: |
3249 | */ |
3250 | qp_init->cap.max_send_wr = srp_sq_size / 2; |
3251 | qp_init->cap.max_rdma_ctxs = srp_sq_size / 2; |
3252 | - qp_init->cap.max_send_sge = SRPT_DEF_SG_PER_WQE; |
3253 | + qp_init->cap.max_send_sge = min(attrs->max_sge, SRPT_MAX_SG_PER_WQE); |
3254 | qp_init->port_num = ch->sport->port; |
3255 | |
3256 | ch->qp = ib_create_qp(sdev->pd, qp_init); |
3257 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h |
3258 | index 389030487da7..581878782854 100644 |
3259 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.h |
3260 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.h |
3261 | @@ -106,7 +106,11 @@ enum { |
3262 | SRP_LOGIN_RSP_MULTICHAN_MAINTAINED = 0x2, |
3263 | |
3264 | SRPT_DEF_SG_TABLESIZE = 128, |
3265 | - SRPT_DEF_SG_PER_WQE = 16, |
3266 | + /* |
3267 | + * An experimentally determined value that avoids that QP creation |
3268 | + * fails due to "swiotlb buffer is full" on systems using the swiotlb. |
3269 | + */ |
3270 | + SRPT_MAX_SG_PER_WQE = 16, |
3271 | |
3272 | MIN_SRPT_SQ_SIZE = 16, |
3273 | DEF_SRPT_SQ_SIZE = 4096, |
3274 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c |
3275 | index 2f589857a039..d15b33813021 100644 |
3276 | --- a/drivers/input/mouse/elan_i2c_core.c |
3277 | +++ b/drivers/input/mouse/elan_i2c_core.c |
3278 | @@ -4,7 +4,8 @@ |
3279 | * Copyright (c) 2013 ELAN Microelectronics Corp. |
3280 | * |
3281 | * Author: æž—æ”¿ç¶ (Duson Lin) <dusonlin@emc.com.tw> |
3282 | - * Version: 1.6.0 |
3283 | + * Author: KT Liao <kt.liao@emc.com.tw> |
3284 | + * Version: 1.6.2 |
3285 | * |
3286 | * Based on cyapa driver: |
3287 | * copyright (c) 2011-2012 Cypress Semiconductor, Inc. |
3288 | @@ -40,7 +41,7 @@ |
3289 | #include "elan_i2c.h" |
3290 | |
3291 | #define DRIVER_NAME "elan_i2c" |
3292 | -#define ELAN_DRIVER_VERSION "1.6.1" |
3293 | +#define ELAN_DRIVER_VERSION "1.6.2" |
3294 | #define ELAN_VENDOR_ID 0x04f3 |
3295 | #define ETP_MAX_PRESSURE 255 |
3296 | #define ETP_FWIDTH_REDUCE 90 |
3297 | @@ -199,9 +200,41 @@ static int elan_sleep(struct elan_tp_data *data) |
3298 | return error; |
3299 | } |
3300 | |
3301 | +static int elan_query_product(struct elan_tp_data *data) |
3302 | +{ |
3303 | + int error; |
3304 | + |
3305 | + error = data->ops->get_product_id(data->client, &data->product_id); |
3306 | + if (error) |
3307 | + return error; |
3308 | + |
3309 | + error = data->ops->get_sm_version(data->client, &data->ic_type, |
3310 | + &data->sm_version); |
3311 | + if (error) |
3312 | + return error; |
3313 | + |
3314 | + return 0; |
3315 | +} |
3316 | + |
3317 | +static int elan_check_ASUS_special_fw(struct elan_tp_data *data) |
3318 | +{ |
3319 | + if (data->ic_type != 0x0E) |
3320 | + return false; |
3321 | + |
3322 | + switch (data->product_id) { |
3323 | + case 0x05 ... 0x07: |
3324 | + case 0x09: |
3325 | + case 0x13: |
3326 | + return true; |
3327 | + default: |
3328 | + return false; |
3329 | + } |
3330 | +} |
3331 | + |
3332 | static int __elan_initialize(struct elan_tp_data *data) |
3333 | { |
3334 | struct i2c_client *client = data->client; |
3335 | + bool woken_up = false; |
3336 | int error; |
3337 | |
3338 | error = data->ops->initialize(client); |
3339 | @@ -210,6 +243,27 @@ static int __elan_initialize(struct elan_tp_data *data) |
3340 | return error; |
3341 | } |
3342 | |
3343 | + error = elan_query_product(data); |
3344 | + if (error) |
3345 | + return error; |
3346 | + |
3347 | + /* |
3348 | + * Some ASUS devices were shipped with firmware that requires |
3349 | + * touchpads to be woken up first, before attempting to switch |
3350 | + * them into absolute reporting mode. |
3351 | + */ |
3352 | + if (elan_check_ASUS_special_fw(data)) { |
3353 | + error = data->ops->sleep_control(client, false); |
3354 | + if (error) { |
3355 | + dev_err(&client->dev, |
3356 | + "failed to wake device up: %d\n", error); |
3357 | + return error; |
3358 | + } |
3359 | + |
3360 | + msleep(200); |
3361 | + woken_up = true; |
3362 | + } |
3363 | + |
3364 | data->mode |= ETP_ENABLE_ABS; |
3365 | error = data->ops->set_mode(client, data->mode); |
3366 | if (error) { |
3367 | @@ -218,11 +272,13 @@ static int __elan_initialize(struct elan_tp_data *data) |
3368 | return error; |
3369 | } |
3370 | |
3371 | - error = data->ops->sleep_control(client, false); |
3372 | - if (error) { |
3373 | - dev_err(&client->dev, |
3374 | - "failed to wake device up: %d\n", error); |
3375 | - return error; |
3376 | + if (!woken_up) { |
3377 | + error = data->ops->sleep_control(client, false); |
3378 | + if (error) { |
3379 | + dev_err(&client->dev, |
3380 | + "failed to wake device up: %d\n", error); |
3381 | + return error; |
3382 | + } |
3383 | } |
3384 | |
3385 | return 0; |
3386 | @@ -248,10 +304,6 @@ static int elan_query_device_info(struct elan_tp_data *data) |
3387 | { |
3388 | int error; |
3389 | |
3390 | - error = data->ops->get_product_id(data->client, &data->product_id); |
3391 | - if (error) |
3392 | - return error; |
3393 | - |
3394 | error = data->ops->get_version(data->client, false, &data->fw_version); |
3395 | if (error) |
3396 | return error; |
3397 | @@ -261,11 +313,6 @@ static int elan_query_device_info(struct elan_tp_data *data) |
3398 | if (error) |
3399 | return error; |
3400 | |
3401 | - error = data->ops->get_sm_version(data->client, &data->ic_type, |
3402 | - &data->sm_version); |
3403 | - if (error) |
3404 | - return error; |
3405 | - |
3406 | error = data->ops->get_version(data->client, true, &data->iap_version); |
3407 | if (error) |
3408 | return error; |
3409 | diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c |
3410 | index 880c40b23f66..b7e8c11a6fc2 100644 |
3411 | --- a/drivers/input/touchscreen/sur40.c |
3412 | +++ b/drivers/input/touchscreen/sur40.c |
3413 | @@ -126,7 +126,7 @@ struct sur40_image_header { |
3414 | #define VIDEO_PACKET_SIZE 16384 |
3415 | |
3416 | /* polling interval (ms) */ |
3417 | -#define POLL_INTERVAL 4 |
3418 | +#define POLL_INTERVAL 1 |
3419 | |
3420 | /* maximum number of contacts FIXME: this is a guess? */ |
3421 | #define MAX_CONTACTS 64 |
3422 | @@ -448,7 +448,7 @@ static void sur40_process_video(struct sur40_state *sur40) |
3423 | |
3424 | /* return error if streaming was stopped in the meantime */ |
3425 | if (sur40->sequence == -1) |
3426 | - goto err_poll; |
3427 | + return; |
3428 | |
3429 | /* mark as finished */ |
3430 | new_buf->vb.vb2_buf.timestamp = ktime_get_ns(); |
3431 | @@ -736,6 +736,7 @@ static int sur40_start_streaming(struct vb2_queue *vq, unsigned int count) |
3432 | static void sur40_stop_streaming(struct vb2_queue *vq) |
3433 | { |
3434 | struct sur40_state *sur40 = vb2_get_drv_priv(vq); |
3435 | + vb2_wait_for_all_buffers(vq); |
3436 | sur40->sequence = -1; |
3437 | |
3438 | /* Release all active buffers */ |
3439 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
3440 | index 634f636393d5..2511c8b6aada 100644 |
3441 | --- a/drivers/iommu/amd_iommu.c |
3442 | +++ b/drivers/iommu/amd_iommu.c |
3443 | @@ -466,9 +466,11 @@ static void init_iommu_group(struct device *dev) |
3444 | if (!domain) |
3445 | goto out; |
3446 | |
3447 | - dma_domain = to_pdomain(domain)->priv; |
3448 | + if (to_pdomain(domain)->flags == PD_DMA_OPS_MASK) { |
3449 | + dma_domain = to_pdomain(domain)->priv; |
3450 | + init_unity_mappings_for_device(dev, dma_domain); |
3451 | + } |
3452 | |
3453 | - init_unity_mappings_for_device(dev, dma_domain); |
3454 | out: |
3455 | iommu_group_put(group); |
3456 | } |
3457 | @@ -2512,8 +2514,15 @@ static void update_device_table(struct protection_domain *domain) |
3458 | { |
3459 | struct iommu_dev_data *dev_data; |
3460 | |
3461 | - list_for_each_entry(dev_data, &domain->dev_list, list) |
3462 | + list_for_each_entry(dev_data, &domain->dev_list, list) { |
3463 | set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled); |
3464 | + |
3465 | + if (dev_data->devid == dev_data->alias) |
3466 | + continue; |
3467 | + |
3468 | + /* There is an alias, update device table entry for it */ |
3469 | + set_dte_entry(dev_data->alias, domain, dev_data->ats.enabled); |
3470 | + } |
3471 | } |
3472 | |
3473 | static void update_domain(struct protection_domain *domain) |
3474 | @@ -3103,9 +3112,7 @@ static struct iommu_domain *amd_iommu_domain_alloc(unsigned type) |
3475 | static void amd_iommu_domain_free(struct iommu_domain *dom) |
3476 | { |
3477 | struct protection_domain *domain; |
3478 | - |
3479 | - if (!dom) |
3480 | - return; |
3481 | + struct dma_ops_domain *dma_dom; |
3482 | |
3483 | domain = to_pdomain(dom); |
3484 | |
3485 | @@ -3114,13 +3121,24 @@ static void amd_iommu_domain_free(struct iommu_domain *dom) |
3486 | |
3487 | BUG_ON(domain->dev_cnt != 0); |
3488 | |
3489 | - if (domain->mode != PAGE_MODE_NONE) |
3490 | - free_pagetable(domain); |
3491 | + if (!dom) |
3492 | + return; |
3493 | + |
3494 | + switch (dom->type) { |
3495 | + case IOMMU_DOMAIN_DMA: |
3496 | + dma_dom = domain->priv; |
3497 | + dma_ops_domain_free(dma_dom); |
3498 | + break; |
3499 | + default: |
3500 | + if (domain->mode != PAGE_MODE_NONE) |
3501 | + free_pagetable(domain); |
3502 | |
3503 | - if (domain->flags & PD_IOMMUV2_MASK) |
3504 | - free_gcr3_table(domain); |
3505 | + if (domain->flags & PD_IOMMUV2_MASK) |
3506 | + free_gcr3_table(domain); |
3507 | |
3508 | - protection_domain_free(domain); |
3509 | + protection_domain_free(domain); |
3510 | + break; |
3511 | + } |
3512 | } |
3513 | |
3514 | static void amd_iommu_detach_device(struct iommu_domain *dom, |
3515 | diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c |
3516 | index 5ecc86cb74c8..e27e3b7df4e7 100644 |
3517 | --- a/drivers/iommu/exynos-iommu.c |
3518 | +++ b/drivers/iommu/exynos-iommu.c |
3519 | @@ -709,6 +709,7 @@ static struct platform_driver exynos_sysmmu_driver __refdata = { |
3520 | .name = "exynos-sysmmu", |
3521 | .of_match_table = sysmmu_of_match, |
3522 | .pm = &sysmmu_pm_ops, |
3523 | + .suppress_bind_attrs = true, |
3524 | } |
3525 | }; |
3526 | |
3527 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
3528 | index 323dac9900ba..d416242c4ab8 100644 |
3529 | --- a/drivers/iommu/intel-iommu.c |
3530 | +++ b/drivers/iommu/intel-iommu.c |
3531 | @@ -2076,7 +2076,7 @@ out_unlock: |
3532 | spin_unlock(&iommu->lock); |
3533 | spin_unlock_irqrestore(&device_domain_lock, flags); |
3534 | |
3535 | - return 0; |
3536 | + return ret; |
3537 | } |
3538 | |
3539 | struct domain_context_mapping_data { |
3540 | diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c |
3541 | index a1ed1b73fed4..f5c90e1366ce 100644 |
3542 | --- a/drivers/iommu/io-pgtable-arm.c |
3543 | +++ b/drivers/iommu/io-pgtable-arm.c |
3544 | @@ -576,7 +576,7 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, |
3545 | return 0; |
3546 | |
3547 | found_translation: |
3548 | - iova &= (ARM_LPAE_GRANULE(data) - 1); |
3549 | + iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1); |
3550 | return ((phys_addr_t)iopte_to_pfn(pte,data) << data->pg_shift) | iova; |
3551 | } |
3552 | |
3553 | diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c |
3554 | index b7341de87015..4bb49cd602e9 100644 |
3555 | --- a/drivers/md/dm-flakey.c |
3556 | +++ b/drivers/md/dm-flakey.c |
3557 | @@ -289,10 +289,16 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) |
3558 | pb->bio_submitted = true; |
3559 | |
3560 | /* |
3561 | - * Map reads as normal. |
3562 | + * Map reads as normal only if corrupt_bio_byte set. |
3563 | */ |
3564 | - if (bio_data_dir(bio) == READ) |
3565 | - goto map_bio; |
3566 | + if (bio_data_dir(bio) == READ) { |
3567 | + /* If flags were specified, only corrupt those that match. */ |
3568 | + if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) && |
3569 | + all_corrupt_bio_flags_match(bio, fc)) |
3570 | + goto map_bio; |
3571 | + else |
3572 | + return -EIO; |
3573 | + } |
3574 | |
3575 | /* |
3576 | * Drop writes? |
3577 | @@ -330,12 +336,13 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, int error) |
3578 | |
3579 | /* |
3580 | * Corrupt successful READs while in down state. |
3581 | - * If flags were specified, only corrupt those that match. |
3582 | */ |
3583 | - if (fc->corrupt_bio_byte && !error && pb->bio_submitted && |
3584 | - (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && |
3585 | - all_corrupt_bio_flags_match(bio, fc)) |
3586 | - corrupt_bio_data(bio, fc); |
3587 | + if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) { |
3588 | + if (fc->corrupt_bio_byte) |
3589 | + corrupt_bio_data(bio, fc); |
3590 | + else |
3591 | + return -EIO; |
3592 | + } |
3593 | |
3594 | return error; |
3595 | } |
3596 | diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c |
3597 | index 459a9f8905ed..0f0eb8a3d922 100644 |
3598 | --- a/drivers/md/dm-verity-fec.c |
3599 | +++ b/drivers/md/dm-verity-fec.c |
3600 | @@ -453,9 +453,7 @@ int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, |
3601 | */ |
3602 | |
3603 | offset = block << v->data_dev_block_bits; |
3604 | - |
3605 | - res = offset; |
3606 | - div64_u64(res, v->fec->rounds << v->data_dev_block_bits); |
3607 | + res = div64_u64(offset, v->fec->rounds << v->data_dev_block_bits); |
3608 | |
3609 | /* |
3610 | * The base RS block we can feed to the interleaver to find out all |
3611 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
3612 | index 1b2f96205361..fd40bcb3937d 100644 |
3613 | --- a/drivers/md/dm.c |
3614 | +++ b/drivers/md/dm.c |
3615 | @@ -2175,7 +2175,7 @@ static void dm_request_fn(struct request_queue *q) |
3616 | md_in_flight(md) && rq->bio && rq->bio->bi_vcnt == 1 && |
3617 | md->last_rq_pos == pos && md->last_rq_rw == rq_data_dir(rq)) || |
3618 | (ti->type->busy && ti->type->busy(ti))) { |
3619 | - blk_delay_queue(q, HZ / 100); |
3620 | + blk_delay_queue(q, 10); |
3621 | return; |
3622 | } |
3623 | |
3624 | @@ -3128,7 +3128,8 @@ static void unlock_fs(struct mapped_device *md) |
3625 | * Caller must hold md->suspend_lock |
3626 | */ |
3627 | static int __dm_suspend(struct mapped_device *md, struct dm_table *map, |
3628 | - unsigned suspend_flags, int interruptible) |
3629 | + unsigned suspend_flags, int interruptible, |
3630 | + int dmf_suspended_flag) |
3631 | { |
3632 | bool do_lockfs = suspend_flags & DM_SUSPEND_LOCKFS_FLAG; |
3633 | bool noflush = suspend_flags & DM_SUSPEND_NOFLUSH_FLAG; |
3634 | @@ -3195,6 +3196,8 @@ static int __dm_suspend(struct mapped_device *md, struct dm_table *map, |
3635 | * to finish. |
3636 | */ |
3637 | r = dm_wait_for_completion(md, interruptible); |
3638 | + if (!r) |
3639 | + set_bit(dmf_suspended_flag, &md->flags); |
3640 | |
3641 | if (noflush) |
3642 | clear_bit(DMF_NOFLUSH_SUSPENDING, &md->flags); |
3643 | @@ -3256,12 +3259,10 @@ retry: |
3644 | |
3645 | map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); |
3646 | |
3647 | - r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE); |
3648 | + r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE, DMF_SUSPENDED); |
3649 | if (r) |
3650 | goto out_unlock; |
3651 | |
3652 | - set_bit(DMF_SUSPENDED, &md->flags); |
3653 | - |
3654 | dm_table_postsuspend_targets(map); |
3655 | |
3656 | out_unlock: |
3657 | @@ -3355,9 +3356,8 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla |
3658 | * would require changing .presuspend to return an error -- avoid this |
3659 | * until there is a need for more elaborate variants of internal suspend. |
3660 | */ |
3661 | - (void) __dm_suspend(md, map, suspend_flags, TASK_UNINTERRUPTIBLE); |
3662 | - |
3663 | - set_bit(DMF_SUSPENDED_INTERNALLY, &md->flags); |
3664 | + (void) __dm_suspend(md, map, suspend_flags, TASK_UNINTERRUPTIBLE, |
3665 | + DMF_SUSPENDED_INTERNALLY); |
3666 | |
3667 | dm_table_postsuspend_targets(map); |
3668 | } |
3669 | diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c |
3670 | index 1100e98a7b1d..7df7fb3738a0 100644 |
3671 | --- a/drivers/media/dvb-core/dvb_ringbuffer.c |
3672 | +++ b/drivers/media/dvb-core/dvb_ringbuffer.c |
3673 | @@ -55,7 +55,13 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) |
3674 | |
3675 | int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf) |
3676 | { |
3677 | - return (rbuf->pread==rbuf->pwrite); |
3678 | + /* smp_load_acquire() to load write pointer on reader side |
3679 | + * this pairs with smp_store_release() in dvb_ringbuffer_write(), |
3680 | + * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset() |
3681 | + * |
3682 | + * for memory barriers also see Documentation/circular-buffers.txt |
3683 | + */ |
3684 | + return (rbuf->pread == smp_load_acquire(&rbuf->pwrite)); |
3685 | } |
3686 | |
3687 | |
3688 | @@ -64,7 +70,12 @@ ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf) |
3689 | { |
3690 | ssize_t free; |
3691 | |
3692 | - free = rbuf->pread - rbuf->pwrite; |
3693 | + /* ACCESS_ONCE() to load read pointer on writer side |
3694 | + * this pairs with smp_store_release() in dvb_ringbuffer_read(), |
3695 | + * dvb_ringbuffer_read_user(), dvb_ringbuffer_flush(), |
3696 | + * or dvb_ringbuffer_reset() |
3697 | + */ |
3698 | + free = ACCESS_ONCE(rbuf->pread) - rbuf->pwrite; |
3699 | if (free <= 0) |
3700 | free += rbuf->size; |
3701 | return free-1; |
3702 | @@ -76,7 +87,11 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) |
3703 | { |
3704 | ssize_t avail; |
3705 | |
3706 | - avail = rbuf->pwrite - rbuf->pread; |
3707 | + /* smp_load_acquire() to load write pointer on reader side |
3708 | + * this pairs with smp_store_release() in dvb_ringbuffer_write(), |
3709 | + * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset() |
3710 | + */ |
3711 | + avail = smp_load_acquire(&rbuf->pwrite) - rbuf->pread; |
3712 | if (avail < 0) |
3713 | avail += rbuf->size; |
3714 | return avail; |
3715 | @@ -86,14 +101,25 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) |
3716 | |
3717 | void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf) |
3718 | { |
3719 | - rbuf->pread = rbuf->pwrite; |
3720 | + /* dvb_ringbuffer_flush() counts as read operation |
3721 | + * smp_load_acquire() to load write pointer |
3722 | + * smp_store_release() to update read pointer, this ensures that the |
3723 | + * correct pointer is visible for subsequent dvb_ringbuffer_free() |
3724 | + * calls on other cpu cores |
3725 | + */ |
3726 | + smp_store_release(&rbuf->pread, smp_load_acquire(&rbuf->pwrite)); |
3727 | rbuf->error = 0; |
3728 | } |
3729 | EXPORT_SYMBOL(dvb_ringbuffer_flush); |
3730 | |
3731 | void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf) |
3732 | { |
3733 | - rbuf->pread = rbuf->pwrite = 0; |
3734 | + /* dvb_ringbuffer_reset() counts as read and write operation |
3735 | + * smp_store_release() to update read pointer |
3736 | + */ |
3737 | + smp_store_release(&rbuf->pread, 0); |
3738 | + /* smp_store_release() to update write pointer */ |
3739 | + smp_store_release(&rbuf->pwrite, 0); |
3740 | rbuf->error = 0; |
3741 | } |
3742 | |
3743 | @@ -119,12 +145,17 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, si |
3744 | return -EFAULT; |
3745 | buf += split; |
3746 | todo -= split; |
3747 | - rbuf->pread = 0; |
3748 | + /* smp_store_release() for read pointer update to ensure |
3749 | + * that buf is not overwritten until read is complete, |
3750 | + * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free() |
3751 | + */ |
3752 | + smp_store_release(&rbuf->pread, 0); |
3753 | } |
3754 | if (copy_to_user(buf, rbuf->data+rbuf->pread, todo)) |
3755 | return -EFAULT; |
3756 | |
3757 | - rbuf->pread = (rbuf->pread + todo) % rbuf->size; |
3758 | + /* smp_store_release() to update read pointer, see above */ |
3759 | + smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size); |
3760 | |
3761 | return len; |
3762 | } |
3763 | @@ -139,11 +170,16 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len) |
3764 | memcpy(buf, rbuf->data+rbuf->pread, split); |
3765 | buf += split; |
3766 | todo -= split; |
3767 | - rbuf->pread = 0; |
3768 | + /* smp_store_release() for read pointer update to ensure |
3769 | + * that buf is not overwritten until read is complete, |
3770 | + * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free() |
3771 | + */ |
3772 | + smp_store_release(&rbuf->pread, 0); |
3773 | } |
3774 | memcpy(buf, rbuf->data+rbuf->pread, todo); |
3775 | |
3776 | - rbuf->pread = (rbuf->pread + todo) % rbuf->size; |
3777 | + /* smp_store_release() to update read pointer, see above */ |
3778 | + smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size); |
3779 | } |
3780 | |
3781 | |
3782 | @@ -158,10 +194,16 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t |
3783 | memcpy(rbuf->data+rbuf->pwrite, buf, split); |
3784 | buf += split; |
3785 | todo -= split; |
3786 | - rbuf->pwrite = 0; |
3787 | + /* smp_store_release() for write pointer update to ensure that |
3788 | + * written data is visible on other cpu cores before the pointer |
3789 | + * update, this pairs with smp_load_acquire() in |
3790 | + * dvb_ringbuffer_empty() or dvb_ringbuffer_avail() |
3791 | + */ |
3792 | + smp_store_release(&rbuf->pwrite, 0); |
3793 | } |
3794 | memcpy(rbuf->data+rbuf->pwrite, buf, todo); |
3795 | - rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; |
3796 | + /* smp_store_release() for write pointer update, see above */ |
3797 | + smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size); |
3798 | |
3799 | return len; |
3800 | } |
3801 | @@ -181,12 +223,18 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, |
3802 | return len - todo; |
3803 | buf += split; |
3804 | todo -= split; |
3805 | - rbuf->pwrite = 0; |
3806 | + /* smp_store_release() for write pointer update to ensure that |
3807 | + * written data is visible on other cpu cores before the pointer |
3808 | + * update, this pairs with smp_load_acquire() in |
3809 | + * dvb_ringbuffer_empty() or dvb_ringbuffer_avail() |
3810 | + */ |
3811 | + smp_store_release(&rbuf->pwrite, 0); |
3812 | } |
3813 | status = copy_from_user(rbuf->data+rbuf->pwrite, buf, todo); |
3814 | if (status) |
3815 | return len - todo; |
3816 | - rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; |
3817 | + /* smp_store_release() for write pointer update, see above */ |
3818 | + smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size); |
3819 | |
3820 | return len; |
3821 | } |
3822 | diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3823 | index b16466fe35ee..beb4fd5bd326 100644 |
3824 | --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3825 | +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c |
3826 | @@ -1050,6 +1050,11 @@ static int match_child(struct device *dev, void *data) |
3827 | return !strcmp(dev_name(dev), (char *)data); |
3828 | } |
3829 | |
3830 | +static void s5p_mfc_memdev_release(struct device *dev) |
3831 | +{ |
3832 | + dma_release_declared_memory(dev); |
3833 | +} |
3834 | + |
3835 | static void *mfc_get_drv_data(struct platform_device *pdev); |
3836 | |
3837 | static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) |
3838 | @@ -1062,6 +1067,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) |
3839 | mfc_err("Not enough memory\n"); |
3840 | return -ENOMEM; |
3841 | } |
3842 | + |
3843 | + dev_set_name(dev->mem_dev_l, "%s", "s5p-mfc-l"); |
3844 | + dev->mem_dev_l->release = s5p_mfc_memdev_release; |
3845 | device_initialize(dev->mem_dev_l); |
3846 | of_property_read_u32_array(dev->plat_dev->dev.of_node, |
3847 | "samsung,mfc-l", mem_info, 2); |
3848 | @@ -1079,6 +1087,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) |
3849 | mfc_err("Not enough memory\n"); |
3850 | return -ENOMEM; |
3851 | } |
3852 | + |
3853 | + dev_set_name(dev->mem_dev_r, "%s", "s5p-mfc-r"); |
3854 | + dev->mem_dev_r->release = s5p_mfc_memdev_release; |
3855 | device_initialize(dev->mem_dev_r); |
3856 | of_property_read_u32_array(dev->plat_dev->dev.of_node, |
3857 | "samsung,mfc-r", mem_info, 2); |
3858 | diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c |
3859 | index 6ffe776abf6b..a0fd4e6b2155 100644 |
3860 | --- a/drivers/media/rc/ir-rc5-decoder.c |
3861 | +++ b/drivers/media/rc/ir-rc5-decoder.c |
3862 | @@ -29,7 +29,7 @@ |
3863 | #define RC5_BIT_START (1 * RC5_UNIT) |
3864 | #define RC5_BIT_END (1 * RC5_UNIT) |
3865 | #define RC5X_SPACE (4 * RC5_UNIT) |
3866 | -#define RC5_TRAILER (10 * RC5_UNIT) /* In reality, approx 100 */ |
3867 | +#define RC5_TRAILER (6 * RC5_UNIT) /* In reality, approx 100 */ |
3868 | |
3869 | enum rc5_state { |
3870 | STATE_INACTIVE, |
3871 | diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c |
3872 | index 99b303b702ac..e8ceb0e2f6d7 100644 |
3873 | --- a/drivers/media/rc/nuvoton-cir.c |
3874 | +++ b/drivers/media/rc/nuvoton-cir.c |
3875 | @@ -401,6 +401,7 @@ static int nvt_hw_detect(struct nvt_dev *nvt) |
3876 | /* Check if we're wired for the alternate EFER setup */ |
3877 | nvt->chip_major = nvt_cr_read(nvt, CR_CHIP_ID_HI); |
3878 | if (nvt->chip_major == 0xff) { |
3879 | + nvt_efm_disable(nvt); |
3880 | nvt->cr_efir = CR_EFIR2; |
3881 | nvt->cr_efdr = CR_EFDR2; |
3882 | nvt_efm_enable(nvt); |
3883 | diff --git a/drivers/media/usb/usbtv/usbtv-audio.c b/drivers/media/usb/usbtv/usbtv-audio.c |
3884 | index 78c12d22dfbb..5dab02432e82 100644 |
3885 | --- a/drivers/media/usb/usbtv/usbtv-audio.c |
3886 | +++ b/drivers/media/usb/usbtv/usbtv-audio.c |
3887 | @@ -278,6 +278,9 @@ static void snd_usbtv_trigger(struct work_struct *work) |
3888 | { |
3889 | struct usbtv *chip = container_of(work, struct usbtv, snd_trigger); |
3890 | |
3891 | + if (!chip->snd) |
3892 | + return; |
3893 | + |
3894 | if (atomic_read(&chip->snd_stream)) |
3895 | usbtv_audio_start(chip); |
3896 | else |
3897 | @@ -378,6 +381,8 @@ err: |
3898 | |
3899 | void usbtv_audio_free(struct usbtv *usbtv) |
3900 | { |
3901 | + cancel_work_sync(&usbtv->snd_trigger); |
3902 | + |
3903 | if (usbtv->snd && usbtv->udev) { |
3904 | snd_card_free(usbtv->snd); |
3905 | usbtv->snd = NULL; |
3906 | diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c |
3907 | index 9fbcb67a9ee6..633fc1ab1d7a 100644 |
3908 | --- a/drivers/media/v4l2-core/videobuf2-core.c |
3909 | +++ b/drivers/media/v4l2-core/videobuf2-core.c |
3910 | @@ -1648,7 +1648,7 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, |
3911 | void *pb, int nonblocking) |
3912 | { |
3913 | unsigned long flags; |
3914 | - int ret; |
3915 | + int ret = 0; |
3916 | |
3917 | /* |
3918 | * Wait for at least one buffer to become available on the done_list. |
3919 | @@ -1664,10 +1664,12 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, |
3920 | spin_lock_irqsave(&q->done_lock, flags); |
3921 | *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); |
3922 | /* |
3923 | - * Only remove the buffer from done_list if v4l2_buffer can handle all |
3924 | - * the planes. |
3925 | + * Only remove the buffer from done_list if all planes can be |
3926 | + * handled. Some cases such as V4L2 file I/O and DVB have pb |
3927 | + * == NULL; skip the check then as there's nothing to verify. |
3928 | */ |
3929 | - ret = call_bufop(q, verify_planes_array, *vb, pb); |
3930 | + if (pb) |
3931 | + ret = call_bufop(q, verify_planes_array, *vb, pb); |
3932 | if (!ret) |
3933 | list_del(&(*vb)->done_entry); |
3934 | spin_unlock_irqrestore(&q->done_lock, flags); |
3935 | diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c |
3936 | index 0b1b8c7b6ce5..7f366f1b0377 100644 |
3937 | --- a/drivers/media/v4l2-core/videobuf2-v4l2.c |
3938 | +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c |
3939 | @@ -74,6 +74,11 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer |
3940 | return 0; |
3941 | } |
3942 | |
3943 | +static int __verify_planes_array_core(struct vb2_buffer *vb, const void *pb) |
3944 | +{ |
3945 | + return __verify_planes_array(vb, pb); |
3946 | +} |
3947 | + |
3948 | /** |
3949 | * __verify_length() - Verify that the bytesused value for each plane fits in |
3950 | * the plane length and that the data offset doesn't exceed the bytesused value. |
3951 | @@ -437,6 +442,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, |
3952 | } |
3953 | |
3954 | static const struct vb2_buf_ops v4l2_buf_ops = { |
3955 | + .verify_planes_array = __verify_planes_array_core, |
3956 | .fill_user_buffer = __fill_v4l2_buffer, |
3957 | .fill_vb2_buffer = __fill_vb2_buffer, |
3958 | .copy_timestamp = __copy_timestamp, |
3959 | diff --git a/drivers/mfd/qcom_rpm.c b/drivers/mfd/qcom_rpm.c |
3960 | index 1be47ad6441b..880d4699bcb0 100644 |
3961 | --- a/drivers/mfd/qcom_rpm.c |
3962 | +++ b/drivers/mfd/qcom_rpm.c |
3963 | @@ -34,7 +34,13 @@ struct qcom_rpm_resource { |
3964 | struct qcom_rpm_data { |
3965 | u32 version; |
3966 | const struct qcom_rpm_resource *resource_table; |
3967 | - unsigned n_resources; |
3968 | + unsigned int n_resources; |
3969 | + unsigned int req_ctx_off; |
3970 | + unsigned int req_sel_off; |
3971 | + unsigned int ack_ctx_off; |
3972 | + unsigned int ack_sel_off; |
3973 | + unsigned int req_sel_size; |
3974 | + unsigned int ack_sel_size; |
3975 | }; |
3976 | |
3977 | struct qcom_rpm { |
3978 | @@ -61,11 +67,7 @@ struct qcom_rpm { |
3979 | |
3980 | #define RPM_REQUEST_TIMEOUT (5 * HZ) |
3981 | |
3982 | -#define RPM_REQUEST_CONTEXT 3 |
3983 | -#define RPM_REQ_SELECT 11 |
3984 | -#define RPM_ACK_CONTEXT 15 |
3985 | -#define RPM_ACK_SELECTOR 23 |
3986 | -#define RPM_SELECT_SIZE 7 |
3987 | +#define RPM_MAX_SEL_SIZE 7 |
3988 | |
3989 | #define RPM_NOTIFICATION BIT(30) |
3990 | #define RPM_REJECTED BIT(31) |
3991 | @@ -157,6 +159,12 @@ static const struct qcom_rpm_data apq8064_template = { |
3992 | .version = 3, |
3993 | .resource_table = apq8064_rpm_resource_table, |
3994 | .n_resources = ARRAY_SIZE(apq8064_rpm_resource_table), |
3995 | + .req_ctx_off = 3, |
3996 | + .req_sel_off = 11, |
3997 | + .ack_ctx_off = 15, |
3998 | + .ack_sel_off = 23, |
3999 | + .req_sel_size = 4, |
4000 | + .ack_sel_size = 7, |
4001 | }; |
4002 | |
4003 | static const struct qcom_rpm_resource msm8660_rpm_resource_table[] = { |
4004 | @@ -240,6 +248,12 @@ static const struct qcom_rpm_data msm8660_template = { |
4005 | .version = 2, |
4006 | .resource_table = msm8660_rpm_resource_table, |
4007 | .n_resources = ARRAY_SIZE(msm8660_rpm_resource_table), |
4008 | + .req_ctx_off = 3, |
4009 | + .req_sel_off = 11, |
4010 | + .ack_ctx_off = 19, |
4011 | + .ack_sel_off = 27, |
4012 | + .req_sel_size = 7, |
4013 | + .ack_sel_size = 7, |
4014 | }; |
4015 | |
4016 | static const struct qcom_rpm_resource msm8960_rpm_resource_table[] = { |
4017 | @@ -322,6 +336,12 @@ static const struct qcom_rpm_data msm8960_template = { |
4018 | .version = 3, |
4019 | .resource_table = msm8960_rpm_resource_table, |
4020 | .n_resources = ARRAY_SIZE(msm8960_rpm_resource_table), |
4021 | + .req_ctx_off = 3, |
4022 | + .req_sel_off = 11, |
4023 | + .ack_ctx_off = 15, |
4024 | + .ack_sel_off = 23, |
4025 | + .req_sel_size = 4, |
4026 | + .ack_sel_size = 7, |
4027 | }; |
4028 | |
4029 | static const struct qcom_rpm_resource ipq806x_rpm_resource_table[] = { |
4030 | @@ -362,6 +382,12 @@ static const struct qcom_rpm_data ipq806x_template = { |
4031 | .version = 3, |
4032 | .resource_table = ipq806x_rpm_resource_table, |
4033 | .n_resources = ARRAY_SIZE(ipq806x_rpm_resource_table), |
4034 | + .req_ctx_off = 3, |
4035 | + .req_sel_off = 11, |
4036 | + .ack_ctx_off = 15, |
4037 | + .ack_sel_off = 23, |
4038 | + .req_sel_size = 4, |
4039 | + .ack_sel_size = 7, |
4040 | }; |
4041 | |
4042 | static const struct of_device_id qcom_rpm_of_match[] = { |
4043 | @@ -380,7 +406,7 @@ int qcom_rpm_write(struct qcom_rpm *rpm, |
4044 | { |
4045 | const struct qcom_rpm_resource *res; |
4046 | const struct qcom_rpm_data *data = rpm->data; |
4047 | - u32 sel_mask[RPM_SELECT_SIZE] = { 0 }; |
4048 | + u32 sel_mask[RPM_MAX_SEL_SIZE] = { 0 }; |
4049 | int left; |
4050 | int ret = 0; |
4051 | int i; |
4052 | @@ -398,12 +424,12 @@ int qcom_rpm_write(struct qcom_rpm *rpm, |
4053 | writel_relaxed(buf[i], RPM_REQ_REG(rpm, res->target_id + i)); |
4054 | |
4055 | bitmap_set((unsigned long *)sel_mask, res->select_id, 1); |
4056 | - for (i = 0; i < ARRAY_SIZE(sel_mask); i++) { |
4057 | + for (i = 0; i < rpm->data->req_sel_size; i++) { |
4058 | writel_relaxed(sel_mask[i], |
4059 | - RPM_CTRL_REG(rpm, RPM_REQ_SELECT + i)); |
4060 | + RPM_CTRL_REG(rpm, rpm->data->req_sel_off + i)); |
4061 | } |
4062 | |
4063 | - writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, RPM_REQUEST_CONTEXT)); |
4064 | + writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, rpm->data->req_ctx_off)); |
4065 | |
4066 | reinit_completion(&rpm->ack); |
4067 | regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit)); |
4068 | @@ -426,10 +452,11 @@ static irqreturn_t qcom_rpm_ack_interrupt(int irq, void *dev) |
4069 | u32 ack; |
4070 | int i; |
4071 | |
4072 | - ack = readl_relaxed(RPM_CTRL_REG(rpm, RPM_ACK_CONTEXT)); |
4073 | - for (i = 0; i < RPM_SELECT_SIZE; i++) |
4074 | - writel_relaxed(0, RPM_CTRL_REG(rpm, RPM_ACK_SELECTOR + i)); |
4075 | - writel(0, RPM_CTRL_REG(rpm, RPM_ACK_CONTEXT)); |
4076 | + ack = readl_relaxed(RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); |
4077 | + for (i = 0; i < rpm->data->ack_sel_size; i++) |
4078 | + writel_relaxed(0, |
4079 | + RPM_CTRL_REG(rpm, rpm->data->ack_sel_off + i)); |
4080 | + writel(0, RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); |
4081 | |
4082 | if (ack & RPM_NOTIFICATION) { |
4083 | dev_warn(rpm->dev, "ignoring notification!\n"); |
4084 | diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c |
4085 | index 0b0dc29d2af7..77533f7f2429 100644 |
4086 | --- a/drivers/mtd/nand/nand_base.c |
4087 | +++ b/drivers/mtd/nand/nand_base.c |
4088 | @@ -2610,7 +2610,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, |
4089 | int cached = writelen > bytes && page != blockmask; |
4090 | uint8_t *wbuf = buf; |
4091 | int use_bufpoi; |
4092 | - int part_pagewr = (column || writelen < (mtd->writesize - 1)); |
4093 | + int part_pagewr = (column || writelen < mtd->writesize); |
4094 | |
4095 | if (part_pagewr) |
4096 | use_bufpoi = 1; |
4097 | diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c |
4098 | index ef3618299494..0680516bb472 100644 |
4099 | --- a/drivers/mtd/ubi/build.c |
4100 | +++ b/drivers/mtd/ubi/build.c |
4101 | @@ -874,7 +874,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4102 | for (i = 0; i < UBI_MAX_DEVICES; i++) { |
4103 | ubi = ubi_devices[i]; |
4104 | if (ubi && mtd->index == ubi->mtd->index) { |
4105 | - ubi_err(ubi, "mtd%d is already attached to ubi%d", |
4106 | + pr_err("ubi: mtd%d is already attached to ubi%d", |
4107 | mtd->index, i); |
4108 | return -EEXIST; |
4109 | } |
4110 | @@ -889,7 +889,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4111 | * no sense to attach emulated MTD devices, so we prohibit this. |
4112 | */ |
4113 | if (mtd->type == MTD_UBIVOLUME) { |
4114 | - ubi_err(ubi, "refuse attaching mtd%d - it is already emulated on top of UBI", |
4115 | + pr_err("ubi: refuse attaching mtd%d - it is already emulated on top of UBI", |
4116 | mtd->index); |
4117 | return -EINVAL; |
4118 | } |
4119 | @@ -900,7 +900,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4120 | if (!ubi_devices[ubi_num]) |
4121 | break; |
4122 | if (ubi_num == UBI_MAX_DEVICES) { |
4123 | - ubi_err(ubi, "only %d UBI devices may be created", |
4124 | + pr_err("ubi: only %d UBI devices may be created", |
4125 | UBI_MAX_DEVICES); |
4126 | return -ENFILE; |
4127 | } |
4128 | @@ -910,7 +910,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4129 | |
4130 | /* Make sure ubi_num is not busy */ |
4131 | if (ubi_devices[ubi_num]) { |
4132 | - ubi_err(ubi, "already exists"); |
4133 | + pr_err("ubi: ubi%i already exists", ubi_num); |
4134 | return -EEXIST; |
4135 | } |
4136 | } |
4137 | @@ -992,6 +992,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4138 | goto out_detach; |
4139 | } |
4140 | |
4141 | + /* Make device "available" before it becomes accessible via sysfs */ |
4142 | + ubi_devices[ubi_num] = ubi; |
4143 | + |
4144 | err = uif_init(ubi, &ref); |
4145 | if (err) |
4146 | goto out_detach; |
4147 | @@ -1036,7 +1039,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, |
4148 | wake_up_process(ubi->bgt_thread); |
4149 | spin_unlock(&ubi->wl_lock); |
4150 | |
4151 | - ubi_devices[ubi_num] = ubi; |
4152 | ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL); |
4153 | return ubi_num; |
4154 | |
4155 | @@ -1047,6 +1049,7 @@ out_uif: |
4156 | ubi_assert(ref); |
4157 | uif_close(ubi); |
4158 | out_detach: |
4159 | + ubi_devices[ubi_num] = NULL; |
4160 | ubi_wl_close(ubi); |
4161 | ubi_free_internal_volumes(ubi); |
4162 | vfree(ubi->vtbl); |
4163 | diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c |
4164 | index 10059dfdc1b6..0138f526474a 100644 |
4165 | --- a/drivers/mtd/ubi/vmt.c |
4166 | +++ b/drivers/mtd/ubi/vmt.c |
4167 | @@ -488,13 +488,6 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) |
4168 | spin_unlock(&ubi->volumes_lock); |
4169 | } |
4170 | |
4171 | - /* Change volume table record */ |
4172 | - vtbl_rec = ubi->vtbl[vol_id]; |
4173 | - vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs); |
4174 | - err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); |
4175 | - if (err) |
4176 | - goto out_acc; |
4177 | - |
4178 | if (pebs < 0) { |
4179 | for (i = 0; i < -pebs; i++) { |
4180 | err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i); |
4181 | @@ -512,6 +505,24 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) |
4182 | spin_unlock(&ubi->volumes_lock); |
4183 | } |
4184 | |
4185 | + /* |
4186 | + * When we shrink a volume we have to flush all pending (erase) work. |
4187 | + * Otherwise it can happen that upon next attach UBI finds a LEB with |
4188 | + * lnum > highest_lnum and refuses to attach. |
4189 | + */ |
4190 | + if (pebs < 0) { |
4191 | + err = ubi_wl_flush(ubi, vol_id, UBI_ALL); |
4192 | + if (err) |
4193 | + goto out_acc; |
4194 | + } |
4195 | + |
4196 | + /* Change volume table record */ |
4197 | + vtbl_rec = ubi->vtbl[vol_id]; |
4198 | + vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs); |
4199 | + err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); |
4200 | + if (err) |
4201 | + goto out_acc; |
4202 | + |
4203 | vol->reserved_pebs = reserved_pebs; |
4204 | if (vol->vol_type == UBI_DYNAMIC_VOLUME) { |
4205 | vol->used_ebs = reserved_pebs; |
4206 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c |
4207 | index 5b30922b67ec..2ce319903cfb 100644 |
4208 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c |
4209 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c |
4210 | @@ -2469,10 +2469,22 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb) |
4211 | void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked) |
4212 | { |
4213 | struct brcmf_fws_info *fws = drvr->fws; |
4214 | + struct brcmf_if *ifp; |
4215 | + int i; |
4216 | |
4217 | - fws->bus_flow_blocked = flow_blocked; |
4218 | - if (!flow_blocked) |
4219 | - brcmf_fws_schedule_deq(fws); |
4220 | - else |
4221 | - fws->stats.bus_flow_block++; |
4222 | + if (fws->avoid_queueing) { |
4223 | + for (i = 0; i < BRCMF_MAX_IFS; i++) { |
4224 | + ifp = drvr->iflist[i]; |
4225 | + if (!ifp || !ifp->ndev) |
4226 | + continue; |
4227 | + brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, |
4228 | + flow_blocked); |
4229 | + } |
4230 | + } else { |
4231 | + fws->bus_flow_blocked = flow_blocked; |
4232 | + if (!flow_blocked) |
4233 | + brcmf_fws_schedule_deq(fws); |
4234 | + else |
4235 | + fws->stats.bus_flow_block++; |
4236 | + } |
4237 | } |
4238 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4239 | index a588b05e38eb..6f020e4ec7dc 100644 |
4240 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4241 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4242 | @@ -433,6 +433,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4243 | /* 8000 Series */ |
4244 | {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, |
4245 | {IWL_PCI_DEVICE(0x24F3, 0x1010, iwl8260_2ac_cfg)}, |
4246 | + {IWL_PCI_DEVICE(0x24F3, 0x10B0, iwl8260_2ac_cfg)}, |
4247 | {IWL_PCI_DEVICE(0x24F3, 0x0130, iwl8260_2ac_cfg)}, |
4248 | {IWL_PCI_DEVICE(0x24F3, 0x1130, iwl8260_2ac_cfg)}, |
4249 | {IWL_PCI_DEVICE(0x24F3, 0x0132, iwl8260_2ac_cfg)}, |
4250 | @@ -454,6 +455,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4251 | {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)}, |
4252 | {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)}, |
4253 | {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)}, |
4254 | + {IWL_PCI_DEVICE(0x24F3, 0xD0B0, iwl8260_2ac_cfg)}, |
4255 | + {IWL_PCI_DEVICE(0x24F3, 0xB0B0, iwl8260_2ac_cfg)}, |
4256 | {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)}, |
4257 | {IWL_PCI_DEVICE(0x24F3, 0x8110, iwl8260_2ac_cfg)}, |
4258 | {IWL_PCI_DEVICE(0x24F3, 0x9010, iwl8260_2ac_cfg)}, |
4259 | @@ -481,6 +484,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4260 | {IWL_PCI_DEVICE(0x24FD, 0x0010, iwl8265_2ac_cfg)}, |
4261 | {IWL_PCI_DEVICE(0x24FD, 0x0110, iwl8265_2ac_cfg)}, |
4262 | {IWL_PCI_DEVICE(0x24FD, 0x1110, iwl8265_2ac_cfg)}, |
4263 | + {IWL_PCI_DEVICE(0x24FD, 0x1130, iwl8265_2ac_cfg)}, |
4264 | + {IWL_PCI_DEVICE(0x24FD, 0x0130, iwl8265_2ac_cfg)}, |
4265 | {IWL_PCI_DEVICE(0x24FD, 0x1010, iwl8265_2ac_cfg)}, |
4266 | {IWL_PCI_DEVICE(0x24FD, 0x0050, iwl8265_2ac_cfg)}, |
4267 | {IWL_PCI_DEVICE(0x24FD, 0x0150, iwl8265_2ac_cfg)}, |
4268 | @@ -491,6 +496,10 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4269 | {IWL_PCI_DEVICE(0x24FD, 0x0810, iwl8265_2ac_cfg)}, |
4270 | {IWL_PCI_DEVICE(0x24FD, 0x9110, iwl8265_2ac_cfg)}, |
4271 | {IWL_PCI_DEVICE(0x24FD, 0x8130, iwl8265_2ac_cfg)}, |
4272 | + {IWL_PCI_DEVICE(0x24FD, 0x0910, iwl8265_2ac_cfg)}, |
4273 | + {IWL_PCI_DEVICE(0x24FD, 0x0930, iwl8265_2ac_cfg)}, |
4274 | + {IWL_PCI_DEVICE(0x24FD, 0x0950, iwl8265_2ac_cfg)}, |
4275 | + {IWL_PCI_DEVICE(0x24FD, 0x0850, iwl8265_2ac_cfg)}, |
4276 | |
4277 | /* 9000 Series */ |
4278 | {IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)}, |
4279 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
4280 | index de6974f9c52f..2d8cce290a15 100644 |
4281 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
4282 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
4283 | @@ -496,7 +496,7 @@ void iwl_pcie_dump_csr(struct iwl_trans *trans); |
4284 | /***************************************************** |
4285 | * Helpers |
4286 | ******************************************************/ |
4287 | -static inline void iwl_disable_interrupts(struct iwl_trans *trans) |
4288 | +static inline void _iwl_disable_interrupts(struct iwl_trans *trans) |
4289 | { |
4290 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
4291 | |
4292 | @@ -519,7 +519,16 @@ static inline void iwl_disable_interrupts(struct iwl_trans *trans) |
4293 | IWL_DEBUG_ISR(trans, "Disabled interrupts\n"); |
4294 | } |
4295 | |
4296 | -static inline void iwl_enable_interrupts(struct iwl_trans *trans) |
4297 | +static inline void iwl_disable_interrupts(struct iwl_trans *trans) |
4298 | +{ |
4299 | + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
4300 | + |
4301 | + spin_lock(&trans_pcie->irq_lock); |
4302 | + _iwl_disable_interrupts(trans); |
4303 | + spin_unlock(&trans_pcie->irq_lock); |
4304 | +} |
4305 | + |
4306 | +static inline void _iwl_enable_interrupts(struct iwl_trans *trans) |
4307 | { |
4308 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
4309 | |
4310 | @@ -542,6 +551,14 @@ static inline void iwl_enable_interrupts(struct iwl_trans *trans) |
4311 | } |
4312 | } |
4313 | |
4314 | +static inline void iwl_enable_interrupts(struct iwl_trans *trans) |
4315 | +{ |
4316 | + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
4317 | + |
4318 | + spin_lock(&trans_pcie->irq_lock); |
4319 | + _iwl_enable_interrupts(trans); |
4320 | + spin_unlock(&trans_pcie->irq_lock); |
4321 | +} |
4322 | static inline void iwl_enable_hw_int_msk_msix(struct iwl_trans *trans, u32 msk) |
4323 | { |
4324 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
4325 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
4326 | index 0a4a3c502c3c..aaaf2ad6e4da 100644 |
4327 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
4328 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
4329 | @@ -1507,7 +1507,7 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) |
4330 | * have anything to service |
4331 | */ |
4332 | if (test_bit(STATUS_INT_ENABLED, &trans->status)) |
4333 | - iwl_enable_interrupts(trans); |
4334 | + _iwl_enable_interrupts(trans); |
4335 | spin_unlock(&trans_pcie->irq_lock); |
4336 | lock_map_release(&trans->sync_cmd_lockdep_map); |
4337 | return IRQ_NONE; |
4338 | @@ -1699,15 +1699,17 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) |
4339 | inta & ~trans_pcie->inta_mask); |
4340 | } |
4341 | |
4342 | + spin_lock(&trans_pcie->irq_lock); |
4343 | + /* only Re-enable all interrupt if disabled by irq */ |
4344 | + if (test_bit(STATUS_INT_ENABLED, &trans->status)) |
4345 | + _iwl_enable_interrupts(trans); |
4346 | /* we are loading the firmware, enable FH_TX interrupt only */ |
4347 | - if (handled & CSR_INT_BIT_FH_TX) |
4348 | + else if (handled & CSR_INT_BIT_FH_TX) |
4349 | iwl_enable_fw_load_int(trans); |
4350 | - /* only Re-enable all interrupt if disabled by irq */ |
4351 | - else if (test_bit(STATUS_INT_ENABLED, &trans->status)) |
4352 | - iwl_enable_interrupts(trans); |
4353 | /* Re-enable RF_KILL if it occurred */ |
4354 | else if (handled & CSR_INT_BIT_RF_KILL) |
4355 | iwl_enable_rfkill_int(trans); |
4356 | + spin_unlock(&trans_pcie->irq_lock); |
4357 | |
4358 | out: |
4359 | lock_map_release(&trans->sync_cmd_lockdep_map); |
4360 | @@ -1771,7 +1773,7 @@ void iwl_pcie_reset_ict(struct iwl_trans *trans) |
4361 | return; |
4362 | |
4363 | spin_lock(&trans_pcie->irq_lock); |
4364 | - iwl_disable_interrupts(trans); |
4365 | + _iwl_disable_interrupts(trans); |
4366 | |
4367 | memset(trans_pcie->ict_tbl, 0, ICT_SIZE); |
4368 | |
4369 | @@ -1787,7 +1789,7 @@ void iwl_pcie_reset_ict(struct iwl_trans *trans) |
4370 | trans_pcie->use_ict = true; |
4371 | trans_pcie->ict_index = 0; |
4372 | iwl_write32(trans, CSR_INT, trans_pcie->inta_mask); |
4373 | - iwl_enable_interrupts(trans); |
4374 | + _iwl_enable_interrupts(trans); |
4375 | spin_unlock(&trans_pcie->irq_lock); |
4376 | } |
4377 | |
4378 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
4379 | index f603d7830a6b..d9f139462b31 100644 |
4380 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
4381 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
4382 | @@ -801,6 +801,8 @@ static int iwl_pcie_load_cpu_sections_8000(struct iwl_trans *trans, |
4383 | |
4384 | *first_ucode_section = last_read_idx; |
4385 | |
4386 | + iwl_enable_interrupts(trans); |
4387 | + |
4388 | if (cpu == 1) |
4389 | iwl_write_direct32(trans, FH_UCODE_LOAD_STATUS, 0xFFFF); |
4390 | else |
4391 | @@ -980,6 +982,8 @@ static int iwl_pcie_load_given_ucode(struct iwl_trans *trans, |
4392 | iwl_pcie_apply_destination(trans); |
4393 | } |
4394 | |
4395 | + iwl_enable_interrupts(trans); |
4396 | + |
4397 | /* release CPU reset */ |
4398 | iwl_write32(trans, CSR_RESET, 0); |
4399 | |
4400 | @@ -1033,9 +1037,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power) |
4401 | was_hw_rfkill = iwl_is_rfkill_set(trans); |
4402 | |
4403 | /* tell the device to stop sending interrupts */ |
4404 | - spin_lock(&trans_pcie->irq_lock); |
4405 | iwl_disable_interrupts(trans); |
4406 | - spin_unlock(&trans_pcie->irq_lock); |
4407 | |
4408 | /* device going down, Stop using ICT table */ |
4409 | iwl_pcie_disable_ict(trans); |
4410 | @@ -1079,9 +1081,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power) |
4411 | * the time, unless the interrupt is ACKed even if the interrupt |
4412 | * should be masked. Re-ACK all the interrupts here. |
4413 | */ |
4414 | - spin_lock(&trans_pcie->irq_lock); |
4415 | iwl_disable_interrupts(trans); |
4416 | - spin_unlock(&trans_pcie->irq_lock); |
4417 | |
4418 | /* clear all status bits */ |
4419 | clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); |
4420 | @@ -1215,7 +1215,6 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, |
4421 | ret = iwl_pcie_load_given_ucode_8000(trans, fw); |
4422 | else |
4423 | ret = iwl_pcie_load_given_ucode(trans, fw); |
4424 | - iwl_enable_interrupts(trans); |
4425 | |
4426 | /* re-check RF-Kill state since we may have missed the interrupt */ |
4427 | hw_rfkill = iwl_is_rfkill_set(trans); |
4428 | @@ -1567,15 +1566,11 @@ static void iwl_trans_pcie_op_mode_leave(struct iwl_trans *trans) |
4429 | mutex_lock(&trans_pcie->mutex); |
4430 | |
4431 | /* disable interrupts - don't enable HW RF kill interrupt */ |
4432 | - spin_lock(&trans_pcie->irq_lock); |
4433 | iwl_disable_interrupts(trans); |
4434 | - spin_unlock(&trans_pcie->irq_lock); |
4435 | |
4436 | iwl_pcie_apm_stop(trans, true); |
4437 | |
4438 | - spin_lock(&trans_pcie->irq_lock); |
4439 | iwl_disable_interrupts(trans); |
4440 | - spin_unlock(&trans_pcie->irq_lock); |
4441 | |
4442 | iwl_pcie_disable_ict(trans); |
4443 | |
4444 | diff --git a/drivers/of/base.c b/drivers/of/base.c |
4445 | index ebf84e3b56d5..8bb3d1adf1b0 100644 |
4446 | --- a/drivers/of/base.c |
4447 | +++ b/drivers/of/base.c |
4448 | @@ -112,6 +112,7 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj, |
4449 | return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length); |
4450 | } |
4451 | |
4452 | +/* always return newly allocated name, caller must free after use */ |
4453 | static const char *safe_name(struct kobject *kobj, const char *orig_name) |
4454 | { |
4455 | const char *name = orig_name; |
4456 | @@ -126,9 +127,12 @@ static const char *safe_name(struct kobject *kobj, const char *orig_name) |
4457 | name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i); |
4458 | } |
4459 | |
4460 | - if (name != orig_name) |
4461 | + if (name == orig_name) { |
4462 | + name = kstrdup(orig_name, GFP_KERNEL); |
4463 | + } else { |
4464 | pr_warn("device-tree: Duplicate name in %s, renamed to \"%s\"\n", |
4465 | kobject_name(kobj), name); |
4466 | + } |
4467 | return name; |
4468 | } |
4469 | |
4470 | @@ -159,6 +163,7 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp) |
4471 | int __of_attach_node_sysfs(struct device_node *np) |
4472 | { |
4473 | const char *name; |
4474 | + struct kobject *parent; |
4475 | struct property *pp; |
4476 | int rc; |
4477 | |
4478 | @@ -171,15 +176,16 @@ int __of_attach_node_sysfs(struct device_node *np) |
4479 | np->kobj.kset = of_kset; |
4480 | if (!np->parent) { |
4481 | /* Nodes without parents are new top level trees */ |
4482 | - rc = kobject_add(&np->kobj, NULL, "%s", |
4483 | - safe_name(&of_kset->kobj, "base")); |
4484 | + name = safe_name(&of_kset->kobj, "base"); |
4485 | + parent = NULL; |
4486 | } else { |
4487 | name = safe_name(&np->parent->kobj, kbasename(np->full_name)); |
4488 | - if (!name || !name[0]) |
4489 | - return -EINVAL; |
4490 | - |
4491 | - rc = kobject_add(&np->kobj, &np->parent->kobj, "%s", name); |
4492 | + parent = &np->parent->kobj; |
4493 | } |
4494 | + if (!name) |
4495 | + return -ENOMEM; |
4496 | + rc = kobject_add(&np->kobj, parent, "%s", name); |
4497 | + kfree(name); |
4498 | if (rc) |
4499 | return rc; |
4500 | |
4501 | @@ -1815,6 +1821,12 @@ int __of_remove_property(struct device_node *np, struct property *prop) |
4502 | return 0; |
4503 | } |
4504 | |
4505 | +void __of_sysfs_remove_bin_file(struct device_node *np, struct property *prop) |
4506 | +{ |
4507 | + sysfs_remove_bin_file(&np->kobj, &prop->attr); |
4508 | + kfree(prop->attr.attr.name); |
4509 | +} |
4510 | + |
4511 | void __of_remove_property_sysfs(struct device_node *np, struct property *prop) |
4512 | { |
4513 | if (!IS_ENABLED(CONFIG_SYSFS)) |
4514 | @@ -1822,7 +1834,7 @@ void __of_remove_property_sysfs(struct device_node *np, struct property *prop) |
4515 | |
4516 | /* at early boot, bail here and defer setup to of_init() */ |
4517 | if (of_kset && of_node_is_attached(np)) |
4518 | - sysfs_remove_bin_file(&np->kobj, &prop->attr); |
4519 | + __of_sysfs_remove_bin_file(np, prop); |
4520 | } |
4521 | |
4522 | /** |
4523 | @@ -1895,7 +1907,7 @@ void __of_update_property_sysfs(struct device_node *np, struct property *newprop |
4524 | return; |
4525 | |
4526 | if (oldprop) |
4527 | - sysfs_remove_bin_file(&np->kobj, &oldprop->attr); |
4528 | + __of_sysfs_remove_bin_file(np, oldprop); |
4529 | __of_add_property_sysfs(np, newprop); |
4530 | } |
4531 | |
4532 | diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c |
4533 | index 3033fa3250dc..a2015599ed7e 100644 |
4534 | --- a/drivers/of/dynamic.c |
4535 | +++ b/drivers/of/dynamic.c |
4536 | @@ -55,7 +55,7 @@ void __of_detach_node_sysfs(struct device_node *np) |
4537 | /* only remove properties if on sysfs */ |
4538 | if (of_node_is_attached(np)) { |
4539 | for_each_property_of_node(np, pp) |
4540 | - sysfs_remove_bin_file(&np->kobj, &pp->attr); |
4541 | + __of_sysfs_remove_bin_file(np, pp); |
4542 | kobject_del(&np->kobj); |
4543 | } |
4544 | |
4545 | diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h |
4546 | index 829469faeb23..18bbb4517e25 100644 |
4547 | --- a/drivers/of/of_private.h |
4548 | +++ b/drivers/of/of_private.h |
4549 | @@ -83,6 +83,9 @@ extern int __of_attach_node_sysfs(struct device_node *np); |
4550 | extern void __of_detach_node(struct device_node *np); |
4551 | extern void __of_detach_node_sysfs(struct device_node *np); |
4552 | |
4553 | +extern void __of_sysfs_remove_bin_file(struct device_node *np, |
4554 | + struct property *prop); |
4555 | + |
4556 | /* iterators for transactions, used for overlays */ |
4557 | /* forward iterator */ |
4558 | #define for_each_transaction_entry(_oft, _te) \ |
4559 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
4560 | index ee72ebe18f4b..7902fbf47f89 100644 |
4561 | --- a/drivers/pci/quirks.c |
4562 | +++ b/drivers/pci/quirks.c |
4563 | @@ -3189,13 +3189,15 @@ static void quirk_no_bus_reset(struct pci_dev *dev) |
4564 | } |
4565 | |
4566 | /* |
4567 | - * Atheros AR93xx chips do not behave after a bus reset. The device will |
4568 | - * throw a Link Down error on AER-capable systems and regardless of AER, |
4569 | - * config space of the device is never accessible again and typically |
4570 | - * causes the system to hang or reset when access is attempted. |
4571 | + * Some Atheros AR9xxx and QCA988x chips do not behave after a bus reset. |
4572 | + * The device will throw a Link Down error on AER-capable systems and |
4573 | + * regardless of AER, config space of the device is never accessible again |
4574 | + * and typically causes the system to hang or reset when access is attempted. |
4575 | * http://www.spinics.net/lists/linux-pci/msg34797.html |
4576 | */ |
4577 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); |
4578 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); |
4579 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); |
4580 | |
4581 | static void quirk_no_pm_reset(struct pci_dev *dev) |
4582 | { |
4583 | diff --git a/drivers/phy/phy-rcar-gen3-usb2.c b/drivers/phy/phy-rcar-gen3-usb2.c |
4584 | index 4be3f5dbbc9f..31156c9c4707 100644 |
4585 | --- a/drivers/phy/phy-rcar-gen3-usb2.c |
4586 | +++ b/drivers/phy/phy-rcar-gen3-usb2.c |
4587 | @@ -21,6 +21,7 @@ |
4588 | #include <linux/phy/phy.h> |
4589 | #include <linux/platform_device.h> |
4590 | #include <linux/regulator/consumer.h> |
4591 | +#include <linux/workqueue.h> |
4592 | |
4593 | /******* USB2.0 Host registers (original offset is +0x200) *******/ |
4594 | #define USB2_INT_ENABLE 0x000 |
4595 | @@ -81,9 +82,25 @@ struct rcar_gen3_chan { |
4596 | struct extcon_dev *extcon; |
4597 | struct phy *phy; |
4598 | struct regulator *vbus; |
4599 | + struct work_struct work; |
4600 | + bool extcon_host; |
4601 | bool has_otg; |
4602 | }; |
4603 | |
4604 | +static void rcar_gen3_phy_usb2_work(struct work_struct *work) |
4605 | +{ |
4606 | + struct rcar_gen3_chan *ch = container_of(work, struct rcar_gen3_chan, |
4607 | + work); |
4608 | + |
4609 | + if (ch->extcon_host) { |
4610 | + extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, true); |
4611 | + extcon_set_cable_state_(ch->extcon, EXTCON_USB, false); |
4612 | + } else { |
4613 | + extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, false); |
4614 | + extcon_set_cable_state_(ch->extcon, EXTCON_USB, true); |
4615 | + } |
4616 | +} |
4617 | + |
4618 | static void rcar_gen3_set_host_mode(struct rcar_gen3_chan *ch, int host) |
4619 | { |
4620 | void __iomem *usb2_base = ch->base; |
4621 | @@ -130,8 +147,8 @@ static void rcar_gen3_init_for_host(struct rcar_gen3_chan *ch) |
4622 | rcar_gen3_set_host_mode(ch, 1); |
4623 | rcar_gen3_enable_vbus_ctrl(ch, 1); |
4624 | |
4625 | - extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, true); |
4626 | - extcon_set_cable_state_(ch->extcon, EXTCON_USB, false); |
4627 | + ch->extcon_host = true; |
4628 | + schedule_work(&ch->work); |
4629 | } |
4630 | |
4631 | static void rcar_gen3_init_for_peri(struct rcar_gen3_chan *ch) |
4632 | @@ -140,8 +157,8 @@ static void rcar_gen3_init_for_peri(struct rcar_gen3_chan *ch) |
4633 | rcar_gen3_set_host_mode(ch, 0); |
4634 | rcar_gen3_enable_vbus_ctrl(ch, 0); |
4635 | |
4636 | - extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, false); |
4637 | - extcon_set_cable_state_(ch->extcon, EXTCON_USB, true); |
4638 | + ch->extcon_host = false; |
4639 | + schedule_work(&ch->work); |
4640 | } |
4641 | |
4642 | static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch) |
4643 | @@ -301,6 +318,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) |
4644 | if (irq >= 0) { |
4645 | int ret; |
4646 | |
4647 | + INIT_WORK(&channel->work, rcar_gen3_phy_usb2_work); |
4648 | irq = devm_request_irq(dev, irq, rcar_gen3_phy_usb2_irq, |
4649 | IRQF_SHARED, dev_name(dev), channel); |
4650 | if (irq < 0) |
4651 | diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c |
4652 | index ac4f564f1c3e..bf65c948b31d 100644 |
4653 | --- a/drivers/pinctrl/intel/pinctrl-cherryview.c |
4654 | +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c |
4655 | @@ -160,7 +160,6 @@ struct chv_pin_context { |
4656 | * @pctldev: Pointer to the pin controller device |
4657 | * @chip: GPIO chip in this pin controller |
4658 | * @regs: MMIO registers |
4659 | - * @lock: Lock to serialize register accesses |
4660 | * @intr_lines: Stores mapping between 16 HW interrupt wires and GPIO |
4661 | * offset (in GPIO number space) |
4662 | * @community: Community this pinctrl instance represents |
4663 | @@ -174,7 +173,6 @@ struct chv_pinctrl { |
4664 | struct pinctrl_dev *pctldev; |
4665 | struct gpio_chip chip; |
4666 | void __iomem *regs; |
4667 | - raw_spinlock_t lock; |
4668 | unsigned intr_lines[16]; |
4669 | const struct chv_community *community; |
4670 | u32 saved_intmask; |
4671 | @@ -657,6 +655,17 @@ static const struct chv_community *chv_communities[] = { |
4672 | &southeast_community, |
4673 | }; |
4674 | |
4675 | +/* |
4676 | + * Lock to serialize register accesses |
4677 | + * |
4678 | + * Due to a silicon issue, a shared lock must be used to prevent |
4679 | + * concurrent accesses across the 4 GPIO controllers. |
4680 | + * |
4681 | + * See Intel Atom Z8000 Processor Series Specification Update (Rev. 005), |
4682 | + * errata #CHT34, for further information. |
4683 | + */ |
4684 | +static DEFINE_RAW_SPINLOCK(chv_lock); |
4685 | + |
4686 | static void __iomem *chv_padreg(struct chv_pinctrl *pctrl, unsigned offset, |
4687 | unsigned reg) |
4688 | { |
4689 | @@ -718,13 +727,13 @@ static void chv_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, |
4690 | u32 ctrl0, ctrl1; |
4691 | bool locked; |
4692 | |
4693 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4694 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4695 | |
4696 | ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); |
4697 | ctrl1 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL1)); |
4698 | locked = chv_pad_locked(pctrl, offset); |
4699 | |
4700 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4701 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4702 | |
4703 | if (ctrl0 & CHV_PADCTRL0_GPIOEN) { |
4704 | seq_puts(s, "GPIO "); |
4705 | @@ -787,14 +796,14 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, |
4706 | |
4707 | grp = &pctrl->community->groups[group]; |
4708 | |
4709 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4710 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4711 | |
4712 | /* Check first that the pad is not locked */ |
4713 | for (i = 0; i < grp->npins; i++) { |
4714 | if (chv_pad_locked(pctrl, grp->pins[i])) { |
4715 | dev_warn(pctrl->dev, "unable to set mode for locked pin %u\n", |
4716 | grp->pins[i]); |
4717 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4718 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4719 | return -EBUSY; |
4720 | } |
4721 | } |
4722 | @@ -837,7 +846,7 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, |
4723 | pin, altfunc->mode, altfunc->invert_oe ? "" : "not "); |
4724 | } |
4725 | |
4726 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4727 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4728 | |
4729 | return 0; |
4730 | } |
4731 | @@ -851,13 +860,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, |
4732 | void __iomem *reg; |
4733 | u32 value; |
4734 | |
4735 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4736 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4737 | |
4738 | if (chv_pad_locked(pctrl, offset)) { |
4739 | value = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); |
4740 | if (!(value & CHV_PADCTRL0_GPIOEN)) { |
4741 | /* Locked so cannot enable */ |
4742 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4743 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4744 | return -EBUSY; |
4745 | } |
4746 | } else { |
4747 | @@ -897,7 +906,7 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, |
4748 | chv_writel(value, reg); |
4749 | } |
4750 | |
4751 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4752 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4753 | |
4754 | return 0; |
4755 | } |
4756 | @@ -911,13 +920,13 @@ static void chv_gpio_disable_free(struct pinctrl_dev *pctldev, |
4757 | void __iomem *reg; |
4758 | u32 value; |
4759 | |
4760 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4761 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4762 | |
4763 | reg = chv_padreg(pctrl, offset, CHV_PADCTRL0); |
4764 | value = readl(reg) & ~CHV_PADCTRL0_GPIOEN; |
4765 | chv_writel(value, reg); |
4766 | |
4767 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4768 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4769 | } |
4770 | |
4771 | static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, |
4772 | @@ -929,7 +938,7 @@ static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, |
4773 | unsigned long flags; |
4774 | u32 ctrl0; |
4775 | |
4776 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4777 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4778 | |
4779 | ctrl0 = readl(reg) & ~CHV_PADCTRL0_GPIOCFG_MASK; |
4780 | if (input) |
4781 | @@ -938,7 +947,7 @@ static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, |
4782 | ctrl0 |= CHV_PADCTRL0_GPIOCFG_GPO << CHV_PADCTRL0_GPIOCFG_SHIFT; |
4783 | chv_writel(ctrl0, reg); |
4784 | |
4785 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4786 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4787 | |
4788 | return 0; |
4789 | } |
4790 | @@ -963,10 +972,10 @@ static int chv_config_get(struct pinctrl_dev *pctldev, unsigned pin, |
4791 | u16 arg = 0; |
4792 | u32 term; |
4793 | |
4794 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4795 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4796 | ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4797 | ctrl1 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL1)); |
4798 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4799 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4800 | |
4801 | term = (ctrl0 & CHV_PADCTRL0_TERM_MASK) >> CHV_PADCTRL0_TERM_SHIFT; |
4802 | |
4803 | @@ -1040,7 +1049,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, |
4804 | unsigned long flags; |
4805 | u32 ctrl0, pull; |
4806 | |
4807 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4808 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4809 | ctrl0 = readl(reg); |
4810 | |
4811 | switch (param) { |
4812 | @@ -1063,7 +1072,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, |
4813 | pull = CHV_PADCTRL0_TERM_20K << CHV_PADCTRL0_TERM_SHIFT; |
4814 | break; |
4815 | default: |
4816 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4817 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4818 | return -EINVAL; |
4819 | } |
4820 | |
4821 | @@ -1081,7 +1090,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, |
4822 | pull = CHV_PADCTRL0_TERM_20K << CHV_PADCTRL0_TERM_SHIFT; |
4823 | break; |
4824 | default: |
4825 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4826 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4827 | return -EINVAL; |
4828 | } |
4829 | |
4830 | @@ -1089,12 +1098,12 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, |
4831 | break; |
4832 | |
4833 | default: |
4834 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4835 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4836 | return -EINVAL; |
4837 | } |
4838 | |
4839 | chv_writel(ctrl0, reg); |
4840 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4841 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4842 | |
4843 | return 0; |
4844 | } |
4845 | @@ -1160,9 +1169,9 @@ static int chv_gpio_get(struct gpio_chip *chip, unsigned offset) |
4846 | unsigned long flags; |
4847 | u32 ctrl0, cfg; |
4848 | |
4849 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4850 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4851 | ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4852 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4853 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4854 | |
4855 | cfg = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK; |
4856 | cfg >>= CHV_PADCTRL0_GPIOCFG_SHIFT; |
4857 | @@ -1180,7 +1189,7 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
4858 | void __iomem *reg; |
4859 | u32 ctrl0; |
4860 | |
4861 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4862 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4863 | |
4864 | reg = chv_padreg(pctrl, pin, CHV_PADCTRL0); |
4865 | ctrl0 = readl(reg); |
4866 | @@ -1192,7 +1201,7 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
4867 | |
4868 | chv_writel(ctrl0, reg); |
4869 | |
4870 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4871 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4872 | } |
4873 | |
4874 | static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset) |
4875 | @@ -1202,9 +1211,9 @@ static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset) |
4876 | u32 ctrl0, direction; |
4877 | unsigned long flags; |
4878 | |
4879 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4880 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4881 | ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4882 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4883 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4884 | |
4885 | direction = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK; |
4886 | direction >>= CHV_PADCTRL0_GPIOCFG_SHIFT; |
4887 | @@ -1242,14 +1251,14 @@ static void chv_gpio_irq_ack(struct irq_data *d) |
4888 | int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d)); |
4889 | u32 intr_line; |
4890 | |
4891 | - raw_spin_lock(&pctrl->lock); |
4892 | + raw_spin_lock(&chv_lock); |
4893 | |
4894 | intr_line = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4895 | intr_line &= CHV_PADCTRL0_INTSEL_MASK; |
4896 | intr_line >>= CHV_PADCTRL0_INTSEL_SHIFT; |
4897 | chv_writel(BIT(intr_line), pctrl->regs + CHV_INTSTAT); |
4898 | |
4899 | - raw_spin_unlock(&pctrl->lock); |
4900 | + raw_spin_unlock(&chv_lock); |
4901 | } |
4902 | |
4903 | static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) |
4904 | @@ -1260,7 +1269,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) |
4905 | u32 value, intr_line; |
4906 | unsigned long flags; |
4907 | |
4908 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4909 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4910 | |
4911 | intr_line = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4912 | intr_line &= CHV_PADCTRL0_INTSEL_MASK; |
4913 | @@ -1273,7 +1282,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) |
4914 | value |= BIT(intr_line); |
4915 | chv_writel(value, pctrl->regs + CHV_INTMASK); |
4916 | |
4917 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4918 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4919 | } |
4920 | |
4921 | static void chv_gpio_irq_mask(struct irq_data *d) |
4922 | @@ -1307,7 +1316,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) |
4923 | unsigned long flags; |
4924 | u32 intsel, value; |
4925 | |
4926 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4927 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4928 | intsel = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); |
4929 | intsel &= CHV_PADCTRL0_INTSEL_MASK; |
4930 | intsel >>= CHV_PADCTRL0_INTSEL_SHIFT; |
4931 | @@ -1322,7 +1331,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) |
4932 | irq_set_handler_locked(d, handler); |
4933 | pctrl->intr_lines[intsel] = offset; |
4934 | } |
4935 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4936 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4937 | } |
4938 | |
4939 | chv_gpio_irq_unmask(d); |
4940 | @@ -1338,7 +1347,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type) |
4941 | unsigned long flags; |
4942 | u32 value; |
4943 | |
4944 | - raw_spin_lock_irqsave(&pctrl->lock, flags); |
4945 | + raw_spin_lock_irqsave(&chv_lock, flags); |
4946 | |
4947 | /* |
4948 | * Pins which can be used as shared interrupt are configured in |
4949 | @@ -1387,7 +1396,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type) |
4950 | else if (type & IRQ_TYPE_LEVEL_MASK) |
4951 | irq_set_handler_locked(d, handle_level_irq); |
4952 | |
4953 | - raw_spin_unlock_irqrestore(&pctrl->lock, flags); |
4954 | + raw_spin_unlock_irqrestore(&chv_lock, flags); |
4955 | |
4956 | return 0; |
4957 | } |
4958 | @@ -1499,7 +1508,6 @@ static int chv_pinctrl_probe(struct platform_device *pdev) |
4959 | if (i == ARRAY_SIZE(chv_communities)) |
4960 | return -ENODEV; |
4961 | |
4962 | - raw_spin_lock_init(&pctrl->lock); |
4963 | pctrl->dev = &pdev->dev; |
4964 | |
4965 | #ifdef CONFIG_PM_SLEEP |
4966 | diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c |
4967 | index 6f145f2d004d..96ffda493266 100644 |
4968 | --- a/drivers/platform/x86/hp-wmi.c |
4969 | +++ b/drivers/platform/x86/hp-wmi.c |
4970 | @@ -718,6 +718,11 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device) |
4971 | if (err) |
4972 | return err; |
4973 | |
4974 | + err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, &wireless, |
4975 | + sizeof(wireless), 0); |
4976 | + if (err) |
4977 | + return err; |
4978 | + |
4979 | if (wireless & 0x1) { |
4980 | wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev, |
4981 | RFKILL_TYPE_WLAN, |
4982 | @@ -882,7 +887,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) |
4983 | wwan_rfkill = NULL; |
4984 | rfkill2_count = 0; |
4985 | |
4986 | - if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device)) |
4987 | + if (hp_wmi_rfkill_setup(device)) |
4988 | hp_wmi_rfkill2_setup(device); |
4989 | |
4990 | err = device_create_file(&device->dev, &dev_attr_display); |
4991 | diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c |
4992 | index 02fb6b4ea820..d838e77dd947 100644 |
4993 | --- a/drivers/regulator/s2mps11.c |
4994 | +++ b/drivers/regulator/s2mps11.c |
4995 | @@ -750,7 +750,7 @@ static const struct regulator_linear_range s2mps15_ldo_voltage_ranges3[] = { |
4996 | |
4997 | /* voltage range for s2mps15 LDO 7, 8, 9 and 10 */ |
4998 | static const struct regulator_linear_range s2mps15_ldo_voltage_ranges4[] = { |
4999 | - REGULATOR_LINEAR_RANGE(700000, 0xc, 0x18, 25000), |
5000 | + REGULATOR_LINEAR_RANGE(700000, 0x10, 0x20, 25000), |
5001 | }; |
5002 | |
5003 | /* voltage range for s2mps15 LDO 1 */ |
5004 | @@ -760,12 +760,12 @@ static const struct regulator_linear_range s2mps15_ldo_voltage_ranges5[] = { |
5005 | |
5006 | /* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */ |
5007 | static const struct regulator_linear_range s2mps15_buck_voltage_ranges1[] = { |
5008 | - REGULATOR_LINEAR_RANGE(500000, 0x20, 0xb0, 6250), |
5009 | + REGULATOR_LINEAR_RANGE(500000, 0x20, 0xc0, 6250), |
5010 | }; |
5011 | |
5012 | /* voltage range for s2mps15 BUCK 8, 9 and 10 */ |
5013 | static const struct regulator_linear_range s2mps15_buck_voltage_ranges2[] = { |
5014 | - REGULATOR_LINEAR_RANGE(1000000, 0x20, 0xc0, 12500), |
5015 | + REGULATOR_LINEAR_RANGE(1000000, 0x20, 0x78, 12500), |
5016 | }; |
5017 | |
5018 | static const struct regulator_desc s2mps15_regulators[] = { |
5019 | diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c |
5020 | index db3958b3f094..fe0539ed9cb5 100644 |
5021 | --- a/drivers/remoteproc/remoteproc_core.c |
5022 | +++ b/drivers/remoteproc/remoteproc_core.c |
5023 | @@ -1264,11 +1264,6 @@ int rproc_add(struct rproc *rproc) |
5024 | if (ret < 0) |
5025 | return ret; |
5026 | |
5027 | - /* expose to rproc_get_by_phandle users */ |
5028 | - mutex_lock(&rproc_list_mutex); |
5029 | - list_add(&rproc->node, &rproc_list); |
5030 | - mutex_unlock(&rproc_list_mutex); |
5031 | - |
5032 | dev_info(dev, "%s is available\n", rproc->name); |
5033 | |
5034 | dev_info(dev, "Note: remoteproc is still under development and considered experimental.\n"); |
5035 | @@ -1276,8 +1271,16 @@ int rproc_add(struct rproc *rproc) |
5036 | |
5037 | /* create debugfs entries */ |
5038 | rproc_create_debug_dir(rproc); |
5039 | + ret = rproc_add_virtio_devices(rproc); |
5040 | + if (ret < 0) |
5041 | + return ret; |
5042 | |
5043 | - return rproc_add_virtio_devices(rproc); |
5044 | + /* expose to rproc_get_by_phandle users */ |
5045 | + mutex_lock(&rproc_list_mutex); |
5046 | + list_add(&rproc->node, &rproc_list); |
5047 | + mutex_unlock(&rproc_list_mutex); |
5048 | + |
5049 | + return 0; |
5050 | } |
5051 | EXPORT_SYMBOL(rproc_add); |
5052 | |
5053 | diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c |
5054 | index d01ad7e8078e..4e823c4b7a4d 100644 |
5055 | --- a/drivers/rtc/rtc-s3c.c |
5056 | +++ b/drivers/rtc/rtc-s3c.c |
5057 | @@ -149,12 +149,14 @@ static int s3c_rtc_setfreq(struct s3c_rtc *info, int freq) |
5058 | if (!is_power_of_2(freq)) |
5059 | return -EINVAL; |
5060 | |
5061 | + s3c_rtc_enable_clk(info); |
5062 | spin_lock_irq(&info->pie_lock); |
5063 | |
5064 | if (info->data->set_freq) |
5065 | info->data->set_freq(info, freq); |
5066 | |
5067 | spin_unlock_irq(&info->pie_lock); |
5068 | + s3c_rtc_disable_clk(info); |
5069 | |
5070 | return 0; |
5071 | } |
5072 | diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c |
5073 | index b2afad5a5682..2a34eb5f6161 100644 |
5074 | --- a/drivers/s390/cio/cmf.c |
5075 | +++ b/drivers/s390/cio/cmf.c |
5076 | @@ -753,6 +753,17 @@ static void reset_cmb(struct ccw_device *cdev) |
5077 | cmf_generic_reset(cdev); |
5078 | } |
5079 | |
5080 | +static int cmf_enabled(struct ccw_device *cdev) |
5081 | +{ |
5082 | + int enabled; |
5083 | + |
5084 | + spin_lock_irq(cdev->ccwlock); |
5085 | + enabled = !!cdev->private->cmb; |
5086 | + spin_unlock_irq(cdev->ccwlock); |
5087 | + |
5088 | + return enabled; |
5089 | +} |
5090 | + |
5091 | static struct attribute_group cmf_attr_group; |
5092 | |
5093 | static struct cmb_operations cmbops_basic = { |
5094 | @@ -1153,13 +1164,8 @@ static ssize_t cmb_enable_show(struct device *dev, |
5095 | char *buf) |
5096 | { |
5097 | struct ccw_device *cdev = to_ccwdev(dev); |
5098 | - int enabled; |
5099 | |
5100 | - spin_lock_irq(cdev->ccwlock); |
5101 | - enabled = !!cdev->private->cmb; |
5102 | - spin_unlock_irq(cdev->ccwlock); |
5103 | - |
5104 | - return sprintf(buf, "%d\n", enabled); |
5105 | + return sprintf(buf, "%d\n", cmf_enabled(cdev)); |
5106 | } |
5107 | |
5108 | static ssize_t cmb_enable_store(struct device *dev, |
5109 | @@ -1199,15 +1205,20 @@ int ccw_set_cmf(struct ccw_device *cdev, int enable) |
5110 | * @cdev: The ccw device to be enabled |
5111 | * |
5112 | * Returns %0 for success or a negative error value. |
5113 | - * |
5114 | + * Note: If this is called on a device for which channel measurement is already |
5115 | + * enabled a reset of the measurement data is triggered. |
5116 | * Context: |
5117 | * non-atomic |
5118 | */ |
5119 | int enable_cmf(struct ccw_device *cdev) |
5120 | { |
5121 | - int ret; |
5122 | + int ret = 0; |
5123 | |
5124 | device_lock(&cdev->dev); |
5125 | + if (cmf_enabled(cdev)) { |
5126 | + cmbops->reset(cdev); |
5127 | + goto out_unlock; |
5128 | + } |
5129 | get_device(&cdev->dev); |
5130 | ret = cmbops->alloc(cdev); |
5131 | if (ret) |
5132 | @@ -1226,7 +1237,7 @@ int enable_cmf(struct ccw_device *cdev) |
5133 | out: |
5134 | if (ret) |
5135 | put_device(&cdev->dev); |
5136 | - |
5137 | +out_unlock: |
5138 | device_unlock(&cdev->dev); |
5139 | return ret; |
5140 | } |
5141 | diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c |
5142 | index 3bd0be6277b3..c7e5695da4f5 100644 |
5143 | --- a/drivers/scsi/lpfc/lpfc_scsi.c |
5144 | +++ b/drivers/scsi/lpfc/lpfc_scsi.c |
5145 | @@ -3874,7 +3874,7 @@ int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba, |
5146 | uint32_t tag; |
5147 | uint16_t hwq; |
5148 | |
5149 | - if (shost_use_blk_mq(cmnd->device->host)) { |
5150 | + if (cmnd && shost_use_blk_mq(cmnd->device->host)) { |
5151 | tag = blk_mq_unique_tag(cmnd->request); |
5152 | hwq = blk_mq_unique_tag_to_hwq(tag); |
5153 | |
5154 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c |
5155 | index f4b0690450d2..2dab3dc2aa69 100644 |
5156 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c |
5157 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c |
5158 | @@ -4079,6 +4079,12 @@ megasas_get_pd_list(struct megasas_instance *instance) |
5159 | struct MR_PD_ADDRESS *pd_addr; |
5160 | dma_addr_t ci_h = 0; |
5161 | |
5162 | + if (instance->pd_list_not_supported) { |
5163 | + dev_info(&instance->pdev->dev, "MR_DCMD_PD_LIST_QUERY " |
5164 | + "not supported by firmware\n"); |
5165 | + return ret; |
5166 | + } |
5167 | + |
5168 | cmd = megasas_get_cmd(instance); |
5169 | |
5170 | if (!cmd) { |
5171 | diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c |
5172 | index f1eed7f9dd67..9c2788b8f2c3 100644 |
5173 | --- a/drivers/soc/qcom/smp2p.c |
5174 | +++ b/drivers/soc/qcom/smp2p.c |
5175 | @@ -344,11 +344,12 @@ static int qcom_smp2p_outbound_entry(struct qcom_smp2p *smp2p, |
5176 | /* Allocate an entry from the smem item */ |
5177 | strlcpy(buf, entry->name, SMP2P_MAX_ENTRY_NAME); |
5178 | memcpy_toio(out->entries[out->valid_entries].name, buf, SMP2P_MAX_ENTRY_NAME); |
5179 | - out->valid_entries++; |
5180 | |
5181 | /* Make the logical entry reference the physical value */ |
5182 | entry->value = &out->entries[out->valid_entries].value; |
5183 | |
5184 | + out->valid_entries++; |
5185 | + |
5186 | entry->state = qcom_smem_state_register(node, &smp2p_state_ops, entry); |
5187 | if (IS_ERR(entry->state)) { |
5188 | dev_err(smp2p->dev, "failed to register qcom_smem_state\n"); |
5189 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c |
5190 | index fe07c0592b44..daf28443b7ad 100644 |
5191 | --- a/drivers/spi/spi-pxa2xx.c |
5192 | +++ b/drivers/spi/spi-pxa2xx.c |
5193 | @@ -585,7 +585,14 @@ static void reset_sccr1(struct driver_data *drv_data) |
5194 | u32 sccr1_reg; |
5195 | |
5196 | sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1; |
5197 | - sccr1_reg &= ~SSCR1_RFT; |
5198 | + switch (drv_data->ssp_type) { |
5199 | + case QUARK_X1000_SSP: |
5200 | + sccr1_reg &= ~QUARK_X1000_SSCR1_RFT; |
5201 | + break; |
5202 | + default: |
5203 | + sccr1_reg &= ~SSCR1_RFT; |
5204 | + break; |
5205 | + } |
5206 | sccr1_reg |= chip->threshold; |
5207 | pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg); |
5208 | } |
5209 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
5210 | index 50f3d3a0dd7b..39b928c2849d 100644 |
5211 | --- a/drivers/target/iscsi/iscsi_target.c |
5212 | +++ b/drivers/target/iscsi/iscsi_target.c |
5213 | @@ -492,7 +492,8 @@ void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) |
5214 | bool scsi_cmd = (cmd->iscsi_opcode == ISCSI_OP_SCSI_CMD); |
5215 | |
5216 | spin_lock_bh(&conn->cmd_lock); |
5217 | - if (!list_empty(&cmd->i_conn_node)) |
5218 | + if (!list_empty(&cmd->i_conn_node) && |
5219 | + !(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP)) |
5220 | list_del_init(&cmd->i_conn_node); |
5221 | spin_unlock_bh(&conn->cmd_lock); |
5222 | |
5223 | @@ -4034,6 +4035,7 @@ int iscsi_target_rx_thread(void *arg) |
5224 | |
5225 | static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) |
5226 | { |
5227 | + LIST_HEAD(tmp_list); |
5228 | struct iscsi_cmd *cmd = NULL, *cmd_tmp = NULL; |
5229 | struct iscsi_session *sess = conn->sess; |
5230 | /* |
5231 | @@ -4042,18 +4044,26 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) |
5232 | * has been reset -> returned sleeping pre-handler state. |
5233 | */ |
5234 | spin_lock_bh(&conn->cmd_lock); |
5235 | - list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { |
5236 | + list_splice_init(&conn->conn_cmd_list, &tmp_list); |
5237 | |
5238 | + list_for_each_entry(cmd, &tmp_list, i_conn_node) { |
5239 | + struct se_cmd *se_cmd = &cmd->se_cmd; |
5240 | + |
5241 | + if (se_cmd->se_tfo != NULL) { |
5242 | + spin_lock(&se_cmd->t_state_lock); |
5243 | + se_cmd->transport_state |= CMD_T_FABRIC_STOP; |
5244 | + spin_unlock(&se_cmd->t_state_lock); |
5245 | + } |
5246 | + } |
5247 | + spin_unlock_bh(&conn->cmd_lock); |
5248 | + |
5249 | + list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) { |
5250 | list_del_init(&cmd->i_conn_node); |
5251 | - spin_unlock_bh(&conn->cmd_lock); |
5252 | |
5253 | iscsit_increment_maxcmdsn(cmd, sess); |
5254 | - |
5255 | iscsit_free_cmd(cmd, true); |
5256 | |
5257 | - spin_lock_bh(&conn->cmd_lock); |
5258 | } |
5259 | - spin_unlock_bh(&conn->cmd_lock); |
5260 | } |
5261 | |
5262 | static void iscsit_stop_timers_for_cmds( |
5263 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c |
5264 | index b5212f0f9571..adf419fa4291 100644 |
5265 | --- a/drivers/target/iscsi/iscsi_target_login.c |
5266 | +++ b/drivers/target/iscsi/iscsi_target_login.c |
5267 | @@ -1371,8 +1371,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) |
5268 | } |
5269 | login->zero_tsih = zero_tsih; |
5270 | |
5271 | - conn->sess->se_sess->sup_prot_ops = |
5272 | - conn->conn_transport->iscsit_get_sup_prot_ops(conn); |
5273 | + if (conn->sess) |
5274 | + conn->sess->se_sess->sup_prot_ops = |
5275 | + conn->conn_transport->iscsit_get_sup_prot_ops(conn); |
5276 | |
5277 | tpg = conn->tpg; |
5278 | if (!tpg) { |
5279 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c |
5280 | index a4046ca6e60d..6b423485c5d6 100644 |
5281 | --- a/drivers/target/target_core_device.c |
5282 | +++ b/drivers/target/target_core_device.c |
5283 | @@ -821,13 +821,15 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) |
5284 | * in ATA and we need to set TPE=1 |
5285 | */ |
5286 | bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib, |
5287 | - struct request_queue *q, int block_size) |
5288 | + struct request_queue *q) |
5289 | { |
5290 | + int block_size = queue_logical_block_size(q); |
5291 | + |
5292 | if (!blk_queue_discard(q)) |
5293 | return false; |
5294 | |
5295 | - attrib->max_unmap_lba_count = (q->limits.max_discard_sectors << 9) / |
5296 | - block_size; |
5297 | + attrib->max_unmap_lba_count = |
5298 | + q->limits.max_discard_sectors >> (ilog2(block_size) - 9); |
5299 | /* |
5300 | * Currently hardcoded to 1 in Linux/SCSI code.. |
5301 | */ |
5302 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c |
5303 | index 75f0f08b2a34..79291869bce6 100644 |
5304 | --- a/drivers/target/target_core_file.c |
5305 | +++ b/drivers/target/target_core_file.c |
5306 | @@ -161,8 +161,7 @@ static int fd_configure_device(struct se_device *dev) |
5307 | dev_size, div_u64(dev_size, fd_dev->fd_block_size), |
5308 | fd_dev->fd_block_size); |
5309 | |
5310 | - if (target_configure_unmap_from_queue(&dev->dev_attrib, q, |
5311 | - fd_dev->fd_block_size)) |
5312 | + if (target_configure_unmap_from_queue(&dev->dev_attrib, q)) |
5313 | pr_debug("IFILE: BLOCK Discard support available," |
5314 | " disabled by default\n"); |
5315 | /* |
5316 | diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c |
5317 | index 7c4efb4417b0..2077bc28640a 100644 |
5318 | --- a/drivers/target/target_core_iblock.c |
5319 | +++ b/drivers/target/target_core_iblock.c |
5320 | @@ -121,8 +121,7 @@ static int iblock_configure_device(struct se_device *dev) |
5321 | dev->dev_attrib.hw_max_sectors = queue_max_hw_sectors(q); |
5322 | dev->dev_attrib.hw_queue_depth = q->nr_requests; |
5323 | |
5324 | - if (target_configure_unmap_from_queue(&dev->dev_attrib, q, |
5325 | - dev->dev_attrib.hw_block_size)) |
5326 | + if (target_configure_unmap_from_queue(&dev->dev_attrib, q)) |
5327 | pr_debug("IBLOCK: BLOCK Discard support available," |
5328 | " disabled by default\n"); |
5329 | |
5330 | diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h |
5331 | index fc91e85f54ba..e2c970a9d61c 100644 |
5332 | --- a/drivers/target/target_core_internal.h |
5333 | +++ b/drivers/target/target_core_internal.h |
5334 | @@ -146,6 +146,7 @@ sense_reason_t target_cmd_size_check(struct se_cmd *cmd, unsigned int size); |
5335 | void target_qf_do_work(struct work_struct *work); |
5336 | bool target_check_wce(struct se_device *dev); |
5337 | bool target_check_fua(struct se_device *dev); |
5338 | +void __target_execute_cmd(struct se_cmd *, bool); |
5339 | |
5340 | /* target_core_stat.c */ |
5341 | void target_stat_setup_dev_default_groups(struct se_device *); |
5342 | diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c |
5343 | index a9057aa07176..04f616b3ba0a 100644 |
5344 | --- a/drivers/target/target_core_sbc.c |
5345 | +++ b/drivers/target/target_core_sbc.c |
5346 | @@ -602,7 +602,7 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool succes |
5347 | cmd->transport_state |= CMD_T_ACTIVE|CMD_T_BUSY|CMD_T_SENT; |
5348 | spin_unlock_irq(&cmd->t_state_lock); |
5349 | |
5350 | - __target_execute_cmd(cmd); |
5351 | + __target_execute_cmd(cmd, false); |
5352 | |
5353 | kfree(buf); |
5354 | return ret; |
5355 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
5356 | index 5ab3967dda43..42c2a44b83dd 100644 |
5357 | --- a/drivers/target/target_core_transport.c |
5358 | +++ b/drivers/target/target_core_transport.c |
5359 | @@ -1303,23 +1303,6 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb) |
5360 | |
5361 | trace_target_sequencer_start(cmd); |
5362 | |
5363 | - /* |
5364 | - * Check for an existing UNIT ATTENTION condition |
5365 | - */ |
5366 | - ret = target_scsi3_ua_check(cmd); |
5367 | - if (ret) |
5368 | - return ret; |
5369 | - |
5370 | - ret = target_alua_state_check(cmd); |
5371 | - if (ret) |
5372 | - return ret; |
5373 | - |
5374 | - ret = target_check_reservation(cmd); |
5375 | - if (ret) { |
5376 | - cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; |
5377 | - return ret; |
5378 | - } |
5379 | - |
5380 | ret = dev->transport->parse_cdb(cmd); |
5381 | if (ret == TCM_UNSUPPORTED_SCSI_OPCODE) |
5382 | pr_warn_ratelimited("%s/%s: Unsupported SCSI Opcode 0x%02x, sending CHECK_CONDITION.\n", |
5383 | @@ -1761,20 +1744,45 @@ queue_full: |
5384 | } |
5385 | EXPORT_SYMBOL(transport_generic_request_failure); |
5386 | |
5387 | -void __target_execute_cmd(struct se_cmd *cmd) |
5388 | +void __target_execute_cmd(struct se_cmd *cmd, bool do_checks) |
5389 | { |
5390 | sense_reason_t ret; |
5391 | |
5392 | - if (cmd->execute_cmd) { |
5393 | - ret = cmd->execute_cmd(cmd); |
5394 | - if (ret) { |
5395 | - spin_lock_irq(&cmd->t_state_lock); |
5396 | - cmd->transport_state &= ~(CMD_T_BUSY|CMD_T_SENT); |
5397 | - spin_unlock_irq(&cmd->t_state_lock); |
5398 | + if (!cmd->execute_cmd) { |
5399 | + ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
5400 | + goto err; |
5401 | + } |
5402 | + if (do_checks) { |
5403 | + /* |
5404 | + * Check for an existing UNIT ATTENTION condition after |
5405 | + * target_handle_task_attr() has done SAM task attr |
5406 | + * checking, and possibly have already defered execution |
5407 | + * out to target_restart_delayed_cmds() context. |
5408 | + */ |
5409 | + ret = target_scsi3_ua_check(cmd); |
5410 | + if (ret) |
5411 | + goto err; |
5412 | + |
5413 | + ret = target_alua_state_check(cmd); |
5414 | + if (ret) |
5415 | + goto err; |
5416 | |
5417 | - transport_generic_request_failure(cmd, ret); |
5418 | + ret = target_check_reservation(cmd); |
5419 | + if (ret) { |
5420 | + cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; |
5421 | + goto err; |
5422 | } |
5423 | } |
5424 | + |
5425 | + ret = cmd->execute_cmd(cmd); |
5426 | + if (!ret) |
5427 | + return; |
5428 | +err: |
5429 | + spin_lock_irq(&cmd->t_state_lock); |
5430 | + cmd->transport_state &= ~(CMD_T_BUSY|CMD_T_SENT); |
5431 | + spin_unlock_irq(&cmd->t_state_lock); |
5432 | + |
5433 | + transport_generic_request_failure(cmd, ret); |
5434 | } |
5435 | |
5436 | static int target_write_prot_action(struct se_cmd *cmd) |
5437 | @@ -1819,6 +1827,8 @@ static bool target_handle_task_attr(struct se_cmd *cmd) |
5438 | if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) |
5439 | return false; |
5440 | |
5441 | + cmd->se_cmd_flags |= SCF_TASK_ATTR_SET; |
5442 | + |
5443 | /* |
5444 | * Check for the existence of HEAD_OF_QUEUE, and if true return 1 |
5445 | * to allow the passed struct se_cmd list of tasks to the front of the list. |
5446 | @@ -1899,7 +1909,7 @@ void target_execute_cmd(struct se_cmd *cmd) |
5447 | return; |
5448 | } |
5449 | |
5450 | - __target_execute_cmd(cmd); |
5451 | + __target_execute_cmd(cmd, true); |
5452 | } |
5453 | EXPORT_SYMBOL(target_execute_cmd); |
5454 | |
5455 | @@ -1923,7 +1933,7 @@ static void target_restart_delayed_cmds(struct se_device *dev) |
5456 | list_del(&cmd->se_delayed_node); |
5457 | spin_unlock(&dev->delayed_cmd_lock); |
5458 | |
5459 | - __target_execute_cmd(cmd); |
5460 | + __target_execute_cmd(cmd, true); |
5461 | |
5462 | if (cmd->sam_task_attr == TCM_ORDERED_TAG) |
5463 | break; |
5464 | @@ -1941,6 +1951,9 @@ static void transport_complete_task_attr(struct se_cmd *cmd) |
5465 | if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) |
5466 | return; |
5467 | |
5468 | + if (!(cmd->se_cmd_flags & SCF_TASK_ATTR_SET)) |
5469 | + goto restart; |
5470 | + |
5471 | if (cmd->sam_task_attr == TCM_SIMPLE_TAG) { |
5472 | atomic_dec_mb(&dev->simple_cmds); |
5473 | dev->dev_cur_ordered_id++; |
5474 | @@ -1957,7 +1970,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd) |
5475 | pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED\n", |
5476 | dev->dev_cur_ordered_id); |
5477 | } |
5478 | - |
5479 | +restart: |
5480 | target_restart_delayed_cmds(dev); |
5481 | } |
5482 | |
5483 | @@ -2557,15 +2570,10 @@ static void target_release_cmd_kref(struct kref *kref) |
5484 | bool fabric_stop; |
5485 | |
5486 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); |
5487 | - if (list_empty(&se_cmd->se_cmd_list)) { |
5488 | - spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); |
5489 | - target_free_cmd_mem(se_cmd); |
5490 | - se_cmd->se_tfo->release_cmd(se_cmd); |
5491 | - return; |
5492 | - } |
5493 | |
5494 | spin_lock(&se_cmd->t_state_lock); |
5495 | - fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP); |
5496 | + fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP) && |
5497 | + (se_cmd->transport_state & CMD_T_ABORTED); |
5498 | spin_unlock(&se_cmd->t_state_lock); |
5499 | |
5500 | if (se_cmd->cmd_wait_set || fabric_stop) { |
5501 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c |
5502 | index 954941dd8124..f9c798cba83f 100644 |
5503 | --- a/drivers/tty/serial/atmel_serial.c |
5504 | +++ b/drivers/tty/serial/atmel_serial.c |
5505 | @@ -482,19 +482,21 @@ static void atmel_start_tx(struct uart_port *port) |
5506 | { |
5507 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
5508 | |
5509 | - if (atmel_use_pdc_tx(port)) { |
5510 | - if (atmel_uart_readl(port, ATMEL_PDC_PTSR) & ATMEL_PDC_TXTEN) |
5511 | - /* The transmitter is already running. Yes, we |
5512 | - really need this.*/ |
5513 | - return; |
5514 | + if (atmel_use_pdc_tx(port) && (atmel_uart_readl(port, ATMEL_PDC_PTSR) |
5515 | + & ATMEL_PDC_TXTEN)) |
5516 | + /* The transmitter is already running. Yes, we |
5517 | + really need this.*/ |
5518 | + return; |
5519 | |
5520 | + if (atmel_use_pdc_tx(port) || atmel_use_dma_tx(port)) |
5521 | if ((port->rs485.flags & SER_RS485_ENABLED) && |
5522 | !(port->rs485.flags & SER_RS485_RX_DURING_TX)) |
5523 | atmel_stop_rx(port); |
5524 | |
5525 | + if (atmel_use_pdc_tx(port)) |
5526 | /* re-enable PDC transmit */ |
5527 | atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN); |
5528 | - } |
5529 | + |
5530 | /* Enable interrupts */ |
5531 | atmel_uart_writel(port, ATMEL_US_IER, atmel_port->tx_done_mask); |
5532 | } |
5533 | diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c |
5534 | index b7d80bd57db9..7d62610d9de5 100644 |
5535 | --- a/drivers/tty/serial/msm_serial.c |
5536 | +++ b/drivers/tty/serial/msm_serial.c |
5537 | @@ -726,7 +726,7 @@ static void msm_handle_tx(struct uart_port *port) |
5538 | return; |
5539 | } |
5540 | |
5541 | - pio_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); |
5542 | + pio_count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); |
5543 | dma_count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); |
5544 | |
5545 | dma_min = 1; /* Always DMA */ |
5546 | diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c |
5547 | index 99bb23161dd6..f0bd2ec0db59 100644 |
5548 | --- a/drivers/tty/serial/samsung.c |
5549 | +++ b/drivers/tty/serial/samsung.c |
5550 | @@ -1684,7 +1684,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, |
5551 | return -ENODEV; |
5552 | |
5553 | if (port->mapbase != 0) |
5554 | - return 0; |
5555 | + return -EINVAL; |
5556 | |
5557 | /* setup info for port */ |
5558 | port->dev = &platdev->dev; |
5559 | @@ -1738,22 +1738,25 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, |
5560 | ourport->dma = devm_kzalloc(port->dev, |
5561 | sizeof(*ourport->dma), |
5562 | GFP_KERNEL); |
5563 | - if (!ourport->dma) |
5564 | - return -ENOMEM; |
5565 | + if (!ourport->dma) { |
5566 | + ret = -ENOMEM; |
5567 | + goto err; |
5568 | + } |
5569 | } |
5570 | |
5571 | ourport->clk = clk_get(&platdev->dev, "uart"); |
5572 | if (IS_ERR(ourport->clk)) { |
5573 | pr_err("%s: Controller clock not found\n", |
5574 | dev_name(&platdev->dev)); |
5575 | - return PTR_ERR(ourport->clk); |
5576 | + ret = PTR_ERR(ourport->clk); |
5577 | + goto err; |
5578 | } |
5579 | |
5580 | ret = clk_prepare_enable(ourport->clk); |
5581 | if (ret) { |
5582 | pr_err("uart: clock failed to prepare+enable: %d\n", ret); |
5583 | clk_put(ourport->clk); |
5584 | - return ret; |
5585 | + goto err; |
5586 | } |
5587 | |
5588 | /* Keep all interrupts masked and cleared */ |
5589 | @@ -1769,7 +1772,12 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, |
5590 | |
5591 | /* reset the fifos (and setup the uart) */ |
5592 | s3c24xx_serial_resetport(port, cfg); |
5593 | + |
5594 | return 0; |
5595 | + |
5596 | +err: |
5597 | + port->mapbase = 0; |
5598 | + return ret; |
5599 | } |
5600 | |
5601 | /* Device driver serial port probe */ |
5602 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
5603 | index 944a6dca0fcb..d2e50a27140c 100644 |
5604 | --- a/drivers/usb/core/quirks.c |
5605 | +++ b/drivers/usb/core/quirks.c |
5606 | @@ -128,6 +128,9 @@ static const struct usb_device_id usb_quirk_list[] = { |
5607 | { USB_DEVICE(0x04f3, 0x016f), .driver_info = |
5608 | USB_QUIRK_DEVICE_QUALIFIER }, |
5609 | |
5610 | + { USB_DEVICE(0x04f3, 0x0381), .driver_info = |
5611 | + USB_QUIRK_NO_LPM }, |
5612 | + |
5613 | { USB_DEVICE(0x04f3, 0x21b8), .driver_info = |
5614 | USB_QUIRK_DEVICE_QUALIFIER }, |
5615 | |
5616 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
5617 | index 07248ff1be5c..716f4f051a0a 100644 |
5618 | --- a/drivers/usb/dwc3/gadget.c |
5619 | +++ b/drivers/usb/dwc3/gadget.c |
5620 | @@ -258,11 +258,13 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, |
5621 | * We will also set SUSPHY bit to what it was before returning as stated |
5622 | * by the same section on Synopsys databook. |
5623 | */ |
5624 | - reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); |
5625 | - if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) { |
5626 | - susphy = true; |
5627 | - reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; |
5628 | - dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); |
5629 | + if (dwc->gadget.speed <= USB_SPEED_HIGH) { |
5630 | + reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); |
5631 | + if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) { |
5632 | + susphy = true; |
5633 | + reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; |
5634 | + dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); |
5635 | + } |
5636 | } |
5637 | |
5638 | if (cmd == DWC3_DEPCMD_STARTTRANSFER) { |
5639 | @@ -2023,6 +2025,10 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, |
5640 | return 1; |
5641 | } |
5642 | |
5643 | + if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) |
5644 | + if ((event->status & DEPEVT_STATUS_IOC) && |
5645 | + (trb->ctrl & DWC3_TRB_CTRL_IOC)) |
5646 | + return 0; |
5647 | return 1; |
5648 | } |
5649 | |
5650 | diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c |
5651 | index 18569de06b04..bb1f6c8f0f01 100644 |
5652 | --- a/drivers/usb/gadget/udc/atmel_usba_udc.c |
5653 | +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c |
5654 | @@ -1920,6 +1920,8 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, |
5655 | |
5656 | udc->errata = match->data; |
5657 | udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9g45-pmc"); |
5658 | + if (IS_ERR(udc->pmc)) |
5659 | + udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9x5-pmc"); |
5660 | if (udc->errata && IS_ERR(udc->pmc)) |
5661 | return ERR_CAST(udc->pmc); |
5662 | |
5663 | diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c |
5664 | index ebc51ec5790a..71751429814f 100644 |
5665 | --- a/drivers/usb/gadget/udc/pch_udc.c |
5666 | +++ b/drivers/usb/gadget/udc/pch_udc.c |
5667 | @@ -1477,11 +1477,11 @@ static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, |
5668 | req->dma_mapped = 0; |
5669 | } |
5670 | ep->halted = 1; |
5671 | - spin_lock(&dev->lock); |
5672 | + spin_unlock(&dev->lock); |
5673 | if (!ep->in) |
5674 | pch_udc_ep_clear_rrdy(ep); |
5675 | usb_gadget_giveback_request(&ep->ep, &req->req); |
5676 | - spin_unlock(&dev->lock); |
5677 | + spin_lock(&dev->lock); |
5678 | ep->halted = halted; |
5679 | } |
5680 | |
5681 | @@ -2573,9 +2573,9 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev) |
5682 | empty_req_queue(ep); |
5683 | } |
5684 | if (dev->driver) { |
5685 | - spin_lock(&dev->lock); |
5686 | - usb_gadget_udc_reset(&dev->gadget, dev->driver); |
5687 | spin_unlock(&dev->lock); |
5688 | + usb_gadget_udc_reset(&dev->gadget, dev->driver); |
5689 | + spin_lock(&dev->lock); |
5690 | } |
5691 | } |
5692 | |
5693 | @@ -2654,9 +2654,9 @@ static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev) |
5694 | dev->ep[i].halted = 0; |
5695 | } |
5696 | dev->stall = 0; |
5697 | - spin_lock(&dev->lock); |
5698 | - dev->driver->setup(&dev->gadget, &dev->setup_data); |
5699 | spin_unlock(&dev->lock); |
5700 | + dev->driver->setup(&dev->gadget, &dev->setup_data); |
5701 | + spin_lock(&dev->lock); |
5702 | } |
5703 | |
5704 | /** |
5705 | @@ -2691,9 +2691,9 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev) |
5706 | dev->stall = 0; |
5707 | |
5708 | /* call gadget zero with setup data received */ |
5709 | - spin_lock(&dev->lock); |
5710 | - dev->driver->setup(&dev->gadget, &dev->setup_data); |
5711 | spin_unlock(&dev->lock); |
5712 | + dev->driver->setup(&dev->gadget, &dev->setup_data); |
5713 | + spin_lock(&dev->lock); |
5714 | } |
5715 | |
5716 | /** |
5717 | diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c |
5718 | index 7be4e7d57ace..280ed5ff021b 100644 |
5719 | --- a/drivers/usb/renesas_usbhs/fifo.c |
5720 | +++ b/drivers/usb/renesas_usbhs/fifo.c |
5721 | @@ -810,20 +810,27 @@ static void xfer_work(struct work_struct *work) |
5722 | { |
5723 | struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); |
5724 | struct usbhs_pipe *pipe = pkt->pipe; |
5725 | - struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); |
5726 | + struct usbhs_fifo *fifo; |
5727 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
5728 | struct dma_async_tx_descriptor *desc; |
5729 | - struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt); |
5730 | + struct dma_chan *chan; |
5731 | struct device *dev = usbhs_priv_to_dev(priv); |
5732 | enum dma_transfer_direction dir; |
5733 | + unsigned long flags; |
5734 | |
5735 | + usbhs_lock(priv, flags); |
5736 | + fifo = usbhs_pipe_to_fifo(pipe); |
5737 | + if (!fifo) |
5738 | + goto xfer_work_end; |
5739 | + |
5740 | + chan = usbhsf_dma_chan_get(fifo, pkt); |
5741 | dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; |
5742 | |
5743 | desc = dmaengine_prep_slave_single(chan, pkt->dma + pkt->actual, |
5744 | pkt->trans, dir, |
5745 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
5746 | if (!desc) |
5747 | - return; |
5748 | + goto xfer_work_end; |
5749 | |
5750 | desc->callback = usbhsf_dma_complete; |
5751 | desc->callback_param = pipe; |
5752 | @@ -831,7 +838,7 @@ static void xfer_work(struct work_struct *work) |
5753 | pkt->cookie = dmaengine_submit(desc); |
5754 | if (pkt->cookie < 0) { |
5755 | dev_err(dev, "Failed to submit dma descriptor\n"); |
5756 | - return; |
5757 | + goto xfer_work_end; |
5758 | } |
5759 | |
5760 | dev_dbg(dev, " %s %d (%d/ %d)\n", |
5761 | @@ -842,6 +849,9 @@ static void xfer_work(struct work_struct *work) |
5762 | usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); |
5763 | dma_async_issue_pending(chan); |
5764 | usbhs_pipe_enable(pipe); |
5765 | + |
5766 | +xfer_work_end: |
5767 | + usbhs_unlock(priv, flags); |
5768 | } |
5769 | |
5770 | /* |
5771 | diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c |
5772 | index 30345c2d01be..50f3363cc382 100644 |
5773 | --- a/drivers/usb/renesas_usbhs/mod_gadget.c |
5774 | +++ b/drivers/usb/renesas_usbhs/mod_gadget.c |
5775 | @@ -585,6 +585,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep, |
5776 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
5777 | struct usbhs_pipe *pipe; |
5778 | int ret = -EIO; |
5779 | + unsigned long flags; |
5780 | + |
5781 | + usbhs_lock(priv, flags); |
5782 | |
5783 | /* |
5784 | * if it already have pipe, |
5785 | @@ -593,7 +596,8 @@ static int usbhsg_ep_enable(struct usb_ep *ep, |
5786 | if (uep->pipe) { |
5787 | usbhs_pipe_clear(uep->pipe); |
5788 | usbhs_pipe_sequence_data0(uep->pipe); |
5789 | - return 0; |
5790 | + ret = 0; |
5791 | + goto usbhsg_ep_enable_end; |
5792 | } |
5793 | |
5794 | pipe = usbhs_pipe_malloc(priv, |
5795 | @@ -621,6 +625,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep, |
5796 | ret = 0; |
5797 | } |
5798 | |
5799 | +usbhsg_ep_enable_end: |
5800 | + usbhs_unlock(priv, flags); |
5801 | + |
5802 | return ret; |
5803 | } |
5804 | |
5805 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
5806 | index d96d423d00e6..8e07536c233a 100644 |
5807 | --- a/drivers/usb/serial/option.c |
5808 | +++ b/drivers/usb/serial/option.c |
5809 | @@ -273,6 +273,7 @@ static void option_instat_callback(struct urb *urb); |
5810 | #define TELIT_PRODUCT_LE922_USBCFG5 0x1045 |
5811 | #define TELIT_PRODUCT_LE920 0x1200 |
5812 | #define TELIT_PRODUCT_LE910 0x1201 |
5813 | +#define TELIT_PRODUCT_LE910_USBCFG4 0x1206 |
5814 | |
5815 | /* ZTE PRODUCTS */ |
5816 | #define ZTE_VENDOR_ID 0x19d2 |
5817 | @@ -1198,6 +1199,8 @@ static const struct usb_device_id option_ids[] = { |
5818 | .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 }, |
5819 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), |
5820 | .driver_info = (kernel_ulong_t)&telit_le910_blacklist }, |
5821 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), |
5822 | + .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 }, |
5823 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), |
5824 | .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, |
5825 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
5826 | diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c |
5827 | index 476c0e3a7150..f6ea8f4ba7cf 100644 |
5828 | --- a/drivers/virtio/virtio_balloon.c |
5829 | +++ b/drivers/virtio/virtio_balloon.c |
5830 | @@ -202,6 +202,8 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num) |
5831 | num = min(num, ARRAY_SIZE(vb->pfns)); |
5832 | |
5833 | mutex_lock(&vb->balloon_lock); |
5834 | + /* We can't release more pages than taken */ |
5835 | + num = min(num, (size_t)vb->num_pages); |
5836 | for (vb->num_pfns = 0; vb->num_pfns < num; |
5837 | vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) { |
5838 | page = balloon_page_dequeue(vb_dev_info); |
5839 | diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c |
5840 | index a2eec97d5064..bb09de633939 100644 |
5841 | --- a/drivers/w1/masters/omap_hdq.c |
5842 | +++ b/drivers/w1/masters/omap_hdq.c |
5843 | @@ -390,8 +390,6 @@ static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) |
5844 | goto out; |
5845 | } |
5846 | |
5847 | - hdq_data->hdq_irqstatus = 0; |
5848 | - |
5849 | if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { |
5850 | hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, |
5851 | OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO, |
5852 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c |
5853 | index 75533adef998..92fe3f8012db 100644 |
5854 | --- a/fs/btrfs/extent_io.c |
5855 | +++ b/fs/btrfs/extent_io.c |
5856 | @@ -2696,12 +2696,6 @@ struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask) |
5857 | btrfs_bio->csum = NULL; |
5858 | btrfs_bio->csum_allocated = NULL; |
5859 | btrfs_bio->end_io = NULL; |
5860 | - |
5861 | -#ifdef CONFIG_BLK_CGROUP |
5862 | - /* FIXME, put this into bio_clone_bioset */ |
5863 | - if (bio->bi_css) |
5864 | - bio_associate_blkcg(new, bio->bi_css); |
5865 | -#endif |
5866 | } |
5867 | return new; |
5868 | } |
5869 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c |
5870 | index 2234e88cf674..b56887b35889 100644 |
5871 | --- a/fs/btrfs/file.c |
5872 | +++ b/fs/btrfs/file.c |
5873 | @@ -1629,13 +1629,11 @@ again: |
5874 | * managed to copy. |
5875 | */ |
5876 | if (num_sectors > dirty_sectors) { |
5877 | - /* |
5878 | - * we round down because we don't want to count |
5879 | - * any partial blocks actually sent through the |
5880 | - * IO machines |
5881 | - */ |
5882 | - release_bytes = round_down(release_bytes - copied, |
5883 | - root->sectorsize); |
5884 | + |
5885 | + /* release everything except the sectors we dirtied */ |
5886 | + release_bytes -= dirty_sectors << |
5887 | + root->fs_info->sb->s_blocksize_bits; |
5888 | + |
5889 | if (copied > 0) { |
5890 | spin_lock(&BTRFS_I(inode)->lock); |
5891 | BTRFS_I(inode)->outstanding_extents++; |
5892 | diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c |
5893 | index 4ae75006e73b..3f7c2cd41f8f 100644 |
5894 | --- a/fs/cachefiles/namei.c |
5895 | +++ b/fs/cachefiles/namei.c |
5896 | @@ -263,6 +263,8 @@ requeue: |
5897 | void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, |
5898 | struct cachefiles_object *object) |
5899 | { |
5900 | + blkcnt_t i_blocks = d_backing_inode(object->dentry)->i_blocks; |
5901 | + |
5902 | write_lock(&cache->active_lock); |
5903 | rb_erase(&object->active_node, &cache->active_nodes); |
5904 | clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags); |
5905 | @@ -273,8 +275,7 @@ void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, |
5906 | /* This object can now be culled, so we need to let the daemon know |
5907 | * that there is something it can remove if it needs to. |
5908 | */ |
5909 | - atomic_long_add(d_backing_inode(object->dentry)->i_blocks, |
5910 | - &cache->b_released); |
5911 | + atomic_long_add(i_blocks, &cache->b_released); |
5912 | if (atomic_inc_return(&cache->f_released)) |
5913 | cachefiles_state_changed(cache); |
5914 | } |
5915 | diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h |
5916 | index 3182273a3407..1418daa03d95 100644 |
5917 | --- a/fs/cifs/cifs_fs_sb.h |
5918 | +++ b/fs/cifs/cifs_fs_sb.h |
5919 | @@ -46,6 +46,9 @@ |
5920 | #define CIFS_MOUNT_CIFS_BACKUPUID 0x200000 /* backup intent bit for a user */ |
5921 | #define CIFS_MOUNT_CIFS_BACKUPGID 0x400000 /* backup intent bit for a group */ |
5922 | #define CIFS_MOUNT_MAP_SFM_CHR 0x800000 /* SFM/MAC mapping for illegal chars */ |
5923 | +#define CIFS_MOUNT_USE_PREFIX_PATH 0x1000000 /* make subpath with unaccessible |
5924 | + * root mountable |
5925 | + */ |
5926 | |
5927 | struct cifs_sb_info { |
5928 | struct rb_root tlink_tree; |
5929 | @@ -67,5 +70,6 @@ struct cifs_sb_info { |
5930 | struct backing_dev_info bdi; |
5931 | struct delayed_work prune_tlinks; |
5932 | struct rcu_head rcu; |
5933 | + char *prepath; |
5934 | }; |
5935 | #endif /* _CIFS_FS_SB_H */ |
5936 | diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c |
5937 | index 6aeb8d4616a4..8347c90cf483 100644 |
5938 | --- a/fs/cifs/cifsencrypt.c |
5939 | +++ b/fs/cifs/cifsencrypt.c |
5940 | @@ -743,24 +743,26 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) |
5941 | |
5942 | memcpy(ses->auth_key.response + baselen, tiblob, tilen); |
5943 | |
5944 | + mutex_lock(&ses->server->srv_mutex); |
5945 | + |
5946 | rc = crypto_hmacmd5_alloc(ses->server); |
5947 | if (rc) { |
5948 | cifs_dbg(VFS, "could not crypto alloc hmacmd5 rc %d\n", rc); |
5949 | - goto setup_ntlmv2_rsp_ret; |
5950 | + goto unlock; |
5951 | } |
5952 | |
5953 | /* calculate ntlmv2_hash */ |
5954 | rc = calc_ntlmv2_hash(ses, ntlmv2_hash, nls_cp); |
5955 | if (rc) { |
5956 | cifs_dbg(VFS, "could not get v2 hash rc %d\n", rc); |
5957 | - goto setup_ntlmv2_rsp_ret; |
5958 | + goto unlock; |
5959 | } |
5960 | |
5961 | /* calculate first part of the client response (CR1) */ |
5962 | rc = CalcNTLMv2_response(ses, ntlmv2_hash); |
5963 | if (rc) { |
5964 | cifs_dbg(VFS, "Could not calculate CR1 rc: %d\n", rc); |
5965 | - goto setup_ntlmv2_rsp_ret; |
5966 | + goto unlock; |
5967 | } |
5968 | |
5969 | /* now calculate the session key for NTLMv2 */ |
5970 | @@ -769,13 +771,13 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) |
5971 | if (rc) { |
5972 | cifs_dbg(VFS, "%s: Could not set NTLMV2 Hash as a key\n", |
5973 | __func__); |
5974 | - goto setup_ntlmv2_rsp_ret; |
5975 | + goto unlock; |
5976 | } |
5977 | |
5978 | rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash); |
5979 | if (rc) { |
5980 | cifs_dbg(VFS, "%s: Could not init hmacmd5\n", __func__); |
5981 | - goto setup_ntlmv2_rsp_ret; |
5982 | + goto unlock; |
5983 | } |
5984 | |
5985 | rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, |
5986 | @@ -783,7 +785,7 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) |
5987 | CIFS_HMAC_MD5_HASH_SIZE); |
5988 | if (rc) { |
5989 | cifs_dbg(VFS, "%s: Could not update with response\n", __func__); |
5990 | - goto setup_ntlmv2_rsp_ret; |
5991 | + goto unlock; |
5992 | } |
5993 | |
5994 | rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash, |
5995 | @@ -791,6 +793,8 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) |
5996 | if (rc) |
5997 | cifs_dbg(VFS, "%s: Could not generate md5 hash\n", __func__); |
5998 | |
5999 | +unlock: |
6000 | + mutex_unlock(&ses->server->srv_mutex); |
6001 | setup_ntlmv2_rsp_ret: |
6002 | kfree(tiblob); |
6003 | |
6004 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c |
6005 | index 5d841f39c4b7..6bbec5e784cd 100644 |
6006 | --- a/fs/cifs/cifsfs.c |
6007 | +++ b/fs/cifs/cifsfs.c |
6008 | @@ -689,6 +689,14 @@ cifs_do_mount(struct file_system_type *fs_type, |
6009 | goto out_cifs_sb; |
6010 | } |
6011 | |
6012 | + if (volume_info->prepath) { |
6013 | + cifs_sb->prepath = kstrdup(volume_info->prepath, GFP_KERNEL); |
6014 | + if (cifs_sb->prepath == NULL) { |
6015 | + root = ERR_PTR(-ENOMEM); |
6016 | + goto out_cifs_sb; |
6017 | + } |
6018 | + } |
6019 | + |
6020 | cifs_setup_cifs_sb(volume_info, cifs_sb); |
6021 | |
6022 | rc = cifs_mount(cifs_sb, volume_info); |
6023 | @@ -727,7 +735,11 @@ cifs_do_mount(struct file_system_type *fs_type, |
6024 | sb->s_flags |= MS_ACTIVE; |
6025 | } |
6026 | |
6027 | - root = cifs_get_root(volume_info, sb); |
6028 | + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) |
6029 | + root = dget(sb->s_root); |
6030 | + else |
6031 | + root = cifs_get_root(volume_info, sb); |
6032 | + |
6033 | if (IS_ERR(root)) |
6034 | goto out_super; |
6035 | |
6036 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
6037 | index 7d2b15c06090..7ae03283bd61 100644 |
6038 | --- a/fs/cifs/connect.c |
6039 | +++ b/fs/cifs/connect.c |
6040 | @@ -1228,6 +1228,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, |
6041 | vol->ops = &smb1_operations; |
6042 | vol->vals = &smb1_values; |
6043 | |
6044 | + vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT; |
6045 | + |
6046 | if (!mountdata) |
6047 | goto cifs_parse_mount_err; |
6048 | |
6049 | @@ -2049,7 +2051,7 @@ static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol) |
6050 | if (!match_security(server, vol)) |
6051 | return 0; |
6052 | |
6053 | - if (server->echo_interval != vol->echo_interval) |
6054 | + if (server->echo_interval != vol->echo_interval * HZ) |
6055 | return 0; |
6056 | |
6057 | return 1; |
6058 | @@ -3483,6 +3485,44 @@ cifs_get_volume_info(char *mount_data, const char *devname) |
6059 | return volume_info; |
6060 | } |
6061 | |
6062 | +static int |
6063 | +cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, |
6064 | + unsigned int xid, |
6065 | + struct cifs_tcon *tcon, |
6066 | + struct cifs_sb_info *cifs_sb, |
6067 | + char *full_path) |
6068 | +{ |
6069 | + int rc; |
6070 | + char *s; |
6071 | + char sep, tmp; |
6072 | + |
6073 | + sep = CIFS_DIR_SEP(cifs_sb); |
6074 | + s = full_path; |
6075 | + |
6076 | + rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, ""); |
6077 | + while (rc == 0) { |
6078 | + /* skip separators */ |
6079 | + while (*s == sep) |
6080 | + s++; |
6081 | + if (!*s) |
6082 | + break; |
6083 | + /* next separator */ |
6084 | + while (*s && *s != sep) |
6085 | + s++; |
6086 | + |
6087 | + /* |
6088 | + * temporarily null-terminate the path at the end of |
6089 | + * the current component |
6090 | + */ |
6091 | + tmp = *s; |
6092 | + *s = 0; |
6093 | + rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, |
6094 | + full_path); |
6095 | + *s = tmp; |
6096 | + } |
6097 | + return rc; |
6098 | +} |
6099 | + |
6100 | int |
6101 | cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) |
6102 | { |
6103 | @@ -3620,6 +3660,16 @@ remote_path_check: |
6104 | kfree(full_path); |
6105 | goto mount_fail_check; |
6106 | } |
6107 | + |
6108 | + rc = cifs_are_all_path_components_accessible(server, |
6109 | + xid, tcon, cifs_sb, |
6110 | + full_path); |
6111 | + if (rc != 0) { |
6112 | + cifs_dbg(VFS, "cannot query dirs between root and final path, " |
6113 | + "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); |
6114 | + cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; |
6115 | + rc = 0; |
6116 | + } |
6117 | kfree(full_path); |
6118 | } |
6119 | |
6120 | @@ -3889,6 +3939,7 @@ cifs_umount(struct cifs_sb_info *cifs_sb) |
6121 | |
6122 | bdi_destroy(&cifs_sb->bdi); |
6123 | kfree(cifs_sb->mountdata); |
6124 | + kfree(cifs_sb->prepath); |
6125 | call_rcu(&cifs_sb->rcu, delayed_free); |
6126 | } |
6127 | |
6128 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c |
6129 | index fb0903fffc22..6f7333d552a3 100644 |
6130 | --- a/fs/cifs/dir.c |
6131 | +++ b/fs/cifs/dir.c |
6132 | @@ -84,6 +84,7 @@ build_path_from_dentry(struct dentry *direntry) |
6133 | struct dentry *temp; |
6134 | int namelen; |
6135 | int dfsplen; |
6136 | + int pplen = 0; |
6137 | char *full_path; |
6138 | char dirsep; |
6139 | struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); |
6140 | @@ -95,8 +96,12 @@ build_path_from_dentry(struct dentry *direntry) |
6141 | dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1); |
6142 | else |
6143 | dfsplen = 0; |
6144 | + |
6145 | + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) |
6146 | + pplen = cifs_sb->prepath ? strlen(cifs_sb->prepath) + 1 : 0; |
6147 | + |
6148 | cifs_bp_rename_retry: |
6149 | - namelen = dfsplen; |
6150 | + namelen = dfsplen + pplen; |
6151 | seq = read_seqbegin(&rename_lock); |
6152 | rcu_read_lock(); |
6153 | for (temp = direntry; !IS_ROOT(temp);) { |
6154 | @@ -137,7 +142,7 @@ cifs_bp_rename_retry: |
6155 | } |
6156 | } |
6157 | rcu_read_unlock(); |
6158 | - if (namelen != dfsplen || read_seqretry(&rename_lock, seq)) { |
6159 | + if (namelen != dfsplen + pplen || read_seqretry(&rename_lock, seq)) { |
6160 | cifs_dbg(FYI, "did not end path lookup where expected. namelen=%ddfsplen=%d\n", |
6161 | namelen, dfsplen); |
6162 | /* presumably this is only possible if racing with a rename |
6163 | @@ -153,6 +158,17 @@ cifs_bp_rename_retry: |
6164 | those safely to '/' if any are found in the middle of the prepath */ |
6165 | /* BB test paths to Windows with '/' in the midst of prepath */ |
6166 | |
6167 | + if (pplen) { |
6168 | + int i; |
6169 | + |
6170 | + cifs_dbg(FYI, "using cifs_sb prepath <%s>\n", cifs_sb->prepath); |
6171 | + memcpy(full_path+dfsplen+1, cifs_sb->prepath, pplen-1); |
6172 | + full_path[dfsplen] = '\\'; |
6173 | + for (i = 0; i < pplen-1; i++) |
6174 | + if (full_path[dfsplen+1+i] == '/') |
6175 | + full_path[dfsplen+1+i] = CIFS_DIR_SEP(cifs_sb); |
6176 | + } |
6177 | + |
6178 | if (dfsplen) { |
6179 | strncpy(full_path, tcon->treeName, dfsplen); |
6180 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) { |
6181 | @@ -229,6 +245,13 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, |
6182 | goto cifs_create_get_file_info; |
6183 | } |
6184 | |
6185 | + if (S_ISDIR(newinode->i_mode)) { |
6186 | + CIFSSMBClose(xid, tcon, fid->netfid); |
6187 | + iput(newinode); |
6188 | + rc = -EISDIR; |
6189 | + goto out; |
6190 | + } |
6191 | + |
6192 | if (!S_ISREG(newinode->i_mode)) { |
6193 | /* |
6194 | * The server may allow us to open things like |
6195 | @@ -399,10 +422,14 @@ cifs_create_set_dentry: |
6196 | if (rc != 0) { |
6197 | cifs_dbg(FYI, "Create worked, get_inode_info failed rc = %d\n", |
6198 | rc); |
6199 | - if (server->ops->close) |
6200 | - server->ops->close(xid, tcon, fid); |
6201 | - goto out; |
6202 | + goto out_err; |
6203 | } |
6204 | + |
6205 | + if (S_ISDIR(newinode->i_mode)) { |
6206 | + rc = -EISDIR; |
6207 | + goto out_err; |
6208 | + } |
6209 | + |
6210 | d_drop(direntry); |
6211 | d_add(direntry, newinode); |
6212 | |
6213 | @@ -410,6 +437,13 @@ out: |
6214 | kfree(buf); |
6215 | kfree(full_path); |
6216 | return rc; |
6217 | + |
6218 | +out_err: |
6219 | + if (server->ops->close) |
6220 | + server->ops->close(xid, tcon, fid); |
6221 | + if (newinode) |
6222 | + iput(newinode); |
6223 | + goto out; |
6224 | } |
6225 | |
6226 | int |
6227 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
6228 | index 514dadb0575d..b87efd0c92d6 100644 |
6229 | --- a/fs/cifs/inode.c |
6230 | +++ b/fs/cifs/inode.c |
6231 | @@ -1002,10 +1002,26 @@ struct inode *cifs_root_iget(struct super_block *sb) |
6232 | struct inode *inode = NULL; |
6233 | long rc; |
6234 | struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); |
6235 | + char *path = NULL; |
6236 | + int len; |
6237 | + |
6238 | + if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) |
6239 | + && cifs_sb->prepath) { |
6240 | + len = strlen(cifs_sb->prepath); |
6241 | + path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL); |
6242 | + if (path == NULL) |
6243 | + return ERR_PTR(-ENOMEM); |
6244 | + path[0] = '/'; |
6245 | + memcpy(path+1, cifs_sb->prepath, len); |
6246 | + } else { |
6247 | + path = kstrdup("", GFP_KERNEL); |
6248 | + if (path == NULL) |
6249 | + return ERR_PTR(-ENOMEM); |
6250 | + } |
6251 | |
6252 | xid = get_xid(); |
6253 | if (tcon->unix_ext) { |
6254 | - rc = cifs_get_inode_info_unix(&inode, "", sb, xid); |
6255 | + rc = cifs_get_inode_info_unix(&inode, path, sb, xid); |
6256 | /* some servers mistakenly claim POSIX support */ |
6257 | if (rc != -EOPNOTSUPP) |
6258 | goto iget_no_retry; |
6259 | @@ -1013,7 +1029,8 @@ struct inode *cifs_root_iget(struct super_block *sb) |
6260 | tcon->unix_ext = false; |
6261 | } |
6262 | |
6263 | - rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL); |
6264 | + convert_delimiter(path, CIFS_DIR_SEP(cifs_sb)); |
6265 | + rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL); |
6266 | |
6267 | iget_no_retry: |
6268 | if (!inode) { |
6269 | @@ -1042,6 +1059,7 @@ iget_no_retry: |
6270 | } |
6271 | |
6272 | out: |
6273 | + kfree(path); |
6274 | /* can not call macro free_xid here since in a void func |
6275 | * TODO: This is no longer true |
6276 | */ |
6277 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
6278 | index 3525ed756173..505e6d6406fd 100644 |
6279 | --- a/fs/cifs/smb2ops.c |
6280 | +++ b/fs/cifs/smb2ops.c |
6281 | @@ -1044,6 +1044,9 @@ smb2_new_lease_key(struct cifs_fid *fid) |
6282 | get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE); |
6283 | } |
6284 | |
6285 | +#define SMB2_SYMLINK_STRUCT_SIZE \ |
6286 | + (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp)) |
6287 | + |
6288 | static int |
6289 | smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, |
6290 | const char *full_path, char **target_path, |
6291 | @@ -1056,7 +1059,10 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, |
6292 | struct cifs_fid fid; |
6293 | struct smb2_err_rsp *err_buf = NULL; |
6294 | struct smb2_symlink_err_rsp *symlink; |
6295 | - unsigned int sub_len, sub_offset; |
6296 | + unsigned int sub_len; |
6297 | + unsigned int sub_offset; |
6298 | + unsigned int print_len; |
6299 | + unsigned int print_offset; |
6300 | |
6301 | cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path); |
6302 | |
6303 | @@ -1077,11 +1083,33 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, |
6304 | kfree(utf16_path); |
6305 | return -ENOENT; |
6306 | } |
6307 | + |
6308 | + if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) || |
6309 | + get_rfc1002_length(err_buf) + 4 < SMB2_SYMLINK_STRUCT_SIZE) { |
6310 | + kfree(utf16_path); |
6311 | + return -ENOENT; |
6312 | + } |
6313 | + |
6314 | /* open must fail on symlink - reset rc */ |
6315 | rc = 0; |
6316 | symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData; |
6317 | sub_len = le16_to_cpu(symlink->SubstituteNameLength); |
6318 | sub_offset = le16_to_cpu(symlink->SubstituteNameOffset); |
6319 | + print_len = le16_to_cpu(symlink->PrintNameLength); |
6320 | + print_offset = le16_to_cpu(symlink->PrintNameOffset); |
6321 | + |
6322 | + if (get_rfc1002_length(err_buf) + 4 < |
6323 | + SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) { |
6324 | + kfree(utf16_path); |
6325 | + return -ENOENT; |
6326 | + } |
6327 | + |
6328 | + if (get_rfc1002_length(err_buf) + 4 < |
6329 | + SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) { |
6330 | + kfree(utf16_path); |
6331 | + return -ENOENT; |
6332 | + } |
6333 | + |
6334 | *target_path = cifs_strndup_from_utf16( |
6335 | (char *)symlink->PathBuffer + sub_offset, |
6336 | sub_len, true, cifs_sb->local_nls); |
6337 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c |
6338 | index 70078096117d..78313adb3c95 100644 |
6339 | --- a/fs/jbd2/commit.c |
6340 | +++ b/fs/jbd2/commit.c |
6341 | @@ -124,7 +124,7 @@ static int journal_submit_commit_record(journal_t *journal, |
6342 | struct commit_header *tmp; |
6343 | struct buffer_head *bh; |
6344 | int ret; |
6345 | - struct timespec now = current_kernel_time(); |
6346 | + struct timespec64 now = current_kernel_time64(); |
6347 | |
6348 | *cbh = NULL; |
6349 | |
6350 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
6351 | index ff416d0e24bc..7796beacdefb 100644 |
6352 | --- a/fs/nfs/nfs4proc.c |
6353 | +++ b/fs/nfs/nfs4proc.c |
6354 | @@ -427,6 +427,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server, |
6355 | case -NFS4ERR_DELAY: |
6356 | nfs_inc_server_stats(server, NFSIOS_DELAY); |
6357 | case -NFS4ERR_GRACE: |
6358 | + case -NFS4ERR_LAYOUTTRYLATER: |
6359 | case -NFS4ERR_RECALLCONFLICT: |
6360 | exception->delay = 1; |
6361 | return 0; |
6362 | @@ -7869,11 +7870,13 @@ nfs4_layoutget_handle_exception(struct rpc_task *task, |
6363 | struct inode *inode = lgp->args.inode; |
6364 | struct nfs_server *server = NFS_SERVER(inode); |
6365 | struct pnfs_layout_hdr *lo; |
6366 | - int status = task->tk_status; |
6367 | + int nfs4err = task->tk_status; |
6368 | + int err, status = 0; |
6369 | + LIST_HEAD(head); |
6370 | |
6371 | dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status); |
6372 | |
6373 | - switch (status) { |
6374 | + switch (nfs4err) { |
6375 | case 0: |
6376 | goto out; |
6377 | |
6378 | @@ -7905,45 +7908,43 @@ nfs4_layoutget_handle_exception(struct rpc_task *task, |
6379 | status = -EOVERFLOW; |
6380 | goto out; |
6381 | } |
6382 | - /* Fallthrough */ |
6383 | + status = -EBUSY; |
6384 | + break; |
6385 | case -NFS4ERR_RECALLCONFLICT: |
6386 | - nfs4_handle_exception(server, -NFS4ERR_RECALLCONFLICT, |
6387 | - exception); |
6388 | status = -ERECALLCONFLICT; |
6389 | - goto out; |
6390 | + break; |
6391 | case -NFS4ERR_EXPIRED: |
6392 | case -NFS4ERR_BAD_STATEID: |
6393 | exception->timeout = 0; |
6394 | spin_lock(&inode->i_lock); |
6395 | - if (nfs4_stateid_match(&lgp->args.stateid, |
6396 | + lo = NFS_I(inode)->layout; |
6397 | + /* If the open stateid was bad, then recover it. */ |
6398 | + if (!lo || test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) || |
6399 | + nfs4_stateid_match_other(&lgp->args.stateid, |
6400 | &lgp->args.ctx->state->stateid)) { |
6401 | spin_unlock(&inode->i_lock); |
6402 | - /* If the open stateid was bad, then recover it. */ |
6403 | exception->state = lgp->args.ctx->state; |
6404 | break; |
6405 | } |
6406 | - lo = NFS_I(inode)->layout; |
6407 | - if (lo && !test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) && |
6408 | - nfs4_stateid_match_other(&lgp->args.stateid, &lo->plh_stateid)) { |
6409 | - LIST_HEAD(head); |
6410 | - |
6411 | - /* |
6412 | - * Mark the bad layout state as invalid, then retry |
6413 | - * with the current stateid. |
6414 | - */ |
6415 | - set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags); |
6416 | - pnfs_mark_matching_lsegs_invalid(lo, &head, NULL, 0); |
6417 | - spin_unlock(&inode->i_lock); |
6418 | - pnfs_free_lseg_list(&head); |
6419 | - status = -EAGAIN; |
6420 | - goto out; |
6421 | - } else |
6422 | - spin_unlock(&inode->i_lock); |
6423 | - } |
6424 | |
6425 | - status = nfs4_handle_exception(server, status, exception); |
6426 | - if (exception->retry) |
6427 | + /* |
6428 | + * Mark the bad layout state as invalid, then retry |
6429 | + */ |
6430 | + set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags); |
6431 | + pnfs_mark_matching_lsegs_invalid(lo, &head, NULL, 0); |
6432 | + spin_unlock(&inode->i_lock); |
6433 | + pnfs_free_lseg_list(&head); |
6434 | status = -EAGAIN; |
6435 | + goto out; |
6436 | + } |
6437 | + |
6438 | + err = nfs4_handle_exception(server, nfs4err, exception); |
6439 | + if (!status) { |
6440 | + if (exception->retry) |
6441 | + status = -EAGAIN; |
6442 | + else |
6443 | + status = err; |
6444 | + } |
6445 | out: |
6446 | dprintk("<-- %s\n", __func__); |
6447 | return status; |
6448 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
6449 | index 0fbe734cc38c..7d992362ff04 100644 |
6450 | --- a/fs/nfs/pnfs.c |
6451 | +++ b/fs/nfs/pnfs.c |
6452 | @@ -1505,7 +1505,7 @@ pnfs_update_layout(struct inode *ino, |
6453 | struct pnfs_layout_segment *lseg = NULL; |
6454 | nfs4_stateid stateid; |
6455 | long timeout = 0; |
6456 | - unsigned long giveup = jiffies + rpc_get_timeout(server->client); |
6457 | + unsigned long giveup = jiffies + (clp->cl_lease_time << 1); |
6458 | bool first; |
6459 | |
6460 | if (!pnfs_enabled_sb(NFS_SERVER(ino))) { |
6461 | @@ -1645,33 +1645,44 @@ lookup_again: |
6462 | lseg = send_layoutget(lo, ctx, &stateid, &arg, &timeout, gfp_flags); |
6463 | trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg, |
6464 | PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); |
6465 | + atomic_dec(&lo->plh_outstanding); |
6466 | if (IS_ERR(lseg)) { |
6467 | switch(PTR_ERR(lseg)) { |
6468 | - case -ERECALLCONFLICT: |
6469 | + case -EBUSY: |
6470 | if (time_after(jiffies, giveup)) |
6471 | lseg = NULL; |
6472 | - /* Fallthrough */ |
6473 | - case -EAGAIN: |
6474 | - pnfs_put_layout_hdr(lo); |
6475 | - if (first) |
6476 | - pnfs_clear_first_layoutget(lo); |
6477 | - if (lseg) { |
6478 | - trace_pnfs_update_layout(ino, pos, count, |
6479 | - iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY); |
6480 | - goto lookup_again; |
6481 | + break; |
6482 | + case -ERECALLCONFLICT: |
6483 | + /* Huh? We hold no layouts, how is there a recall? */ |
6484 | + if (first) { |
6485 | + lseg = NULL; |
6486 | + break; |
6487 | } |
6488 | + /* Destroy the existing layout and start over */ |
6489 | + if (time_after(jiffies, giveup)) |
6490 | + pnfs_destroy_layout(NFS_I(ino)); |
6491 | /* Fallthrough */ |
6492 | + case -EAGAIN: |
6493 | + break; |
6494 | default: |
6495 | if (!nfs_error_is_fatal(PTR_ERR(lseg))) { |
6496 | pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); |
6497 | lseg = NULL; |
6498 | } |
6499 | + goto out_put_layout_hdr; |
6500 | + } |
6501 | + if (lseg) { |
6502 | + if (first) |
6503 | + pnfs_clear_first_layoutget(lo); |
6504 | + trace_pnfs_update_layout(ino, pos, count, |
6505 | + iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY); |
6506 | + pnfs_put_layout_hdr(lo); |
6507 | + goto lookup_again; |
6508 | } |
6509 | } else { |
6510 | pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); |
6511 | } |
6512 | |
6513 | - atomic_dec(&lo->plh_outstanding); |
6514 | out_put_layout_hdr: |
6515 | if (first) |
6516 | pnfs_clear_first_layoutget(lo); |
6517 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
6518 | index e1c74d3db64d..649fa5e26050 100644 |
6519 | --- a/fs/nfs/write.c |
6520 | +++ b/fs/nfs/write.c |
6521 | @@ -1289,6 +1289,9 @@ int nfs_updatepage(struct file *file, struct page *page, |
6522 | dprintk("NFS: nfs_updatepage(%pD2 %d@%lld)\n", |
6523 | file, count, (long long)(page_file_offset(page) + offset)); |
6524 | |
6525 | + if (!count) |
6526 | + goto out; |
6527 | + |
6528 | if (nfs_can_extend_write(file, page, inode)) { |
6529 | count = max(count + offset, nfs_page_length(page)); |
6530 | offset = 0; |
6531 | @@ -1299,7 +1302,7 @@ int nfs_updatepage(struct file *file, struct page *page, |
6532 | nfs_set_pageerror(page); |
6533 | else |
6534 | __set_page_dirty_nobuffers(page); |
6535 | - |
6536 | +out: |
6537 | dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", |
6538 | status, (long long)i_size_read(inode)); |
6539 | return status; |
6540 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
6541 | index 70d0b9b33031..806eda192d1c 100644 |
6542 | --- a/fs/nfsd/nfs4state.c |
6543 | +++ b/fs/nfsd/nfs4state.c |
6544 | @@ -4906,6 +4906,32 @@ nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
6545 | return nfs_ok; |
6546 | } |
6547 | |
6548 | +static __be32 |
6549 | +nfsd4_free_lock_stateid(stateid_t *stateid, struct nfs4_stid *s) |
6550 | +{ |
6551 | + struct nfs4_ol_stateid *stp = openlockstateid(s); |
6552 | + __be32 ret; |
6553 | + |
6554 | + mutex_lock(&stp->st_mutex); |
6555 | + |
6556 | + ret = check_stateid_generation(stateid, &s->sc_stateid, 1); |
6557 | + if (ret) |
6558 | + goto out; |
6559 | + |
6560 | + ret = nfserr_locks_held; |
6561 | + if (check_for_locks(stp->st_stid.sc_file, |
6562 | + lockowner(stp->st_stateowner))) |
6563 | + goto out; |
6564 | + |
6565 | + release_lock_stateid(stp); |
6566 | + ret = nfs_ok; |
6567 | + |
6568 | +out: |
6569 | + mutex_unlock(&stp->st_mutex); |
6570 | + nfs4_put_stid(s); |
6571 | + return ret; |
6572 | +} |
6573 | + |
6574 | __be32 |
6575 | nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
6576 | struct nfsd4_free_stateid *free_stateid) |
6577 | @@ -4913,7 +4939,6 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
6578 | stateid_t *stateid = &free_stateid->fr_stateid; |
6579 | struct nfs4_stid *s; |
6580 | struct nfs4_delegation *dp; |
6581 | - struct nfs4_ol_stateid *stp; |
6582 | struct nfs4_client *cl = cstate->session->se_client; |
6583 | __be32 ret = nfserr_bad_stateid; |
6584 | |
6585 | @@ -4932,18 +4957,9 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
6586 | ret = nfserr_locks_held; |
6587 | break; |
6588 | case NFS4_LOCK_STID: |
6589 | - ret = check_stateid_generation(stateid, &s->sc_stateid, 1); |
6590 | - if (ret) |
6591 | - break; |
6592 | - stp = openlockstateid(s); |
6593 | - ret = nfserr_locks_held; |
6594 | - if (check_for_locks(stp->st_stid.sc_file, |
6595 | - lockowner(stp->st_stateowner))) |
6596 | - break; |
6597 | - WARN_ON(!unhash_lock_stateid(stp)); |
6598 | + atomic_inc(&s->sc_count); |
6599 | spin_unlock(&cl->cl_lock); |
6600 | - nfs4_put_stid(s); |
6601 | - ret = nfs_ok; |
6602 | + ret = nfsd4_free_lock_stateid(stateid, s); |
6603 | goto out; |
6604 | case NFS4_REVOKED_DELEG_STID: |
6605 | dp = delegstateid(s); |
6606 | @@ -5510,7 +5526,7 @@ static __be32 |
6607 | lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, |
6608 | struct nfs4_ol_stateid *ost, |
6609 | struct nfsd4_lock *lock, |
6610 | - struct nfs4_ol_stateid **lst, bool *new) |
6611 | + struct nfs4_ol_stateid **plst, bool *new) |
6612 | { |
6613 | __be32 status; |
6614 | struct nfs4_file *fi = ost->st_stid.sc_file; |
6615 | @@ -5518,7 +5534,9 @@ lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, |
6616 | struct nfs4_client *cl = oo->oo_owner.so_client; |
6617 | struct inode *inode = d_inode(cstate->current_fh.fh_dentry); |
6618 | struct nfs4_lockowner *lo; |
6619 | + struct nfs4_ol_stateid *lst; |
6620 | unsigned int strhashval; |
6621 | + bool hashed; |
6622 | |
6623 | lo = find_lockowner_str(cl, &lock->lk_new_owner); |
6624 | if (!lo) { |
6625 | @@ -5534,12 +5552,27 @@ lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, |
6626 | goto out; |
6627 | } |
6628 | |
6629 | - *lst = find_or_create_lock_stateid(lo, fi, inode, ost, new); |
6630 | - if (*lst == NULL) { |
6631 | +retry: |
6632 | + lst = find_or_create_lock_stateid(lo, fi, inode, ost, new); |
6633 | + if (lst == NULL) { |
6634 | status = nfserr_jukebox; |
6635 | goto out; |
6636 | } |
6637 | + |
6638 | + mutex_lock(&lst->st_mutex); |
6639 | + |
6640 | + /* See if it's still hashed to avoid race with FREE_STATEID */ |
6641 | + spin_lock(&cl->cl_lock); |
6642 | + hashed = !list_empty(&lst->st_perfile); |
6643 | + spin_unlock(&cl->cl_lock); |
6644 | + |
6645 | + if (!hashed) { |
6646 | + mutex_unlock(&lst->st_mutex); |
6647 | + nfs4_put_stid(&lst->st_stid); |
6648 | + goto retry; |
6649 | + } |
6650 | status = nfs_ok; |
6651 | + *plst = lst; |
6652 | out: |
6653 | nfs4_put_stateowner(&lo->lo_owner); |
6654 | return status; |
6655 | @@ -5606,8 +5639,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
6656 | goto out; |
6657 | status = lookup_or_create_lock_state(cstate, open_stp, lock, |
6658 | &lock_stp, &new); |
6659 | - if (status == nfs_ok) |
6660 | - mutex_lock(&lock_stp->st_mutex); |
6661 | } else { |
6662 | status = nfs4_preprocess_seqid_op(cstate, |
6663 | lock->lk_old_lock_seqid, |
6664 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c |
6665 | index 9a7693d5f8ff..6db75cbb668f 100644 |
6666 | --- a/fs/overlayfs/super.c |
6667 | +++ b/fs/overlayfs/super.c |
6668 | @@ -404,7 +404,8 @@ static struct ovl_entry *ovl_alloc_entry(unsigned int numlower) |
6669 | static bool ovl_dentry_remote(struct dentry *dentry) |
6670 | { |
6671 | return dentry->d_flags & |
6672 | - (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE); |
6673 | + (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE | |
6674 | + DCACHE_OP_REAL); |
6675 | } |
6676 | |
6677 | static bool ovl_dentry_weird(struct dentry *dentry) |
6678 | diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c |
6679 | index 4c463b99fe57..a36a5a418f7d 100644 |
6680 | --- a/fs/xfs/xfs_aops.c |
6681 | +++ b/fs/xfs/xfs_aops.c |
6682 | @@ -87,6 +87,12 @@ xfs_find_bdev_for_inode( |
6683 | * We're now finished for good with this page. Update the page state via the |
6684 | * associated buffer_heads, paying attention to the start and end offsets that |
6685 | * we need to process on the page. |
6686 | + * |
6687 | + * Landmine Warning: bh->b_end_io() will call end_page_writeback() on the last |
6688 | + * buffer in the IO. Once it does this, it is unsafe to access the bufferhead or |
6689 | + * the page at all, as we may be racing with memory reclaim and it can free both |
6690 | + * the bufferhead chain and the page as it will see the page as clean and |
6691 | + * unused. |
6692 | */ |
6693 | static void |
6694 | xfs_finish_page_writeback( |
6695 | @@ -95,8 +101,9 @@ xfs_finish_page_writeback( |
6696 | int error) |
6697 | { |
6698 | unsigned int end = bvec->bv_offset + bvec->bv_len - 1; |
6699 | - struct buffer_head *head, *bh; |
6700 | + struct buffer_head *head, *bh, *next; |
6701 | unsigned int off = 0; |
6702 | + unsigned int bsize; |
6703 | |
6704 | ASSERT(bvec->bv_offset < PAGE_SIZE); |
6705 | ASSERT((bvec->bv_offset & ((1 << inode->i_blkbits) - 1)) == 0); |
6706 | @@ -105,15 +112,17 @@ xfs_finish_page_writeback( |
6707 | |
6708 | bh = head = page_buffers(bvec->bv_page); |
6709 | |
6710 | + bsize = bh->b_size; |
6711 | do { |
6712 | + next = bh->b_this_page; |
6713 | if (off < bvec->bv_offset) |
6714 | goto next_bh; |
6715 | if (off > end) |
6716 | break; |
6717 | bh->b_end_io(bh, !error); |
6718 | next_bh: |
6719 | - off += bh->b_size; |
6720 | - } while ((bh = bh->b_this_page) != head); |
6721 | + off += bsize; |
6722 | + } while ((bh = next) != head); |
6723 | } |
6724 | |
6725 | /* |
6726 | diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h |
6727 | index 3f103076d0bf..c357f27d5483 100644 |
6728 | --- a/include/linux/backing-dev-defs.h |
6729 | +++ b/include/linux/backing-dev-defs.h |
6730 | @@ -163,6 +163,7 @@ struct backing_dev_info { |
6731 | wait_queue_head_t wb_waitq; |
6732 | |
6733 | struct device *dev; |
6734 | + struct device *owner; |
6735 | |
6736 | struct timer_list laptop_mode_wb_timer; |
6737 | |
6738 | diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h |
6739 | index c82794f20110..89d3de3e096b 100644 |
6740 | --- a/include/linux/backing-dev.h |
6741 | +++ b/include/linux/backing-dev.h |
6742 | @@ -24,6 +24,7 @@ __printf(3, 4) |
6743 | int bdi_register(struct backing_dev_info *bdi, struct device *parent, |
6744 | const char *fmt, ...); |
6745 | int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); |
6746 | +int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner); |
6747 | void bdi_unregister(struct backing_dev_info *bdi); |
6748 | |
6749 | int __must_check bdi_setup_and_register(struct backing_dev_info *, char *); |
6750 | diff --git a/include/linux/bio.h b/include/linux/bio.h |
6751 | index 9faebf7f9a33..75fadd28eec8 100644 |
6752 | --- a/include/linux/bio.h |
6753 | +++ b/include/linux/bio.h |
6754 | @@ -527,11 +527,14 @@ extern unsigned int bvec_nr_vecs(unsigned short idx); |
6755 | int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css); |
6756 | int bio_associate_current(struct bio *bio); |
6757 | void bio_disassociate_task(struct bio *bio); |
6758 | +void bio_clone_blkcg_association(struct bio *dst, struct bio *src); |
6759 | #else /* CONFIG_BLK_CGROUP */ |
6760 | static inline int bio_associate_blkcg(struct bio *bio, |
6761 | struct cgroup_subsys_state *blkcg_css) { return 0; } |
6762 | static inline int bio_associate_current(struct bio *bio) { return -ENOENT; } |
6763 | static inline void bio_disassociate_task(struct bio *bio) { } |
6764 | +static inline void bio_clone_blkcg_association(struct bio *dst, |
6765 | + struct bio *src) { } |
6766 | #endif /* CONFIG_BLK_CGROUP */ |
6767 | |
6768 | #ifdef CONFIG_HIGHMEM |
6769 | diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h |
6770 | index ab310819ac36..7879bf411891 100644 |
6771 | --- a/include/linux/mlx5/qp.h |
6772 | +++ b/include/linux/mlx5/qp.h |
6773 | @@ -556,9 +556,9 @@ struct mlx5_destroy_qp_mbox_out { |
6774 | struct mlx5_modify_qp_mbox_in { |
6775 | struct mlx5_inbox_hdr hdr; |
6776 | __be32 qpn; |
6777 | - u8 rsvd1[4]; |
6778 | - __be32 optparam; |
6779 | u8 rsvd0[4]; |
6780 | + __be32 optparam; |
6781 | + u8 rsvd1[4]; |
6782 | struct mlx5_qp_context ctx; |
6783 | u8 rsvd2[16]; |
6784 | }; |
6785 | diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h |
6786 | index 7e440d41487a..e694f02d42e3 100644 |
6787 | --- a/include/rdma/ib_verbs.h |
6788 | +++ b/include/rdma/ib_verbs.h |
6789 | @@ -1428,6 +1428,10 @@ struct ib_srq { |
6790 | } ext; |
6791 | }; |
6792 | |
6793 | +/* |
6794 | + * @max_write_sge: Maximum SGE elements per RDMA WRITE request. |
6795 | + * @max_read_sge: Maximum SGE elements per RDMA READ request. |
6796 | + */ |
6797 | struct ib_qp { |
6798 | struct ib_device *device; |
6799 | struct ib_pd *pd; |
6800 | @@ -1449,6 +1453,8 @@ struct ib_qp { |
6801 | void (*event_handler)(struct ib_event *, void *); |
6802 | void *qp_context; |
6803 | u32 qp_num; |
6804 | + u32 max_write_sge; |
6805 | + u32 max_read_sge; |
6806 | enum ib_qp_type qp_type; |
6807 | }; |
6808 | |
6809 | diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h |
6810 | index d8ab5101fad5..f6f3bc52c1ac 100644 |
6811 | --- a/include/target/target_core_backend.h |
6812 | +++ b/include/target/target_core_backend.h |
6813 | @@ -95,6 +95,6 @@ sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd, |
6814 | bool target_sense_desc_format(struct se_device *dev); |
6815 | sector_t target_to_linux_sector(struct se_device *dev, sector_t lb); |
6816 | bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib, |
6817 | - struct request_queue *q, int block_size); |
6818 | + struct request_queue *q); |
6819 | |
6820 | #endif /* TARGET_CORE_BACKEND_H */ |
6821 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h |
6822 | index b316b44d03f3..fb8e3b6febdf 100644 |
6823 | --- a/include/target/target_core_base.h |
6824 | +++ b/include/target/target_core_base.h |
6825 | @@ -142,6 +142,7 @@ enum se_cmd_flags_table { |
6826 | SCF_PASSTHROUGH_PROT_SG_TO_MEM_NOALLOC = 0x00200000, |
6827 | SCF_ACK_KREF = 0x00400000, |
6828 | SCF_USE_CPUID = 0x00800000, |
6829 | + SCF_TASK_ATTR_SET = 0x01000000, |
6830 | }; |
6831 | |
6832 | /* |
6833 | diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h |
6834 | index de44462a7680..5cd6faa6e0d1 100644 |
6835 | --- a/include/target/target_core_fabric.h |
6836 | +++ b/include/target/target_core_fabric.h |
6837 | @@ -163,7 +163,6 @@ int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t); |
6838 | void core_tmr_release_req(struct se_tmr_req *); |
6839 | int transport_generic_handle_tmr(struct se_cmd *); |
6840 | void transport_generic_request_failure(struct se_cmd *, sense_reason_t); |
6841 | -void __target_execute_cmd(struct se_cmd *); |
6842 | int transport_lookup_tmr_lun(struct se_cmd *, u64); |
6843 | void core_allocate_nexus_loss_ua(struct se_node_acl *acl); |
6844 | |
6845 | diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h |
6846 | index 003dca933803..5664ca07c9c7 100644 |
6847 | --- a/include/trace/events/sunrpc.h |
6848 | +++ b/include/trace/events/sunrpc.h |
6849 | @@ -529,20 +529,27 @@ TRACE_EVENT(svc_xprt_do_enqueue, |
6850 | |
6851 | TP_STRUCT__entry( |
6852 | __field(struct svc_xprt *, xprt) |
6853 | - __field_struct(struct sockaddr_storage, ss) |
6854 | __field(int, pid) |
6855 | __field(unsigned long, flags) |
6856 | + __dynamic_array(unsigned char, addr, xprt != NULL ? |
6857 | + xprt->xpt_remotelen : 0) |
6858 | ), |
6859 | |
6860 | TP_fast_assign( |
6861 | __entry->xprt = xprt; |
6862 | - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); |
6863 | __entry->pid = rqst? rqst->rq_task->pid : 0; |
6864 | - __entry->flags = xprt ? xprt->xpt_flags : 0; |
6865 | + if (xprt) { |
6866 | + memcpy(__get_dynamic_array(addr), |
6867 | + &xprt->xpt_remote, |
6868 | + xprt->xpt_remotelen); |
6869 | + __entry->flags = xprt->xpt_flags; |
6870 | + } else |
6871 | + __entry->flags = 0; |
6872 | ), |
6873 | |
6874 | TP_printk("xprt=0x%p addr=%pIScp pid=%d flags=%s", __entry->xprt, |
6875 | - (struct sockaddr *)&__entry->ss, |
6876 | + __get_dynamic_array_len(addr) != 0 ? |
6877 | + (struct sockaddr *)__get_dynamic_array(addr) : NULL, |
6878 | __entry->pid, show_svc_xprt_flags(__entry->flags)) |
6879 | ); |
6880 | |
6881 | @@ -553,18 +560,25 @@ TRACE_EVENT(svc_xprt_dequeue, |
6882 | |
6883 | TP_STRUCT__entry( |
6884 | __field(struct svc_xprt *, xprt) |
6885 | - __field_struct(struct sockaddr_storage, ss) |
6886 | __field(unsigned long, flags) |
6887 | + __dynamic_array(unsigned char, addr, xprt != NULL ? |
6888 | + xprt->xpt_remotelen : 0) |
6889 | ), |
6890 | |
6891 | TP_fast_assign( |
6892 | - __entry->xprt = xprt, |
6893 | - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); |
6894 | - __entry->flags = xprt ? xprt->xpt_flags : 0; |
6895 | + __entry->xprt = xprt; |
6896 | + if (xprt) { |
6897 | + memcpy(__get_dynamic_array(addr), |
6898 | + &xprt->xpt_remote, |
6899 | + xprt->xpt_remotelen); |
6900 | + __entry->flags = xprt->xpt_flags; |
6901 | + } else |
6902 | + __entry->flags = 0; |
6903 | ), |
6904 | |
6905 | TP_printk("xprt=0x%p addr=%pIScp flags=%s", __entry->xprt, |
6906 | - (struct sockaddr *)&__entry->ss, |
6907 | + __get_dynamic_array_len(addr) != 0 ? |
6908 | + (struct sockaddr *)__get_dynamic_array(addr) : NULL, |
6909 | show_svc_xprt_flags(__entry->flags)) |
6910 | ); |
6911 | |
6912 | @@ -592,19 +606,26 @@ TRACE_EVENT(svc_handle_xprt, |
6913 | TP_STRUCT__entry( |
6914 | __field(struct svc_xprt *, xprt) |
6915 | __field(int, len) |
6916 | - __field_struct(struct sockaddr_storage, ss) |
6917 | __field(unsigned long, flags) |
6918 | + __dynamic_array(unsigned char, addr, xprt != NULL ? |
6919 | + xprt->xpt_remotelen : 0) |
6920 | ), |
6921 | |
6922 | TP_fast_assign( |
6923 | __entry->xprt = xprt; |
6924 | - xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); |
6925 | __entry->len = len; |
6926 | - __entry->flags = xprt ? xprt->xpt_flags : 0; |
6927 | + if (xprt) { |
6928 | + memcpy(__get_dynamic_array(addr), |
6929 | + &xprt->xpt_remote, |
6930 | + xprt->xpt_remotelen); |
6931 | + __entry->flags = xprt->xpt_flags; |
6932 | + } else |
6933 | + __entry->flags = 0; |
6934 | ), |
6935 | |
6936 | TP_printk("xprt=0x%p addr=%pIScp len=%d flags=%s", __entry->xprt, |
6937 | - (struct sockaddr *)&__entry->ss, |
6938 | + __get_dynamic_array_len(addr) != 0 ? |
6939 | + (struct sockaddr *)__get_dynamic_array(addr) : NULL, |
6940 | __entry->len, show_svc_xprt_flags(__entry->flags)) |
6941 | ); |
6942 | #endif /* _TRACE_SUNRPC_H */ |
6943 | diff --git a/kernel/auditsc.c b/kernel/auditsc.c |
6944 | index 2672d105cffc..b3341284f1c6 100644 |
6945 | --- a/kernel/auditsc.c |
6946 | +++ b/kernel/auditsc.c |
6947 | @@ -72,6 +72,7 @@ |
6948 | #include <linux/compat.h> |
6949 | #include <linux/ctype.h> |
6950 | #include <linux/string.h> |
6951 | +#include <linux/uaccess.h> |
6952 | #include <uapi/linux/limits.h> |
6953 | |
6954 | #include "audit.h" |
6955 | @@ -81,7 +82,8 @@ |
6956 | #define AUDITSC_SUCCESS 1 |
6957 | #define AUDITSC_FAILURE 2 |
6958 | |
6959 | -/* no execve audit message should be longer than this (userspace limits) */ |
6960 | +/* no execve audit message should be longer than this (userspace limits), |
6961 | + * see the note near the top of audit_log_execve_info() about this value */ |
6962 | #define MAX_EXECVE_AUDIT_LEN 7500 |
6963 | |
6964 | /* max length to print of cmdline/proctitle value during audit */ |
6965 | @@ -987,184 +989,178 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, |
6966 | return rc; |
6967 | } |
6968 | |
6969 | -/* |
6970 | - * to_send and len_sent accounting are very loose estimates. We aren't |
6971 | - * really worried about a hard cap to MAX_EXECVE_AUDIT_LEN so much as being |
6972 | - * within about 500 bytes (next page boundary) |
6973 | - * |
6974 | - * why snprintf? an int is up to 12 digits long. if we just assumed when |
6975 | - * logging that a[%d]= was going to be 16 characters long we would be wasting |
6976 | - * space in every audit message. In one 7500 byte message we can log up to |
6977 | - * about 1000 min size arguments. That comes down to about 50% waste of space |
6978 | - * if we didn't do the snprintf to find out how long arg_num_len was. |
6979 | - */ |
6980 | -static int audit_log_single_execve_arg(struct audit_context *context, |
6981 | - struct audit_buffer **ab, |
6982 | - int arg_num, |
6983 | - size_t *len_sent, |
6984 | - const char __user *p, |
6985 | - char *buf) |
6986 | +static void audit_log_execve_info(struct audit_context *context, |
6987 | + struct audit_buffer **ab) |
6988 | { |
6989 | - char arg_num_len_buf[12]; |
6990 | - const char __user *tmp_p = p; |
6991 | - /* how many digits are in arg_num? 5 is the length of ' a=""' */ |
6992 | - size_t arg_num_len = snprintf(arg_num_len_buf, 12, "%d", arg_num) + 5; |
6993 | - size_t len, len_left, to_send; |
6994 | - size_t max_execve_audit_len = MAX_EXECVE_AUDIT_LEN; |
6995 | - unsigned int i, has_cntl = 0, too_long = 0; |
6996 | - int ret; |
6997 | - |
6998 | - /* strnlen_user includes the null we don't want to send */ |
6999 | - len_left = len = strnlen_user(p, MAX_ARG_STRLEN) - 1; |
7000 | - |
7001 | - /* |
7002 | - * We just created this mm, if we can't find the strings |
7003 | - * we just copied into it something is _very_ wrong. Similar |
7004 | - * for strings that are too long, we should not have created |
7005 | - * any. |
7006 | - */ |
7007 | - if (WARN_ON_ONCE(len < 0 || len > MAX_ARG_STRLEN - 1)) { |
7008 | - send_sig(SIGKILL, current, 0); |
7009 | - return -1; |
7010 | + long len_max; |
7011 | + long len_rem; |
7012 | + long len_full; |
7013 | + long len_buf; |
7014 | + long len_abuf; |
7015 | + long len_tmp; |
7016 | + bool require_data; |
7017 | + bool encode; |
7018 | + unsigned int iter; |
7019 | + unsigned int arg; |
7020 | + char *buf_head; |
7021 | + char *buf; |
7022 | + const char __user *p = (const char __user *)current->mm->arg_start; |
7023 | + |
7024 | + /* NOTE: this buffer needs to be large enough to hold all the non-arg |
7025 | + * data we put in the audit record for this argument (see the |
7026 | + * code below) ... at this point in time 96 is plenty */ |
7027 | + char abuf[96]; |
7028 | + |
7029 | + /* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the |
7030 | + * current value of 7500 is not as important as the fact that it |
7031 | + * is less than 8k, a setting of 7500 gives us plenty of wiggle |
7032 | + * room if we go over a little bit in the logging below */ |
7033 | + WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500); |
7034 | + len_max = MAX_EXECVE_AUDIT_LEN; |
7035 | + |
7036 | + /* scratch buffer to hold the userspace args */ |
7037 | + buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); |
7038 | + if (!buf_head) { |
7039 | + audit_panic("out of memory for argv string"); |
7040 | + return; |
7041 | } |
7042 | + buf = buf_head; |
7043 | |
7044 | - /* walk the whole argument looking for non-ascii chars */ |
7045 | + audit_log_format(*ab, "argc=%d", context->execve.argc); |
7046 | + |
7047 | + len_rem = len_max; |
7048 | + len_buf = 0; |
7049 | + len_full = 0; |
7050 | + require_data = true; |
7051 | + encode = false; |
7052 | + iter = 0; |
7053 | + arg = 0; |
7054 | do { |
7055 | - if (len_left > MAX_EXECVE_AUDIT_LEN) |
7056 | - to_send = MAX_EXECVE_AUDIT_LEN; |
7057 | - else |
7058 | - to_send = len_left; |
7059 | - ret = copy_from_user(buf, tmp_p, to_send); |
7060 | - /* |
7061 | - * There is no reason for this copy to be short. We just |
7062 | - * copied them here, and the mm hasn't been exposed to user- |
7063 | - * space yet. |
7064 | - */ |
7065 | - if (ret) { |
7066 | - WARN_ON(1); |
7067 | - send_sig(SIGKILL, current, 0); |
7068 | - return -1; |
7069 | - } |
7070 | - buf[to_send] = '\0'; |
7071 | - has_cntl = audit_string_contains_control(buf, to_send); |
7072 | - if (has_cntl) { |
7073 | - /* |
7074 | - * hex messages get logged as 2 bytes, so we can only |
7075 | - * send half as much in each message |
7076 | - */ |
7077 | - max_execve_audit_len = MAX_EXECVE_AUDIT_LEN / 2; |
7078 | - break; |
7079 | - } |
7080 | - len_left -= to_send; |
7081 | - tmp_p += to_send; |
7082 | - } while (len_left > 0); |
7083 | - |
7084 | - len_left = len; |
7085 | - |
7086 | - if (len > max_execve_audit_len) |
7087 | - too_long = 1; |
7088 | - |
7089 | - /* rewalk the argument actually logging the message */ |
7090 | - for (i = 0; len_left > 0; i++) { |
7091 | - int room_left; |
7092 | - |
7093 | - if (len_left > max_execve_audit_len) |
7094 | - to_send = max_execve_audit_len; |
7095 | - else |
7096 | - to_send = len_left; |
7097 | - |
7098 | - /* do we have space left to send this argument in this ab? */ |
7099 | - room_left = MAX_EXECVE_AUDIT_LEN - arg_num_len - *len_sent; |
7100 | - if (has_cntl) |
7101 | - room_left -= (to_send * 2); |
7102 | - else |
7103 | - room_left -= to_send; |
7104 | - if (room_left < 0) { |
7105 | - *len_sent = 0; |
7106 | - audit_log_end(*ab); |
7107 | - *ab = audit_log_start(context, GFP_KERNEL, AUDIT_EXECVE); |
7108 | - if (!*ab) |
7109 | - return 0; |
7110 | - } |
7111 | + /* NOTE: we don't ever want to trust this value for anything |
7112 | + * serious, but the audit record format insists we |
7113 | + * provide an argument length for really long arguments, |
7114 | + * e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but |
7115 | + * to use strncpy_from_user() to obtain this value for |
7116 | + * recording in the log, although we don't use it |
7117 | + * anywhere here to avoid a double-fetch problem */ |
7118 | + if (len_full == 0) |
7119 | + len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1; |
7120 | + |
7121 | + /* read more data from userspace */ |
7122 | + if (require_data) { |
7123 | + /* can we make more room in the buffer? */ |
7124 | + if (buf != buf_head) { |
7125 | + memmove(buf_head, buf, len_buf); |
7126 | + buf = buf_head; |
7127 | + } |
7128 | + |
7129 | + /* fetch as much as we can of the argument */ |
7130 | + len_tmp = strncpy_from_user(&buf_head[len_buf], p, |
7131 | + len_max - len_buf); |
7132 | + if (len_tmp == -EFAULT) { |
7133 | + /* unable to copy from userspace */ |
7134 | + send_sig(SIGKILL, current, 0); |
7135 | + goto out; |
7136 | + } else if (len_tmp == (len_max - len_buf)) { |
7137 | + /* buffer is not large enough */ |
7138 | + require_data = true; |
7139 | + /* NOTE: if we are going to span multiple |
7140 | + * buffers force the encoding so we stand |
7141 | + * a chance at a sane len_full value and |
7142 | + * consistent record encoding */ |
7143 | + encode = true; |
7144 | + len_full = len_full * 2; |
7145 | + p += len_tmp; |
7146 | + } else { |
7147 | + require_data = false; |
7148 | + if (!encode) |
7149 | + encode = audit_string_contains_control( |
7150 | + buf, len_tmp); |
7151 | + /* try to use a trusted value for len_full */ |
7152 | + if (len_full < len_max) |
7153 | + len_full = (encode ? |
7154 | + len_tmp * 2 : len_tmp); |
7155 | + p += len_tmp + 1; |
7156 | + } |
7157 | + len_buf += len_tmp; |
7158 | + buf_head[len_buf] = '\0'; |
7159 | |
7160 | - /* |
7161 | - * first record needs to say how long the original string was |
7162 | - * so we can be sure nothing was lost. |
7163 | - */ |
7164 | - if ((i == 0) && (too_long)) |
7165 | - audit_log_format(*ab, " a%d_len=%zu", arg_num, |
7166 | - has_cntl ? 2*len : len); |
7167 | - |
7168 | - /* |
7169 | - * normally arguments are small enough to fit and we already |
7170 | - * filled buf above when we checked for control characters |
7171 | - * so don't bother with another copy_from_user |
7172 | - */ |
7173 | - if (len >= max_execve_audit_len) |
7174 | - ret = copy_from_user(buf, p, to_send); |
7175 | - else |
7176 | - ret = 0; |
7177 | - if (ret) { |
7178 | - WARN_ON(1); |
7179 | - send_sig(SIGKILL, current, 0); |
7180 | - return -1; |
7181 | + /* length of the buffer in the audit record? */ |
7182 | + len_abuf = (encode ? len_buf * 2 : len_buf + 2); |
7183 | } |
7184 | - buf[to_send] = '\0'; |
7185 | - |
7186 | - /* actually log it */ |
7187 | - audit_log_format(*ab, " a%d", arg_num); |
7188 | - if (too_long) |
7189 | - audit_log_format(*ab, "[%d]", i); |
7190 | - audit_log_format(*ab, "="); |
7191 | - if (has_cntl) |
7192 | - audit_log_n_hex(*ab, buf, to_send); |
7193 | - else |
7194 | - audit_log_string(*ab, buf); |
7195 | - |
7196 | - p += to_send; |
7197 | - len_left -= to_send; |
7198 | - *len_sent += arg_num_len; |
7199 | - if (has_cntl) |
7200 | - *len_sent += to_send * 2; |
7201 | - else |
7202 | - *len_sent += to_send; |
7203 | - } |
7204 | - /* include the null we didn't log */ |
7205 | - return len + 1; |
7206 | -} |
7207 | |
7208 | -static void audit_log_execve_info(struct audit_context *context, |
7209 | - struct audit_buffer **ab) |
7210 | -{ |
7211 | - int i, len; |
7212 | - size_t len_sent = 0; |
7213 | - const char __user *p; |
7214 | - char *buf; |
7215 | + /* write as much as we can to the audit log */ |
7216 | + if (len_buf > 0) { |
7217 | + /* NOTE: some magic numbers here - basically if we |
7218 | + * can't fit a reasonable amount of data into the |
7219 | + * existing audit buffer, flush it and start with |
7220 | + * a new buffer */ |
7221 | + if ((sizeof(abuf) + 8) > len_rem) { |
7222 | + len_rem = len_max; |
7223 | + audit_log_end(*ab); |
7224 | + *ab = audit_log_start(context, |
7225 | + GFP_KERNEL, AUDIT_EXECVE); |
7226 | + if (!*ab) |
7227 | + goto out; |
7228 | + } |
7229 | |
7230 | - p = (const char __user *)current->mm->arg_start; |
7231 | + /* create the non-arg portion of the arg record */ |
7232 | + len_tmp = 0; |
7233 | + if (require_data || (iter > 0) || |
7234 | + ((len_abuf + sizeof(abuf)) > len_rem)) { |
7235 | + if (iter == 0) { |
7236 | + len_tmp += snprintf(&abuf[len_tmp], |
7237 | + sizeof(abuf) - len_tmp, |
7238 | + " a%d_len=%lu", |
7239 | + arg, len_full); |
7240 | + } |
7241 | + len_tmp += snprintf(&abuf[len_tmp], |
7242 | + sizeof(abuf) - len_tmp, |
7243 | + " a%d[%d]=", arg, iter++); |
7244 | + } else |
7245 | + len_tmp += snprintf(&abuf[len_tmp], |
7246 | + sizeof(abuf) - len_tmp, |
7247 | + " a%d=", arg); |
7248 | + WARN_ON(len_tmp >= sizeof(abuf)); |
7249 | + abuf[sizeof(abuf) - 1] = '\0'; |
7250 | + |
7251 | + /* log the arg in the audit record */ |
7252 | + audit_log_format(*ab, "%s", abuf); |
7253 | + len_rem -= len_tmp; |
7254 | + len_tmp = len_buf; |
7255 | + if (encode) { |
7256 | + if (len_abuf > len_rem) |
7257 | + len_tmp = len_rem / 2; /* encoding */ |
7258 | + audit_log_n_hex(*ab, buf, len_tmp); |
7259 | + len_rem -= len_tmp * 2; |
7260 | + len_abuf -= len_tmp * 2; |
7261 | + } else { |
7262 | + if (len_abuf > len_rem) |
7263 | + len_tmp = len_rem - 2; /* quotes */ |
7264 | + audit_log_n_string(*ab, buf, len_tmp); |
7265 | + len_rem -= len_tmp + 2; |
7266 | + /* don't subtract the "2" because we still need |
7267 | + * to add quotes to the remaining string */ |
7268 | + len_abuf -= len_tmp; |
7269 | + } |
7270 | + len_buf -= len_tmp; |
7271 | + buf += len_tmp; |
7272 | + } |
7273 | |
7274 | - audit_log_format(*ab, "argc=%d", context->execve.argc); |
7275 | + /* ready to move to the next argument? */ |
7276 | + if ((len_buf == 0) && !require_data) { |
7277 | + arg++; |
7278 | + iter = 0; |
7279 | + len_full = 0; |
7280 | + require_data = true; |
7281 | + encode = false; |
7282 | + } |
7283 | + } while (arg < context->execve.argc); |
7284 | |
7285 | - /* |
7286 | - * we need some kernel buffer to hold the userspace args. Just |
7287 | - * allocate one big one rather than allocating one of the right size |
7288 | - * for every single argument inside audit_log_single_execve_arg() |
7289 | - * should be <8k allocation so should be pretty safe. |
7290 | - */ |
7291 | - buf = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); |
7292 | - if (!buf) { |
7293 | - audit_panic("out of memory for argv string"); |
7294 | - return; |
7295 | - } |
7296 | + /* NOTE: the caller handles the final audit_log_end() call */ |
7297 | |
7298 | - for (i = 0; i < context->execve.argc; i++) { |
7299 | - len = audit_log_single_execve_arg(context, ab, i, |
7300 | - &len_sent, p, buf); |
7301 | - if (len <= 0) |
7302 | - break; |
7303 | - p += len; |
7304 | - } |
7305 | - kfree(buf); |
7306 | +out: |
7307 | + kfree(buf_head); |
7308 | } |
7309 | |
7310 | static void show_special(struct audit_context *context, int *call_panic) |
7311 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
7312 | index 75c0ff00aca6..e0be49fc382f 100644 |
7313 | --- a/kernel/cgroup.c |
7314 | +++ b/kernel/cgroup.c |
7315 | @@ -2215,12 +2215,8 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, |
7316 | goto out_unlock; |
7317 | } |
7318 | |
7319 | - /* |
7320 | - * We know this subsystem has not yet been bound. Users in a non-init |
7321 | - * user namespace may only mount hierarchies with no bound subsystems, |
7322 | - * i.e. 'none,name=user1' |
7323 | - */ |
7324 | - if (!opts.none && !capable(CAP_SYS_ADMIN)) { |
7325 | + /* Hierarchies may only be created in the initial cgroup namespace. */ |
7326 | + if (ns != &init_cgroup_ns) { |
7327 | ret = -EPERM; |
7328 | goto out_unlock; |
7329 | } |
7330 | @@ -2962,6 +2958,7 @@ int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) |
7331 | int retval = 0; |
7332 | |
7333 | mutex_lock(&cgroup_mutex); |
7334 | + percpu_down_write(&cgroup_threadgroup_rwsem); |
7335 | for_each_root(root) { |
7336 | struct cgroup *from_cgrp; |
7337 | |
7338 | @@ -2976,6 +2973,7 @@ int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) |
7339 | if (retval) |
7340 | break; |
7341 | } |
7342 | + percpu_up_write(&cgroup_threadgroup_rwsem); |
7343 | mutex_unlock(&cgroup_mutex); |
7344 | |
7345 | return retval; |
7346 | @@ -4343,6 +4341,8 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) |
7347 | |
7348 | mutex_lock(&cgroup_mutex); |
7349 | |
7350 | + percpu_down_write(&cgroup_threadgroup_rwsem); |
7351 | + |
7352 | /* all tasks in @from are being moved, all csets are source */ |
7353 | spin_lock_irq(&css_set_lock); |
7354 | list_for_each_entry(link, &from->cset_links, cset_link) |
7355 | @@ -4371,6 +4371,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) |
7356 | } while (task && !ret); |
7357 | out_err: |
7358 | cgroup_migrate_finish(&preloaded_csets); |
7359 | + percpu_up_write(&cgroup_threadgroup_rwsem); |
7360 | mutex_unlock(&cgroup_mutex); |
7361 | return ret; |
7362 | } |
7363 | @@ -6309,14 +6310,11 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, |
7364 | if (!ns_capable(user_ns, CAP_SYS_ADMIN)) |
7365 | return ERR_PTR(-EPERM); |
7366 | |
7367 | - mutex_lock(&cgroup_mutex); |
7368 | + /* It is not safe to take cgroup_mutex here */ |
7369 | spin_lock_irq(&css_set_lock); |
7370 | - |
7371 | cset = task_css_set(current); |
7372 | get_css_set(cset); |
7373 | - |
7374 | spin_unlock_irq(&css_set_lock); |
7375 | - mutex_unlock(&cgroup_mutex); |
7376 | |
7377 | new_ns = alloc_cgroup_ns(); |
7378 | if (IS_ERR(new_ns)) { |
7379 | diff --git a/kernel/module.c b/kernel/module.c |
7380 | index 5f71aa63ed2a..6458a2f17d58 100644 |
7381 | --- a/kernel/module.c |
7382 | +++ b/kernel/module.c |
7383 | @@ -2687,13 +2687,18 @@ static inline void kmemleak_load_module(const struct module *mod, |
7384 | #endif |
7385 | |
7386 | #ifdef CONFIG_MODULE_SIG |
7387 | -static int module_sig_check(struct load_info *info) |
7388 | +static int module_sig_check(struct load_info *info, int flags) |
7389 | { |
7390 | int err = -ENOKEY; |
7391 | const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1; |
7392 | const void *mod = info->hdr; |
7393 | |
7394 | - if (info->len > markerlen && |
7395 | + /* |
7396 | + * Require flags == 0, as a module with version information |
7397 | + * removed is no longer the module that was signed |
7398 | + */ |
7399 | + if (flags == 0 && |
7400 | + info->len > markerlen && |
7401 | memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) { |
7402 | /* We truncate the module to discard the signature */ |
7403 | info->len -= markerlen; |
7404 | @@ -2712,7 +2717,7 @@ static int module_sig_check(struct load_info *info) |
7405 | return err; |
7406 | } |
7407 | #else /* !CONFIG_MODULE_SIG */ |
7408 | -static int module_sig_check(struct load_info *info) |
7409 | +static int module_sig_check(struct load_info *info, int flags) |
7410 | { |
7411 | return 0; |
7412 | } |
7413 | @@ -3498,7 +3503,7 @@ static int load_module(struct load_info *info, const char __user *uargs, |
7414 | long err; |
7415 | char *after_dashes; |
7416 | |
7417 | - err = module_sig_check(info); |
7418 | + err = module_sig_check(info, flags); |
7419 | if (err) |
7420 | goto free_copy; |
7421 | |
7422 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c |
7423 | index ed173b8ae8f2..9269911d10dd 100644 |
7424 | --- a/mm/backing-dev.c |
7425 | +++ b/mm/backing-dev.c |
7426 | @@ -825,6 +825,20 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev) |
7427 | } |
7428 | EXPORT_SYMBOL(bdi_register_dev); |
7429 | |
7430 | +int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner) |
7431 | +{ |
7432 | + int rc; |
7433 | + |
7434 | + rc = bdi_register(bdi, NULL, "%u:%u", MAJOR(owner->devt), |
7435 | + MINOR(owner->devt)); |
7436 | + if (rc) |
7437 | + return rc; |
7438 | + bdi->owner = owner; |
7439 | + get_device(owner); |
7440 | + return 0; |
7441 | +} |
7442 | +EXPORT_SYMBOL(bdi_register_owner); |
7443 | + |
7444 | /* |
7445 | * Remove bdi from bdi_list, and ensure that it is no longer visible |
7446 | */ |
7447 | @@ -849,6 +863,11 @@ void bdi_unregister(struct backing_dev_info *bdi) |
7448 | device_unregister(bdi->dev); |
7449 | bdi->dev = NULL; |
7450 | } |
7451 | + |
7452 | + if (bdi->owner) { |
7453 | + put_device(bdi->owner); |
7454 | + bdi->owner = NULL; |
7455 | + } |
7456 | } |
7457 | |
7458 | void bdi_exit(struct backing_dev_info *bdi) |
7459 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
7460 | index addfe4accc07..d9ec1a5b37ff 100644 |
7461 | --- a/mm/hugetlb.c |
7462 | +++ b/mm/hugetlb.c |
7463 | @@ -2214,6 +2214,10 @@ static unsigned long set_max_huge_pages(struct hstate *h, unsigned long count, |
7464 | * and reducing the surplus. |
7465 | */ |
7466 | spin_unlock(&hugetlb_lock); |
7467 | + |
7468 | + /* yield cpu to avoid soft lockup */ |
7469 | + cond_resched(); |
7470 | + |
7471 | if (hstate_is_gigantic(h)) |
7472 | ret = alloc_fresh_gigantic_page(h, nodes_allowed); |
7473 | else |
7474 | diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c |
7475 | index 388ee8b59145..1842141baedb 100644 |
7476 | --- a/net/bluetooth/l2cap_sock.c |
7477 | +++ b/net/bluetooth/l2cap_sock.c |
7478 | @@ -927,7 +927,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, |
7479 | break; |
7480 | } |
7481 | |
7482 | - if (get_user(opt, (u32 __user *) optval)) { |
7483 | + if (get_user(opt, (u16 __user *) optval)) { |
7484 | err = -EFAULT; |
7485 | break; |
7486 | } |
7487 | diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c |
7488 | index 1325776daa27..bd007a9fd921 100644 |
7489 | --- a/net/netlabel/netlabel_kapi.c |
7490 | +++ b/net/netlabel/netlabel_kapi.c |
7491 | @@ -824,7 +824,11 @@ socket_setattr_return: |
7492 | */ |
7493 | void netlbl_sock_delattr(struct sock *sk) |
7494 | { |
7495 | - cipso_v4_sock_delattr(sk); |
7496 | + switch (sk->sk_family) { |
7497 | + case AF_INET: |
7498 | + cipso_v4_sock_delattr(sk); |
7499 | + break; |
7500 | + } |
7501 | } |
7502 | |
7503 | /** |
7504 | @@ -987,7 +991,11 @@ req_setattr_return: |
7505 | */ |
7506 | void netlbl_req_delattr(struct request_sock *req) |
7507 | { |
7508 | - cipso_v4_req_delattr(req); |
7509 | + switch (req->rsk_ops->family) { |
7510 | + case AF_INET: |
7511 | + cipso_v4_req_delattr(req); |
7512 | + break; |
7513 | + } |
7514 | } |
7515 | |
7516 | /** |
7517 | diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c |
7518 | index e167592793a7..42396a74405d 100644 |
7519 | --- a/scripts/recordmcount.c |
7520 | +++ b/scripts/recordmcount.c |
7521 | @@ -33,10 +33,17 @@ |
7522 | #include <string.h> |
7523 | #include <unistd.h> |
7524 | |
7525 | +/* |
7526 | + * glibc synced up and added the metag number but didn't add the relocations. |
7527 | + * Work around this in a crude manner for now. |
7528 | + */ |
7529 | #ifndef EM_METAG |
7530 | -/* Remove this when these make it to the standard system elf.h. */ |
7531 | #define EM_METAG 174 |
7532 | +#endif |
7533 | +#ifndef R_METAG_ADDR32 |
7534 | #define R_METAG_ADDR32 2 |
7535 | +#endif |
7536 | +#ifndef R_METAG_NONE |
7537 | #define R_METAG_NONE 3 |
7538 | #endif |
7539 | |
7540 | diff --git a/sound/hda/array.c b/sound/hda/array.c |
7541 | index 516795baa7db..5dfa610e4471 100644 |
7542 | --- a/sound/hda/array.c |
7543 | +++ b/sound/hda/array.c |
7544 | @@ -21,13 +21,15 @@ void *snd_array_new(struct snd_array *array) |
7545 | return NULL; |
7546 | if (array->used >= array->alloced) { |
7547 | int num = array->alloced + array->alloc_align; |
7548 | + int oldsize = array->alloced * array->elem_size; |
7549 | int size = (num + 1) * array->elem_size; |
7550 | void *nlist; |
7551 | if (snd_BUG_ON(num >= 4096)) |
7552 | return NULL; |
7553 | - nlist = krealloc(array->list, size, GFP_KERNEL | __GFP_ZERO); |
7554 | + nlist = krealloc(array->list, size, GFP_KERNEL); |
7555 | if (!nlist) |
7556 | return NULL; |
7557 | + memset(nlist + oldsize, 0, size - oldsize); |
7558 | array->list = nlist; |
7559 | array->alloced = num; |
7560 | } |
7561 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
7562 | index 6f8ea13323c1..89dacf9b4e6c 100644 |
7563 | --- a/sound/pci/hda/hda_intel.c |
7564 | +++ b/sound/pci/hda/hda_intel.c |
7565 | @@ -2265,6 +2265,8 @@ static const struct pci_device_id azx_ids[] = { |
7566 | { PCI_DEVICE(0x1022, 0x780d), |
7567 | .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, |
7568 | /* ATI HDMI */ |
7569 | + { PCI_DEVICE(0x1002, 0x0002), |
7570 | + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
7571 | { PCI_DEVICE(0x1002, 0x1308), |
7572 | .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
7573 | { PCI_DEVICE(0x1002, 0x157a), |
7574 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
7575 | index abcb5a6a1cd9..f25479ba3981 100644 |
7576 | --- a/sound/pci/hda/patch_realtek.c |
7577 | +++ b/sound/pci/hda/patch_realtek.c |
7578 | @@ -4674,6 +4674,22 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec, |
7579 | } |
7580 | } |
7581 | |
7582 | +static void alc298_fixup_speaker_volume(struct hda_codec *codec, |
7583 | + const struct hda_fixup *fix, int action) |
7584 | +{ |
7585 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { |
7586 | + /* The speaker is routed to the Node 0x06 by a mistake, as a result |
7587 | + we can't adjust the speaker's volume since this node does not has |
7588 | + Amp-out capability. we change the speaker's route to: |
7589 | + Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 ( |
7590 | + Pin Complex), since Node 0x02 has Amp-out caps, we can adjust |
7591 | + speaker's volume now. */ |
7592 | + |
7593 | + hda_nid_t conn1[1] = { 0x0c }; |
7594 | + snd_hda_override_conn_list(codec, 0x17, 1, conn1); |
7595 | + } |
7596 | +} |
7597 | + |
7598 | /* Hook to update amp GPIO4 for automute */ |
7599 | static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, |
7600 | struct hda_jack_callback *jack) |
7601 | @@ -4823,6 +4839,7 @@ enum { |
7602 | ALC280_FIXUP_HP_HEADSET_MIC, |
7603 | ALC221_FIXUP_HP_FRONT_MIC, |
7604 | ALC292_FIXUP_TPT460, |
7605 | + ALC298_FIXUP_SPK_VOLUME, |
7606 | }; |
7607 | |
7608 | static const struct hda_fixup alc269_fixups[] = { |
7609 | @@ -5478,6 +5495,12 @@ static const struct hda_fixup alc269_fixups[] = { |
7610 | .chained = true, |
7611 | .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE, |
7612 | }, |
7613 | + [ALC298_FIXUP_SPK_VOLUME] = { |
7614 | + .type = HDA_FIXUP_FUNC, |
7615 | + .v.func = alc298_fixup_speaker_volume, |
7616 | + .chained = true, |
7617 | + .chain_id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, |
7618 | + }, |
7619 | }; |
7620 | |
7621 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
7622 | @@ -5524,6 +5547,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
7623 | SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
7624 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), |
7625 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
7626 | + SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), |
7627 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
7628 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
7629 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
7630 | @@ -5799,6 +5823,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
7631 | {0x1b, 0x01014020}, |
7632 | {0x21, 0x0221103f}), |
7633 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
7634 | + {0x14, 0x90170130}, |
7635 | + {0x1b, 0x02011020}, |
7636 | + {0x21, 0x0221103f}), |
7637 | + SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
7638 | {0x14, 0x90170150}, |
7639 | {0x1b, 0x02011020}, |
7640 | {0x21, 0x0221105f}), |
7641 | diff --git a/tools/objtool/.gitignore b/tools/objtool/.gitignore |
7642 | index a0b3128bb31f..d3102c865a95 100644 |
7643 | --- a/tools/objtool/.gitignore |
7644 | +++ b/tools/objtool/.gitignore |
7645 | @@ -1,2 +1,3 @@ |
7646 | arch/x86/insn/inat-tables.c |
7647 | objtool |
7648 | +fixdep |
7649 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
7650 | index 48bd520fc702..dd25346ec356 100644 |
7651 | --- a/virt/kvm/kvm_main.c |
7652 | +++ b/virt/kvm/kvm_main.c |
7653 | @@ -148,6 +148,7 @@ int vcpu_load(struct kvm_vcpu *vcpu) |
7654 | put_cpu(); |
7655 | return 0; |
7656 | } |
7657 | +EXPORT_SYMBOL_GPL(vcpu_load); |
7658 | |
7659 | void vcpu_put(struct kvm_vcpu *vcpu) |
7660 | { |
7661 | @@ -157,6 +158,7 @@ void vcpu_put(struct kvm_vcpu *vcpu) |
7662 | preempt_enable(); |
7663 | mutex_unlock(&vcpu->mutex); |
7664 | } |
7665 | +EXPORT_SYMBOL_GPL(vcpu_put); |
7666 | |
7667 | static void ack_flush(void *_completed) |
7668 | { |