Annotation of /trunk/kernel-alx/patches-4.4/0128-4.4.29-all-fixes.patch
Parent Directory | Revision Log
Revision 2864 -
(hide annotations)
(download)
Mon Mar 27 13:49:08 2017 UTC (7 years, 7 months ago) by niro
File size: 78075 byte(s)
Mon Mar 27 13:49:08 2017 UTC (7 years, 7 months ago) by niro
File size: 78075 byte(s)
linux-4.4.29
1 | niro | 2864 | diff --git a/Documentation/x86/exception-tables.txt b/Documentation/x86/exception-tables.txt |
2 | index 32901aa36f0a..e396bcd8d830 100644 | ||
3 | --- a/Documentation/x86/exception-tables.txt | ||
4 | +++ b/Documentation/x86/exception-tables.txt | ||
5 | @@ -290,3 +290,38 @@ Due to the way that the exception table is built and needs to be ordered, | ||
6 | only use exceptions for code in the .text section. Any other section | ||
7 | will cause the exception table to not be sorted correctly, and the | ||
8 | exceptions will fail. | ||
9 | + | ||
10 | +Things changed when 64-bit support was added to x86 Linux. Rather than | ||
11 | +double the size of the exception table by expanding the two entries | ||
12 | +from 32-bits to 64 bits, a clever trick was used to store addresses | ||
13 | +as relative offsets from the table itself. The assembly code changed | ||
14 | +from: | ||
15 | + .long 1b,3b | ||
16 | +to: | ||
17 | + .long (from) - . | ||
18 | + .long (to) - . | ||
19 | + | ||
20 | +and the C-code that uses these values converts back to absolute addresses | ||
21 | +like this: | ||
22 | + | ||
23 | + ex_insn_addr(const struct exception_table_entry *x) | ||
24 | + { | ||
25 | + return (unsigned long)&x->insn + x->insn; | ||
26 | + } | ||
27 | + | ||
28 | +In v4.6 the exception table entry was expanded with a new field "handler". | ||
29 | +This is also 32-bits wide and contains a third relative function | ||
30 | +pointer which points to one of: | ||
31 | + | ||
32 | +1) int ex_handler_default(const struct exception_table_entry *fixup) | ||
33 | + This is legacy case that just jumps to the fixup code | ||
34 | +2) int ex_handler_fault(const struct exception_table_entry *fixup) | ||
35 | + This case provides the fault number of the trap that occurred at | ||
36 | + entry->insn. It is used to distinguish page faults from machine | ||
37 | + check. | ||
38 | +3) int ex_handler_ext(const struct exception_table_entry *fixup) | ||
39 | + This case is used for uaccess_err ... we need to set a flag | ||
40 | + in the task structure. Before the handler functions existed this | ||
41 | + case was handled by adding a large offset to the fixup to tag | ||
42 | + it as special. | ||
43 | +More functions can easily be added. | ||
44 | diff --git a/Makefile b/Makefile | ||
45 | index 391294301aaf..19d7d9f68e35 100644 | ||
46 | --- a/Makefile | ||
47 | +++ b/Makefile | ||
48 | @@ -1,6 +1,6 @@ | ||
49 | VERSION = 4 | ||
50 | PATCHLEVEL = 4 | ||
51 | -SUBLEVEL = 28 | ||
52 | +SUBLEVEL = 29 | ||
53 | EXTRAVERSION = | ||
54 | NAME = Blurry Fish Butt | ||
55 | |||
56 | diff --git a/arch/arm/crypto/ghash-ce-glue.c b/arch/arm/crypto/ghash-ce-glue.c | ||
57 | index 03a39fe29246..9d9ba9acdddc 100644 | ||
58 | --- a/arch/arm/crypto/ghash-ce-glue.c | ||
59 | +++ b/arch/arm/crypto/ghash-ce-glue.c | ||
60 | @@ -226,6 +226,27 @@ static int ghash_async_digest(struct ahash_request *req) | ||
61 | } | ||
62 | } | ||
63 | |||
64 | +static int ghash_async_import(struct ahash_request *req, const void *in) | ||
65 | +{ | ||
66 | + struct ahash_request *cryptd_req = ahash_request_ctx(req); | ||
67 | + struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | ||
68 | + struct ghash_async_ctx *ctx = crypto_ahash_ctx(tfm); | ||
69 | + struct shash_desc *desc = cryptd_shash_desc(cryptd_req); | ||
70 | + | ||
71 | + desc->tfm = cryptd_ahash_child(ctx->cryptd_tfm); | ||
72 | + desc->flags = req->base.flags; | ||
73 | + | ||
74 | + return crypto_shash_import(desc, in); | ||
75 | +} | ||
76 | + | ||
77 | +static int ghash_async_export(struct ahash_request *req, void *out) | ||
78 | +{ | ||
79 | + struct ahash_request *cryptd_req = ahash_request_ctx(req); | ||
80 | + struct shash_desc *desc = cryptd_shash_desc(cryptd_req); | ||
81 | + | ||
82 | + return crypto_shash_export(desc, out); | ||
83 | +} | ||
84 | + | ||
85 | static int ghash_async_setkey(struct crypto_ahash *tfm, const u8 *key, | ||
86 | unsigned int keylen) | ||
87 | { | ||
88 | @@ -274,7 +295,10 @@ static struct ahash_alg ghash_async_alg = { | ||
89 | .final = ghash_async_final, | ||
90 | .setkey = ghash_async_setkey, | ||
91 | .digest = ghash_async_digest, | ||
92 | + .import = ghash_async_import, | ||
93 | + .export = ghash_async_export, | ||
94 | .halg.digestsize = GHASH_DIGEST_SIZE, | ||
95 | + .halg.statesize = sizeof(struct ghash_desc_ctx), | ||
96 | .halg.base = { | ||
97 | .cra_name = "ghash", | ||
98 | .cra_driver_name = "ghash-ce", | ||
99 | diff --git a/arch/arm/mach-pxa/pxa_cplds_irqs.c b/arch/arm/mach-pxa/pxa_cplds_irqs.c | ||
100 | index 2385052b0ce1..e362f865fcd2 100644 | ||
101 | --- a/arch/arm/mach-pxa/pxa_cplds_irqs.c | ||
102 | +++ b/arch/arm/mach-pxa/pxa_cplds_irqs.c | ||
103 | @@ -41,30 +41,35 @@ static irqreturn_t cplds_irq_handler(int in_irq, void *d) | ||
104 | unsigned long pending; | ||
105 | unsigned int bit; | ||
106 | |||
107 | - pending = readl(fpga->base + FPGA_IRQ_SET_CLR) & fpga->irq_mask; | ||
108 | - for_each_set_bit(bit, &pending, CPLDS_NB_IRQ) | ||
109 | - generic_handle_irq(irq_find_mapping(fpga->irqdomain, bit)); | ||
110 | + do { | ||
111 | + pending = readl(fpga->base + FPGA_IRQ_SET_CLR) & fpga->irq_mask; | ||
112 | + for_each_set_bit(bit, &pending, CPLDS_NB_IRQ) { | ||
113 | + generic_handle_irq(irq_find_mapping(fpga->irqdomain, | ||
114 | + bit)); | ||
115 | + } | ||
116 | + } while (pending); | ||
117 | |||
118 | return IRQ_HANDLED; | ||
119 | } | ||
120 | |||
121 | -static void cplds_irq_mask_ack(struct irq_data *d) | ||
122 | +static void cplds_irq_mask(struct irq_data *d) | ||
123 | { | ||
124 | struct cplds *fpga = irq_data_get_irq_chip_data(d); | ||
125 | unsigned int cplds_irq = irqd_to_hwirq(d); | ||
126 | - unsigned int set, bit = BIT(cplds_irq); | ||
127 | + unsigned int bit = BIT(cplds_irq); | ||
128 | |||
129 | fpga->irq_mask &= ~bit; | ||
130 | writel(fpga->irq_mask, fpga->base + FPGA_IRQ_MASK_EN); | ||
131 | - set = readl(fpga->base + FPGA_IRQ_SET_CLR); | ||
132 | - writel(set & ~bit, fpga->base + FPGA_IRQ_SET_CLR); | ||
133 | } | ||
134 | |||
135 | static void cplds_irq_unmask(struct irq_data *d) | ||
136 | { | ||
137 | struct cplds *fpga = irq_data_get_irq_chip_data(d); | ||
138 | unsigned int cplds_irq = irqd_to_hwirq(d); | ||
139 | - unsigned int bit = BIT(cplds_irq); | ||
140 | + unsigned int set, bit = BIT(cplds_irq); | ||
141 | + | ||
142 | + set = readl(fpga->base + FPGA_IRQ_SET_CLR); | ||
143 | + writel(set & ~bit, fpga->base + FPGA_IRQ_SET_CLR); | ||
144 | |||
145 | fpga->irq_mask |= bit; | ||
146 | writel(fpga->irq_mask, fpga->base + FPGA_IRQ_MASK_EN); | ||
147 | @@ -72,7 +77,8 @@ static void cplds_irq_unmask(struct irq_data *d) | ||
148 | |||
149 | static struct irq_chip cplds_irq_chip = { | ||
150 | .name = "pxa_cplds", | ||
151 | - .irq_mask_ack = cplds_irq_mask_ack, | ||
152 | + .irq_ack = cplds_irq_mask, | ||
153 | + .irq_mask = cplds_irq_mask, | ||
154 | .irq_unmask = cplds_irq_unmask, | ||
155 | .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, | ||
156 | }; | ||
157 | diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c | ||
158 | index 247a0dc012f1..c07bfb52275e 100644 | ||
159 | --- a/arch/powerpc/kernel/eeh_driver.c | ||
160 | +++ b/arch/powerpc/kernel/eeh_driver.c | ||
161 | @@ -909,6 +909,14 @@ static void eeh_handle_special_event(void) | ||
162 | /* Notify all devices to be down */ | ||
163 | eeh_pe_state_clear(pe, EEH_PE_PRI_BUS); | ||
164 | bus = eeh_pe_bus_get(phb_pe); | ||
165 | + if (!bus) { | ||
166 | + pr_err("%s: Cannot find PCI bus for " | ||
167 | + "PHB#%d-PE#%x\n", | ||
168 | + __func__, | ||
169 | + pe->phb->global_number, | ||
170 | + pe->addr); | ||
171 | + break; | ||
172 | + } | ||
173 | eeh_pe_dev_traverse(pe, | ||
174 | eeh_report_failure, NULL); | ||
175 | pcibios_remove_pci_devices(bus); | ||
176 | diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c | ||
177 | index 32e26526f7e4..1eb698f653b4 100644 | ||
178 | --- a/arch/powerpc/kernel/nvram_64.c | ||
179 | +++ b/arch/powerpc/kernel/nvram_64.c | ||
180 | @@ -969,7 +969,7 @@ int __init nvram_remove_partition(const char *name, int sig, | ||
181 | |||
182 | /* Make partition a free partition */ | ||
183 | part->header.signature = NVRAM_SIG_FREE; | ||
184 | - strncpy(part->header.name, "wwwwwwwwwwww", 12); | ||
185 | + memset(part->header.name, 'w', 12); | ||
186 | part->header.checksum = nvram_checksum(&part->header); | ||
187 | rc = nvram_write_header(part); | ||
188 | if (rc <= 0) { | ||
189 | @@ -987,8 +987,8 @@ int __init nvram_remove_partition(const char *name, int sig, | ||
190 | } | ||
191 | if (prev) { | ||
192 | prev->header.length += part->header.length; | ||
193 | - prev->header.checksum = nvram_checksum(&part->header); | ||
194 | - rc = nvram_write_header(part); | ||
195 | + prev->header.checksum = nvram_checksum(&prev->header); | ||
196 | + rc = nvram_write_header(prev); | ||
197 | if (rc <= 0) { | ||
198 | printk(KERN_ERR "nvram_remove_partition: nvram_write failed (%d)\n", rc); | ||
199 | return rc; | ||
200 | diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c | ||
201 | index ba0cae69a396..92736851c795 100644 | ||
202 | --- a/arch/powerpc/platforms/powernv/eeh-powernv.c | ||
203 | +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c | ||
204 | @@ -956,6 +956,11 @@ static int pnv_eeh_reset(struct eeh_pe *pe, int option) | ||
205 | } | ||
206 | |||
207 | bus = eeh_pe_bus_get(pe); | ||
208 | + if (!bus) { | ||
209 | + pr_err("%s: Cannot find PCI bus for PHB#%d-PE#%x\n", | ||
210 | + __func__, pe->phb->global_number, pe->addr); | ||
211 | + return -EIO; | ||
212 | + } | ||
213 | if (pci_is_root_bus(bus) || | ||
214 | pci_is_root_bus(bus->parent)) | ||
215 | ret = pnv_eeh_root_reset(hose, option); | ||
216 | diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h | ||
217 | index 189679aba703..f5063b6659eb 100644 | ||
218 | --- a/arch/x86/include/asm/asm.h | ||
219 | +++ b/arch/x86/include/asm/asm.h | ||
220 | @@ -44,19 +44,22 @@ | ||
221 | |||
222 | /* Exception table entry */ | ||
223 | #ifdef __ASSEMBLY__ | ||
224 | -# define _ASM_EXTABLE(from,to) \ | ||
225 | +# define _ASM_EXTABLE_HANDLE(from, to, handler) \ | ||
226 | .pushsection "__ex_table","a" ; \ | ||
227 | - .balign 8 ; \ | ||
228 | + .balign 4 ; \ | ||
229 | .long (from) - . ; \ | ||
230 | .long (to) - . ; \ | ||
231 | + .long (handler) - . ; \ | ||
232 | .popsection | ||
233 | |||
234 | -# define _ASM_EXTABLE_EX(from,to) \ | ||
235 | - .pushsection "__ex_table","a" ; \ | ||
236 | - .balign 8 ; \ | ||
237 | - .long (from) - . ; \ | ||
238 | - .long (to) - . + 0x7ffffff0 ; \ | ||
239 | - .popsection | ||
240 | +# define _ASM_EXTABLE(from, to) \ | ||
241 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) | ||
242 | + | ||
243 | +# define _ASM_EXTABLE_FAULT(from, to) \ | ||
244 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) | ||
245 | + | ||
246 | +# define _ASM_EXTABLE_EX(from, to) \ | ||
247 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext) | ||
248 | |||
249 | # define _ASM_NOKPROBE(entry) \ | ||
250 | .pushsection "_kprobe_blacklist","aw" ; \ | ||
251 | @@ -89,19 +92,24 @@ | ||
252 | .endm | ||
253 | |||
254 | #else | ||
255 | -# define _ASM_EXTABLE(from,to) \ | ||
256 | +# define _EXPAND_EXTABLE_HANDLE(x) #x | ||
257 | +# define _ASM_EXTABLE_HANDLE(from, to, handler) \ | ||
258 | " .pushsection \"__ex_table\",\"a\"\n" \ | ||
259 | - " .balign 8\n" \ | ||
260 | + " .balign 4\n" \ | ||
261 | " .long (" #from ") - .\n" \ | ||
262 | " .long (" #to ") - .\n" \ | ||
263 | + " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n" \ | ||
264 | " .popsection\n" | ||
265 | |||
266 | -# define _ASM_EXTABLE_EX(from,to) \ | ||
267 | - " .pushsection \"__ex_table\",\"a\"\n" \ | ||
268 | - " .balign 8\n" \ | ||
269 | - " .long (" #from ") - .\n" \ | ||
270 | - " .long (" #to ") - . + 0x7ffffff0\n" \ | ||
271 | - " .popsection\n" | ||
272 | +# define _ASM_EXTABLE(from, to) \ | ||
273 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) | ||
274 | + | ||
275 | +# define _ASM_EXTABLE_FAULT(from, to) \ | ||
276 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) | ||
277 | + | ||
278 | +# define _ASM_EXTABLE_EX(from, to) \ | ||
279 | + _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext) | ||
280 | + | ||
281 | /* For C file, we already have NOKPROBE_SYMBOL macro */ | ||
282 | #endif | ||
283 | |||
284 | diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h | ||
285 | index d42252ce9b4d..3794c7331cfc 100644 | ||
286 | --- a/arch/x86/include/asm/uaccess.h | ||
287 | +++ b/arch/x86/include/asm/uaccess.h | ||
288 | @@ -90,12 +90,11 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un | ||
289 | likely(!__range_not_ok(addr, size, user_addr_max())) | ||
290 | |||
291 | /* | ||
292 | - * The exception table consists of pairs of addresses relative to the | ||
293 | - * exception table enty itself: the first is the address of an | ||
294 | - * instruction that is allowed to fault, and the second is the address | ||
295 | - * at which the program should continue. No registers are modified, | ||
296 | - * so it is entirely up to the continuation code to figure out what to | ||
297 | - * do. | ||
298 | + * The exception table consists of triples of addresses relative to the | ||
299 | + * exception table entry itself. The first address is of an instruction | ||
300 | + * that is allowed to fault, the second is the target at which the program | ||
301 | + * should continue. The third is a handler function to deal with the fault | ||
302 | + * caused by the instruction in the first field. | ||
303 | * | ||
304 | * All the routines below use bits of fixup code that are out of line | ||
305 | * with the main instruction path. This means when everything is well, | ||
306 | @@ -104,13 +103,14 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un | ||
307 | */ | ||
308 | |||
309 | struct exception_table_entry { | ||
310 | - int insn, fixup; | ||
311 | + int insn, fixup, handler; | ||
312 | }; | ||
313 | /* This is not the generic standard exception_table_entry format */ | ||
314 | #define ARCH_HAS_SORT_EXTABLE | ||
315 | #define ARCH_HAS_SEARCH_EXTABLE | ||
316 | |||
317 | -extern int fixup_exception(struct pt_regs *regs); | ||
318 | +extern int fixup_exception(struct pt_regs *regs, int trapnr); | ||
319 | +extern bool ex_has_fault_handler(unsigned long ip); | ||
320 | extern int early_fixup_exception(unsigned long *ip); | ||
321 | |||
322 | /* | ||
323 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c | ||
324 | index 9fdf1d330727..a257d6077d1b 100644 | ||
325 | --- a/arch/x86/kernel/early-quirks.c | ||
326 | +++ b/arch/x86/kernel/early-quirks.c | ||
327 | @@ -331,12 +331,11 @@ static u32 __init i85x_stolen_base(int num, int slot, int func, size_t stolen_si | ||
328 | |||
329 | static u32 __init i865_stolen_base(int num, int slot, int func, size_t stolen_size) | ||
330 | { | ||
331 | - /* | ||
332 | - * FIXME is the graphics stolen memory region | ||
333 | - * always at TOUD? Ie. is it always the last | ||
334 | - * one to be allocated by the BIOS? | ||
335 | - */ | ||
336 | - return read_pci_config_16(0, 0, 0, I865_TOUD) << 16; | ||
337 | + u16 toud = 0; | ||
338 | + | ||
339 | + toud = read_pci_config_16(0, 0, 0, I865_TOUD); | ||
340 | + | ||
341 | + return (phys_addr_t)(toud << 16) + i845_tseg_size(); | ||
342 | } | ||
343 | |||
344 | static size_t __init i830_stolen_size(int num, int slot, int func) | ||
345 | diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c | ||
346 | index 023c442c33bb..e1d1f6cbaf11 100644 | ||
347 | --- a/arch/x86/kernel/kprobes/core.c | ||
348 | +++ b/arch/x86/kernel/kprobes/core.c | ||
349 | @@ -1000,7 +1000,7 @@ int kprobe_fault_handler(struct pt_regs *regs, int trapnr) | ||
350 | * In case the user-specified fault handler returned | ||
351 | * zero, try to fix up. | ||
352 | */ | ||
353 | - if (fixup_exception(regs)) | ||
354 | + if (fixup_exception(regs, trapnr)) | ||
355 | return 1; | ||
356 | |||
357 | /* | ||
358 | diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c | ||
359 | index 679302c312f8..5621f882645e 100644 | ||
360 | --- a/arch/x86/kernel/traps.c | ||
361 | +++ b/arch/x86/kernel/traps.c | ||
362 | @@ -199,7 +199,7 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, | ||
363 | } | ||
364 | |||
365 | if (!user_mode(regs)) { | ||
366 | - if (!fixup_exception(regs)) { | ||
367 | + if (!fixup_exception(regs, trapnr)) { | ||
368 | tsk->thread.error_code = error_code; | ||
369 | tsk->thread.trap_nr = trapnr; | ||
370 | die(str, regs, error_code); | ||
371 | @@ -453,7 +453,7 @@ do_general_protection(struct pt_regs *regs, long error_code) | ||
372 | |||
373 | tsk = current; | ||
374 | if (!user_mode(regs)) { | ||
375 | - if (fixup_exception(regs)) | ||
376 | + if (fixup_exception(regs, X86_TRAP_GP)) | ||
377 | return; | ||
378 | |||
379 | tsk->thread.error_code = error_code; | ||
380 | @@ -699,7 +699,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) | ||
381 | conditional_sti(regs); | ||
382 | |||
383 | if (!user_mode(regs)) { | ||
384 | - if (!fixup_exception(regs)) { | ||
385 | + if (!fixup_exception(regs, trapnr)) { | ||
386 | task->thread.error_code = error_code; | ||
387 | task->thread.trap_nr = trapnr; | ||
388 | die(str, regs, error_code); | ||
389 | diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c | ||
390 | index 903ec1e9c326..9dd7e4b7fcde 100644 | ||
391 | --- a/arch/x86/mm/extable.c | ||
392 | +++ b/arch/x86/mm/extable.c | ||
393 | @@ -3,6 +3,9 @@ | ||
394 | #include <linux/sort.h> | ||
395 | #include <asm/uaccess.h> | ||
396 | |||
397 | +typedef bool (*ex_handler_t)(const struct exception_table_entry *, | ||
398 | + struct pt_regs *, int); | ||
399 | + | ||
400 | static inline unsigned long | ||
401 | ex_insn_addr(const struct exception_table_entry *x) | ||
402 | { | ||
403 | @@ -13,11 +16,56 @@ ex_fixup_addr(const struct exception_table_entry *x) | ||
404 | { | ||
405 | return (unsigned long)&x->fixup + x->fixup; | ||
406 | } | ||
407 | +static inline ex_handler_t | ||
408 | +ex_fixup_handler(const struct exception_table_entry *x) | ||
409 | +{ | ||
410 | + return (ex_handler_t)((unsigned long)&x->handler + x->handler); | ||
411 | +} | ||
412 | |||
413 | -int fixup_exception(struct pt_regs *regs) | ||
414 | +bool ex_handler_default(const struct exception_table_entry *fixup, | ||
415 | + struct pt_regs *regs, int trapnr) | ||
416 | { | ||
417 | - const struct exception_table_entry *fixup; | ||
418 | - unsigned long new_ip; | ||
419 | + regs->ip = ex_fixup_addr(fixup); | ||
420 | + return true; | ||
421 | +} | ||
422 | +EXPORT_SYMBOL(ex_handler_default); | ||
423 | + | ||
424 | +bool ex_handler_fault(const struct exception_table_entry *fixup, | ||
425 | + struct pt_regs *regs, int trapnr) | ||
426 | +{ | ||
427 | + regs->ip = ex_fixup_addr(fixup); | ||
428 | + regs->ax = trapnr; | ||
429 | + return true; | ||
430 | +} | ||
431 | +EXPORT_SYMBOL_GPL(ex_handler_fault); | ||
432 | + | ||
433 | +bool ex_handler_ext(const struct exception_table_entry *fixup, | ||
434 | + struct pt_regs *regs, int trapnr) | ||
435 | +{ | ||
436 | + /* Special hack for uaccess_err */ | ||
437 | + current_thread_info()->uaccess_err = 1; | ||
438 | + regs->ip = ex_fixup_addr(fixup); | ||
439 | + return true; | ||
440 | +} | ||
441 | +EXPORT_SYMBOL(ex_handler_ext); | ||
442 | + | ||
443 | +bool ex_has_fault_handler(unsigned long ip) | ||
444 | +{ | ||
445 | + const struct exception_table_entry *e; | ||
446 | + ex_handler_t handler; | ||
447 | + | ||
448 | + e = search_exception_tables(ip); | ||
449 | + if (!e) | ||
450 | + return false; | ||
451 | + handler = ex_fixup_handler(e); | ||
452 | + | ||
453 | + return handler == ex_handler_fault; | ||
454 | +} | ||
455 | + | ||
456 | +int fixup_exception(struct pt_regs *regs, int trapnr) | ||
457 | +{ | ||
458 | + const struct exception_table_entry *e; | ||
459 | + ex_handler_t handler; | ||
460 | |||
461 | #ifdef CONFIG_PNPBIOS | ||
462 | if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) { | ||
463 | @@ -33,42 +81,34 @@ int fixup_exception(struct pt_regs *regs) | ||
464 | } | ||
465 | #endif | ||
466 | |||
467 | - fixup = search_exception_tables(regs->ip); | ||
468 | - if (fixup) { | ||
469 | - new_ip = ex_fixup_addr(fixup); | ||
470 | - | ||
471 | - if (fixup->fixup - fixup->insn >= 0x7ffffff0 - 4) { | ||
472 | - /* Special hack for uaccess_err */ | ||
473 | - current_thread_info()->uaccess_err = 1; | ||
474 | - new_ip -= 0x7ffffff0; | ||
475 | - } | ||
476 | - regs->ip = new_ip; | ||
477 | - return 1; | ||
478 | - } | ||
479 | + e = search_exception_tables(regs->ip); | ||
480 | + if (!e) | ||
481 | + return 0; | ||
482 | |||
483 | - return 0; | ||
484 | + handler = ex_fixup_handler(e); | ||
485 | + return handler(e, regs, trapnr); | ||
486 | } | ||
487 | |||
488 | /* Restricted version used during very early boot */ | ||
489 | int __init early_fixup_exception(unsigned long *ip) | ||
490 | { | ||
491 | - const struct exception_table_entry *fixup; | ||
492 | + const struct exception_table_entry *e; | ||
493 | unsigned long new_ip; | ||
494 | + ex_handler_t handler; | ||
495 | |||
496 | - fixup = search_exception_tables(*ip); | ||
497 | - if (fixup) { | ||
498 | - new_ip = ex_fixup_addr(fixup); | ||
499 | + e = search_exception_tables(*ip); | ||
500 | + if (!e) | ||
501 | + return 0; | ||
502 | |||
503 | - if (fixup->fixup - fixup->insn >= 0x7ffffff0 - 4) { | ||
504 | - /* uaccess handling not supported during early boot */ | ||
505 | - return 0; | ||
506 | - } | ||
507 | + new_ip = ex_fixup_addr(e); | ||
508 | + handler = ex_fixup_handler(e); | ||
509 | |||
510 | - *ip = new_ip; | ||
511 | - return 1; | ||
512 | - } | ||
513 | + /* special handling not supported during early boot */ | ||
514 | + if (handler != ex_handler_default) | ||
515 | + return 0; | ||
516 | |||
517 | - return 0; | ||
518 | + *ip = new_ip; | ||
519 | + return 1; | ||
520 | } | ||
521 | |||
522 | /* | ||
523 | @@ -133,6 +173,8 @@ void sort_extable(struct exception_table_entry *start, | ||
524 | i += 4; | ||
525 | p->fixup += i; | ||
526 | i += 4; | ||
527 | + p->handler += i; | ||
528 | + i += 4; | ||
529 | } | ||
530 | |||
531 | sort(start, finish - start, sizeof(struct exception_table_entry), | ||
532 | @@ -145,6 +187,8 @@ void sort_extable(struct exception_table_entry *start, | ||
533 | i += 4; | ||
534 | p->fixup -= i; | ||
535 | i += 4; | ||
536 | + p->handler -= i; | ||
537 | + i += 4; | ||
538 | } | ||
539 | } | ||
540 | |||
541 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c | ||
542 | index e830c71a1323..03898aea6e0f 100644 | ||
543 | --- a/arch/x86/mm/fault.c | ||
544 | +++ b/arch/x86/mm/fault.c | ||
545 | @@ -663,7 +663,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, | ||
546 | int sig; | ||
547 | |||
548 | /* Are we prepared to handle this kernel fault? */ | ||
549 | - if (fixup_exception(regs)) { | ||
550 | + if (fixup_exception(regs, X86_TRAP_PF)) { | ||
551 | /* | ||
552 | * Any interrupt that takes a fault gets the fixup. This makes | ||
553 | * the below recursive fault logic only apply to a faults from | ||
554 | diff --git a/crypto/gcm.c b/crypto/gcm.c | ||
555 | index d9ea5f9c0574..1238b3c5a321 100644 | ||
556 | --- a/crypto/gcm.c | ||
557 | +++ b/crypto/gcm.c | ||
558 | @@ -117,7 +117,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, | ||
559 | struct crypto_ablkcipher *ctr = ctx->ctr; | ||
560 | struct { | ||
561 | be128 hash; | ||
562 | - u8 iv[8]; | ||
563 | + u8 iv[16]; | ||
564 | |||
565 | struct crypto_gcm_setkey_result result; | ||
566 | |||
567 | diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c | ||
568 | index 01d4be2c354b..f5c26a5f6875 100644 | ||
569 | --- a/drivers/char/hw_random/omap-rng.c | ||
570 | +++ b/drivers/char/hw_random/omap-rng.c | ||
571 | @@ -385,7 +385,7 @@ static int omap_rng_probe(struct platform_device *pdev) | ||
572 | |||
573 | pm_runtime_enable(&pdev->dev); | ||
574 | ret = pm_runtime_get_sync(&pdev->dev); | ||
575 | - if (ret) { | ||
576 | + if (ret < 0) { | ||
577 | dev_err(&pdev->dev, "Failed to runtime_get device: %d\n", ret); | ||
578 | pm_runtime_put_noidle(&pdev->dev); | ||
579 | goto err_ioremap; | ||
580 | @@ -443,7 +443,7 @@ static int __maybe_unused omap_rng_resume(struct device *dev) | ||
581 | int ret; | ||
582 | |||
583 | ret = pm_runtime_get_sync(dev); | ||
584 | - if (ret) { | ||
585 | + if (ret < 0) { | ||
586 | dev_err(dev, "Failed to runtime_get device: %d\n", ret); | ||
587 | pm_runtime_put_noidle(dev); | ||
588 | return ret; | ||
589 | diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c | ||
590 | index bbf206e3da0d..ac9582de64a5 100644 | ||
591 | --- a/drivers/clk/clk-divider.c | ||
592 | +++ b/drivers/clk/clk-divider.c | ||
593 | @@ -354,7 +354,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate, | ||
594 | |||
595 | /* if read only, just return current value */ | ||
596 | if (divider->flags & CLK_DIVIDER_READ_ONLY) { | ||
597 | - bestdiv = readl(divider->reg) >> divider->shift; | ||
598 | + bestdiv = clk_readl(divider->reg) >> divider->shift; | ||
599 | bestdiv &= div_mask(divider->width); | ||
600 | bestdiv = _get_div(divider->table, bestdiv, divider->flags, | ||
601 | divider->width); | ||
602 | diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c | ||
603 | index 7bc1c4527ae4..8b77abb6bc22 100644 | ||
604 | --- a/drivers/clk/clk-qoriq.c | ||
605 | +++ b/drivers/clk/clk-qoriq.c | ||
606 | @@ -766,7 +766,11 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx) | ||
607 | if (!hwc) | ||
608 | return NULL; | ||
609 | |||
610 | - hwc->reg = cg->regs + 0x20 * idx; | ||
611 | + if (cg->info.flags & CG_VER3) | ||
612 | + hwc->reg = cg->regs + 0x70000 + 0x20 * idx; | ||
613 | + else | ||
614 | + hwc->reg = cg->regs + 0x20 * idx; | ||
615 | + | ||
616 | hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]]; | ||
617 | |||
618 | /* | ||
619 | diff --git a/drivers/clk/imx/clk-imx35.c b/drivers/clk/imx/clk-imx35.c | ||
620 | index b0978d3b83e2..d302ed3b8225 100644 | ||
621 | --- a/drivers/clk/imx/clk-imx35.c | ||
622 | +++ b/drivers/clk/imx/clk-imx35.c | ||
623 | @@ -115,7 +115,7 @@ static void __init _mx35_clocks_init(void) | ||
624 | } | ||
625 | |||
626 | clk[ckih] = imx_clk_fixed("ckih", 24000000); | ||
627 | - clk[ckil] = imx_clk_fixed("ckih", 32768); | ||
628 | + clk[ckil] = imx_clk_fixed("ckil", 32768); | ||
629 | clk[mpll] = imx_clk_pllv1(IMX_PLLV1_IMX35, "mpll", "ckih", base + MX35_CCM_MPCTL); | ||
630 | clk[ppll] = imx_clk_pllv1(IMX_PLLV1_IMX35, "ppll", "ckih", base + MX35_CCM_PPCTL); | ||
631 | |||
632 | diff --git a/drivers/dma/ipu/ipu_irq.c b/drivers/dma/ipu/ipu_irq.c | ||
633 | index 2bf37e68ad0f..dd184b50e5b4 100644 | ||
634 | --- a/drivers/dma/ipu/ipu_irq.c | ||
635 | +++ b/drivers/dma/ipu/ipu_irq.c | ||
636 | @@ -286,22 +286,21 @@ static void ipu_irq_handler(struct irq_desc *desc) | ||
637 | raw_spin_unlock(&bank_lock); | ||
638 | while ((line = ffs(status))) { | ||
639 | struct ipu_irq_map *map; | ||
640 | - unsigned int irq = NO_IRQ; | ||
641 | + unsigned int irq; | ||
642 | |||
643 | line--; | ||
644 | status &= ~(1UL << line); | ||
645 | |||
646 | raw_spin_lock(&bank_lock); | ||
647 | map = src2map(32 * i + line); | ||
648 | - if (map) | ||
649 | - irq = map->irq; | ||
650 | - raw_spin_unlock(&bank_lock); | ||
651 | - | ||
652 | if (!map) { | ||
653 | + raw_spin_unlock(&bank_lock); | ||
654 | pr_err("IPU: Interrupt on unmapped source %u bank %d\n", | ||
655 | line, i); | ||
656 | continue; | ||
657 | } | ||
658 | + irq = map->irq; | ||
659 | + raw_spin_unlock(&bank_lock); | ||
660 | generic_handle_irq(irq); | ||
661 | } | ||
662 | } | ||
663 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | ||
664 | index fe36caf1b7d7..14f57d9915e3 100644 | ||
665 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | ||
666 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | ||
667 | @@ -113,24 +113,26 @@ void amdgpu_dpm_print_ps_status(struct amdgpu_device *adev, | ||
668 | printk("\n"); | ||
669 | } | ||
670 | |||
671 | + | ||
672 | u32 amdgpu_dpm_get_vblank_time(struct amdgpu_device *adev) | ||
673 | { | ||
674 | struct drm_device *dev = adev->ddev; | ||
675 | struct drm_crtc *crtc; | ||
676 | struct amdgpu_crtc *amdgpu_crtc; | ||
677 | - u32 line_time_us, vblank_lines; | ||
678 | + u32 vblank_in_pixels; | ||
679 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ | ||
680 | |||
681 | if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) { | ||
682 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
683 | amdgpu_crtc = to_amdgpu_crtc(crtc); | ||
684 | if (crtc->enabled && amdgpu_crtc->enabled && amdgpu_crtc->hw_mode.clock) { | ||
685 | - line_time_us = (amdgpu_crtc->hw_mode.crtc_htotal * 1000) / | ||
686 | - amdgpu_crtc->hw_mode.clock; | ||
687 | - vblank_lines = amdgpu_crtc->hw_mode.crtc_vblank_end - | ||
688 | + vblank_in_pixels = | ||
689 | + amdgpu_crtc->hw_mode.crtc_htotal * | ||
690 | + (amdgpu_crtc->hw_mode.crtc_vblank_end - | ||
691 | amdgpu_crtc->hw_mode.crtc_vdisplay + | ||
692 | - (amdgpu_crtc->v_border * 2); | ||
693 | - vblank_time_us = vblank_lines * line_time_us; | ||
694 | + (amdgpu_crtc->v_border * 2)); | ||
695 | + | ||
696 | + vblank_time_us = vblank_in_pixels * 1000 / amdgpu_crtc->hw_mode.clock; | ||
697 | break; | ||
698 | } | ||
699 | } | ||
700 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | ||
701 | index 4488e82f87b0..a5c824078472 100644 | ||
702 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | ||
703 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | ||
704 | @@ -227,7 +227,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | ||
705 | type = AMD_IP_BLOCK_TYPE_UVD; | ||
706 | ring_mask = adev->uvd.ring.ready ? 1 : 0; | ||
707 | ib_start_alignment = AMDGPU_GPU_PAGE_SIZE; | ||
708 | - ib_size_alignment = 8; | ||
709 | + ib_size_alignment = 16; | ||
710 | break; | ||
711 | case AMDGPU_HW_IP_VCE: | ||
712 | type = AMD_IP_BLOCK_TYPE_VCE; | ||
713 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | ||
714 | index 4dcc8fba5792..5b261adb4b69 100644 | ||
715 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | ||
716 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | ||
717 | @@ -419,16 +419,6 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev) | ||
718 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
719 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); | ||
720 | |||
721 | - if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
722 | - connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
723 | - /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
724 | - * aux dp channel on imac and help (but not completely fix) | ||
725 | - * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
726 | - * also avoid interrupt storms during dpms. | ||
727 | - */ | ||
728 | - continue; | ||
729 | - } | ||
730 | - | ||
731 | switch (amdgpu_connector->hpd.hpd) { | ||
732 | case AMDGPU_HPD_1: | ||
733 | idx = 0; | ||
734 | @@ -452,6 +442,19 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev) | ||
735 | continue; | ||
736 | } | ||
737 | |||
738 | + if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
739 | + connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
740 | + /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
741 | + * aux dp channel on imac and help (but not completely fix) | ||
742 | + * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
743 | + * also avoid interrupt storms during dpms. | ||
744 | + */ | ||
745 | + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); | ||
746 | + tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0); | ||
747 | + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); | ||
748 | + continue; | ||
749 | + } | ||
750 | + | ||
751 | tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); | ||
752 | tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); | ||
753 | WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); | ||
754 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | ||
755 | index 8f1e51128b33..c161eeda417b 100644 | ||
756 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | ||
757 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | ||
758 | @@ -409,16 +409,6 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev) | ||
759 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
760 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); | ||
761 | |||
762 | - if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
763 | - connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
764 | - /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
765 | - * aux dp channel on imac and help (but not completely fix) | ||
766 | - * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
767 | - * also avoid interrupt storms during dpms. | ||
768 | - */ | ||
769 | - continue; | ||
770 | - } | ||
771 | - | ||
772 | switch (amdgpu_connector->hpd.hpd) { | ||
773 | case AMDGPU_HPD_1: | ||
774 | idx = 0; | ||
775 | @@ -442,6 +432,19 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev) | ||
776 | continue; | ||
777 | } | ||
778 | |||
779 | + if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
780 | + connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
781 | + /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
782 | + * aux dp channel on imac and help (but not completely fix) | ||
783 | + * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
784 | + * also avoid interrupt storms during dpms. | ||
785 | + */ | ||
786 | + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); | ||
787 | + tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0); | ||
788 | + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); | ||
789 | + continue; | ||
790 | + } | ||
791 | + | ||
792 | tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); | ||
793 | tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); | ||
794 | WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); | ||
795 | @@ -3030,6 +3033,7 @@ static int dce_v11_0_sw_fini(void *handle) | ||
796 | |||
797 | dce_v11_0_afmt_fini(adev); | ||
798 | |||
799 | + drm_mode_config_cleanup(adev->ddev); | ||
800 | adev->mode_info.mode_config_initialized = false; | ||
801 | |||
802 | return 0; | ||
803 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | ||
804 | index 42d954dc436d..9b4dcf76ce6c 100644 | ||
805 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | ||
806 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | ||
807 | @@ -392,15 +392,6 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev) | ||
808 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
809 | struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); | ||
810 | |||
811 | - if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
812 | - connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
813 | - /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
814 | - * aux dp channel on imac and help (but not completely fix) | ||
815 | - * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
816 | - * also avoid interrupt storms during dpms. | ||
817 | - */ | ||
818 | - continue; | ||
819 | - } | ||
820 | switch (amdgpu_connector->hpd.hpd) { | ||
821 | case AMDGPU_HPD_1: | ||
822 | WREG32(mmDC_HPD1_CONTROL, tmp); | ||
823 | @@ -423,6 +414,45 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev) | ||
824 | default: | ||
825 | break; | ||
826 | } | ||
827 | + | ||
828 | + if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || | ||
829 | + connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
830 | + /* don't try to enable hpd on eDP or LVDS avoid breaking the | ||
831 | + * aux dp channel on imac and help (but not completely fix) | ||
832 | + * https://bugzilla.redhat.com/show_bug.cgi?id=726143 | ||
833 | + * also avoid interrupt storms during dpms. | ||
834 | + */ | ||
835 | + u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; | ||
836 | + | ||
837 | + switch (amdgpu_connector->hpd.hpd) { | ||
838 | + case AMDGPU_HPD_1: | ||
839 | + dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL; | ||
840 | + break; | ||
841 | + case AMDGPU_HPD_2: | ||
842 | + dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL; | ||
843 | + break; | ||
844 | + case AMDGPU_HPD_3: | ||
845 | + dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL; | ||
846 | + break; | ||
847 | + case AMDGPU_HPD_4: | ||
848 | + dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL; | ||
849 | + break; | ||
850 | + case AMDGPU_HPD_5: | ||
851 | + dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL; | ||
852 | + break; | ||
853 | + case AMDGPU_HPD_6: | ||
854 | + dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL; | ||
855 | + break; | ||
856 | + default: | ||
857 | + continue; | ||
858 | + } | ||
859 | + | ||
860 | + dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); | ||
861 | + dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK; | ||
862 | + WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); | ||
863 | + continue; | ||
864 | + } | ||
865 | + | ||
866 | dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); | ||
867 | amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); | ||
868 | } | ||
869 | diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c | ||
870 | index 9f935f55d74c..968b31f39884 100644 | ||
871 | --- a/drivers/gpu/drm/drm_prime.c | ||
872 | +++ b/drivers/gpu/drm/drm_prime.c | ||
873 | @@ -339,14 +339,17 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = { | ||
874 | * using the PRIME helpers. | ||
875 | */ | ||
876 | struct dma_buf *drm_gem_prime_export(struct drm_device *dev, | ||
877 | - struct drm_gem_object *obj, int flags) | ||
878 | + struct drm_gem_object *obj, | ||
879 | + int flags) | ||
880 | { | ||
881 | - DEFINE_DMA_BUF_EXPORT_INFO(exp_info); | ||
882 | - | ||
883 | - exp_info.ops = &drm_gem_prime_dmabuf_ops; | ||
884 | - exp_info.size = obj->size; | ||
885 | - exp_info.flags = flags; | ||
886 | - exp_info.priv = obj; | ||
887 | + struct dma_buf_export_info exp_info = { | ||
888 | + .exp_name = KBUILD_MODNAME, /* white lie for debug */ | ||
889 | + .owner = dev->driver->fops->owner, | ||
890 | + .ops = &drm_gem_prime_dmabuf_ops, | ||
891 | + .size = obj->size, | ||
892 | + .flags = flags, | ||
893 | + .priv = obj, | ||
894 | + }; | ||
895 | |||
896 | if (dev->driver->gem_prime_res_obj) | ||
897 | exp_info.resv = dev->driver->gem_prime_res_obj(obj); | ||
898 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
899 | index d400d6773bbb..fb9f647bb5cd 100644 | ||
900 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
901 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
902 | @@ -2150,21 +2150,19 @@ struct drm_i915_gem_object { | ||
903 | /** Record of address bit 17 of each page at last unbind. */ | ||
904 | unsigned long *bit_17; | ||
905 | |||
906 | - union { | ||
907 | - /** for phy allocated objects */ | ||
908 | - struct drm_dma_handle *phys_handle; | ||
909 | - | ||
910 | - struct i915_gem_userptr { | ||
911 | - uintptr_t ptr; | ||
912 | - unsigned read_only :1; | ||
913 | - unsigned workers :4; | ||
914 | + struct i915_gem_userptr { | ||
915 | + uintptr_t ptr; | ||
916 | + unsigned read_only :1; | ||
917 | + unsigned workers :4; | ||
918 | #define I915_GEM_USERPTR_MAX_WORKERS 15 | ||
919 | |||
920 | - struct i915_mm_struct *mm; | ||
921 | - struct i915_mmu_object *mmu_object; | ||
922 | - struct work_struct *work; | ||
923 | - } userptr; | ||
924 | - }; | ||
925 | + struct i915_mm_struct *mm; | ||
926 | + struct i915_mmu_object *mmu_object; | ||
927 | + struct work_struct *work; | ||
928 | + } userptr; | ||
929 | + | ||
930 | + /** for phys allocated objects */ | ||
931 | + struct drm_dma_handle *phys_handle; | ||
932 | }; | ||
933 | #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base) | ||
934 | |||
935 | diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
936 | index 87e919a06b27..5d2323a40c25 100644 | ||
937 | --- a/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
938 | +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c | ||
939 | @@ -108,17 +108,28 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev) | ||
940 | pci_read_config_dword(dev->pdev, 0x5c, &base); | ||
941 | base &= ~((1<<20) - 1); | ||
942 | } else if (IS_I865G(dev)) { | ||
943 | + u32 tseg_size = 0; | ||
944 | u16 toud = 0; | ||
945 | + u8 tmp; | ||
946 | + | ||
947 | + pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), | ||
948 | + I845_ESMRAMC, &tmp); | ||
949 | + | ||
950 | + if (tmp & TSEG_ENABLE) { | ||
951 | + switch (tmp & I845_TSEG_SIZE_MASK) { | ||
952 | + case I845_TSEG_SIZE_512K: | ||
953 | + tseg_size = KB(512); | ||
954 | + break; | ||
955 | + case I845_TSEG_SIZE_1M: | ||
956 | + tseg_size = MB(1); | ||
957 | + break; | ||
958 | + } | ||
959 | + } | ||
960 | |||
961 | - /* | ||
962 | - * FIXME is the graphics stolen memory region | ||
963 | - * always at TOUD? Ie. is it always the last | ||
964 | - * one to be allocated by the BIOS? | ||
965 | - */ | ||
966 | pci_bus_read_config_word(dev->pdev->bus, PCI_DEVFN(0, 0), | ||
967 | I865_TOUD, &toud); | ||
968 | |||
969 | - base = toud << 16; | ||
970 | + base = (toud << 16) + tseg_size; | ||
971 | } else if (IS_I85X(dev)) { | ||
972 | u32 tseg_size = 0; | ||
973 | u32 tom; | ||
974 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c | ||
975 | index ebbd23407a80..0f8367da0663 100644 | ||
976 | --- a/drivers/gpu/drm/i915/intel_dp.c | ||
977 | +++ b/drivers/gpu/drm/i915/intel_dp.c | ||
978 | @@ -4648,7 +4648,7 @@ static bool bxt_digital_port_connected(struct drm_i915_private *dev_priv, | ||
979 | * | ||
980 | * Return %true if @port is connected, %false otherwise. | ||
981 | */ | ||
982 | -bool intel_digital_port_connected(struct drm_i915_private *dev_priv, | ||
983 | +static bool intel_digital_port_connected(struct drm_i915_private *dev_priv, | ||
984 | struct intel_digital_port *port) | ||
985 | { | ||
986 | if (HAS_PCH_IBX(dev_priv)) | ||
987 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | ||
988 | index 41442e619595..722aa159cd28 100644 | ||
989 | --- a/drivers/gpu/drm/i915/intel_drv.h | ||
990 | +++ b/drivers/gpu/drm/i915/intel_drv.h | ||
991 | @@ -1231,8 +1231,6 @@ void intel_edp_drrs_disable(struct intel_dp *intel_dp); | ||
992 | void intel_edp_drrs_invalidate(struct drm_device *dev, | ||
993 | unsigned frontbuffer_bits); | ||
994 | void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits); | ||
995 | -bool intel_digital_port_connected(struct drm_i915_private *dev_priv, | ||
996 | - struct intel_digital_port *port); | ||
997 | void hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config); | ||
998 | |||
999 | /* intel_dp_mst.c */ | ||
1000 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c | ||
1001 | index dff69fef47e0..3b92cad8bef2 100644 | ||
1002 | --- a/drivers/gpu/drm/i915/intel_hdmi.c | ||
1003 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c | ||
1004 | @@ -1331,19 +1331,18 @@ intel_hdmi_unset_edid(struct drm_connector *connector) | ||
1005 | } | ||
1006 | |||
1007 | static bool | ||
1008 | -intel_hdmi_set_edid(struct drm_connector *connector, bool force) | ||
1009 | +intel_hdmi_set_edid(struct drm_connector *connector) | ||
1010 | { | ||
1011 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | ||
1012 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | ||
1013 | - struct edid *edid = NULL; | ||
1014 | + struct edid *edid; | ||
1015 | bool connected = false; | ||
1016 | |||
1017 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); | ||
1018 | |||
1019 | - if (force) | ||
1020 | - edid = drm_get_edid(connector, | ||
1021 | - intel_gmbus_get_adapter(dev_priv, | ||
1022 | - intel_hdmi->ddc_bus)); | ||
1023 | + edid = drm_get_edid(connector, | ||
1024 | + intel_gmbus_get_adapter(dev_priv, | ||
1025 | + intel_hdmi->ddc_bus)); | ||
1026 | |||
1027 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
1028 | |||
1029 | @@ -1371,37 +1370,16 @@ static enum drm_connector_status | ||
1030 | intel_hdmi_detect(struct drm_connector *connector, bool force) | ||
1031 | { | ||
1032 | enum drm_connector_status status; | ||
1033 | - struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | ||
1034 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | ||
1035 | - bool live_status = false; | ||
1036 | - unsigned int try; | ||
1037 | |||
1038 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | ||
1039 | connector->base.id, connector->name); | ||
1040 | |||
1041 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); | ||
1042 | |||
1043 | - for (try = 0; !live_status && try < 9; try++) { | ||
1044 | - if (try) | ||
1045 | - msleep(10); | ||
1046 | - live_status = intel_digital_port_connected(dev_priv, | ||
1047 | - hdmi_to_dig_port(intel_hdmi)); | ||
1048 | - } | ||
1049 | - | ||
1050 | - if (!live_status) { | ||
1051 | - DRM_DEBUG_KMS("HDMI live status down\n"); | ||
1052 | - /* | ||
1053 | - * Live status register is not reliable on all intel platforms. | ||
1054 | - * So consider live_status only for certain platforms, for | ||
1055 | - * others, read EDID to determine presence of sink. | ||
1056 | - */ | ||
1057 | - if (INTEL_INFO(dev_priv)->gen < 7 || IS_IVYBRIDGE(dev_priv)) | ||
1058 | - live_status = true; | ||
1059 | - } | ||
1060 | - | ||
1061 | intel_hdmi_unset_edid(connector); | ||
1062 | |||
1063 | - if (intel_hdmi_set_edid(connector, live_status)) { | ||
1064 | + if (intel_hdmi_set_edid(connector)) { | ||
1065 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | ||
1066 | |||
1067 | hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; | ||
1068 | @@ -1427,7 +1405,7 @@ intel_hdmi_force(struct drm_connector *connector) | ||
1069 | if (connector->status != connector_status_connected) | ||
1070 | return; | ||
1071 | |||
1072 | - intel_hdmi_set_edid(connector, true); | ||
1073 | + intel_hdmi_set_edid(connector); | ||
1074 | hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; | ||
1075 | } | ||
1076 | |||
1077 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
1078 | index 1e851e037c29..3f802163f7d4 100644 | ||
1079 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
1080 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
1081 | @@ -2097,32 +2097,34 @@ static void intel_read_wm_latency(struct drm_device *dev, uint16_t wm[8]) | ||
1082 | GEN9_MEM_LATENCY_LEVEL_MASK; | ||
1083 | |||
1084 | /* | ||
1085 | + * If a level n (n > 1) has a 0us latency, all levels m (m >= n) | ||
1086 | + * need to be disabled. We make sure to sanitize the values out | ||
1087 | + * of the punit to satisfy this requirement. | ||
1088 | + */ | ||
1089 | + for (level = 1; level <= max_level; level++) { | ||
1090 | + if (wm[level] == 0) { | ||
1091 | + for (i = level + 1; i <= max_level; i++) | ||
1092 | + wm[i] = 0; | ||
1093 | + break; | ||
1094 | + } | ||
1095 | + } | ||
1096 | + | ||
1097 | + /* | ||
1098 | * WaWmMemoryReadLatency:skl | ||
1099 | * | ||
1100 | * punit doesn't take into account the read latency so we need | ||
1101 | - * to add 2us to the various latency levels we retrieve from | ||
1102 | - * the punit. | ||
1103 | - * - W0 is a bit special in that it's the only level that | ||
1104 | - * can't be disabled if we want to have display working, so | ||
1105 | - * we always add 2us there. | ||
1106 | - * - For levels >=1, punit returns 0us latency when they are | ||
1107 | - * disabled, so we respect that and don't add 2us then | ||
1108 | - * | ||
1109 | - * Additionally, if a level n (n > 1) has a 0us latency, all | ||
1110 | - * levels m (m >= n) need to be disabled. We make sure to | ||
1111 | - * sanitize the values out of the punit to satisfy this | ||
1112 | - * requirement. | ||
1113 | + * to add 2us to the various latency levels we retrieve from the | ||
1114 | + * punit when level 0 response data us 0us. | ||
1115 | */ | ||
1116 | - wm[0] += 2; | ||
1117 | - for (level = 1; level <= max_level; level++) | ||
1118 | - if (wm[level] != 0) | ||
1119 | + if (wm[0] == 0) { | ||
1120 | + wm[0] += 2; | ||
1121 | + for (level = 1; level <= max_level; level++) { | ||
1122 | + if (wm[level] == 0) | ||
1123 | + break; | ||
1124 | wm[level] += 2; | ||
1125 | - else { | ||
1126 | - for (i = level + 1; i <= max_level; i++) | ||
1127 | - wm[i] = 0; | ||
1128 | - | ||
1129 | - break; | ||
1130 | } | ||
1131 | + } | ||
1132 | + | ||
1133 | } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { | ||
1134 | uint64_t sskpd = I915_READ64(MCH_SSKPD); | ||
1135 | |||
1136 | diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c | ||
1137 | index fa2154493cf1..470af4aa4a6a 100644 | ||
1138 | --- a/drivers/gpu/drm/radeon/r600_dpm.c | ||
1139 | +++ b/drivers/gpu/drm/radeon/r600_dpm.c | ||
1140 | @@ -156,19 +156,20 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) | ||
1141 | struct drm_device *dev = rdev->ddev; | ||
1142 | struct drm_crtc *crtc; | ||
1143 | struct radeon_crtc *radeon_crtc; | ||
1144 | - u32 line_time_us, vblank_lines; | ||
1145 | + u32 vblank_in_pixels; | ||
1146 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ | ||
1147 | |||
1148 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { | ||
1149 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
1150 | radeon_crtc = to_radeon_crtc(crtc); | ||
1151 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | ||
1152 | - line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / | ||
1153 | - radeon_crtc->hw_mode.clock; | ||
1154 | - vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - | ||
1155 | - radeon_crtc->hw_mode.crtc_vdisplay + | ||
1156 | - (radeon_crtc->v_border * 2); | ||
1157 | - vblank_time_us = vblank_lines * line_time_us; | ||
1158 | + vblank_in_pixels = | ||
1159 | + radeon_crtc->hw_mode.crtc_htotal * | ||
1160 | + (radeon_crtc->hw_mode.crtc_vblank_end - | ||
1161 | + radeon_crtc->hw_mode.crtc_vdisplay + | ||
1162 | + (radeon_crtc->v_border * 2)); | ||
1163 | + | ||
1164 | + vblank_time_us = vblank_in_pixels * 1000 / radeon_crtc->hw_mode.clock; | ||
1165 | break; | ||
1166 | } | ||
1167 | } | ||
1168 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
1169 | index e2dd5d19c32c..4aa2cbe4c85f 100644 | ||
1170 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
1171 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
1172 | @@ -660,8 +660,9 @@ bool radeon_card_posted(struct radeon_device *rdev) | ||
1173 | { | ||
1174 | uint32_t reg; | ||
1175 | |||
1176 | - /* for pass through, always force asic_init */ | ||
1177 | - if (radeon_device_is_virtual()) | ||
1178 | + /* for pass through, always force asic_init for CI */ | ||
1179 | + if (rdev->family >= CHIP_BONAIRE && | ||
1180 | + radeon_device_is_virtual()) | ||
1181 | return false; | ||
1182 | |||
1183 | /* required for EFI mode on macbook2,1 which uses an r5xx asic */ | ||
1184 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c | ||
1185 | index 3aaa07dafc00..472e0771832e 100644 | ||
1186 | --- a/drivers/gpu/drm/radeon/si_dpm.c | ||
1187 | +++ b/drivers/gpu/drm/radeon/si_dpm.c | ||
1188 | @@ -4112,7 +4112,7 @@ static int si_populate_smc_voltage_tables(struct radeon_device *rdev, | ||
1189 | &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) { | ||
1190 | si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table); | ||
1191 | |||
1192 | - table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = | ||
1193 | + table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING] = | ||
1194 | cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low); | ||
1195 | |||
1196 | si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay, | ||
1197 | diff --git a/drivers/gpu/drm/radeon/sislands_smc.h b/drivers/gpu/drm/radeon/sislands_smc.h | ||
1198 | index 3c779838d9ab..966e3a556011 100644 | ||
1199 | --- a/drivers/gpu/drm/radeon/sislands_smc.h | ||
1200 | +++ b/drivers/gpu/drm/radeon/sislands_smc.h | ||
1201 | @@ -194,6 +194,7 @@ typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE; | ||
1202 | #define SISLANDS_SMC_VOLTAGEMASK_VDDC 0 | ||
1203 | #define SISLANDS_SMC_VOLTAGEMASK_MVDD 1 | ||
1204 | #define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2 | ||
1205 | +#define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3 | ||
1206 | #define SISLANDS_SMC_VOLTAGEMASK_MAX 4 | ||
1207 | |||
1208 | struct SISLANDS_SMC_VOLTAGEMASKTABLE | ||
1209 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1210 | index 4948c1529836..ecf15cf0c3fd 100644 | ||
1211 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1212 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1213 | @@ -3830,14 +3830,14 @@ static void *vmw_execbuf_cmdbuf(struct vmw_private *dev_priv, | ||
1214 | int ret; | ||
1215 | |||
1216 | *header = NULL; | ||
1217 | - if (!dev_priv->cman || kernel_commands) | ||
1218 | - return kernel_commands; | ||
1219 | - | ||
1220 | if (command_size > SVGA_CB_MAX_SIZE) { | ||
1221 | DRM_ERROR("Command buffer is too large.\n"); | ||
1222 | return ERR_PTR(-EINVAL); | ||
1223 | } | ||
1224 | |||
1225 | + if (!dev_priv->cman || kernel_commands) | ||
1226 | + return kernel_commands; | ||
1227 | + | ||
1228 | /* If possible, add a little space for fencing. */ | ||
1229 | cmdbuf_size = command_size + 512; | ||
1230 | cmdbuf_size = min_t(size_t, cmdbuf_size, SVGA_CB_MAX_SIZE); | ||
1231 | diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | ||
1232 | index 71493d2af912..70a6985334d5 100644 | ||
1233 | --- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | ||
1234 | +++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | ||
1235 | @@ -4102,7 +4102,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | ||
1236 | (u8 *)&settings->beacon.head[ie_offset], | ||
1237 | settings->beacon.head_len - ie_offset, | ||
1238 | WLAN_EID_SSID); | ||
1239 | - if (!ssid_ie) | ||
1240 | + if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) | ||
1241 | return -EINVAL; | ||
1242 | |||
1243 | memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); | ||
1244 | diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c | ||
1245 | index 3cda1f956f0b..6378dfd3b4e8 100644 | ||
1246 | --- a/drivers/net/wireless/mwifiex/join.c | ||
1247 | +++ b/drivers/net/wireless/mwifiex/join.c | ||
1248 | @@ -661,9 +661,8 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, | ||
1249 | priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN, | ||
1250 | sizeof(priv->assoc_rsp_buf)); | ||
1251 | |||
1252 | - memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); | ||
1253 | - | ||
1254 | assoc_rsp->a_id = cpu_to_le16(aid); | ||
1255 | + memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); | ||
1256 | |||
1257 | if (status_code) { | ||
1258 | priv->adapter->dbg.num_cmd_assoc_failure++; | ||
1259 | diff --git a/drivers/power/bq24257_charger.c b/drivers/power/bq24257_charger.c | ||
1260 | index 1fea2c7ef97f..6fc31bdc639b 100644 | ||
1261 | --- a/drivers/power/bq24257_charger.c | ||
1262 | +++ b/drivers/power/bq24257_charger.c | ||
1263 | @@ -1068,6 +1068,12 @@ static int bq24257_probe(struct i2c_client *client, | ||
1264 | return ret; | ||
1265 | } | ||
1266 | |||
1267 | + ret = bq24257_power_supply_init(bq); | ||
1268 | + if (ret < 0) { | ||
1269 | + dev_err(dev, "Failed to register power supply\n"); | ||
1270 | + return ret; | ||
1271 | + } | ||
1272 | + | ||
1273 | ret = devm_request_threaded_irq(dev, client->irq, NULL, | ||
1274 | bq24257_irq_handler_thread, | ||
1275 | IRQF_TRIGGER_FALLING | | ||
1276 | @@ -1078,12 +1084,6 @@ static int bq24257_probe(struct i2c_client *client, | ||
1277 | return ret; | ||
1278 | } | ||
1279 | |||
1280 | - ret = bq24257_power_supply_init(bq); | ||
1281 | - if (ret < 0) { | ||
1282 | - dev_err(dev, "Failed to register power supply\n"); | ||
1283 | - return ret; | ||
1284 | - } | ||
1285 | - | ||
1286 | ret = sysfs_create_group(&bq->charger->dev.kobj, &bq24257_attr_group); | ||
1287 | if (ret < 0) { | ||
1288 | dev_err(dev, "Can't create sysfs entries\n"); | ||
1289 | diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c | ||
1290 | index 7c511add5aa7..bae98521c808 100644 | ||
1291 | --- a/drivers/s390/char/con3270.c | ||
1292 | +++ b/drivers/s390/char/con3270.c | ||
1293 | @@ -124,7 +124,12 @@ con3270_create_status(struct con3270 *cp) | ||
1294 | static void | ||
1295 | con3270_update_string(struct con3270 *cp, struct string *s, int nr) | ||
1296 | { | ||
1297 | - if (s->len >= cp->view.cols - 5) | ||
1298 | + if (s->len < 4) { | ||
1299 | + /* This indicates a bug, but printing a warning would | ||
1300 | + * cause a deadlock. */ | ||
1301 | + return; | ||
1302 | + } | ||
1303 | + if (s->string[s->len - 4] != TO_RA) | ||
1304 | return; | ||
1305 | raw3270_buffer_address(cp->view.dev, s->string + s->len - 3, | ||
1306 | cp->view.cols * (nr + 1)); | ||
1307 | @@ -461,11 +466,11 @@ con3270_cline_end(struct con3270 *cp) | ||
1308 | cp->cline->len + 4 : cp->view.cols; | ||
1309 | s = con3270_alloc_string(cp, size); | ||
1310 | memcpy(s->string, cp->cline->string, cp->cline->len); | ||
1311 | - if (s->len < cp->view.cols - 5) { | ||
1312 | + if (cp->cline->len < cp->view.cols - 5) { | ||
1313 | s->string[s->len - 4] = TO_RA; | ||
1314 | s->string[s->len - 1] = 0; | ||
1315 | } else { | ||
1316 | - while (--size > cp->cline->len) | ||
1317 | + while (--size >= cp->cline->len) | ||
1318 | s->string[size] = cp->view.ascebc[' ']; | ||
1319 | } | ||
1320 | /* Replace cline with allocated line s and reset cline. */ | ||
1321 | diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c | ||
1322 | index c424c0c7367e..1e16331891a9 100644 | ||
1323 | --- a/drivers/s390/cio/chsc.c | ||
1324 | +++ b/drivers/s390/cio/chsc.c | ||
1325 | @@ -95,12 +95,13 @@ struct chsc_ssd_area { | ||
1326 | int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd) | ||
1327 | { | ||
1328 | struct chsc_ssd_area *ssd_area; | ||
1329 | + unsigned long flags; | ||
1330 | int ccode; | ||
1331 | int ret; | ||
1332 | int i; | ||
1333 | int mask; | ||
1334 | |||
1335 | - spin_lock_irq(&chsc_page_lock); | ||
1336 | + spin_lock_irqsave(&chsc_page_lock, flags); | ||
1337 | memset(chsc_page, 0, PAGE_SIZE); | ||
1338 | ssd_area = chsc_page; | ||
1339 | ssd_area->request.length = 0x0010; | ||
1340 | @@ -144,7 +145,7 @@ int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd) | ||
1341 | ssd->fla[i] = ssd_area->fla[i]; | ||
1342 | } | ||
1343 | out: | ||
1344 | - spin_unlock_irq(&chsc_page_lock); | ||
1345 | + spin_unlock_irqrestore(&chsc_page_lock, flags); | ||
1346 | return ret; | ||
1347 | } | ||
1348 | |||
1349 | @@ -832,9 +833,10 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable) | ||
1350 | u32 fmt : 4; | ||
1351 | u32 : 16; | ||
1352 | } __attribute__ ((packed)) *secm_area; | ||
1353 | + unsigned long flags; | ||
1354 | int ret, ccode; | ||
1355 | |||
1356 | - spin_lock_irq(&chsc_page_lock); | ||
1357 | + spin_lock_irqsave(&chsc_page_lock, flags); | ||
1358 | memset(chsc_page, 0, PAGE_SIZE); | ||
1359 | secm_area = chsc_page; | ||
1360 | secm_area->request.length = 0x0050; | ||
1361 | @@ -864,7 +866,7 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable) | ||
1362 | CIO_CRW_EVENT(2, "chsc: secm failed (rc=%04x)\n", | ||
1363 | secm_area->response.code); | ||
1364 | out: | ||
1365 | - spin_unlock_irq(&chsc_page_lock); | ||
1366 | + spin_unlock_irqrestore(&chsc_page_lock, flags); | ||
1367 | return ret; | ||
1368 | } | ||
1369 | |||
1370 | @@ -993,6 +995,7 @@ chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv, | ||
1371 | |||
1372 | int chsc_get_channel_measurement_chars(struct channel_path *chp) | ||
1373 | { | ||
1374 | + unsigned long flags; | ||
1375 | int ccode, ret; | ||
1376 | |||
1377 | struct { | ||
1378 | @@ -1022,7 +1025,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp) | ||
1379 | if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm) | ||
1380 | return 0; | ||
1381 | |||
1382 | - spin_lock_irq(&chsc_page_lock); | ||
1383 | + spin_lock_irqsave(&chsc_page_lock, flags); | ||
1384 | memset(chsc_page, 0, PAGE_SIZE); | ||
1385 | scmc_area = chsc_page; | ||
1386 | scmc_area->request.length = 0x0010; | ||
1387 | @@ -1054,7 +1057,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp) | ||
1388 | chsc_initialize_cmg_chars(chp, scmc_area->cmcv, | ||
1389 | (struct cmg_chars *) &scmc_area->data); | ||
1390 | out: | ||
1391 | - spin_unlock_irq(&chsc_page_lock); | ||
1392 | + spin_unlock_irqrestore(&chsc_page_lock, flags); | ||
1393 | return ret; | ||
1394 | } | ||
1395 | |||
1396 | @@ -1135,6 +1138,7 @@ struct css_chsc_char css_chsc_characteristics; | ||
1397 | int __init | ||
1398 | chsc_determine_css_characteristics(void) | ||
1399 | { | ||
1400 | + unsigned long flags; | ||
1401 | int result; | ||
1402 | struct { | ||
1403 | struct chsc_header request; | ||
1404 | @@ -1147,7 +1151,7 @@ chsc_determine_css_characteristics(void) | ||
1405 | u32 chsc_char[508]; | ||
1406 | } __attribute__ ((packed)) *scsc_area; | ||
1407 | |||
1408 | - spin_lock_irq(&chsc_page_lock); | ||
1409 | + spin_lock_irqsave(&chsc_page_lock, flags); | ||
1410 | memset(chsc_page, 0, PAGE_SIZE); | ||
1411 | scsc_area = chsc_page; | ||
1412 | scsc_area->request.length = 0x0010; | ||
1413 | @@ -1169,7 +1173,7 @@ chsc_determine_css_characteristics(void) | ||
1414 | CIO_CRW_EVENT(2, "chsc: scsc failed (rc=%04x)\n", | ||
1415 | scsc_area->response.code); | ||
1416 | exit: | ||
1417 | - spin_unlock_irq(&chsc_page_lock); | ||
1418 | + spin_unlock_irqrestore(&chsc_page_lock, flags); | ||
1419 | return result; | ||
1420 | } | ||
1421 | |||
1422 | diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | ||
1423 | index 6180f7970bbf..0969cea1089a 100644 | ||
1424 | --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c | ||
1425 | +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | ||
1426 | @@ -4510,7 +4510,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) | ||
1427 | le16_to_cpu(mpi_reply->DevHandle)); | ||
1428 | mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq); | ||
1429 | |||
1430 | - if (!(ioc->logging_level & MPT_DEBUG_REPLY) && | ||
1431 | + if ((ioc->logging_level & MPT_DEBUG_REPLY) && | ||
1432 | ((scmd->sense_buffer[2] == UNIT_ATTENTION) || | ||
1433 | (scmd->sense_buffer[2] == MEDIUM_ERROR) || | ||
1434 | (scmd->sense_buffer[2] == HARDWARE_ERROR))) | ||
1435 | diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c | ||
1436 | index 39412c9097c6..a3965cac1b34 100644 | ||
1437 | --- a/drivers/spi/spi-fsl-dspi.c | ||
1438 | +++ b/drivers/spi/spi-fsl-dspi.c | ||
1439 | @@ -753,7 +753,6 @@ static int dspi_remove(struct platform_device *pdev) | ||
1440 | /* Disconnect from the SPI framework */ | ||
1441 | clk_disable_unprepare(dspi->clk); | ||
1442 | spi_unregister_master(dspi->master); | ||
1443 | - spi_master_put(dspi->master); | ||
1444 | |||
1445 | return 0; | ||
1446 | } | ||
1447 | diff --git a/drivers/staging/rtl8188eu/core/rtw_cmd.c b/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
1448 | index 9b7026e7d55b..45d0a87f55d2 100644 | ||
1449 | --- a/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
1450 | +++ b/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
1451 | @@ -718,13 +718,13 @@ u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr) | ||
1452 | u8 res = _SUCCESS; | ||
1453 | |||
1454 | |||
1455 | - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); | ||
1456 | + ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); | ||
1457 | if (ph2c == NULL) { | ||
1458 | res = _FAIL; | ||
1459 | goto exit; | ||
1460 | } | ||
1461 | |||
1462 | - paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_KERNEL); | ||
1463 | + paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_ATOMIC); | ||
1464 | if (paddbareq_parm == NULL) { | ||
1465 | kfree(ph2c); | ||
1466 | res = _FAIL; | ||
1467 | diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c | ||
1468 | index 915facbf552e..e1134a4d97f3 100644 | ||
1469 | --- a/drivers/uio/uio_dmem_genirq.c | ||
1470 | +++ b/drivers/uio/uio_dmem_genirq.c | ||
1471 | @@ -229,7 +229,7 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev) | ||
1472 | ++uiomem; | ||
1473 | } | ||
1474 | |||
1475 | - priv->dmem_region_start = i; | ||
1476 | + priv->dmem_region_start = uiomem - &uioinfo->mem[0]; | ||
1477 | priv->num_dmem_regions = pdata->num_dynamic_regions; | ||
1478 | |||
1479 | for (i = 0; i < pdata->num_dynamic_regions; ++i) { | ||
1480 | diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c | ||
1481 | index 531e76474983..0e0eb10f82a0 100644 | ||
1482 | --- a/drivers/xen/xenbus/xenbus_dev_frontend.c | ||
1483 | +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c | ||
1484 | @@ -316,7 +316,7 @@ static int xenbus_write_transaction(unsigned msg_type, | ||
1485 | rc = -ENOMEM; | ||
1486 | goto out; | ||
1487 | } | ||
1488 | - } else { | ||
1489 | + } else if (msg_type == XS_TRANSACTION_END) { | ||
1490 | list_for_each_entry(trans, &u->transactions, list) | ||
1491 | if (trans->handle.id == u->u.msg.tx_id) | ||
1492 | break; | ||
1493 | diff --git a/fs/9p/acl.c b/fs/9p/acl.c | ||
1494 | index a7e28890f5ef..929b618da43b 100644 | ||
1495 | --- a/fs/9p/acl.c | ||
1496 | +++ b/fs/9p/acl.c | ||
1497 | @@ -282,32 +282,26 @@ static int v9fs_xattr_set_acl(const struct xattr_handler *handler, | ||
1498 | switch (handler->flags) { | ||
1499 | case ACL_TYPE_ACCESS: | ||
1500 | if (acl) { | ||
1501 | - umode_t mode = inode->i_mode; | ||
1502 | - retval = posix_acl_equiv_mode(acl, &mode); | ||
1503 | - if (retval < 0) | ||
1504 | + struct iattr iattr; | ||
1505 | + | ||
1506 | + retval = posix_acl_update_mode(inode, &iattr.ia_mode, &acl); | ||
1507 | + if (retval) | ||
1508 | goto err_out; | ||
1509 | - else { | ||
1510 | - struct iattr iattr; | ||
1511 | - if (retval == 0) { | ||
1512 | - /* | ||
1513 | - * ACL can be represented | ||
1514 | - * by the mode bits. So don't | ||
1515 | - * update ACL. | ||
1516 | - */ | ||
1517 | - acl = NULL; | ||
1518 | - value = NULL; | ||
1519 | - size = 0; | ||
1520 | - } | ||
1521 | - /* Updte the mode bits */ | ||
1522 | - iattr.ia_mode = ((mode & S_IALLUGO) | | ||
1523 | - (inode->i_mode & ~S_IALLUGO)); | ||
1524 | - iattr.ia_valid = ATTR_MODE; | ||
1525 | - /* FIXME should we update ctime ? | ||
1526 | - * What is the following setxattr update the | ||
1527 | - * mode ? | ||
1528 | + if (!acl) { | ||
1529 | + /* | ||
1530 | + * ACL can be represented | ||
1531 | + * by the mode bits. So don't | ||
1532 | + * update ACL. | ||
1533 | */ | ||
1534 | - v9fs_vfs_setattr_dotl(dentry, &iattr); | ||
1535 | + value = NULL; | ||
1536 | + size = 0; | ||
1537 | } | ||
1538 | + iattr.ia_valid = ATTR_MODE; | ||
1539 | + /* FIXME should we update ctime ? | ||
1540 | + * What is the following setxattr update the | ||
1541 | + * mode ? | ||
1542 | + */ | ||
1543 | + v9fs_vfs_setattr_dotl(dentry, &iattr); | ||
1544 | } | ||
1545 | break; | ||
1546 | case ACL_TYPE_DEFAULT: | ||
1547 | diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c | ||
1548 | index 9a0124a95851..fb3e64d37cb4 100644 | ||
1549 | --- a/fs/btrfs/acl.c | ||
1550 | +++ b/fs/btrfs/acl.c | ||
1551 | @@ -83,11 +83,9 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, | ||
1552 | case ACL_TYPE_ACCESS: | ||
1553 | name = POSIX_ACL_XATTR_ACCESS; | ||
1554 | if (acl) { | ||
1555 | - ret = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1556 | - if (ret < 0) | ||
1557 | + ret = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1558 | + if (ret) | ||
1559 | return ret; | ||
1560 | - if (ret == 0) | ||
1561 | - acl = NULL; | ||
1562 | } | ||
1563 | ret = 0; | ||
1564 | break; | ||
1565 | diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c | ||
1566 | index 8f84646f10e9..4d8caeb94a11 100644 | ||
1567 | --- a/fs/ceph/acl.c | ||
1568 | +++ b/fs/ceph/acl.c | ||
1569 | @@ -94,11 +94,9 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1570 | case ACL_TYPE_ACCESS: | ||
1571 | name = POSIX_ACL_XATTR_ACCESS; | ||
1572 | if (acl) { | ||
1573 | - ret = posix_acl_equiv_mode(acl, &new_mode); | ||
1574 | - if (ret < 0) | ||
1575 | + ret = posix_acl_update_mode(inode, &new_mode, &acl); | ||
1576 | + if (ret) | ||
1577 | goto out; | ||
1578 | - if (ret == 0) | ||
1579 | - acl = NULL; | ||
1580 | } | ||
1581 | break; | ||
1582 | case ACL_TYPE_DEFAULT: | ||
1583 | diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c | ||
1584 | index 27695e6f4e46..d6aeb84e90b6 100644 | ||
1585 | --- a/fs/ext2/acl.c | ||
1586 | +++ b/fs/ext2/acl.c | ||
1587 | @@ -193,15 +193,11 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1588 | case ACL_TYPE_ACCESS: | ||
1589 | name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; | ||
1590 | if (acl) { | ||
1591 | - error = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1592 | - if (error < 0) | ||
1593 | + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1594 | + if (error) | ||
1595 | return error; | ||
1596 | - else { | ||
1597 | - inode->i_ctime = CURRENT_TIME_SEC; | ||
1598 | - mark_inode_dirty(inode); | ||
1599 | - if (error == 0) | ||
1600 | - acl = NULL; | ||
1601 | - } | ||
1602 | + inode->i_ctime = CURRENT_TIME_SEC; | ||
1603 | + mark_inode_dirty(inode); | ||
1604 | } | ||
1605 | break; | ||
1606 | |||
1607 | diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c | ||
1608 | index 69b1e73026a5..c3fe1e323951 100644 | ||
1609 | --- a/fs/ext4/acl.c | ||
1610 | +++ b/fs/ext4/acl.c | ||
1611 | @@ -196,15 +196,11 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type, | ||
1612 | case ACL_TYPE_ACCESS: | ||
1613 | name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; | ||
1614 | if (acl) { | ||
1615 | - error = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1616 | - if (error < 0) | ||
1617 | + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1618 | + if (error) | ||
1619 | return error; | ||
1620 | - else { | ||
1621 | - inode->i_ctime = ext4_current_time(inode); | ||
1622 | - ext4_mark_inode_dirty(handle, inode); | ||
1623 | - if (error == 0) | ||
1624 | - acl = NULL; | ||
1625 | - } | ||
1626 | + inode->i_ctime = ext4_current_time(inode); | ||
1627 | + ext4_mark_inode_dirty(handle, inode); | ||
1628 | } | ||
1629 | break; | ||
1630 | |||
1631 | diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c | ||
1632 | index c8f25f7241f0..e9a8d676c6bc 100644 | ||
1633 | --- a/fs/f2fs/acl.c | ||
1634 | +++ b/fs/f2fs/acl.c | ||
1635 | @@ -214,12 +214,10 @@ static int __f2fs_set_acl(struct inode *inode, int type, | ||
1636 | case ACL_TYPE_ACCESS: | ||
1637 | name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; | ||
1638 | if (acl) { | ||
1639 | - error = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1640 | - if (error < 0) | ||
1641 | + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1642 | + if (error) | ||
1643 | return error; | ||
1644 | set_acl_inode(fi, inode->i_mode); | ||
1645 | - if (error == 0) | ||
1646 | - acl = NULL; | ||
1647 | } | ||
1648 | break; | ||
1649 | |||
1650 | diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c | ||
1651 | index 1be3b061c05c..ff0ac96a8e7b 100644 | ||
1652 | --- a/fs/gfs2/acl.c | ||
1653 | +++ b/fs/gfs2/acl.c | ||
1654 | @@ -79,17 +79,11 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1655 | if (type == ACL_TYPE_ACCESS) { | ||
1656 | umode_t mode = inode->i_mode; | ||
1657 | |||
1658 | - error = posix_acl_equiv_mode(acl, &mode); | ||
1659 | - if (error < 0) | ||
1660 | + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1661 | + if (error) | ||
1662 | return error; | ||
1663 | - | ||
1664 | - if (error == 0) | ||
1665 | - acl = NULL; | ||
1666 | - | ||
1667 | - if (mode != inode->i_mode) { | ||
1668 | - inode->i_mode = mode; | ||
1669 | + if (mode != inode->i_mode) | ||
1670 | mark_inode_dirty(inode); | ||
1671 | - } | ||
1672 | } | ||
1673 | |||
1674 | if (acl) { | ||
1675 | diff --git a/fs/hfsplus/posix_acl.c b/fs/hfsplus/posix_acl.c | ||
1676 | index df0c9af68d05..71b3087b7e32 100644 | ||
1677 | --- a/fs/hfsplus/posix_acl.c | ||
1678 | +++ b/fs/hfsplus/posix_acl.c | ||
1679 | @@ -68,8 +68,8 @@ int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl, | ||
1680 | case ACL_TYPE_ACCESS: | ||
1681 | xattr_name = POSIX_ACL_XATTR_ACCESS; | ||
1682 | if (acl) { | ||
1683 | - err = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1684 | - if (err < 0) | ||
1685 | + err = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1686 | + if (err) | ||
1687 | return err; | ||
1688 | } | ||
1689 | err = 0; | ||
1690 | diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c | ||
1691 | index 2f7a3c090489..f9f86f87d32b 100644 | ||
1692 | --- a/fs/jffs2/acl.c | ||
1693 | +++ b/fs/jffs2/acl.c | ||
1694 | @@ -235,9 +235,10 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1695 | case ACL_TYPE_ACCESS: | ||
1696 | xprefix = JFFS2_XPREFIX_ACL_ACCESS; | ||
1697 | if (acl) { | ||
1698 | - umode_t mode = inode->i_mode; | ||
1699 | - rc = posix_acl_equiv_mode(acl, &mode); | ||
1700 | - if (rc < 0) | ||
1701 | + umode_t mode; | ||
1702 | + | ||
1703 | + rc = posix_acl_update_mode(inode, &mode, &acl); | ||
1704 | + if (rc) | ||
1705 | return rc; | ||
1706 | if (inode->i_mode != mode) { | ||
1707 | struct iattr attr; | ||
1708 | @@ -249,8 +250,6 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1709 | if (rc < 0) | ||
1710 | return rc; | ||
1711 | } | ||
1712 | - if (rc == 0) | ||
1713 | - acl = NULL; | ||
1714 | } | ||
1715 | break; | ||
1716 | case ACL_TYPE_DEFAULT: | ||
1717 | diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c | ||
1718 | index 0c8ca830b113..9fad9f4fe883 100644 | ||
1719 | --- a/fs/jfs/acl.c | ||
1720 | +++ b/fs/jfs/acl.c | ||
1721 | @@ -84,13 +84,11 @@ static int __jfs_set_acl(tid_t tid, struct inode *inode, int type, | ||
1722 | case ACL_TYPE_ACCESS: | ||
1723 | ea_name = POSIX_ACL_XATTR_ACCESS; | ||
1724 | if (acl) { | ||
1725 | - rc = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1726 | - if (rc < 0) | ||
1727 | + rc = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1728 | + if (rc) | ||
1729 | return rc; | ||
1730 | inode->i_ctime = CURRENT_TIME; | ||
1731 | mark_inode_dirty(inode); | ||
1732 | - if (rc == 0) | ||
1733 | - acl = NULL; | ||
1734 | } | ||
1735 | break; | ||
1736 | case ACL_TYPE_DEFAULT: | ||
1737 | diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c | ||
1738 | index 2162434728c0..164307b99405 100644 | ||
1739 | --- a/fs/ocfs2/acl.c | ||
1740 | +++ b/fs/ocfs2/acl.c | ||
1741 | @@ -241,13 +241,11 @@ int ocfs2_set_acl(handle_t *handle, | ||
1742 | case ACL_TYPE_ACCESS: | ||
1743 | name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS; | ||
1744 | if (acl) { | ||
1745 | - umode_t mode = inode->i_mode; | ||
1746 | - ret = posix_acl_equiv_mode(acl, &mode); | ||
1747 | - if (ret < 0) | ||
1748 | - return ret; | ||
1749 | + umode_t mode; | ||
1750 | |||
1751 | - if (ret == 0) | ||
1752 | - acl = NULL; | ||
1753 | + ret = posix_acl_update_mode(inode, &mode, &acl); | ||
1754 | + if (ret) | ||
1755 | + return ret; | ||
1756 | |||
1757 | ret = ocfs2_acl_set_mode(inode, di_bh, | ||
1758 | handle, mode); | ||
1759 | diff --git a/fs/posix_acl.c b/fs/posix_acl.c | ||
1760 | index 34bd1bd354e6..a60d3cc5b55d 100644 | ||
1761 | --- a/fs/posix_acl.c | ||
1762 | +++ b/fs/posix_acl.c | ||
1763 | @@ -592,6 +592,37 @@ no_mem: | ||
1764 | } | ||
1765 | EXPORT_SYMBOL_GPL(posix_acl_create); | ||
1766 | |||
1767 | +/** | ||
1768 | + * posix_acl_update_mode - update mode in set_acl | ||
1769 | + * | ||
1770 | + * Update the file mode when setting an ACL: compute the new file permission | ||
1771 | + * bits based on the ACL. In addition, if the ACL is equivalent to the new | ||
1772 | + * file mode, set *acl to NULL to indicate that no ACL should be set. | ||
1773 | + * | ||
1774 | + * As with chmod, clear the setgit bit if the caller is not in the owning group | ||
1775 | + * or capable of CAP_FSETID (see inode_change_ok). | ||
1776 | + * | ||
1777 | + * Called from set_acl inode operations. | ||
1778 | + */ | ||
1779 | +int posix_acl_update_mode(struct inode *inode, umode_t *mode_p, | ||
1780 | + struct posix_acl **acl) | ||
1781 | +{ | ||
1782 | + umode_t mode = inode->i_mode; | ||
1783 | + int error; | ||
1784 | + | ||
1785 | + error = posix_acl_equiv_mode(*acl, &mode); | ||
1786 | + if (error < 0) | ||
1787 | + return error; | ||
1788 | + if (error == 0) | ||
1789 | + *acl = NULL; | ||
1790 | + if (!in_group_p(inode->i_gid) && | ||
1791 | + !capable_wrt_inode_uidgid(inode, CAP_FSETID)) | ||
1792 | + mode &= ~S_ISGID; | ||
1793 | + *mode_p = mode; | ||
1794 | + return 0; | ||
1795 | +} | ||
1796 | +EXPORT_SYMBOL(posix_acl_update_mode); | ||
1797 | + | ||
1798 | /* | ||
1799 | * Fix up the uids and gids in posix acl extended attributes in place. | ||
1800 | */ | ||
1801 | diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c | ||
1802 | index 4b34b9dc03dd..9b1824f35501 100644 | ||
1803 | --- a/fs/reiserfs/xattr_acl.c | ||
1804 | +++ b/fs/reiserfs/xattr_acl.c | ||
1805 | @@ -246,13 +246,9 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, | ||
1806 | case ACL_TYPE_ACCESS: | ||
1807 | name = POSIX_ACL_XATTR_ACCESS; | ||
1808 | if (acl) { | ||
1809 | - error = posix_acl_equiv_mode(acl, &inode->i_mode); | ||
1810 | - if (error < 0) | ||
1811 | + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); | ||
1812 | + if (error) | ||
1813 | return error; | ||
1814 | - else { | ||
1815 | - if (error == 0) | ||
1816 | - acl = NULL; | ||
1817 | - } | ||
1818 | } | ||
1819 | break; | ||
1820 | case ACL_TYPE_DEFAULT: | ||
1821 | diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c | ||
1822 | index 6bb470fbb8e8..c5101a3295d8 100644 | ||
1823 | --- a/fs/xfs/xfs_acl.c | ||
1824 | +++ b/fs/xfs/xfs_acl.c | ||
1825 | @@ -288,16 +288,11 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) | ||
1826 | return error; | ||
1827 | |||
1828 | if (type == ACL_TYPE_ACCESS) { | ||
1829 | - umode_t mode = inode->i_mode; | ||
1830 | - error = posix_acl_equiv_mode(acl, &mode); | ||
1831 | - | ||
1832 | - if (error <= 0) { | ||
1833 | - acl = NULL; | ||
1834 | - | ||
1835 | - if (error < 0) | ||
1836 | - return error; | ||
1837 | - } | ||
1838 | + umode_t mode; | ||
1839 | |||
1840 | + error = posix_acl_update_mode(inode, &mode, &acl); | ||
1841 | + if (error) | ||
1842 | + return error; | ||
1843 | error = xfs_set_mode(inode, mode); | ||
1844 | if (error) | ||
1845 | return error; | ||
1846 | diff --git a/include/drm/drmP.h b/include/drm/drmP.h | ||
1847 | index 0a271ca1f7c7..a31976c860f6 100644 | ||
1848 | --- a/include/drm/drmP.h | ||
1849 | +++ b/include/drm/drmP.h | ||
1850 | @@ -1029,7 +1029,8 @@ static inline int drm_debugfs_remove_files(const struct drm_info_list *files, | ||
1851 | #endif | ||
1852 | |||
1853 | extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev, | ||
1854 | - struct drm_gem_object *obj, int flags); | ||
1855 | + struct drm_gem_object *obj, | ||
1856 | + int flags); | ||
1857 | extern int drm_gem_prime_handle_to_fd(struct drm_device *dev, | ||
1858 | struct drm_file *file_priv, uint32_t handle, uint32_t flags, | ||
1859 | int *prime_fd); | ||
1860 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
1861 | index 4e9c75226f07..12b4d54a8ffa 100644 | ||
1862 | --- a/include/linux/netdevice.h | ||
1863 | +++ b/include/linux/netdevice.h | ||
1864 | @@ -1986,8 +1986,8 @@ struct napi_gro_cb { | ||
1865 | /* This is non-zero if the packet may be of the same flow. */ | ||
1866 | u8 same_flow:1; | ||
1867 | |||
1868 | - /* Used in udp_gro_receive */ | ||
1869 | - u8 udp_mark:1; | ||
1870 | + /* Used in tunnel GRO receive */ | ||
1871 | + u8 encap_mark:1; | ||
1872 | |||
1873 | /* GRO checksum is valid */ | ||
1874 | u8 csum_valid:1; | ||
1875 | diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h | ||
1876 | index 3e96a6a76103..d1a8ad7e5ae4 100644 | ||
1877 | --- a/include/linux/posix_acl.h | ||
1878 | +++ b/include/linux/posix_acl.h | ||
1879 | @@ -95,6 +95,7 @@ extern int set_posix_acl(struct inode *, int, struct posix_acl *); | ||
1880 | extern int posix_acl_chmod(struct inode *, umode_t); | ||
1881 | extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, | ||
1882 | struct posix_acl **); | ||
1883 | +extern int posix_acl_update_mode(struct inode *, umode_t *, struct posix_acl **); | ||
1884 | |||
1885 | extern int simple_set_acl(struct inode *, struct posix_acl *, int); | ||
1886 | extern int simple_acl_create(struct inode *, struct inode *); | ||
1887 | diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h | ||
1888 | index af40bc586a1b..86a7bdd61d1a 100644 | ||
1889 | --- a/include/net/ip_tunnels.h | ||
1890 | +++ b/include/net/ip_tunnels.h | ||
1891 | @@ -283,6 +283,22 @@ struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, | ||
1892 | struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum, | ||
1893 | int gso_type_mask); | ||
1894 | |||
1895 | +static inline int iptunnel_pull_offloads(struct sk_buff *skb) | ||
1896 | +{ | ||
1897 | + if (skb_is_gso(skb)) { | ||
1898 | + int err; | ||
1899 | + | ||
1900 | + err = skb_unclone(skb, GFP_ATOMIC); | ||
1901 | + if (unlikely(err)) | ||
1902 | + return err; | ||
1903 | + skb_shinfo(skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >> | ||
1904 | + NETIF_F_GSO_SHIFT); | ||
1905 | + } | ||
1906 | + | ||
1907 | + skb->encapsulation = 0; | ||
1908 | + return 0; | ||
1909 | +} | ||
1910 | + | ||
1911 | static inline void iptunnel_xmit_stats(int err, | ||
1912 | struct net_device_stats *err_stats, | ||
1913 | struct pcpu_sw_netstats __percpu *stats) | ||
1914 | diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c | ||
1915 | index abd286afbd27..a4775f3451b9 100644 | ||
1916 | --- a/kernel/irq/generic-chip.c | ||
1917 | +++ b/kernel/irq/generic-chip.c | ||
1918 | @@ -411,8 +411,29 @@ int irq_map_generic_chip(struct irq_domain *d, unsigned int virq, | ||
1919 | } | ||
1920 | EXPORT_SYMBOL_GPL(irq_map_generic_chip); | ||
1921 | |||
1922 | +static void irq_unmap_generic_chip(struct irq_domain *d, unsigned int virq) | ||
1923 | +{ | ||
1924 | + struct irq_data *data = irq_domain_get_irq_data(d, virq); | ||
1925 | + struct irq_domain_chip_generic *dgc = d->gc; | ||
1926 | + unsigned int hw_irq = data->hwirq; | ||
1927 | + struct irq_chip_generic *gc; | ||
1928 | + int irq_idx; | ||
1929 | + | ||
1930 | + gc = irq_get_domain_generic_chip(d, hw_irq); | ||
1931 | + if (!gc) | ||
1932 | + return; | ||
1933 | + | ||
1934 | + irq_idx = hw_irq % dgc->irqs_per_chip; | ||
1935 | + | ||
1936 | + clear_bit(irq_idx, &gc->installed); | ||
1937 | + irq_domain_set_info(d, virq, hw_irq, &no_irq_chip, NULL, NULL, NULL, | ||
1938 | + NULL); | ||
1939 | + | ||
1940 | +} | ||
1941 | + | ||
1942 | struct irq_domain_ops irq_generic_chip_ops = { | ||
1943 | .map = irq_map_generic_chip, | ||
1944 | + .unmap = irq_unmap_generic_chip, | ||
1945 | .xlate = irq_domain_xlate_onetwocell, | ||
1946 | }; | ||
1947 | EXPORT_SYMBOL_GPL(irq_generic_chip_ops); | ||
1948 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
1949 | index 125c7dd55322..4434cdd4cd9a 100644 | ||
1950 | --- a/mm/hugetlb.c | ||
1951 | +++ b/mm/hugetlb.c | ||
1952 | @@ -1416,12 +1416,13 @@ static void dissolve_free_huge_page(struct page *page) | ||
1953 | { | ||
1954 | spin_lock(&hugetlb_lock); | ||
1955 | if (PageHuge(page) && !page_count(page)) { | ||
1956 | - struct hstate *h = page_hstate(page); | ||
1957 | - int nid = page_to_nid(page); | ||
1958 | - list_del(&page->lru); | ||
1959 | + struct page *head = compound_head(page); | ||
1960 | + struct hstate *h = page_hstate(head); | ||
1961 | + int nid = page_to_nid(head); | ||
1962 | + list_del(&head->lru); | ||
1963 | h->free_huge_pages--; | ||
1964 | h->free_huge_pages_node[nid]--; | ||
1965 | - update_and_free_page(h, page); | ||
1966 | + update_and_free_page(h, head); | ||
1967 | } | ||
1968 | spin_unlock(&hugetlb_lock); | ||
1969 | } | ||
1970 | @@ -1429,7 +1430,8 @@ static void dissolve_free_huge_page(struct page *page) | ||
1971 | /* | ||
1972 | * Dissolve free hugepages in a given pfn range. Used by memory hotplug to | ||
1973 | * make specified memory blocks removable from the system. | ||
1974 | - * Note that start_pfn should aligned with (minimum) hugepage size. | ||
1975 | + * Note that this will dissolve a free gigantic hugepage completely, if any | ||
1976 | + * part of it lies within the given range. | ||
1977 | */ | ||
1978 | void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn) | ||
1979 | { | ||
1980 | @@ -1438,7 +1440,6 @@ void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn) | ||
1981 | if (!hugepages_supported()) | ||
1982 | return; | ||
1983 | |||
1984 | - VM_BUG_ON(!IS_ALIGNED(start_pfn, 1 << minimum_order)); | ||
1985 | for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order) | ||
1986 | dissolve_free_huge_page(pfn_to_page(pfn)); | ||
1987 | } | ||
1988 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
1989 | index de4ed2b5a221..0989fea88c44 100644 | ||
1990 | --- a/net/core/dev.c | ||
1991 | +++ b/net/core/dev.c | ||
1992 | @@ -4239,7 +4239,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff | ||
1993 | NAPI_GRO_CB(skb)->same_flow = 0; | ||
1994 | NAPI_GRO_CB(skb)->flush = 0; | ||
1995 | NAPI_GRO_CB(skb)->free = 0; | ||
1996 | - NAPI_GRO_CB(skb)->udp_mark = 0; | ||
1997 | + NAPI_GRO_CB(skb)->encap_mark = 0; | ||
1998 | NAPI_GRO_CB(skb)->gro_remcsum_start = 0; | ||
1999 | |||
2000 | /* Setup for GRO checksum validation */ | ||
2001 | diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c | ||
2002 | index 5c5db6636704..1a5c1ca3ad3c 100644 | ||
2003 | --- a/net/ipv4/af_inet.c | ||
2004 | +++ b/net/ipv4/af_inet.c | ||
2005 | @@ -1383,6 +1383,19 @@ out: | ||
2006 | return pp; | ||
2007 | } | ||
2008 | |||
2009 | +static struct sk_buff **ipip_gro_receive(struct sk_buff **head, | ||
2010 | + struct sk_buff *skb) | ||
2011 | +{ | ||
2012 | + if (NAPI_GRO_CB(skb)->encap_mark) { | ||
2013 | + NAPI_GRO_CB(skb)->flush = 1; | ||
2014 | + return NULL; | ||
2015 | + } | ||
2016 | + | ||
2017 | + NAPI_GRO_CB(skb)->encap_mark = 1; | ||
2018 | + | ||
2019 | + return inet_gro_receive(head, skb); | ||
2020 | +} | ||
2021 | + | ||
2022 | int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | ||
2023 | { | ||
2024 | if (sk->sk_family == AF_INET) | ||
2025 | @@ -1425,6 +1438,13 @@ out_unlock: | ||
2026 | return err; | ||
2027 | } | ||
2028 | |||
2029 | +static int ipip_gro_complete(struct sk_buff *skb, int nhoff) | ||
2030 | +{ | ||
2031 | + skb->encapsulation = 1; | ||
2032 | + skb_shinfo(skb)->gso_type |= SKB_GSO_IPIP; | ||
2033 | + return inet_gro_complete(skb, nhoff); | ||
2034 | +} | ||
2035 | + | ||
2036 | int inet_ctl_sock_create(struct sock **sk, unsigned short family, | ||
2037 | unsigned short type, unsigned char protocol, | ||
2038 | struct net *net) | ||
2039 | @@ -1652,8 +1672,8 @@ static struct packet_offload ip_packet_offload __read_mostly = { | ||
2040 | static const struct net_offload ipip_offload = { | ||
2041 | .callbacks = { | ||
2042 | .gso_segment = inet_gso_segment, | ||
2043 | - .gro_receive = inet_gro_receive, | ||
2044 | - .gro_complete = inet_gro_complete, | ||
2045 | + .gro_receive = ipip_gro_receive, | ||
2046 | + .gro_complete = ipip_gro_complete, | ||
2047 | }, | ||
2048 | }; | ||
2049 | |||
2050 | diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c | ||
2051 | index bd903fe0f750..08d7de55e57e 100644 | ||
2052 | --- a/net/ipv4/fou.c | ||
2053 | +++ b/net/ipv4/fou.c | ||
2054 | @@ -48,7 +48,7 @@ static inline struct fou *fou_from_sock(struct sock *sk) | ||
2055 | return sk->sk_user_data; | ||
2056 | } | ||
2057 | |||
2058 | -static void fou_recv_pull(struct sk_buff *skb, size_t len) | ||
2059 | +static int fou_recv_pull(struct sk_buff *skb, size_t len) | ||
2060 | { | ||
2061 | struct iphdr *iph = ip_hdr(skb); | ||
2062 | |||
2063 | @@ -59,6 +59,7 @@ static void fou_recv_pull(struct sk_buff *skb, size_t len) | ||
2064 | __skb_pull(skb, len); | ||
2065 | skb_postpull_rcsum(skb, udp_hdr(skb), len); | ||
2066 | skb_reset_transport_header(skb); | ||
2067 | + return iptunnel_pull_offloads(skb); | ||
2068 | } | ||
2069 | |||
2070 | static int fou_udp_recv(struct sock *sk, struct sk_buff *skb) | ||
2071 | @@ -68,9 +69,14 @@ static int fou_udp_recv(struct sock *sk, struct sk_buff *skb) | ||
2072 | if (!fou) | ||
2073 | return 1; | ||
2074 | |||
2075 | - fou_recv_pull(skb, sizeof(struct udphdr)); | ||
2076 | + if (fou_recv_pull(skb, sizeof(struct udphdr))) | ||
2077 | + goto drop; | ||
2078 | |||
2079 | return -fou->protocol; | ||
2080 | + | ||
2081 | +drop: | ||
2082 | + kfree_skb(skb); | ||
2083 | + return 0; | ||
2084 | } | ||
2085 | |||
2086 | static struct guehdr *gue_remcsum(struct sk_buff *skb, struct guehdr *guehdr, | ||
2087 | @@ -170,6 +176,9 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb) | ||
2088 | __skb_pull(skb, sizeof(struct udphdr) + hdrlen); | ||
2089 | skb_reset_transport_header(skb); | ||
2090 | |||
2091 | + if (iptunnel_pull_offloads(skb)) | ||
2092 | + goto drop; | ||
2093 | + | ||
2094 | return -guehdr->proto_ctype; | ||
2095 | |||
2096 | drop: | ||
2097 | diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c | ||
2098 | index 5a8ee3282550..e603004c1af8 100644 | ||
2099 | --- a/net/ipv4/gre_offload.c | ||
2100 | +++ b/net/ipv4/gre_offload.c | ||
2101 | @@ -128,6 +128,11 @@ static struct sk_buff **gre_gro_receive(struct sk_buff **head, | ||
2102 | struct packet_offload *ptype; | ||
2103 | __be16 type; | ||
2104 | |||
2105 | + if (NAPI_GRO_CB(skb)->encap_mark) | ||
2106 | + goto out; | ||
2107 | + | ||
2108 | + NAPI_GRO_CB(skb)->encap_mark = 1; | ||
2109 | + | ||
2110 | off = skb_gro_offset(skb); | ||
2111 | hlen = off + sizeof(*greh); | ||
2112 | greh = skb_gro_header_fast(skb, off); | ||
2113 | diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c | ||
2114 | index 6cb9009c3d96..dbda0565781c 100644 | ||
2115 | --- a/net/ipv4/ip_tunnel_core.c | ||
2116 | +++ b/net/ipv4/ip_tunnel_core.c | ||
2117 | @@ -116,7 +116,8 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto) | ||
2118 | skb->vlan_tci = 0; | ||
2119 | skb_set_queue_mapping(skb, 0); | ||
2120 | skb->pkt_type = PACKET_HOST; | ||
2121 | - return 0; | ||
2122 | + | ||
2123 | + return iptunnel_pull_offloads(skb); | ||
2124 | } | ||
2125 | EXPORT_SYMBOL_GPL(iptunnel_pull_header); | ||
2126 | |||
2127 | diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c | ||
2128 | index f9386160cbee..0e36e56dfd22 100644 | ||
2129 | --- a/net/ipv4/udp_offload.c | ||
2130 | +++ b/net/ipv4/udp_offload.c | ||
2131 | @@ -299,14 +299,14 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb, | ||
2132 | unsigned int off = skb_gro_offset(skb); | ||
2133 | int flush = 1; | ||
2134 | |||
2135 | - if (NAPI_GRO_CB(skb)->udp_mark || | ||
2136 | + if (NAPI_GRO_CB(skb)->encap_mark || | ||
2137 | (skb->ip_summed != CHECKSUM_PARTIAL && | ||
2138 | NAPI_GRO_CB(skb)->csum_cnt == 0 && | ||
2139 | !NAPI_GRO_CB(skb)->csum_valid)) | ||
2140 | goto out; | ||
2141 | |||
2142 | - /* mark that this skb passed once through the udp gro layer */ | ||
2143 | - NAPI_GRO_CB(skb)->udp_mark = 1; | ||
2144 | + /* mark that this skb passed once through the tunnel gro layer */ | ||
2145 | + NAPI_GRO_CB(skb)->encap_mark = 1; | ||
2146 | |||
2147 | rcu_read_lock(); | ||
2148 | uo_priv = rcu_dereference(udp_offload_base); | ||
2149 | diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c | ||
2150 | index eeca943f12dc..82e9f3076028 100644 | ||
2151 | --- a/net/ipv6/ip6_offload.c | ||
2152 | +++ b/net/ipv6/ip6_offload.c | ||
2153 | @@ -258,6 +258,19 @@ out: | ||
2154 | return pp; | ||
2155 | } | ||
2156 | |||
2157 | +static struct sk_buff **sit_gro_receive(struct sk_buff **head, | ||
2158 | + struct sk_buff *skb) | ||
2159 | +{ | ||
2160 | + if (NAPI_GRO_CB(skb)->encap_mark) { | ||
2161 | + NAPI_GRO_CB(skb)->flush = 1; | ||
2162 | + return NULL; | ||
2163 | + } | ||
2164 | + | ||
2165 | + NAPI_GRO_CB(skb)->encap_mark = 1; | ||
2166 | + | ||
2167 | + return ipv6_gro_receive(head, skb); | ||
2168 | +} | ||
2169 | + | ||
2170 | static int ipv6_gro_complete(struct sk_buff *skb, int nhoff) | ||
2171 | { | ||
2172 | const struct net_offload *ops; | ||
2173 | @@ -302,7 +315,7 @@ static struct packet_offload ipv6_packet_offload __read_mostly = { | ||
2174 | static const struct net_offload sit_offload = { | ||
2175 | .callbacks = { | ||
2176 | .gso_segment = ipv6_gso_segment, | ||
2177 | - .gro_receive = ipv6_gro_receive, | ||
2178 | + .gro_receive = sit_gro_receive, | ||
2179 | .gro_complete = sit_gro_complete, | ||
2180 | }, | ||
2181 | }; | ||
2182 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
2183 | index ba3d2f3d66d2..3da2b16356eb 100644 | ||
2184 | --- a/net/ipv6/sit.c | ||
2185 | +++ b/net/ipv6/sit.c | ||
2186 | @@ -681,14 +681,15 @@ static int ipip6_rcv(struct sk_buff *skb) | ||
2187 | skb->mac_header = skb->network_header; | ||
2188 | skb_reset_network_header(skb); | ||
2189 | IPCB(skb)->flags = 0; | ||
2190 | - skb->protocol = htons(ETH_P_IPV6); | ||
2191 | + skb->dev = tunnel->dev; | ||
2192 | |||
2193 | if (packet_is_spoofed(skb, iph, tunnel)) { | ||
2194 | tunnel->dev->stats.rx_errors++; | ||
2195 | goto out; | ||
2196 | } | ||
2197 | |||
2198 | - __skb_tunnel_rx(skb, tunnel->dev, tunnel->net); | ||
2199 | + if (iptunnel_pull_header(skb, 0, htons(ETH_P_IPV6))) | ||
2200 | + goto out; | ||
2201 | |||
2202 | err = IP_ECN_decapsulate(iph, skb); | ||
2203 | if (unlikely(err)) { | ||
2204 | diff --git a/scripts/sortextable.c b/scripts/sortextable.c | ||
2205 | index c2423d913b46..7b29fb14f870 100644 | ||
2206 | --- a/scripts/sortextable.c | ||
2207 | +++ b/scripts/sortextable.c | ||
2208 | @@ -209,6 +209,35 @@ static int compare_relative_table(const void *a, const void *b) | ||
2209 | return 0; | ||
2210 | } | ||
2211 | |||
2212 | +static void x86_sort_relative_table(char *extab_image, int image_size) | ||
2213 | +{ | ||
2214 | + int i; | ||
2215 | + | ||
2216 | + i = 0; | ||
2217 | + while (i < image_size) { | ||
2218 | + uint32_t *loc = (uint32_t *)(extab_image + i); | ||
2219 | + | ||
2220 | + w(r(loc) + i, loc); | ||
2221 | + w(r(loc + 1) + i + 4, loc + 1); | ||
2222 | + w(r(loc + 2) + i + 8, loc + 2); | ||
2223 | + | ||
2224 | + i += sizeof(uint32_t) * 3; | ||
2225 | + } | ||
2226 | + | ||
2227 | + qsort(extab_image, image_size / 12, 12, compare_relative_table); | ||
2228 | + | ||
2229 | + i = 0; | ||
2230 | + while (i < image_size) { | ||
2231 | + uint32_t *loc = (uint32_t *)(extab_image + i); | ||
2232 | + | ||
2233 | + w(r(loc) - i, loc); | ||
2234 | + w(r(loc + 1) - (i + 4), loc + 1); | ||
2235 | + w(r(loc + 2) - (i + 8), loc + 2); | ||
2236 | + | ||
2237 | + i += sizeof(uint32_t) * 3; | ||
2238 | + } | ||
2239 | +} | ||
2240 | + | ||
2241 | static void sort_relative_table(char *extab_image, int image_size) | ||
2242 | { | ||
2243 | int i; | ||
2244 | @@ -281,6 +310,9 @@ do_file(char const *const fname) | ||
2245 | break; | ||
2246 | case EM_386: | ||
2247 | case EM_X86_64: | ||
2248 | + custom_sort = x86_sort_relative_table; | ||
2249 | + break; | ||
2250 | + | ||
2251 | case EM_S390: | ||
2252 | custom_sort = sort_relative_table; | ||
2253 | break; | ||
2254 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c | ||
2255 | index afb70a5d4fd3..b8a256dfed7e 100644 | ||
2256 | --- a/sound/soc/soc-dapm.c | ||
2257 | +++ b/sound/soc/soc-dapm.c | ||
2258 | @@ -823,6 +823,7 @@ static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w, | ||
2259 | case snd_soc_dapm_switch: | ||
2260 | case snd_soc_dapm_mixer: | ||
2261 | case snd_soc_dapm_pga: | ||
2262 | + case snd_soc_dapm_out_drv: | ||
2263 | wname_in_long_name = true; | ||
2264 | kcname_in_long_name = true; | ||
2265 | break; | ||
2266 | @@ -3015,6 +3016,9 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol, | ||
2267 | } | ||
2268 | mutex_unlock(&card->dapm_mutex); | ||
2269 | |||
2270 | + if (ret) | ||
2271 | + return ret; | ||
2272 | + | ||
2273 | if (invert) | ||
2274 | ucontrol->value.integer.value[0] = max - val; | ||
2275 | else | ||
2276 | @@ -3166,7 +3170,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, | ||
2277 | if (e->shift_l != e->shift_r) { | ||
2278 | if (item[1] > e->items) | ||
2279 | return -EINVAL; | ||
2280 | - val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_l; | ||
2281 | + val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r; | ||
2282 | mask |= e->mask << e->shift_r; | ||
2283 | } | ||
2284 | |||
2285 | diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c | ||
2286 | index 6963ba20991c..70396d3f6472 100644 | ||
2287 | --- a/sound/soc/soc-topology.c | ||
2288 | +++ b/sound/soc/soc-topology.c | ||
2289 | @@ -1484,6 +1484,7 @@ widget: | ||
2290 | if (widget == NULL) { | ||
2291 | dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n", | ||
2292 | w->name); | ||
2293 | + ret = -ENOMEM; | ||
2294 | goto hdr_err; | ||
2295 | } | ||
2296 | |||
2297 | diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c | ||
2298 | index 3900386a3629..d802938644b5 100644 | ||
2299 | --- a/tools/perf/ui/browsers/hists.c | ||
2300 | +++ b/tools/perf/ui/browsers/hists.c | ||
2301 | @@ -684,7 +684,6 @@ static int __hpp__slsmg_color_printf(struct perf_hpp *hpp, const char *fmt, ...) | ||
2302 | ret = scnprintf(hpp->buf, hpp->size, fmt, len, percent); | ||
2303 | ui_browser__printf(arg->b, "%s", hpp->buf); | ||
2304 | |||
2305 | - advance_hpp(hpp, ret); | ||
2306 | return ret; | ||
2307 | } | ||
2308 | |||
2309 | diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c | ||
2310 | index 4a3a72cb5805..6ce624cb7001 100644 | ||
2311 | --- a/tools/perf/util/stat.c | ||
2312 | +++ b/tools/perf/util/stat.c | ||
2313 | @@ -311,6 +311,16 @@ int perf_stat_process_counter(struct perf_stat_config *config, | ||
2314 | |||
2315 | aggr->val = aggr->ena = aggr->run = 0; | ||
2316 | |||
2317 | + /* | ||
2318 | + * We calculate counter's data every interval, | ||
2319 | + * and the display code shows ps->res_stats | ||
2320 | + * avg value. We need to zero the stats for | ||
2321 | + * interval mode, otherwise overall avg running | ||
2322 | + * averages will be shown for each interval. | ||
2323 | + */ | ||
2324 | + if (config->interval) | ||
2325 | + init_stats(ps->res_stats); | ||
2326 | + | ||
2327 | if (counter->per_pkg) | ||
2328 | zero_per_pkg(counter); | ||
2329 | |||
2330 | diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c | ||
2331 | index 475d88d0a1c9..27ae382feb2d 100644 | ||
2332 | --- a/tools/perf/util/symbol-elf.c | ||
2333 | +++ b/tools/perf/util/symbol-elf.c | ||
2334 | @@ -1091,9 +1091,8 @@ new_symbol: | ||
2335 | * For misannotated, zeroed, ASM function sizes. | ||
2336 | */ | ||
2337 | if (nr > 0) { | ||
2338 | - if (!symbol_conf.allow_aliases) | ||
2339 | - symbols__fixup_duplicate(&dso->symbols[map->type]); | ||
2340 | symbols__fixup_end(&dso->symbols[map->type]); | ||
2341 | + symbols__fixup_duplicate(&dso->symbols[map->type]); | ||
2342 | if (kmap) { | ||
2343 | /* | ||
2344 | * We need to fixup this here too because we create new | ||
2345 | diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c | ||
2346 | index cd08027a6d2c..520a32a12f8a 100644 | ||
2347 | --- a/tools/perf/util/symbol.c | ||
2348 | +++ b/tools/perf/util/symbol.c | ||
2349 | @@ -151,6 +151,9 @@ void symbols__fixup_duplicate(struct rb_root *symbols) | ||
2350 | struct rb_node *nd; | ||
2351 | struct symbol *curr, *next; | ||
2352 | |||
2353 | + if (symbol_conf.allow_aliases) | ||
2354 | + return; | ||
2355 | + | ||
2356 | nd = rb_first(symbols); | ||
2357 | |||
2358 | while (nd) { | ||
2359 | @@ -1275,8 +1278,8 @@ int dso__load_kallsyms(struct dso *dso, const char *filename, | ||
2360 | if (kallsyms__delta(map, filename, &delta)) | ||
2361 | return -1; | ||
2362 | |||
2363 | - symbols__fixup_duplicate(&dso->symbols[map->type]); | ||
2364 | symbols__fixup_end(&dso->symbols[map->type]); | ||
2365 | + symbols__fixup_duplicate(&dso->symbols[map->type]); | ||
2366 | |||
2367 | if (dso->kernel == DSO_TYPE_GUEST_KERNEL) | ||
2368 | dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS; |