Contents of /trunk/kernel-lts/patches-3.4/0169-3.4.70-all-fixes.patch
Parent Directory | Revision Log
Revision 2334 -
(show annotations)
(download)
Thu Dec 12 08:43:27 2013 UTC (10 years, 9 months ago) by niro
File size: 12689 byte(s)
Thu Dec 12 08:43:27 2013 UTC (10 years, 9 months ago) by niro
File size: 12689 byte(s)
-linux-3.4.70
1 | diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S |
2 | index 650d5923..94b0650e 100644 |
3 | --- a/arch/arm/lib/memset.S |
4 | +++ b/arch/arm/lib/memset.S |
5 | @@ -14,27 +14,15 @@ |
6 | |
7 | .text |
8 | .align 5 |
9 | - .word 0 |
10 | - |
11 | -1: subs r2, r2, #4 @ 1 do we have enough |
12 | - blt 5f @ 1 bytes to align with? |
13 | - cmp r3, #2 @ 1 |
14 | - strltb r1, [r0], #1 @ 1 |
15 | - strleb r1, [r0], #1 @ 1 |
16 | - strb r1, [r0], #1 @ 1 |
17 | - add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) |
18 | -/* |
19 | - * The pointer is now aligned and the length is adjusted. Try doing the |
20 | - * memset again. |
21 | - */ |
22 | |
23 | ENTRY(memset) |
24 | ands r3, r0, #3 @ 1 unaligned? |
25 | - bne 1b @ 1 |
26 | + mov ip, r0 @ preserve r0 as return value |
27 | + bne 6f @ 1 |
28 | /* |
29 | - * we know that the pointer in r0 is aligned to a word boundary. |
30 | + * we know that the pointer in ip is aligned to a word boundary. |
31 | */ |
32 | - orr r1, r1, r1, lsl #8 |
33 | +1: orr r1, r1, r1, lsl #8 |
34 | orr r1, r1, r1, lsl #16 |
35 | mov r3, r1 |
36 | cmp r2, #16 |
37 | @@ -43,29 +31,28 @@ ENTRY(memset) |
38 | #if ! CALGN(1)+0 |
39 | |
40 | /* |
41 | - * We need an extra register for this loop - save the return address and |
42 | - * use the LR |
43 | + * We need 2 extra registers for this loop - use r8 and the LR |
44 | */ |
45 | - str lr, [sp, #-4]! |
46 | - mov ip, r1 |
47 | + stmfd sp!, {r8, lr} |
48 | + mov r8, r1 |
49 | mov lr, r1 |
50 | |
51 | 2: subs r2, r2, #64 |
52 | - stmgeia r0!, {r1, r3, ip, lr} @ 64 bytes at a time. |
53 | - stmgeia r0!, {r1, r3, ip, lr} |
54 | - stmgeia r0!, {r1, r3, ip, lr} |
55 | - stmgeia r0!, {r1, r3, ip, lr} |
56 | + stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. |
57 | + stmgeia ip!, {r1, r3, r8, lr} |
58 | + stmgeia ip!, {r1, r3, r8, lr} |
59 | + stmgeia ip!, {r1, r3, r8, lr} |
60 | bgt 2b |
61 | - ldmeqfd sp!, {pc} @ Now <64 bytes to go. |
62 | + ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go. |
63 | /* |
64 | * No need to correct the count; we're only testing bits from now on |
65 | */ |
66 | tst r2, #32 |
67 | - stmneia r0!, {r1, r3, ip, lr} |
68 | - stmneia r0!, {r1, r3, ip, lr} |
69 | + stmneia ip!, {r1, r3, r8, lr} |
70 | + stmneia ip!, {r1, r3, r8, lr} |
71 | tst r2, #16 |
72 | - stmneia r0!, {r1, r3, ip, lr} |
73 | - ldr lr, [sp], #4 |
74 | + stmneia ip!, {r1, r3, r8, lr} |
75 | + ldmfd sp!, {r8, lr} |
76 | |
77 | #else |
78 | |
79 | @@ -74,54 +61,63 @@ ENTRY(memset) |
80 | * whole cache lines at once. |
81 | */ |
82 | |
83 | - stmfd sp!, {r4-r7, lr} |
84 | + stmfd sp!, {r4-r8, lr} |
85 | mov r4, r1 |
86 | mov r5, r1 |
87 | mov r6, r1 |
88 | mov r7, r1 |
89 | - mov ip, r1 |
90 | + mov r8, r1 |
91 | mov lr, r1 |
92 | |
93 | cmp r2, #96 |
94 | - tstgt r0, #31 |
95 | + tstgt ip, #31 |
96 | ble 3f |
97 | |
98 | - and ip, r0, #31 |
99 | - rsb ip, ip, #32 |
100 | - sub r2, r2, ip |
101 | - movs ip, ip, lsl #(32 - 4) |
102 | - stmcsia r0!, {r4, r5, r6, r7} |
103 | - stmmiia r0!, {r4, r5} |
104 | - tst ip, #(1 << 30) |
105 | - mov ip, r1 |
106 | - strne r1, [r0], #4 |
107 | + and r8, ip, #31 |
108 | + rsb r8, r8, #32 |
109 | + sub r2, r2, r8 |
110 | + movs r8, r8, lsl #(32 - 4) |
111 | + stmcsia ip!, {r4, r5, r6, r7} |
112 | + stmmiia ip!, {r4, r5} |
113 | + tst r8, #(1 << 30) |
114 | + mov r8, r1 |
115 | + strne r1, [ip], #4 |
116 | |
117 | 3: subs r2, r2, #64 |
118 | - stmgeia r0!, {r1, r3-r7, ip, lr} |
119 | - stmgeia r0!, {r1, r3-r7, ip, lr} |
120 | + stmgeia ip!, {r1, r3-r8, lr} |
121 | + stmgeia ip!, {r1, r3-r8, lr} |
122 | bgt 3b |
123 | - ldmeqfd sp!, {r4-r7, pc} |
124 | + ldmeqfd sp!, {r4-r8, pc} |
125 | |
126 | tst r2, #32 |
127 | - stmneia r0!, {r1, r3-r7, ip, lr} |
128 | + stmneia ip!, {r1, r3-r8, lr} |
129 | tst r2, #16 |
130 | - stmneia r0!, {r4-r7} |
131 | - ldmfd sp!, {r4-r7, lr} |
132 | + stmneia ip!, {r4-r7} |
133 | + ldmfd sp!, {r4-r8, lr} |
134 | |
135 | #endif |
136 | |
137 | 4: tst r2, #8 |
138 | - stmneia r0!, {r1, r3} |
139 | + stmneia ip!, {r1, r3} |
140 | tst r2, #4 |
141 | - strne r1, [r0], #4 |
142 | + strne r1, [ip], #4 |
143 | /* |
144 | * When we get here, we've got less than 4 bytes to zero. We |
145 | * may have an unaligned pointer as well. |
146 | */ |
147 | 5: tst r2, #2 |
148 | - strneb r1, [r0], #1 |
149 | - strneb r1, [r0], #1 |
150 | + strneb r1, [ip], #1 |
151 | + strneb r1, [ip], #1 |
152 | tst r2, #1 |
153 | - strneb r1, [r0], #1 |
154 | + strneb r1, [ip], #1 |
155 | mov pc, lr |
156 | + |
157 | +6: subs r2, r2, #4 @ 1 do we have enough |
158 | + blt 5b @ 1 bytes to align with? |
159 | + cmp r3, #2 @ 1 |
160 | + strltb r1, [ip], #1 @ 1 |
161 | + strleb r1, [ip], #1 @ 1 |
162 | + strb r1, [ip], #1 @ 1 |
163 | + add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) |
164 | + b 1b |
165 | ENDPROC(memset) |
166 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h |
167 | index 9d7f1723..093bf0a2 100644 |
168 | --- a/drivers/net/xen-netback/common.h |
169 | +++ b/drivers/net/xen-netback/common.h |
170 | @@ -88,6 +88,7 @@ struct xenvif { |
171 | unsigned long credit_usec; |
172 | unsigned long remaining_credit; |
173 | struct timer_list credit_timeout; |
174 | + u64 credit_window_start; |
175 | |
176 | /* Statistics */ |
177 | unsigned long rx_gso_checksum_fixup; |
178 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c |
179 | index 221f4265..cfaaf685 100644 |
180 | --- a/drivers/net/xen-netback/interface.c |
181 | +++ b/drivers/net/xen-netback/interface.c |
182 | @@ -273,8 +273,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, |
183 | vif->credit_bytes = vif->remaining_credit = ~0UL; |
184 | vif->credit_usec = 0UL; |
185 | init_timer(&vif->credit_timeout); |
186 | - /* Initialize 'expires' now: it's used to track the credit window. */ |
187 | - vif->credit_timeout.expires = jiffies; |
188 | + vif->credit_window_start = get_jiffies_64(); |
189 | |
190 | dev->netdev_ops = &xenvif_netdev_ops; |
191 | dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; |
192 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c |
193 | index 0d22cff0..d8ffbf84 100644 |
194 | --- a/drivers/net/xen-netback/netback.c |
195 | +++ b/drivers/net/xen-netback/netback.c |
196 | @@ -1197,9 +1197,8 @@ out: |
197 | |
198 | static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) |
199 | { |
200 | - unsigned long now = jiffies; |
201 | - unsigned long next_credit = |
202 | - vif->credit_timeout.expires + |
203 | + u64 now = get_jiffies_64(); |
204 | + u64 next_credit = vif->credit_window_start + |
205 | msecs_to_jiffies(vif->credit_usec / 1000); |
206 | |
207 | /* Timer could already be pending in rare cases. */ |
208 | @@ -1207,8 +1206,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) |
209 | return true; |
210 | |
211 | /* Passed the point where we can replenish credit? */ |
212 | - if (time_after_eq(now, next_credit)) { |
213 | - vif->credit_timeout.expires = now; |
214 | + if (time_after_eq64(now, next_credit)) { |
215 | + vif->credit_window_start = now; |
216 | tx_add_credit(vif); |
217 | } |
218 | |
219 | @@ -1220,6 +1219,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) |
220 | tx_credit_callback; |
221 | mod_timer(&vif->credit_timeout, |
222 | next_credit); |
223 | + vif->credit_window_start = next_credit; |
224 | |
225 | return true; |
226 | } |
227 | diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c |
228 | index 54fc9880..21b9ed1d 100644 |
229 | --- a/drivers/pci/pci-driver.c |
230 | +++ b/drivers/pci/pci-driver.c |
231 | @@ -680,6 +680,7 @@ static int pci_pm_suspend(struct device *dev) |
232 | goto Fixup; |
233 | } |
234 | |
235 | + pci_dev->state_saved = false; |
236 | if (pm->suspend) { |
237 | pci_power_t prev = pci_dev->current_state; |
238 | int error; |
239 | @@ -826,6 +827,7 @@ static int pci_pm_freeze(struct device *dev) |
240 | return 0; |
241 | } |
242 | |
243 | + pci_dev->state_saved = false; |
244 | if (pm->freeze) { |
245 | int error; |
246 | |
247 | @@ -914,6 +916,7 @@ static int pci_pm_poweroff(struct device *dev) |
248 | goto Fixup; |
249 | } |
250 | |
251 | + pci_dev->state_saved = false; |
252 | if (pm->poweroff) { |
253 | int error; |
254 | |
255 | @@ -1032,6 +1035,7 @@ static int pci_pm_runtime_suspend(struct device *dev) |
256 | if (!pm || !pm->runtime_suspend) |
257 | return -ENOSYS; |
258 | |
259 | + pci_dev->state_saved = false; |
260 | error = pm->runtime_suspend(dev); |
261 | suspend_report_result(pm->runtime_suspend, error); |
262 | if (error) |
263 | diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c |
264 | index eea85daf..be76ebac 100644 |
265 | --- a/drivers/pci/setup-res.c |
266 | +++ b/drivers/pci/setup-res.c |
267 | @@ -206,7 +206,8 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, |
268 | return ret; |
269 | } |
270 | |
271 | -static int _pci_assign_resource(struct pci_dev *dev, int resno, int size, resource_size_t min_align) |
272 | +static int _pci_assign_resource(struct pci_dev *dev, int resno, |
273 | + resource_size_t size, resource_size_t min_align) |
274 | { |
275 | struct resource *res = dev->resource + resno; |
276 | struct pci_bus *bus; |
277 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
278 | index aa54fad7..82fce32c 100644 |
279 | --- a/drivers/usb/core/hub.c |
280 | +++ b/drivers/usb/core/hub.c |
281 | @@ -1335,6 +1335,7 @@ static int hub_configure(struct usb_hub *hub, |
282 | return 0; |
283 | |
284 | fail: |
285 | + hdev->maxchild = 0; |
286 | dev_err (hub_dev, "config failed, %s (err %d)\n", |
287 | message, ret); |
288 | /* hub_disconnect() frees urb and descriptor */ |
289 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
290 | index 57277bcc..a5477554 100644 |
291 | --- a/drivers/usb/serial/option.c |
292 | +++ b/drivers/usb/serial/option.c |
293 | @@ -1391,6 +1391,23 @@ static const struct usb_device_id option_ids[] = { |
294 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
295 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ |
296 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
297 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) }, |
298 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) }, |
299 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) }, |
300 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) }, |
301 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) }, |
302 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) }, |
303 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) }, |
304 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) }, |
305 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) }, |
306 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) }, |
307 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) }, |
308 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) }, |
309 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) }, |
310 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) }, |
311 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) }, |
312 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) }, |
313 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) }, |
314 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
315 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, |
316 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
317 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
318 | index 5dd96266..022940f0 100644 |
319 | --- a/kernel/trace/trace.c |
320 | +++ b/kernel/trace/trace.c |
321 | @@ -590,9 +590,12 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf, |
322 | if (isspace(ch)) { |
323 | parser->buffer[parser->idx] = 0; |
324 | parser->cont = false; |
325 | - } else { |
326 | + } else if (parser->idx < parser->size - 1) { |
327 | parser->cont = true; |
328 | parser->buffer[parser->idx++] = ch; |
329 | + } else { |
330 | + ret = -EINVAL; |
331 | + goto out; |
332 | } |
333 | |
334 | *ppos += read; |
335 | diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c |
336 | index 27747881..200707c6 100644 |
337 | --- a/net/core/flow_dissector.c |
338 | +++ b/net/core/flow_dissector.c |
339 | @@ -35,7 +35,7 @@ again: |
340 | struct iphdr _iph; |
341 | ip: |
342 | iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph); |
343 | - if (!iph) |
344 | + if (!iph || iph->ihl < 5) |
345 | return false; |
346 | |
347 | if (ip_is_fragment(iph)) |
348 | diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c |
349 | index 93faf6a3..4a8c55bd 100644 |
350 | --- a/net/netfilter/nf_conntrack_sip.c |
351 | +++ b/net/netfilter/nf_conntrack_sip.c |
352 | @@ -1468,7 +1468,7 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff, |
353 | |
354 | msglen = origlen = end - dptr; |
355 | if (msglen > datalen) |
356 | - return NF_DROP; |
357 | + return NF_ACCEPT; |
358 | |
359 | ret = process_sip_msg(skb, ct, dataoff, &dptr, &msglen); |
360 | if (ret != NF_ACCEPT) |
361 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
362 | index 02a6e3f4..ef917bf2 100644 |
363 | --- a/sound/pci/hda/patch_hdmi.c |
364 | +++ b/sound/pci/hda/patch_hdmi.c |
365 | @@ -1282,23 +1282,34 @@ static int generic_hdmi_build_controls(struct hda_codec *codec) |
366 | return 0; |
367 | } |
368 | |
369 | -static int generic_hdmi_init(struct hda_codec *codec) |
370 | +static int generic_hdmi_init_per_pins(struct hda_codec *codec) |
371 | { |
372 | struct hdmi_spec *spec = codec->spec; |
373 | int pin_idx; |
374 | |
375 | for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { |
376 | struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx]; |
377 | - hda_nid_t pin_nid = per_pin->pin_nid; |
378 | struct hdmi_eld *eld = &per_pin->sink_eld; |
379 | |
380 | - hdmi_init_pin(codec, pin_nid); |
381 | - snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); |
382 | - |
383 | per_pin->codec = codec; |
384 | INIT_DELAYED_WORK(&per_pin->work, hdmi_repoll_eld); |
385 | snd_hda_eld_proc_new(codec, eld, pin_idx); |
386 | } |
387 | + return 0; |
388 | +} |
389 | + |
390 | +static int generic_hdmi_init(struct hda_codec *codec) |
391 | +{ |
392 | + struct hdmi_spec *spec = codec->spec; |
393 | + int pin_idx; |
394 | + |
395 | + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { |
396 | + struct hdmi_spec_per_pin *per_pin = &spec->pins[pin_idx]; |
397 | + hda_nid_t pin_nid = per_pin->pin_nid; |
398 | + |
399 | + hdmi_init_pin(codec, pin_nid); |
400 | + snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); |
401 | + } |
402 | snd_hda_jack_report_sync(codec); |
403 | return 0; |
404 | } |
405 | @@ -1343,6 +1354,7 @@ static int patch_generic_hdmi(struct hda_codec *codec) |
406 | return -EINVAL; |
407 | } |
408 | codec->patch_ops = generic_hdmi_patch_ops; |
409 | + generic_hdmi_init_per_pins(codec); |
410 | |
411 | init_channel_allocations(); |
412 |