Contents of /trunk/kernel-alx/patches-3.10/0135-3.10.36-all-fixes.patch
Parent Directory | Revision Log
Revision 2471 -
(show annotations)
(download)
(as text)
Wed Jul 2 10:42:37 2014 UTC (10 years, 2 months ago) by niro
File MIME type: application/x-xz
File size: 19285 byte(s)
Wed Jul 2 10:42:37 2014 UTC (10 years, 2 months ago) by niro
File MIME type: application/x-xz
File size: 19285 byte(s)
-uncompressed
1 | diff --git a/Makefile b/Makefile |
2 | index 06b31fce1ff5..b5f4ef30f6e6 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 35 |
9 | +SUBLEVEL = 36 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h |
14 | index 095b21507b6a..60bd2748a7c9 100644 |
15 | --- a/arch/x86/include/asm/topology.h |
16 | +++ b/arch/x86/include/asm/topology.h |
17 | @@ -119,9 +119,10 @@ static inline void setup_node_to_cpumask_map(void) { } |
18 | |
19 | extern const struct cpumask *cpu_coregroup_mask(int cpu); |
20 | |
21 | -#ifdef ENABLE_TOPO_DEFINES |
22 | #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) |
23 | #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) |
24 | + |
25 | +#ifdef ENABLE_TOPO_DEFINES |
26 | #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) |
27 | #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) |
28 | |
29 | diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c |
30 | index fc803ecbbce4..31262732db23 100644 |
31 | --- a/drivers/block/aoe/aoecmd.c |
32 | +++ b/drivers/block/aoe/aoecmd.c |
33 | @@ -899,7 +899,7 @@ bio_pageinc(struct bio *bio) |
34 | * but this has never been seen here. |
35 | */ |
36 | if (unlikely(PageCompound(page))) |
37 | - if (compound_trans_head(page) != page) { |
38 | + if (compound_head(page) != page) { |
39 | pr_crit("page tail used for block I/O\n"); |
40 | BUG(); |
41 | } |
42 | diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c |
43 | index 888a81a7ea3d..0aaea7ad6cee 100644 |
44 | --- a/drivers/input/mouse/cypress_ps2.c |
45 | +++ b/drivers/input/mouse/cypress_ps2.c |
46 | @@ -410,7 +410,6 @@ static int cypress_set_input_params(struct input_dev *input, |
47 | __clear_bit(REL_X, input->relbit); |
48 | __clear_bit(REL_Y, input->relbit); |
49 | |
50 | - __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); |
51 | __set_bit(EV_KEY, input->evbit); |
52 | __set_bit(BTN_LEFT, input->keybit); |
53 | __set_bit(BTN_RIGHT, input->keybit); |
54 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
55 | index b2420ae19e14..c69c81608f43 100644 |
56 | --- a/drivers/input/mouse/synaptics.c |
57 | +++ b/drivers/input/mouse/synaptics.c |
58 | @@ -265,11 +265,22 @@ static int synaptics_identify(struct psmouse *psmouse) |
59 | * Read touchpad resolution and maximum reported coordinates |
60 | * Resolution is left zero if touchpad does not support the query |
61 | */ |
62 | + |
63 | +static const int *quirk_min_max; |
64 | + |
65 | static int synaptics_resolution(struct psmouse *psmouse) |
66 | { |
67 | struct synaptics_data *priv = psmouse->private; |
68 | unsigned char resp[3]; |
69 | |
70 | + if (quirk_min_max) { |
71 | + priv->x_min = quirk_min_max[0]; |
72 | + priv->x_max = quirk_min_max[1]; |
73 | + priv->y_min = quirk_min_max[2]; |
74 | + priv->y_max = quirk_min_max[3]; |
75 | + return 0; |
76 | + } |
77 | + |
78 | if (SYN_ID_MAJOR(priv->identity) < 4) |
79 | return 0; |
80 | |
81 | @@ -1485,10 +1496,54 @@ static const struct dmi_system_id __initconst olpc_dmi_table[] = { |
82 | { } |
83 | }; |
84 | |
85 | +static const struct dmi_system_id min_max_dmi_table[] __initconst = { |
86 | +#if defined(CONFIG_DMI) |
87 | + { |
88 | + /* Lenovo ThinkPad Helix */ |
89 | + .matches = { |
90 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
91 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"), |
92 | + }, |
93 | + .driver_data = (int []){1024, 5052, 2258, 4832}, |
94 | + }, |
95 | + { |
96 | + /* Lenovo ThinkPad X240 */ |
97 | + .matches = { |
98 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
99 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"), |
100 | + }, |
101 | + .driver_data = (int []){1232, 5710, 1156, 4696}, |
102 | + }, |
103 | + { |
104 | + /* Lenovo ThinkPad T440s */ |
105 | + .matches = { |
106 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
107 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"), |
108 | + }, |
109 | + .driver_data = (int []){1024, 5112, 2024, 4832}, |
110 | + }, |
111 | + { |
112 | + /* Lenovo ThinkPad T540p */ |
113 | + .matches = { |
114 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
115 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"), |
116 | + }, |
117 | + .driver_data = (int []){1024, 5056, 2058, 4832}, |
118 | + }, |
119 | +#endif |
120 | + { } |
121 | +}; |
122 | + |
123 | void __init synaptics_module_init(void) |
124 | { |
125 | + const struct dmi_system_id *min_max_dmi; |
126 | + |
127 | impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); |
128 | broken_olpc_ec = dmi_check_system(olpc_dmi_table); |
129 | + |
130 | + min_max_dmi = dmi_first_match(min_max_dmi_table); |
131 | + if (min_max_dmi) |
132 | + quirk_min_max = min_max_dmi->driver_data; |
133 | } |
134 | |
135 | static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) |
136 | diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c |
137 | index 4c842c320c2e..b604564dec5c 100644 |
138 | --- a/drivers/input/mousedev.c |
139 | +++ b/drivers/input/mousedev.c |
140 | @@ -67,7 +67,6 @@ struct mousedev { |
141 | struct device dev; |
142 | struct cdev cdev; |
143 | bool exist; |
144 | - bool is_mixdev; |
145 | |
146 | struct list_head mixdev_node; |
147 | bool opened_by_mixdev; |
148 | @@ -77,6 +76,9 @@ struct mousedev { |
149 | int old_x[4], old_y[4]; |
150 | int frac_dx, frac_dy; |
151 | unsigned long touch; |
152 | + |
153 | + int (*open_device)(struct mousedev *mousedev); |
154 | + void (*close_device)(struct mousedev *mousedev); |
155 | }; |
156 | |
157 | enum mousedev_emul { |
158 | @@ -116,9 +118,6 @@ static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 }; |
159 | static struct mousedev *mousedev_mix; |
160 | static LIST_HEAD(mousedev_mix_list); |
161 | |
162 | -static void mixdev_open_devices(void); |
163 | -static void mixdev_close_devices(void); |
164 | - |
165 | #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03]) |
166 | #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03]) |
167 | |
168 | @@ -428,9 +427,7 @@ static int mousedev_open_device(struct mousedev *mousedev) |
169 | if (retval) |
170 | return retval; |
171 | |
172 | - if (mousedev->is_mixdev) |
173 | - mixdev_open_devices(); |
174 | - else if (!mousedev->exist) |
175 | + if (!mousedev->exist) |
176 | retval = -ENODEV; |
177 | else if (!mousedev->open++) { |
178 | retval = input_open_device(&mousedev->handle); |
179 | @@ -446,9 +443,7 @@ static void mousedev_close_device(struct mousedev *mousedev) |
180 | { |
181 | mutex_lock(&mousedev->mutex); |
182 | |
183 | - if (mousedev->is_mixdev) |
184 | - mixdev_close_devices(); |
185 | - else if (mousedev->exist && !--mousedev->open) |
186 | + if (mousedev->exist && !--mousedev->open) |
187 | input_close_device(&mousedev->handle); |
188 | |
189 | mutex_unlock(&mousedev->mutex); |
190 | @@ -459,21 +454,29 @@ static void mousedev_close_device(struct mousedev *mousedev) |
191 | * stream. Note that this function is called with mousedev_mix->mutex |
192 | * held. |
193 | */ |
194 | -static void mixdev_open_devices(void) |
195 | +static int mixdev_open_devices(struct mousedev *mixdev) |
196 | { |
197 | - struct mousedev *mousedev; |
198 | + int error; |
199 | + |
200 | + error = mutex_lock_interruptible(&mixdev->mutex); |
201 | + if (error) |
202 | + return error; |
203 | |
204 | - if (mousedev_mix->open++) |
205 | - return; |
206 | + if (!mixdev->open++) { |
207 | + struct mousedev *mousedev; |
208 | |
209 | - list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { |
210 | - if (!mousedev->opened_by_mixdev) { |
211 | - if (mousedev_open_device(mousedev)) |
212 | - continue; |
213 | + list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { |
214 | + if (!mousedev->opened_by_mixdev) { |
215 | + if (mousedev_open_device(mousedev)) |
216 | + continue; |
217 | |
218 | - mousedev->opened_by_mixdev = true; |
219 | + mousedev->opened_by_mixdev = true; |
220 | + } |
221 | } |
222 | } |
223 | + |
224 | + mutex_unlock(&mixdev->mutex); |
225 | + return 0; |
226 | } |
227 | |
228 | /* |
229 | @@ -481,19 +484,22 @@ static void mixdev_open_devices(void) |
230 | * device. Note that this function is called with mousedev_mix->mutex |
231 | * held. |
232 | */ |
233 | -static void mixdev_close_devices(void) |
234 | +static void mixdev_close_devices(struct mousedev *mixdev) |
235 | { |
236 | - struct mousedev *mousedev; |
237 | + mutex_lock(&mixdev->mutex); |
238 | |
239 | - if (--mousedev_mix->open) |
240 | - return; |
241 | + if (!--mixdev->open) { |
242 | + struct mousedev *mousedev; |
243 | |
244 | - list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { |
245 | - if (mousedev->opened_by_mixdev) { |
246 | - mousedev->opened_by_mixdev = false; |
247 | - mousedev_close_device(mousedev); |
248 | + list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { |
249 | + if (mousedev->opened_by_mixdev) { |
250 | + mousedev->opened_by_mixdev = false; |
251 | + mousedev_close_device(mousedev); |
252 | + } |
253 | } |
254 | } |
255 | + |
256 | + mutex_unlock(&mixdev->mutex); |
257 | } |
258 | |
259 | |
260 | @@ -522,7 +528,7 @@ static int mousedev_release(struct inode *inode, struct file *file) |
261 | mousedev_detach_client(mousedev, client); |
262 | kfree(client); |
263 | |
264 | - mousedev_close_device(mousedev); |
265 | + mousedev->close_device(mousedev); |
266 | |
267 | return 0; |
268 | } |
269 | @@ -550,7 +556,7 @@ static int mousedev_open(struct inode *inode, struct file *file) |
270 | client->mousedev = mousedev; |
271 | mousedev_attach_client(mousedev, client); |
272 | |
273 | - error = mousedev_open_device(mousedev); |
274 | + error = mousedev->open_device(mousedev); |
275 | if (error) |
276 | goto err_free_client; |
277 | |
278 | @@ -861,16 +867,21 @@ static struct mousedev *mousedev_create(struct input_dev *dev, |
279 | |
280 | if (mixdev) { |
281 | dev_set_name(&mousedev->dev, "mice"); |
282 | + |
283 | + mousedev->open_device = mixdev_open_devices; |
284 | + mousedev->close_device = mixdev_close_devices; |
285 | } else { |
286 | int dev_no = minor; |
287 | /* Normalize device number if it falls into legacy range */ |
288 | if (dev_no < MOUSEDEV_MINOR_BASE + MOUSEDEV_MINORS) |
289 | dev_no -= MOUSEDEV_MINOR_BASE; |
290 | dev_set_name(&mousedev->dev, "mouse%d", dev_no); |
291 | + |
292 | + mousedev->open_device = mousedev_open_device; |
293 | + mousedev->close_device = mousedev_close_device; |
294 | } |
295 | |
296 | mousedev->exist = true; |
297 | - mousedev->is_mixdev = mixdev; |
298 | mousedev->handle.dev = input_get_device(dev); |
299 | mousedev->handle.name = dev_name(&mousedev->dev); |
300 | mousedev->handle.handler = handler; |
301 | @@ -919,7 +930,7 @@ static void mousedev_destroy(struct mousedev *mousedev) |
302 | device_del(&mousedev->dev); |
303 | mousedev_cleanup(mousedev); |
304 | input_free_minor(MINOR(mousedev->dev.devt)); |
305 | - if (!mousedev->is_mixdev) |
306 | + if (mousedev != mousedev_mix) |
307 | input_unregister_handle(&mousedev->handle); |
308 | put_device(&mousedev->dev); |
309 | } |
310 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c |
311 | index 254f255204f9..a602aeeb3acb 100644 |
312 | --- a/drivers/net/ethernet/marvell/mvneta.c |
313 | +++ b/drivers/net/ethernet/marvell/mvneta.c |
314 | @@ -119,7 +119,7 @@ |
315 | #define MVNETA_GMAC_MAX_RX_SIZE_MASK 0x7ffc |
316 | #define MVNETA_GMAC0_PORT_ENABLE BIT(0) |
317 | #define MVNETA_GMAC_CTRL_2 0x2c08 |
318 | -#define MVNETA_GMAC2_PSC_ENABLE BIT(3) |
319 | +#define MVNETA_GMAC2_PCS_ENABLE BIT(3) |
320 | #define MVNETA_GMAC2_PORT_RGMII BIT(4) |
321 | #define MVNETA_GMAC2_PORT_RESET BIT(6) |
322 | #define MVNETA_GMAC_STATUS 0x2c10 |
323 | @@ -655,7 +655,7 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp) |
324 | u32 val; |
325 | |
326 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); |
327 | - val |= MVNETA_GMAC2_PSC_ENABLE; |
328 | + val |= MVNETA_GMAC2_PCS_ENABLE; |
329 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); |
330 | } |
331 | |
332 | diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c |
333 | index 6f3fbc48a6c7..22080eb6aff6 100644 |
334 | --- a/drivers/vfio/vfio_iommu_type1.c |
335 | +++ b/drivers/vfio/vfio_iommu_type1.c |
336 | @@ -138,12 +138,12 @@ static bool is_invalid_reserved_pfn(unsigned long pfn) |
337 | if (pfn_valid(pfn)) { |
338 | bool reserved; |
339 | struct page *tail = pfn_to_page(pfn); |
340 | - struct page *head = compound_trans_head(tail); |
341 | + struct page *head = compound_head(tail); |
342 | reserved = !!(PageReserved(head)); |
343 | if (head != tail) { |
344 | /* |
345 | * "head" is not a dangling pointer |
346 | - * (compound_trans_head takes care of that) |
347 | + * (compound_head takes care of that) |
348 | * but the hugepage may have been split |
349 | * from under us (and we may not hold a |
350 | * reference count on the head page so it can |
351 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
352 | index 21dff8f236f6..f9e11df768d5 100644 |
353 | --- a/fs/ext4/inode.c |
354 | +++ b/fs/ext4/inode.c |
355 | @@ -38,6 +38,7 @@ |
356 | #include <linux/slab.h> |
357 | #include <linux/ratelimit.h> |
358 | #include <linux/aio.h> |
359 | +#include <linux/bitops.h> |
360 | |
361 | #include "ext4_jbd2.h" |
362 | #include "xattr.h" |
363 | @@ -4044,18 +4045,20 @@ int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc) |
364 | void ext4_set_inode_flags(struct inode *inode) |
365 | { |
366 | unsigned int flags = EXT4_I(inode)->i_flags; |
367 | + unsigned int new_fl = 0; |
368 | |
369 | - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC); |
370 | if (flags & EXT4_SYNC_FL) |
371 | - inode->i_flags |= S_SYNC; |
372 | + new_fl |= S_SYNC; |
373 | if (flags & EXT4_APPEND_FL) |
374 | - inode->i_flags |= S_APPEND; |
375 | + new_fl |= S_APPEND; |
376 | if (flags & EXT4_IMMUTABLE_FL) |
377 | - inode->i_flags |= S_IMMUTABLE; |
378 | + new_fl |= S_IMMUTABLE; |
379 | if (flags & EXT4_NOATIME_FL) |
380 | - inode->i_flags |= S_NOATIME; |
381 | + new_fl |= S_NOATIME; |
382 | if (flags & EXT4_DIRSYNC_FL) |
383 | - inode->i_flags |= S_DIRSYNC; |
384 | + new_fl |= S_DIRSYNC; |
385 | + set_mask_bits(&inode->i_flags, |
386 | + S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC, new_fl); |
387 | } |
388 | |
389 | /* Propagate flags from i_flags to EXT4_I(inode)->i_flags */ |
390 | diff --git a/fs/proc/page.c b/fs/proc/page.c |
391 | index b8730d9ebaee..2a8cc94bb641 100644 |
392 | --- a/fs/proc/page.c |
393 | +++ b/fs/proc/page.c |
394 | @@ -121,7 +121,7 @@ u64 stable_page_flags(struct page *page) |
395 | * just checks PG_head/PG_tail, so we need to check PageLRU to make |
396 | * sure a given page is a thp, not a non-huge compound page. |
397 | */ |
398 | - else if (PageTransCompound(page) && PageLRU(compound_trans_head(page))) |
399 | + else if (PageTransCompound(page) && PageLRU(compound_head(page))) |
400 | u |= 1 << KPF_THP; |
401 | |
402 | /* |
403 | diff --git a/include/linux/bitops.h b/include/linux/bitops.h |
404 | index a3b6b82108b9..c1dde8e00d25 100644 |
405 | --- a/include/linux/bitops.h |
406 | +++ b/include/linux/bitops.h |
407 | @@ -185,6 +185,21 @@ static inline unsigned long __ffs64(u64 word) |
408 | |
409 | #ifdef __KERNEL__ |
410 | |
411 | +#ifndef set_mask_bits |
412 | +#define set_mask_bits(ptr, _mask, _bits) \ |
413 | +({ \ |
414 | + const typeof(*ptr) mask = (_mask), bits = (_bits); \ |
415 | + typeof(*ptr) old, new; \ |
416 | + \ |
417 | + do { \ |
418 | + old = ACCESS_ONCE(*ptr); \ |
419 | + new = (old & ~mask) | bits; \ |
420 | + } while (cmpxchg(ptr, old, new) != old); \ |
421 | + \ |
422 | + new; \ |
423 | +}) |
424 | +#endif |
425 | + |
426 | #ifndef find_last_bit |
427 | /** |
428 | * find_last_bit - find the last set bit in a memory region |
429 | diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h |
430 | index 528454c2caa9..a193bb3e4138 100644 |
431 | --- a/include/linux/huge_mm.h |
432 | +++ b/include/linux/huge_mm.h |
433 | @@ -159,23 +159,6 @@ static inline int hpage_nr_pages(struct page *page) |
434 | return HPAGE_PMD_NR; |
435 | return 1; |
436 | } |
437 | -static inline struct page *compound_trans_head(struct page *page) |
438 | -{ |
439 | - if (PageTail(page)) { |
440 | - struct page *head; |
441 | - head = page->first_page; |
442 | - smp_rmb(); |
443 | - /* |
444 | - * head may be a dangling pointer. |
445 | - * __split_huge_page_refcount clears PageTail before |
446 | - * overwriting first_page, so if PageTail is still |
447 | - * there it means the head pointer isn't dangling. |
448 | - */ |
449 | - if (PageTail(page)) |
450 | - return head; |
451 | - } |
452 | - return page; |
453 | -} |
454 | |
455 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
456 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); |
457 | @@ -205,7 +188,6 @@ static inline int split_huge_page(struct page *page) |
458 | do { } while (0) |
459 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ |
460 | do { } while (0) |
461 | -#define compound_trans_head(page) compound_head(page) |
462 | static inline int hugepage_madvise(struct vm_area_struct *vma, |
463 | unsigned long *vm_flags, int advice) |
464 | { |
465 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
466 | index 3bf21c3502d0..a9a48309f045 100644 |
467 | --- a/include/linux/mm.h |
468 | +++ b/include/linux/mm.h |
469 | @@ -361,8 +361,18 @@ static inline void compound_unlock_irqrestore(struct page *page, |
470 | |
471 | static inline struct page *compound_head(struct page *page) |
472 | { |
473 | - if (unlikely(PageTail(page))) |
474 | - return page->first_page; |
475 | + if (unlikely(PageTail(page))) { |
476 | + struct page *head = page->first_page; |
477 | + |
478 | + /* |
479 | + * page->first_page may be a dangling pointer to an old |
480 | + * compound page, so recheck that it is still a tail |
481 | + * page before returning. |
482 | + */ |
483 | + smp_rmb(); |
484 | + if (likely(PageTail(page))) |
485 | + return head; |
486 | + } |
487 | return page; |
488 | } |
489 | |
490 | diff --git a/mm/ksm.c b/mm/ksm.c |
491 | index b6afe0c440d8..784d1e4bc385 100644 |
492 | --- a/mm/ksm.c |
493 | +++ b/mm/ksm.c |
494 | @@ -444,7 +444,7 @@ static void break_cow(struct rmap_item *rmap_item) |
495 | static struct page *page_trans_compound_anon(struct page *page) |
496 | { |
497 | if (PageTransCompound(page)) { |
498 | - struct page *head = compound_trans_head(page); |
499 | + struct page *head = compound_head(page); |
500 | /* |
501 | * head may actually be splitted and freed from under |
502 | * us but it's ok here. |
503 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c |
504 | index e386beefc994..59c62fa75c5a 100644 |
505 | --- a/mm/memory-failure.c |
506 | +++ b/mm/memory-failure.c |
507 | @@ -1544,7 +1544,7 @@ int soft_offline_page(struct page *page, int flags) |
508 | { |
509 | int ret; |
510 | unsigned long pfn = page_to_pfn(page); |
511 | - struct page *hpage = compound_trans_head(page); |
512 | + struct page *hpage = compound_head(page); |
513 | |
514 | if (PageHWPoison(page)) { |
515 | pr_info("soft offline: %#lx page already poisoned\n", pfn); |
516 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
517 | index 2ee0fd313f03..0ab02fb8e9b1 100644 |
518 | --- a/mm/page_alloc.c |
519 | +++ b/mm/page_alloc.c |
520 | @@ -360,9 +360,11 @@ void prep_compound_page(struct page *page, unsigned long order) |
521 | __SetPageHead(page); |
522 | for (i = 1; i < nr_pages; i++) { |
523 | struct page *p = page + i; |
524 | - __SetPageTail(p); |
525 | set_page_count(p, 0); |
526 | p->first_page = page; |
527 | + /* Make sure p->first_page is always valid for PageTail() */ |
528 | + smp_wmb(); |
529 | + __SetPageTail(p); |
530 | } |
531 | } |
532 | |
533 | diff --git a/mm/swap.c b/mm/swap.c |
534 | index ea58dbde788e..4e35f3ff0427 100644 |
535 | --- a/mm/swap.c |
536 | +++ b/mm/swap.c |
537 | @@ -81,7 +81,7 @@ static void put_compound_page(struct page *page) |
538 | { |
539 | if (unlikely(PageTail(page))) { |
540 | /* __split_huge_page_refcount can run under us */ |
541 | - struct page *page_head = compound_trans_head(page); |
542 | + struct page *page_head = compound_head(page); |
543 | |
544 | if (likely(page != page_head && |
545 | get_page_unless_zero(page_head))) { |
546 | @@ -219,7 +219,7 @@ bool __get_page_tail(struct page *page) |
547 | */ |
548 | unsigned long flags; |
549 | bool got = false; |
550 | - struct page *page_head = compound_trans_head(page); |
551 | + struct page *page_head = compound_head(page); |
552 | |
553 | if (likely(page != page_head && get_page_unless_zero(page_head))) { |
554 | /* Ref to put_compound_page() comment. */ |
555 | diff --git a/net/netfilter/nf_conntrack_proto_dccp.c b/net/netfilter/nf_conntrack_proto_dccp.c |
556 | index a99b6c3427b0..59359bec328a 100644 |
557 | --- a/net/netfilter/nf_conntrack_proto_dccp.c |
558 | +++ b/net/netfilter/nf_conntrack_proto_dccp.c |
559 | @@ -428,7 +428,7 @@ static bool dccp_new(struct nf_conn *ct, const struct sk_buff *skb, |
560 | const char *msg; |
561 | u_int8_t state; |
562 | |
563 | - dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh); |
564 | + dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh); |
565 | BUG_ON(dh == NULL); |
566 | |
567 | state = dccp_state_table[CT_DCCP_ROLE_CLIENT][dh->dccph_type][CT_DCCP_NONE]; |
568 | @@ -486,7 +486,7 @@ static int dccp_packet(struct nf_conn *ct, const struct sk_buff *skb, |
569 | u_int8_t type, old_state, new_state; |
570 | enum ct_dccp_roles role; |
571 | |
572 | - dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh); |
573 | + dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh); |
574 | BUG_ON(dh == NULL); |
575 | type = dh->dccph_type; |
576 | |
577 | @@ -577,7 +577,7 @@ static int dccp_error(struct net *net, struct nf_conn *tmpl, |
578 | unsigned int cscov; |
579 | const char *msg; |
580 | |
581 | - dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &dh); |
582 | + dh = skb_header_pointer(skb, dataoff, sizeof(_dh), &_dh); |
583 | if (dh == NULL) { |
584 | msg = "nf_ct_dccp: short packet "; |
585 | goto out_invalid; |
586 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
587 | index eb99458f5b68..8cf1cd2fadaa 100644 |
588 | --- a/virt/kvm/kvm_main.c |
589 | +++ b/virt/kvm/kvm_main.c |
590 | @@ -105,12 +105,12 @@ bool kvm_is_mmio_pfn(pfn_t pfn) |
591 | if (pfn_valid(pfn)) { |
592 | int reserved; |
593 | struct page *tail = pfn_to_page(pfn); |
594 | - struct page *head = compound_trans_head(tail); |
595 | + struct page *head = compound_head(tail); |
596 | reserved = PageReserved(head); |
597 | if (head != tail) { |
598 | /* |
599 | * "head" is not a dangling pointer |
600 | - * (compound_trans_head takes care of that) |
601 | + * (compound_head takes care of that) |
602 | * but the hugepage may have been splitted |
603 | * from under us (and we may not hold a |
604 | * reference count on the head page so it can |
Properties
Name | Value |
---|---|
svn:mime-type | application/x-xz |