Contents of /trunk/kernel-magellan/patches-3.6/0110-3.6.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2015 -
(show annotations)
(download)
Tue Jan 8 09:12:29 2013 UTC (11 years, 8 months ago) by niro
File size: 69661 byte(s)
Tue Jan 8 09:12:29 2013 UTC (11 years, 8 months ago) by niro
File size: 69661 byte(s)
-linux 3.6.11
1 | diff --git a/arch/arm/include/asm/hwcap.h b/arch/arm/include/asm/hwcap.h |
2 | index 9176261..a2fe893 100644 |
3 | --- a/arch/arm/include/asm/hwcap.h |
4 | +++ b/arch/arm/include/asm/hwcap.h |
5 | @@ -18,11 +18,12 @@ |
6 | #define HWCAP_THUMBEE (1 << 11) |
7 | #define HWCAP_NEON (1 << 12) |
8 | #define HWCAP_VFPv3 (1 << 13) |
9 | -#define HWCAP_VFPv3D16 (1 << 14) |
10 | +#define HWCAP_VFPv3D16 (1 << 14) /* also set for VFPv4-D16 */ |
11 | #define HWCAP_TLS (1 << 15) |
12 | #define HWCAP_VFPv4 (1 << 16) |
13 | #define HWCAP_IDIVA (1 << 17) |
14 | #define HWCAP_IDIVT (1 << 18) |
15 | +#define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */ |
16 | #define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) |
17 | |
18 | #if defined(__KERNEL__) |
19 | diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h |
20 | index bf53047..c49c8f7 100644 |
21 | --- a/arch/arm/include/asm/vfpmacros.h |
22 | +++ b/arch/arm/include/asm/vfpmacros.h |
23 | @@ -27,9 +27,9 @@ |
24 | #if __LINUX_ARM_ARCH__ <= 6 |
25 | ldr \tmp, =elf_hwcap @ may not have MVFR regs |
26 | ldr \tmp, [\tmp, #0] |
27 | - tst \tmp, #HWCAP_VFPv3D16 |
28 | - ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
29 | - addne \base, \base, #32*4 @ step over unused register space |
30 | + tst \tmp, #HWCAP_VFPD32 |
31 | + ldcnel p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
32 | + addeq \base, \base, #32*4 @ step over unused register space |
33 | #else |
34 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
35 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
36 | @@ -51,9 +51,9 @@ |
37 | #if __LINUX_ARM_ARCH__ <= 6 |
38 | ldr \tmp, =elf_hwcap @ may not have MVFR regs |
39 | ldr \tmp, [\tmp, #0] |
40 | - tst \tmp, #HWCAP_VFPv3D16 |
41 | - stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
42 | - addne \base, \base, #32*4 @ step over unused register space |
43 | + tst \tmp, #HWCAP_VFPD32 |
44 | + stcnel p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
45 | + addeq \base, \base, #32*4 @ step over unused register space |
46 | #else |
47 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
48 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
49 | diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c |
50 | index c834b32..3b44e0d 100644 |
51 | --- a/arch/arm/vfp/vfpmodule.c |
52 | +++ b/arch/arm/vfp/vfpmodule.c |
53 | @@ -701,11 +701,14 @@ static int __init vfp_init(void) |
54 | elf_hwcap |= HWCAP_VFPv3; |
55 | |
56 | /* |
57 | - * Check for VFPv3 D16. CPUs in this configuration |
58 | - * only have 16 x 64bit registers. |
59 | + * Check for VFPv3 D16 and VFPv4 D16. CPUs in |
60 | + * this configuration only have 16 x 64bit |
61 | + * registers. |
62 | */ |
63 | if (((fmrx(MVFR0) & MVFR0_A_SIMD_MASK)) == 1) |
64 | - elf_hwcap |= HWCAP_VFPv3D16; |
65 | + elf_hwcap |= HWCAP_VFPv3D16; /* also v4-D16 */ |
66 | + else |
67 | + elf_hwcap |= HWCAP_VFPD32; |
68 | } |
69 | #endif |
70 | /* |
71 | diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c |
72 | index 041e28d..1f12c24 100644 |
73 | --- a/arch/powerpc/platforms/pseries/eeh_driver.c |
74 | +++ b/arch/powerpc/platforms/pseries/eeh_driver.c |
75 | @@ -164,17 +164,18 @@ static int eeh_report_error(struct pci_dev *dev, void *userdata) |
76 | enum pci_ers_result rc, *res = userdata; |
77 | struct pci_driver *driver; |
78 | |
79 | + device_lock(&dev->dev); |
80 | dev->error_state = pci_channel_io_frozen; |
81 | |
82 | driver = eeh_pcid_get(dev); |
83 | - if (!driver) return 0; |
84 | + if (!driver) goto out; |
85 | |
86 | eeh_disable_irq(dev); |
87 | |
88 | if (!driver->err_handler || |
89 | !driver->err_handler->error_detected) { |
90 | eeh_pcid_put(dev); |
91 | - return 0; |
92 | + goto out; |
93 | } |
94 | |
95 | rc = driver->err_handler->error_detected(dev, pci_channel_io_frozen); |
96 | @@ -184,6 +185,8 @@ static int eeh_report_error(struct pci_dev *dev, void *userdata) |
97 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; |
98 | |
99 | eeh_pcid_put(dev); |
100 | +out: |
101 | + device_unlock(&dev->dev); |
102 | return 0; |
103 | } |
104 | |
105 | @@ -201,13 +204,14 @@ static int eeh_report_mmio_enabled(struct pci_dev *dev, void *userdata) |
106 | enum pci_ers_result rc, *res = userdata; |
107 | struct pci_driver *driver; |
108 | |
109 | + device_lock(&dev->dev); |
110 | driver = eeh_pcid_get(dev); |
111 | - if (!driver) return 0; |
112 | + if (!driver) goto out; |
113 | |
114 | if (!driver->err_handler || |
115 | !driver->err_handler->mmio_enabled) { |
116 | eeh_pcid_put(dev); |
117 | - return 0; |
118 | + goto out; |
119 | } |
120 | |
121 | rc = driver->err_handler->mmio_enabled(dev); |
122 | @@ -217,6 +221,8 @@ static int eeh_report_mmio_enabled(struct pci_dev *dev, void *userdata) |
123 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; |
124 | |
125 | eeh_pcid_put(dev); |
126 | +out: |
127 | + device_unlock(&dev->dev); |
128 | return 0; |
129 | } |
130 | |
131 | @@ -235,17 +241,18 @@ static int eeh_report_reset(struct pci_dev *dev, void *userdata) |
132 | enum pci_ers_result rc, *res = userdata; |
133 | struct pci_driver *driver; |
134 | |
135 | + device_lock(&dev->dev); |
136 | dev->error_state = pci_channel_io_normal; |
137 | |
138 | driver = eeh_pcid_get(dev); |
139 | - if (!driver) return 0; |
140 | + if (!driver) goto out; |
141 | |
142 | eeh_enable_irq(dev); |
143 | |
144 | if (!driver->err_handler || |
145 | !driver->err_handler->slot_reset) { |
146 | eeh_pcid_put(dev); |
147 | - return 0; |
148 | + goto out; |
149 | } |
150 | |
151 | rc = driver->err_handler->slot_reset(dev); |
152 | @@ -255,6 +262,8 @@ static int eeh_report_reset(struct pci_dev *dev, void *userdata) |
153 | rc == PCI_ERS_RESULT_NEED_RESET) *res = rc; |
154 | |
155 | eeh_pcid_put(dev); |
156 | +out: |
157 | + device_unlock(&dev->dev); |
158 | return 0; |
159 | } |
160 | |
161 | @@ -271,22 +280,25 @@ static int eeh_report_resume(struct pci_dev *dev, void *userdata) |
162 | { |
163 | struct pci_driver *driver; |
164 | |
165 | + device_lock(&dev->dev); |
166 | dev->error_state = pci_channel_io_normal; |
167 | |
168 | driver = eeh_pcid_get(dev); |
169 | - if (!driver) return 0; |
170 | + if (!driver) goto out; |
171 | |
172 | eeh_enable_irq(dev); |
173 | |
174 | if (!driver->err_handler || |
175 | !driver->err_handler->resume) { |
176 | eeh_pcid_put(dev); |
177 | - return 0; |
178 | + goto out; |
179 | } |
180 | |
181 | driver->err_handler->resume(dev); |
182 | |
183 | eeh_pcid_put(dev); |
184 | +out: |
185 | + device_unlock(&dev->dev); |
186 | return 0; |
187 | } |
188 | |
189 | @@ -302,22 +314,25 @@ static int eeh_report_failure(struct pci_dev *dev, void *userdata) |
190 | { |
191 | struct pci_driver *driver; |
192 | |
193 | + device_lock(&dev->dev); |
194 | dev->error_state = pci_channel_io_perm_failure; |
195 | |
196 | driver = eeh_pcid_get(dev); |
197 | - if (!driver) return 0; |
198 | + if (!driver) goto out; |
199 | |
200 | eeh_disable_irq(dev); |
201 | |
202 | if (!driver->err_handler || |
203 | !driver->err_handler->error_detected) { |
204 | eeh_pcid_put(dev); |
205 | - return 0; |
206 | + goto out; |
207 | } |
208 | |
209 | driver->err_handler->error_detected(dev, pci_channel_io_perm_failure); |
210 | |
211 | eeh_pcid_put(dev); |
212 | +out: |
213 | + device_unlock(&dev->dev); |
214 | return 0; |
215 | } |
216 | |
217 | diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
218 | index 1460a5d..e28670f 100644 |
219 | --- a/arch/x86/kernel/hpet.c |
220 | +++ b/arch/x86/kernel/hpet.c |
221 | @@ -434,7 +434,7 @@ void hpet_msi_unmask(struct irq_data *data) |
222 | |
223 | /* unmask it */ |
224 | cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); |
225 | - cfg |= HPET_TN_FSB; |
226 | + cfg |= HPET_TN_ENABLE | HPET_TN_FSB; |
227 | hpet_writel(cfg, HPET_Tn_CFG(hdev->num)); |
228 | } |
229 | |
230 | @@ -445,7 +445,7 @@ void hpet_msi_mask(struct irq_data *data) |
231 | |
232 | /* mask it */ |
233 | cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); |
234 | - cfg &= ~HPET_TN_FSB; |
235 | + cfg &= ~(HPET_TN_ENABLE | HPET_TN_FSB); |
236 | hpet_writel(cfg, HPET_Tn_CFG(hdev->num)); |
237 | } |
238 | |
239 | diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c |
240 | index 45e3e17..7efaeaa 100644 |
241 | --- a/drivers/acpi/battery.c |
242 | +++ b/drivers/acpi/battery.c |
243 | @@ -34,6 +34,7 @@ |
244 | #include <linux/dmi.h> |
245 | #include <linux/slab.h> |
246 | #include <linux/suspend.h> |
247 | +#include <asm/unaligned.h> |
248 | |
249 | #ifdef CONFIG_ACPI_PROCFS_POWER |
250 | #include <linux/proc_fs.h> |
251 | @@ -95,6 +96,18 @@ enum { |
252 | ACPI_BATTERY_ALARM_PRESENT, |
253 | ACPI_BATTERY_XINFO_PRESENT, |
254 | ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, |
255 | + /* On Lenovo Thinkpad models from 2010 and 2011, the power unit |
256 | + switches between mWh and mAh depending on whether the system |
257 | + is running on battery or not. When mAh is the unit, most |
258 | + reported values are incorrect and need to be adjusted by |
259 | + 10000/design_voltage. Verified on x201, t410, t410s, and x220. |
260 | + Pre-2010 and 2012 models appear to always report in mWh and |
261 | + are thus unaffected (tested with t42, t61, t500, x200, x300, |
262 | + and x230). Also, in mid-2012 Lenovo issued a BIOS update for |
263 | + the 2011 models that fixes the issue (tested on x220 with a |
264 | + post-1.29 BIOS), but as of Nov. 2012, no such update is |
265 | + available for the 2010 models. */ |
266 | + ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
267 | }; |
268 | |
269 | struct acpi_battery { |
270 | @@ -438,6 +451,21 @@ static int acpi_battery_get_info(struct acpi_battery *battery) |
271 | kfree(buffer.pointer); |
272 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) |
273 | battery->full_charge_capacity = battery->design_capacity; |
274 | + if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && |
275 | + battery->power_unit && battery->design_voltage) { |
276 | + battery->design_capacity = battery->design_capacity * |
277 | + 10000 / battery->design_voltage; |
278 | + battery->full_charge_capacity = battery->full_charge_capacity * |
279 | + 10000 / battery->design_voltage; |
280 | + battery->design_capacity_warning = |
281 | + battery->design_capacity_warning * |
282 | + 10000 / battery->design_voltage; |
283 | + /* Curiously, design_capacity_low, unlike the rest of them, |
284 | + is correct. */ |
285 | + /* capacity_granularity_* equal 1 on the systems tested, so |
286 | + it's impossible to tell if they would need an adjustment |
287 | + or not if their values were higher. */ |
288 | + } |
289 | return result; |
290 | } |
291 | |
292 | @@ -486,6 +514,11 @@ static int acpi_battery_get_state(struct acpi_battery *battery) |
293 | && battery->capacity_now >= 0 && battery->capacity_now <= 100) |
294 | battery->capacity_now = (battery->capacity_now * |
295 | battery->full_charge_capacity) / 100; |
296 | + if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && |
297 | + battery->power_unit && battery->design_voltage) { |
298 | + battery->capacity_now = battery->capacity_now * |
299 | + 10000 / battery->design_voltage; |
300 | + } |
301 | return result; |
302 | } |
303 | |
304 | @@ -595,6 +628,24 @@ static void sysfs_remove_battery(struct acpi_battery *battery) |
305 | mutex_unlock(&battery->sysfs_lock); |
306 | } |
307 | |
308 | +static void find_battery(const struct dmi_header *dm, void *private) |
309 | +{ |
310 | + struct acpi_battery *battery = (struct acpi_battery *)private; |
311 | + /* Note: the hardcoded offsets below have been extracted from |
312 | + the source code of dmidecode. */ |
313 | + if (dm->type == DMI_ENTRY_PORTABLE_BATTERY && dm->length >= 8) { |
314 | + const u8 *dmi_data = (const u8 *)(dm + 1); |
315 | + int dmi_capacity = get_unaligned((const u16 *)(dmi_data + 6)); |
316 | + if (dm->length >= 18) |
317 | + dmi_capacity *= dmi_data[17]; |
318 | + if (battery->design_capacity * battery->design_voltage / 1000 |
319 | + != dmi_capacity && |
320 | + battery->design_capacity * 10 == dmi_capacity) |
321 | + set_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
322 | + &battery->flags); |
323 | + } |
324 | +} |
325 | + |
326 | /* |
327 | * According to the ACPI spec, some kinds of primary batteries can |
328 | * report percentage battery remaining capacity directly to OS. |
329 | @@ -620,6 +671,32 @@ static void acpi_battery_quirks(struct acpi_battery *battery) |
330 | battery->capacity_now = (battery->capacity_now * |
331 | battery->full_charge_capacity) / 100; |
332 | } |
333 | + |
334 | + if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags)) |
335 | + return ; |
336 | + |
337 | + if (battery->power_unit && dmi_name_in_vendors("LENOVO")) { |
338 | + const char *s; |
339 | + s = dmi_get_system_info(DMI_PRODUCT_VERSION); |
340 | + if (s && !strnicmp(s, "ThinkPad", 8)) { |
341 | + dmi_walk(find_battery, battery); |
342 | + if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
343 | + &battery->flags) && |
344 | + battery->design_voltage) { |
345 | + battery->design_capacity = |
346 | + battery->design_capacity * |
347 | + 10000 / battery->design_voltage; |
348 | + battery->full_charge_capacity = |
349 | + battery->full_charge_capacity * |
350 | + 10000 / battery->design_voltage; |
351 | + battery->design_capacity_warning = |
352 | + battery->design_capacity_warning * |
353 | + 10000 / battery->design_voltage; |
354 | + battery->capacity_now = battery->capacity_now * |
355 | + 10000 / battery->design_voltage; |
356 | + } |
357 | + } |
358 | + } |
359 | } |
360 | |
361 | static int acpi_battery_update(struct acpi_battery *battery) |
362 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
363 | index fdcdbb6..847ed55 100644 |
364 | --- a/drivers/acpi/sleep.c |
365 | +++ b/drivers/acpi/sleep.c |
366 | @@ -519,6 +519,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
367 | }, |
368 | { |
369 | .callback = init_nvs_nosave, |
370 | + .ident = "Sony Vaio VPCEB1S1E", |
371 | + .matches = { |
372 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
373 | + DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"), |
374 | + }, |
375 | + }, |
376 | + { |
377 | + .callback = init_nvs_nosave, |
378 | .ident = "Sony Vaio VGN-FW520F", |
379 | .matches = { |
380 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
381 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
382 | index 9fe2659..3837739 100644 |
383 | --- a/drivers/acpi/video.c |
384 | +++ b/drivers/acpi/video.c |
385 | @@ -389,6 +389,12 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) |
386 | return 0; |
387 | } |
388 | |
389 | +static int video_ignore_initial_backlight(const struct dmi_system_id *d) |
390 | +{ |
391 | + use_bios_initial_backlight = 0; |
392 | + return 0; |
393 | +} |
394 | + |
395 | static struct dmi_system_id video_dmi_table[] __initdata = { |
396 | /* |
397 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 |
398 | @@ -433,6 +439,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
399 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), |
400 | }, |
401 | }, |
402 | + { |
403 | + .callback = video_ignore_initial_backlight, |
404 | + .ident = "HP Folio 13-2000", |
405 | + .matches = { |
406 | + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
407 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"), |
408 | + }, |
409 | + }, |
410 | {} |
411 | }; |
412 | |
413 | diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c |
414 | index b728880..4ac2593 100644 |
415 | --- a/drivers/acpi/video_detect.c |
416 | +++ b/drivers/acpi/video_detect.c |
417 | @@ -156,6 +156,14 @@ static struct dmi_system_id video_detect_dmi_table[] = { |
418 | DMI_MATCH(DMI_BOARD_NAME, "X360"), |
419 | }, |
420 | }, |
421 | + { |
422 | + .callback = video_detect_force_vendor, |
423 | + .ident = "Asus UL30VT", |
424 | + .matches = { |
425 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
426 | + DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"), |
427 | + }, |
428 | + }, |
429 | { }, |
430 | }; |
431 | |
432 | diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c |
433 | index fe0de7e..5f2595a 100644 |
434 | --- a/drivers/block/floppy.c |
435 | +++ b/drivers/block/floppy.c |
436 | @@ -4329,6 +4329,7 @@ out_unreg_region: |
437 | out_unreg_blkdev: |
438 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
439 | out_put_disk: |
440 | + destroy_workqueue(floppy_wq); |
441 | while (dr--) { |
442 | del_timer_sync(&motor_off_timer[dr]); |
443 | if (disks[dr]->queue) { |
444 | @@ -4341,7 +4342,6 @@ out_put_disk: |
445 | } |
446 | put_disk(disks[dr]); |
447 | } |
448 | - destroy_workqueue(floppy_wq); |
449 | return err; |
450 | } |
451 | |
452 | @@ -4556,6 +4556,8 @@ static void __exit floppy_module_exit(void) |
453 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
454 | platform_driver_unregister(&floppy_driver); |
455 | |
456 | + destroy_workqueue(floppy_wq); |
457 | + |
458 | for (drive = 0; drive < N_DRIVE; drive++) { |
459 | del_timer_sync(&motor_off_timer[drive]); |
460 | |
461 | @@ -4580,7 +4582,6 @@ static void __exit floppy_module_exit(void) |
462 | |
463 | cancel_delayed_work_sync(&fd_timeout); |
464 | cancel_delayed_work_sync(&fd_timer); |
465 | - destroy_workqueue(floppy_wq); |
466 | |
467 | if (atomic_read(&usage_count)) |
468 | floppy_release_irq_and_dma(); |
469 | diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c |
470 | index d5dc9da..81eb9fd 100644 |
471 | --- a/drivers/edac/edac_mc.c |
472 | +++ b/drivers/edac/edac_mc.c |
473 | @@ -416,10 +416,18 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num, |
474 | dimm->cschannel = chn; |
475 | |
476 | /* Increment csrow location */ |
477 | - row++; |
478 | - if (row == tot_csrows) { |
479 | - row = 0; |
480 | + if (layers[0].is_virt_csrow) { |
481 | chn++; |
482 | + if (chn == tot_channels) { |
483 | + chn = 0; |
484 | + row++; |
485 | + } |
486 | + } else { |
487 | + row++; |
488 | + if (row == tot_csrows) { |
489 | + row = 0; |
490 | + chn++; |
491 | + } |
492 | } |
493 | |
494 | /* Increment dimm location */ |
495 | diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c |
496 | index 069e26c..a980204 100644 |
497 | --- a/drivers/edac/i82975x_edac.c |
498 | +++ b/drivers/edac/i82975x_edac.c |
499 | @@ -370,10 +370,6 @@ static enum dev_type i82975x_dram_type(void __iomem *mch_window, int rank) |
500 | static void i82975x_init_csrows(struct mem_ctl_info *mci, |
501 | struct pci_dev *pdev, void __iomem *mch_window) |
502 | { |
503 | - static const char *labels[4] = { |
504 | - "DIMM A1", "DIMM A2", |
505 | - "DIMM B1", "DIMM B2" |
506 | - }; |
507 | struct csrow_info *csrow; |
508 | unsigned long last_cumul_size; |
509 | u8 value; |
510 | @@ -423,9 +419,10 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, |
511 | dimm = mci->csrows[index]->channels[chan]->dimm; |
512 | |
513 | dimm->nr_pages = nr_pages / csrow->nr_channels; |
514 | - strncpy(csrow->channels[chan]->dimm->label, |
515 | - labels[(index >> 1) + (chan * 2)], |
516 | - EDAC_MC_LABEL_LEN); |
517 | + |
518 | + snprintf(csrow->channels[chan]->dimm->label, EDAC_MC_LABEL_LEN, "DIMM %c%d", |
519 | + (chan == 0) ? 'A' : 'B', |
520 | + index); |
521 | dimm->grain = 1 << 7; /* 128Byte cache-line resolution */ |
522 | dimm->dtype = i82975x_dram_type(mch_window, index); |
523 | dimm->mtype = MEM_DDR2; /* I82975x supports only DDR2 */ |
524 | diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
525 | index 8c60741..d0df62a 100644 |
526 | --- a/drivers/gpu/drm/i915/intel_bios.c |
527 | +++ b/drivers/gpu/drm/i915/intel_bios.c |
528 | @@ -500,12 +500,8 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) |
529 | |
530 | edp = find_section(bdb, BDB_EDP); |
531 | if (!edp) { |
532 | - if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { |
533 | - DRM_DEBUG_KMS("No eDP BDB found but eDP panel " |
534 | - "supported, assume %dbpp panel color " |
535 | - "depth.\n", |
536 | - dev_priv->edp.bpp); |
537 | - } |
538 | + if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) |
539 | + DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); |
540 | return; |
541 | } |
542 | |
543 | @@ -658,9 +654,6 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) |
544 | dev_priv->lvds_use_ssc = 1; |
545 | dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); |
546 | DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); |
547 | - |
548 | - /* eDP data */ |
549 | - dev_priv->edp.bpp = 18; |
550 | } |
551 | |
552 | static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) |
553 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
554 | index b634f6f..0777c79 100644 |
555 | --- a/drivers/gpu/drm/i915/intel_display.c |
556 | +++ b/drivers/gpu/drm/i915/intel_display.c |
557 | @@ -3791,6 +3791,17 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, |
558 | } |
559 | } |
560 | |
561 | + if (intel_encoder->type == INTEL_OUTPUT_EDP) { |
562 | + /* Use VBT settings if we have an eDP panel */ |
563 | + unsigned int edp_bpc = dev_priv->edp.bpp / 3; |
564 | + |
565 | + if (edp_bpc && edp_bpc < display_bpc) { |
566 | + DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); |
567 | + display_bpc = edp_bpc; |
568 | + } |
569 | + continue; |
570 | + } |
571 | + |
572 | /* |
573 | * HDMI is either 12 or 8, so if the display lets 10bpc sneak |
574 | * through, clamp it down. (Note: >12bpc will be caught below.) |
575 | diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c |
576 | index af69073..f7b8237de 100644 |
577 | --- a/drivers/hwmon/fam15h_power.c |
578 | +++ b/drivers/hwmon/fam15h_power.c |
579 | @@ -31,6 +31,9 @@ MODULE_DESCRIPTION("AMD Family 15h CPU processor power monitor"); |
580 | MODULE_AUTHOR("Andreas Herrmann <andreas.herrmann3@amd.com>"); |
581 | MODULE_LICENSE("GPL"); |
582 | |
583 | +/* Family 16h Northbridge's function 4 PCI ID */ |
584 | +#define PCI_DEVICE_ID_AMD_16H_NB_F4 0x1534 |
585 | + |
586 | /* D18F3 */ |
587 | #define REG_NORTHBRIDGE_CAP 0xe8 |
588 | |
589 | @@ -257,6 +260,7 @@ static void __devexit fam15h_power_remove(struct pci_dev *pdev) |
590 | |
591 | static DEFINE_PCI_DEVICE_TABLE(fam15h_power_id_table) = { |
592 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, |
593 | + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, |
594 | {} |
595 | }; |
596 | MODULE_DEVICE_TABLE(pci, fam15h_power_id_table); |
597 | diff --git a/drivers/input/matrix-keymap.c b/drivers/input/matrix-keymap.c |
598 | index 443ad64b..d88d9be 100644 |
599 | --- a/drivers/input/matrix-keymap.c |
600 | +++ b/drivers/input/matrix-keymap.c |
601 | @@ -23,6 +23,7 @@ |
602 | #include <linux/input.h> |
603 | #include <linux/of.h> |
604 | #include <linux/export.h> |
605 | +#include <linux/module.h> |
606 | #include <linux/input/matrix_keypad.h> |
607 | |
608 | static bool matrix_keypad_map_key(struct input_dev *input_dev, |
609 | @@ -161,3 +162,5 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, |
610 | return 0; |
611 | } |
612 | EXPORT_SYMBOL(matrix_keypad_build_keymap); |
613 | + |
614 | +MODULE_LICENSE("GPL"); |
615 | diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c |
616 | index 9058d21..2671202 100644 |
617 | --- a/drivers/mmc/host/sh_mmcif.c |
618 | +++ b/drivers/mmc/host/sh_mmcif.c |
619 | @@ -1104,7 +1104,6 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) |
620 | { |
621 | struct sh_mmcif_host *host = dev_id; |
622 | struct mmc_request *mrq = host->mrq; |
623 | - struct mmc_data *data = mrq->data; |
624 | |
625 | cancel_delayed_work_sync(&host->timeout_work); |
626 | |
627 | @@ -1152,13 +1151,14 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) |
628 | case MMCIF_WAIT_FOR_READ_END: |
629 | case MMCIF_WAIT_FOR_WRITE_END: |
630 | if (host->sd_error) |
631 | - data->error = sh_mmcif_error_manage(host); |
632 | + mrq->data->error = sh_mmcif_error_manage(host); |
633 | break; |
634 | default: |
635 | BUG(); |
636 | } |
637 | |
638 | if (host->wait_for != MMCIF_WAIT_FOR_STOP) { |
639 | + struct mmc_data *data = mrq->data; |
640 | if (!mrq->cmd->error && data && !data->error) |
641 | data->bytes_xfered = |
642 | data->blocks * data->blksz; |
643 | @@ -1229,10 +1229,6 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id) |
644 | host->sd_error = true; |
645 | dev_dbg(&host->pd->dev, "int err state = %08x\n", state); |
646 | } |
647 | - if (host->state == STATE_IDLE) { |
648 | - dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state); |
649 | - return IRQ_HANDLED; |
650 | - } |
651 | if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { |
652 | if (!host->dma_active) |
653 | return IRQ_WAKE_THREAD; |
654 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
655 | index d688a8a..acc0718 100644 |
656 | --- a/drivers/net/bonding/bond_main.c |
657 | +++ b/drivers/net/bonding/bond_main.c |
658 | @@ -1379,6 +1379,8 @@ static void bond_compute_features(struct bonding *bond) |
659 | struct net_device *bond_dev = bond->dev; |
660 | netdev_features_t vlan_features = BOND_VLAN_FEATURES; |
661 | unsigned short max_hard_header_len = ETH_HLEN; |
662 | + unsigned int gso_max_size = GSO_MAX_SIZE; |
663 | + u16 gso_max_segs = GSO_MAX_SEGS; |
664 | int i; |
665 | unsigned int flags, dst_release_flag = IFF_XMIT_DST_RELEASE; |
666 | |
667 | @@ -1394,11 +1396,16 @@ static void bond_compute_features(struct bonding *bond) |
668 | dst_release_flag &= slave->dev->priv_flags; |
669 | if (slave->dev->hard_header_len > max_hard_header_len) |
670 | max_hard_header_len = slave->dev->hard_header_len; |
671 | + |
672 | + gso_max_size = min(gso_max_size, slave->dev->gso_max_size); |
673 | + gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs); |
674 | } |
675 | |
676 | done: |
677 | bond_dev->vlan_features = vlan_features; |
678 | bond_dev->hard_header_len = max_hard_header_len; |
679 | + bond_dev->gso_max_segs = gso_max_segs; |
680 | + netif_set_gso_max_size(bond_dev, gso_max_size); |
681 | |
682 | flags = bond_dev->priv_flags & ~IFF_XMIT_DST_RELEASE; |
683 | bond_dev->priv_flags = flags | dst_release_flag; |
684 | diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c |
685 | index dc15d24..21609f9 100644 |
686 | --- a/drivers/net/bonding/bond_sysfs.c |
687 | +++ b/drivers/net/bonding/bond_sysfs.c |
688 | @@ -1582,6 +1582,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, |
689 | goto out; |
690 | } |
691 | |
692 | + read_lock(&bond->lock); |
693 | bond_for_each_slave(bond, slave, i) { |
694 | if (!bond_is_active_slave(slave)) { |
695 | if (new_value) |
696 | @@ -1590,6 +1591,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, |
697 | slave->inactive = 1; |
698 | } |
699 | } |
700 | + read_unlock(&bond->lock); |
701 | out: |
702 | return ret; |
703 | } |
704 | diff --git a/drivers/net/ethernet/8390/ne.c b/drivers/net/ethernet/8390/ne.c |
705 | index d04911d..47618e5 100644 |
706 | --- a/drivers/net/ethernet/8390/ne.c |
707 | +++ b/drivers/net/ethernet/8390/ne.c |
708 | @@ -813,6 +813,7 @@ static int __init ne_drv_probe(struct platform_device *pdev) |
709 | dev->irq = irq[this_dev]; |
710 | dev->mem_end = bad[this_dev]; |
711 | } |
712 | + SET_NETDEV_DEV(dev, &pdev->dev); |
713 | err = do_ne_probe(dev); |
714 | if (err) { |
715 | free_netdev(dev); |
716 | diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c |
717 | index 203d9c6..f21e30c 100644 |
718 | --- a/drivers/net/ethernet/sis/sis900.c |
719 | +++ b/drivers/net/ethernet/sis/sis900.c |
720 | @@ -2477,7 +2477,7 @@ static int sis900_resume(struct pci_dev *pci_dev) |
721 | netif_start_queue(net_dev); |
722 | |
723 | /* Workaround for EDB */ |
724 | - sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
725 | + sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
726 | |
727 | /* Enable all known interrupts by setting the interrupt mask. */ |
728 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); |
729 | diff --git a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c |
730 | index 5039f08..43e9ab4 100644 |
731 | --- a/drivers/net/irda/sir_dev.c |
732 | +++ b/drivers/net/irda/sir_dev.c |
733 | @@ -222,7 +222,7 @@ static void sirdev_config_fsm(struct work_struct *work) |
734 | break; |
735 | |
736 | case SIRDEV_STATE_DONGLE_SPEED: |
737 | - if (dev->dongle_drv->reset) { |
738 | + if (dev->dongle_drv->set_speed) { |
739 | ret = dev->dongle_drv->set_speed(dev, fsm->param); |
740 | if (ret < 0) { |
741 | fsm->result = ret; |
742 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c |
743 | index 4cd582a..74fab1a 100644 |
744 | --- a/drivers/net/usb/cdc_ncm.c |
745 | +++ b/drivers/net/usb/cdc_ncm.c |
746 | @@ -540,10 +540,12 @@ advance: |
747 | (ctx->ether_desc == NULL) || (ctx->control != intf)) |
748 | goto error; |
749 | |
750 | - /* claim interfaces, if any */ |
751 | - temp = usb_driver_claim_interface(driver, ctx->data, dev); |
752 | - if (temp) |
753 | - goto error; |
754 | + /* claim data interface, if different from control */ |
755 | + if (ctx->data != ctx->control) { |
756 | + temp = usb_driver_claim_interface(driver, ctx->data, dev); |
757 | + if (temp) |
758 | + goto error; |
759 | + } |
760 | |
761 | iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; |
762 | |
763 | @@ -623,6 +625,10 @@ static void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf) |
764 | |
765 | tasklet_kill(&ctx->bh); |
766 | |
767 | + /* handle devices with combined control and data interface */ |
768 | + if (ctx->control == ctx->data) |
769 | + ctx->data = NULL; |
770 | + |
771 | /* disconnect master --> disconnect slave */ |
772 | if (intf == ctx->control && ctx->data) { |
773 | usb_set_intfdata(ctx->data, NULL); |
774 | @@ -1245,6 +1251,14 @@ static const struct usb_device_id cdc_devs[] = { |
775 | .driver_info = (unsigned long) &wwan_info, |
776 | }, |
777 | |
778 | + /* Huawei NCM devices disguised as vendor specific */ |
779 | + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16), |
780 | + .driver_info = (unsigned long)&wwan_info, |
781 | + }, |
782 | + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x46), |
783 | + .driver_info = (unsigned long)&wwan_info, |
784 | + }, |
785 | + |
786 | /* Generic CDC-NCM devices */ |
787 | { USB_INTERFACE_INFO(USB_CLASS_COMM, |
788 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), |
789 | diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c |
790 | index a28a983..534d8be 100644 |
791 | --- a/drivers/net/usb/ipheth.c |
792 | +++ b/drivers/net/usb/ipheth.c |
793 | @@ -62,6 +62,7 @@ |
794 | #define USB_PRODUCT_IPAD 0x129a |
795 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c |
796 | #define USB_PRODUCT_IPHONE_4S 0x12a0 |
797 | +#define USB_PRODUCT_IPHONE_5 0x12a8 |
798 | |
799 | #define IPHETH_USBINTF_CLASS 255 |
800 | #define IPHETH_USBINTF_SUBCLASS 253 |
801 | @@ -113,6 +114,10 @@ static struct usb_device_id ipheth_table[] = { |
802 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, |
803 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
804 | IPHETH_USBINTF_PROTO) }, |
805 | + { USB_DEVICE_AND_INTERFACE_INFO( |
806 | + USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5, |
807 | + IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
808 | + IPHETH_USBINTF_PROTO) }, |
809 | { } |
810 | }; |
811 | MODULE_DEVICE_TABLE(usb, ipheth_table); |
812 | diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c |
813 | index 4b0970b..e7b5fd2 100644 |
814 | --- a/drivers/pci/bus.c |
815 | +++ b/drivers/pci/bus.c |
816 | @@ -316,10 +316,7 @@ void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *), |
817 | } else |
818 | next = dev->bus_list.next; |
819 | |
820 | - /* Run device routines with the device locked */ |
821 | - device_lock(&dev->dev); |
822 | retval = cb(dev, userdata); |
823 | - device_unlock(&dev->dev); |
824 | if (retval) |
825 | break; |
826 | } |
827 | diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c |
828 | index 0ca0535..1b7d05d 100644 |
829 | --- a/drivers/pci/pcie/aer/aerdrv_core.c |
830 | +++ b/drivers/pci/pcie/aer/aerdrv_core.c |
831 | @@ -244,6 +244,7 @@ static int report_error_detected(struct pci_dev *dev, void *data) |
832 | struct aer_broadcast_data *result_data; |
833 | result_data = (struct aer_broadcast_data *) data; |
834 | |
835 | + device_lock(&dev->dev); |
836 | dev->error_state = result_data->state; |
837 | |
838 | if (!dev->driver || |
839 | @@ -262,12 +263,14 @@ static int report_error_detected(struct pci_dev *dev, void *data) |
840 | dev->driver ? |
841 | "no AER-aware driver" : "no driver"); |
842 | } |
843 | - return 0; |
844 | + goto out; |
845 | } |
846 | |
847 | err_handler = dev->driver->err_handler; |
848 | vote = err_handler->error_detected(dev, result_data->state); |
849 | result_data->result = merge_result(result_data->result, vote); |
850 | +out: |
851 | + device_unlock(&dev->dev); |
852 | return 0; |
853 | } |
854 | |
855 | @@ -278,14 +281,17 @@ static int report_mmio_enabled(struct pci_dev *dev, void *data) |
856 | struct aer_broadcast_data *result_data; |
857 | result_data = (struct aer_broadcast_data *) data; |
858 | |
859 | + device_lock(&dev->dev); |
860 | if (!dev->driver || |
861 | !dev->driver->err_handler || |
862 | !dev->driver->err_handler->mmio_enabled) |
863 | - return 0; |
864 | + goto out; |
865 | |
866 | err_handler = dev->driver->err_handler; |
867 | vote = err_handler->mmio_enabled(dev); |
868 | result_data->result = merge_result(result_data->result, vote); |
869 | +out: |
870 | + device_unlock(&dev->dev); |
871 | return 0; |
872 | } |
873 | |
874 | @@ -296,14 +302,17 @@ static int report_slot_reset(struct pci_dev *dev, void *data) |
875 | struct aer_broadcast_data *result_data; |
876 | result_data = (struct aer_broadcast_data *) data; |
877 | |
878 | + device_lock(&dev->dev); |
879 | if (!dev->driver || |
880 | !dev->driver->err_handler || |
881 | !dev->driver->err_handler->slot_reset) |
882 | - return 0; |
883 | + goto out; |
884 | |
885 | err_handler = dev->driver->err_handler; |
886 | vote = err_handler->slot_reset(dev); |
887 | result_data->result = merge_result(result_data->result, vote); |
888 | +out: |
889 | + device_unlock(&dev->dev); |
890 | return 0; |
891 | } |
892 | |
893 | @@ -311,15 +320,18 @@ static int report_resume(struct pci_dev *dev, void *data) |
894 | { |
895 | struct pci_error_handlers *err_handler; |
896 | |
897 | + device_lock(&dev->dev); |
898 | dev->error_state = pci_channel_io_normal; |
899 | |
900 | if (!dev->driver || |
901 | !dev->driver->err_handler || |
902 | !dev->driver->err_handler->resume) |
903 | - return 0; |
904 | + goto out; |
905 | |
906 | err_handler = dev->driver->err_handler; |
907 | err_handler->resume(dev); |
908 | +out: |
909 | + device_unlock(&dev->dev); |
910 | return 0; |
911 | } |
912 | |
913 | diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c |
914 | index 507a8e2..e49871d 100644 |
915 | --- a/drivers/pnp/pnpacpi/core.c |
916 | +++ b/drivers/pnp/pnpacpi/core.c |
917 | @@ -95,6 +95,9 @@ static int pnpacpi_set_resources(struct pnp_dev *dev) |
918 | return -ENODEV; |
919 | } |
920 | |
921 | + if (WARN_ON_ONCE(acpi_dev != dev->data)) |
922 | + dev->data = acpi_dev; |
923 | + |
924 | ret = pnpacpi_build_resource_template(dev, &buffer); |
925 | if (ret) |
926 | return ret; |
927 | diff --git a/drivers/staging/ipack/bridges/tpci200.c b/drivers/staging/ipack/bridges/tpci200.c |
928 | index 2b83fa8..a7fb2cf 100644 |
929 | --- a/drivers/staging/ipack/bridges/tpci200.c |
930 | +++ b/drivers/staging/ipack/bridges/tpci200.c |
931 | @@ -604,8 +604,8 @@ static int tpci200_slot_unregister(struct ipack_device *dev) |
932 | if (mutex_lock_interruptible(&tpci200->mutex)) |
933 | return -ERESTARTSYS; |
934 | |
935 | - ipack_device_unregister(dev); |
936 | tpci200->slots[dev->slot].dev = NULL; |
937 | + ipack_device_unregister(dev); |
938 | mutex_unlock(&tpci200->mutex); |
939 | |
940 | return 0; |
941 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
942 | index 84f7dff..89c752a 100644 |
943 | --- a/drivers/usb/class/cdc-acm.c |
944 | +++ b/drivers/usb/class/cdc-acm.c |
945 | @@ -788,6 +788,10 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) |
946 | tmp.flags = ASYNC_LOW_LATENCY; |
947 | tmp.xmit_fifo_size = acm->writesize; |
948 | tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); |
949 | + tmp.close_delay = acm->port.close_delay / 10; |
950 | + tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
951 | + ASYNC_CLOSING_WAIT_NONE : |
952 | + acm->port.closing_wait / 10; |
953 | |
954 | if (copy_to_user(info, &tmp, sizeof(tmp))) |
955 | return -EFAULT; |
956 | @@ -795,6 +799,37 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) |
957 | return 0; |
958 | } |
959 | |
960 | +static int set_serial_info(struct acm *acm, |
961 | + struct serial_struct __user *newinfo) |
962 | +{ |
963 | + struct serial_struct new_serial; |
964 | + unsigned int closing_wait, close_delay; |
965 | + int retval = 0; |
966 | + |
967 | + if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) |
968 | + return -EFAULT; |
969 | + |
970 | + close_delay = new_serial.close_delay * 10; |
971 | + closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
972 | + ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; |
973 | + |
974 | + mutex_lock(&acm->port.mutex); |
975 | + |
976 | + if (!capable(CAP_SYS_ADMIN)) { |
977 | + if ((close_delay != acm->port.close_delay) || |
978 | + (closing_wait != acm->port.closing_wait)) |
979 | + retval = -EPERM; |
980 | + else |
981 | + retval = -EOPNOTSUPP; |
982 | + } else { |
983 | + acm->port.close_delay = close_delay; |
984 | + acm->port.closing_wait = closing_wait; |
985 | + } |
986 | + |
987 | + mutex_unlock(&acm->port.mutex); |
988 | + return retval; |
989 | +} |
990 | + |
991 | static int acm_tty_ioctl(struct tty_struct *tty, |
992 | unsigned int cmd, unsigned long arg) |
993 | { |
994 | @@ -805,6 +840,9 @@ static int acm_tty_ioctl(struct tty_struct *tty, |
995 | case TIOCGSERIAL: /* gets serial port data */ |
996 | rv = get_serial_info(acm, (struct serial_struct __user *) arg); |
997 | break; |
998 | + case TIOCSSERIAL: |
999 | + rv = set_serial_info(acm, (struct serial_struct __user *) arg); |
1000 | + break; |
1001 | } |
1002 | |
1003 | return rv; |
1004 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c |
1005 | index 4b66374..3d98902 100644 |
1006 | --- a/drivers/usb/host/ehci-q.c |
1007 | +++ b/drivers/usb/host/ehci-q.c |
1008 | @@ -264,15 +264,9 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) |
1009 | __releases(ehci->lock) |
1010 | __acquires(ehci->lock) |
1011 | { |
1012 | - if (likely (urb->hcpriv != NULL)) { |
1013 | - struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; |
1014 | - |
1015 | - /* S-mask in a QH means it's an interrupt urb */ |
1016 | - if ((qh->hw->hw_info2 & cpu_to_hc32(ehci, QH_SMASK)) != 0) { |
1017 | - |
1018 | - /* ... update hc-wide periodic stats (for usbfs) */ |
1019 | - ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; |
1020 | - } |
1021 | + if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) { |
1022 | + /* ... update hc-wide periodic stats */ |
1023 | + ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; |
1024 | } |
1025 | |
1026 | if (unlikely(urb->unlinked)) { |
1027 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
1028 | index 7cf3da7..528a540 100644 |
1029 | --- a/drivers/usb/host/ehci-sched.c |
1030 | +++ b/drivers/usb/host/ehci-sched.c |
1031 | @@ -1646,7 +1646,7 @@ static void itd_link_urb( |
1032 | |
1033 | /* don't need that schedule data any more */ |
1034 | iso_sched_free (stream, iso_sched); |
1035 | - urb->hcpriv = NULL; |
1036 | + urb->hcpriv = stream; |
1037 | |
1038 | ++ehci->isoc_count; |
1039 | enable_periodic(ehci); |
1040 | @@ -2045,7 +2045,7 @@ static void sitd_link_urb( |
1041 | |
1042 | /* don't need that schedule data any more */ |
1043 | iso_sched_free (stream, sched); |
1044 | - urb->hcpriv = NULL; |
1045 | + urb->hcpriv = stream; |
1046 | |
1047 | ++ehci->isoc_count; |
1048 | enable_periodic(ehci); |
1049 | diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c |
1050 | index c5a1ea9..9d00d47 100644 |
1051 | --- a/drivers/usb/host/ohci-q.c |
1052 | +++ b/drivers/usb/host/ohci-q.c |
1053 | @@ -1128,6 +1128,25 @@ dl_done_list (struct ohci_hcd *ohci) |
1054 | |
1055 | while (td) { |
1056 | struct td *td_next = td->next_dl_td; |
1057 | + struct ed *ed = td->ed; |
1058 | + |
1059 | + /* |
1060 | + * Some OHCI controllers (NVIDIA for sure, maybe others) |
1061 | + * occasionally forget to add TDs to the done queue. Since |
1062 | + * TDs for a given endpoint are always processed in order, |
1063 | + * if we find a TD on the donelist then all of its |
1064 | + * predecessors must be finished as well. |
1065 | + */ |
1066 | + for (;;) { |
1067 | + struct td *td2; |
1068 | + |
1069 | + td2 = list_first_entry(&ed->td_list, struct td, |
1070 | + td_list); |
1071 | + if (td2 == td) |
1072 | + break; |
1073 | + takeback_td(ohci, td2); |
1074 | + } |
1075 | + |
1076 | takeback_td(ohci, td); |
1077 | td = td_next; |
1078 | } |
1079 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1080 | index 8345d7c..dcb72f7 100644 |
1081 | --- a/drivers/usb/host/xhci-pci.c |
1082 | +++ b/drivers/usb/host/xhci-pci.c |
1083 | @@ -29,6 +29,7 @@ |
1084 | /* Device for a quirk */ |
1085 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
1086 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
1087 | +#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 0x1400 |
1088 | |
1089 | #define PCI_VENDOR_ID_ETRON 0x1b6f |
1090 | #define PCI_DEVICE_ID_ASROCK_P67 0x7023 |
1091 | @@ -58,8 +59,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
1092 | |
1093 | /* Look for vendor-specific quirks */ |
1094 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
1095 | - pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { |
1096 | - if (pdev->revision == 0x0) { |
1097 | + (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK || |
1098 | + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) { |
1099 | + if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && |
1100 | + pdev->revision == 0x0) { |
1101 | xhci->quirks |= XHCI_RESET_EP_QUIRK; |
1102 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
1103 | " endpoint cmd after reset endpoint\n"); |
1104 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
1105 | index 4ea9e33..5ad932d 100644 |
1106 | --- a/drivers/usb/serial/cp210x.c |
1107 | +++ b/drivers/usb/serial/cp210x.c |
1108 | @@ -120,6 +120,7 @@ static const struct usb_device_id id_table[] = { |
1109 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
1110 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ |
1111 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ |
1112 | + { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
1113 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
1114 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
1115 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
1116 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1117 | index b71ee32..360bdeb 100644 |
1118 | --- a/drivers/usb/serial/ftdi_sio.c |
1119 | +++ b/drivers/usb/serial/ftdi_sio.c |
1120 | @@ -197,6 +197,7 @@ static struct usb_device_id id_table_combined [] = { |
1121 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
1122 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
1123 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, |
1124 | + { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, |
1125 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
1126 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
1127 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
1128 | @@ -1787,7 +1788,7 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) |
1129 | struct usb_device *udev = serial->dev; |
1130 | |
1131 | if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || |
1132 | - (udev->product && !strcmp(udev->product, "BeagleBone/XDS100"))) |
1133 | + (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2"))) |
1134 | return ftdi_jtag_probe(serial); |
1135 | |
1136 | return 0; |
1137 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1138 | index 57c12ef..049b6e7 100644 |
1139 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1140 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1141 | @@ -752,6 +752,12 @@ |
1142 | #define TTI_VID 0x103E /* Vendor Id */ |
1143 | #define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ |
1144 | |
1145 | +/* |
1146 | + * Newport Cooperation (www.newport.com) |
1147 | + */ |
1148 | +#define NEWPORT_VID 0x104D |
1149 | +#define NEWPORT_AGILIS_PID 0x3000 |
1150 | + |
1151 | /* Interbiometrics USB I/O Board */ |
1152 | /* Developed for Interbiometrics by Rudolf Gugler */ |
1153 | #define INTERBIOMETRICS_VID 0x1209 |
1154 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1155 | index f852329..56fed62 100644 |
1156 | --- a/drivers/usb/serial/option.c |
1157 | +++ b/drivers/usb/serial/option.c |
1158 | @@ -81,6 +81,7 @@ static void option_instat_callback(struct urb *urb); |
1159 | #define OPTION_PRODUCT_GTM380_MODEM 0x7201 |
1160 | |
1161 | #define HUAWEI_VENDOR_ID 0x12D1 |
1162 | +#define HUAWEI_PRODUCT_E173 0x140C |
1163 | #define HUAWEI_PRODUCT_K4505 0x1464 |
1164 | #define HUAWEI_PRODUCT_K3765 0x1465 |
1165 | #define HUAWEI_PRODUCT_K4605 0x14C6 |
1166 | @@ -553,6 +554,8 @@ static const struct usb_device_id option_ids[] = { |
1167 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, |
1168 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) }, |
1169 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) }, |
1170 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), |
1171 | + .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
1172 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), |
1173 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
1174 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), |
1175 | @@ -884,6 +887,10 @@ static const struct usb_device_id option_ids[] = { |
1176 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), |
1177 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
1178 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, |
1179 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0135, 0xff, 0xff, 0xff) }, |
1180 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0136, 0xff, 0xff, 0xff) }, |
1181 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0137, 0xff, 0xff, 0xff) }, |
1182 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0139, 0xff, 0xff, 0xff) }, |
1183 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, |
1184 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
1185 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, |
1186 | @@ -904,20 +911,34 @@ static const struct usb_device_id option_ids[] = { |
1187 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
1188 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
1189 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1190 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0189, 0xff, 0xff, 0xff) }, |
1191 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ |
1192 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1193 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0196, 0xff, 0xff, 0xff) }, |
1194 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0197, 0xff, 0xff, 0xff) }, |
1195 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ |
1196 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
1197 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0200, 0xff, 0xff, 0xff) }, |
1198 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0201, 0xff, 0xff, 0xff) }, |
1199 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0254, 0xff, 0xff, 0xff) }, |
1200 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ |
1201 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
1202 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) }, |
1203 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) }, |
1204 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) }, |
1205 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), |
1206 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1207 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) }, |
1208 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) }, |
1209 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, |
1210 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, |
1211 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
1212 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1213 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
1214 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1215 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), |
1216 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1217 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff) }, |
1218 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), |
1219 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
1220 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
1221 | @@ -1097,6 +1118,10 @@ static const struct usb_device_id option_ids[] = { |
1222 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
1223 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
1224 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
1225 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1301, 0xff, 0xff, 0xff) }, |
1226 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1302, 0xff, 0xff, 0xff) }, |
1227 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1303, 0xff, 0xff, 0xff) }, |
1228 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1333, 0xff, 0xff, 0xff) }, |
1229 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), |
1230 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
1231 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), |
1232 | diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig |
1233 | index 7691c86..685edc8 100644 |
1234 | --- a/drivers/usb/storage/Kconfig |
1235 | +++ b/drivers/usb/storage/Kconfig |
1236 | @@ -203,7 +203,7 @@ config USB_STORAGE_ENE_UB6250 |
1237 | |
1238 | config USB_UAS |
1239 | tristate "USB Attached SCSI" |
1240 | - depends on USB && SCSI |
1241 | + depends on USB && SCSI && BROKEN |
1242 | help |
1243 | The USB Attached SCSI protocol is supported by some USB |
1244 | storage devices. It permits higher performance by supporting |
1245 | diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h |
1246 | index df08254..5f6c835 100644 |
1247 | --- a/include/linux/mempolicy.h |
1248 | +++ b/include/linux/mempolicy.h |
1249 | @@ -137,16 +137,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) |
1250 | __mpol_put(pol); |
1251 | } |
1252 | |
1253 | -extern struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, |
1254 | - struct mempolicy *frompol); |
1255 | -static inline struct mempolicy *mpol_cond_copy(struct mempolicy *tompol, |
1256 | - struct mempolicy *frompol) |
1257 | -{ |
1258 | - if (!frompol) |
1259 | - return frompol; |
1260 | - return __mpol_cond_copy(tompol, frompol); |
1261 | -} |
1262 | - |
1263 | extern struct mempolicy *__mpol_dup(struct mempolicy *pol); |
1264 | static inline struct mempolicy *mpol_dup(struct mempolicy *pol) |
1265 | { |
1266 | @@ -270,12 +260,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) |
1267 | { |
1268 | } |
1269 | |
1270 | -static inline struct mempolicy *mpol_cond_copy(struct mempolicy *to, |
1271 | - struct mempolicy *from) |
1272 | -{ |
1273 | - return from; |
1274 | -} |
1275 | - |
1276 | static inline void mpol_get(struct mempolicy *pol) |
1277 | { |
1278 | } |
1279 | diff --git a/kernel/rcutree.c b/kernel/rcutree.c |
1280 | index f7bcd9e..c283938 100644 |
1281 | --- a/kernel/rcutree.c |
1282 | +++ b/kernel/rcutree.c |
1283 | @@ -212,13 +212,13 @@ DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = { |
1284 | .dynticks = ATOMIC_INIT(1), |
1285 | }; |
1286 | |
1287 | -static int blimit = 10; /* Maximum callbacks per rcu_do_batch. */ |
1288 | -static int qhimark = 10000; /* If this many pending, ignore blimit. */ |
1289 | -static int qlowmark = 100; /* Once only this many pending, use blimit. */ |
1290 | +static long blimit = 10; /* Maximum callbacks per rcu_do_batch. */ |
1291 | +static long qhimark = 10000; /* If this many pending, ignore blimit. */ |
1292 | +static long qlowmark = 100; /* Once only this many pending, use blimit. */ |
1293 | |
1294 | -module_param(blimit, int, 0); |
1295 | -module_param(qhimark, int, 0); |
1296 | -module_param(qlowmark, int, 0); |
1297 | +module_param(blimit, long, 0); |
1298 | +module_param(qhimark, long, 0); |
1299 | +module_param(qlowmark, long, 0); |
1300 | |
1301 | int rcu_cpu_stall_suppress __read_mostly; /* 1 = suppress stall warnings. */ |
1302 | int rcu_cpu_stall_timeout __read_mostly = CONFIG_RCU_CPU_STALL_TIMEOUT; |
1303 | @@ -1543,7 +1543,8 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) |
1304 | { |
1305 | unsigned long flags; |
1306 | struct rcu_head *next, *list, **tail; |
1307 | - int bl, count, count_lazy, i; |
1308 | + long bl, count, count_lazy; |
1309 | + int i; |
1310 | |
1311 | /* If no callbacks are ready, just return.*/ |
1312 | if (!cpu_has_callbacks_ready_to_invoke(rdp)) { |
1313 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
1314 | index b4f20fb..781ecc2 100644 |
1315 | --- a/kernel/trace/ftrace.c |
1316 | +++ b/kernel/trace/ftrace.c |
1317 | @@ -2358,7 +2358,7 @@ static void reset_iter_read(struct ftrace_iterator *iter) |
1318 | { |
1319 | iter->pos = 0; |
1320 | iter->func_pos = 0; |
1321 | - iter->flags &= ~(FTRACE_ITER_PRINTALL & FTRACE_ITER_HASH); |
1322 | + iter->flags &= ~(FTRACE_ITER_PRINTALL | FTRACE_ITER_HASH); |
1323 | } |
1324 | |
1325 | static void *t_start(struct seq_file *m, loff_t *pos) |
1326 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
1327 | index ebd284f..89fdeee 100644 |
1328 | --- a/kernel/trace/ring_buffer.c |
1329 | +++ b/kernel/trace/ring_buffer.c |
1330 | @@ -1396,6 +1396,8 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer) |
1331 | struct list_head *head_page_with_bit; |
1332 | |
1333 | head_page = &rb_set_head_page(cpu_buffer)->list; |
1334 | + if (!head_page) |
1335 | + break; |
1336 | prev_page = head_page->prev; |
1337 | |
1338 | first_page = pages->next; |
1339 | @@ -2934,7 +2936,7 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) |
1340 | unsigned long flags; |
1341 | struct ring_buffer_per_cpu *cpu_buffer; |
1342 | struct buffer_page *bpage; |
1343 | - unsigned long ret; |
1344 | + unsigned long ret = 0; |
1345 | |
1346 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
1347 | return 0; |
1348 | @@ -2949,7 +2951,8 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) |
1349 | bpage = cpu_buffer->reader_page; |
1350 | else |
1351 | bpage = rb_set_head_page(cpu_buffer); |
1352 | - ret = bpage->page->time_stamp; |
1353 | + if (bpage) |
1354 | + ret = bpage->page->time_stamp; |
1355 | raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |
1356 | |
1357 | return ret; |
1358 | @@ -3260,6 +3263,8 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) |
1359 | * Splice the empty reader page into the list around the head. |
1360 | */ |
1361 | reader = rb_set_head_page(cpu_buffer); |
1362 | + if (!reader) |
1363 | + goto out; |
1364 | cpu_buffer->reader_page->list.next = rb_list_head(reader->list.next); |
1365 | cpu_buffer->reader_page->list.prev = reader->list.prev; |
1366 | |
1367 | @@ -3778,12 +3783,17 @@ void |
1368 | ring_buffer_read_finish(struct ring_buffer_iter *iter) |
1369 | { |
1370 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; |
1371 | + unsigned long flags; |
1372 | |
1373 | /* |
1374 | * Ring buffer is disabled from recording, here's a good place |
1375 | - * to check the integrity of the ring buffer. |
1376 | + * to check the integrity of the ring buffer. |
1377 | + * Must prevent readers from trying to read, as the check |
1378 | + * clears the HEAD page and readers require it. |
1379 | */ |
1380 | + raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); |
1381 | rb_check_pages(cpu_buffer); |
1382 | + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |
1383 | |
1384 | atomic_dec(&cpu_buffer->record_disabled); |
1385 | atomic_dec(&cpu_buffer->buffer->resize_disabled); |
1386 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
1387 | index 6d42247..0352a81 100644 |
1388 | --- a/kernel/workqueue.c |
1389 | +++ b/kernel/workqueue.c |
1390 | @@ -1143,8 +1143,8 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
1391 | if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { |
1392 | unsigned int lcpu; |
1393 | |
1394 | - BUG_ON(timer_pending(timer)); |
1395 | - BUG_ON(!list_empty(&work->entry)); |
1396 | + WARN_ON_ONCE(timer_pending(timer)); |
1397 | + WARN_ON_ONCE(!list_empty(&work->entry)); |
1398 | |
1399 | timer_stats_timer_set_start_info(&dwork->timer); |
1400 | |
1401 | diff --git a/mm/dmapool.c b/mm/dmapool.c |
1402 | index c5ab33b..da1b0f0 100644 |
1403 | --- a/mm/dmapool.c |
1404 | +++ b/mm/dmapool.c |
1405 | @@ -50,7 +50,6 @@ struct dma_pool { /* the pool */ |
1406 | size_t allocation; |
1407 | size_t boundary; |
1408 | char name[32]; |
1409 | - wait_queue_head_t waitq; |
1410 | struct list_head pools; |
1411 | }; |
1412 | |
1413 | @@ -62,8 +61,6 @@ struct dma_page { /* cacheable header for 'allocation' bytes */ |
1414 | unsigned int offset; |
1415 | }; |
1416 | |
1417 | -#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) |
1418 | - |
1419 | static DEFINE_MUTEX(pools_lock); |
1420 | |
1421 | static ssize_t |
1422 | @@ -172,7 +169,6 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev, |
1423 | retval->size = size; |
1424 | retval->boundary = boundary; |
1425 | retval->allocation = allocation; |
1426 | - init_waitqueue_head(&retval->waitq); |
1427 | |
1428 | if (dev) { |
1429 | int ret; |
1430 | @@ -227,7 +223,6 @@ static struct dma_page *pool_alloc_page(struct dma_pool *pool, gfp_t mem_flags) |
1431 | memset(page->vaddr, POOL_POISON_FREED, pool->allocation); |
1432 | #endif |
1433 | pool_initialise_page(pool, page); |
1434 | - list_add(&page->page_list, &pool->page_list); |
1435 | page->in_use = 0; |
1436 | page->offset = 0; |
1437 | } else { |
1438 | @@ -315,30 +310,21 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, |
1439 | might_sleep_if(mem_flags & __GFP_WAIT); |
1440 | |
1441 | spin_lock_irqsave(&pool->lock, flags); |
1442 | - restart: |
1443 | list_for_each_entry(page, &pool->page_list, page_list) { |
1444 | if (page->offset < pool->allocation) |
1445 | goto ready; |
1446 | } |
1447 | - page = pool_alloc_page(pool, GFP_ATOMIC); |
1448 | - if (!page) { |
1449 | - if (mem_flags & __GFP_WAIT) { |
1450 | - DECLARE_WAITQUEUE(wait, current); |
1451 | |
1452 | - __set_current_state(TASK_UNINTERRUPTIBLE); |
1453 | - __add_wait_queue(&pool->waitq, &wait); |
1454 | - spin_unlock_irqrestore(&pool->lock, flags); |
1455 | + /* pool_alloc_page() might sleep, so temporarily drop &pool->lock */ |
1456 | + spin_unlock_irqrestore(&pool->lock, flags); |
1457 | |
1458 | - schedule_timeout(POOL_TIMEOUT_JIFFIES); |
1459 | + page = pool_alloc_page(pool, mem_flags); |
1460 | + if (!page) |
1461 | + return NULL; |
1462 | |
1463 | - spin_lock_irqsave(&pool->lock, flags); |
1464 | - __remove_wait_queue(&pool->waitq, &wait); |
1465 | - goto restart; |
1466 | - } |
1467 | - retval = NULL; |
1468 | - goto done; |
1469 | - } |
1470 | + spin_lock_irqsave(&pool->lock, flags); |
1471 | |
1472 | + list_add(&page->page_list, &pool->page_list); |
1473 | ready: |
1474 | page->in_use++; |
1475 | offset = page->offset; |
1476 | @@ -348,7 +334,6 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, |
1477 | #ifdef DMAPOOL_DEBUG |
1478 | memset(retval, POOL_POISON_ALLOCATED, pool->size); |
1479 | #endif |
1480 | - done: |
1481 | spin_unlock_irqrestore(&pool->lock, flags); |
1482 | return retval; |
1483 | } |
1484 | @@ -435,8 +420,6 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma) |
1485 | page->in_use--; |
1486 | *(int *)vaddr = page->offset; |
1487 | page->offset = offset; |
1488 | - if (waitqueue_active(&pool->waitq)) |
1489 | - wake_up_locked(&pool->waitq); |
1490 | /* |
1491 | * Resist a temptation to do |
1492 | * if (!is_page_busy(page)) pool_free_page(pool, page); |
1493 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
1494 | index 3d64b36..01350d3 100644 |
1495 | --- a/mm/mempolicy.c |
1496 | +++ b/mm/mempolicy.c |
1497 | @@ -2035,28 +2035,6 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) |
1498 | return new; |
1499 | } |
1500 | |
1501 | -/* |
1502 | - * If *frompol needs [has] an extra ref, copy *frompol to *tompol , |
1503 | - * eliminate the * MPOL_F_* flags that require conditional ref and |
1504 | - * [NOTE!!!] drop the extra ref. Not safe to reference *frompol directly |
1505 | - * after return. Use the returned value. |
1506 | - * |
1507 | - * Allows use of a mempolicy for, e.g., multiple allocations with a single |
1508 | - * policy lookup, even if the policy needs/has extra ref on lookup. |
1509 | - * shmem_readahead needs this. |
1510 | - */ |
1511 | -struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, |
1512 | - struct mempolicy *frompol) |
1513 | -{ |
1514 | - if (!mpol_needs_cond_ref(frompol)) |
1515 | - return frompol; |
1516 | - |
1517 | - *tompol = *frompol; |
1518 | - tompol->flags &= ~MPOL_F_SHARED; /* copy doesn't need unref */ |
1519 | - __mpol_put(frompol); |
1520 | - return tompol; |
1521 | -} |
1522 | - |
1523 | /* Slow path of a mempolicy comparison */ |
1524 | bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) |
1525 | { |
1526 | diff --git a/mm/shmem.c b/mm/shmem.c |
1527 | index 31e1506..6607fee 100644 |
1528 | --- a/mm/shmem.c |
1529 | +++ b/mm/shmem.c |
1530 | @@ -921,25 +921,29 @@ static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo) |
1531 | static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp, |
1532 | struct shmem_inode_info *info, pgoff_t index) |
1533 | { |
1534 | - struct mempolicy mpol, *spol; |
1535 | struct vm_area_struct pvma; |
1536 | - |
1537 | - spol = mpol_cond_copy(&mpol, |
1538 | - mpol_shared_policy_lookup(&info->policy, index)); |
1539 | + struct page *page; |
1540 | |
1541 | /* Create a pseudo vma that just contains the policy */ |
1542 | pvma.vm_start = 0; |
1543 | /* Bias interleave by inode number to distribute better across nodes */ |
1544 | pvma.vm_pgoff = index + info->vfs_inode.i_ino; |
1545 | pvma.vm_ops = NULL; |
1546 | - pvma.vm_policy = spol; |
1547 | - return swapin_readahead(swap, gfp, &pvma, 0); |
1548 | + pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
1549 | + |
1550 | + page = swapin_readahead(swap, gfp, &pvma, 0); |
1551 | + |
1552 | + /* Drop reference taken by mpol_shared_policy_lookup() */ |
1553 | + mpol_cond_put(pvma.vm_policy); |
1554 | + |
1555 | + return page; |
1556 | } |
1557 | |
1558 | static struct page *shmem_alloc_page(gfp_t gfp, |
1559 | struct shmem_inode_info *info, pgoff_t index) |
1560 | { |
1561 | struct vm_area_struct pvma; |
1562 | + struct page *page; |
1563 | |
1564 | /* Create a pseudo vma that just contains the policy */ |
1565 | pvma.vm_start = 0; |
1566 | @@ -948,10 +952,12 @@ static struct page *shmem_alloc_page(gfp_t gfp, |
1567 | pvma.vm_ops = NULL; |
1568 | pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
1569 | |
1570 | - /* |
1571 | - * alloc_page_vma() will drop the shared policy reference |
1572 | - */ |
1573 | - return alloc_page_vma(gfp, &pvma, 0); |
1574 | + page = alloc_page_vma(gfp, &pvma, 0); |
1575 | + |
1576 | + /* Drop reference taken by mpol_shared_policy_lookup() */ |
1577 | + mpol_cond_put(pvma.vm_policy); |
1578 | + |
1579 | + return page; |
1580 | } |
1581 | #else /* !CONFIG_NUMA */ |
1582 | #ifdef CONFIG_TMPFS |
1583 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c |
1584 | index f2eccd5..17ff9fd 100644 |
1585 | --- a/net/ipv4/icmp.c |
1586 | +++ b/net/ipv4/icmp.c |
1587 | @@ -257,7 +257,8 @@ static inline bool icmpv4_xrlim_allow(struct net *net, struct rtable *rt, |
1588 | struct inet_peer *peer = inet_getpeer_v4(net->ipv4.peers, fl4->daddr, 1); |
1589 | rc = inet_peer_xrlim_allow(peer, |
1590 | net->ipv4.sysctl_icmp_ratelimit); |
1591 | - inet_putpeer(peer); |
1592 | + if (peer) |
1593 | + inet_putpeer(peer); |
1594 | } |
1595 | out: |
1596 | return rc; |
1597 | diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c |
1598 | index 6405a44..9145e3c 100644 |
1599 | --- a/net/ipv4/inet_diag.c |
1600 | +++ b/net/ipv4/inet_diag.c |
1601 | @@ -44,6 +44,10 @@ struct inet_diag_entry { |
1602 | u16 dport; |
1603 | u16 family; |
1604 | u16 userlocks; |
1605 | +#if IS_ENABLED(CONFIG_IPV6) |
1606 | + struct in6_addr saddr_storage; /* for IPv4-mapped-IPv6 addresses */ |
1607 | + struct in6_addr daddr_storage; /* for IPv4-mapped-IPv6 addresses */ |
1608 | +#endif |
1609 | }; |
1610 | |
1611 | static DEFINE_MUTEX(inet_diag_table_mutex); |
1612 | @@ -423,25 +427,31 @@ static int inet_diag_bc_run(const struct nlattr *_bc, |
1613 | break; |
1614 | } |
1615 | |
1616 | - if (cond->prefix_len == 0) |
1617 | - break; |
1618 | - |
1619 | if (op->code == INET_DIAG_BC_S_COND) |
1620 | addr = entry->saddr; |
1621 | else |
1622 | addr = entry->daddr; |
1623 | |
1624 | + if (cond->family != AF_UNSPEC && |
1625 | + cond->family != entry->family) { |
1626 | + if (entry->family == AF_INET6 && |
1627 | + cond->family == AF_INET) { |
1628 | + if (addr[0] == 0 && addr[1] == 0 && |
1629 | + addr[2] == htonl(0xffff) && |
1630 | + bitstring_match(addr + 3, |
1631 | + cond->addr, |
1632 | + cond->prefix_len)) |
1633 | + break; |
1634 | + } |
1635 | + yes = 0; |
1636 | + break; |
1637 | + } |
1638 | + |
1639 | + if (cond->prefix_len == 0) |
1640 | + break; |
1641 | if (bitstring_match(addr, cond->addr, |
1642 | cond->prefix_len)) |
1643 | break; |
1644 | - if (entry->family == AF_INET6 && |
1645 | - cond->family == AF_INET) { |
1646 | - if (addr[0] == 0 && addr[1] == 0 && |
1647 | - addr[2] == htonl(0xffff) && |
1648 | - bitstring_match(addr + 3, cond->addr, |
1649 | - cond->prefix_len)) |
1650 | - break; |
1651 | - } |
1652 | yes = 0; |
1653 | break; |
1654 | } |
1655 | @@ -504,6 +514,55 @@ static int valid_cc(const void *bc, int len, int cc) |
1656 | return 0; |
1657 | } |
1658 | |
1659 | +/* Validate an inet_diag_hostcond. */ |
1660 | +static bool valid_hostcond(const struct inet_diag_bc_op *op, int len, |
1661 | + int *min_len) |
1662 | +{ |
1663 | + int addr_len; |
1664 | + struct inet_diag_hostcond *cond; |
1665 | + |
1666 | + /* Check hostcond space. */ |
1667 | + *min_len += sizeof(struct inet_diag_hostcond); |
1668 | + if (len < *min_len) |
1669 | + return false; |
1670 | + cond = (struct inet_diag_hostcond *)(op + 1); |
1671 | + |
1672 | + /* Check address family and address length. */ |
1673 | + switch (cond->family) { |
1674 | + case AF_UNSPEC: |
1675 | + addr_len = 0; |
1676 | + break; |
1677 | + case AF_INET: |
1678 | + addr_len = sizeof(struct in_addr); |
1679 | + break; |
1680 | + case AF_INET6: |
1681 | + addr_len = sizeof(struct in6_addr); |
1682 | + break; |
1683 | + default: |
1684 | + return false; |
1685 | + } |
1686 | + *min_len += addr_len; |
1687 | + if (len < *min_len) |
1688 | + return false; |
1689 | + |
1690 | + /* Check prefix length (in bits) vs address length (in bytes). */ |
1691 | + if (cond->prefix_len > 8 * addr_len) |
1692 | + return false; |
1693 | + |
1694 | + return true; |
1695 | +} |
1696 | + |
1697 | +/* Validate a port comparison operator. */ |
1698 | +static inline bool valid_port_comparison(const struct inet_diag_bc_op *op, |
1699 | + int len, int *min_len) |
1700 | +{ |
1701 | + /* Port comparisons put the port in a follow-on inet_diag_bc_op. */ |
1702 | + *min_len += sizeof(struct inet_diag_bc_op); |
1703 | + if (len < *min_len) |
1704 | + return false; |
1705 | + return true; |
1706 | +} |
1707 | + |
1708 | static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
1709 | { |
1710 | const void *bc = bytecode; |
1711 | @@ -511,29 +570,39 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
1712 | |
1713 | while (len > 0) { |
1714 | const struct inet_diag_bc_op *op = bc; |
1715 | + int min_len = sizeof(struct inet_diag_bc_op); |
1716 | |
1717 | //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len); |
1718 | switch (op->code) { |
1719 | - case INET_DIAG_BC_AUTO: |
1720 | case INET_DIAG_BC_S_COND: |
1721 | case INET_DIAG_BC_D_COND: |
1722 | + if (!valid_hostcond(bc, len, &min_len)) |
1723 | + return -EINVAL; |
1724 | + break; |
1725 | case INET_DIAG_BC_S_GE: |
1726 | case INET_DIAG_BC_S_LE: |
1727 | case INET_DIAG_BC_D_GE: |
1728 | case INET_DIAG_BC_D_LE: |
1729 | - case INET_DIAG_BC_JMP: |
1730 | - if (op->no < 4 || op->no > len + 4 || op->no & 3) |
1731 | - return -EINVAL; |
1732 | - if (op->no < len && |
1733 | - !valid_cc(bytecode, bytecode_len, len - op->no)) |
1734 | + if (!valid_port_comparison(bc, len, &min_len)) |
1735 | return -EINVAL; |
1736 | break; |
1737 | + case INET_DIAG_BC_AUTO: |
1738 | + case INET_DIAG_BC_JMP: |
1739 | case INET_DIAG_BC_NOP: |
1740 | break; |
1741 | default: |
1742 | return -EINVAL; |
1743 | } |
1744 | - if (op->yes < 4 || op->yes > len + 4 || op->yes & 3) |
1745 | + |
1746 | + if (op->code != INET_DIAG_BC_NOP) { |
1747 | + if (op->no < min_len || op->no > len + 4 || op->no & 3) |
1748 | + return -EINVAL; |
1749 | + if (op->no < len && |
1750 | + !valid_cc(bytecode, bytecode_len, len - op->no)) |
1751 | + return -EINVAL; |
1752 | + } |
1753 | + |
1754 | + if (op->yes < min_len || op->yes > len + 4 || op->yes & 3) |
1755 | return -EINVAL; |
1756 | bc += op->yes; |
1757 | len -= op->yes; |
1758 | @@ -590,6 +659,36 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw, |
1759 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); |
1760 | } |
1761 | |
1762 | +/* Get the IPv4, IPv6, or IPv4-mapped-IPv6 local and remote addresses |
1763 | + * from a request_sock. For IPv4-mapped-IPv6 we must map IPv4 to IPv6. |
1764 | + */ |
1765 | +static inline void inet_diag_req_addrs(const struct sock *sk, |
1766 | + const struct request_sock *req, |
1767 | + struct inet_diag_entry *entry) |
1768 | +{ |
1769 | + struct inet_request_sock *ireq = inet_rsk(req); |
1770 | + |
1771 | +#if IS_ENABLED(CONFIG_IPV6) |
1772 | + if (sk->sk_family == AF_INET6) { |
1773 | + if (req->rsk_ops->family == AF_INET6) { |
1774 | + entry->saddr = inet6_rsk(req)->loc_addr.s6_addr32; |
1775 | + entry->daddr = inet6_rsk(req)->rmt_addr.s6_addr32; |
1776 | + } else if (req->rsk_ops->family == AF_INET) { |
1777 | + ipv6_addr_set_v4mapped(ireq->loc_addr, |
1778 | + &entry->saddr_storage); |
1779 | + ipv6_addr_set_v4mapped(ireq->rmt_addr, |
1780 | + &entry->daddr_storage); |
1781 | + entry->saddr = entry->saddr_storage.s6_addr32; |
1782 | + entry->daddr = entry->daddr_storage.s6_addr32; |
1783 | + } |
1784 | + } else |
1785 | +#endif |
1786 | + { |
1787 | + entry->saddr = &ireq->loc_addr; |
1788 | + entry->daddr = &ireq->rmt_addr; |
1789 | + } |
1790 | +} |
1791 | + |
1792 | static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, |
1793 | struct request_sock *req, u32 pid, u32 seq, |
1794 | const struct nlmsghdr *unlh) |
1795 | @@ -629,8 +728,10 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, |
1796 | r->idiag_inode = 0; |
1797 | #if IS_ENABLED(CONFIG_IPV6) |
1798 | if (r->idiag_family == AF_INET6) { |
1799 | - *(struct in6_addr *)r->id.idiag_src = inet6_rsk(req)->loc_addr; |
1800 | - *(struct in6_addr *)r->id.idiag_dst = inet6_rsk(req)->rmt_addr; |
1801 | + struct inet_diag_entry entry; |
1802 | + inet_diag_req_addrs(sk, req, &entry); |
1803 | + memcpy(r->id.idiag_src, entry.saddr, sizeof(struct in6_addr)); |
1804 | + memcpy(r->id.idiag_dst, entry.daddr, sizeof(struct in6_addr)); |
1805 | } |
1806 | #endif |
1807 | |
1808 | @@ -683,18 +784,7 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk, |
1809 | continue; |
1810 | |
1811 | if (bc) { |
1812 | - entry.saddr = |
1813 | -#if IS_ENABLED(CONFIG_IPV6) |
1814 | - (entry.family == AF_INET6) ? |
1815 | - inet6_rsk(req)->loc_addr.s6_addr32 : |
1816 | -#endif |
1817 | - &ireq->loc_addr; |
1818 | - entry.daddr = |
1819 | -#if IS_ENABLED(CONFIG_IPV6) |
1820 | - (entry.family == AF_INET6) ? |
1821 | - inet6_rsk(req)->rmt_addr.s6_addr32 : |
1822 | -#endif |
1823 | - &ireq->rmt_addr; |
1824 | + inet_diag_req_addrs(sk, req, &entry); |
1825 | entry.dport = ntohs(ireq->rmt_port); |
1826 | |
1827 | if (!inet_diag_bc_run(bc, &entry)) |
1828 | diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c |
1829 | index 8d07c97..cea1859 100644 |
1830 | --- a/net/ipv4/ip_fragment.c |
1831 | +++ b/net/ipv4/ip_fragment.c |
1832 | @@ -702,28 +702,27 @@ EXPORT_SYMBOL(ip_defrag); |
1833 | |
1834 | struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user) |
1835 | { |
1836 | - const struct iphdr *iph; |
1837 | + struct iphdr iph; |
1838 | u32 len; |
1839 | |
1840 | if (skb->protocol != htons(ETH_P_IP)) |
1841 | return skb; |
1842 | |
1843 | - if (!pskb_may_pull(skb, sizeof(struct iphdr))) |
1844 | + if (!skb_copy_bits(skb, 0, &iph, sizeof(iph))) |
1845 | return skb; |
1846 | |
1847 | - iph = ip_hdr(skb); |
1848 | - if (iph->ihl < 5 || iph->version != 4) |
1849 | + if (iph.ihl < 5 || iph.version != 4) |
1850 | return skb; |
1851 | - if (!pskb_may_pull(skb, iph->ihl*4)) |
1852 | - return skb; |
1853 | - iph = ip_hdr(skb); |
1854 | - len = ntohs(iph->tot_len); |
1855 | - if (skb->len < len || len < (iph->ihl * 4)) |
1856 | + |
1857 | + len = ntohs(iph.tot_len); |
1858 | + if (skb->len < len || len < (iph.ihl * 4)) |
1859 | return skb; |
1860 | |
1861 | - if (ip_is_fragment(ip_hdr(skb))) { |
1862 | + if (ip_is_fragment(&iph)) { |
1863 | skb = skb_share_check(skb, GFP_ATOMIC); |
1864 | if (skb) { |
1865 | + if (!pskb_may_pull(skb, iph.ihl*4)) |
1866 | + return skb; |
1867 | if (pskb_trim_rcsum(skb, len)) |
1868 | return skb; |
1869 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
1870 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
1871 | index c017cb1..285a18f 100644 |
1872 | --- a/net/ipv4/route.c |
1873 | +++ b/net/ipv4/route.c |
1874 | @@ -1785,6 +1785,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res, |
1875 | if (dev_out->flags & IFF_LOOPBACK) |
1876 | flags |= RTCF_LOCAL; |
1877 | |
1878 | + do_cache = true; |
1879 | if (type == RTN_BROADCAST) { |
1880 | flags |= RTCF_BROADCAST | RTCF_LOCAL; |
1881 | fi = NULL; |
1882 | @@ -1793,6 +1794,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res, |
1883 | if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr, |
1884 | fl4->flowi4_proto)) |
1885 | flags &= ~RTCF_LOCAL; |
1886 | + else |
1887 | + do_cache = false; |
1888 | /* If multicast route do not exist use |
1889 | * default one, but do not gateway in this case. |
1890 | * Yes, it is hack. |
1891 | @@ -1802,8 +1805,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res, |
1892 | } |
1893 | |
1894 | fnhe = NULL; |
1895 | - do_cache = fi != NULL; |
1896 | - if (fi) { |
1897 | + do_cache &= fi != NULL; |
1898 | + if (do_cache) { |
1899 | struct rtable __rcu **prth; |
1900 | struct fib_nh *nh = &FIB_RES_NH(*res); |
1901 | |
1902 | diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c |
1903 | index c4f9341..3064785 100644 |
1904 | --- a/net/ipv6/inet6_connection_sock.c |
1905 | +++ b/net/ipv6/inet6_connection_sock.c |
1906 | @@ -252,6 +252,7 @@ struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu) |
1907 | return NULL; |
1908 | dst->ops->update_pmtu(dst, sk, NULL, mtu); |
1909 | |
1910 | - return inet6_csk_route_socket(sk, &fl6); |
1911 | + dst = inet6_csk_route_socket(sk, &fl6); |
1912 | + return IS_ERR(dst) ? NULL : dst; |
1913 | } |
1914 | EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu); |
1915 | diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c |
1916 | index 6c85564..0018b65 100644 |
1917 | --- a/net/sctp/chunk.c |
1918 | +++ b/net/sctp/chunk.c |
1919 | @@ -183,7 +183,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
1920 | |
1921 | msg = sctp_datamsg_new(GFP_KERNEL); |
1922 | if (!msg) |
1923 | - return NULL; |
1924 | + return ERR_PTR(-ENOMEM); |
1925 | |
1926 | /* Note: Calculate this outside of the loop, so that all fragments |
1927 | * have the same expiration. |
1928 | @@ -280,11 +280,14 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
1929 | |
1930 | chunk = sctp_make_datafrag_empty(asoc, sinfo, len, frag, 0); |
1931 | |
1932 | - if (!chunk) |
1933 | + if (!chunk) { |
1934 | + err = -ENOMEM; |
1935 | goto errout; |
1936 | + } |
1937 | + |
1938 | err = sctp_user_addto_chunk(chunk, offset, len, msgh->msg_iov); |
1939 | if (err < 0) |
1940 | - goto errout; |
1941 | + goto errout_chunk_free; |
1942 | |
1943 | offset += len; |
1944 | |
1945 | @@ -315,8 +318,10 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
1946 | |
1947 | chunk = sctp_make_datafrag_empty(asoc, sinfo, over, frag, 0); |
1948 | |
1949 | - if (!chunk) |
1950 | + if (!chunk) { |
1951 | + err = -ENOMEM; |
1952 | goto errout; |
1953 | + } |
1954 | |
1955 | err = sctp_user_addto_chunk(chunk, offset, over,msgh->msg_iov); |
1956 | |
1957 | @@ -324,7 +329,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
1958 | __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr |
1959 | - (__u8 *)chunk->skb->data); |
1960 | if (err < 0) |
1961 | - goto errout; |
1962 | + goto errout_chunk_free; |
1963 | |
1964 | sctp_datamsg_assign(msg, chunk); |
1965 | list_add_tail(&chunk->frag_list, &msg->chunks); |
1966 | @@ -332,6 +337,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
1967 | |
1968 | return msg; |
1969 | |
1970 | +errout_chunk_free: |
1971 | + sctp_chunk_free(chunk); |
1972 | + |
1973 | errout: |
1974 | list_for_each_safe(pos, temp, &msg->chunks) { |
1975 | list_del_init(pos); |
1976 | @@ -339,7 +347,7 @@ errout: |
1977 | sctp_chunk_free(chunk); |
1978 | } |
1979 | sctp_datamsg_put(msg); |
1980 | - return NULL; |
1981 | + return ERR_PTR(err); |
1982 | } |
1983 | |
1984 | /* Check whether this message has expired. */ |
1985 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
1986 | index 5e25981..cb54123 100644 |
1987 | --- a/net/sctp/socket.c |
1988 | +++ b/net/sctp/socket.c |
1989 | @@ -1908,8 +1908,8 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, |
1990 | |
1991 | /* Break the message into multiple chunks of maximum size. */ |
1992 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); |
1993 | - if (!datamsg) { |
1994 | - err = -ENOMEM; |
1995 | + if (IS_ERR(datamsg)) { |
1996 | + err = PTR_ERR(datamsg); |
1997 | goto out_free; |
1998 | } |
1999 | |
2000 | diff --git a/sound/soc/Makefile b/sound/soc/Makefile |
2001 | index 00a555a..824f66f 100644 |
2002 | --- a/sound/soc/Makefile |
2003 | +++ b/sound/soc/Makefile |
2004 | @@ -1,8 +1,9 @@ |
2005 | snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o |
2006 | snd-soc-core-objs += soc-pcm.o soc-io.o |
2007 | |
2008 | -snd-soc-dmaengine-pcm-objs := soc-dmaengine-pcm.o |
2009 | -obj-$(CONFIG_SND_SOC_DMAENGINE_PCM) += snd-soc-dmaengine-pcm.o |
2010 | +ifneq ($(CONFIG_SND_SOC_DMAENGINE_PCM),) |
2011 | +snd-soc-core-objs += soc-dmaengine-pcm.o |
2012 | +endif |
2013 | |
2014 | obj-$(CONFIG_SND_SOC) += snd-soc-core.o |
2015 | obj-$(CONFIG_SND_SOC) += codecs/ |
2016 | diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c |
2017 | index 1d592f5..b5e39ec 100644 |
2018 | --- a/tools/perf/builtin-test.c |
2019 | +++ b/tools/perf/builtin-test.c |
2020 | @@ -602,19 +602,13 @@ out_free_threads: |
2021 | #undef nsyscalls |
2022 | } |
2023 | |
2024 | -static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t **maskp, |
2025 | - size_t *sizep) |
2026 | +static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp) |
2027 | { |
2028 | - cpu_set_t *mask; |
2029 | - size_t size; |
2030 | int i, cpu = -1, nrcpus = 1024; |
2031 | realloc: |
2032 | - mask = CPU_ALLOC(nrcpus); |
2033 | - size = CPU_ALLOC_SIZE(nrcpus); |
2034 | - CPU_ZERO_S(size, mask); |
2035 | + CPU_ZERO(maskp); |
2036 | |
2037 | - if (sched_getaffinity(pid, size, mask) == -1) { |
2038 | - CPU_FREE(mask); |
2039 | + if (sched_getaffinity(pid, sizeof(*maskp), maskp) == -1) { |
2040 | if (errno == EINVAL && nrcpus < (1024 << 8)) { |
2041 | nrcpus = nrcpus << 2; |
2042 | goto realloc; |
2043 | @@ -624,19 +618,14 @@ realloc: |
2044 | } |
2045 | |
2046 | for (i = 0; i < nrcpus; i++) { |
2047 | - if (CPU_ISSET_S(i, size, mask)) { |
2048 | - if (cpu == -1) { |
2049 | + if (CPU_ISSET(i, maskp)) { |
2050 | + if (cpu == -1) |
2051 | cpu = i; |
2052 | - *maskp = mask; |
2053 | - *sizep = size; |
2054 | - } else |
2055 | - CPU_CLR_S(i, size, mask); |
2056 | + else |
2057 | + CPU_CLR(i, maskp); |
2058 | } |
2059 | } |
2060 | |
2061 | - if (cpu == -1) |
2062 | - CPU_FREE(mask); |
2063 | - |
2064 | return cpu; |
2065 | } |
2066 | |
2067 | @@ -651,8 +640,8 @@ static int test__PERF_RECORD(void) |
2068 | .freq = 10, |
2069 | .mmap_pages = 256, |
2070 | }; |
2071 | - cpu_set_t *cpu_mask = NULL; |
2072 | - size_t cpu_mask_size = 0; |
2073 | + cpu_set_t cpu_mask; |
2074 | + size_t cpu_mask_size = sizeof(cpu_mask); |
2075 | struct perf_evlist *evlist = perf_evlist__new(NULL, NULL); |
2076 | struct perf_evsel *evsel; |
2077 | struct perf_sample sample; |
2078 | @@ -716,8 +705,7 @@ static int test__PERF_RECORD(void) |
2079 | evsel->attr.sample_type |= PERF_SAMPLE_TIME; |
2080 | perf_evlist__config_attrs(evlist, &opts); |
2081 | |
2082 | - err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask, |
2083 | - &cpu_mask_size); |
2084 | + err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); |
2085 | if (err < 0) { |
2086 | pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); |
2087 | goto out_delete_evlist; |
2088 | @@ -728,9 +716,9 @@ static int test__PERF_RECORD(void) |
2089 | /* |
2090 | * So that we can check perf_sample.cpu on all the samples. |
2091 | */ |
2092 | - if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, cpu_mask) < 0) { |
2093 | + if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { |
2094 | pr_debug("sched_setaffinity: %s\n", strerror(errno)); |
2095 | - goto out_free_cpu_mask; |
2096 | + goto out_delete_evlist; |
2097 | } |
2098 | |
2099 | /* |
2100 | @@ -914,8 +902,6 @@ found_exit: |
2101 | } |
2102 | out_err: |
2103 | perf_evlist__munmap(evlist); |
2104 | -out_free_cpu_mask: |
2105 | - CPU_FREE(cpu_mask); |
2106 | out_delete_evlist: |
2107 | perf_evlist__delete(evlist); |
2108 | out: |