Contents of /trunk/kernel-alx/patches-3.12/0115-3.12.16-all-fixes.patch
Parent Directory | Revision Log
Revision 2430 -
(show annotations)
(download)
Tue May 13 11:02:41 2014 UTC (10 years, 4 months ago) by niro
File size: 72316 byte(s)
Tue May 13 11:02:41 2014 UTC (10 years, 4 months ago) by niro
File size: 72316 byte(s)
-linux-3.12.16
1 | diff --git a/Makefile b/Makefile |
2 | index 517391a3093e..4aab3be88e9b 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 12 |
8 | -SUBLEVEL = 15 |
9 | +SUBLEVEL = 16 |
10 | EXTRAVERSION = |
11 | NAME = One Giant Leap for Frogkind |
12 | |
13 | diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h |
14 | index 5689c18c85f5..ceb4807ee8b2 100644 |
15 | --- a/arch/arm/include/asm/pgtable-3level.h |
16 | +++ b/arch/arm/include/asm/pgtable-3level.h |
17 | @@ -120,11 +120,14 @@ |
18 | /* |
19 | * 2nd stage PTE definitions for LPAE. |
20 | */ |
21 | -#define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x5) << 2) /* MemAttr[3:0] */ |
22 | -#define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ |
23 | -#define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ |
24 | -#define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
25 | -#define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
26 | +#define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x0) << 2) /* strongly ordered */ |
27 | +#define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* normal inner write-through */ |
28 | +#define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* normal inner write-back */ |
29 | +#define L_PTE_S2_MT_DEV_SHARED (_AT(pteval_t, 0x1) << 2) /* device */ |
30 | +#define L_PTE_S2_MT_MASK (_AT(pteval_t, 0xf) << 2) |
31 | + |
32 | +#define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
33 | +#define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
34 | |
35 | /* |
36 | * Hyp-mode PL2 PTE definitions for LPAE. |
37 | diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c |
38 | index 0e1e2b3afa45..2a767d262c17 100644 |
39 | --- a/arch/arm/kernel/setup.c |
40 | +++ b/arch/arm/kernel/setup.c |
41 | @@ -622,6 +622,7 @@ void __init dump_machine_table(void) |
42 | int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
43 | { |
44 | struct membank *bank = &meminfo.bank[meminfo.nr_banks]; |
45 | + u64 aligned_start; |
46 | |
47 | if (meminfo.nr_banks >= NR_BANKS) { |
48 | printk(KERN_CRIT "NR_BANKS too low, " |
49 | @@ -634,10 +635,16 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
50 | * Size is appropriately rounded down, start is rounded up. |
51 | */ |
52 | size -= start & ~PAGE_MASK; |
53 | - bank->start = PAGE_ALIGN(start); |
54 | + aligned_start = PAGE_ALIGN(start); |
55 | |
56 | -#ifndef CONFIG_ARM_LPAE |
57 | - if (bank->start + size < bank->start) { |
58 | +#ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT |
59 | + if (aligned_start > ULONG_MAX) { |
60 | + printk(KERN_CRIT "Ignoring memory at 0x%08llx outside " |
61 | + "32-bit physical address space\n", (long long)start); |
62 | + return -EINVAL; |
63 | + } |
64 | + |
65 | + if (aligned_start + size > ULONG_MAX) { |
66 | printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " |
67 | "32-bit physical address space\n", (long long)start); |
68 | /* |
69 | @@ -645,10 +652,25 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
70 | * 32 bits, we use ULONG_MAX as the upper limit rather than 4GB. |
71 | * This means we lose a page after masking. |
72 | */ |
73 | - size = ULONG_MAX - bank->start; |
74 | + size = ULONG_MAX - aligned_start; |
75 | } |
76 | #endif |
77 | |
78 | + if (aligned_start < PHYS_OFFSET) { |
79 | + if (aligned_start + size <= PHYS_OFFSET) { |
80 | + pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n", |
81 | + aligned_start, aligned_start + size); |
82 | + return -EINVAL; |
83 | + } |
84 | + |
85 | + pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n", |
86 | + aligned_start, (u64)PHYS_OFFSET); |
87 | + |
88 | + size -= PHYS_OFFSET - aligned_start; |
89 | + aligned_start = PHYS_OFFSET; |
90 | + } |
91 | + |
92 | + bank->start = aligned_start; |
93 | bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1); |
94 | |
95 | /* |
96 | diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c |
97 | index 94a119a35af8..3c405f43ca39 100644 |
98 | --- a/arch/arm/mach-tegra/common.c |
99 | +++ b/arch/arm/mach-tegra/common.c |
100 | @@ -22,6 +22,7 @@ |
101 | #include <linux/io.h> |
102 | #include <linux/clk.h> |
103 | #include <linux/delay.h> |
104 | +#include <linux/of.h> |
105 | #include <linux/reboot.h> |
106 | #include <linux/irqchip.h> |
107 | #include <linux/clk-provider.h> |
108 | @@ -82,10 +83,20 @@ void tegra_assert_system_reset(enum reboot_mode mode, const char *cmd) |
109 | static void __init tegra_init_cache(void) |
110 | { |
111 | #ifdef CONFIG_CACHE_L2X0 |
112 | + static const struct of_device_id pl310_ids[] __initconst = { |
113 | + { .compatible = "arm,pl310-cache", }, |
114 | + {} |
115 | + }; |
116 | + |
117 | + struct device_node *np; |
118 | int ret; |
119 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; |
120 | u32 aux_ctrl, cache_type; |
121 | |
122 | + np = of_find_matching_node(NULL, pl310_ids); |
123 | + if (!np) |
124 | + return; |
125 | + |
126 | cache_type = readl(p + L2X0_CACHE_TYPE); |
127 | aux_ctrl = (cache_type & 0x700) << (17-8); |
128 | aux_ctrl |= 0x7C400001; |
129 | diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h |
130 | index d5a4e9ad8f0f..33eab618b3f1 100644 |
131 | --- a/arch/arm/mm/mm.h |
132 | +++ b/arch/arm/mm/mm.h |
133 | @@ -38,6 +38,7 @@ static inline pmd_t *pmd_off_k(unsigned long virt) |
134 | |
135 | struct mem_type { |
136 | pteval_t prot_pte; |
137 | + pteval_t prot_pte_s2; |
138 | pmdval_t prot_l1; |
139 | pmdval_t prot_sect; |
140 | unsigned int domain; |
141 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
142 | index b1d17eeb59b8..0222ba7603af 100644 |
143 | --- a/arch/arm/mm/mmu.c |
144 | +++ b/arch/arm/mm/mmu.c |
145 | @@ -229,12 +229,16 @@ __setup("noalign", noalign_setup); |
146 | #endif /* ifdef CONFIG_CPU_CP15 / else */ |
147 | |
148 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN |
149 | +#define PROT_PTE_S2_DEVICE PROT_PTE_DEVICE |
150 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE |
151 | |
152 | static struct mem_type mem_types[] = { |
153 | [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ |
154 | .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | |
155 | L_PTE_SHARED, |
156 | + .prot_pte_s2 = s2_policy(PROT_PTE_S2_DEVICE) | |
157 | + s2_policy(L_PTE_S2_MT_DEV_SHARED) | |
158 | + L_PTE_SHARED, |
159 | .prot_l1 = PMD_TYPE_TABLE, |
160 | .prot_sect = PROT_SECT_DEVICE | PMD_SECT_S, |
161 | .domain = DOMAIN_IO, |
162 | @@ -456,7 +460,8 @@ static void __init build_mem_type_table(void) |
163 | cp = &cache_policies[cachepolicy]; |
164 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; |
165 | s2_pgprot = cp->pte_s2; |
166 | - hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte; |
167 | + hyp_device_pgprot = mem_types[MT_DEVICE].prot_pte; |
168 | + s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2; |
169 | |
170 | /* |
171 | * ARMv6 and above have extended page tables. |
172 | diff --git a/arch/arm64/boot/dts/foundation-v8.dts b/arch/arm64/boot/dts/foundation-v8.dts |
173 | index 84fcc5018284..519c4b2c0687 100644 |
174 | --- a/arch/arm64/boot/dts/foundation-v8.dts |
175 | +++ b/arch/arm64/boot/dts/foundation-v8.dts |
176 | @@ -6,6 +6,8 @@ |
177 | |
178 | /dts-v1/; |
179 | |
180 | +/memreserve/ 0x80000000 0x00010000; |
181 | + |
182 | / { |
183 | model = "Foundation-v8A"; |
184 | compatible = "arm,foundation-aarch64", "arm,vexpress"; |
185 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
186 | index 965c28ff7b3b..82d95a7e9466 100644 |
187 | --- a/arch/arm64/include/asm/pgtable.h |
188 | +++ b/arch/arm64/include/asm/pgtable.h |
189 | @@ -255,7 +255,7 @@ static inline int has_transparent_hugepage(void) |
190 | #define pgprot_noncached(prot) \ |
191 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) |
192 | #define pgprot_writecombine(prot) \ |
193 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_GRE)) |
194 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
195 | #define pgprot_dmacoherent(prot) \ |
196 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
197 | #define __HAVE_PHYS_MEM_ACCESS_PROT |
198 | diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h |
199 | index 89c047f9a971..70ba9d4ee978 100644 |
200 | --- a/arch/arm64/include/asm/syscall.h |
201 | +++ b/arch/arm64/include/asm/syscall.h |
202 | @@ -59,6 +59,9 @@ static inline void syscall_get_arguments(struct task_struct *task, |
203 | unsigned int i, unsigned int n, |
204 | unsigned long *args) |
205 | { |
206 | + if (n == 0) |
207 | + return; |
208 | + |
209 | if (i + n > SYSCALL_MAX_ARGS) { |
210 | unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i; |
211 | unsigned int n_bad = n + i - SYSCALL_MAX_ARGS; |
212 | @@ -82,6 +85,9 @@ static inline void syscall_set_arguments(struct task_struct *task, |
213 | unsigned int i, unsigned int n, |
214 | const unsigned long *args) |
215 | { |
216 | + if (n == 0) |
217 | + return; |
218 | + |
219 | if (i + n > SYSCALL_MAX_ARGS) { |
220 | pr_warning("%s called with max args %d, handling only %d\n", |
221 | __func__, i + n, SYSCALL_MAX_ARGS); |
222 | diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h |
223 | index d3e5e9bc8f94..e37db7f2a5fa 100644 |
224 | --- a/arch/powerpc/include/asm/eeh.h |
225 | +++ b/arch/powerpc/include/asm/eeh.h |
226 | @@ -117,6 +117,16 @@ static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev) |
227 | return edev ? edev->pdev : NULL; |
228 | } |
229 | |
230 | +/* Return values from eeh_ops::next_error */ |
231 | +enum { |
232 | + EEH_NEXT_ERR_NONE = 0, |
233 | + EEH_NEXT_ERR_INF, |
234 | + EEH_NEXT_ERR_FROZEN_PE, |
235 | + EEH_NEXT_ERR_FENCED_PHB, |
236 | + EEH_NEXT_ERR_DEAD_PHB, |
237 | + EEH_NEXT_ERR_DEAD_IOC |
238 | +}; |
239 | + |
240 | /* |
241 | * The struct is used to trace the registered EEH operation |
242 | * callback functions. Actually, those operation callback |
243 | diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c |
244 | index 36bed5a12750..d3a132c9127c 100644 |
245 | --- a/arch/powerpc/kernel/eeh_driver.c |
246 | +++ b/arch/powerpc/kernel/eeh_driver.c |
247 | @@ -626,84 +626,90 @@ static void eeh_handle_special_event(void) |
248 | { |
249 | struct eeh_pe *pe, *phb_pe; |
250 | struct pci_bus *bus; |
251 | - struct pci_controller *hose, *tmp; |
252 | + struct pci_controller *hose; |
253 | unsigned long flags; |
254 | - int rc = 0; |
255 | + int rc; |
256 | |
257 | - /* |
258 | - * The return value from next_error() has been classified as follows. |
259 | - * It might be good to enumerate them. However, next_error() is only |
260 | - * supported by PowerNV platform for now. So it would be fine to use |
261 | - * integer directly: |
262 | - * |
263 | - * 4 - Dead IOC 3 - Dead PHB |
264 | - * 2 - Fenced PHB 1 - Frozen PE |
265 | - * 0 - No error found |
266 | - * |
267 | - */ |
268 | - rc = eeh_ops->next_error(&pe); |
269 | - if (rc <= 0) |
270 | - return; |
271 | |
272 | - switch (rc) { |
273 | - case 4: |
274 | - /* Mark all PHBs in dead state */ |
275 | - eeh_serialize_lock(&flags); |
276 | - list_for_each_entry_safe(hose, tmp, |
277 | - &hose_list, list_node) { |
278 | - phb_pe = eeh_phb_pe_get(hose); |
279 | - if (!phb_pe) continue; |
280 | - |
281 | - eeh_pe_state_mark(phb_pe, |
282 | - EEH_PE_ISOLATED | EEH_PE_PHB_DEAD); |
283 | + do { |
284 | + rc = eeh_ops->next_error(&pe); |
285 | + |
286 | + switch (rc) { |
287 | + case EEH_NEXT_ERR_DEAD_IOC: |
288 | + /* Mark all PHBs in dead state */ |
289 | + eeh_serialize_lock(&flags); |
290 | + |
291 | + /* Purge all events */ |
292 | + eeh_remove_event(NULL); |
293 | + |
294 | + list_for_each_entry(hose, &hose_list, list_node) { |
295 | + phb_pe = eeh_phb_pe_get(hose); |
296 | + if (!phb_pe) continue; |
297 | + |
298 | + eeh_pe_state_mark(phb_pe, |
299 | + EEH_PE_ISOLATED | EEH_PE_PHB_DEAD); |
300 | + } |
301 | + |
302 | + eeh_serialize_unlock(flags); |
303 | + |
304 | + break; |
305 | + case EEH_NEXT_ERR_FROZEN_PE: |
306 | + case EEH_NEXT_ERR_FENCED_PHB: |
307 | + case EEH_NEXT_ERR_DEAD_PHB: |
308 | + /* Mark the PE in fenced state */ |
309 | + eeh_serialize_lock(&flags); |
310 | + |
311 | + /* Purge all events of the PHB */ |
312 | + eeh_remove_event(pe); |
313 | + |
314 | + if (rc == EEH_NEXT_ERR_DEAD_PHB) |
315 | + eeh_pe_state_mark(pe, |
316 | + EEH_PE_ISOLATED | EEH_PE_PHB_DEAD); |
317 | + else |
318 | + eeh_pe_state_mark(pe, |
319 | + EEH_PE_ISOLATED | EEH_PE_RECOVERING); |
320 | + |
321 | + eeh_serialize_unlock(flags); |
322 | + |
323 | + break; |
324 | + case EEH_NEXT_ERR_NONE: |
325 | + return; |
326 | + default: |
327 | + pr_warn("%s: Invalid value %d from next_error()\n", |
328 | + __func__, rc); |
329 | + return; |
330 | } |
331 | - eeh_serialize_unlock(flags); |
332 | - |
333 | - /* Purge all events */ |
334 | - eeh_remove_event(NULL); |
335 | - break; |
336 | - case 3: |
337 | - case 2: |
338 | - case 1: |
339 | - /* Mark the PE in fenced state */ |
340 | - eeh_serialize_lock(&flags); |
341 | - if (rc == 3) |
342 | - eeh_pe_state_mark(pe, |
343 | - EEH_PE_ISOLATED | EEH_PE_PHB_DEAD); |
344 | - else |
345 | - eeh_pe_state_mark(pe, |
346 | - EEH_PE_ISOLATED | EEH_PE_RECOVERING); |
347 | - eeh_serialize_unlock(flags); |
348 | - |
349 | - /* Purge all events of the PHB */ |
350 | - eeh_remove_event(pe); |
351 | - break; |
352 | - default: |
353 | - pr_err("%s: Invalid value %d from next_error()\n", |
354 | - __func__, rc); |
355 | - return; |
356 | - } |
357 | |
358 | - /* |
359 | - * For fenced PHB and frozen PE, it's handled as normal |
360 | - * event. We have to remove the affected PHBs for dead |
361 | - * PHB and IOC |
362 | - */ |
363 | - if (rc == 2 || rc == 1) |
364 | - eeh_handle_normal_event(pe); |
365 | - else { |
366 | - list_for_each_entry_safe(hose, tmp, |
367 | - &hose_list, list_node) { |
368 | - phb_pe = eeh_phb_pe_get(hose); |
369 | - if (!phb_pe || !(phb_pe->state & EEH_PE_PHB_DEAD)) |
370 | - continue; |
371 | - |
372 | - bus = eeh_pe_bus_get(phb_pe); |
373 | - /* Notify all devices that they're about to go down. */ |
374 | - eeh_pe_dev_traverse(pe, eeh_report_failure, NULL); |
375 | - pcibios_remove_pci_devices(bus); |
376 | + /* |
377 | + * For fenced PHB and frozen PE, it's handled as normal |
378 | + * event. We have to remove the affected PHBs for dead |
379 | + * PHB and IOC |
380 | + */ |
381 | + if (rc == EEH_NEXT_ERR_FROZEN_PE || |
382 | + rc == EEH_NEXT_ERR_FENCED_PHB) { |
383 | + eeh_handle_normal_event(pe); |
384 | + } else { |
385 | + list_for_each_entry(hose, &hose_list, list_node) { |
386 | + phb_pe = eeh_phb_pe_get(hose); |
387 | + if (!phb_pe || |
388 | + !(phb_pe->state & EEH_PE_PHB_DEAD)) |
389 | + continue; |
390 | + |
391 | + /* Notify all devices to be down */ |
392 | + bus = eeh_pe_bus_get(phb_pe); |
393 | + eeh_pe_dev_traverse(pe, |
394 | + eeh_report_failure, NULL); |
395 | + pcibios_remove_pci_devices(bus); |
396 | + } |
397 | } |
398 | - } |
399 | + |
400 | + /* |
401 | + * If we have detected dead IOC, we needn't proceed |
402 | + * any more since all PHBs would have been removed |
403 | + */ |
404 | + if (rc == EEH_NEXT_ERR_DEAD_IOC) |
405 | + break; |
406 | + } while (rc != EEH_NEXT_ERR_NONE); |
407 | } |
408 | |
409 | /** |
410 | diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c |
411 | index b7eb5d4f4c89..227c7fe4067f 100644 |
412 | --- a/arch/powerpc/platforms/powernv/eeh-ioda.c |
413 | +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c |
414 | @@ -766,12 +766,12 @@ static int ioda_eeh_get_pe(struct pci_controller *hose, |
415 | */ |
416 | static int ioda_eeh_next_error(struct eeh_pe **pe) |
417 | { |
418 | - struct pci_controller *hose, *tmp; |
419 | + struct pci_controller *hose; |
420 | struct pnv_phb *phb; |
421 | u64 frozen_pe_no; |
422 | u16 err_type, severity; |
423 | long rc; |
424 | - int ret = 1; |
425 | + int ret = EEH_NEXT_ERR_NONE; |
426 | |
427 | /* |
428 | * While running here, it's safe to purge the event queue. |
429 | @@ -781,7 +781,7 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) |
430 | eeh_remove_event(NULL); |
431 | opal_notifier_update_evt(OPAL_EVENT_PCI_ERROR, 0x0ul); |
432 | |
433 | - list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { |
434 | + list_for_each_entry(hose, &hose_list, list_node) { |
435 | /* |
436 | * If the subordinate PCI buses of the PHB has been |
437 | * removed, we needn't take care of it any more. |
438 | @@ -820,19 +820,19 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) |
439 | switch (err_type) { |
440 | case OPAL_EEH_IOC_ERROR: |
441 | if (severity == OPAL_EEH_SEV_IOC_DEAD) { |
442 | - list_for_each_entry_safe(hose, tmp, |
443 | - &hose_list, list_node) { |
444 | + list_for_each_entry(hose, &hose_list, |
445 | + list_node) { |
446 | phb = hose->private_data; |
447 | phb->eeh_state |= PNV_EEH_STATE_REMOVED; |
448 | } |
449 | |
450 | pr_err("EEH: dead IOC detected\n"); |
451 | - ret = 4; |
452 | - goto out; |
453 | + ret = EEH_NEXT_ERR_DEAD_IOC; |
454 | } else if (severity == OPAL_EEH_SEV_INF) { |
455 | pr_info("EEH: IOC informative error " |
456 | "detected\n"); |
457 | ioda_eeh_hub_diag(hose); |
458 | + ret = EEH_NEXT_ERR_NONE; |
459 | } |
460 | |
461 | break; |
462 | @@ -844,21 +844,20 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) |
463 | pr_err("EEH: dead PHB#%x detected\n", |
464 | hose->global_number); |
465 | phb->eeh_state |= PNV_EEH_STATE_REMOVED; |
466 | - ret = 3; |
467 | - goto out; |
468 | + ret = EEH_NEXT_ERR_DEAD_PHB; |
469 | } else if (severity == OPAL_EEH_SEV_PHB_FENCED) { |
470 | if (ioda_eeh_get_phb_pe(hose, pe)) |
471 | break; |
472 | |
473 | pr_err("EEH: fenced PHB#%x detected\n", |
474 | hose->global_number); |
475 | - ret = 2; |
476 | - goto out; |
477 | + ret = EEH_NEXT_ERR_FENCED_PHB; |
478 | } else if (severity == OPAL_EEH_SEV_INF) { |
479 | pr_info("EEH: PHB#%x informative error " |
480 | "detected\n", |
481 | hose->global_number); |
482 | ioda_eeh_phb_diag(hose); |
483 | + ret = EEH_NEXT_ERR_NONE; |
484 | } |
485 | |
486 | break; |
487 | @@ -868,13 +867,23 @@ static int ioda_eeh_next_error(struct eeh_pe **pe) |
488 | |
489 | pr_err("EEH: Frozen PE#%x on PHB#%x detected\n", |
490 | (*pe)->addr, (*pe)->phb->global_number); |
491 | - ret = 1; |
492 | - goto out; |
493 | + ret = EEH_NEXT_ERR_FROZEN_PE; |
494 | + break; |
495 | + default: |
496 | + pr_warn("%s: Unexpected error type %d\n", |
497 | + __func__, err_type); |
498 | } |
499 | + |
500 | + /* |
501 | + * If we have no errors on the specific PHB or only |
502 | + * informative error there, we continue poking it. |
503 | + * Otherwise, we need actions to be taken by upper |
504 | + * layer. |
505 | + */ |
506 | + if (ret > EEH_NEXT_ERR_INF) |
507 | + break; |
508 | } |
509 | |
510 | - ret = 0; |
511 | -out: |
512 | return ret; |
513 | } |
514 | |
515 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
516 | index dce0df8150df..74dd12952ea8 100644 |
517 | --- a/arch/x86/kvm/mmu.c |
518 | +++ b/arch/x86/kvm/mmu.c |
519 | @@ -2664,6 +2664,9 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, |
520 | int emulate = 0; |
521 | gfn_t pseudo_gfn; |
522 | |
523 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) |
524 | + return 0; |
525 | + |
526 | for_each_shadow_entry(vcpu, (u64)gfn << PAGE_SHIFT, iterator) { |
527 | if (iterator.level == level) { |
528 | mmu_set_spte(vcpu, iterator.sptep, ACC_ALL, |
529 | @@ -2834,6 +2837,9 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, |
530 | bool ret = false; |
531 | u64 spte = 0ull; |
532 | |
533 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) |
534 | + return false; |
535 | + |
536 | if (!page_fault_can_be_fast(error_code)) |
537 | return false; |
538 | |
539 | @@ -3229,6 +3235,9 @@ static u64 walk_shadow_page_get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr) |
540 | struct kvm_shadow_walk_iterator iterator; |
541 | u64 spte = 0ull; |
542 | |
543 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) |
544 | + return spte; |
545 | + |
546 | walk_shadow_page_lockless_begin(vcpu); |
547 | for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) |
548 | if (!is_shadow_present_pte(spte)) |
549 | @@ -4557,6 +4566,9 @@ int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4]) |
550 | u64 spte; |
551 | int nr_sptes = 0; |
552 | |
553 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) |
554 | + return nr_sptes; |
555 | + |
556 | walk_shadow_page_lockless_begin(vcpu); |
557 | for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) { |
558 | sptes[iterator.level-1] = spte; |
559 | diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h |
560 | index ad75d77999d0..cba218a2f08d 100644 |
561 | --- a/arch/x86/kvm/paging_tmpl.h |
562 | +++ b/arch/x86/kvm/paging_tmpl.h |
563 | @@ -569,6 +569,9 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, |
564 | if (FNAME(gpte_changed)(vcpu, gw, top_level)) |
565 | goto out_gpte_changed; |
566 | |
567 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) |
568 | + goto out_gpte_changed; |
569 | + |
570 | for (shadow_walk_init(&it, vcpu, addr); |
571 | shadow_walk_okay(&it) && it.level > gw->level; |
572 | shadow_walk_next(&it)) { |
573 | @@ -820,6 +823,11 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) |
574 | */ |
575 | mmu_topup_memory_caches(vcpu); |
576 | |
577 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) { |
578 | + WARN_ON(1); |
579 | + return; |
580 | + } |
581 | + |
582 | spin_lock(&vcpu->kvm->mmu_lock); |
583 | for_each_shadow_entry(vcpu, gva, iterator) { |
584 | level = iterator.level; |
585 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
586 | index 6128914ee873..59181e653826 100644 |
587 | --- a/arch/x86/kvm/vmx.c |
588 | +++ b/arch/x86/kvm/vmx.c |
589 | @@ -7294,8 +7294,8 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) |
590 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
591 | |
592 | free_vpid(vmx); |
593 | - free_nested(vmx); |
594 | free_loaded_vmcs(vmx->loaded_vmcs); |
595 | + free_nested(vmx); |
596 | kfree(vmx->guest_msrs); |
597 | kvm_vcpu_uninit(vcpu); |
598 | kmem_cache_free(kvm_vcpu_cache, vmx); |
599 | diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S |
600 | index 877b9a1b2152..01495755701b 100644 |
601 | --- a/arch/x86/net/bpf_jit.S |
602 | +++ b/arch/x86/net/bpf_jit.S |
603 | @@ -140,7 +140,7 @@ bpf_slow_path_byte_msh: |
604 | push %r9; \ |
605 | push SKBDATA; \ |
606 | /* rsi already has offset */ \ |
607 | - mov $SIZE,%ecx; /* size */ \ |
608 | + mov $SIZE,%edx; /* size */ \ |
609 | call bpf_internal_load_pointer_neg_helper; \ |
610 | test %rax,%rax; \ |
611 | pop SKBDATA; \ |
612 | diff --git a/drivers/clocksource/vf_pit_timer.c b/drivers/clocksource/vf_pit_timer.c |
613 | index 587e0202a70b..e5590953630e 100644 |
614 | --- a/drivers/clocksource/vf_pit_timer.c |
615 | +++ b/drivers/clocksource/vf_pit_timer.c |
616 | @@ -54,7 +54,7 @@ static inline void pit_irq_acknowledge(void) |
617 | |
618 | static unsigned int pit_read_sched_clock(void) |
619 | { |
620 | - return __raw_readl(clksrc_base + PITCVAL); |
621 | + return ~__raw_readl(clksrc_base + PITCVAL); |
622 | } |
623 | |
624 | static int __init pit_clocksource_init(unsigned long rate) |
625 | diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c |
626 | index fe4a7d16e261..c077df094ae5 100644 |
627 | --- a/drivers/gpu/drm/i915/i915_gem_stolen.c |
628 | +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c |
629 | @@ -201,6 +201,13 @@ int i915_gem_init_stolen(struct drm_device *dev) |
630 | struct drm_i915_private *dev_priv = dev->dev_private; |
631 | int bios_reserved = 0; |
632 | |
633 | +#ifdef CONFIG_INTEL_IOMMU |
634 | + if (intel_iommu_gfx_mapped) { |
635 | + DRM_INFO("DMAR active, disabling use of stolen memory\n"); |
636 | + return 0; |
637 | + } |
638 | +#endif |
639 | + |
640 | if (dev_priv->gtt.stolen_size == 0) |
641 | return 0; |
642 | |
643 | diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c |
644 | index 49f6cc0f9919..351805362290 100644 |
645 | --- a/drivers/hid/hid-lg4ff.c |
646 | +++ b/drivers/hid/hid-lg4ff.c |
647 | @@ -574,17 +574,6 @@ int lg4ff_init(struct hid_device *hid) |
648 | if (error) |
649 | return error; |
650 | |
651 | - /* Check if autocentering is available and |
652 | - * set the centering force to zero by default */ |
653 | - if (test_bit(FF_AUTOCENTER, dev->ffbit)) { |
654 | - if (rev_maj == FFEX_REV_MAJ && rev_min == FFEX_REV_MIN) /* Formula Force EX expects different autocentering command */ |
655 | - dev->ff->set_autocenter = hid_lg4ff_set_autocenter_ffex; |
656 | - else |
657 | - dev->ff->set_autocenter = hid_lg4ff_set_autocenter_default; |
658 | - |
659 | - dev->ff->set_autocenter(dev, 0); |
660 | - } |
661 | - |
662 | /* Get private driver data */ |
663 | drv_data = hid_get_drvdata(hid); |
664 | if (!drv_data) { |
665 | @@ -605,6 +594,17 @@ int lg4ff_init(struct hid_device *hid) |
666 | entry->max_range = lg4ff_devices[i].max_range; |
667 | entry->set_range = lg4ff_devices[i].set_range; |
668 | |
669 | + /* Check if autocentering is available and |
670 | + * set the centering force to zero by default */ |
671 | + if (test_bit(FF_AUTOCENTER, dev->ffbit)) { |
672 | + if (rev_maj == FFEX_REV_MAJ && rev_min == FFEX_REV_MIN) /* Formula Force EX expects different autocentering command */ |
673 | + dev->ff->set_autocenter = hid_lg4ff_set_autocenter_ffex; |
674 | + else |
675 | + dev->ff->set_autocenter = hid_lg4ff_set_autocenter_default; |
676 | + |
677 | + dev->ff->set_autocenter(dev, 0); |
678 | + } |
679 | + |
680 | /* Create sysfs interface */ |
681 | error = device_create_file(&hid->dev, &dev_attr_range); |
682 | if (error) |
683 | diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c |
684 | index 6a6dd5cd7833..d0a0034d1734 100644 |
685 | --- a/drivers/hid/hidraw.c |
686 | +++ b/drivers/hid/hidraw.c |
687 | @@ -313,13 +313,13 @@ static void drop_ref(struct hidraw *hidraw, int exists_bit) |
688 | hid_hw_close(hidraw->hid); |
689 | wake_up_interruptible(&hidraw->wait); |
690 | } |
691 | + device_destroy(hidraw_class, |
692 | + MKDEV(hidraw_major, hidraw->minor)); |
693 | } else { |
694 | --hidraw->open; |
695 | } |
696 | if (!hidraw->open) { |
697 | if (!hidraw->exist) { |
698 | - device_destroy(hidraw_class, |
699 | - MKDEV(hidraw_major, hidraw->minor)); |
700 | hidraw_table[hidraw->minor] = NULL; |
701 | kfree(hidraw); |
702 | } else { |
703 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
704 | index ba93ef85652d..09c71293ab4b 100644 |
705 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
706 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
707 | @@ -1652,7 +1652,6 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn |
708 | static void |
709 | isert_cq_rx_comp_err(struct isert_conn *isert_conn) |
710 | { |
711 | - struct ib_device *ib_dev = isert_conn->conn_cm_id->device; |
712 | struct iscsi_conn *conn = isert_conn->conn; |
713 | |
714 | if (isert_conn->post_recv_buf_count) |
715 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
716 | index 597e9b8fc18d..ef1cf52f8bb9 100644 |
717 | --- a/drivers/input/mouse/elantech.c |
718 | +++ b/drivers/input/mouse/elantech.c |
719 | @@ -486,6 +486,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) |
720 | unsigned char *packet = psmouse->packet; |
721 | |
722 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
723 | + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
724 | input_mt_report_pointer_emulation(dev, true); |
725 | input_sync(dev); |
726 | } |
727 | @@ -984,6 +985,44 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, |
728 | } |
729 | |
730 | /* |
731 | + * Advertise INPUT_PROP_BUTTONPAD for clickpads. The testing of bit 12 in |
732 | + * fw_version for this is based on the following fw_version & caps table: |
733 | + * |
734 | + * Laptop-model: fw_version: caps: buttons: |
735 | + * Acer S3 0x461f00 10, 13, 0e clickpad |
736 | + * Acer S7-392 0x581f01 50, 17, 0d clickpad |
737 | + * Acer V5-131 0x461f02 01, 16, 0c clickpad |
738 | + * Acer V5-551 0x461f00 ? clickpad |
739 | + * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons |
740 | + * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons |
741 | + * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons |
742 | + * Asus UX31 0x361f00 20, 15, 0e clickpad |
743 | + * Asus UX32VD 0x361f02 00, 15, 0e clickpad |
744 | + * Avatar AVIU-145A2 0x361f00 ? clickpad |
745 | + * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons |
746 | + * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) |
747 | + * Samsung NF210 0x150b00 78, 14, 0a 2 hw buttons |
748 | + * Samsung NP770Z5E 0x575f01 10, 15, 0f clickpad |
749 | + * Samsung NP700Z5B 0x361f06 21, 15, 0f clickpad |
750 | + * Samsung NP900X3E-A02 0x575f03 ? clickpad |
751 | + * Samsung NP-QX410 0x851b00 19, 14, 0c clickpad |
752 | + * Samsung RC512 0x450f00 08, 15, 0c 2 hw buttons |
753 | + * Samsung RF710 0x450f00 ? 2 hw buttons |
754 | + * System76 Pangolin 0x250f01 ? 2 hw buttons |
755 | + * (*) + 3 trackpoint buttons |
756 | + */ |
757 | +static void elantech_set_buttonpad_prop(struct psmouse *psmouse) |
758 | +{ |
759 | + struct input_dev *dev = psmouse->dev; |
760 | + struct elantech_data *etd = psmouse->private; |
761 | + |
762 | + if (etd->fw_version & 0x001000) { |
763 | + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); |
764 | + __clear_bit(BTN_RIGHT, dev->keybit); |
765 | + } |
766 | +} |
767 | + |
768 | +/* |
769 | * Set the appropriate event bits for the input subsystem |
770 | */ |
771 | static int elantech_set_input_params(struct psmouse *psmouse) |
772 | @@ -1026,6 +1065,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) |
773 | __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); |
774 | /* fall through */ |
775 | case 3: |
776 | + if (etd->hw_version == 3) |
777 | + elantech_set_buttonpad_prop(psmouse); |
778 | input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); |
779 | input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); |
780 | if (etd->reports_pressure) { |
781 | @@ -1047,9 +1088,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) |
782 | */ |
783 | psmouse_warn(psmouse, "couldn't query resolution data.\n"); |
784 | } |
785 | - /* v4 is clickpad, with only one button. */ |
786 | - __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); |
787 | - __clear_bit(BTN_RIGHT, dev->keybit); |
788 | + elantech_set_buttonpad_prop(psmouse); |
789 | __set_bit(BTN_TOOL_QUADTAP, dev->keybit); |
790 | /* For X to recognize me as touchpad. */ |
791 | input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); |
792 | diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c |
793 | index e53416a4d7f3..a6debe13d5b9 100644 |
794 | --- a/drivers/input/tablet/wacom_sys.c |
795 | +++ b/drivers/input/tablet/wacom_sys.c |
796 | @@ -304,7 +304,7 @@ static int wacom_parse_hid(struct usb_interface *intf, |
797 | struct usb_device *dev = interface_to_usbdev(intf); |
798 | char limit = 0; |
799 | /* result has to be defined as int for some devices */ |
800 | - int result = 0; |
801 | + int result = 0, touch_max = 0; |
802 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; |
803 | unsigned char *report; |
804 | |
805 | @@ -351,7 +351,8 @@ static int wacom_parse_hid(struct usb_interface *intf, |
806 | if (usage == WCM_DESKTOP) { |
807 | if (finger) { |
808 | features->device_type = BTN_TOOL_FINGER; |
809 | - |
810 | + /* touch device at least supports one touch point */ |
811 | + touch_max = 1; |
812 | switch (features->type) { |
813 | case TABLETPC2FG: |
814 | features->pktlen = WACOM_PKGLEN_TPC2FG; |
815 | @@ -504,6 +505,8 @@ static int wacom_parse_hid(struct usb_interface *intf, |
816 | } |
817 | |
818 | out: |
819 | + if (!features->touch_max && touch_max) |
820 | + features->touch_max = touch_max; |
821 | result = 0; |
822 | kfree(report); |
823 | return result; |
824 | diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c |
825 | index 6386ced910c2..91c694ba42f4 100644 |
826 | --- a/drivers/media/pci/cx18/cx18-driver.c |
827 | +++ b/drivers/media/pci/cx18/cx18-driver.c |
828 | @@ -327,13 +327,16 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv) |
829 | struct i2c_client *c; |
830 | u8 eedata[256]; |
831 | |
832 | + memset(tv, 0, sizeof(*tv)); |
833 | + |
834 | c = kzalloc(sizeof(*c), GFP_KERNEL); |
835 | + if (!c) |
836 | + return; |
837 | |
838 | strlcpy(c->name, "cx18 tveeprom tmp", sizeof(c->name)); |
839 | c->adapter = &cx->i2c_adap[0]; |
840 | c->addr = 0xa0 >> 1; |
841 | |
842 | - memset(tv, 0, sizeof(*tv)); |
843 | if (tveeprom_read(c, eedata, sizeof(eedata))) |
844 | goto ret; |
845 | |
846 | diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c |
847 | index 20e345d9fe8f..a1c641e18362 100644 |
848 | --- a/drivers/media/usb/dvb-usb/cxusb.c |
849 | +++ b/drivers/media/usb/dvb-usb/cxusb.c |
850 | @@ -149,6 +149,7 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
851 | int num) |
852 | { |
853 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
854 | + int ret; |
855 | int i; |
856 | |
857 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) |
858 | @@ -173,7 +174,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
859 | if (1 + msg[i].len > sizeof(ibuf)) { |
860 | warn("i2c rd: len=%d is too big!\n", |
861 | msg[i].len); |
862 | - return -EOPNOTSUPP; |
863 | + ret = -EOPNOTSUPP; |
864 | + goto unlock; |
865 | } |
866 | obuf[0] = 0; |
867 | obuf[1] = msg[i].len; |
868 | @@ -193,12 +195,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
869 | if (3 + msg[i].len > sizeof(obuf)) { |
870 | warn("i2c wr: len=%d is too big!\n", |
871 | msg[i].len); |
872 | - return -EOPNOTSUPP; |
873 | + ret = -EOPNOTSUPP; |
874 | + goto unlock; |
875 | } |
876 | if (1 + msg[i + 1].len > sizeof(ibuf)) { |
877 | warn("i2c rd: len=%d is too big!\n", |
878 | msg[i + 1].len); |
879 | - return -EOPNOTSUPP; |
880 | + ret = -EOPNOTSUPP; |
881 | + goto unlock; |
882 | } |
883 | obuf[0] = msg[i].len; |
884 | obuf[1] = msg[i+1].len; |
885 | @@ -223,7 +227,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
886 | if (2 + msg[i].len > sizeof(obuf)) { |
887 | warn("i2c wr: len=%d is too big!\n", |
888 | msg[i].len); |
889 | - return -EOPNOTSUPP; |
890 | + ret = -EOPNOTSUPP; |
891 | + goto unlock; |
892 | } |
893 | obuf[0] = msg[i].addr; |
894 | obuf[1] = msg[i].len; |
895 | @@ -237,8 +242,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
896 | } |
897 | } |
898 | |
899 | + if (i == num) |
900 | + ret = num; |
901 | + else |
902 | + ret = -EREMOTEIO; |
903 | + |
904 | +unlock: |
905 | mutex_unlock(&d->i2c_mutex); |
906 | - return i == num ? num : -EREMOTEIO; |
907 | + return ret; |
908 | } |
909 | |
910 | static u32 cxusb_i2c_func(struct i2c_adapter *adapter) |
911 | diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c |
912 | index 71b22f5a05ce..4170a45d17e0 100644 |
913 | --- a/drivers/media/usb/dvb-usb/dw2102.c |
914 | +++ b/drivers/media/usb/dvb-usb/dw2102.c |
915 | @@ -301,6 +301,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap, |
916 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) |
917 | { |
918 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
919 | + int ret; |
920 | |
921 | if (!d) |
922 | return -ENODEV; |
923 | @@ -316,7 +317,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms |
924 | if (2 + msg[1].len > sizeof(ibuf)) { |
925 | warn("i2c rd: len=%d is too big!\n", |
926 | msg[1].len); |
927 | - return -EOPNOTSUPP; |
928 | + ret = -EOPNOTSUPP; |
929 | + goto unlock; |
930 | } |
931 | |
932 | obuf[0] = msg[0].addr << 1; |
933 | @@ -340,7 +342,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms |
934 | if (2 + msg[0].len > sizeof(obuf)) { |
935 | warn("i2c wr: len=%d is too big!\n", |
936 | msg[1].len); |
937 | - return -EOPNOTSUPP; |
938 | + ret = -EOPNOTSUPP; |
939 | + goto unlock; |
940 | } |
941 | |
942 | obuf[0] = msg[0].addr << 1; |
943 | @@ -357,7 +360,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms |
944 | if (2 + msg[0].len > sizeof(obuf)) { |
945 | warn("i2c wr: len=%d is too big!\n", |
946 | msg[1].len); |
947 | - return -EOPNOTSUPP; |
948 | + ret = -EOPNOTSUPP; |
949 | + goto unlock; |
950 | } |
951 | |
952 | obuf[0] = msg[0].addr << 1; |
953 | @@ -386,15 +390,17 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms |
954 | |
955 | break; |
956 | } |
957 | + ret = num; |
958 | |
959 | +unlock: |
960 | mutex_unlock(&d->i2c_mutex); |
961 | - return num; |
962 | + return ret; |
963 | } |
964 | |
965 | static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) |
966 | { |
967 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
968 | - int len, i, j; |
969 | + int len, i, j, ret; |
970 | |
971 | if (!d) |
972 | return -ENODEV; |
973 | @@ -430,7 +436,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i |
974 | if (2 + msg[j].len > sizeof(ibuf)) { |
975 | warn("i2c rd: len=%d is too big!\n", |
976 | msg[j].len); |
977 | - return -EOPNOTSUPP; |
978 | + ret = -EOPNOTSUPP; |
979 | + goto unlock; |
980 | } |
981 | |
982 | dw210x_op_rw(d->udev, 0xc3, |
983 | @@ -466,7 +473,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i |
984 | if (2 + msg[j].len > sizeof(obuf)) { |
985 | warn("i2c wr: len=%d is too big!\n", |
986 | msg[j].len); |
987 | - return -EOPNOTSUPP; |
988 | + ret = -EOPNOTSUPP; |
989 | + goto unlock; |
990 | } |
991 | |
992 | obuf[0] = msg[j].addr << 1; |
993 | @@ -481,15 +489,18 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i |
994 | } |
995 | |
996 | } |
997 | + ret = num; |
998 | |
999 | +unlock: |
1000 | mutex_unlock(&d->i2c_mutex); |
1001 | - return num; |
1002 | + return ret; |
1003 | } |
1004 | |
1005 | static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1006 | int num) |
1007 | { |
1008 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
1009 | + int ret; |
1010 | int i; |
1011 | |
1012 | if (!d) |
1013 | @@ -506,7 +517,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1014 | if (2 + msg[1].len > sizeof(ibuf)) { |
1015 | warn("i2c rd: len=%d is too big!\n", |
1016 | msg[1].len); |
1017 | - return -EOPNOTSUPP; |
1018 | + ret = -EOPNOTSUPP; |
1019 | + goto unlock; |
1020 | } |
1021 | obuf[0] = msg[0].addr << 1; |
1022 | obuf[1] = msg[0].len; |
1023 | @@ -530,7 +542,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1024 | if (2 + msg[0].len > sizeof(obuf)) { |
1025 | warn("i2c wr: len=%d is too big!\n", |
1026 | msg[0].len); |
1027 | - return -EOPNOTSUPP; |
1028 | + ret = -EOPNOTSUPP; |
1029 | + goto unlock; |
1030 | } |
1031 | obuf[0] = msg[0].addr << 1; |
1032 | obuf[1] = msg[0].len; |
1033 | @@ -556,9 +569,11 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1034 | msg[i].flags == 0 ? ">>>" : "<<<"); |
1035 | debug_dump(msg[i].buf, msg[i].len, deb_xfer); |
1036 | } |
1037 | + ret = num; |
1038 | |
1039 | +unlock: |
1040 | mutex_unlock(&d->i2c_mutex); |
1041 | - return num; |
1042 | + return ret; |
1043 | } |
1044 | |
1045 | static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1046 | @@ -566,7 +581,7 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1047 | { |
1048 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
1049 | struct usb_device *udev; |
1050 | - int len, i, j; |
1051 | + int len, i, j, ret; |
1052 | |
1053 | if (!d) |
1054 | return -ENODEV; |
1055 | @@ -618,7 +633,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1056 | if (msg[j].len > sizeof(ibuf)) { |
1057 | warn("i2c rd: len=%d is too big!\n", |
1058 | msg[j].len); |
1059 | - return -EOPNOTSUPP; |
1060 | + ret = -EOPNOTSUPP; |
1061 | + goto unlock; |
1062 | } |
1063 | |
1064 | dw210x_op_rw(d->udev, 0x91, 0, 0, |
1065 | @@ -652,7 +668,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1066 | if (2 + msg[j].len > sizeof(obuf)) { |
1067 | warn("i2c wr: len=%d is too big!\n", |
1068 | msg[j].len); |
1069 | - return -EOPNOTSUPP; |
1070 | + ret = -EOPNOTSUPP; |
1071 | + goto unlock; |
1072 | } |
1073 | |
1074 | obuf[0] = msg[j + 1].len; |
1075 | @@ -671,7 +688,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1076 | if (2 + msg[j].len > sizeof(obuf)) { |
1077 | warn("i2c wr: len=%d is too big!\n", |
1078 | msg[j].len); |
1079 | - return -EOPNOTSUPP; |
1080 | + ret = -EOPNOTSUPP; |
1081 | + goto unlock; |
1082 | } |
1083 | obuf[0] = msg[j].len + 1; |
1084 | obuf[1] = (msg[j].addr << 1); |
1085 | @@ -685,9 +703,11 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1086 | } |
1087 | } |
1088 | } |
1089 | + ret = num; |
1090 | |
1091 | +unlock: |
1092 | mutex_unlock(&d->i2c_mutex); |
1093 | - return num; |
1094 | + return ret; |
1095 | } |
1096 | |
1097 | static int su3000_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
1098 | diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c |
1099 | index 5d41aee69d16..6c0fd8e0f9bf 100644 |
1100 | --- a/drivers/net/ethernet/ibm/ibmveth.c |
1101 | +++ b/drivers/net/ethernet/ibm/ibmveth.c |
1102 | @@ -523,10 +523,21 @@ retry: |
1103 | return rc; |
1104 | } |
1105 | |
1106 | +static u64 ibmveth_encode_mac_addr(u8 *mac) |
1107 | +{ |
1108 | + int i; |
1109 | + u64 encoded = 0; |
1110 | + |
1111 | + for (i = 0; i < ETH_ALEN; i++) |
1112 | + encoded = (encoded << 8) | mac[i]; |
1113 | + |
1114 | + return encoded; |
1115 | +} |
1116 | + |
1117 | static int ibmveth_open(struct net_device *netdev) |
1118 | { |
1119 | struct ibmveth_adapter *adapter = netdev_priv(netdev); |
1120 | - u64 mac_address = 0; |
1121 | + u64 mac_address; |
1122 | int rxq_entries = 1; |
1123 | unsigned long lpar_rc; |
1124 | int rc; |
1125 | @@ -580,8 +591,7 @@ static int ibmveth_open(struct net_device *netdev) |
1126 | adapter->rx_queue.num_slots = rxq_entries; |
1127 | adapter->rx_queue.toggle = 1; |
1128 | |
1129 | - memcpy(&mac_address, netdev->dev_addr, netdev->addr_len); |
1130 | - mac_address = mac_address >> 16; |
1131 | + mac_address = ibmveth_encode_mac_addr(netdev->dev_addr); |
1132 | |
1133 | rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | |
1134 | adapter->rx_queue.queue_len; |
1135 | @@ -1184,8 +1194,8 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) |
1136 | /* add the addresses to the filter table */ |
1137 | netdev_for_each_mc_addr(ha, netdev) { |
1138 | /* add the multicast address to the filter table */ |
1139 | - unsigned long mcast_addr = 0; |
1140 | - memcpy(((char *)&mcast_addr)+2, ha->addr, 6); |
1141 | + u64 mcast_addr; |
1142 | + mcast_addr = ibmveth_encode_mac_addr(ha->addr); |
1143 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, |
1144 | IbmVethMcastAddFilter, |
1145 | mcast_addr); |
1146 | @@ -1369,9 +1379,6 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) |
1147 | |
1148 | netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16); |
1149 | |
1150 | - adapter->mac_addr = 0; |
1151 | - memcpy(&adapter->mac_addr, mac_addr_p, 6); |
1152 | - |
1153 | netdev->irq = dev->irq; |
1154 | netdev->netdev_ops = &ibmveth_netdev_ops; |
1155 | netdev->ethtool_ops = &netdev_ethtool_ops; |
1156 | @@ -1380,7 +1387,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) |
1157 | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; |
1158 | netdev->features |= netdev->hw_features; |
1159 | |
1160 | - memcpy(netdev->dev_addr, &adapter->mac_addr, netdev->addr_len); |
1161 | + memcpy(netdev->dev_addr, mac_addr_p, ETH_ALEN); |
1162 | |
1163 | for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { |
1164 | struct kobject *kobj = &adapter->rx_buff_pool[i].kobj; |
1165 | diff --git a/drivers/net/ethernet/ibm/ibmveth.h b/drivers/net/ethernet/ibm/ibmveth.h |
1166 | index 84066bafe057..2c636cbf1341 100644 |
1167 | --- a/drivers/net/ethernet/ibm/ibmveth.h |
1168 | +++ b/drivers/net/ethernet/ibm/ibmveth.h |
1169 | @@ -139,7 +139,6 @@ struct ibmveth_adapter { |
1170 | struct napi_struct napi; |
1171 | struct net_device_stats stats; |
1172 | unsigned int mcastFilterSize; |
1173 | - unsigned long mac_addr; |
1174 | void * buffer_list_addr; |
1175 | void * filter_list_addr; |
1176 | dma_addr_t buffer_list_dma; |
1177 | diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c |
1178 | index ada6e210279f..48f0b06f4448 100644 |
1179 | --- a/drivers/net/ethernet/intel/e100.c |
1180 | +++ b/drivers/net/ethernet/intel/e100.c |
1181 | @@ -3036,7 +3036,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake) |
1182 | *enable_wake = false; |
1183 | } |
1184 | |
1185 | - pci_disable_device(pdev); |
1186 | + pci_clear_master(pdev); |
1187 | } |
1188 | |
1189 | static int __e100_power_off(struct pci_dev *pdev, bool wake) |
1190 | diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h |
1191 | index 34d00f5771fe..b6b601cebb9e 100644 |
1192 | --- a/drivers/net/ethernet/sfc/efx.h |
1193 | +++ b/drivers/net/ethernet/sfc/efx.h |
1194 | @@ -67,6 +67,9 @@ extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue); |
1195 | #define EFX_RXQ_MIN_ENT 128U |
1196 | #define EFX_TXQ_MIN_ENT(efx) (2 * efx_tx_max_skb_descs(efx)) |
1197 | |
1198 | +#define EFX_TXQ_MAX_ENT(efx) (EFX_WORKAROUND_35388(efx) ? \ |
1199 | + EFX_MAX_DMAQ_SIZE / 2 : EFX_MAX_DMAQ_SIZE) |
1200 | + |
1201 | /* Filters */ |
1202 | |
1203 | /** |
1204 | diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c |
1205 | index 5b471cf5c323..3b2356bc6fba 100644 |
1206 | --- a/drivers/net/ethernet/sfc/ethtool.c |
1207 | +++ b/drivers/net/ethernet/sfc/ethtool.c |
1208 | @@ -582,7 +582,7 @@ static void efx_ethtool_get_ringparam(struct net_device *net_dev, |
1209 | struct efx_nic *efx = netdev_priv(net_dev); |
1210 | |
1211 | ring->rx_max_pending = EFX_MAX_DMAQ_SIZE; |
1212 | - ring->tx_max_pending = EFX_MAX_DMAQ_SIZE; |
1213 | + ring->tx_max_pending = EFX_TXQ_MAX_ENT(efx); |
1214 | ring->rx_pending = efx->rxq_entries; |
1215 | ring->tx_pending = efx->txq_entries; |
1216 | } |
1217 | @@ -595,7 +595,7 @@ static int efx_ethtool_set_ringparam(struct net_device *net_dev, |
1218 | |
1219 | if (ring->rx_mini_pending || ring->rx_jumbo_pending || |
1220 | ring->rx_pending > EFX_MAX_DMAQ_SIZE || |
1221 | - ring->tx_pending > EFX_MAX_DMAQ_SIZE) |
1222 | + ring->tx_pending > EFX_TXQ_MAX_ENT(efx)) |
1223 | return -EINVAL; |
1224 | |
1225 | if (ring->rx_pending < EFX_RXQ_MIN_ENT) { |
1226 | diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c |
1227 | index 6a32ef9d63ae..2b0aab130205 100644 |
1228 | --- a/drivers/net/ethernet/ti/davinci_emac.c |
1229 | +++ b/drivers/net/ethernet/ti/davinci_emac.c |
1230 | @@ -1531,7 +1531,7 @@ static int emac_dev_open(struct net_device *ndev) |
1231 | struct device *emac_dev = &ndev->dev; |
1232 | u32 cnt; |
1233 | struct resource *res; |
1234 | - int ret; |
1235 | + int q, m, ret; |
1236 | int i = 0; |
1237 | int k = 0; |
1238 | struct emac_priv *priv = netdev_priv(ndev); |
1239 | @@ -1566,8 +1566,7 @@ static int emac_dev_open(struct net_device *ndev) |
1240 | |
1241 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
1242 | for (i = res->start; i <= res->end; i++) { |
1243 | - if (devm_request_irq(&priv->pdev->dev, i, emac_irq, |
1244 | - 0, ndev->name, ndev)) |
1245 | + if (request_irq(i, emac_irq, 0, ndev->name, ndev)) |
1246 | goto rollback; |
1247 | } |
1248 | k++; |
1249 | @@ -1640,7 +1639,15 @@ static int emac_dev_open(struct net_device *ndev) |
1250 | |
1251 | rollback: |
1252 | |
1253 | - dev_err(emac_dev, "DaVinci EMAC: devm_request_irq() failed"); |
1254 | + dev_err(emac_dev, "DaVinci EMAC: request_irq() failed"); |
1255 | + |
1256 | + for (q = k; k >= 0; k--) { |
1257 | + for (m = i; m >= res->start; m--) |
1258 | + free_irq(m, ndev); |
1259 | + res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k-1); |
1260 | + m = res->end; |
1261 | + } |
1262 | + |
1263 | ret = -EBUSY; |
1264 | err: |
1265 | pm_runtime_put(&priv->pdev->dev); |
1266 | @@ -1658,6 +1665,9 @@ err: |
1267 | */ |
1268 | static int emac_dev_stop(struct net_device *ndev) |
1269 | { |
1270 | + struct resource *res; |
1271 | + int i = 0; |
1272 | + int irq_num; |
1273 | struct emac_priv *priv = netdev_priv(ndev); |
1274 | struct device *emac_dev = &ndev->dev; |
1275 | |
1276 | @@ -1673,6 +1683,13 @@ static int emac_dev_stop(struct net_device *ndev) |
1277 | if (priv->phydev) |
1278 | phy_disconnect(priv->phydev); |
1279 | |
1280 | + /* Free IRQ */ |
1281 | + while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, i))) { |
1282 | + for (irq_num = res->start; irq_num <= res->end; irq_num++) |
1283 | + free_irq(irq_num, priv->ndev); |
1284 | + i++; |
1285 | + } |
1286 | + |
1287 | if (netif_msg_drv(priv)) |
1288 | dev_notice(emac_dev, "DaVinci EMAC: %s stopped\n", ndev->name); |
1289 | |
1290 | diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1291 | index 0fad98b85f60..eee2ef6ce248 100644 |
1292 | --- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1293 | +++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1294 | @@ -596,8 +596,11 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif, |
1295 | |
1296 | mutex_lock(&mvm->mutex); |
1297 | |
1298 | - /* Rssi update while not associated ?! */ |
1299 | - if (WARN_ON_ONCE(mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT)) |
1300 | + /* |
1301 | + * Rssi update while not associated - can happen since the statistics |
1302 | + * are handled asynchronously |
1303 | + */ |
1304 | + if (mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT) |
1305 | goto out_unlock; |
1306 | |
1307 | /* No open connection - reports should be disabled */ |
1308 | diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c |
1309 | index f95de0d16216..1de59b0f8fa8 100644 |
1310 | --- a/drivers/net/wireless/p54/txrx.c |
1311 | +++ b/drivers/net/wireless/p54/txrx.c |
1312 | @@ -587,7 +587,7 @@ static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb) |
1313 | chan = priv->curchan; |
1314 | if (chan) { |
1315 | struct survey_info *survey = &priv->survey[chan->hw_value]; |
1316 | - survey->noise = clamp_t(s8, priv->noise, -128, 127); |
1317 | + survey->noise = clamp(priv->noise, -128, 127); |
1318 | survey->channel_time = priv->survey_raw.active; |
1319 | survey->channel_time_tx = priv->survey_raw.tx; |
1320 | survey->channel_time_busy = priv->survey_raw.tx + |
1321 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c |
1322 | index d97fbf4eb65b..ea83084cb7d9 100644 |
1323 | --- a/drivers/regulator/core.c |
1324 | +++ b/drivers/regulator/core.c |
1325 | @@ -1806,8 +1806,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev) |
1326 | |
1327 | trace_regulator_disable_complete(rdev_get_name(rdev)); |
1328 | |
1329 | - _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, |
1330 | - NULL); |
1331 | return 0; |
1332 | } |
1333 | |
1334 | @@ -1831,6 +1829,8 @@ static int _regulator_disable(struct regulator_dev *rdev) |
1335 | rdev_err(rdev, "failed to disable\n"); |
1336 | return ret; |
1337 | } |
1338 | + _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, |
1339 | + NULL); |
1340 | } |
1341 | |
1342 | rdev->use_count = 0; |
1343 | @@ -1883,20 +1883,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev) |
1344 | { |
1345 | int ret = 0; |
1346 | |
1347 | - /* force disable */ |
1348 | - if (rdev->desc->ops->disable) { |
1349 | - /* ah well, who wants to live forever... */ |
1350 | - ret = rdev->desc->ops->disable(rdev); |
1351 | - if (ret < 0) { |
1352 | - rdev_err(rdev, "failed to force disable\n"); |
1353 | - return ret; |
1354 | - } |
1355 | - /* notify other consumers that power has been forced off */ |
1356 | - _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | |
1357 | - REGULATOR_EVENT_DISABLE, NULL); |
1358 | + ret = _regulator_do_disable(rdev); |
1359 | + if (ret < 0) { |
1360 | + rdev_err(rdev, "failed to force disable\n"); |
1361 | + return ret; |
1362 | } |
1363 | |
1364 | - return ret; |
1365 | + _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | |
1366 | + REGULATOR_EVENT_DISABLE, NULL); |
1367 | + |
1368 | + return 0; |
1369 | } |
1370 | |
1371 | /** |
1372 | @@ -3569,8 +3565,6 @@ int regulator_suspend_finish(void) |
1373 | |
1374 | mutex_lock(®ulator_list_mutex); |
1375 | list_for_each_entry(rdev, ®ulator_list, list) { |
1376 | - struct regulator_ops *ops = rdev->desc->ops; |
1377 | - |
1378 | mutex_lock(&rdev->mutex); |
1379 | if (rdev->use_count > 0 || rdev->constraints->always_on) { |
1380 | error = _regulator_do_enable(rdev); |
1381 | @@ -3579,12 +3573,10 @@ int regulator_suspend_finish(void) |
1382 | } else { |
1383 | if (!has_full_constraints) |
1384 | goto unlock; |
1385 | - if (!ops->disable) |
1386 | - goto unlock; |
1387 | if (!_regulator_is_enabled(rdev)) |
1388 | goto unlock; |
1389 | |
1390 | - error = ops->disable(rdev); |
1391 | + error = _regulator_do_disable(rdev); |
1392 | if (error) |
1393 | ret = error; |
1394 | } |
1395 | @@ -3774,7 +3766,7 @@ static int __init regulator_init_complete(void) |
1396 | ops = rdev->desc->ops; |
1397 | c = rdev->constraints; |
1398 | |
1399 | - if (!ops->disable || (c && c->always_on)) |
1400 | + if (c && c->always_on) |
1401 | continue; |
1402 | |
1403 | mutex_lock(&rdev->mutex); |
1404 | @@ -3795,7 +3787,7 @@ static int __init regulator_init_complete(void) |
1405 | /* We log since this may kill the system if it |
1406 | * goes wrong. */ |
1407 | rdev_info(rdev, "disabling\n"); |
1408 | - ret = ops->disable(rdev); |
1409 | + ret = _regulator_do_disable(rdev); |
1410 | if (ret != 0) { |
1411 | rdev_err(rdev, "couldn't disable: %d\n", ret); |
1412 | } |
1413 | diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c |
1414 | index 451bf99582ff..846d5c6609d8 100644 |
1415 | --- a/drivers/s390/block/dasd.c |
1416 | +++ b/drivers/s390/block/dasd.c |
1417 | @@ -2978,12 +2978,12 @@ static int dasd_alloc_queue(struct dasd_block *block) |
1418 | |
1419 | elevator_exit(block->request_queue->elevator); |
1420 | block->request_queue->elevator = NULL; |
1421 | + mutex_lock(&block->request_queue->sysfs_lock); |
1422 | rc = elevator_init(block->request_queue, "deadline"); |
1423 | - if (rc) { |
1424 | + if (rc) |
1425 | blk_cleanup_queue(block->request_queue); |
1426 | - return rc; |
1427 | - } |
1428 | - return 0; |
1429 | + mutex_unlock(&block->request_queue->sysfs_lock); |
1430 | + return rc; |
1431 | } |
1432 | |
1433 | /* |
1434 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1435 | index 73f5208714a4..1af67a214d33 100644 |
1436 | --- a/drivers/usb/host/xhci-pci.c |
1437 | +++ b/drivers/usb/host/xhci-pci.c |
1438 | @@ -142,6 +142,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
1439 | "QUIRK: Resetting on resume"); |
1440 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
1441 | } |
1442 | + if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
1443 | + pdev->device == 0x0015 && |
1444 | + pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && |
1445 | + pdev->subsystem_device == 0xc0cd) |
1446 | + xhci->quirks |= XHCI_RESET_ON_RESUME; |
1447 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
1448 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
1449 | } |
1450 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1451 | index a53651743d4d..5a5fb98edb8a 100644 |
1452 | --- a/fs/nfs/nfs4proc.c |
1453 | +++ b/fs/nfs/nfs4proc.c |
1454 | @@ -5779,21 +5779,20 @@ struct nfs_release_lockowner_data { |
1455 | struct nfs4_lock_state *lsp; |
1456 | struct nfs_server *server; |
1457 | struct nfs_release_lockowner_args args; |
1458 | - struct nfs4_sequence_args seq_args; |
1459 | - struct nfs4_sequence_res seq_res; |
1460 | + struct nfs_release_lockowner_res res; |
1461 | }; |
1462 | |
1463 | static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata) |
1464 | { |
1465 | struct nfs_release_lockowner_data *data = calldata; |
1466 | nfs40_setup_sequence(data->server, |
1467 | - &data->seq_args, &data->seq_res, task); |
1468 | + &data->args.seq_args, &data->res.seq_res, task); |
1469 | } |
1470 | |
1471 | static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata) |
1472 | { |
1473 | struct nfs_release_lockowner_data *data = calldata; |
1474 | - nfs40_sequence_done(task, &data->seq_res); |
1475 | + nfs40_sequence_done(task, &data->res.seq_res); |
1476 | } |
1477 | |
1478 | static void nfs4_release_lockowner_release(void *calldata) |
1479 | @@ -5822,7 +5821,6 @@ static int nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_st |
1480 | data = kmalloc(sizeof(*data), GFP_NOFS); |
1481 | if (!data) |
1482 | return -ENOMEM; |
1483 | - nfs4_init_sequence(&data->seq_args, &data->seq_res, 0); |
1484 | data->lsp = lsp; |
1485 | data->server = server; |
1486 | data->args.lock_owner.clientid = server->nfs_client->cl_clientid; |
1487 | @@ -5830,6 +5828,8 @@ static int nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_st |
1488 | data->args.lock_owner.s_dev = server->s_dev; |
1489 | |
1490 | msg.rpc_argp = &data->args; |
1491 | + msg.rpc_resp = &data->res; |
1492 | + nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0); |
1493 | rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data); |
1494 | return 0; |
1495 | } |
1496 | diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c |
1497 | index 106a83570630..9fa215473b1d 100644 |
1498 | --- a/fs/proc/proc_devtree.c |
1499 | +++ b/fs/proc/proc_devtree.c |
1500 | @@ -235,6 +235,7 @@ void __init proc_device_tree_init(void) |
1501 | return; |
1502 | root = of_find_node_by_path("/"); |
1503 | if (root == NULL) { |
1504 | + remove_proc_entry("device-tree", NULL); |
1505 | pr_debug("/proc/device-tree: can't find root\n"); |
1506 | return; |
1507 | } |
1508 | diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h |
1509 | index 7c1420bb1dce..6ade97de7a85 100644 |
1510 | --- a/include/linux/ceph/messenger.h |
1511 | +++ b/include/linux/ceph/messenger.h |
1512 | @@ -157,7 +157,7 @@ struct ceph_msg { |
1513 | bool front_is_vmalloc; |
1514 | bool more_to_follow; |
1515 | bool needs_out_seq; |
1516 | - int front_max; |
1517 | + int front_alloc_len; |
1518 | unsigned long ack_stamp; /* tx: when we were acked */ |
1519 | |
1520 | struct ceph_msgpool *pool; |
1521 | diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h |
1522 | index 8f47625a0661..4fb6a8938957 100644 |
1523 | --- a/include/linux/ceph/osd_client.h |
1524 | +++ b/include/linux/ceph/osd_client.h |
1525 | @@ -138,6 +138,7 @@ struct ceph_osd_request { |
1526 | __le64 *r_request_pool; |
1527 | void *r_request_pgid; |
1528 | __le32 *r_request_attempts; |
1529 | + bool r_paused; |
1530 | struct ceph_eversion *r_request_reassert_version; |
1531 | |
1532 | int r_result; |
1533 | diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h |
1534 | index 3561d305b1e0..7b3a119c51c2 100644 |
1535 | --- a/include/linux/cgroup.h |
1536 | +++ b/include/linux/cgroup.h |
1537 | @@ -169,6 +169,8 @@ struct cgroup { |
1538 | * |
1539 | * The ID of the root cgroup is always 0, and a new cgroup |
1540 | * will be assigned with a smallest available ID. |
1541 | + * |
1542 | + * Allocating/Removing ID must be protected by cgroup_mutex. |
1543 | */ |
1544 | int id; |
1545 | |
1546 | diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h |
1547 | index 5eaa746735ff..20aebdbab9a4 100644 |
1548 | --- a/include/linux/ftrace_event.h |
1549 | +++ b/include/linux/ftrace_event.h |
1550 | @@ -325,10 +325,6 @@ enum { |
1551 | FILTER_TRACE_FN, |
1552 | }; |
1553 | |
1554 | -#define EVENT_STORAGE_SIZE 128 |
1555 | -extern struct mutex event_storage_mutex; |
1556 | -extern char event_storage[EVENT_STORAGE_SIZE]; |
1557 | - |
1558 | extern int trace_event_raw_init(struct ftrace_event_call *call); |
1559 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, |
1560 | const char *name, int offset, int size, |
1561 | diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h |
1562 | index ea9e076a91bf..2b307018979d 100644 |
1563 | --- a/include/linux/nfs_xdr.h |
1564 | +++ b/include/linux/nfs_xdr.h |
1565 | @@ -467,9 +467,14 @@ struct nfs_lockt_res { |
1566 | }; |
1567 | |
1568 | struct nfs_release_lockowner_args { |
1569 | + struct nfs4_sequence_args seq_args; |
1570 | struct nfs_lowner lock_owner; |
1571 | }; |
1572 | |
1573 | +struct nfs_release_lockowner_res { |
1574 | + struct nfs4_sequence_res seq_res; |
1575 | +}; |
1576 | + |
1577 | struct nfs4_delegreturnargs { |
1578 | struct nfs4_sequence_args seq_args; |
1579 | const struct nfs_fh *fhandle; |
1580 | diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h |
1581 | index 712ea36067ab..645d749d3c9c 100644 |
1582 | --- a/include/trace/ftrace.h |
1583 | +++ b/include/trace/ftrace.h |
1584 | @@ -303,15 +303,12 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \ |
1585 | #undef __array |
1586 | #define __array(type, item, len) \ |
1587 | do { \ |
1588 | - mutex_lock(&event_storage_mutex); \ |
1589 | + char *type_str = #type"["__stringify(len)"]"; \ |
1590 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
1591 | - snprintf(event_storage, sizeof(event_storage), \ |
1592 | - "%s[%d]", #type, len); \ |
1593 | - ret = trace_define_field(event_call, event_storage, #item, \ |
1594 | + ret = trace_define_field(event_call, type_str, #item, \ |
1595 | offsetof(typeof(field), item), \ |
1596 | sizeof(field.item), \ |
1597 | is_signed_type(type), FILTER_OTHER); \ |
1598 | - mutex_unlock(&event_storage_mutex); \ |
1599 | if (ret) \ |
1600 | return ret; \ |
1601 | } while (0); |
1602 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
1603 | index c4f8bc79d075..1c204fdb85d8 100644 |
1604 | --- a/kernel/cgroup.c |
1605 | +++ b/kernel/cgroup.c |
1606 | @@ -4410,16 +4410,6 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, |
1607 | rcu_assign_pointer(cgrp->name, name); |
1608 | |
1609 | /* |
1610 | - * Temporarily set the pointer to NULL, so idr_find() won't return |
1611 | - * a half-baked cgroup. |
1612 | - */ |
1613 | - cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL); |
1614 | - if (cgrp->id < 0) { |
1615 | - err = -ENOMEM; |
1616 | - goto err_free_name; |
1617 | - } |
1618 | - |
1619 | - /* |
1620 | * Only live parents can have children. Note that the liveliness |
1621 | * check isn't strictly necessary because cgroup_mkdir() and |
1622 | * cgroup_rmdir() are fully synchronized by i_mutex; however, do it |
1623 | @@ -4428,7 +4418,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, |
1624 | */ |
1625 | if (!cgroup_lock_live_group(parent)) { |
1626 | err = -ENODEV; |
1627 | - goto err_free_id; |
1628 | + goto err_free_name; |
1629 | } |
1630 | |
1631 | /* Grab a reference on the superblock so the hierarchy doesn't |
1632 | @@ -4438,6 +4428,16 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, |
1633 | * fs */ |
1634 | atomic_inc(&sb->s_active); |
1635 | |
1636 | + /* |
1637 | + * Temporarily set the pointer to NULL, so idr_find() won't return |
1638 | + * a half-baked cgroup. |
1639 | + */ |
1640 | + cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL); |
1641 | + if (cgrp->id < 0) { |
1642 | + err = -ENOMEM; |
1643 | + goto err_unlock; |
1644 | + } |
1645 | + |
1646 | init_cgroup_housekeeping(cgrp); |
1647 | |
1648 | dentry->d_fsdata = cgrp; |
1649 | @@ -4544,11 +4544,11 @@ err_free_all: |
1650 | ss->css_free(css); |
1651 | } |
1652 | } |
1653 | + idr_remove(&root->cgroup_idr, cgrp->id); |
1654 | +err_unlock: |
1655 | mutex_unlock(&cgroup_mutex); |
1656 | /* Release the reference count that we took on the superblock */ |
1657 | deactivate_super(sb); |
1658 | -err_free_id: |
1659 | - idr_remove(&root->cgroup_idr, cgrp->id); |
1660 | err_free_name: |
1661 | kfree(rcu_dereference_raw(cgrp->name)); |
1662 | err_free_cgrp: |
1663 | diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c |
1664 | index b4e8500afdb3..c59896c65ac3 100644 |
1665 | --- a/kernel/printk/printk.c |
1666 | +++ b/kernel/printk/printk.c |
1667 | @@ -1080,7 +1080,6 @@ static int syslog_print_all(char __user *buf, int size, bool clear) |
1668 | next_seq = log_next_seq; |
1669 | |
1670 | len = 0; |
1671 | - prev = 0; |
1672 | while (len >= 0 && seq < next_seq) { |
1673 | struct printk_log *msg = log_from_idx(idx); |
1674 | int textlen; |
1675 | @@ -2790,7 +2789,6 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, |
1676 | next_idx = idx; |
1677 | |
1678 | l = 0; |
1679 | - prev = 0; |
1680 | while (seq < dumper->next_seq) { |
1681 | struct printk_log *msg = log_from_idx(idx); |
1682 | |
1683 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
1684 | index b03b1f897b5e..bc1bd20f7942 100644 |
1685 | --- a/kernel/trace/trace_events.c |
1686 | +++ b/kernel/trace/trace_events.c |
1687 | @@ -27,12 +27,6 @@ |
1688 | |
1689 | DEFINE_MUTEX(event_mutex); |
1690 | |
1691 | -DEFINE_MUTEX(event_storage_mutex); |
1692 | -EXPORT_SYMBOL_GPL(event_storage_mutex); |
1693 | - |
1694 | -char event_storage[EVENT_STORAGE_SIZE]; |
1695 | -EXPORT_SYMBOL_GPL(event_storage); |
1696 | - |
1697 | LIST_HEAD(ftrace_events); |
1698 | static LIST_HEAD(ftrace_common_fields); |
1699 | |
1700 | diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c |
1701 | index d21a74670088..d7d0b50b1b70 100644 |
1702 | --- a/kernel/trace/trace_export.c |
1703 | +++ b/kernel/trace/trace_export.c |
1704 | @@ -95,15 +95,12 @@ static void __always_unused ____ftrace_check_##name(void) \ |
1705 | #undef __array |
1706 | #define __array(type, item, len) \ |
1707 | do { \ |
1708 | + char *type_str = #type"["__stringify(len)"]"; \ |
1709 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ |
1710 | - mutex_lock(&event_storage_mutex); \ |
1711 | - snprintf(event_storage, sizeof(event_storage), \ |
1712 | - "%s[%d]", #type, len); \ |
1713 | - ret = trace_define_field(event_call, event_storage, #item, \ |
1714 | + ret = trace_define_field(event_call, type_str, #item, \ |
1715 | offsetof(typeof(field), item), \ |
1716 | sizeof(field.item), \ |
1717 | is_signed_type(type), filter_type); \ |
1718 | - mutex_unlock(&event_storage_mutex); \ |
1719 | if (ret) \ |
1720 | return ret; \ |
1721 | } while (0); |
1722 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c |
1723 | index 4a5df7b1cc9f..464303f61730 100644 |
1724 | --- a/net/ceph/messenger.c |
1725 | +++ b/net/ceph/messenger.c |
1726 | @@ -3126,7 +3126,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, |
1727 | INIT_LIST_HEAD(&m->data); |
1728 | |
1729 | /* front */ |
1730 | - m->front_max = front_len; |
1731 | if (front_len) { |
1732 | if (front_len > PAGE_CACHE_SIZE) { |
1733 | m->front.iov_base = __vmalloc(front_len, flags, |
1734 | @@ -3143,7 +3142,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, |
1735 | } else { |
1736 | m->front.iov_base = NULL; |
1737 | } |
1738 | - m->front.iov_len = front_len; |
1739 | + m->front_alloc_len = m->front.iov_len = front_len; |
1740 | |
1741 | dout("ceph_msg_new %p front %d\n", m, front_len); |
1742 | return m; |
1743 | @@ -3301,8 +3300,8 @@ EXPORT_SYMBOL(ceph_msg_last_put); |
1744 | |
1745 | void ceph_msg_dump(struct ceph_msg *msg) |
1746 | { |
1747 | - pr_debug("msg_dump %p (front_max %d length %zd)\n", msg, |
1748 | - msg->front_max, msg->data_length); |
1749 | + pr_debug("msg_dump %p (front_alloc_len %d length %zd)\n", msg, |
1750 | + msg->front_alloc_len, msg->data_length); |
1751 | print_hex_dump(KERN_DEBUG, "header: ", |
1752 | DUMP_PREFIX_OFFSET, 16, 1, |
1753 | &msg->hdr, sizeof(msg->hdr), true); |
1754 | diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c |
1755 | index 1fe25cd29d0e..2ac9ef35110b 100644 |
1756 | --- a/net/ceph/mon_client.c |
1757 | +++ b/net/ceph/mon_client.c |
1758 | @@ -152,7 +152,7 @@ static int __open_session(struct ceph_mon_client *monc) |
1759 | /* initiatiate authentication handshake */ |
1760 | ret = ceph_auth_build_hello(monc->auth, |
1761 | monc->m_auth->front.iov_base, |
1762 | - monc->m_auth->front_max); |
1763 | + monc->m_auth->front_alloc_len); |
1764 | __send_prepared_auth_request(monc, ret); |
1765 | } else { |
1766 | dout("open_session mon%d already open\n", monc->cur_mon); |
1767 | @@ -196,7 +196,7 @@ static void __send_subscribe(struct ceph_mon_client *monc) |
1768 | int num; |
1769 | |
1770 | p = msg->front.iov_base; |
1771 | - end = p + msg->front_max; |
1772 | + end = p + msg->front_alloc_len; |
1773 | |
1774 | num = 1 + !!monc->want_next_osdmap + !!monc->want_mdsmap; |
1775 | ceph_encode_32(&p, num); |
1776 | @@ -897,7 +897,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc, |
1777 | ret = ceph_handle_auth_reply(monc->auth, msg->front.iov_base, |
1778 | msg->front.iov_len, |
1779 | monc->m_auth->front.iov_base, |
1780 | - monc->m_auth->front_max); |
1781 | + monc->m_auth->front_alloc_len); |
1782 | if (ret < 0) { |
1783 | monc->client->auth_err = ret; |
1784 | wake_up_all(&monc->client->auth_wq); |
1785 | @@ -939,7 +939,7 @@ static int __validate_auth(struct ceph_mon_client *monc) |
1786 | return 0; |
1787 | |
1788 | ret = ceph_build_auth(monc->auth, monc->m_auth->front.iov_base, |
1789 | - monc->m_auth->front_max); |
1790 | + monc->m_auth->front_alloc_len); |
1791 | if (ret <= 0) |
1792 | return ret; /* either an error, or no need to authenticate */ |
1793 | __send_prepared_auth_request(monc, ret); |
1794 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c |
1795 | index 2b4b32aaa893..e6b2db68b4fa 100644 |
1796 | --- a/net/ceph/osd_client.c |
1797 | +++ b/net/ceph/osd_client.c |
1798 | @@ -1232,6 +1232,22 @@ void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, |
1799 | EXPORT_SYMBOL(ceph_osdc_set_request_linger); |
1800 | |
1801 | /* |
1802 | + * Returns whether a request should be blocked from being sent |
1803 | + * based on the current osdmap and osd_client settings. |
1804 | + * |
1805 | + * Caller should hold map_sem for read. |
1806 | + */ |
1807 | +static bool __req_should_be_paused(struct ceph_osd_client *osdc, |
1808 | + struct ceph_osd_request *req) |
1809 | +{ |
1810 | + bool pauserd = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD); |
1811 | + bool pausewr = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR) || |
1812 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL); |
1813 | + return (req->r_flags & CEPH_OSD_FLAG_READ && pauserd) || |
1814 | + (req->r_flags & CEPH_OSD_FLAG_WRITE && pausewr); |
1815 | +} |
1816 | + |
1817 | +/* |
1818 | * Pick an osd (the first 'up' osd in the pg), allocate the osd struct |
1819 | * (as needed), and set the request r_osd appropriately. If there is |
1820 | * no up osd, set r_osd to NULL. Move the request to the appropriate list |
1821 | @@ -1248,6 +1264,7 @@ static int __map_request(struct ceph_osd_client *osdc, |
1822 | int acting[CEPH_PG_MAX_SIZE]; |
1823 | int o = -1, num = 0; |
1824 | int err; |
1825 | + bool was_paused; |
1826 | |
1827 | dout("map_request %p tid %lld\n", req, req->r_tid); |
1828 | err = ceph_calc_ceph_pg(&pgid, req->r_oid, osdc->osdmap, |
1829 | @@ -1264,12 +1281,18 @@ static int __map_request(struct ceph_osd_client *osdc, |
1830 | num = err; |
1831 | } |
1832 | |
1833 | + was_paused = req->r_paused; |
1834 | + req->r_paused = __req_should_be_paused(osdc, req); |
1835 | + if (was_paused && !req->r_paused) |
1836 | + force_resend = 1; |
1837 | + |
1838 | if ((!force_resend && |
1839 | req->r_osd && req->r_osd->o_osd == o && |
1840 | req->r_sent >= req->r_osd->o_incarnation && |
1841 | req->r_num_pg_osds == num && |
1842 | memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) || |
1843 | - (req->r_osd == NULL && o == -1)) |
1844 | + (req->r_osd == NULL && o == -1) || |
1845 | + req->r_paused) |
1846 | return 0; /* no change */ |
1847 | |
1848 | dout("map_request tid %llu pgid %lld.%x osd%d (was osd%d)\n", |
1849 | @@ -1613,14 +1636,17 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) |
1850 | * |
1851 | * Caller should hold map_sem for read. |
1852 | */ |
1853 | -static void kick_requests(struct ceph_osd_client *osdc, int force_resend) |
1854 | +static void kick_requests(struct ceph_osd_client *osdc, bool force_resend, |
1855 | + bool force_resend_writes) |
1856 | { |
1857 | struct ceph_osd_request *req, *nreq; |
1858 | struct rb_node *p; |
1859 | int needmap = 0; |
1860 | int err; |
1861 | + bool force_resend_req; |
1862 | |
1863 | - dout("kick_requests %s\n", force_resend ? " (force resend)" : ""); |
1864 | + dout("kick_requests %s %s\n", force_resend ? " (force resend)" : "", |
1865 | + force_resend_writes ? " (force resend writes)" : ""); |
1866 | mutex_lock(&osdc->request_mutex); |
1867 | for (p = rb_first(&osdc->requests); p; ) { |
1868 | req = rb_entry(p, struct ceph_osd_request, r_node); |
1869 | @@ -1645,7 +1671,10 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) |
1870 | continue; |
1871 | } |
1872 | |
1873 | - err = __map_request(osdc, req, force_resend); |
1874 | + force_resend_req = force_resend || |
1875 | + (force_resend_writes && |
1876 | + req->r_flags & CEPH_OSD_FLAG_WRITE); |
1877 | + err = __map_request(osdc, req, force_resend_req); |
1878 | if (err < 0) |
1879 | continue; /* error */ |
1880 | if (req->r_osd == NULL) { |
1881 | @@ -1665,7 +1694,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) |
1882 | r_linger_item) { |
1883 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); |
1884 | |
1885 | - err = __map_request(osdc, req, force_resend); |
1886 | + err = __map_request(osdc, req, |
1887 | + force_resend || force_resend_writes); |
1888 | dout("__map_request returned %d\n", err); |
1889 | if (err == 0) |
1890 | continue; /* no change and no osd was specified */ |
1891 | @@ -1707,6 +1737,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) |
1892 | struct ceph_osdmap *newmap = NULL, *oldmap; |
1893 | int err; |
1894 | struct ceph_fsid fsid; |
1895 | + bool was_full; |
1896 | |
1897 | dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0); |
1898 | p = msg->front.iov_base; |
1899 | @@ -1720,6 +1751,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) |
1900 | |
1901 | down_write(&osdc->map_sem); |
1902 | |
1903 | + was_full = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL); |
1904 | + |
1905 | /* incremental maps */ |
1906 | ceph_decode_32_safe(&p, end, nr_maps, bad); |
1907 | dout(" %d inc maps\n", nr_maps); |
1908 | @@ -1744,7 +1777,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) |
1909 | ceph_osdmap_destroy(osdc->osdmap); |
1910 | osdc->osdmap = newmap; |
1911 | } |
1912 | - kick_requests(osdc, 0); |
1913 | + was_full = was_full || |
1914 | + ceph_osdmap_flag(osdc->osdmap, |
1915 | + CEPH_OSDMAP_FULL); |
1916 | + kick_requests(osdc, 0, was_full); |
1917 | } else { |
1918 | dout("ignoring incremental map %u len %d\n", |
1919 | epoch, maplen); |
1920 | @@ -1787,7 +1823,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) |
1921 | skipped_map = 1; |
1922 | ceph_osdmap_destroy(oldmap); |
1923 | } |
1924 | - kick_requests(osdc, skipped_map); |
1925 | + was_full = was_full || |
1926 | + ceph_osdmap_flag(osdc->osdmap, |
1927 | + CEPH_OSDMAP_FULL); |
1928 | + kick_requests(osdc, skipped_map, was_full); |
1929 | } |
1930 | p += maplen; |
1931 | nr_maps--; |
1932 | @@ -1804,7 +1843,9 @@ done: |
1933 | * we find out when we are no longer full and stop returning |
1934 | * ENOSPC. |
1935 | */ |
1936 | - if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL)) |
1937 | + if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL) || |
1938 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD) || |
1939 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR)) |
1940 | ceph_monc_request_next_osdmap(&osdc->client->monc); |
1941 | |
1942 | mutex_lock(&osdc->request_mutex); |
1943 | @@ -2454,7 +2495,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con, |
1944 | struct ceph_osd_client *osdc = osd->o_osdc; |
1945 | struct ceph_msg *m; |
1946 | struct ceph_osd_request *req; |
1947 | - int front = le32_to_cpu(hdr->front_len); |
1948 | + int front_len = le32_to_cpu(hdr->front_len); |
1949 | int data_len = le32_to_cpu(hdr->data_len); |
1950 | u64 tid; |
1951 | |
1952 | @@ -2474,12 +2515,13 @@ static struct ceph_msg *get_reply(struct ceph_connection *con, |
1953 | req->r_reply, req->r_reply->con); |
1954 | ceph_msg_revoke_incoming(req->r_reply); |
1955 | |
1956 | - if (front > req->r_reply->front.iov_len) { |
1957 | + if (front_len > req->r_reply->front_alloc_len) { |
1958 | pr_warning("get_reply front %d > preallocated %d (%u#%llu)\n", |
1959 | - front, (int)req->r_reply->front.iov_len, |
1960 | + front_len, req->r_reply->front_alloc_len, |
1961 | (unsigned int)con->peer_name.type, |
1962 | le64_to_cpu(con->peer_name.num)); |
1963 | - m = ceph_msg_new(CEPH_MSG_OSD_OPREPLY, front, GFP_NOFS, false); |
1964 | + m = ceph_msg_new(CEPH_MSG_OSD_OPREPLY, front_len, GFP_NOFS, |
1965 | + false); |
1966 | if (!m) |
1967 | goto out; |
1968 | ceph_msg_put(req->r_reply); |
1969 | diff --git a/scripts/package/builddeb b/scripts/package/builddeb |
1970 | index 90e521fde35f..c1bb9be00fa0 100644 |
1971 | --- a/scripts/package/builddeb |
1972 | +++ b/scripts/package/builddeb |
1973 | @@ -41,9 +41,9 @@ create_package() { |
1974 | parisc*) |
1975 | debarch=hppa ;; |
1976 | mips*) |
1977 | - debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el) ;; |
1978 | + debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; |
1979 | arm*) |
1980 | - debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el) ;; |
1981 | + debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;; |
1982 | *) |
1983 | echo "" >&2 |
1984 | echo "** ** ** WARNING ** ** **" >&2 |
1985 | @@ -62,7 +62,7 @@ create_package() { |
1986 | fi |
1987 | |
1988 | # Create the package |
1989 | - dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" |
1990 | + dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" |
1991 | dpkg --build "$pdir" .. |
1992 | } |
1993 | |
1994 | @@ -288,15 +288,14 @@ mkdir -p "$destdir" |
1995 | (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be |
1996 | ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" |
1997 | rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" |
1998 | -arch=$(dpkg --print-architecture) |
1999 | |
2000 | cat <<EOF >> debian/control |
2001 | |
2002 | Package: $kernel_headers_packagename |
2003 | Provides: linux-headers, linux-headers-2.6 |
2004 | -Architecture: $arch |
2005 | -Description: Linux kernel headers for $KERNELRELEASE on $arch |
2006 | - This package provides kernel header files for $KERNELRELEASE on $arch |
2007 | +Architecture: any |
2008 | +Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} |
2009 | + This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} |
2010 | . |
2011 | This is useful for people who need to build external modules |
2012 | EOF |
2013 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c |
2014 | index d9af6387f37c..dac296a7faad 100644 |
2015 | --- a/sound/core/compress_offload.c |
2016 | +++ b/sound/core/compress_offload.c |
2017 | @@ -133,7 +133,7 @@ static int snd_compr_open(struct inode *inode, struct file *f) |
2018 | kfree(data); |
2019 | } |
2020 | snd_card_unref(compr->card); |
2021 | - return 0; |
2022 | + return ret; |
2023 | } |
2024 | |
2025 | static int snd_compr_free(struct inode *inode, struct file *f) |
2026 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
2027 | index ccf5eb6b3d37..b5c4c2e4360b 100644 |
2028 | --- a/sound/pci/hda/hda_intel.c |
2029 | +++ b/sound/pci/hda/hda_intel.c |
2030 | @@ -4007,6 +4007,9 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { |
2031 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
2032 | { PCI_DEVICE(0x8086, 0x0d0c), |
2033 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
2034 | + /* Broadwell */ |
2035 | + { PCI_DEVICE(0x8086, 0x160c), |
2036 | + .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
2037 | /* 5 Series/3400 */ |
2038 | { PCI_DEVICE(0x8086, 0x3b56), |
2039 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM }, |
2040 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
2041 | index adb374babd18..23e0bc6d6568 100644 |
2042 | --- a/sound/pci/hda/patch_hdmi.c |
2043 | +++ b/sound/pci/hda/patch_hdmi.c |
2044 | @@ -45,6 +45,9 @@ module_param(static_hdmi_pcm, bool, 0644); |
2045 | MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); |
2046 | |
2047 | #define is_haswell(codec) ((codec)->vendor_id == 0x80862807) |
2048 | +#define is_broadwell(codec) ((codec)->vendor_id == 0x80862808) |
2049 | +#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec)) |
2050 | + |
2051 | #define is_valleyview(codec) ((codec)->vendor_id == 0x80862882) |
2052 | |
2053 | struct hdmi_spec_per_cvt { |
2054 | @@ -1014,7 +1017,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, |
2055 | if (!channels) |
2056 | return; |
2057 | |
2058 | - if (is_haswell(codec)) |
2059 | + if (is_haswell_plus(codec)) |
2060 | snd_hda_codec_write(codec, pin_nid, 0, |
2061 | AC_VERB_SET_AMP_GAIN_MUTE, |
2062 | AMP_OUT_UNMUTE); |
2063 | @@ -1196,7 +1199,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid, |
2064 | int pinctl; |
2065 | int new_pinctl = 0; |
2066 | |
2067 | - if (is_haswell(codec)) |
2068 | + if (is_haswell_plus(codec)) |
2069 | haswell_verify_D0(codec, cvt_nid, pin_nid); |
2070 | |
2071 | if (snd_hda_query_pin_caps(codec, pin_nid) & AC_PINCAP_HBR) { |
2072 | @@ -1357,7 +1360,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, |
2073 | mux_idx); |
2074 | |
2075 | /* configure unused pins to choose other converters */ |
2076 | - if (is_haswell(codec) || is_valleyview(codec)) |
2077 | + if (is_haswell_plus(codec) || is_valleyview(codec)) |
2078 | intel_not_share_assigned_cvt(codec, per_pin->pin_nid, mux_idx); |
2079 | |
2080 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); |
2081 | @@ -1543,7 +1546,7 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) |
2082 | if (get_defcfg_connect(config) == AC_JACK_PORT_NONE) |
2083 | return 0; |
2084 | |
2085 | - if (is_haswell(codec)) |
2086 | + if (is_haswell_plus(codec)) |
2087 | intel_haswell_fixup_connect_list(codec, pin_nid); |
2088 | |
2089 | pin_idx = spec->num_pins; |
2090 | @@ -2169,7 +2172,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) |
2091 | codec->spec = spec; |
2092 | hdmi_array_init(spec, 4); |
2093 | |
2094 | - if (is_haswell(codec)) { |
2095 | + if (is_haswell_plus(codec)) { |
2096 | intel_haswell_enable_all_pins(codec, true); |
2097 | intel_haswell_fixup_enable_dp12(codec); |
2098 | } |
2099 | @@ -2180,7 +2183,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) |
2100 | return -EINVAL; |
2101 | } |
2102 | codec->patch_ops = generic_hdmi_patch_ops; |
2103 | - if (is_haswell(codec)) { |
2104 | + if (is_haswell_plus(codec)) { |
2105 | codec->patch_ops.set_power_state = haswell_set_power_state; |
2106 | codec->dp_mst = true; |
2107 | } |
2108 | @@ -2846,6 +2849,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { |
2109 | { .id = 0x80862805, .name = "CougarPoint HDMI", .patch = patch_generic_hdmi }, |
2110 | { .id = 0x80862806, .name = "PantherPoint HDMI", .patch = patch_generic_hdmi }, |
2111 | { .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi }, |
2112 | +{ .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi }, |
2113 | { .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi }, |
2114 | { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, |
2115 | { .id = 0x808629fb, .name = "Crestline HDMI", .patch = patch_generic_hdmi }, |
2116 | @@ -2901,6 +2905,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862804"); |
2117 | MODULE_ALIAS("snd-hda-codec-id:80862805"); |
2118 | MODULE_ALIAS("snd-hda-codec-id:80862806"); |
2119 | MODULE_ALIAS("snd-hda-codec-id:80862807"); |
2120 | +MODULE_ALIAS("snd-hda-codec-id:80862808"); |
2121 | MODULE_ALIAS("snd-hda-codec-id:80862880"); |
2122 | MODULE_ALIAS("snd-hda-codec-id:80862882"); |
2123 | MODULE_ALIAS("snd-hda-codec-id:808629fb"); |
2124 | diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c |
2125 | index 5f728808eed4..8bddf3f20a5e 100644 |
2126 | --- a/sound/soc/codecs/max98090.c |
2127 | +++ b/sound/soc/codecs/max98090.c |
2128 | @@ -336,6 +336,7 @@ static bool max98090_readable_register(struct device *dev, unsigned int reg) |
2129 | case M98090_REG_RECORD_TDM_SLOT: |
2130 | case M98090_REG_SAMPLE_RATE: |
2131 | case M98090_REG_DMIC34_BIQUAD_BASE ... M98090_REG_DMIC34_BIQUAD_BASE + 0x0E: |
2132 | + case M98090_REG_REVISION_ID: |
2133 | return true; |
2134 | default: |
2135 | return false; |