Contents of /trunk/kernel26-magellan/patches-2.6.25-r5/0102-2.6.25.3-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(show annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years, 1 month ago) by niro
File size: 19183 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years, 1 month ago) by niro
File size: 19183 byte(s)
2.6.25-magellan-r5: - updated to linux-2.6.25.17
1 | diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c |
2 | index d51bc8b..b4565bb 100644 |
3 | --- a/arch/arm/kernel/kprobes-decode.c |
4 | +++ b/arch/arm/kernel/kprobes-decode.c |
5 | @@ -1176,7 +1176,7 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) |
6 | * *S (bit 20) updates condition codes |
7 | * ADC/SBC/RSC reads the C flag |
8 | */ |
9 | - insn &= 0xfff00ff0; /* Rn = r0, Rd = r0 */ |
10 | + insn &= 0xfff00fff; /* Rn = r0, Rd = r0 */ |
11 | asi->insn[0] = insn; |
12 | asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ |
13 | emulate_alu_imm_rwflags : emulate_alu_imm_rflags; |
14 | diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c |
15 | index 13e371a..5593dd2 100644 |
16 | --- a/arch/arm/kernel/kprobes.c |
17 | +++ b/arch/arm/kernel/kprobes.c |
18 | @@ -66,7 +66,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) |
19 | return -ENOMEM; |
20 | for (is = 0; is < MAX_INSN_SIZE; ++is) |
21 | p->ainsn.insn[is] = tmp_insn[is]; |
22 | - flush_insns(&p->ainsn.insn, MAX_INSN_SIZE); |
23 | + flush_insns(p->ainsn.insn, MAX_INSN_SIZE); |
24 | break; |
25 | |
26 | case INSN_GOOD_NO_SLOT: /* instruction doesn't need insn slot */ |
27 | diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c |
28 | index 42bf09d..9f8c8e1 100644 |
29 | --- a/arch/sparc/kernel/sys_sparc.c |
30 | +++ b/arch/sparc/kernel/sys_sparc.c |
31 | @@ -224,8 +224,7 @@ int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) |
32 | { |
33 | if (ARCH_SUN4C_SUN4 && |
34 | (len > 0x20000000 || |
35 | - ((flags & MAP_FIXED) && |
36 | - addr < 0xe0000000 && addr + len > 0x20000000))) |
37 | + (addr < 0xe0000000 && addr + len > 0x20000000))) |
38 | return -EINVAL; |
39 | |
40 | /* See asm-sparc/uaccess.h */ |
41 | diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c |
42 | index f952745..cc37936 100644 |
43 | --- a/arch/sparc64/kernel/sys_sparc.c |
44 | +++ b/arch/sparc64/kernel/sys_sparc.c |
45 | @@ -549,13 +549,13 @@ int sparc64_mmap_check(unsigned long addr, unsigned long len, |
46 | if (len >= STACK_TOP32) |
47 | return -EINVAL; |
48 | |
49 | - if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len) |
50 | + if (addr > STACK_TOP32 - len) |
51 | return -EINVAL; |
52 | } else { |
53 | if (len >= VA_EXCLUDE_START) |
54 | return -EINVAL; |
55 | |
56 | - if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len)) |
57 | + if (invalid_64bit_range(addr, len)) |
58 | return -EINVAL; |
59 | } |
60 | |
61 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c |
62 | index 7b6e3bb..05356ce 100644 |
63 | --- a/arch/x86/pci/common.c |
64 | +++ b/arch/x86/pci/common.c |
65 | @@ -372,13 +372,16 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = { |
66 | {} |
67 | }; |
68 | |
69 | +void __init dmi_check_pciprobe(void) |
70 | +{ |
71 | + dmi_check_system(pciprobe_dmi_table); |
72 | +} |
73 | + |
74 | struct pci_bus * __devinit pcibios_scan_root(int busnum) |
75 | { |
76 | struct pci_bus *bus = NULL; |
77 | struct pci_sysdata *sd; |
78 | |
79 | - dmi_check_system(pciprobe_dmi_table); |
80 | - |
81 | while ((bus = pci_find_next_bus(bus)) != NULL) { |
82 | if (bus->number == busnum) { |
83 | /* Already scanned */ |
84 | diff --git a/arch/x86/pci/init.c b/arch/x86/pci/init.c |
85 | index 3de9f9b..f1bf4e5 100644 |
86 | --- a/arch/x86/pci/init.c |
87 | +++ b/arch/x86/pci/init.c |
88 | @@ -32,6 +32,8 @@ static __init int pci_access_init(void) |
89 | printk(KERN_ERR |
90 | "PCI: Fatal: No config space access function found\n"); |
91 | |
92 | + dmi_check_pciprobe(); |
93 | + |
94 | return 0; |
95 | } |
96 | arch_initcall(pci_access_init); |
97 | diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h |
98 | index 3431518..95e5675 100644 |
99 | --- a/arch/x86/pci/pci.h |
100 | +++ b/arch/x86/pci/pci.h |
101 | @@ -39,6 +39,8 @@ enum pci_bf_sort_state { |
102 | pci_dmi_bf, |
103 | }; |
104 | |
105 | +extern void __init dmi_check_pciprobe(void); |
106 | + |
107 | /* pci-i386.c */ |
108 | |
109 | extern unsigned int pcibios_max_latency; |
110 | diff --git a/crypto/authenc.c b/crypto/authenc.c |
111 | index ed8ac5a..4b22676 100644 |
112 | --- a/crypto/authenc.c |
113 | +++ b/crypto/authenc.c |
114 | @@ -217,9 +217,10 @@ static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, |
115 | int err) |
116 | { |
117 | if (!err) { |
118 | - struct aead_givcrypt_request *greq = req->data; |
119 | + struct aead_request *areq = req->data; |
120 | + struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); |
121 | |
122 | - err = crypto_authenc_genicv(&greq->areq, greq->giv, 0); |
123 | + err = crypto_authenc_genicv(areq, greq->giv, 0); |
124 | } |
125 | |
126 | aead_request_complete(req->data, err); |
127 | diff --git a/crypto/cryptd.c b/crypto/cryptd.c |
128 | index 2504252..b150de5 100644 |
129 | --- a/crypto/cryptd.c |
130 | +++ b/crypto/cryptd.c |
131 | @@ -190,8 +190,10 @@ static struct crypto_instance *cryptd_alloc_instance(struct crypto_alg *alg, |
132 | int err; |
133 | |
134 | inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); |
135 | - if (IS_ERR(inst)) |
136 | + if (!inst) { |
137 | + inst = ERR_PTR(-ENOMEM); |
138 | goto out; |
139 | + } |
140 | |
141 | err = -ENAMETOOLONG; |
142 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, |
143 | diff --git a/crypto/eseqiv.c b/crypto/eseqiv.c |
144 | index b14f14e..881d309 100644 |
145 | --- a/crypto/eseqiv.c |
146 | +++ b/crypto/eseqiv.c |
147 | @@ -136,7 +136,8 @@ static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req) |
148 | } |
149 | |
150 | ablkcipher_request_set_crypt(subreq, reqctx->src, dst, |
151 | - req->creq.nbytes, req->creq.info); |
152 | + req->creq.nbytes + ivsize, |
153 | + req->creq.info); |
154 | |
155 | memcpy(req->creq.info, ctx->salt, ivsize); |
156 | |
157 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c |
158 | index 788da97..836362b 100644 |
159 | --- a/drivers/acpi/processor_idle.c |
160 | +++ b/drivers/acpi/processor_idle.c |
161 | @@ -848,6 +848,7 @@ static int acpi_processor_get_power_info_default(struct acpi_processor *pr) |
162 | /* all processors need to support C1 */ |
163 | pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; |
164 | pr->power.states[ACPI_STATE_C1].valid = 1; |
165 | + pr->power.states[ACPI_STATE_C1].entry_method = ACPI_CSTATE_HALT; |
166 | } |
167 | /* the C0 state only exists as a filler in our array */ |
168 | pr->power.states[ACPI_STATE_C0].valid = 1; |
169 | @@ -960,6 +961,9 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) |
170 | cx.address); |
171 | } |
172 | |
173 | + if (cx.type == ACPI_STATE_C1) { |
174 | + cx.valid = 1; |
175 | + } |
176 | |
177 | obj = &(element->package.elements[2]); |
178 | if (obj->type != ACPI_TYPE_INTEGER) |
179 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
180 | index 61ccbd2..9f6d228 100644 |
181 | --- a/drivers/md/md.c |
182 | +++ b/drivers/md/md.c |
183 | @@ -2096,7 +2096,7 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, |
184 | rv = -EBUSY; |
185 | else |
186 | rv = entry->store(rdev, page, length); |
187 | - mddev_unlock(rdev->mddev); |
188 | + mddev_unlock(mddev); |
189 | } |
190 | return rv; |
191 | } |
192 | diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h |
193 | index f13346b..44ebdea 100644 |
194 | --- a/drivers/net/wireless/b43/b43.h |
195 | +++ b/drivers/net/wireless/b43/b43.h |
196 | @@ -628,6 +628,10 @@ struct b43_wl { |
197 | |
198 | struct mutex mutex; |
199 | spinlock_t irq_lock; |
200 | + /* R/W lock for data transmission. |
201 | + * Transmissions on 2+ queues can run concurrently, but somebody else |
202 | + * might sync with TX by write_lock_irqsave()'ing. */ |
203 | + rwlock_t tx_lock; |
204 | /* Lock for LEDs access. */ |
205 | spinlock_t leds_lock; |
206 | /* Lock for SHM access. */ |
207 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
208 | index f23317e..e0055d0 100644 |
209 | --- a/drivers/net/wireless/b43/main.c |
210 | +++ b/drivers/net/wireless/b43/main.c |
211 | @@ -622,6 +622,7 @@ static void b43_synchronize_irq(struct b43_wldev *dev) |
212 | */ |
213 | void b43_dummy_transmission(struct b43_wldev *dev) |
214 | { |
215 | + struct b43_wl *wl = dev->wl; |
216 | struct b43_phy *phy = &dev->phy; |
217 | unsigned int i, max_loop; |
218 | u16 value; |
219 | @@ -648,6 +649,9 @@ void b43_dummy_transmission(struct b43_wldev *dev) |
220 | return; |
221 | } |
222 | |
223 | + spin_lock_irq(&wl->irq_lock); |
224 | + write_lock(&wl->tx_lock); |
225 | + |
226 | for (i = 0; i < 5; i++) |
227 | b43_ram_write(dev, i * 4, buffer[i]); |
228 | |
229 | @@ -688,6 +692,9 @@ void b43_dummy_transmission(struct b43_wldev *dev) |
230 | } |
231 | if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5) |
232 | b43_radio_write16(dev, 0x0051, 0x0037); |
233 | + |
234 | + write_unlock(&wl->tx_lock); |
235 | + spin_unlock_irq(&wl->irq_lock); |
236 | } |
237 | |
238 | static void key_write(struct b43_wldev *dev, |
239 | @@ -2592,15 +2599,21 @@ static int b43_op_tx(struct ieee80211_hw *hw, |
240 | { |
241 | struct b43_wl *wl = hw_to_b43_wl(hw); |
242 | struct b43_wldev *dev = wl->current_dev; |
243 | - int err = -ENODEV; |
244 | + unsigned long flags; |
245 | + int err; |
246 | |
247 | if (unlikely(!dev)) |
248 | - goto out; |
249 | - if (unlikely(b43_status(dev) < B43_STAT_STARTED)) |
250 | - goto out; |
251 | - /* DMA-TX is done without a global lock. */ |
252 | - err = b43_dma_tx(dev, skb, ctl); |
253 | -out: |
254 | + return NETDEV_TX_BUSY; |
255 | + |
256 | + /* Transmissions on seperate queues can run concurrently. */ |
257 | + read_lock_irqsave(&wl->tx_lock, flags); |
258 | + |
259 | + err = -ENODEV; |
260 | + if (likely(b43_status(dev) >= B43_STAT_STARTED)) |
261 | + err = b43_dma_tx(dev, skb, ctl); |
262 | + |
263 | + read_unlock_irqrestore(&wl->tx_lock, flags); |
264 | + |
265 | if (unlikely(err)) |
266 | return NETDEV_TX_BUSY; |
267 | return NETDEV_TX_OK; |
268 | @@ -3109,7 +3122,9 @@ static void b43_wireless_core_stop(struct b43_wldev *dev) |
269 | spin_unlock_irqrestore(&wl->irq_lock, flags); |
270 | b43_synchronize_irq(dev); |
271 | |
272 | + write_lock_irqsave(&wl->tx_lock, flags); |
273 | b43_set_status(dev, B43_STAT_INITIALIZED); |
274 | + write_unlock_irqrestore(&wl->tx_lock, flags); |
275 | |
276 | mutex_unlock(&wl->mutex); |
277 | /* Must unlock as it would otherwise deadlock. No races here. |
278 | @@ -3117,8 +3132,6 @@ static void b43_wireless_core_stop(struct b43_wldev *dev) |
279 | cancel_delayed_work_sync(&dev->periodic_work); |
280 | mutex_lock(&wl->mutex); |
281 | |
282 | - ieee80211_stop_queues(wl->hw); //FIXME this could cause a deadlock, as mac80211 seems buggy. |
283 | - |
284 | b43_mac_suspend(dev); |
285 | free_irq(dev->dev->irq, dev); |
286 | b43dbg(wl, "Wireless interface stopped\n"); |
287 | @@ -3912,6 +3925,14 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) |
288 | err = -EOPNOTSUPP; |
289 | goto err_powerdown; |
290 | } |
291 | + if (1 /* disable A-PHY */) { |
292 | + /* FIXME: For now we disable the A-PHY on multi-PHY devices. */ |
293 | + if (dev->phy.type != B43_PHYTYPE_N) { |
294 | + have_2ghz_phy = 1; |
295 | + have_5ghz_phy = 0; |
296 | + } |
297 | + } |
298 | + |
299 | dev->phy.gmode = have_2ghz_phy; |
300 | tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0; |
301 | b43_wireless_core_reset(dev, tmp); |
302 | @@ -4076,6 +4097,7 @@ static int b43_wireless_init(struct ssb_device *dev) |
303 | memset(wl, 0, sizeof(*wl)); |
304 | wl->hw = hw; |
305 | spin_lock_init(&wl->irq_lock); |
306 | + rwlock_init(&wl->tx_lock); |
307 | spin_lock_init(&wl->leds_lock); |
308 | spin_lock_init(&wl->shm_lock); |
309 | mutex_init(&wl->mutex); |
310 | diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c |
311 | index d93b357..7a3625f 100644 |
312 | --- a/drivers/serial/mpc52xx_uart.c |
313 | +++ b/drivers/serial/mpc52xx_uart.c |
314 | @@ -1221,8 +1221,8 @@ static struct of_device_id mpc52xx_uart_of_match[] = { |
315 | #endif |
316 | #ifdef CONFIG_PPC_MPC512x |
317 | { .compatible = "fsl,mpc5121-psc-uart", .data = &mpc512x_psc_ops, }, |
318 | - {}, |
319 | #endif |
320 | + {}, |
321 | }; |
322 | |
323 | static int __devinit |
324 | diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c |
325 | index e0f0f09..9f877ab 100644 |
326 | --- a/fs/reiserfs/ioctl.c |
327 | +++ b/fs/reiserfs/ioctl.c |
328 | @@ -11,8 +11,6 @@ |
329 | #include <linux/smp_lock.h> |
330 | #include <linux/compat.h> |
331 | |
332 | -static int reiserfs_unpack(struct inode *inode, struct file *filp); |
333 | - |
334 | /* |
335 | ** reiserfs_ioctl - handler for ioctl for inode |
336 | ** supported commands: |
337 | @@ -140,7 +138,7 @@ int reiserfs_prepare_write(struct file *f, struct page *page, |
338 | ** Function try to convert tail from direct item into indirect. |
339 | ** It set up nopack attribute in the REISERFS_I(inode)->nopack |
340 | */ |
341 | -static int reiserfs_unpack(struct inode *inode, struct file *filp) |
342 | +int reiserfs_unpack(struct inode *inode, struct file *filp) |
343 | { |
344 | int retval = 0; |
345 | int index; |
346 | diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c |
347 | index 393cc22..3302259 100644 |
348 | --- a/fs/reiserfs/super.c |
349 | +++ b/fs/reiserfs/super.c |
350 | @@ -2019,6 +2019,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, |
351 | { |
352 | int err; |
353 | struct nameidata nd; |
354 | + struct inode *inode; |
355 | |
356 | if (!(REISERFS_SB(sb)->s_mount_opt & (1 << REISERFS_QUOTA))) |
357 | return -EINVAL; |
358 | @@ -2030,12 +2031,18 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, |
359 | path_put(&nd.path); |
360 | return -EXDEV; |
361 | } |
362 | + inode = nd.path.dentry->d_inode; |
363 | /* We must not pack tails for quota files on reiserfs for quota IO to work */ |
364 | - if (!(REISERFS_I(nd.path.dentry->d_inode)->i_flags & i_nopack_mask)) { |
365 | - reiserfs_warning(sb, |
366 | - "reiserfs: Quota file must have tail packing disabled."); |
367 | - path_put(&nd.path); |
368 | - return -EINVAL; |
369 | + if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) { |
370 | + err = reiserfs_unpack(inode, NULL); |
371 | + if (err) { |
372 | + reiserfs_warning(sb, |
373 | + "reiserfs: Unpacking tail of quota file failed" |
374 | + " (%d). Cannot turn on quotas.", err); |
375 | + path_put(&nd.path); |
376 | + return -EINVAL; |
377 | + } |
378 | + mark_inode_dirty(inode); |
379 | } |
380 | /* Not journalling quota? No more tests needed... */ |
381 | if (!REISERFS_SB(sb)->s_qf_names[USRQUOTA] && |
382 | diff --git a/fs/utimes.c b/fs/utimes.c |
383 | index b18da9c..80a481e 100644 |
384 | --- a/fs/utimes.c |
385 | +++ b/fs/utimes.c |
386 | @@ -39,9 +39,14 @@ asmlinkage long sys_utime(char __user *filename, struct utimbuf __user *times) |
387 | |
388 | #endif |
389 | |
390 | +static bool nsec_special(long nsec) |
391 | +{ |
392 | + return nsec == UTIME_OMIT || nsec == UTIME_NOW; |
393 | +} |
394 | + |
395 | static bool nsec_valid(long nsec) |
396 | { |
397 | - if (nsec == UTIME_OMIT || nsec == UTIME_NOW) |
398 | + if (nsec_special(nsec)) |
399 | return true; |
400 | |
401 | return nsec >= 0 && nsec <= 999999999; |
402 | @@ -115,7 +120,15 @@ long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags |
403 | newattrs.ia_mtime.tv_nsec = times[1].tv_nsec; |
404 | newattrs.ia_valid |= ATTR_MTIME_SET; |
405 | } |
406 | - } else { |
407 | + } |
408 | + |
409 | + /* |
410 | + * If times is NULL or both times are either UTIME_OMIT or |
411 | + * UTIME_NOW, then need to check permissions, because |
412 | + * inode_change_ok() won't do it. |
413 | + */ |
414 | + if (!times || (nsec_special(times[0].tv_nsec) && |
415 | + nsec_special(times[1].tv_nsec))) { |
416 | error = -EACCES; |
417 | if (IS_IMMUTABLE(inode)) |
418 | goto dput_and_out; |
419 | diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h |
420 | index 224658b..833d208 100644 |
421 | --- a/include/crypto/scatterwalk.h |
422 | +++ b/include/crypto/scatterwalk.h |
423 | @@ -57,10 +57,14 @@ static inline void scatterwalk_sg_chain(struct scatterlist *sg1, int num, |
424 | struct scatterlist *sg2) |
425 | { |
426 | sg_set_page(&sg1[num - 1], (void *)sg2, 0, 0); |
427 | + sg1[num - 1].page_link &= ~0x02; |
428 | } |
429 | |
430 | static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg) |
431 | { |
432 | + if (sg_is_last(sg)) |
433 | + return NULL; |
434 | + |
435 | return (++sg)->length ? sg : (void *)sg_page(sg); |
436 | } |
437 | |
438 | diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h |
439 | index 8e7eff2..4aacaee 100644 |
440 | --- a/include/linux/reiserfs_fs.h |
441 | +++ b/include/linux/reiserfs_fs.h |
442 | @@ -2176,6 +2176,7 @@ int reiserfs_ioctl(struct inode *inode, struct file *filp, |
443 | unsigned int cmd, unsigned long arg); |
444 | long reiserfs_compat_ioctl(struct file *filp, |
445 | unsigned int cmd, unsigned long arg); |
446 | +int reiserfs_unpack(struct inode *inode, struct file *filp); |
447 | |
448 | /* ioctl's command */ |
449 | #define REISERFS_IOC_UNPACK _IOW(0xCD,1,long) |
450 | diff --git a/kernel/sched.c b/kernel/sched.c |
451 | index 8dcdec6..1e4596c 100644 |
452 | --- a/kernel/sched.c |
453 | +++ b/kernel/sched.c |
454 | @@ -876,6 +876,7 @@ static inline void resched_rq(struct rq *rq) |
455 | enum { |
456 | HRTICK_SET, /* re-programm hrtick_timer */ |
457 | HRTICK_RESET, /* not a new slice */ |
458 | + HRTICK_BLOCK, /* stop hrtick operations */ |
459 | }; |
460 | |
461 | /* |
462 | @@ -887,6 +888,8 @@ static inline int hrtick_enabled(struct rq *rq) |
463 | { |
464 | if (!sched_feat(HRTICK)) |
465 | return 0; |
466 | + if (unlikely(test_bit(HRTICK_BLOCK, &rq->hrtick_flags))) |
467 | + return 0; |
468 | return hrtimer_is_hres_active(&rq->hrtick_timer); |
469 | } |
470 | |
471 | @@ -969,7 +972,63 @@ static enum hrtimer_restart hrtick(struct hrtimer *timer) |
472 | return HRTIMER_NORESTART; |
473 | } |
474 | |
475 | -static inline void init_rq_hrtick(struct rq *rq) |
476 | +static void hotplug_hrtick_disable(int cpu) |
477 | +{ |
478 | + struct rq *rq = cpu_rq(cpu); |
479 | + unsigned long flags; |
480 | + |
481 | + spin_lock_irqsave(&rq->lock, flags); |
482 | + rq->hrtick_flags = 0; |
483 | + __set_bit(HRTICK_BLOCK, &rq->hrtick_flags); |
484 | + spin_unlock_irqrestore(&rq->lock, flags); |
485 | + |
486 | + hrtick_clear(rq); |
487 | +} |
488 | + |
489 | +static void hotplug_hrtick_enable(int cpu) |
490 | +{ |
491 | + struct rq *rq = cpu_rq(cpu); |
492 | + unsigned long flags; |
493 | + |
494 | + spin_lock_irqsave(&rq->lock, flags); |
495 | + __clear_bit(HRTICK_BLOCK, &rq->hrtick_flags); |
496 | + spin_unlock_irqrestore(&rq->lock, flags); |
497 | +} |
498 | + |
499 | +static int |
500 | +hotplug_hrtick(struct notifier_block *nfb, unsigned long action, void *hcpu) |
501 | +{ |
502 | + int cpu = (int)(long)hcpu; |
503 | + |
504 | + switch (action) { |
505 | + case CPU_UP_CANCELED: |
506 | + case CPU_UP_CANCELED_FROZEN: |
507 | + case CPU_DOWN_PREPARE: |
508 | + case CPU_DOWN_PREPARE_FROZEN: |
509 | + case CPU_DEAD: |
510 | + case CPU_DEAD_FROZEN: |
511 | + hotplug_hrtick_disable(cpu); |
512 | + return NOTIFY_OK; |
513 | + |
514 | + case CPU_UP_PREPARE: |
515 | + case CPU_UP_PREPARE_FROZEN: |
516 | + case CPU_DOWN_FAILED: |
517 | + case CPU_DOWN_FAILED_FROZEN: |
518 | + case CPU_ONLINE: |
519 | + case CPU_ONLINE_FROZEN: |
520 | + hotplug_hrtick_enable(cpu); |
521 | + return NOTIFY_OK; |
522 | + } |
523 | + |
524 | + return NOTIFY_DONE; |
525 | +} |
526 | + |
527 | +static void init_hrtick(void) |
528 | +{ |
529 | + hotcpu_notifier(hotplug_hrtick, 0); |
530 | +} |
531 | + |
532 | +static void init_rq_hrtick(struct rq *rq) |
533 | { |
534 | rq->hrtick_flags = 0; |
535 | hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
536 | @@ -1006,6 +1065,10 @@ static inline void init_rq_hrtick(struct rq *rq) |
537 | void hrtick_resched(void) |
538 | { |
539 | } |
540 | + |
541 | +static inline void init_hrtick(void) |
542 | +{ |
543 | +} |
544 | #endif |
545 | |
546 | /* |
547 | @@ -7094,6 +7157,7 @@ void __init sched_init_smp(void) |
548 | put_online_cpus(); |
549 | /* XXX: Theoretical race here - CPU may be hotplugged now */ |
550 | hotcpu_notifier(update_sched_domains, 0); |
551 | + init_hrtick(); |
552 | |
553 | /* Move init over to a non-isolated CPU */ |
554 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) |
555 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
556 | index 402a504..55443c2 100644 |
557 | --- a/mm/page_alloc.c |
558 | +++ b/mm/page_alloc.c |
559 | @@ -2518,7 +2518,9 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, |
560 | struct page *page; |
561 | unsigned long end_pfn = start_pfn + size; |
562 | unsigned long pfn; |
563 | + struct zone *z; |
564 | |
565 | + z = &NODE_DATA(nid)->node_zones[zone]; |
566 | for (pfn = start_pfn; pfn < end_pfn; pfn++) { |
567 | /* |
568 | * There can be holes in boot-time mem_map[]s |
569 | @@ -2536,7 +2538,6 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, |
570 | init_page_count(page); |
571 | reset_page_mapcount(page); |
572 | SetPageReserved(page); |
573 | - |
574 | /* |
575 | * Mark the block movable so that blocks are reserved for |
576 | * movable at startup. This will force kernel allocations |
577 | @@ -2545,8 +2546,15 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, |
578 | * kernel allocations are made. Later some blocks near |
579 | * the start are marked MIGRATE_RESERVE by |
580 | * setup_zone_migrate_reserve() |
581 | + * |
582 | + * bitmap is created for zone's valid pfn range. but memmap |
583 | + * can be created for invalid pages (for alignment) |
584 | + * check here not to call set_pageblock_migratetype() against |
585 | + * pfn out of zone. |
586 | */ |
587 | - if ((pfn & (pageblock_nr_pages-1))) |
588 | + if ((z->zone_start_pfn <= pfn) |
589 | + && (pfn < z->zone_start_pfn + z->spanned_pages) |
590 | + && !(pfn & (pageblock_nr_pages - 1))) |
591 | set_pageblock_migratetype(page, MIGRATE_MOVABLE); |
592 | |
593 | INIT_LIST_HEAD(&page->lru); |
594 | @@ -4460,6 +4468,8 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags, |
595 | pfn = page_to_pfn(page); |
596 | bitmap = get_pageblock_bitmap(zone, pfn); |
597 | bitidx = pfn_to_bitidx(zone, pfn); |
598 | + VM_BUG_ON(pfn < zone->zone_start_pfn); |
599 | + VM_BUG_ON(pfn >= zone->zone_start_pfn + zone->spanned_pages); |
600 | |
601 | for (; start_bitidx <= end_bitidx; start_bitidx++, value <<= 1) |
602 | if (flags & value) |
603 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c |
604 | index 1656c00..4de86c4 100644 |
605 | --- a/net/ipv6/sit.c |
606 | +++ b/net/ipv6/sit.c |
607 | @@ -446,9 +446,9 @@ static int ipip6_rcv(struct sk_buff *skb) |
608 | } |
609 | |
610 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); |
611 | - kfree_skb(skb); |
612 | read_unlock(&ipip6_lock); |
613 | out: |
614 | + kfree_skb(skb); |
615 | return 0; |
616 | } |
617 |