Contents of /trunk/kernel-lts/patches-3.4/0127-3.4.28-all-fixes.patch
Parent Directory | Revision Log
Revision 2047 -
(show annotations)
(download)
Mon Jan 28 08:16:44 2013 UTC (11 years, 9 months ago) by niro
File size: 28817 byte(s)
Mon Jan 28 08:16:44 2013 UTC (11 years, 9 months ago) by niro
File size: 28817 byte(s)
-linux-3.4.28
1 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c |
2 | index f3decb3..6cba428 100644 |
3 | --- a/drivers/acpi/processor_idle.c |
4 | +++ b/drivers/acpi/processor_idle.c |
5 | @@ -1018,6 +1018,9 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr) |
6 | return -EINVAL; |
7 | } |
8 | |
9 | + if (!dev) |
10 | + return -EINVAL; |
11 | + |
12 | dev->cpu = pr->id; |
13 | |
14 | if (max_cstate == 0) |
15 | @@ -1205,6 +1208,7 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) |
16 | } |
17 | |
18 | /* Populate Updated C-state information */ |
19 | + acpi_processor_get_power_info(pr); |
20 | acpi_processor_setup_cpuidle_states(pr); |
21 | |
22 | /* Enable all cpuidle devices */ |
23 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
24 | index 93cbc44..71a4d04 100644 |
25 | --- a/drivers/ata/ahci.c |
26 | +++ b/drivers/ata/ahci.c |
27 | @@ -53,6 +53,7 @@ |
28 | |
29 | enum { |
30 | AHCI_PCI_BAR_STA2X11 = 0, |
31 | + AHCI_PCI_BAR_ENMOTUS = 2, |
32 | AHCI_PCI_BAR_STANDARD = 5, |
33 | }; |
34 | |
35 | @@ -405,7 +406,13 @@ static const struct pci_device_id ahci_pci_tbl[] = { |
36 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ |
37 | |
38 | /* Asmedia */ |
39 | - { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1061 */ |
40 | + { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */ |
41 | + { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci }, /* ASM1060 */ |
42 | + { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */ |
43 | + { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ |
44 | + |
45 | + /* Enmotus */ |
46 | + { PCI_DEVICE(0x1c44, 0x8000), board_ahci }, |
47 | |
48 | /* Generic, PCI class code for AHCI */ |
49 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
50 | @@ -1079,9 +1086,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
51 | dev_info(&pdev->dev, |
52 | "PDC42819 can only drive SATA devices with this driver\n"); |
53 | |
54 | - /* The Connext uses non-standard BAR */ |
55 | + /* Both Connext and Enmotus devices use non-standard BARs */ |
56 | if (pdev->vendor == PCI_VENDOR_ID_STMICRO && pdev->device == 0xCC06) |
57 | ahci_pci_bar = AHCI_PCI_BAR_STA2X11; |
58 | + else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000) |
59 | + ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS; |
60 | |
61 | /* acquire resources */ |
62 | rc = pcim_enable_device(pdev); |
63 | diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c |
64 | index f7f1dc6..ed0e8b7 100644 |
65 | --- a/drivers/dma/ioat/dma_v3.c |
66 | +++ b/drivers/dma/ioat/dma_v3.c |
67 | @@ -951,7 +951,7 @@ static int __devinit ioat_xor_val_self_test(struct ioatdma_device *device) |
68 | goto free_resources; |
69 | } |
70 | } |
71 | - dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_TO_DEVICE); |
72 | + dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE); |
73 | |
74 | /* skip validate if the capability is not present */ |
75 | if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask)) |
76 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c |
77 | index b298158..fd3ae62 100644 |
78 | --- a/drivers/firmware/dmi_scan.c |
79 | +++ b/drivers/firmware/dmi_scan.c |
80 | @@ -16,6 +16,7 @@ |
81 | */ |
82 | static char dmi_empty_string[] = " "; |
83 | |
84 | +static u16 __initdata dmi_ver; |
85 | /* |
86 | * Catch too early calls to dmi_check_system(): |
87 | */ |
88 | @@ -118,12 +119,12 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, |
89 | return 0; |
90 | } |
91 | |
92 | -static int __init dmi_checksum(const u8 *buf) |
93 | +static int __init dmi_checksum(const u8 *buf, u8 len) |
94 | { |
95 | u8 sum = 0; |
96 | int a; |
97 | |
98 | - for (a = 0; a < 15; a++) |
99 | + for (a = 0; a < len; a++) |
100 | sum += buf[a]; |
101 | |
102 | return sum == 0; |
103 | @@ -161,8 +162,10 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, int inde |
104 | return; |
105 | |
106 | for (i = 0; i < 16 && (is_ff || is_00); i++) { |
107 | - if(d[i] != 0x00) is_ff = 0; |
108 | - if(d[i] != 0xFF) is_00 = 0; |
109 | + if (d[i] != 0x00) |
110 | + is_00 = 0; |
111 | + if (d[i] != 0xFF) |
112 | + is_ff = 0; |
113 | } |
114 | |
115 | if (is_ff || is_00) |
116 | @@ -172,7 +175,15 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, int inde |
117 | if (!s) |
118 | return; |
119 | |
120 | - sprintf(s, "%pUB", d); |
121 | + /* |
122 | + * As of version 2.6 of the SMBIOS specification, the first 3 fields of |
123 | + * the UUID are supposed to be little-endian encoded. The specification |
124 | + * says that this is the defacto standard. |
125 | + */ |
126 | + if (dmi_ver >= 0x0206) |
127 | + sprintf(s, "%pUL", d); |
128 | + else |
129 | + sprintf(s, "%pUB", d); |
130 | |
131 | dmi_ident[slot] = s; |
132 | } |
133 | @@ -404,29 +415,57 @@ static int __init dmi_present(const char __iomem *p) |
134 | u8 buf[15]; |
135 | |
136 | memcpy_fromio(buf, p, 15); |
137 | - if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { |
138 | + if (dmi_checksum(buf, 15)) { |
139 | dmi_num = (buf[13] << 8) | buf[12]; |
140 | dmi_len = (buf[7] << 8) | buf[6]; |
141 | dmi_base = (buf[11] << 24) | (buf[10] << 16) | |
142 | (buf[9] << 8) | buf[8]; |
143 | |
144 | - /* |
145 | - * DMI version 0.0 means that the real version is taken from |
146 | - * the SMBIOS version, which we don't know at this point. |
147 | - */ |
148 | - if (buf[14] != 0) |
149 | - printk(KERN_INFO "DMI %d.%d present.\n", |
150 | - buf[14] >> 4, buf[14] & 0xF); |
151 | - else |
152 | - printk(KERN_INFO "DMI present.\n"); |
153 | if (dmi_walk_early(dmi_decode) == 0) { |
154 | + if (dmi_ver) |
155 | + pr_info("SMBIOS %d.%d present.\n", |
156 | + dmi_ver >> 8, dmi_ver & 0xFF); |
157 | + else { |
158 | + dmi_ver = (buf[14] & 0xF0) << 4 | |
159 | + (buf[14] & 0x0F); |
160 | + pr_info("Legacy DMI %d.%d present.\n", |
161 | + dmi_ver >> 8, dmi_ver & 0xFF); |
162 | + } |
163 | dmi_dump_ids(); |
164 | return 0; |
165 | } |
166 | } |
167 | + dmi_ver = 0; |
168 | return 1; |
169 | } |
170 | |
171 | +static int __init smbios_present(const char __iomem *p) |
172 | +{ |
173 | + u8 buf[32]; |
174 | + int offset = 0; |
175 | + |
176 | + memcpy_fromio(buf, p, 32); |
177 | + if ((buf[5] < 32) && dmi_checksum(buf, buf[5])) { |
178 | + dmi_ver = (buf[6] << 8) + buf[7]; |
179 | + |
180 | + /* Some BIOS report weird SMBIOS version, fix that up */ |
181 | + switch (dmi_ver) { |
182 | + case 0x021F: |
183 | + case 0x0221: |
184 | + pr_debug("SMBIOS version fixup(2.%d->2.%d)\n", |
185 | + dmi_ver & 0xFF, 3); |
186 | + dmi_ver = 0x0203; |
187 | + break; |
188 | + case 0x0233: |
189 | + pr_debug("SMBIOS version fixup(2.%d->2.%d)\n", 51, 6); |
190 | + dmi_ver = 0x0206; |
191 | + break; |
192 | + } |
193 | + offset = 16; |
194 | + } |
195 | + return dmi_present(buf + offset); |
196 | +} |
197 | + |
198 | void __init dmi_scan_machine(void) |
199 | { |
200 | char __iomem *p, *q; |
201 | @@ -444,7 +483,7 @@ void __init dmi_scan_machine(void) |
202 | if (p == NULL) |
203 | goto error; |
204 | |
205 | - rc = dmi_present(p + 0x10); /* offset of _DMI_ string */ |
206 | + rc = smbios_present(p); |
207 | dmi_iounmap(p, 32); |
208 | if (!rc) { |
209 | dmi_available = 1; |
210 | @@ -462,7 +501,12 @@ void __init dmi_scan_machine(void) |
211 | goto error; |
212 | |
213 | for (q = p; q < p + 0x10000; q += 16) { |
214 | - rc = dmi_present(q); |
215 | + if (memcmp(q, "_SM_", 4) == 0 && q - p <= 0xFFE0) |
216 | + rc = smbios_present(q); |
217 | + else if (memcmp(q, "_DMI_", 5) == 0) |
218 | + rc = dmi_present(q); |
219 | + else |
220 | + continue; |
221 | if (!rc) { |
222 | dmi_available = 1; |
223 | dmi_iounmap(p, 0x10000); |
224 | diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
225 | index de43194..d4417e3 100644 |
226 | --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
227 | +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
228 | @@ -707,6 +707,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, |
229 | total = 0; |
230 | for (i = 0; i < count; i++) { |
231 | struct drm_i915_gem_relocation_entry __user *user_relocs; |
232 | + u64 invalid_offset = (u64)-1; |
233 | + int j; |
234 | |
235 | user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; |
236 | |
237 | @@ -717,6 +719,25 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, |
238 | goto err; |
239 | } |
240 | |
241 | + /* As we do not update the known relocation offsets after |
242 | + * relocating (due to the complexities in lock handling), |
243 | + * we need to mark them as invalid now so that we force the |
244 | + * relocation processing next time. Just in case the target |
245 | + * object is evicted and then rebound into its old |
246 | + * presumed_offset before the next execbuffer - if that |
247 | + * happened we would make the mistake of assuming that the |
248 | + * relocations were valid. |
249 | + */ |
250 | + for (j = 0; j < exec[i].relocation_count; j++) { |
251 | + if (copy_to_user(&user_relocs[j].presumed_offset, |
252 | + &invalid_offset, |
253 | + sizeof(invalid_offset))) { |
254 | + ret = -EFAULT; |
255 | + mutex_lock(&dev->struct_mutex); |
256 | + goto err; |
257 | + } |
258 | + } |
259 | + |
260 | reloc_offset[i] = total; |
261 | total += exec[i].relocation_count; |
262 | } |
263 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
264 | index 27a296a..dde62bf 100644 |
265 | --- a/drivers/gpu/drm/i915/i915_reg.h |
266 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
267 | @@ -27,6 +27,8 @@ |
268 | |
269 | #define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a))) |
270 | |
271 | +#define _MASKED_BIT_ENABLE(a) (((a) << 16) | (a)) |
272 | + |
273 | /* |
274 | * The Bridge device's PCI config space has information about the |
275 | * fb aperture size and the amount of pre-reserved memory. |
276 | @@ -433,6 +435,7 @@ |
277 | * the enables for writing to the corresponding low bit. |
278 | */ |
279 | #define _3D_CHICKEN 0x02084 |
280 | +#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB (1 << 10) |
281 | #define _3D_CHICKEN2 0x0208c |
282 | /* Disables pipelining of read flushes past the SF-WIZ interface. |
283 | * Required on all Ironlake steppings according to the B-Spec, but the |
284 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
285 | index 8e95c94..3c9b9c5 100644 |
286 | --- a/drivers/gpu/drm/i915/intel_display.c |
287 | +++ b/drivers/gpu/drm/i915/intel_display.c |
288 | @@ -8592,6 +8592,10 @@ static void gen6_init_clock_gating(struct drm_device *dev) |
289 | I915_READ(ILK_DISPLAY_CHICKEN2) | |
290 | ILK_ELPIN_409_SELECT); |
291 | |
292 | + /* WaDisableHiZPlanesWhenMSAAEnabled */ |
293 | + I915_WRITE(_3D_CHICKEN, |
294 | + _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB)); |
295 | + |
296 | I915_WRITE(WM3_LP_ILK, 0); |
297 | I915_WRITE(WM2_LP_ILK, 0); |
298 | I915_WRITE(WM1_LP_ILK, 0); |
299 | diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h |
300 | index 4b7cce1..a321b77 100644 |
301 | --- a/drivers/pci/hotplug/pciehp.h |
302 | +++ b/drivers/pci/hotplug/pciehp.h |
303 | @@ -44,7 +44,6 @@ extern bool pciehp_poll_mode; |
304 | extern int pciehp_poll_time; |
305 | extern bool pciehp_debug; |
306 | extern bool pciehp_force; |
307 | -extern struct workqueue_struct *pciehp_wq; |
308 | |
309 | #define dbg(format, arg...) \ |
310 | do { \ |
311 | @@ -78,6 +77,7 @@ struct slot { |
312 | struct hotplug_slot *hotplug_slot; |
313 | struct delayed_work work; /* work for button event */ |
314 | struct mutex lock; |
315 | + struct workqueue_struct *wq; |
316 | }; |
317 | |
318 | struct event_info { |
319 | diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c |
320 | index 365c6b9..9e39df9 100644 |
321 | --- a/drivers/pci/hotplug/pciehp_core.c |
322 | +++ b/drivers/pci/hotplug/pciehp_core.c |
323 | @@ -42,7 +42,6 @@ bool pciehp_debug; |
324 | bool pciehp_poll_mode; |
325 | int pciehp_poll_time; |
326 | bool pciehp_force; |
327 | -struct workqueue_struct *pciehp_wq; |
328 | |
329 | #define DRIVER_VERSION "0.4" |
330 | #define DRIVER_AUTHOR "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" |
331 | @@ -340,18 +339,13 @@ static int __init pcied_init(void) |
332 | { |
333 | int retval = 0; |
334 | |
335 | - pciehp_wq = alloc_workqueue("pciehp", 0, 0); |
336 | - if (!pciehp_wq) |
337 | - return -ENOMEM; |
338 | - |
339 | pciehp_firmware_init(); |
340 | retval = pcie_port_service_register(&hpdriver_portdrv); |
341 | dbg("pcie_port_service_register = %d\n", retval); |
342 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); |
343 | - if (retval) { |
344 | - destroy_workqueue(pciehp_wq); |
345 | + if (retval) |
346 | dbg("Failure to register service\n"); |
347 | - } |
348 | + |
349 | return retval; |
350 | } |
351 | |
352 | @@ -359,7 +353,6 @@ static void __exit pcied_cleanup(void) |
353 | { |
354 | dbg("unload_pciehpd()\n"); |
355 | pcie_port_service_unregister(&hpdriver_portdrv); |
356 | - destroy_workqueue(pciehp_wq); |
357 | info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); |
358 | } |
359 | |
360 | diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c |
361 | index 27f4429..38f0186 100644 |
362 | --- a/drivers/pci/hotplug/pciehp_ctrl.c |
363 | +++ b/drivers/pci/hotplug/pciehp_ctrl.c |
364 | @@ -49,7 +49,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type) |
365 | info->p_slot = p_slot; |
366 | INIT_WORK(&info->work, interrupt_event_handler); |
367 | |
368 | - queue_work(pciehp_wq, &info->work); |
369 | + queue_work(p_slot->wq, &info->work); |
370 | |
371 | return 0; |
372 | } |
373 | @@ -344,7 +344,7 @@ void pciehp_queue_pushbutton_work(struct work_struct *work) |
374 | kfree(info); |
375 | goto out; |
376 | } |
377 | - queue_work(pciehp_wq, &info->work); |
378 | + queue_work(p_slot->wq, &info->work); |
379 | out: |
380 | mutex_unlock(&p_slot->lock); |
381 | } |
382 | @@ -377,7 +377,7 @@ static void handle_button_press_event(struct slot *p_slot) |
383 | if (ATTN_LED(ctrl)) |
384 | pciehp_set_attention_status(p_slot, 0); |
385 | |
386 | - queue_delayed_work(pciehp_wq, &p_slot->work, 5*HZ); |
387 | + queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ); |
388 | break; |
389 | case BLINKINGOFF_STATE: |
390 | case BLINKINGON_STATE: |
391 | @@ -439,7 +439,7 @@ static void handle_surprise_event(struct slot *p_slot) |
392 | else |
393 | p_slot->state = POWERON_STATE; |
394 | |
395 | - queue_work(pciehp_wq, &info->work); |
396 | + queue_work(p_slot->wq, &info->work); |
397 | } |
398 | |
399 | static void interrupt_event_handler(struct work_struct *work) |
400 | diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c |
401 | index a960fae..9dd2c01 100644 |
402 | --- a/drivers/pci/hotplug/pciehp_hpc.c |
403 | +++ b/drivers/pci/hotplug/pciehp_hpc.c |
404 | @@ -874,23 +874,32 @@ static void pcie_shutdown_notification(struct controller *ctrl) |
405 | static int pcie_init_slot(struct controller *ctrl) |
406 | { |
407 | struct slot *slot; |
408 | + char name[32]; |
409 | |
410 | slot = kzalloc(sizeof(*slot), GFP_KERNEL); |
411 | if (!slot) |
412 | return -ENOMEM; |
413 | |
414 | + snprintf(name, sizeof(name), "pciehp-%u", PSN(ctrl)); |
415 | + slot->wq = alloc_workqueue(name, 0, 0); |
416 | + if (!slot->wq) |
417 | + goto abort; |
418 | + |
419 | slot->ctrl = ctrl; |
420 | mutex_init(&slot->lock); |
421 | INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work); |
422 | ctrl->slot = slot; |
423 | return 0; |
424 | +abort: |
425 | + kfree(slot); |
426 | + return -ENOMEM; |
427 | } |
428 | |
429 | static void pcie_cleanup_slot(struct controller *ctrl) |
430 | { |
431 | struct slot *slot = ctrl->slot; |
432 | cancel_delayed_work(&slot->work); |
433 | - flush_workqueue(pciehp_wq); |
434 | + destroy_workqueue(slot->wq); |
435 | kfree(slot); |
436 | } |
437 | |
438 | diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h |
439 | index ca64932..1b69d95 100644 |
440 | --- a/drivers/pci/hotplug/shpchp.h |
441 | +++ b/drivers/pci/hotplug/shpchp.h |
442 | @@ -47,7 +47,6 @@ extern bool shpchp_poll_mode; |
443 | extern int shpchp_poll_time; |
444 | extern bool shpchp_debug; |
445 | extern struct workqueue_struct *shpchp_wq; |
446 | -extern struct workqueue_struct *shpchp_ordered_wq; |
447 | |
448 | #define dbg(format, arg...) \ |
449 | do { \ |
450 | diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c |
451 | index 7414fd9..5f1f0d9 100644 |
452 | --- a/drivers/pci/hotplug/shpchp_core.c |
453 | +++ b/drivers/pci/hotplug/shpchp_core.c |
454 | @@ -40,7 +40,6 @@ bool shpchp_debug; |
455 | bool shpchp_poll_mode; |
456 | int shpchp_poll_time; |
457 | struct workqueue_struct *shpchp_wq; |
458 | -struct workqueue_struct *shpchp_ordered_wq; |
459 | |
460 | #define DRIVER_VERSION "0.4" |
461 | #define DRIVER_AUTHOR "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" |
462 | @@ -175,7 +174,6 @@ void cleanup_slots(struct controller *ctrl) |
463 | list_del(&slot->slot_list); |
464 | cancel_delayed_work(&slot->work); |
465 | flush_workqueue(shpchp_wq); |
466 | - flush_workqueue(shpchp_ordered_wq); |
467 | pci_hp_deregister(slot->hotplug_slot); |
468 | } |
469 | } |
470 | @@ -364,17 +362,10 @@ static int __init shpcd_init(void) |
471 | if (!shpchp_wq) |
472 | return -ENOMEM; |
473 | |
474 | - shpchp_ordered_wq = alloc_ordered_workqueue("shpchp_ordered", 0); |
475 | - if (!shpchp_ordered_wq) { |
476 | - destroy_workqueue(shpchp_wq); |
477 | - return -ENOMEM; |
478 | - } |
479 | - |
480 | retval = pci_register_driver(&shpc_driver); |
481 | dbg("%s: pci_register_driver = %d\n", __func__, retval); |
482 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); |
483 | if (retval) { |
484 | - destroy_workqueue(shpchp_ordered_wq); |
485 | destroy_workqueue(shpchp_wq); |
486 | } |
487 | return retval; |
488 | @@ -384,7 +375,6 @@ static void __exit shpcd_cleanup(void) |
489 | { |
490 | dbg("unload_shpchpd()\n"); |
491 | pci_unregister_driver(&shpc_driver); |
492 | - destroy_workqueue(shpchp_ordered_wq); |
493 | destroy_workqueue(shpchp_wq); |
494 | info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); |
495 | } |
496 | diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c |
497 | index b00b09b..bba5b3e 100644 |
498 | --- a/drivers/pci/hotplug/shpchp_ctrl.c |
499 | +++ b/drivers/pci/hotplug/shpchp_ctrl.c |
500 | @@ -456,7 +456,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work) |
501 | kfree(info); |
502 | goto out; |
503 | } |
504 | - queue_work(shpchp_ordered_wq, &info->work); |
505 | + queue_work(shpchp_wq, &info->work); |
506 | out: |
507 | mutex_unlock(&p_slot->lock); |
508 | } |
509 | diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c |
510 | index 0ca0535..a56105b 100644 |
511 | --- a/drivers/pci/pcie/aer/aerdrv_core.c |
512 | +++ b/drivers/pci/pcie/aer/aerdrv_core.c |
513 | @@ -637,6 +637,7 @@ static void aer_recover_work_func(struct work_struct *work) |
514 | continue; |
515 | } |
516 | do_recovery(pdev, entry.severity); |
517 | + pci_dev_put(pdev); |
518 | } |
519 | } |
520 | #endif |
521 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c |
522 | index b500840..474f22f 100644 |
523 | --- a/drivers/pci/pcie/aspm.c |
524 | +++ b/drivers/pci/pcie/aspm.c |
525 | @@ -798,6 +798,9 @@ void pcie_clear_aspm(struct pci_bus *bus) |
526 | { |
527 | struct pci_dev *child; |
528 | |
529 | + if (aspm_force) |
530 | + return; |
531 | + |
532 | /* |
533 | * Clear any ASPM setup that the firmware has carried out on this bus |
534 | */ |
535 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
536 | index a239382..5b3cadb 100644 |
537 | --- a/drivers/scsi/sd.c |
538 | +++ b/drivers/scsi/sd.c |
539 | @@ -2919,10 +2919,6 @@ static int __init init_sd(void) |
540 | if (err) |
541 | goto err_out; |
542 | |
543 | - err = scsi_register_driver(&sd_template.gendrv); |
544 | - if (err) |
545 | - goto err_out_class; |
546 | - |
547 | sd_cdb_cache = kmem_cache_create("sd_ext_cdb", SD_EXT_CDB_SIZE, |
548 | 0, 0, NULL); |
549 | if (!sd_cdb_cache) { |
550 | @@ -2936,8 +2932,15 @@ static int __init init_sd(void) |
551 | goto err_out_cache; |
552 | } |
553 | |
554 | + err = scsi_register_driver(&sd_template.gendrv); |
555 | + if (err) |
556 | + goto err_out_driver; |
557 | + |
558 | return 0; |
559 | |
560 | +err_out_driver: |
561 | + mempool_destroy(sd_cdb_pool); |
562 | + |
563 | err_out_cache: |
564 | kmem_cache_destroy(sd_cdb_cache); |
565 | |
566 | @@ -2960,10 +2963,10 @@ static void __exit exit_sd(void) |
567 | |
568 | SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n")); |
569 | |
570 | + scsi_unregister_driver(&sd_template.gendrv); |
571 | mempool_destroy(sd_cdb_pool); |
572 | kmem_cache_destroy(sd_cdb_cache); |
573 | |
574 | - scsi_unregister_driver(&sd_template.gendrv); |
575 | class_unregister(&sd_disk_class); |
576 | |
577 | for (i = 0; i < SD_MAJORS; i++) |
578 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
579 | index cee0c3e..f62629b 100644 |
580 | --- a/drivers/usb/dwc3/gadget.c |
581 | +++ b/drivers/usb/dwc3/gadget.c |
582 | @@ -1453,6 +1453,7 @@ static int __devinit dwc3_gadget_init_endpoints(struct dwc3 *dwc) |
583 | |
584 | if (epnum == 0 || epnum == 1) { |
585 | dep->endpoint.maxpacket = 512; |
586 | + dep->endpoint.maxburst = 1; |
587 | dep->endpoint.ops = &dwc3_gadget_ep0_ops; |
588 | if (!epnum) |
589 | dwc->gadget.ep0 = &dep->endpoint; |
590 | diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c |
591 | index e4db350..3fe069f 100644 |
592 | --- a/drivers/usb/host/uhci-hcd.c |
593 | +++ b/drivers/usb/host/uhci-hcd.c |
594 | @@ -447,6 +447,10 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) |
595 | return IRQ_NONE; |
596 | uhci_writew(uhci, status, USBSTS); /* Clear it */ |
597 | |
598 | + spin_lock(&uhci->lock); |
599 | + if (unlikely(!uhci->is_initialized)) /* not yet configured */ |
600 | + goto done; |
601 | + |
602 | if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) { |
603 | if (status & USBSTS_HSE) |
604 | dev_err(uhci_dev(uhci), "host system error, " |
605 | @@ -455,7 +459,6 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) |
606 | dev_err(uhci_dev(uhci), "host controller process " |
607 | "error, something bad happened!\n"); |
608 | if (status & USBSTS_HCH) { |
609 | - spin_lock(&uhci->lock); |
610 | if (uhci->rh_state >= UHCI_RH_RUNNING) { |
611 | dev_err(uhci_dev(uhci), |
612 | "host controller halted, " |
613 | @@ -473,15 +476,15 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) |
614 | * pending unlinks */ |
615 | mod_timer(&hcd->rh_timer, jiffies); |
616 | } |
617 | - spin_unlock(&uhci->lock); |
618 | } |
619 | } |
620 | |
621 | - if (status & USBSTS_RD) |
622 | + if (status & USBSTS_RD) { |
623 | + spin_unlock(&uhci->lock); |
624 | usb_hcd_poll_rh_status(hcd); |
625 | - else { |
626 | - spin_lock(&uhci->lock); |
627 | + } else { |
628 | uhci_scan_schedule(uhci); |
629 | + done: |
630 | spin_unlock(&uhci->lock); |
631 | } |
632 | |
633 | @@ -662,9 +665,9 @@ static int uhci_start(struct usb_hcd *hcd) |
634 | */ |
635 | mb(); |
636 | |
637 | + spin_lock_irq(&uhci->lock); |
638 | configure_hc(uhci); |
639 | uhci->is_initialized = 1; |
640 | - spin_lock_irq(&uhci->lock); |
641 | start_rh(uhci); |
642 | spin_unlock_irq(&uhci->lock); |
643 | return 0; |
644 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
645 | index 48241aa..3dd0efb 100644 |
646 | --- a/include/linux/sched.h |
647 | +++ b/include/linux/sched.h |
648 | @@ -2695,7 +2695,16 @@ static inline void thread_group_cputime_init(struct signal_struct *sig) |
649 | extern void recalc_sigpending_and_wake(struct task_struct *t); |
650 | extern void recalc_sigpending(void); |
651 | |
652 | -extern void signal_wake_up(struct task_struct *t, int resume_stopped); |
653 | +extern void signal_wake_up_state(struct task_struct *t, unsigned int state); |
654 | + |
655 | +static inline void signal_wake_up(struct task_struct *t, bool resume) |
656 | +{ |
657 | + signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0); |
658 | +} |
659 | +static inline void ptrace_signal_wake_up(struct task_struct *t, bool resume) |
660 | +{ |
661 | + signal_wake_up_state(t, resume ? __TASK_TRACED : 0); |
662 | +} |
663 | |
664 | /* |
665 | * Wrappers for p->thread_info->cpu access. No-op on UP. |
666 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c |
667 | index ee8d49b..daf4394 100644 |
668 | --- a/kernel/ptrace.c |
669 | +++ b/kernel/ptrace.c |
670 | @@ -117,11 +117,45 @@ void __ptrace_unlink(struct task_struct *child) |
671 | * TASK_KILLABLE sleeps. |
672 | */ |
673 | if (child->jobctl & JOBCTL_STOP_PENDING || task_is_traced(child)) |
674 | - signal_wake_up(child, task_is_traced(child)); |
675 | + ptrace_signal_wake_up(child, true); |
676 | |
677 | spin_unlock(&child->sighand->siglock); |
678 | } |
679 | |
680 | +/* Ensure that nothing can wake it up, even SIGKILL */ |
681 | +static bool ptrace_freeze_traced(struct task_struct *task) |
682 | +{ |
683 | + bool ret = false; |
684 | + |
685 | + /* Lockless, nobody but us can set this flag */ |
686 | + if (task->jobctl & JOBCTL_LISTENING) |
687 | + return ret; |
688 | + |
689 | + spin_lock_irq(&task->sighand->siglock); |
690 | + if (task_is_traced(task) && !__fatal_signal_pending(task)) { |
691 | + task->state = __TASK_TRACED; |
692 | + ret = true; |
693 | + } |
694 | + spin_unlock_irq(&task->sighand->siglock); |
695 | + |
696 | + return ret; |
697 | +} |
698 | + |
699 | +static void ptrace_unfreeze_traced(struct task_struct *task) |
700 | +{ |
701 | + if (task->state != __TASK_TRACED) |
702 | + return; |
703 | + |
704 | + WARN_ON(!task->ptrace || task->parent != current); |
705 | + |
706 | + spin_lock_irq(&task->sighand->siglock); |
707 | + if (__fatal_signal_pending(task)) |
708 | + wake_up_state(task, __TASK_TRACED); |
709 | + else |
710 | + task->state = TASK_TRACED; |
711 | + spin_unlock_irq(&task->sighand->siglock); |
712 | +} |
713 | + |
714 | /** |
715 | * ptrace_check_attach - check whether ptracee is ready for ptrace operation |
716 | * @child: ptracee to check for |
717 | @@ -151,24 +185,29 @@ int ptrace_check_attach(struct task_struct *child, bool ignore_state) |
718 | * be changed by us so it's not changing right after this. |
719 | */ |
720 | read_lock(&tasklist_lock); |
721 | - if ((child->ptrace & PT_PTRACED) && child->parent == current) { |
722 | + if (child->ptrace && child->parent == current) { |
723 | + WARN_ON(child->state == __TASK_TRACED); |
724 | /* |
725 | * child->sighand can't be NULL, release_task() |
726 | * does ptrace_unlink() before __exit_signal(). |
727 | */ |
728 | - spin_lock_irq(&child->sighand->siglock); |
729 | - WARN_ON_ONCE(task_is_stopped(child)); |
730 | - if (ignore_state || (task_is_traced(child) && |
731 | - !(child->jobctl & JOBCTL_LISTENING))) |
732 | + if (ignore_state || ptrace_freeze_traced(child)) |
733 | ret = 0; |
734 | - spin_unlock_irq(&child->sighand->siglock); |
735 | } |
736 | read_unlock(&tasklist_lock); |
737 | |
738 | - if (!ret && !ignore_state) |
739 | - ret = wait_task_inactive(child, TASK_TRACED) ? 0 : -ESRCH; |
740 | + if (!ret && !ignore_state) { |
741 | + if (!wait_task_inactive(child, __TASK_TRACED)) { |
742 | + /* |
743 | + * This can only happen if may_ptrace_stop() fails and |
744 | + * ptrace_stop() changes ->state back to TASK_RUNNING, |
745 | + * so we should not worry about leaking __TASK_TRACED. |
746 | + */ |
747 | + WARN_ON(child->state == __TASK_TRACED); |
748 | + ret = -ESRCH; |
749 | + } |
750 | + } |
751 | |
752 | - /* All systems go.. */ |
753 | return ret; |
754 | } |
755 | |
756 | @@ -311,7 +350,7 @@ static int ptrace_attach(struct task_struct *task, long request, |
757 | */ |
758 | if (task_is_stopped(task) && |
759 | task_set_jobctl_pending(task, JOBCTL_TRAP_STOP | JOBCTL_TRAPPING)) |
760 | - signal_wake_up(task, 1); |
761 | + signal_wake_up_state(task, __TASK_STOPPED); |
762 | |
763 | spin_unlock(&task->sighand->siglock); |
764 | |
765 | @@ -728,7 +767,7 @@ int ptrace_request(struct task_struct *child, long request, |
766 | * tracee into STOP. |
767 | */ |
768 | if (likely(task_set_jobctl_pending(child, JOBCTL_TRAP_STOP))) |
769 | - signal_wake_up(child, child->jobctl & JOBCTL_LISTENING); |
770 | + ptrace_signal_wake_up(child, child->jobctl & JOBCTL_LISTENING); |
771 | |
772 | unlock_task_sighand(child, &flags); |
773 | ret = 0; |
774 | @@ -754,7 +793,7 @@ int ptrace_request(struct task_struct *child, long request, |
775 | * start of this trap and now. Trigger re-trap. |
776 | */ |
777 | if (child->jobctl & JOBCTL_TRAP_NOTIFY) |
778 | - signal_wake_up(child, true); |
779 | + ptrace_signal_wake_up(child, true); |
780 | ret = 0; |
781 | } |
782 | unlock_task_sighand(child, &flags); |
783 | @@ -891,6 +930,8 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr, |
784 | goto out_put_task_struct; |
785 | |
786 | ret = arch_ptrace(child, request, addr, data); |
787 | + if (ret || request != PTRACE_DETACH) |
788 | + ptrace_unfreeze_traced(child); |
789 | |
790 | out_put_task_struct: |
791 | put_task_struct(child); |
792 | @@ -1030,8 +1071,11 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, |
793 | |
794 | ret = ptrace_check_attach(child, request == PTRACE_KILL || |
795 | request == PTRACE_INTERRUPT); |
796 | - if (!ret) |
797 | + if (!ret) { |
798 | ret = compat_arch_ptrace(child, request, addr, data); |
799 | + if (ret || request != PTRACE_DETACH) |
800 | + ptrace_unfreeze_traced(child); |
801 | + } |
802 | |
803 | out_put_task_struct: |
804 | put_task_struct(child); |
805 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c |
806 | index 1d22981..e1718bc 100644 |
807 | --- a/kernel/sched/core.c |
808 | +++ b/kernel/sched/core.c |
809 | @@ -1688,7 +1688,8 @@ out: |
810 | */ |
811 | int wake_up_process(struct task_struct *p) |
812 | { |
813 | - return try_to_wake_up(p, TASK_ALL, 0); |
814 | + WARN_ON(task_is_stopped_or_traced(p)); |
815 | + return try_to_wake_up(p, TASK_NORMAL, 0); |
816 | } |
817 | EXPORT_SYMBOL(wake_up_process); |
818 | |
819 | diff --git a/kernel/signal.c b/kernel/signal.c |
820 | index 17afcaf..a4363a9 100644 |
821 | --- a/kernel/signal.c |
822 | +++ b/kernel/signal.c |
823 | @@ -677,23 +677,17 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) |
824 | * No need to set need_resched since signal event passing |
825 | * goes through ->blocked |
826 | */ |
827 | -void signal_wake_up(struct task_struct *t, int resume) |
828 | +void signal_wake_up_state(struct task_struct *t, unsigned int state) |
829 | { |
830 | - unsigned int mask; |
831 | - |
832 | set_tsk_thread_flag(t, TIF_SIGPENDING); |
833 | - |
834 | /* |
835 | - * For SIGKILL, we want to wake it up in the stopped/traced/killable |
836 | + * TASK_WAKEKILL also means wake it up in the stopped/traced/killable |
837 | * case. We don't check t->state here because there is a race with it |
838 | * executing another processor and just now entering stopped state. |
839 | * By using wake_up_state, we ensure the process will wake up and |
840 | * handle its death signal. |
841 | */ |
842 | - mask = TASK_INTERRUPTIBLE; |
843 | - if (resume) |
844 | - mask |= TASK_WAKEKILL; |
845 | - if (!wake_up_state(t, mask)) |
846 | + if (!wake_up_state(t, state | TASK_INTERRUPTIBLE)) |
847 | kick_process(t); |
848 | } |
849 | |
850 | @@ -842,7 +836,7 @@ static void ptrace_trap_notify(struct task_struct *t) |
851 | assert_spin_locked(&t->sighand->siglock); |
852 | |
853 | task_set_jobctl_pending(t, JOBCTL_TRAP_NOTIFY); |
854 | - signal_wake_up(t, t->jobctl & JOBCTL_LISTENING); |
855 | + ptrace_signal_wake_up(t, t->jobctl & JOBCTL_LISTENING); |
856 | } |
857 | |
858 | /* |
859 | @@ -1808,6 +1802,10 @@ static inline int may_ptrace_stop(void) |
860 | * If SIGKILL was already sent before the caller unlocked |
861 | * ->siglock we must see ->core_state != NULL. Otherwise it |
862 | * is safe to enter schedule(). |
863 | + * |
864 | + * This is almost outdated, a task with the pending SIGKILL can't |
865 | + * block in TASK_TRACED. But PTRACE_EVENT_EXIT can be reported |
866 | + * after SIGKILL was already dequeued. |
867 | */ |
868 | if (unlikely(current->mm->core_state) && |
869 | unlikely(current->mm == current->parent->mm)) |
870 | @@ -1933,6 +1931,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) |
871 | if (gstop_done) |
872 | do_notify_parent_cldstop(current, false, why); |
873 | |
874 | + /* tasklist protects us from ptrace_freeze_traced() */ |
875 | __set_current_state(TASK_RUNNING); |
876 | if (clear_code) |
877 | current->exit_code = 0; |
878 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
879 | index 100b7fd..6b194d8 100644 |
880 | --- a/kernel/trace/ftrace.c |
881 | +++ b/kernel/trace/ftrace.c |
882 | @@ -3869,7 +3869,7 @@ static int ftrace_module_notify(struct notifier_block *self, |
883 | |
884 | struct notifier_block ftrace_module_nb = { |
885 | .notifier_call = ftrace_module_notify, |
886 | - .priority = 0, |
887 | + .priority = INT_MAX, /* Run before anything that can use kprobes */ |
888 | }; |
889 | |
890 | extern unsigned long __start_mcount_loc[]; |
891 | diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c |
892 | index 49a464f..62fa2c5 100644 |
893 | --- a/security/integrity/evm/evm_crypto.c |
894 | +++ b/security/integrity/evm/evm_crypto.c |
895 | @@ -205,9 +205,9 @@ int evm_update_evmxattr(struct dentry *dentry, const char *xattr_name, |
896 | rc = __vfs_setxattr_noperm(dentry, XATTR_NAME_EVM, |
897 | &xattr_data, |
898 | sizeof(xattr_data), 0); |
899 | - } |
900 | - else if (rc == -ENODATA) |
901 | + } else if (rc == -ENODATA && inode->i_op->removexattr) { |
902 | rc = inode->i_op->removexattr(dentry, XATTR_NAME_EVM); |
903 | + } |
904 | return rc; |
905 | } |
906 | |
907 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c |
908 | index 24c5114..9ab2b3e 100644 |
909 | --- a/sound/usb/endpoint.c |
910 | +++ b/sound/usb/endpoint.c |
911 | @@ -148,10 +148,8 @@ void snd_usb_release_substream_urbs(struct snd_usb_substream *subs, int force) |
912 | int i; |
913 | |
914 | /* stop urbs (to be sure) */ |
915 | - if (!subs->stream->chip->shutdown) { |
916 | - deactivate_urbs(subs, force, 1); |
917 | - wait_clear_urbs(subs); |
918 | - } |
919 | + deactivate_urbs(subs, force, 1); |
920 | + wait_clear_urbs(subs); |
921 | |
922 | for (i = 0; i < MAX_URBS; i++) |
923 | release_urb_ctx(&subs->dataurb[i]); |