Annotation of /trunk/kernel-magellan/patches-3.6/0110-3.6.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2015 -
(hide 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 | niro | 2015 | 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: |