diff options
52 files changed, 236 insertions, 27 deletions
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 08a1ed1cb5d8..47a539c7642d 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches | |||
@@ -512,7 +512,7 @@ They provide type safety, have no length limitations, no formatting | |||
512 | limitations, and under gcc they are as cheap as macros. | 512 | limitations, and under gcc they are as cheap as macros. |
513 | 513 | ||
514 | Macros should only be used for cases where a static inline is clearly | 514 | Macros should only be used for cases where a static inline is clearly |
515 | suboptimal [there a few, isolated cases of this in fast paths], | 515 | suboptimal [there are a few, isolated cases of this in fast paths], |
516 | or where it is impossible to use a static inline function [such as | 516 | or where it is impossible to use a static inline function [such as |
517 | string-izing]. | 517 | string-izing]. |
518 | 518 | ||
diff --git a/Documentation/unaligned-memory-access.txt b/Documentation/unaligned-memory-access.txt index 6223eace3c09..b0472ac5226a 100644 --- a/Documentation/unaligned-memory-access.txt +++ b/Documentation/unaligned-memory-access.txt | |||
@@ -57,7 +57,7 @@ here; a summary of the common scenarios is presented below: | |||
57 | unaligned access to be corrected. | 57 | unaligned access to be corrected. |
58 | - Some architectures are not capable of unaligned memory access, but will | 58 | - Some architectures are not capable of unaligned memory access, but will |
59 | silently perform a different memory access to the one that was requested, | 59 | silently perform a different memory access to the one that was requested, |
60 | resulting a a subtle code bug that is hard to detect! | 60 | resulting in a subtle code bug that is hard to detect! |
61 | 61 | ||
62 | It should be obvious from the above that if your code causes unaligned | 62 | It should be obvious from the above that if your code causes unaligned |
63 | memory accesses to happen, your code will not work correctly on certain | 63 | memory accesses to happen, your code will not work correctly on certain |
@@ -209,7 +209,7 @@ memory and you wish to avoid unaligned access, its usage is as follows: | |||
209 | 209 | ||
210 | u32 value = get_unaligned((u32 *) data); | 210 | u32 value = get_unaligned((u32 *) data); |
211 | 211 | ||
212 | These macros work work for memory accesses of any length (not just 32 bits as | 212 | These macros work for memory accesses of any length (not just 32 bits as |
213 | in the examples above). Be aware that when compared to standard access of | 213 | in the examples above). Be aware that when compared to standard access of |
214 | aligned memory, using these macros to access unaligned memory can be costly in | 214 | aligned memory, using these macros to access unaligned memory can be costly in |
215 | terms of performance. | 215 | terms of performance. |
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 4e1c08636edd..dd6e334ab9e1 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c | |||
@@ -424,11 +424,13 @@ EXPORT_SYMBOL(pci_unmap_page); | |||
424 | else DMA_ADDRP is undefined. */ | 424 | else DMA_ADDRP is undefined. */ |
425 | 425 | ||
426 | void * | 426 | void * |
427 | pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp) | 427 | __pci_alloc_consistent(struct pci_dev *pdev, size_t size, |
428 | dma_addr_t *dma_addrp, gfp_t gfp) | ||
428 | { | 429 | { |
429 | void *cpu_addr; | 430 | void *cpu_addr; |
430 | long order = get_order(size); | 431 | long order = get_order(size); |
431 | gfp_t gfp = GFP_ATOMIC; | 432 | |
433 | gfp &= ~GFP_DMA; | ||
432 | 434 | ||
433 | try_again: | 435 | try_again: |
434 | cpu_addr = (void *)__get_free_pages(gfp, order); | 436 | cpu_addr = (void *)__get_free_pages(gfp, order); |
@@ -458,7 +460,7 @@ try_again: | |||
458 | 460 | ||
459 | return cpu_addr; | 461 | return cpu_addr; |
460 | } | 462 | } |
461 | EXPORT_SYMBOL(pci_alloc_consistent); | 463 | EXPORT_SYMBOL(__pci_alloc_consistent); |
462 | 464 | ||
463 | /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must | 465 | /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must |
464 | be values that were returned from pci_alloc_consistent. SIZE must | 466 | be values that were returned from pci_alloc_consistent. SIZE must |
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 236d2f8f7ddc..576a03db4511 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c | |||
@@ -233,6 +233,7 @@ NORET_TYPE void machine_kexec(struct kimage *image) | |||
233 | 233 | ||
234 | void arch_crash_save_vmcoreinfo(void) | 234 | void arch_crash_save_vmcoreinfo(void) |
235 | { | 235 | { |
236 | VMCOREINFO_SYMBOL(phys_base); | ||
236 | VMCOREINFO_SYMBOL(init_level4_pgt); | 237 | VMCOREINFO_SYMBOL(init_level4_pgt); |
237 | 238 | ||
238 | #ifdef CONFIG_NUMA | 239 | #ifdef CONFIG_NUMA |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index b53fdb0a282c..60cc54368b66 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -153,6 +153,12 @@ static int sock_xmit(struct nbd_device *lo, int send, void *buf, int size, | |||
153 | struct kvec iov; | 153 | struct kvec iov; |
154 | sigset_t blocked, oldset; | 154 | sigset_t blocked, oldset; |
155 | 155 | ||
156 | if (unlikely(!sock)) { | ||
157 | printk(KERN_ERR "%s: Attempted %s on closed socket in sock_xmit\n", | ||
158 | lo->disk->disk_name, (send ? "send" : "recv")); | ||
159 | return -EINVAL; | ||
160 | } | ||
161 | |||
156 | /* Allow interception of SIGKILL only | 162 | /* Allow interception of SIGKILL only |
157 | * Don't allow other signals to interrupt the transmission */ | 163 | * Don't allow other signals to interrupt the transmission */ |
158 | siginitsetinv(&blocked, sigmask(SIGKILL)); | 164 | siginitsetinv(&blocked, sigmask(SIGKILL)); |
diff --git a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c index d6567b32fb5c..9c25320121ef 100644 --- a/drivers/char/ip2/i2lib.c +++ b/drivers/char/ip2/i2lib.c | |||
@@ -644,12 +644,12 @@ i2QueueCommands(int type, i2ChanStrPtr pCh, int timeout, int nCommands, | |||
644 | // Normal Expected path - We still hold LOCK | 644 | // Normal Expected path - We still hold LOCK |
645 | break; /* from for()- Enough room: goto proceed */ | 645 | break; /* from for()- Enough room: goto proceed */ |
646 | } | 646 | } |
647 | } | 647 | ip2trace(CHANN, ITRC_QUEUE, 3, 1, totalsize); |
648 | 648 | WRITE_UNLOCK_IRQRESTORE(lock_var_p, flags); | |
649 | ip2trace (CHANN, ITRC_QUEUE, 3, 1, totalsize ); | 649 | } else |
650 | ip2trace(CHANN, ITRC_QUEUE, 3, 1, totalsize); | ||
650 | 651 | ||
651 | // Prepare to wait for buffers to empty | 652 | /* Prepare to wait for buffers to empty */ |
652 | WRITE_UNLOCK_IRQRESTORE(lock_var_p,flags); | ||
653 | serviceOutgoingFifo(pB); // Dump what we got | 653 | serviceOutgoingFifo(pB); // Dump what we got |
654 | 654 | ||
655 | if (timeout == 0) { | 655 | if (timeout == 0) { |
@@ -1830,6 +1830,8 @@ i2StripFifo(i2eBordStrPtr pB) | |||
1830 | default: // Neither packet? should be impossible | 1830 | default: // Neither packet? should be impossible |
1831 | ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 5, 1, | 1831 | ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 5, 1, |
1832 | PTYPE_OF(pB->i2eLeadoffWord) ); | 1832 | PTYPE_OF(pB->i2eLeadoffWord) ); |
1833 | WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock, | ||
1834 | bflags); | ||
1833 | 1835 | ||
1834 | break; | 1836 | break; |
1835 | } // End of switch on type of packets | 1837 | } // End of switch on type of packets |
diff --git a/drivers/char/rio/riotable.c b/drivers/char/rio/riotable.c index 991119c9f473..9b52892a501f 100644 --- a/drivers/char/rio/riotable.c +++ b/drivers/char/rio/riotable.c | |||
@@ -425,8 +425,10 @@ int RIOApel(struct rio_info *p) | |||
425 | 425 | ||
426 | MapP = &p->RIOConnectTable[Next++]; | 426 | MapP = &p->RIOConnectTable[Next++]; |
427 | MapP->HostUniqueNum = HostP->UniqueNum; | 427 | MapP->HostUniqueNum = HostP->UniqueNum; |
428 | if ((HostP->Flags & RUN_STATE) != RC_RUNNING) | 428 | if ((HostP->Flags & RUN_STATE) != RC_RUNNING) { |
429 | rio_spin_unlock_irqrestore(&HostP->HostLock, flags); | ||
429 | continue; | 430 | continue; |
431 | } | ||
430 | MapP->RtaUniqueNum = 0; | 432 | MapP->RtaUniqueNum = 0; |
431 | MapP->ID = 0; | 433 | MapP->ID = 0; |
432 | MapP->Flags = SLOT_IN_USE; | 434 | MapP->Flags = SLOT_IN_USE; |
diff --git a/drivers/char/rio/riotty.c b/drivers/char/rio/riotty.c index a4f0b1e3e7fa..cfa54361473f 100644 --- a/drivers/char/rio/riotty.c +++ b/drivers/char/rio/riotty.c | |||
@@ -319,6 +319,7 @@ int riotopen(struct tty_struct *tty, struct file *filp) | |||
319 | PortP->State |= RIO_WOPEN; | 319 | PortP->State |= RIO_WOPEN; |
320 | rio_spin_unlock_irqrestore(&PortP->portSem, flags); | 320 | rio_spin_unlock_irqrestore(&PortP->portSem, flags); |
321 | if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) { | 321 | if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) { |
322 | rio_spin_lock_irqsave(&PortP->portSem, flags); | ||
322 | /* | 323 | /* |
323 | ** ACTION: verify that this is a good thing | 324 | ** ACTION: verify that this is a good thing |
324 | ** to do here. -- ??? | 325 | ** to do here. -- ??? |
@@ -334,6 +335,7 @@ int riotopen(struct tty_struct *tty, struct file *filp) | |||
334 | func_exit(); | 335 | func_exit(); |
335 | return -EINTR; | 336 | return -EINTR; |
336 | } | 337 | } |
338 | rio_spin_lock_irqsave(&PortP->portSem, flags); | ||
337 | } | 339 | } |
338 | PortP->State &= ~RIO_WOPEN; | 340 | PortP->State &= ~RIO_WOPEN; |
339 | } | 341 | } |
@@ -493,6 +495,7 @@ int riotclose(void *ptr) | |||
493 | 495 | ||
494 | if (RIOShortCommand(p, PortP, CLOSE, 1, 0) == RIO_FAIL) { | 496 | if (RIOShortCommand(p, PortP, CLOSE, 1, 0) == RIO_FAIL) { |
495 | RIOPreemptiveCmd(p, PortP, FCLOSE); | 497 | RIOPreemptiveCmd(p, PortP, FCLOSE); |
498 | rio_spin_lock_irqsave(&PortP->portSem, flags); | ||
496 | goto close_end; | 499 | goto close_end; |
497 | } | 500 | } |
498 | 501 | ||
@@ -508,6 +511,7 @@ int riotclose(void *ptr) | |||
508 | 511 | ||
509 | if (p->RIOHalted) { | 512 | if (p->RIOHalted) { |
510 | RIOClearUp(PortP); | 513 | RIOClearUp(PortP); |
514 | rio_spin_lock_irqsave(&PortP->portSem, flags); | ||
511 | goto close_end; | 515 | goto close_end; |
512 | } | 516 | } |
513 | if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) { | 517 | if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) { |
diff --git a/drivers/ide/arm/ide_arm.c b/drivers/ide/arm/ide_arm.c index 43a70e91363e..be9ff7334c52 100644 --- a/drivers/ide/arm/ide_arm.c +++ b/drivers/ide/arm/ide_arm.c | |||
@@ -46,3 +46,5 @@ static int __init ide_arm_init(void) | |||
46 | } | 46 | } |
47 | 47 | ||
48 | module_init(ide_arm_init); | 48 | module_init(ide_arm_init); |
49 | |||
50 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c index e79bf8f9b7db..c8ffbaf29a88 100644 --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c | |||
@@ -1067,3 +1067,5 @@ static void cris_dma_start(ide_drive_t *drive) | |||
1067 | } | 1067 | } |
1068 | 1068 | ||
1069 | module_init(init_e100_ide); | 1069 | module_init(init_e100_ide); |
1070 | |||
1071 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/h8300/ide-h8300.c b/drivers/ide/h8300/ide-h8300.c index 520aec075700..4108ec4ffa7f 100644 --- a/drivers/ide/h8300/ide-h8300.c +++ b/drivers/ide/h8300/ide-h8300.c | |||
@@ -110,6 +110,7 @@ static int __init h8300_ide_init(void) | |||
110 | ide_init_port_data(hwif, index); | 110 | ide_init_port_data(hwif, index); |
111 | ide_init_port_hw(hwif, &hw); | 111 | ide_init_port_hw(hwif, &hw); |
112 | hwif_setup(hwif); | 112 | hwif_setup(hwif); |
113 | hwif->host_flags = IDE_HFLAG_NO_IO_32BIT; | ||
113 | printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index); | 114 | printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index); |
114 | 115 | ||
115 | idx[0] = index; | 116 | idx[0] = index; |
@@ -125,3 +126,5 @@ out_busy: | |||
125 | } | 126 | } |
126 | 127 | ||
127 | module_init(h8300_ide_init); | 128 | module_init(h8300_ide_init); |
129 | |||
130 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 01b92208f09d..e77cee0e5d65 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -658,7 +658,7 @@ int ide_driveid_update(ide_drive_t *drive) | |||
658 | local_irq_restore(flags); | 658 | local_irq_restore(flags); |
659 | return 0; | 659 | return 0; |
660 | } | 660 | } |
661 | ata_input_data(drive, id, SECTOR_WORDS); | 661 | hwif->ata_input_data(drive, id, SECTOR_WORDS); |
662 | (void)ide_read_status(drive); /* clear drive IRQ */ | 662 | (void)ide_read_status(drive); /* clear drive IRQ */ |
663 | local_irq_enable(); | 663 | local_irq_enable(); |
664 | local_irq_restore(flags); | 664 | local_irq_restore(flags); |
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c index b163b2e52212..c14bb5380c25 100644 --- a/drivers/ide/ide-pnp.c +++ b/drivers/ide/ide-pnp.c | |||
@@ -86,3 +86,5 @@ static void __exit pnpide_exit(void) | |||
86 | 86 | ||
87 | module_init(pnpide_init); | 87 | module_init(pnpide_init); |
88 | module_exit(pnpide_exit); | 88 | module_exit(pnpide_exit); |
89 | |||
90 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c index 50ffa871d5e9..fdd3791e465f 100644 --- a/drivers/ide/legacy/buddha.c +++ b/drivers/ide/legacy/buddha.c | |||
@@ -241,3 +241,5 @@ fail_base2: | |||
241 | } | 241 | } |
242 | 242 | ||
243 | module_init(buddha_init); | 243 | module_init(buddha_init); |
244 | |||
245 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c index 8949ce71bddc..e950afa5939c 100644 --- a/drivers/ide/legacy/falconide.c +++ b/drivers/ide/legacy/falconide.c | |||
@@ -93,3 +93,5 @@ static int __init falconide_init(void) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | module_init(falconide_init); | 95 | module_init(falconide_init); |
96 | |||
97 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c index b7d81090d5da..e3b4638cc883 100644 --- a/drivers/ide/legacy/gayle.c +++ b/drivers/ide/legacy/gayle.c | |||
@@ -195,3 +195,5 @@ found: | |||
195 | } | 195 | } |
196 | 196 | ||
197 | module_init(gayle_init); | 197 | module_init(gayle_init); |
198 | |||
199 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c index 9a79098d9eb4..eaf5dbe58bc2 100644 --- a/drivers/ide/legacy/macide.c +++ b/drivers/ide/legacy/macide.c | |||
@@ -137,3 +137,5 @@ static int __init macide_init(void) | |||
137 | } | 137 | } |
138 | 138 | ||
139 | module_init(macide_init); | 139 | module_init(macide_init); |
140 | |||
141 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c index 1381b91bc316..2da28759686e 100644 --- a/drivers/ide/legacy/q40ide.c +++ b/drivers/ide/legacy/q40ide.c | |||
@@ -153,3 +153,5 @@ static int __init q40ide_init(void) | |||
153 | } | 153 | } |
154 | 154 | ||
155 | module_init(q40ide_init); | 155 | module_init(q40ide_init); |
156 | |||
157 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c index ec667982809c..29fbc5ead03b 100644 --- a/drivers/ide/pci/cmd640.c +++ b/drivers/ide/pci/cmd640.c | |||
@@ -881,3 +881,5 @@ module_param_named(probe_vlb, cmd640_vlb, bool, 0); | |||
881 | MODULE_PARM_DESC(probe_vlb, "probe for VLB version of CMD640 chipset"); | 881 | MODULE_PARM_DESC(probe_vlb, "probe for VLB version of CMD640 chipset"); |
882 | 882 | ||
883 | module_init(cmd640x_init); | 883 | module_init(cmd640x_init); |
884 | |||
885 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c index 38fbfb8d5445..ebaba01c7551 100644 --- a/drivers/ide/ppc/mpc8xx.c +++ b/drivers/ide/ppc/mpc8xx.c | |||
@@ -853,3 +853,5 @@ static int __init mpc8xx_ide_probe(void) | |||
853 | } | 853 | } |
854 | 854 | ||
855 | module_init(mpc8xx_ide_probe); | 855 | module_init(mpc8xx_ide_probe); |
856 | |||
857 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 78c9eeb85634..d9ca52e6cdab 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -1771,3 +1771,5 @@ static int __devinit pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) | |||
1771 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ | 1771 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ |
1772 | 1772 | ||
1773 | module_init(pmac_ide_probe); | 1773 | module_init(pmac_ide_probe); |
1774 | |||
1775 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 54c662690f65..853bce0ac478 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -4329,10 +4329,14 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4329 | if (!hw) | 4329 | if (!hw) |
4330 | return 0; | 4330 | return 0; |
4331 | 4331 | ||
4332 | del_timer_sync(&hw->watchdog_timer); | ||
4333 | cancel_work_sync(&hw->restart_work); | ||
4334 | |||
4332 | for (i = 0; i < hw->ports; i++) { | 4335 | for (i = 0; i < hw->ports; i++) { |
4333 | struct net_device *dev = hw->dev[i]; | 4336 | struct net_device *dev = hw->dev[i]; |
4334 | struct sky2_port *sky2 = netdev_priv(dev); | 4337 | struct sky2_port *sky2 = netdev_priv(dev); |
4335 | 4338 | ||
4339 | netif_device_detach(dev); | ||
4336 | if (netif_running(dev)) | 4340 | if (netif_running(dev)) |
4337 | sky2_down(dev); | 4341 | sky2_down(dev); |
4338 | 4342 | ||
@@ -4383,6 +4387,8 @@ static int sky2_resume(struct pci_dev *pdev) | |||
4383 | 4387 | ||
4384 | for (i = 0; i < hw->ports; i++) { | 4388 | for (i = 0; i < hw->ports; i++) { |
4385 | struct net_device *dev = hw->dev[i]; | 4389 | struct net_device *dev = hw->dev[i]; |
4390 | |||
4391 | netif_device_attach(dev); | ||
4386 | if (netif_running(dev)) { | 4392 | if (netif_running(dev)) { |
4387 | err = sky2_up(dev); | 4393 | err = sky2_up(dev); |
4388 | if (err) { | 4394 | if (err) { |
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index d57bf3e708d8..430997e33fc4 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
@@ -96,6 +96,7 @@ | |||
96 | 96 | ||
97 | /* PDC registers */ | 97 | /* PDC registers */ |
98 | #define UART_PUT_PTCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR) | 98 | #define UART_PUT_PTCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR) |
99 | #define UART_GET_TCR(port) __raw_readl((port)->membase + ATMEL_PDC_TCR) | ||
99 | #define UART_GET_PTSR(port) __raw_readl((port)->membase + ATMEL_PDC_PTSR) | 100 | #define UART_GET_PTSR(port) __raw_readl((port)->membase + ATMEL_PDC_PTSR) |
100 | 101 | ||
101 | #define UART_PUT_RPR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_RPR) | 102 | #define UART_PUT_RPR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_RPR) |
@@ -106,6 +107,7 @@ | |||
106 | 107 | ||
107 | #define UART_PUT_TPR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TPR) | 108 | #define UART_PUT_TPR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TPR) |
108 | #define UART_PUT_TCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TCR) | 109 | #define UART_PUT_TCR(port,v) __raw_writel(v, (port)->membase + ATMEL_PDC_TCR) |
110 | #define UART_GET_TCR(port) __raw_readl((port)->membase + ATMEL_PDC_TCR) | ||
109 | 111 | ||
110 | static int (*atmel_open_hook)(struct uart_port *); | 112 | static int (*atmel_open_hook)(struct uart_port *); |
111 | static void (*atmel_close_hook)(struct uart_port *); | 113 | static void (*atmel_close_hook)(struct uart_port *); |
@@ -562,17 +564,22 @@ static void atmel_tx_dma(struct uart_port *port) | |||
562 | struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; | 564 | struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; |
563 | int count; | 565 | int count; |
564 | 566 | ||
567 | /* nothing left to transmit? */ | ||
568 | if (UART_GET_TCR(port)) | ||
569 | return; | ||
570 | |||
565 | xmit->tail += pdc->ofs; | 571 | xmit->tail += pdc->ofs; |
566 | xmit->tail &= UART_XMIT_SIZE - 1; | 572 | xmit->tail &= UART_XMIT_SIZE - 1; |
567 | 573 | ||
568 | port->icount.tx += pdc->ofs; | 574 | port->icount.tx += pdc->ofs; |
569 | pdc->ofs = 0; | 575 | pdc->ofs = 0; |
570 | 576 | ||
571 | if (!uart_circ_empty(xmit)) { | 577 | /* more to transmit - setup next transfer */ |
572 | /* more to transmit - setup next transfer */ | ||
573 | 578 | ||
574 | /* disable PDC transmit */ | 579 | /* disable PDC transmit */ |
575 | UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); | 580 | UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); |
581 | |||
582 | if (!uart_circ_empty(xmit)) { | ||
576 | dma_sync_single_for_device(port->dev, | 583 | dma_sync_single_for_device(port->dev, |
577 | pdc->dma_addr, | 584 | pdc->dma_addr, |
578 | pdc->dma_size, | 585 | pdc->dma_size, |
@@ -586,11 +593,6 @@ static void atmel_tx_dma(struct uart_port *port) | |||
586 | /* re-enable PDC transmit and interrupts */ | 593 | /* re-enable PDC transmit and interrupts */ |
587 | UART_PUT_PTCR(port, ATMEL_PDC_TXTEN); | 594 | UART_PUT_PTCR(port, ATMEL_PDC_TXTEN); |
588 | UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE); | 595 | UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE); |
589 | } else { | ||
590 | /* nothing left to transmit - disable the transmitter */ | ||
591 | |||
592 | /* disable PDC transmit */ | ||
593 | UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); | ||
594 | } | 596 | } |
595 | 597 | ||
596 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 598 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
@@ -1274,6 +1276,7 @@ static void atmel_console_write(struct console *co, const char *s, u_int count) | |||
1274 | { | 1276 | { |
1275 | struct uart_port *port = &atmel_ports[co->index].uart; | 1277 | struct uart_port *port = &atmel_ports[co->index].uart; |
1276 | unsigned int status, imr; | 1278 | unsigned int status, imr; |
1279 | unsigned int pdc_tx; | ||
1277 | 1280 | ||
1278 | /* | 1281 | /* |
1279 | * First, save IMR and then disable interrupts | 1282 | * First, save IMR and then disable interrupts |
@@ -1281,6 +1284,10 @@ static void atmel_console_write(struct console *co, const char *s, u_int count) | |||
1281 | imr = UART_GET_IMR(port); | 1284 | imr = UART_GET_IMR(port); |
1282 | UART_PUT_IDR(port, ATMEL_US_RXRDY | ATMEL_US_TXRDY); | 1285 | UART_PUT_IDR(port, ATMEL_US_RXRDY | ATMEL_US_TXRDY); |
1283 | 1286 | ||
1287 | /* Store PDC transmit status and disable it */ | ||
1288 | pdc_tx = UART_GET_PTSR(port) & ATMEL_PDC_TXTEN; | ||
1289 | UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); | ||
1290 | |||
1284 | uart_console_write(port, s, count, atmel_console_putchar); | 1291 | uart_console_write(port, s, count, atmel_console_putchar); |
1285 | 1292 | ||
1286 | /* | 1293 | /* |
@@ -1290,6 +1297,11 @@ static void atmel_console_write(struct console *co, const char *s, u_int count) | |||
1290 | do { | 1297 | do { |
1291 | status = UART_GET_CSR(port); | 1298 | status = UART_GET_CSR(port); |
1292 | } while (!(status & ATMEL_US_TXRDY)); | 1299 | } while (!(status & ATMEL_US_TXRDY)); |
1300 | |||
1301 | /* Restore PDC transmit status */ | ||
1302 | if (pdc_tx) | ||
1303 | UART_PUT_PTCR(port, ATMEL_PDC_TXTEN); | ||
1304 | |||
1293 | /* set interrupts back the way they were */ | 1305 | /* set interrupts back the way they were */ |
1294 | UART_PUT_IER(port, imr); | 1306 | UART_PUT_IER(port, imr); |
1295 | } | 1307 | } |
diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 79e19e5958e1..a8e7797b9477 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c | |||
@@ -140,7 +140,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino) | |||
140 | brelse(bh); | 140 | brelse(bh); |
141 | 141 | ||
142 | #ifdef DEBUG | 142 | #ifdef DEBUG |
143 | printk(KERN_DEBUG "EFS: read_inode(): inode %lu, extents %d, mode %o\n", | 143 | printk(KERN_DEBUG "EFS: efs_iget(): inode %lu, extents %d, mode %o\n", |
144 | inode->i_ino, in->numextents, inode->i_mode); | 144 | inode->i_ino, in->numextents, inode->i_mode); |
145 | #endif | 145 | #endif |
146 | 146 | ||
diff --git a/include/asm-alpha/current.h b/include/asm-alpha/current.h index 8d88a13c1bec..094d285a1b34 100644 --- a/include/asm-alpha/current.h +++ b/include/asm-alpha/current.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/thread_info.h> | 4 | #include <linux/thread_info.h> |
5 | 5 | ||
6 | #define get_current() (current_thread_info()->task + 0) | 6 | #define get_current() (current_thread_info()->task) |
7 | #define current get_current() | 7 | #define current get_current() |
8 | 8 | ||
9 | #endif /* _ALPHA_CURRENT_H */ | 9 | #endif /* _ALPHA_CURRENT_H */ |
diff --git a/include/asm-alpha/dma-mapping.h b/include/asm-alpha/dma-mapping.h index 75a1aff5b57b..db351d1296f4 100644 --- a/include/asm-alpha/dma-mapping.h +++ b/include/asm-alpha/dma-mapping.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #define dma_unmap_single(dev, addr, size, dir) \ | 11 | #define dma_unmap_single(dev, addr, size, dir) \ |
12 | pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir) | 12 | pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir) |
13 | #define dma_alloc_coherent(dev, size, addr, gfp) \ | 13 | #define dma_alloc_coherent(dev, size, addr, gfp) \ |
14 | pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr) | 14 | __pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr, gfp) |
15 | #define dma_free_coherent(dev, size, va, addr) \ | 15 | #define dma_free_coherent(dev, size, va, addr) \ |
16 | pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr) | 16 | pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr) |
17 | #define dma_map_page(dev, page, off, size, dir) \ | 17 | #define dma_map_page(dev, page, off, size, dir) \ |
diff --git a/include/asm-alpha/kvm.h b/include/asm-alpha/kvm.h new file mode 100644 index 000000000000..b9daec429689 --- /dev/null +++ b/include/asm-alpha/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_ALPHA_H | ||
2 | #define __LINUX_KVM_ALPHA_H | ||
3 | |||
4 | /* alpha does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h index d5b10ef64364..d31fd49ff79a 100644 --- a/include/asm-alpha/pci.h +++ b/include/asm-alpha/pci.h | |||
@@ -76,7 +76,13 @@ extern inline void pcibios_penalize_isa_irq(int irq, int active) | |||
76 | successful and sets *DMA_ADDRP to the pci side dma address as well, | 76 | successful and sets *DMA_ADDRP to the pci side dma address as well, |
77 | else DMA_ADDRP is undefined. */ | 77 | else DMA_ADDRP is undefined. */ |
78 | 78 | ||
79 | extern void *pci_alloc_consistent(struct pci_dev *, size_t, dma_addr_t *); | 79 | extern void *__pci_alloc_consistent(struct pci_dev *, size_t, |
80 | dma_addr_t *, gfp_t); | ||
81 | static inline void * | ||
82 | pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma) | ||
83 | { | ||
84 | return __pci_alloc_consistent(dev, size, dma, GFP_ATOMIC); | ||
85 | } | ||
80 | 86 | ||
81 | /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must | 87 | /* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must |
82 | be values that were returned from pci_alloc_consistent. SIZE must | 88 | be values that were returned from pci_alloc_consistent. SIZE must |
diff --git a/include/asm-arm/kvm.h b/include/asm-arm/kvm.h new file mode 100644 index 000000000000..cb3c08cbcb9e --- /dev/null +++ b/include/asm-arm/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_ARM_H | ||
2 | #define __LINUX_KVM_ARM_H | ||
3 | |||
4 | /* arm does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-avr32/kvm.h b/include/asm-avr32/kvm.h new file mode 100644 index 000000000000..8c5777020e2c --- /dev/null +++ b/include/asm-avr32/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_AVR32_H | ||
2 | #define __LINUX_KVM_AVR32_H | ||
3 | |||
4 | /* avr32 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-blackfin/kvm.h b/include/asm-blackfin/kvm.h new file mode 100644 index 000000000000..e3477d77c014 --- /dev/null +++ b/include/asm-blackfin/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_BLACKFIN_H | ||
2 | #define __LINUX_KVM_BLACKFIN_H | ||
3 | |||
4 | /* blackfin does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-cris/kvm.h b/include/asm-cris/kvm.h new file mode 100644 index 000000000000..c860f51149f0 --- /dev/null +++ b/include/asm-cris/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_CRIS_H | ||
2 | #define __LINUX_KVM_CRIS_H | ||
3 | |||
4 | /* cris does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-frv/kvm.h b/include/asm-frv/kvm.h new file mode 100644 index 000000000000..9c8a4f08d0a9 --- /dev/null +++ b/include/asm-frv/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_FRV_H | ||
2 | #define __LINUX_KVM_FRV_H | ||
3 | |||
4 | /* frv does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-generic/Kbuild.asm b/include/asm-generic/Kbuild.asm index fd9dcfd91c39..92a6d91d0c1a 100644 --- a/include/asm-generic/Kbuild.asm +++ b/include/asm-generic/Kbuild.asm | |||
@@ -1,3 +1,5 @@ | |||
1 | header-y += kvm.h | ||
2 | |||
1 | ifeq ($(wildcard include/asm-$(SRCARCH)/a.out.h),include/asm-$(SRCARCH)/a.out.h) | 3 | ifeq ($(wildcard include/asm-$(SRCARCH)/a.out.h),include/asm-$(SRCARCH)/a.out.h) |
2 | unifdef-y += a.out.h | 4 | unifdef-y += a.out.h |
3 | endif | 5 | endif |
diff --git a/include/asm-h8300/kvm.h b/include/asm-h8300/kvm.h new file mode 100644 index 000000000000..bdbed7b987e1 --- /dev/null +++ b/include/asm-h8300/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_H8300_H | ||
2 | #define __LINUX_KVM_H8300_H | ||
3 | |||
4 | /* h8300 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-ia64/kvm.h b/include/asm-ia64/kvm.h new file mode 100644 index 000000000000..030d29b4b26b --- /dev/null +++ b/include/asm-ia64/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_IA64_H | ||
2 | #define __LINUX_KVM_IA64_H | ||
3 | |||
4 | /* ia64 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-m32r/kvm.h b/include/asm-m32r/kvm.h new file mode 100644 index 000000000000..99a40515b77e --- /dev/null +++ b/include/asm-m32r/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_M32R_H | ||
2 | #define __LINUX_KVM_M32R_H | ||
3 | |||
4 | /* m32r does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-m68k/kvm.h b/include/asm-m68k/kvm.h new file mode 100644 index 000000000000..7ed27fce5240 --- /dev/null +++ b/include/asm-m68k/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_M68K_H | ||
2 | #define __LINUX_KVM_M68K_H | ||
3 | |||
4 | /* m68k does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-m68knommu/kvm.h b/include/asm-m68knommu/kvm.h new file mode 100644 index 000000000000..b49d4258dabb --- /dev/null +++ b/include/asm-m68knommu/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_M68KNOMMU_H | ||
2 | #define __LINUX_KVM_M68KNOMMU_H | ||
3 | |||
4 | /* m68knommu does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-mips/kvm.h b/include/asm-mips/kvm.h new file mode 100644 index 000000000000..093a5b7f796b --- /dev/null +++ b/include/asm-mips/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_MIPS_H | ||
2 | #define __LINUX_KVM_MIPS_H | ||
3 | |||
4 | /* mips does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-mn10300/kvm.h b/include/asm-mn10300/kvm.h new file mode 100644 index 000000000000..f6b609ff4a57 --- /dev/null +++ b/include/asm-mn10300/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_MN10300_H | ||
2 | #define __LINUX_KVM_MN10300_H | ||
3 | |||
4 | /* mn10300 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-parisc/kvm.h b/include/asm-parisc/kvm.h new file mode 100644 index 000000000000..00cc45812547 --- /dev/null +++ b/include/asm-parisc/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_PARISC_H | ||
2 | #define __LINUX_KVM_PARISC_H | ||
3 | |||
4 | /* parisc does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-powerpc/kvm.h b/include/asm-powerpc/kvm.h new file mode 100644 index 000000000000..d1b530fbf8dd --- /dev/null +++ b/include/asm-powerpc/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_POWERPC_H | ||
2 | #define __LINUX_KVM_POWERPC_H | ||
3 | |||
4 | /* powerpc does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-s390/kvm.h b/include/asm-s390/kvm.h new file mode 100644 index 000000000000..573f2a351386 --- /dev/null +++ b/include/asm-s390/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_S390_H | ||
2 | #define __LINUX_KVM_S390_H | ||
3 | |||
4 | /* s390 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-sh/kvm.h b/include/asm-sh/kvm.h new file mode 100644 index 000000000000..6af51dbab2d0 --- /dev/null +++ b/include/asm-sh/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_SH_H | ||
2 | #define __LINUX_KVM_SH_H | ||
3 | |||
4 | /* sh does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-sparc/kvm.h b/include/asm-sparc/kvm.h new file mode 100644 index 000000000000..2e5478da3819 --- /dev/null +++ b/include/asm-sparc/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_SPARC_H | ||
2 | #define __LINUX_KVM_SPARC_H | ||
3 | |||
4 | /* sparc does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-sparc64/kvm.h b/include/asm-sparc64/kvm.h new file mode 100644 index 000000000000..380537a77bf9 --- /dev/null +++ b/include/asm-sparc64/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_SPARC64_H | ||
2 | #define __LINUX_KVM_SPARC64_H | ||
3 | |||
4 | /* sparc64 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-um/kvm.h b/include/asm-um/kvm.h new file mode 100644 index 000000000000..66aa77094551 --- /dev/null +++ b/include/asm-um/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_UM_H | ||
2 | #define __LINUX_KVM_UM_H | ||
3 | |||
4 | /* um does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-v850/kvm.h b/include/asm-v850/kvm.h new file mode 100644 index 000000000000..3f729b79febc --- /dev/null +++ b/include/asm-v850/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_V850_H | ||
2 | #define __LINUX_KVM_V850_H | ||
3 | |||
4 | /* v850 does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-xtensa/kvm.h b/include/asm-xtensa/kvm.h new file mode 100644 index 000000000000..bda4e331e98c --- /dev/null +++ b/include/asm-xtensa/kvm.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __LINUX_KVM_XTENSA_H | ||
2 | #define __LINUX_KVM_XTENSA_H | ||
3 | |||
4 | /* xtensa does not support KVM */ | ||
5 | |||
6 | #endif | ||
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 4a446a19295e..9cdd12a9e843 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -253,7 +253,7 @@ unifdef-y += kd.h | |||
253 | unifdef-y += kernelcapi.h | 253 | unifdef-y += kernelcapi.h |
254 | unifdef-y += kernel.h | 254 | unifdef-y += kernel.h |
255 | unifdef-y += keyboard.h | 255 | unifdef-y += keyboard.h |
256 | unifdef-$(CONFIG_HAVE_KVM) += kvm.h | 256 | unifdef-y += kvm.h |
257 | unifdef-y += llc.h | 257 | unifdef-y += llc.h |
258 | unifdef-y += loop.h | 258 | unifdef-y += loop.h |
259 | unifdef-y += lp.h | 259 | unifdef-y += lp.h |
diff --git a/kernel/marker.c b/kernel/marker.c index 041c33e3e95c..005b95954593 100644 --- a/kernel/marker.c +++ b/kernel/marker.c | |||
@@ -671,6 +671,9 @@ int marker_probe_register(const char *name, const char *format, | |||
671 | entry->rcu_pending = 1; | 671 | entry->rcu_pending = 1; |
672 | /* write rcu_pending before calling the RCU callback */ | 672 | /* write rcu_pending before calling the RCU callback */ |
673 | smp_wmb(); | 673 | smp_wmb(); |
674 | #ifdef CONFIG_PREEMPT_RCU | ||
675 | synchronize_sched(); /* Until we have the call_rcu_sched() */ | ||
676 | #endif | ||
674 | call_rcu(&entry->rcu, free_old_closure); | 677 | call_rcu(&entry->rcu, free_old_closure); |
675 | end: | 678 | end: |
676 | mutex_unlock(&markers_mutex); | 679 | mutex_unlock(&markers_mutex); |
@@ -714,6 +717,9 @@ int marker_probe_unregister(const char *name, | |||
714 | entry->rcu_pending = 1; | 717 | entry->rcu_pending = 1; |
715 | /* write rcu_pending before calling the RCU callback */ | 718 | /* write rcu_pending before calling the RCU callback */ |
716 | smp_wmb(); | 719 | smp_wmb(); |
720 | #ifdef CONFIG_PREEMPT_RCU | ||
721 | synchronize_sched(); /* Until we have the call_rcu_sched() */ | ||
722 | #endif | ||
717 | call_rcu(&entry->rcu, free_old_closure); | 723 | call_rcu(&entry->rcu, free_old_closure); |
718 | remove_marker(name); /* Ignore busy error message */ | 724 | remove_marker(name); /* Ignore busy error message */ |
719 | ret = 0; | 725 | ret = 0; |
@@ -792,6 +798,9 @@ int marker_probe_unregister_private_data(marker_probe_func *probe, | |||
792 | entry->rcu_pending = 1; | 798 | entry->rcu_pending = 1; |
793 | /* write rcu_pending before calling the RCU callback */ | 799 | /* write rcu_pending before calling the RCU callback */ |
794 | smp_wmb(); | 800 | smp_wmb(); |
801 | #ifdef CONFIG_PREEMPT_RCU | ||
802 | synchronize_sched(); /* Until we have the call_rcu_sched() */ | ||
803 | #endif | ||
795 | call_rcu(&entry->rcu, free_old_closure); | 804 | call_rcu(&entry->rcu, free_old_closure); |
796 | remove_marker(entry->name); /* Ignore busy error message */ | 805 | remove_marker(entry->name); /* Ignore busy error message */ |
797 | end: | 806 | end: |