Annotation of /trunk/kernel-alx/patches-4.4/0154-4.4.55-all-fixes.patch
Parent Directory | Revision Log
Revision 2890 -
(hide annotations)
(download)
Mon Mar 27 13:49:27 2017 UTC (7 years, 1 month ago) by niro
File size: 39567 byte(s)
Mon Mar 27 13:49:27 2017 UTC (7 years, 1 month ago) by niro
File size: 39567 byte(s)
linux-4.4.55
1 | niro | 2890 | diff --git a/Makefile b/Makefile |
2 | index 7f54ac081cf3..d9cc21df444d 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 4 | ||
8 | -SUBLEVEL = 54 | ||
9 | +SUBLEVEL = 55 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Blurry Fish Butt | ||
12 | |||
13 | diff --git a/arch/mips/configs/ip22_defconfig b/arch/mips/configs/ip22_defconfig | ||
14 | index 57ed466e00db..2f140d75d01c 100644 | ||
15 | --- a/arch/mips/configs/ip22_defconfig | ||
16 | +++ b/arch/mips/configs/ip22_defconfig | ||
17 | @@ -68,8 +68,8 @@ CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
18 | CONFIG_NF_CONNTRACK=m | ||
19 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
20 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
21 | -CONFIG_NF_CT_PROTO_DCCP=m | ||
22 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
23 | +CONFIG_NF_CT_PROTO_DCCP=y | ||
24 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
25 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
26 | CONFIG_NF_CONNTRACK_FTP=m | ||
27 | CONFIG_NF_CONNTRACK_H323=m | ||
28 | diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig | ||
29 | index 48e16d98b2cc..b15508447366 100644 | ||
30 | --- a/arch/mips/configs/ip27_defconfig | ||
31 | +++ b/arch/mips/configs/ip27_defconfig | ||
32 | @@ -134,7 +134,7 @@ CONFIG_LIBFC=m | ||
33 | CONFIG_SCSI_QLOGIC_1280=y | ||
34 | CONFIG_SCSI_PMCRAID=m | ||
35 | CONFIG_SCSI_BFA_FC=m | ||
36 | -CONFIG_SCSI_DH=m | ||
37 | +CONFIG_SCSI_DH=y | ||
38 | CONFIG_SCSI_DH_RDAC=m | ||
39 | CONFIG_SCSI_DH_HP_SW=m | ||
40 | CONFIG_SCSI_DH_EMC=m | ||
41 | @@ -206,7 +206,6 @@ CONFIG_MLX4_EN=m | ||
42 | # CONFIG_MLX4_DEBUG is not set | ||
43 | CONFIG_TEHUTI=m | ||
44 | CONFIG_BNX2X=m | ||
45 | -CONFIG_QLGE=m | ||
46 | CONFIG_SFC=m | ||
47 | CONFIG_BE2NET=m | ||
48 | CONFIG_LIBERTAS_THINFIRM=m | ||
49 | diff --git a/arch/mips/configs/lemote2f_defconfig b/arch/mips/configs/lemote2f_defconfig | ||
50 | index 004cf52d1b7d..c24b87819ccb 100644 | ||
51 | --- a/arch/mips/configs/lemote2f_defconfig | ||
52 | +++ b/arch/mips/configs/lemote2f_defconfig | ||
53 | @@ -39,7 +39,7 @@ CONFIG_HIBERNATION=y | ||
54 | CONFIG_PM_STD_PARTITION="/dev/hda3" | ||
55 | CONFIG_CPU_FREQ=y | ||
56 | CONFIG_CPU_FREQ_DEBUG=y | ||
57 | -CONFIG_CPU_FREQ_STAT=m | ||
58 | +CONFIG_CPU_FREQ_STAT=y | ||
59 | CONFIG_CPU_FREQ_STAT_DETAILS=y | ||
60 | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||
61 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
62 | diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig | ||
63 | index 5afb4840aec7..739ccd0dca64 100644 | ||
64 | --- a/arch/mips/configs/malta_defconfig | ||
65 | +++ b/arch/mips/configs/malta_defconfig | ||
66 | @@ -59,8 +59,8 @@ CONFIG_NETFILTER=y | ||
67 | CONFIG_NF_CONNTRACK=m | ||
68 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
69 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
70 | -CONFIG_NF_CT_PROTO_DCCP=m | ||
71 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
72 | +CONFIG_NF_CT_PROTO_DCCP=y | ||
73 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
74 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
75 | CONFIG_NF_CONNTRACK_FTP=m | ||
76 | CONFIG_NF_CONNTRACK_H323=m | ||
77 | diff --git a/arch/mips/configs/malta_kvm_defconfig b/arch/mips/configs/malta_kvm_defconfig | ||
78 | index 98f13879bb8f..47f4ecf125ba 100644 | ||
79 | --- a/arch/mips/configs/malta_kvm_defconfig | ||
80 | +++ b/arch/mips/configs/malta_kvm_defconfig | ||
81 | @@ -60,8 +60,8 @@ CONFIG_NETFILTER=y | ||
82 | CONFIG_NF_CONNTRACK=m | ||
83 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
84 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
85 | -CONFIG_NF_CT_PROTO_DCCP=m | ||
86 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
87 | +CONFIG_NF_CT_PROTO_DCCP=y | ||
88 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
89 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
90 | CONFIG_NF_CONNTRACK_FTP=m | ||
91 | CONFIG_NF_CONNTRACK_H323=m | ||
92 | diff --git a/arch/mips/configs/malta_kvm_guest_defconfig b/arch/mips/configs/malta_kvm_guest_defconfig | ||
93 | index 3b5d5913f548..e79d325aa085 100644 | ||
94 | --- a/arch/mips/configs/malta_kvm_guest_defconfig | ||
95 | +++ b/arch/mips/configs/malta_kvm_guest_defconfig | ||
96 | @@ -59,8 +59,8 @@ CONFIG_NETFILTER=y | ||
97 | CONFIG_NF_CONNTRACK=m | ||
98 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
99 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
100 | -CONFIG_NF_CT_PROTO_DCCP=m | ||
101 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
102 | +CONFIG_NF_CT_PROTO_DCCP=y | ||
103 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
104 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
105 | CONFIG_NF_CONNTRACK_FTP=m | ||
106 | CONFIG_NF_CONNTRACK_H323=m | ||
107 | diff --git a/arch/mips/configs/maltaup_xpa_defconfig b/arch/mips/configs/maltaup_xpa_defconfig | ||
108 | index 732215732751..ae87ad86243b 100644 | ||
109 | --- a/arch/mips/configs/maltaup_xpa_defconfig | ||
110 | +++ b/arch/mips/configs/maltaup_xpa_defconfig | ||
111 | @@ -61,8 +61,8 @@ CONFIG_NETFILTER=y | ||
112 | CONFIG_NF_CONNTRACK=m | ||
113 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
114 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
115 | -CONFIG_NF_CT_PROTO_DCCP=m | ||
116 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
117 | +CONFIG_NF_CT_PROTO_DCCP=y | ||
118 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
119 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
120 | CONFIG_NF_CONNTRACK_FTP=m | ||
121 | CONFIG_NF_CONNTRACK_H323=m | ||
122 | diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig | ||
123 | index b3d1d37f85ea..47492fee2952 100644 | ||
124 | --- a/arch/mips/configs/nlm_xlp_defconfig | ||
125 | +++ b/arch/mips/configs/nlm_xlp_defconfig | ||
126 | @@ -111,7 +111,7 @@ CONFIG_NETFILTER=y | ||
127 | CONFIG_NF_CONNTRACK=m | ||
128 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
129 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
130 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
131 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
132 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
133 | CONFIG_NF_CONNTRACK_FTP=m | ||
134 | CONFIG_NF_CONNTRACK_H323=m | ||
135 | diff --git a/arch/mips/configs/nlm_xlr_defconfig b/arch/mips/configs/nlm_xlr_defconfig | ||
136 | index 3d8016d6cf3e..472a818f1eb8 100644 | ||
137 | --- a/arch/mips/configs/nlm_xlr_defconfig | ||
138 | +++ b/arch/mips/configs/nlm_xlr_defconfig | ||
139 | @@ -91,7 +91,7 @@ CONFIG_NETFILTER=y | ||
140 | CONFIG_NF_CONNTRACK=m | ||
141 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
142 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
143 | -CONFIG_NF_CT_PROTO_UDPLITE=m | ||
144 | +CONFIG_NF_CT_PROTO_UDPLITE=y | ||
145 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
146 | CONFIG_NF_CONNTRACK_FTP=m | ||
147 | CONFIG_NF_CONNTRACK_H323=m | ||
148 | diff --git a/arch/mips/dec/int-handler.S b/arch/mips/dec/int-handler.S | ||
149 | index 8c6f508e59de..554d1da97743 100644 | ||
150 | --- a/arch/mips/dec/int-handler.S | ||
151 | +++ b/arch/mips/dec/int-handler.S | ||
152 | @@ -146,7 +146,25 @@ | ||
153 | /* | ||
154 | * Find irq with highest priority | ||
155 | */ | ||
156 | - PTR_LA t1,cpu_mask_nr_tbl | ||
157 | + # open coded PTR_LA t1, cpu_mask_nr_tbl | ||
158 | +#if (_MIPS_SZPTR == 32) | ||
159 | + # open coded la t1, cpu_mask_nr_tbl | ||
160 | + lui t1, %hi(cpu_mask_nr_tbl) | ||
161 | + addiu t1, %lo(cpu_mask_nr_tbl) | ||
162 | + | ||
163 | +#endif | ||
164 | +#if (_MIPS_SZPTR == 64) | ||
165 | + # open coded dla t1, cpu_mask_nr_tbl | ||
166 | + .set push | ||
167 | + .set noat | ||
168 | + lui t1, %highest(cpu_mask_nr_tbl) | ||
169 | + lui AT, %hi(cpu_mask_nr_tbl) | ||
170 | + daddiu t1, t1, %higher(cpu_mask_nr_tbl) | ||
171 | + daddiu AT, AT, %lo(cpu_mask_nr_tbl) | ||
172 | + dsll t1, 32 | ||
173 | + daddu t1, t1, AT | ||
174 | + .set pop | ||
175 | +#endif | ||
176 | 1: lw t2,(t1) | ||
177 | nop | ||
178 | and t2,t0 | ||
179 | @@ -195,7 +213,25 @@ | ||
180 | /* | ||
181 | * Find irq with highest priority | ||
182 | */ | ||
183 | - PTR_LA t1,asic_mask_nr_tbl | ||
184 | + # open coded PTR_LA t1,asic_mask_nr_tbl | ||
185 | +#if (_MIPS_SZPTR == 32) | ||
186 | + # open coded la t1, asic_mask_nr_tbl | ||
187 | + lui t1, %hi(asic_mask_nr_tbl) | ||
188 | + addiu t1, %lo(asic_mask_nr_tbl) | ||
189 | + | ||
190 | +#endif | ||
191 | +#if (_MIPS_SZPTR == 64) | ||
192 | + # open coded dla t1, asic_mask_nr_tbl | ||
193 | + .set push | ||
194 | + .set noat | ||
195 | + lui t1, %highest(asic_mask_nr_tbl) | ||
196 | + lui AT, %hi(asic_mask_nr_tbl) | ||
197 | + daddiu t1, t1, %higher(asic_mask_nr_tbl) | ||
198 | + daddiu AT, AT, %lo(asic_mask_nr_tbl) | ||
199 | + dsll t1, 32 | ||
200 | + daddu t1, t1, AT | ||
201 | + .set pop | ||
202 | +#endif | ||
203 | 2: lw t2,(t1) | ||
204 | nop | ||
205 | and t2,t0 | ||
206 | diff --git a/arch/mips/netlogic/common/reset.S b/arch/mips/netlogic/common/reset.S | ||
207 | index edbab9b8691f..c474981a6c0d 100644 | ||
208 | --- a/arch/mips/netlogic/common/reset.S | ||
209 | +++ b/arch/mips/netlogic/common/reset.S | ||
210 | @@ -50,7 +50,6 @@ | ||
211 | #include <asm/netlogic/xlp-hal/sys.h> | ||
212 | #include <asm/netlogic/xlp-hal/cpucontrol.h> | ||
213 | |||
214 | -#define CP0_EBASE $15 | ||
215 | #define SYS_CPU_COHERENT_BASE CKSEG1ADDR(XLP_DEFAULT_IO_BASE) + \ | ||
216 | XLP_IO_SYS_OFFSET(0) + XLP_IO_PCI_HDRSZ + \ | ||
217 | SYS_CPU_NONCOHERENT_MODE * 4 | ||
218 | @@ -92,7 +91,7 @@ | ||
219 | * registers. On XLPII CPUs, usual cache instructions work. | ||
220 | */ | ||
221 | .macro xlp_flush_l1_dcache | ||
222 | - mfc0 t0, CP0_EBASE, 0 | ||
223 | + mfc0 t0, CP0_PRID | ||
224 | andi t0, t0, PRID_IMP_MASK | ||
225 | slt t1, t0, 0x1200 | ||
226 | beqz t1, 15f | ||
227 | @@ -171,7 +170,7 @@ FEXPORT(nlm_reset_entry) | ||
228 | nop | ||
229 | |||
230 | 1: /* Entry point on core wakeup */ | ||
231 | - mfc0 t0, CP0_EBASE, 0 /* processor ID */ | ||
232 | + mfc0 t0, CP0_PRID /* processor ID */ | ||
233 | andi t0, PRID_IMP_MASK | ||
234 | li t1, 0x1500 /* XLP 9xx */ | ||
235 | beq t0, t1, 2f /* does not need to set coherent */ | ||
236 | @@ -182,8 +181,8 @@ FEXPORT(nlm_reset_entry) | ||
237 | nop | ||
238 | |||
239 | /* set bit in SYS coherent register for the core */ | ||
240 | - mfc0 t0, CP0_EBASE, 1 | ||
241 | - mfc0 t1, CP0_EBASE, 1 | ||
242 | + mfc0 t0, CP0_EBASE | ||
243 | + mfc0 t1, CP0_EBASE | ||
244 | srl t1, 5 | ||
245 | andi t1, 0x3 /* t1 <- node */ | ||
246 | li t2, 0x40000 | ||
247 | @@ -232,7 +231,7 @@ EXPORT(nlm_boot_siblings) | ||
248 | |||
249 | * NOTE: All GPR contents are lost after the mtcr above! | ||
250 | */ | ||
251 | - mfc0 v0, CP0_EBASE, 1 | ||
252 | + mfc0 v0, CP0_EBASE | ||
253 | andi v0, 0x3ff /* v0 <- node/core */ | ||
254 | |||
255 | /* | ||
256 | diff --git a/arch/mips/netlogic/common/smpboot.S b/arch/mips/netlogic/common/smpboot.S | ||
257 | index 805355b0bd05..f0cc4c9de2bb 100644 | ||
258 | --- a/arch/mips/netlogic/common/smpboot.S | ||
259 | +++ b/arch/mips/netlogic/common/smpboot.S | ||
260 | @@ -48,8 +48,6 @@ | ||
261 | #include <asm/netlogic/xlp-hal/sys.h> | ||
262 | #include <asm/netlogic/xlp-hal/cpucontrol.h> | ||
263 | |||
264 | -#define CP0_EBASE $15 | ||
265 | - | ||
266 | .set noreorder | ||
267 | .set noat | ||
268 | .set arch=xlr /* for mfcr/mtcr, XLR is sufficient */ | ||
269 | @@ -86,7 +84,7 @@ NESTED(nlm_boot_secondary_cpus, 16, sp) | ||
270 | PTR_L gp, 0(t1) | ||
271 | |||
272 | /* a0 has the processor id */ | ||
273 | - mfc0 a0, CP0_EBASE, 1 | ||
274 | + mfc0 a0, CP0_EBASE | ||
275 | andi a0, 0x3ff /* a0 <- node/core */ | ||
276 | PTR_LA t0, nlm_early_init_secondary | ||
277 | jalr t0 | ||
278 | diff --git a/arch/mips/ralink/prom.c b/arch/mips/ralink/prom.c | ||
279 | index 39a9142f71be..7ecb4af79b7b 100644 | ||
280 | --- a/arch/mips/ralink/prom.c | ||
281 | +++ b/arch/mips/ralink/prom.c | ||
282 | @@ -30,8 +30,10 @@ const char *get_system_type(void) | ||
283 | return soc_info.sys_type; | ||
284 | } | ||
285 | |||
286 | -static __init void prom_init_cmdline(int argc, char **argv) | ||
287 | +static __init void prom_init_cmdline(void) | ||
288 | { | ||
289 | + int argc; | ||
290 | + char **argv; | ||
291 | int i; | ||
292 | |||
293 | pr_debug("prom: fw_arg0=%08x fw_arg1=%08x fw_arg2=%08x fw_arg3=%08x\n", | ||
294 | @@ -60,14 +62,11 @@ static __init void prom_init_cmdline(int argc, char **argv) | ||
295 | |||
296 | void __init prom_init(void) | ||
297 | { | ||
298 | - int argc; | ||
299 | - char **argv; | ||
300 | - | ||
301 | prom_soc_init(&soc_info); | ||
302 | |||
303 | pr_info("SoC Type: %s\n", get_system_type()); | ||
304 | |||
305 | - prom_init_cmdline(argc, argv); | ||
306 | + prom_init_cmdline(); | ||
307 | } | ||
308 | |||
309 | void __init prom_free_prom_memory(void) | ||
310 | diff --git a/arch/mips/ralink/rt288x.c b/arch/mips/ralink/rt288x.c | ||
311 | index 844f5cd55c8f..15506a1ff22a 100644 | ||
312 | --- a/arch/mips/ralink/rt288x.c | ||
313 | +++ b/arch/mips/ralink/rt288x.c | ||
314 | @@ -40,16 +40,6 @@ static struct rt2880_pmx_group rt2880_pinmux_data_act[] = { | ||
315 | { 0 } | ||
316 | }; | ||
317 | |||
318 | -static void rt288x_wdt_reset(void) | ||
319 | -{ | ||
320 | - u32 t; | ||
321 | - | ||
322 | - /* enable WDT reset output on pin SRAM_CS_N */ | ||
323 | - t = rt_sysc_r32(SYSC_REG_CLKCFG); | ||
324 | - t |= CLKCFG_SRAM_CS_N_WDT; | ||
325 | - rt_sysc_w32(t, SYSC_REG_CLKCFG); | ||
326 | -} | ||
327 | - | ||
328 | void __init ralink_clk_init(void) | ||
329 | { | ||
330 | unsigned long cpu_rate, wmac_rate = 40000000; | ||
331 | diff --git a/arch/mips/ralink/rt305x.c b/arch/mips/ralink/rt305x.c | ||
332 | index 9e4572592065..15b32cd01906 100644 | ||
333 | --- a/arch/mips/ralink/rt305x.c | ||
334 | +++ b/arch/mips/ralink/rt305x.c | ||
335 | @@ -89,17 +89,6 @@ static struct rt2880_pmx_group rt5350_pinmux_data[] = { | ||
336 | { 0 } | ||
337 | }; | ||
338 | |||
339 | -static void rt305x_wdt_reset(void) | ||
340 | -{ | ||
341 | - u32 t; | ||
342 | - | ||
343 | - /* enable WDT reset output on pin SRAM_CS_N */ | ||
344 | - t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG); | ||
345 | - t |= RT305X_SYSCFG_SRAM_CS0_MODE_WDT << | ||
346 | - RT305X_SYSCFG_SRAM_CS0_MODE_SHIFT; | ||
347 | - rt_sysc_w32(t, SYSC_REG_SYSTEM_CONFIG); | ||
348 | -} | ||
349 | - | ||
350 | static unsigned long rt5350_get_mem_size(void) | ||
351 | { | ||
352 | void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT305X_SYSC_BASE); | ||
353 | diff --git a/arch/mips/ralink/rt3883.c b/arch/mips/ralink/rt3883.c | ||
354 | index 582995aaaf4e..f42834c7f007 100644 | ||
355 | --- a/arch/mips/ralink/rt3883.c | ||
356 | +++ b/arch/mips/ralink/rt3883.c | ||
357 | @@ -63,16 +63,6 @@ static struct rt2880_pmx_group rt3883_pinmux_data[] = { | ||
358 | { 0 } | ||
359 | }; | ||
360 | |||
361 | -static void rt3883_wdt_reset(void) | ||
362 | -{ | ||
363 | - u32 t; | ||
364 | - | ||
365 | - /* enable WDT reset output on GPIO 2 */ | ||
366 | - t = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG1); | ||
367 | - t |= RT3883_SYSCFG1_GPIO2_AS_WDT_OUT; | ||
368 | - rt_sysc_w32(t, RT3883_SYSC_REG_SYSCFG1); | ||
369 | -} | ||
370 | - | ||
371 | void __init ralink_clk_init(void) | ||
372 | { | ||
373 | unsigned long cpu_rate, sys_rate; | ||
374 | diff --git a/arch/mips/sgi-ip22/Platform b/arch/mips/sgi-ip22/Platform | ||
375 | index b7a4b7e04c38..e8f6b3a42a48 100644 | ||
376 | --- a/arch/mips/sgi-ip22/Platform | ||
377 | +++ b/arch/mips/sgi-ip22/Platform | ||
378 | @@ -25,7 +25,7 @@ endif | ||
379 | # Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys | ||
380 | # | ||
381 | ifdef CONFIG_SGI_IP28 | ||
382 | - ifeq ($(call cc-option-yn,-mr10k-cache-barrier=store), n) | ||
383 | + ifeq ($(call cc-option-yn,-march=r10000 -mr10k-cache-barrier=store), n) | ||
384 | $(error gcc doesn't support needed option -mr10k-cache-barrier=store) | ||
385 | endif | ||
386 | endif | ||
387 | diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c | ||
388 | index dc885b30f7a6..4014881e9843 100644 | ||
389 | --- a/arch/powerpc/lib/sstep.c | ||
390 | +++ b/arch/powerpc/lib/sstep.c | ||
391 | @@ -1806,8 +1806,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
392 | goto instr_done; | ||
393 | |||
394 | case LARX: | ||
395 | - if (regs->msr & MSR_LE) | ||
396 | - return 0; | ||
397 | if (op.ea & (size - 1)) | ||
398 | break; /* can't handle misaligned */ | ||
399 | err = -EFAULT; | ||
400 | @@ -1829,8 +1827,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
401 | goto ldst_done; | ||
402 | |||
403 | case STCX: | ||
404 | - if (regs->msr & MSR_LE) | ||
405 | - return 0; | ||
406 | if (op.ea & (size - 1)) | ||
407 | break; /* can't handle misaligned */ | ||
408 | err = -EFAULT; | ||
409 | @@ -1854,8 +1850,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
410 | goto ldst_done; | ||
411 | |||
412 | case LOAD: | ||
413 | - if (regs->msr & MSR_LE) | ||
414 | - return 0; | ||
415 | err = read_mem(®s->gpr[op.reg], op.ea, size, regs); | ||
416 | if (!err) { | ||
417 | if (op.type & SIGNEXT) | ||
418 | @@ -1867,8 +1861,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
419 | |||
420 | #ifdef CONFIG_PPC_FPU | ||
421 | case LOAD_FP: | ||
422 | - if (regs->msr & MSR_LE) | ||
423 | - return 0; | ||
424 | if (size == 4) | ||
425 | err = do_fp_load(op.reg, do_lfs, op.ea, size, regs); | ||
426 | else | ||
427 | @@ -1877,15 +1869,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
428 | #endif | ||
429 | #ifdef CONFIG_ALTIVEC | ||
430 | case LOAD_VMX: | ||
431 | - if (regs->msr & MSR_LE) | ||
432 | - return 0; | ||
433 | err = do_vec_load(op.reg, do_lvx, op.ea & ~0xfUL, regs); | ||
434 | goto ldst_done; | ||
435 | #endif | ||
436 | #ifdef CONFIG_VSX | ||
437 | case LOAD_VSX: | ||
438 | - if (regs->msr & MSR_LE) | ||
439 | - return 0; | ||
440 | err = do_vsx_load(op.reg, do_lxvd2x, op.ea, regs); | ||
441 | goto ldst_done; | ||
442 | #endif | ||
443 | @@ -1908,8 +1896,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
444 | goto instr_done; | ||
445 | |||
446 | case STORE: | ||
447 | - if (regs->msr & MSR_LE) | ||
448 | - return 0; | ||
449 | if ((op.type & UPDATE) && size == sizeof(long) && | ||
450 | op.reg == 1 && op.update_reg == 1 && | ||
451 | !(regs->msr & MSR_PR) && | ||
452 | @@ -1922,8 +1908,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
453 | |||
454 | #ifdef CONFIG_PPC_FPU | ||
455 | case STORE_FP: | ||
456 | - if (regs->msr & MSR_LE) | ||
457 | - return 0; | ||
458 | if (size == 4) | ||
459 | err = do_fp_store(op.reg, do_stfs, op.ea, size, regs); | ||
460 | else | ||
461 | @@ -1932,15 +1916,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) | ||
462 | #endif | ||
463 | #ifdef CONFIG_ALTIVEC | ||
464 | case STORE_VMX: | ||
465 | - if (regs->msr & MSR_LE) | ||
466 | - return 0; | ||
467 | err = do_vec_store(op.reg, do_stvx, op.ea & ~0xfUL, regs); | ||
468 | goto ldst_done; | ||
469 | #endif | ||
470 | #ifdef CONFIG_VSX | ||
471 | case STORE_VSX: | ||
472 | - if (regs->msr & MSR_LE) | ||
473 | - return 0; | ||
474 | err = do_vsx_store(op.reg, do_stxvd2x, op.ea, regs); | ||
475 | goto ldst_done; | ||
476 | #endif | ||
477 | diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c | ||
478 | index 171e09bb8ea2..f7c3a61040bd 100644 | ||
479 | --- a/arch/s390/kernel/crash_dump.c | ||
480 | +++ b/arch/s390/kernel/crash_dump.c | ||
481 | @@ -23,6 +23,8 @@ | ||
482 | #define PTR_SUB(x, y) (((char *) (x)) - ((unsigned long) (y))) | ||
483 | #define PTR_DIFF(x, y) ((unsigned long)(((char *) (x)) - ((unsigned long) (y)))) | ||
484 | |||
485 | +#define LINUX_NOTE_NAME "LINUX" | ||
486 | + | ||
487 | static struct memblock_region oldmem_region; | ||
488 | |||
489 | static struct memblock_type oldmem_type = { | ||
490 | @@ -312,7 +314,7 @@ static void *nt_fpregset(void *ptr, struct save_area *sa) | ||
491 | static void *nt_s390_timer(void *ptr, struct save_area *sa) | ||
492 | { | ||
493 | return nt_init(ptr, NT_S390_TIMER, &sa->timer, sizeof(sa->timer), | ||
494 | - KEXEC_CORE_NOTE_NAME); | ||
495 | + LINUX_NOTE_NAME); | ||
496 | } | ||
497 | |||
498 | /* | ||
499 | @@ -321,7 +323,7 @@ static void *nt_s390_timer(void *ptr, struct save_area *sa) | ||
500 | static void *nt_s390_tod_cmp(void *ptr, struct save_area *sa) | ||
501 | { | ||
502 | return nt_init(ptr, NT_S390_TODCMP, &sa->clk_cmp, | ||
503 | - sizeof(sa->clk_cmp), KEXEC_CORE_NOTE_NAME); | ||
504 | + sizeof(sa->clk_cmp), LINUX_NOTE_NAME); | ||
505 | } | ||
506 | |||
507 | /* | ||
508 | @@ -330,7 +332,7 @@ static void *nt_s390_tod_cmp(void *ptr, struct save_area *sa) | ||
509 | static void *nt_s390_tod_preg(void *ptr, struct save_area *sa) | ||
510 | { | ||
511 | return nt_init(ptr, NT_S390_TODPREG, &sa->tod_reg, | ||
512 | - sizeof(sa->tod_reg), KEXEC_CORE_NOTE_NAME); | ||
513 | + sizeof(sa->tod_reg), LINUX_NOTE_NAME); | ||
514 | } | ||
515 | |||
516 | /* | ||
517 | @@ -339,7 +341,7 @@ static void *nt_s390_tod_preg(void *ptr, struct save_area *sa) | ||
518 | static void *nt_s390_ctrs(void *ptr, struct save_area *sa) | ||
519 | { | ||
520 | return nt_init(ptr, NT_S390_CTRS, &sa->ctrl_regs, | ||
521 | - sizeof(sa->ctrl_regs), KEXEC_CORE_NOTE_NAME); | ||
522 | + sizeof(sa->ctrl_regs), LINUX_NOTE_NAME); | ||
523 | } | ||
524 | |||
525 | /* | ||
526 | @@ -348,7 +350,7 @@ static void *nt_s390_ctrs(void *ptr, struct save_area *sa) | ||
527 | static void *nt_s390_prefix(void *ptr, struct save_area *sa) | ||
528 | { | ||
529 | return nt_init(ptr, NT_S390_PREFIX, &sa->pref_reg, | ||
530 | - sizeof(sa->pref_reg), KEXEC_CORE_NOTE_NAME); | ||
531 | + sizeof(sa->pref_reg), LINUX_NOTE_NAME); | ||
532 | } | ||
533 | |||
534 | /* | ||
535 | @@ -357,7 +359,7 @@ static void *nt_s390_prefix(void *ptr, struct save_area *sa) | ||
536 | static void *nt_s390_vx_high(void *ptr, __vector128 *vx_regs) | ||
537 | { | ||
538 | return nt_init(ptr, NT_S390_VXRS_HIGH, &vx_regs[16], | ||
539 | - 16 * sizeof(__vector128), KEXEC_CORE_NOTE_NAME); | ||
540 | + 16 * sizeof(__vector128), LINUX_NOTE_NAME); | ||
541 | } | ||
542 | |||
543 | /* | ||
544 | @@ -370,12 +372,12 @@ static void *nt_s390_vx_low(void *ptr, __vector128 *vx_regs) | ||
545 | int i; | ||
546 | |||
547 | note = (Elf64_Nhdr *)ptr; | ||
548 | - note->n_namesz = strlen(KEXEC_CORE_NOTE_NAME) + 1; | ||
549 | + note->n_namesz = strlen(LINUX_NOTE_NAME) + 1; | ||
550 | note->n_descsz = 16 * 8; | ||
551 | note->n_type = NT_S390_VXRS_LOW; | ||
552 | len = sizeof(Elf64_Nhdr); | ||
553 | |||
554 | - memcpy(ptr + len, KEXEC_CORE_NOTE_NAME, note->n_namesz); | ||
555 | + memcpy(ptr + len, LINUX_NOTE_NAME, note->n_namesz); | ||
556 | len = roundup(len + note->n_namesz, 4); | ||
557 | |||
558 | ptr += len; | ||
559 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c | ||
560 | index 8345ae1f117d..05ae254f84cf 100644 | ||
561 | --- a/arch/s390/mm/pgtable.c | ||
562 | +++ b/arch/s390/mm/pgtable.c | ||
563 | @@ -1237,11 +1237,28 @@ EXPORT_SYMBOL_GPL(s390_reset_cmma); | ||
564 | */ | ||
565 | bool gmap_test_and_clear_dirty(unsigned long address, struct gmap *gmap) | ||
566 | { | ||
567 | + pgd_t *pgd; | ||
568 | + pud_t *pud; | ||
569 | + pmd_t *pmd; | ||
570 | pte_t *pte; | ||
571 | spinlock_t *ptl; | ||
572 | bool dirty = false; | ||
573 | |||
574 | - pte = get_locked_pte(gmap->mm, address, &ptl); | ||
575 | + pgd = pgd_offset(gmap->mm, address); | ||
576 | + pud = pud_alloc(gmap->mm, pgd, address); | ||
577 | + if (!pud) | ||
578 | + return false; | ||
579 | + pmd = pmd_alloc(gmap->mm, pud, address); | ||
580 | + if (!pmd) | ||
581 | + return false; | ||
582 | + /* We can't run guests backed by huge pages, but userspace can | ||
583 | + * still set them up and then try to migrate them without any | ||
584 | + * migration support. | ||
585 | + */ | ||
586 | + if (pmd_large(*pmd)) | ||
587 | + return true; | ||
588 | + | ||
589 | + pte = pte_alloc_map_lock(gmap->mm, pmd, address, &ptl); | ||
590 | if (unlikely(!pte)) | ||
591 | return false; | ||
592 | |||
593 | diff --git a/crypto/Makefile b/crypto/Makefile | ||
594 | index 82fbff180ad3..03e66097eb0c 100644 | ||
595 | --- a/crypto/Makefile | ||
596 | +++ b/crypto/Makefile | ||
597 | @@ -62,6 +62,7 @@ obj-$(CONFIG_CRYPTO_SHA1) += sha1_generic.o | ||
598 | obj-$(CONFIG_CRYPTO_SHA256) += sha256_generic.o | ||
599 | obj-$(CONFIG_CRYPTO_SHA512) += sha512_generic.o | ||
600 | obj-$(CONFIG_CRYPTO_WP512) += wp512.o | ||
601 | +CFLAGS_wp512.o := $(call cc-option,-fno-schedule-insns) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149 | ||
602 | obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o | ||
603 | obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o | ||
604 | obj-$(CONFIG_CRYPTO_ECB) += ecb.o | ||
605 | @@ -85,6 +86,7 @@ obj-$(CONFIG_CRYPTO_BLOWFISH_COMMON) += blowfish_common.o | ||
606 | obj-$(CONFIG_CRYPTO_TWOFISH) += twofish_generic.o | ||
607 | obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o | ||
608 | obj-$(CONFIG_CRYPTO_SERPENT) += serpent_generic.o | ||
609 | +CFLAGS_serpent_generic.o := $(call cc-option,-fsched-pressure) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149 | ||
610 | obj-$(CONFIG_CRYPTO_AES) += aes_generic.o | ||
611 | obj-$(CONFIG_CRYPTO_CAMELLIA) += camellia_generic.o | ||
612 | obj-$(CONFIG_CRYPTO_CAST_COMMON) += cast_common.o | ||
613 | diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c | ||
614 | index c097f477c74c..14c2a07c9f3f 100644 | ||
615 | --- a/drivers/acpi/nfit.c | ||
616 | +++ b/drivers/acpi/nfit.c | ||
617 | @@ -965,7 +965,7 @@ static size_t sizeof_nfit_set_info(int num_mappings) | ||
618 | + num_mappings * sizeof(struct nfit_set_info_map); | ||
619 | } | ||
620 | |||
621 | -static int cmp_map(const void *m0, const void *m1) | ||
622 | +static int cmp_map_compat(const void *m0, const void *m1) | ||
623 | { | ||
624 | const struct nfit_set_info_map *map0 = m0; | ||
625 | const struct nfit_set_info_map *map1 = m1; | ||
626 | @@ -974,6 +974,14 @@ static int cmp_map(const void *m0, const void *m1) | ||
627 | sizeof(u64)); | ||
628 | } | ||
629 | |||
630 | +static int cmp_map(const void *m0, const void *m1) | ||
631 | +{ | ||
632 | + const struct nfit_set_info_map *map0 = m0; | ||
633 | + const struct nfit_set_info_map *map1 = m1; | ||
634 | + | ||
635 | + return map0->region_offset - map1->region_offset; | ||
636 | +} | ||
637 | + | ||
638 | /* Retrieve the nth entry referencing this spa */ | ||
639 | static struct acpi_nfit_memory_map *memdev_from_spa( | ||
640 | struct acpi_nfit_desc *acpi_desc, u16 range_index, int n) | ||
641 | @@ -1029,6 +1037,12 @@ static int acpi_nfit_init_interleave_set(struct acpi_nfit_desc *acpi_desc, | ||
642 | sort(&info->mapping[0], nr, sizeof(struct nfit_set_info_map), | ||
643 | cmp_map, NULL); | ||
644 | nd_set->cookie = nd_fletcher64(info, sizeof_nfit_set_info(nr), 0); | ||
645 | + | ||
646 | + /* support namespaces created with the wrong sort order */ | ||
647 | + sort(&info->mapping[0], nr, sizeof(struct nfit_set_info_map), | ||
648 | + cmp_map_compat, NULL); | ||
649 | + nd_set->altcookie = nd_fletcher64(info, sizeof_nfit_set_info(nr), 0); | ||
650 | + | ||
651 | ndr_desc->nd_set = nd_set; | ||
652 | devm_kfree(dev, info); | ||
653 | |||
654 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c | ||
655 | index 3384a3eef917..397f0454100b 100644 | ||
656 | --- a/drivers/md/dm.c | ||
657 | +++ b/drivers/md/dm.c | ||
658 | @@ -1467,11 +1467,62 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) | ||
659 | } | ||
660 | EXPORT_SYMBOL_GPL(dm_accept_partial_bio); | ||
661 | |||
662 | +/* | ||
663 | + * Flush current->bio_list when the target map method blocks. | ||
664 | + * This fixes deadlocks in snapshot and possibly in other targets. | ||
665 | + */ | ||
666 | +struct dm_offload { | ||
667 | + struct blk_plug plug; | ||
668 | + struct blk_plug_cb cb; | ||
669 | +}; | ||
670 | + | ||
671 | +static void flush_current_bio_list(struct blk_plug_cb *cb, bool from_schedule) | ||
672 | +{ | ||
673 | + struct dm_offload *o = container_of(cb, struct dm_offload, cb); | ||
674 | + struct bio_list list; | ||
675 | + struct bio *bio; | ||
676 | + | ||
677 | + INIT_LIST_HEAD(&o->cb.list); | ||
678 | + | ||
679 | + if (unlikely(!current->bio_list)) | ||
680 | + return; | ||
681 | + | ||
682 | + list = *current->bio_list; | ||
683 | + bio_list_init(current->bio_list); | ||
684 | + | ||
685 | + while ((bio = bio_list_pop(&list))) { | ||
686 | + struct bio_set *bs = bio->bi_pool; | ||
687 | + if (unlikely(!bs) || bs == fs_bio_set) { | ||
688 | + bio_list_add(current->bio_list, bio); | ||
689 | + continue; | ||
690 | + } | ||
691 | + | ||
692 | + spin_lock(&bs->rescue_lock); | ||
693 | + bio_list_add(&bs->rescue_list, bio); | ||
694 | + queue_work(bs->rescue_workqueue, &bs->rescue_work); | ||
695 | + spin_unlock(&bs->rescue_lock); | ||
696 | + } | ||
697 | +} | ||
698 | + | ||
699 | +static void dm_offload_start(struct dm_offload *o) | ||
700 | +{ | ||
701 | + blk_start_plug(&o->plug); | ||
702 | + o->cb.callback = flush_current_bio_list; | ||
703 | + list_add(&o->cb.list, ¤t->plug->cb_list); | ||
704 | +} | ||
705 | + | ||
706 | +static void dm_offload_end(struct dm_offload *o) | ||
707 | +{ | ||
708 | + list_del(&o->cb.list); | ||
709 | + blk_finish_plug(&o->plug); | ||
710 | +} | ||
711 | + | ||
712 | static void __map_bio(struct dm_target_io *tio) | ||
713 | { | ||
714 | int r; | ||
715 | sector_t sector; | ||
716 | struct mapped_device *md; | ||
717 | + struct dm_offload o; | ||
718 | struct bio *clone = &tio->clone; | ||
719 | struct dm_target *ti = tio->ti; | ||
720 | |||
721 | @@ -1484,7 +1535,11 @@ static void __map_bio(struct dm_target_io *tio) | ||
722 | */ | ||
723 | atomic_inc(&tio->io->io_count); | ||
724 | sector = clone->bi_iter.bi_sector; | ||
725 | + | ||
726 | + dm_offload_start(&o); | ||
727 | r = ti->type->map(ti, clone); | ||
728 | + dm_offload_end(&o); | ||
729 | + | ||
730 | if (r == DM_MAPIO_REMAPPED) { | ||
731 | /* the bio has been remapped so dispatch it */ | ||
732 | |||
733 | diff --git a/drivers/mtd/maps/pmcmsp-flash.c b/drivers/mtd/maps/pmcmsp-flash.c | ||
734 | index f9fa3fad728e..2051f28ddac6 100644 | ||
735 | --- a/drivers/mtd/maps/pmcmsp-flash.c | ||
736 | +++ b/drivers/mtd/maps/pmcmsp-flash.c | ||
737 | @@ -139,15 +139,13 @@ static int __init init_msp_flash(void) | ||
738 | } | ||
739 | |||
740 | msp_maps[i].bankwidth = 1; | ||
741 | - msp_maps[i].name = kmalloc(7, GFP_KERNEL); | ||
742 | + msp_maps[i].name = kstrndup(flash_name, 7, GFP_KERNEL); | ||
743 | if (!msp_maps[i].name) { | ||
744 | iounmap(msp_maps[i].virt); | ||
745 | kfree(msp_parts[i]); | ||
746 | goto cleanup_loop; | ||
747 | } | ||
748 | |||
749 | - msp_maps[i].name = strncpy(msp_maps[i].name, flash_name, 7); | ||
750 | - | ||
751 | for (j = 0; j < pcnt; j++) { | ||
752 | part_name[5] = '0' + i; | ||
753 | part_name[7] = '0' + j; | ||
754 | diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c | ||
755 | index d52ea3008946..7e8bce46e6b4 100644 | ||
756 | --- a/drivers/net/ethernet/ti/cpmac.c | ||
757 | +++ b/drivers/net/ethernet/ti/cpmac.c | ||
758 | @@ -1237,7 +1237,7 @@ int cpmac_init(void) | ||
759 | goto fail_alloc; | ||
760 | } | ||
761 | |||
762 | -#warning FIXME: unhardcode gpio&reset bits | ||
763 | + /* FIXME: unhardcode gpio&reset bits */ | ||
764 | ar7_gpio_disable(26); | ||
765 | ar7_gpio_disable(27); | ||
766 | ar7_device_reset(AR7_RESET_BIT_CPMAC_LO); | ||
767 | diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c | ||
768 | index 62120c38d56b..aae7379af4e4 100644 | ||
769 | --- a/drivers/nvdimm/namespace_devs.c | ||
770 | +++ b/drivers/nvdimm/namespace_devs.c | ||
771 | @@ -1534,6 +1534,7 @@ static int select_pmem_id(struct nd_region *nd_region, u8 *pmem_id) | ||
772 | static int find_pmem_label_set(struct nd_region *nd_region, | ||
773 | struct nd_namespace_pmem *nspm) | ||
774 | { | ||
775 | + u64 altcookie = nd_region_interleave_set_altcookie(nd_region); | ||
776 | u64 cookie = nd_region_interleave_set_cookie(nd_region); | ||
777 | struct nd_namespace_label *nd_label; | ||
778 | u8 select_id[NSLABEL_UUID_LEN]; | ||
779 | @@ -1542,8 +1543,10 @@ static int find_pmem_label_set(struct nd_region *nd_region, | ||
780 | int rc = -ENODEV, l; | ||
781 | u16 i; | ||
782 | |||
783 | - if (cookie == 0) | ||
784 | + if (cookie == 0) { | ||
785 | + dev_dbg(&nd_region->dev, "invalid interleave-set-cookie\n"); | ||
786 | return -ENXIO; | ||
787 | + } | ||
788 | |||
789 | /* | ||
790 | * Find a complete set of labels by uuid. By definition we can start | ||
791 | @@ -1552,13 +1555,24 @@ static int find_pmem_label_set(struct nd_region *nd_region, | ||
792 | for_each_label(l, nd_label, nd_region->mapping[0].labels) { | ||
793 | u64 isetcookie = __le64_to_cpu(nd_label->isetcookie); | ||
794 | |||
795 | - if (isetcookie != cookie) | ||
796 | - continue; | ||
797 | + if (isetcookie != cookie) { | ||
798 | + dev_dbg(&nd_region->dev, "invalid cookie in label: %pUb\n", | ||
799 | + nd_label->uuid); | ||
800 | + if (isetcookie != altcookie) | ||
801 | + continue; | ||
802 | + | ||
803 | + dev_dbg(&nd_region->dev, "valid altcookie in label: %pUb\n", | ||
804 | + nd_label->uuid); | ||
805 | + } | ||
806 | + | ||
807 | + for (i = 0; nd_region->ndr_mappings; i++) { | ||
808 | + if (has_uuid_at_pos(nd_region, nd_label->uuid, cookie, i)) | ||
809 | + continue; | ||
810 | + if (has_uuid_at_pos(nd_region, nd_label->uuid, altcookie, i)) | ||
811 | + continue; | ||
812 | + break; | ||
813 | + } | ||
814 | |||
815 | - for (i = 0; nd_region->ndr_mappings; i++) | ||
816 | - if (!has_uuid_at_pos(nd_region, nd_label->uuid, | ||
817 | - cookie, i)) | ||
818 | - break; | ||
819 | if (i < nd_region->ndr_mappings) { | ||
820 | /* | ||
821 | * Give up if we don't find an instance of a | ||
822 | diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h | ||
823 | index 417e521d299c..fc870e55bb66 100644 | ||
824 | --- a/drivers/nvdimm/nd.h | ||
825 | +++ b/drivers/nvdimm/nd.h | ||
826 | @@ -245,6 +245,7 @@ struct nd_region *to_nd_region(struct device *dev); | ||
827 | int nd_region_to_nstype(struct nd_region *nd_region); | ||
828 | int nd_region_register_namespaces(struct nd_region *nd_region, int *err); | ||
829 | u64 nd_region_interleave_set_cookie(struct nd_region *nd_region); | ||
830 | +u64 nd_region_interleave_set_altcookie(struct nd_region *nd_region); | ||
831 | void nvdimm_bus_lock(struct device *dev); | ||
832 | void nvdimm_bus_unlock(struct device *dev); | ||
833 | bool is_nvdimm_bus_locked(struct device *dev); | ||
834 | diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c | ||
835 | index 9521696c9385..dc2e919daa39 100644 | ||
836 | --- a/drivers/nvdimm/region_devs.c | ||
837 | +++ b/drivers/nvdimm/region_devs.c | ||
838 | @@ -379,6 +379,15 @@ u64 nd_region_interleave_set_cookie(struct nd_region *nd_region) | ||
839 | return 0; | ||
840 | } | ||
841 | |||
842 | +u64 nd_region_interleave_set_altcookie(struct nd_region *nd_region) | ||
843 | +{ | ||
844 | + struct nd_interleave_set *nd_set = nd_region->nd_set; | ||
845 | + | ||
846 | + if (nd_set) | ||
847 | + return nd_set->altcookie; | ||
848 | + return 0; | ||
849 | +} | ||
850 | + | ||
851 | /* | ||
852 | * Upon successful probe/remove, take/release a reference on the | ||
853 | * associated interleave set (if present), and plant new btt + namespace | ||
854 | diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c | ||
855 | index 9c780740fb82..e712fe745955 100644 | ||
856 | --- a/drivers/scsi/mvsas/mv_sas.c | ||
857 | +++ b/drivers/scsi/mvsas/mv_sas.c | ||
858 | @@ -737,8 +737,8 @@ static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf | ||
859 | mv_dprintk("device %016llx not ready.\n", | ||
860 | SAS_ADDR(dev->sas_addr)); | ||
861 | |||
862 | - rc = SAS_PHY_DOWN; | ||
863 | - return rc; | ||
864 | + rc = SAS_PHY_DOWN; | ||
865 | + return rc; | ||
866 | } | ||
867 | tei.port = dev->port->lldd_port; | ||
868 | if (tei.port && !tei.port->port_attached && !tmf) { | ||
869 | diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c | ||
870 | index 237ef5573c18..6deb06147202 100644 | ||
871 | --- a/drivers/tty/serial/samsung.c | ||
872 | +++ b/drivers/tty/serial/samsung.c | ||
873 | @@ -1030,8 +1030,10 @@ static int s3c64xx_serial_startup(struct uart_port *port) | ||
874 | if (ourport->dma) { | ||
875 | ret = s3c24xx_serial_request_dma(ourport); | ||
876 | if (ret < 0) { | ||
877 | - dev_warn(port->dev, "DMA request failed\n"); | ||
878 | - return ret; | ||
879 | + dev_warn(port->dev, | ||
880 | + "DMA request failed, DMA will not be used\n"); | ||
881 | + devm_kfree(port->dev, ourport->dma); | ||
882 | + ourport->dma = NULL; | ||
883 | } | ||
884 | } | ||
885 | |||
886 | diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h | ||
887 | index 18ae3eaa8b6f..ccd9694f8e36 100644 | ||
888 | --- a/drivers/usb/dwc3/gadget.h | ||
889 | +++ b/drivers/usb/dwc3/gadget.h | ||
890 | @@ -28,23 +28,23 @@ struct dwc3; | ||
891 | #define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) | ||
892 | |||
893 | /* DEPCFG parameter 1 */ | ||
894 | -#define DWC3_DEPCFG_INT_NUM(n) ((n) << 0) | ||
895 | +#define DWC3_DEPCFG_INT_NUM(n) (((n) & 0x1f) << 0) | ||
896 | #define DWC3_DEPCFG_XFER_COMPLETE_EN (1 << 8) | ||
897 | #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9) | ||
898 | #define DWC3_DEPCFG_XFER_NOT_READY_EN (1 << 10) | ||
899 | #define DWC3_DEPCFG_FIFO_ERROR_EN (1 << 11) | ||
900 | #define DWC3_DEPCFG_STREAM_EVENT_EN (1 << 13) | ||
901 | -#define DWC3_DEPCFG_BINTERVAL_M1(n) ((n) << 16) | ||
902 | +#define DWC3_DEPCFG_BINTERVAL_M1(n) (((n) & 0xff) << 16) | ||
903 | #define DWC3_DEPCFG_STREAM_CAPABLE (1 << 24) | ||
904 | -#define DWC3_DEPCFG_EP_NUMBER(n) ((n) << 25) | ||
905 | +#define DWC3_DEPCFG_EP_NUMBER(n) (((n) & 0x1f) << 25) | ||
906 | #define DWC3_DEPCFG_BULK_BASED (1 << 30) | ||
907 | #define DWC3_DEPCFG_FIFO_BASED (1 << 31) | ||
908 | |||
909 | /* DEPCFG parameter 0 */ | ||
910 | -#define DWC3_DEPCFG_EP_TYPE(n) ((n) << 1) | ||
911 | -#define DWC3_DEPCFG_MAX_PACKET_SIZE(n) ((n) << 3) | ||
912 | -#define DWC3_DEPCFG_FIFO_NUMBER(n) ((n) << 17) | ||
913 | -#define DWC3_DEPCFG_BURST_SIZE(n) ((n) << 22) | ||
914 | +#define DWC3_DEPCFG_EP_TYPE(n) (((n) & 0x3) << 1) | ||
915 | +#define DWC3_DEPCFG_MAX_PACKET_SIZE(n) (((n) & 0x7ff) << 3) | ||
916 | +#define DWC3_DEPCFG_FIFO_NUMBER(n) (((n) & 0x1f) << 17) | ||
917 | +#define DWC3_DEPCFG_BURST_SIZE(n) (((n) & 0xf) << 22) | ||
918 | #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26) | ||
919 | /* This applies for core versions earlier than 1.94a */ | ||
920 | #define DWC3_DEPCFG_IGN_SEQ_NUM (1 << 31) | ||
921 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c | ||
922 | index cfda1a1c0ab6..9ad5145d3103 100644 | ||
923 | --- a/drivers/usb/gadget/function/f_fs.c | ||
924 | +++ b/drivers/usb/gadget/function/f_fs.c | ||
925 | @@ -1643,11 +1643,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | ||
926 | spin_lock_irqsave(&func->ffs->eps_lock, flags); | ||
927 | do { | ||
928 | struct usb_endpoint_descriptor *ds; | ||
929 | + struct usb_ss_ep_comp_descriptor *comp_desc = NULL; | ||
930 | + int needs_comp_desc = false; | ||
931 | int desc_idx; | ||
932 | |||
933 | - if (ffs->gadget->speed == USB_SPEED_SUPER) | ||
934 | + if (ffs->gadget->speed == USB_SPEED_SUPER) { | ||
935 | desc_idx = 2; | ||
936 | - else if (ffs->gadget->speed == USB_SPEED_HIGH) | ||
937 | + needs_comp_desc = true; | ||
938 | + } else if (ffs->gadget->speed == USB_SPEED_HIGH) | ||
939 | desc_idx = 1; | ||
940 | else | ||
941 | desc_idx = 0; | ||
942 | @@ -1664,6 +1667,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | ||
943 | |||
944 | ep->ep->driver_data = ep; | ||
945 | ep->ep->desc = ds; | ||
946 | + | ||
947 | + comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + | ||
948 | + USB_DT_ENDPOINT_SIZE); | ||
949 | + ep->ep->maxburst = comp_desc->bMaxBurst + 1; | ||
950 | + | ||
951 | + if (needs_comp_desc) | ||
952 | + ep->ep->comp_desc = comp_desc; | ||
953 | + | ||
954 | ret = usb_ep_enable(ep->ep); | ||
955 | if (likely(!ret)) { | ||
956 | epfile->ep = ep; | ||
957 | diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c | ||
958 | index 22d067cd5aa3..6610f7a023d3 100644 | ||
959 | --- a/drivers/usb/gadget/udc/dummy_hcd.c | ||
960 | +++ b/drivers/usb/gadget/udc/dummy_hcd.c | ||
961 | @@ -1033,6 +1033,8 @@ static int dummy_udc_probe(struct platform_device *pdev) | ||
962 | int rc; | ||
963 | |||
964 | dum = *((void **)dev_get_platdata(&pdev->dev)); | ||
965 | + /* Clear usb_gadget region for new registration to udc-core */ | ||
966 | + memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); | ||
967 | dum->gadget.name = gadget_name; | ||
968 | dum->gadget.ops = &dummy_ops; | ||
969 | dum->gadget.max_speed = USB_SPEED_SUPER; | ||
970 | diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c | ||
971 | index 74c42f722678..3425154baf8b 100644 | ||
972 | --- a/drivers/usb/host/xhci-dbg.c | ||
973 | +++ b/drivers/usb/host/xhci-dbg.c | ||
974 | @@ -111,7 +111,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) | ||
975 | xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK); | ||
976 | |||
977 | /* xhci 1.1 controllers have the HCCPARAMS2 register */ | ||
978 | - if (hci_version > 100) { | ||
979 | + if (hci_version > 0x100) { | ||
980 | temp = readl(&xhci->cap_regs->hcc_params2); | ||
981 | xhci_dbg(xhci, "HCC PARAMS2 0x%x:\n", (unsigned int) temp); | ||
982 | xhci_dbg(xhci, " HC %s Force save context capability", | ||
983 | diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c | ||
984 | index 19cb32a65161..268829db9e88 100644 | ||
985 | --- a/drivers/usb/host/xhci-plat.c | ||
986 | +++ b/drivers/usb/host/xhci-plat.c | ||
987 | @@ -213,6 +213,8 @@ static int xhci_plat_remove(struct platform_device *dev) | ||
988 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
989 | struct clk *clk = xhci->clk; | ||
990 | |||
991 | + xhci->xhc_state |= XHCI_STATE_REMOVING; | ||
992 | + | ||
993 | usb_remove_hcd(xhci->shared_hcd); | ||
994 | usb_phy_shutdown(hcd->usb_phy); | ||
995 | |||
996 | diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c | ||
997 | index 1950e87b4219..775690bed4c0 100644 | ||
998 | --- a/drivers/usb/misc/iowarrior.c | ||
999 | +++ b/drivers/usb/misc/iowarrior.c | ||
1000 | @@ -787,12 +787,6 @@ static int iowarrior_probe(struct usb_interface *interface, | ||
1001 | iface_desc = interface->cur_altsetting; | ||
1002 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); | ||
1003 | |||
1004 | - if (iface_desc->desc.bNumEndpoints < 1) { | ||
1005 | - dev_err(&interface->dev, "Invalid number of endpoints\n"); | ||
1006 | - retval = -EINVAL; | ||
1007 | - goto error; | ||
1008 | - } | ||
1009 | - | ||
1010 | /* set up the endpoint information */ | ||
1011 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
1012 | endpoint = &iface_desc->endpoint[i].desc; | ||
1013 | @@ -803,6 +797,21 @@ static int iowarrior_probe(struct usb_interface *interface, | ||
1014 | /* this one will match for the IOWarrior56 only */ | ||
1015 | dev->int_out_endpoint = endpoint; | ||
1016 | } | ||
1017 | + | ||
1018 | + if (!dev->int_in_endpoint) { | ||
1019 | + dev_err(&interface->dev, "no interrupt-in endpoint found\n"); | ||
1020 | + retval = -ENODEV; | ||
1021 | + goto error; | ||
1022 | + } | ||
1023 | + | ||
1024 | + if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) { | ||
1025 | + if (!dev->int_out_endpoint) { | ||
1026 | + dev_err(&interface->dev, "no interrupt-out endpoint found\n"); | ||
1027 | + retval = -ENODEV; | ||
1028 | + goto error; | ||
1029 | + } | ||
1030 | + } | ||
1031 | + | ||
1032 | /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ | ||
1033 | dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); | ||
1034 | if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && | ||
1035 | diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c | ||
1036 | index 3df7b7ec178e..e0b1fe2f60e1 100644 | ||
1037 | --- a/drivers/usb/serial/digi_acceleport.c | ||
1038 | +++ b/drivers/usb/serial/digi_acceleport.c | ||
1039 | @@ -1483,16 +1483,20 @@ static int digi_read_oob_callback(struct urb *urb) | ||
1040 | struct usb_serial *serial = port->serial; | ||
1041 | struct tty_struct *tty; | ||
1042 | struct digi_port *priv = usb_get_serial_port_data(port); | ||
1043 | + unsigned char *buf = urb->transfer_buffer; | ||
1044 | int opcode, line, status, val; | ||
1045 | int i; | ||
1046 | unsigned int rts; | ||
1047 | |||
1048 | + if (urb->actual_length < 4) | ||
1049 | + return -1; | ||
1050 | + | ||
1051 | /* handle each oob command */ | ||
1052 | - for (i = 0; i < urb->actual_length - 3;) { | ||
1053 | - opcode = ((unsigned char *)urb->transfer_buffer)[i++]; | ||
1054 | - line = ((unsigned char *)urb->transfer_buffer)[i++]; | ||
1055 | - status = ((unsigned char *)urb->transfer_buffer)[i++]; | ||
1056 | - val = ((unsigned char *)urb->transfer_buffer)[i++]; | ||
1057 | + for (i = 0; i < urb->actual_length - 3; i += 4) { | ||
1058 | + opcode = buf[i]; | ||
1059 | + line = buf[i + 1]; | ||
1060 | + status = buf[i + 2]; | ||
1061 | + val = buf[i + 3]; | ||
1062 | |||
1063 | dev_dbg(&port->dev, "digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d\n", | ||
1064 | opcode, line, status, val); | ||
1065 | diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c | ||
1066 | index c02808a30436..f1a8fdcd8674 100644 | ||
1067 | --- a/drivers/usb/serial/io_ti.c | ||
1068 | +++ b/drivers/usb/serial/io_ti.c | ||
1069 | @@ -1674,6 +1674,12 @@ static void edge_interrupt_callback(struct urb *urb) | ||
1070 | function = TIUMP_GET_FUNC_FROM_CODE(data[0]); | ||
1071 | dev_dbg(dev, "%s - port_number %d, function %d, info 0x%x\n", __func__, | ||
1072 | port_number, function, data[1]); | ||
1073 | + | ||
1074 | + if (port_number >= edge_serial->serial->num_ports) { | ||
1075 | + dev_err(dev, "bad port number %d\n", port_number); | ||
1076 | + goto exit; | ||
1077 | + } | ||
1078 | + | ||
1079 | port = edge_serial->serial->port[port_number]; | ||
1080 | edge_port = usb_get_serial_port_data(port); | ||
1081 | if (!edge_port) { | ||
1082 | @@ -1755,7 +1761,7 @@ static void edge_bulk_in_callback(struct urb *urb) | ||
1083 | |||
1084 | port_number = edge_port->port->port_number; | ||
1085 | |||
1086 | - if (edge_port->lsr_event) { | ||
1087 | + if (urb->actual_length > 0 && edge_port->lsr_event) { | ||
1088 | edge_port->lsr_event = 0; | ||
1089 | dev_dbg(dev, "%s ===== Port %u LSR Status = %02x, Data = %02x ======\n", | ||
1090 | __func__, port_number, edge_port->lsr_mask, *data); | ||
1091 | diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c | ||
1092 | index a180b17d2432..76564b3bebb9 100644 | ||
1093 | --- a/drivers/usb/serial/omninet.c | ||
1094 | +++ b/drivers/usb/serial/omninet.c | ||
1095 | @@ -142,12 +142,6 @@ static int omninet_port_remove(struct usb_serial_port *port) | ||
1096 | |||
1097 | static int omninet_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
1098 | { | ||
1099 | - struct usb_serial *serial = port->serial; | ||
1100 | - struct usb_serial_port *wport; | ||
1101 | - | ||
1102 | - wport = serial->port[1]; | ||
1103 | - tty_port_tty_set(&wport->port, tty); | ||
1104 | - | ||
1105 | return usb_serial_generic_open(tty, port); | ||
1106 | } | ||
1107 | |||
1108 | diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c | ||
1109 | index b2dff0f14743..236ea43f7815 100644 | ||
1110 | --- a/drivers/usb/serial/safe_serial.c | ||
1111 | +++ b/drivers/usb/serial/safe_serial.c | ||
1112 | @@ -205,6 +205,11 @@ static void safe_process_read_urb(struct urb *urb) | ||
1113 | if (!safe) | ||
1114 | goto out; | ||
1115 | |||
1116 | + if (length < 2) { | ||
1117 | + dev_err(&port->dev, "malformed packet\n"); | ||
1118 | + return; | ||
1119 | + } | ||
1120 | + | ||
1121 | fcs = fcs_compute10(data, length, CRC10_INITFCS); | ||
1122 | if (fcs) { | ||
1123 | dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); | ||
1124 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
1125 | index e0f862146793..7dcc97eadb12 100644 | ||
1126 | --- a/fs/ext4/inode.c | ||
1127 | +++ b/fs/ext4/inode.c | ||
1128 | @@ -3573,6 +3573,10 @@ static int ext4_block_truncate_page(handle_t *handle, | ||
1129 | unsigned blocksize; | ||
1130 | struct inode *inode = mapping->host; | ||
1131 | |||
1132 | + /* If we are processing an encrypted inode during orphan list handling */ | ||
1133 | + if (ext4_encrypted_inode(inode) && !ext4_has_encryption_key(inode)) | ||
1134 | + return 0; | ||
1135 | + | ||
1136 | blocksize = inode->i_sb->s_blocksize; | ||
1137 | length = blocksize - (offset & (blocksize - 1)); | ||
1138 | |||
1139 | diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h | ||
1140 | index 3f021dc5da8c..30201b9be7bc 100644 | ||
1141 | --- a/include/linux/libnvdimm.h | ||
1142 | +++ b/include/linux/libnvdimm.h | ||
1143 | @@ -83,6 +83,8 @@ struct nd_cmd_desc { | ||
1144 | |||
1145 | struct nd_interleave_set { | ||
1146 | u64 cookie; | ||
1147 | + /* compatibility with initial buggy Linux implementation */ | ||
1148 | + u64 altcookie; | ||
1149 | }; | ||
1150 | |||
1151 | struct nd_region_desc { | ||
1152 | diff --git a/include/trace/events/syscalls.h b/include/trace/events/syscalls.h | ||
1153 | index 14e49c798135..b35533b94277 100644 | ||
1154 | --- a/include/trace/events/syscalls.h | ||
1155 | +++ b/include/trace/events/syscalls.h | ||
1156 | @@ -1,5 +1,6 @@ | ||
1157 | #undef TRACE_SYSTEM | ||
1158 | #define TRACE_SYSTEM raw_syscalls | ||
1159 | +#undef TRACE_INCLUDE_FILE | ||
1160 | #define TRACE_INCLUDE_FILE syscalls | ||
1161 | |||
1162 | #if !defined(_TRACE_EVENTS_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
1163 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
1164 | index 43eefe9d834c..e25b93a4267d 100644 | ||
1165 | --- a/mm/memcontrol.c | ||
1166 | +++ b/mm/memcontrol.c | ||
1167 | @@ -4150,24 +4150,6 @@ static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n) | ||
1168 | atomic_add(n, &memcg->id.ref); | ||
1169 | } | ||
1170 | |||
1171 | -static struct mem_cgroup *mem_cgroup_id_get_online(struct mem_cgroup *memcg) | ||
1172 | -{ | ||
1173 | - while (!atomic_inc_not_zero(&memcg->id.ref)) { | ||
1174 | - /* | ||
1175 | - * The root cgroup cannot be destroyed, so it's refcount must | ||
1176 | - * always be >= 1. | ||
1177 | - */ | ||
1178 | - if (WARN_ON_ONCE(memcg == root_mem_cgroup)) { | ||
1179 | - VM_BUG_ON(1); | ||
1180 | - break; | ||
1181 | - } | ||
1182 | - memcg = parent_mem_cgroup(memcg); | ||
1183 | - if (!memcg) | ||
1184 | - memcg = root_mem_cgroup; | ||
1185 | - } | ||
1186 | - return memcg; | ||
1187 | -} | ||
1188 | - | ||
1189 | static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n) | ||
1190 | { | ||
1191 | if (atomic_sub_and_test(n, &memcg->id.ref)) { | ||
1192 | @@ -5751,6 +5733,24 @@ static int __init mem_cgroup_init(void) | ||
1193 | subsys_initcall(mem_cgroup_init); | ||
1194 | |||
1195 | #ifdef CONFIG_MEMCG_SWAP | ||
1196 | +static struct mem_cgroup *mem_cgroup_id_get_online(struct mem_cgroup *memcg) | ||
1197 | +{ | ||
1198 | + while (!atomic_inc_not_zero(&memcg->id.ref)) { | ||
1199 | + /* | ||
1200 | + * The root cgroup cannot be destroyed, so it's refcount must | ||
1201 | + * always be >= 1. | ||
1202 | + */ | ||
1203 | + if (WARN_ON_ONCE(memcg == root_mem_cgroup)) { | ||
1204 | + VM_BUG_ON(1); | ||
1205 | + break; | ||
1206 | + } | ||
1207 | + memcg = parent_mem_cgroup(memcg); | ||
1208 | + if (!memcg) | ||
1209 | + memcg = root_mem_cgroup; | ||
1210 | + } | ||
1211 | + return memcg; | ||
1212 | +} | ||
1213 | + | ||
1214 | /** | ||
1215 | * mem_cgroup_swapout - transfer a memsw charge to swap | ||
1216 | * @page: page whose memsw charge to transfer |