diff options
32 files changed, 398 insertions, 222 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 87851efb0228..d1cd5f93e028 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -120,6 +120,13 @@ Who: Adrian Bunk <bunk@stusta.de> | |||
120 | 120 | ||
121 | --------------------------- | 121 | --------------------------- |
122 | 122 | ||
123 | What: drivers depending on OSS_OBSOLETE_DRIVER | ||
124 | When: options in 2.6.20, code in 2.6.22 | ||
125 | Why: OSS drivers with ALSA replacements | ||
126 | Who: Adrian Bunk <bunk@stusta.de> | ||
127 | |||
128 | --------------------------- | ||
129 | |||
123 | What: pci_module_init(driver) | 130 | What: pci_module_init(driver) |
124 | When: January 2007 | 131 | When: January 2007 |
125 | Why: Is replaced by pci_register_driver(pci_driver). | 132 | Why: Is replaced by pci_register_driver(pci_driver). |
diff --git a/arch/i386/kernel/hpet.c b/arch/i386/kernel/hpet.c index c6737c35815d..17647a530b2f 100644 --- a/arch/i386/kernel/hpet.c +++ b/arch/i386/kernel/hpet.c | |||
@@ -35,7 +35,7 @@ static int __init init_hpet_clocksource(void) | |||
35 | void __iomem* hpet_base; | 35 | void __iomem* hpet_base; |
36 | u64 tmp; | 36 | u64 tmp; |
37 | 37 | ||
38 | if (!hpet_address) | 38 | if (!is_hpet_enabled()) |
39 | return -ENODEV; | 39 | return -ENODEV; |
40 | 40 | ||
41 | /* calculate the hpet address: */ | 41 | /* calculate the hpet address: */ |
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c index 060789e31c67..39f7ddb554ea 100644 --- a/arch/powerpc/platforms/powermac/pic.c +++ b/arch/powerpc/platforms/powermac/pic.c | |||
@@ -87,8 +87,8 @@ static void __pmac_retrigger(unsigned int irq_nr) | |||
87 | static void pmac_mask_and_ack_irq(unsigned int virq) | 87 | static void pmac_mask_and_ack_irq(unsigned int virq) |
88 | { | 88 | { |
89 | unsigned int src = irq_map[virq].hwirq; | 89 | unsigned int src = irq_map[virq].hwirq; |
90 | unsigned long bit = 1UL << (virq & 0x1f); | 90 | unsigned long bit = 1UL << (src & 0x1f); |
91 | int i = virq >> 5; | 91 | int i = src >> 5; |
92 | unsigned long flags; | 92 | unsigned long flags; |
93 | 93 | ||
94 | spin_lock_irqsave(&pmac_pic_lock, flags); | 94 | spin_lock_irqsave(&pmac_pic_lock, flags); |
@@ -175,7 +175,7 @@ static void pmac_mask_irq(unsigned int virq) | |||
175 | 175 | ||
176 | spin_lock_irqsave(&pmac_pic_lock, flags); | 176 | spin_lock_irqsave(&pmac_pic_lock, flags); |
177 | __clear_bit(src, ppc_cached_irq_mask); | 177 | __clear_bit(src, ppc_cached_irq_mask); |
178 | __pmac_set_irq_mask(src, 0); | 178 | __pmac_set_irq_mask(src, 1); |
179 | spin_unlock_irqrestore(&pmac_pic_lock, flags); | 179 | spin_unlock_irqrestore(&pmac_pic_lock, flags); |
180 | } | 180 | } |
181 | 181 | ||
diff --git a/arch/xtensa/kernel/ptrace.c b/arch/xtensa/kernel/ptrace.c index 5064d9383963..9aea23cc0dc5 100644 --- a/arch/xtensa/kernel/ptrace.c +++ b/arch/xtensa/kernel/ptrace.c | |||
@@ -212,7 +212,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
212 | */ | 212 | */ |
213 | case PTRACE_KILL: | 213 | case PTRACE_KILL: |
214 | ret = 0; | 214 | ret = 0; |
215 | if (child->state == EXIT_ZOMBIE) /* already dead */ | 215 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ |
216 | break; | 216 | break; |
217 | child->exit_code = SIGKILL; | 217 | child->exit_code = SIGKILL; |
218 | child->ptrace &= ~PT_SINGLESTEP; | 218 | child->ptrace &= ~PT_SINGLESTEP; |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 5109fa37c662..ad1d7065a1b2 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -4177,6 +4177,11 @@ static int __init floppy_init(void) | |||
4177 | int i, unit, drive; | 4177 | int i, unit, drive; |
4178 | int err, dr; | 4178 | int err, dr; |
4179 | 4179 | ||
4180 | #if defined(CONFIG_PPC_MERGE) | ||
4181 | if (check_legacy_ioport(FDC1)) | ||
4182 | return -ENODEV; | ||
4183 | #endif | ||
4184 | |||
4180 | raw_cmd = NULL; | 4185 | raw_cmd = NULL; |
4181 | 4186 | ||
4182 | for (dr = 0; dr < N_DRIVE; dr++) { | 4187 | for (dr = 0; dr < N_DRIVE; dr++) { |
@@ -4234,13 +4239,6 @@ static int __init floppy_init(void) | |||
4234 | } | 4239 | } |
4235 | 4240 | ||
4236 | use_virtual_dma = can_use_virtual_dma & 1; | 4241 | use_virtual_dma = can_use_virtual_dma & 1; |
4237 | #if defined(CONFIG_PPC_MERGE) | ||
4238 | if (check_legacy_ioport(FDC1)) { | ||
4239 | del_timer(&fd_timeout); | ||
4240 | err = -ENODEV; | ||
4241 | goto out_unreg_region; | ||
4242 | } | ||
4243 | #endif | ||
4244 | fdc_state[0].address = FDC1; | 4242 | fdc_state[0].address = FDC1; |
4245 | if (fdc_state[0].address == -1) { | 4243 | if (fdc_state[0].address == -1) { |
4246 | del_timer(&fd_timeout); | 4244 | del_timer(&fd_timeout); |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 0aa5d608fe6f..843d34c8627c 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -3428,6 +3428,7 @@ struct ipmi_recv_msg *ipmi_alloc_recv_msg(void) | |||
3428 | 3428 | ||
3429 | rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC); | 3429 | rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC); |
3430 | if (rv) { | 3430 | if (rv) { |
3431 | rv->user = NULL; | ||
3431 | rv->done = free_recv_msg; | 3432 | rv->done = free_recv_msg; |
3432 | atomic_inc(&recv_msg_inuse_count); | 3433 | atomic_inc(&recv_msg_inuse_count); |
3433 | } | 3434 | } |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index b2dbbdb1bf81..2f07b085536b 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
@@ -391,8 +391,8 @@ static MGSL_PARAMS default_params = { | |||
391 | #define DESC_LIST_SIZE 4096 | 391 | #define DESC_LIST_SIZE 4096 |
392 | 392 | ||
393 | #define MASK_PARITY BIT1 | 393 | #define MASK_PARITY BIT1 |
394 | #define MASK_FRAMING BIT2 | 394 | #define MASK_FRAMING BIT0 |
395 | #define MASK_BREAK BIT3 | 395 | #define MASK_BREAK BIT14 |
396 | #define MASK_OVERRUN BIT4 | 396 | #define MASK_OVERRUN BIT4 |
397 | 397 | ||
398 | #define GSR 0x00 /* global status */ | 398 | #define GSR 0x00 /* global status */ |
@@ -1800,17 +1800,17 @@ static void rx_async(struct slgt_info *info) | |||
1800 | 1800 | ||
1801 | stat = 0; | 1801 | stat = 0; |
1802 | 1802 | ||
1803 | if ((status = *(p+1) & (BIT9 + BIT8))) { | 1803 | if ((status = *(p+1) & (BIT1 + BIT0))) { |
1804 | if (status & BIT9) | 1804 | if (status & BIT1) |
1805 | icount->parity++; | 1805 | icount->parity++; |
1806 | else if (status & BIT8) | 1806 | else if (status & BIT0) |
1807 | icount->frame++; | 1807 | icount->frame++; |
1808 | /* discard char if tty control flags say so */ | 1808 | /* discard char if tty control flags say so */ |
1809 | if (status & info->ignore_status_mask) | 1809 | if (status & info->ignore_status_mask) |
1810 | continue; | 1810 | continue; |
1811 | if (status & BIT9) | 1811 | if (status & BIT1) |
1812 | stat = TTY_PARITY; | 1812 | stat = TTY_PARITY; |
1813 | else if (status & BIT8) | 1813 | else if (status & BIT0) |
1814 | stat = TTY_FRAME; | 1814 | stat = TTY_FRAME; |
1815 | } | 1815 | } |
1816 | if (tty) { | 1816 | if (tty) { |
diff --git a/drivers/char/watchdog/sbc8360.c b/drivers/char/watchdog/sbc8360.c index 1035be5b5019..41fc6f80c493 100644 --- a/drivers/char/watchdog/sbc8360.c +++ b/drivers/char/watchdog/sbc8360.c | |||
@@ -200,7 +200,7 @@ static int wd_margin = 0xB; | |||
200 | static int wd_multiplier = 2; | 200 | static int wd_multiplier = 2; |
201 | static int nowayout = WATCHDOG_NOWAYOUT; | 201 | static int nowayout = WATCHDOG_NOWAYOUT; |
202 | 202 | ||
203 | module_param(timeout, int, 27); | 203 | module_param(timeout, int, 0); |
204 | MODULE_PARM_DESC(timeout, "Index into timeout table (0-63) (default=27 (60s))"); | 204 | MODULE_PARM_DESC(timeout, "Index into timeout table (0-63) (default=27 (60s))"); |
205 | module_param(nowayout, int, 0); | 205 | module_param(nowayout, int, 0); |
206 | MODULE_PARM_DESC(nowayout, | 206 | MODULE_PARM_DESC(nowayout, |
@@ -407,7 +407,7 @@ module_exit(sbc8360_exit); | |||
407 | MODULE_AUTHOR("Ian E. Morgan <imorgan@webcon.ca>"); | 407 | MODULE_AUTHOR("Ian E. Morgan <imorgan@webcon.ca>"); |
408 | MODULE_DESCRIPTION("SBC8360 watchdog driver"); | 408 | MODULE_DESCRIPTION("SBC8360 watchdog driver"); |
409 | MODULE_LICENSE("GPL"); | 409 | MODULE_LICENSE("GPL"); |
410 | MODULE_VERSION("1.0"); | 410 | MODULE_VERSION("1.01"); |
411 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 411 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
412 | 412 | ||
413 | /* end of sbc8360.c */ | 413 | /* end of sbc8360.c */ |
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index e125032bb403..d8a0d87df734 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -367,12 +367,13 @@ sgiioc4_INB(unsigned long port) | |||
367 | static void __devinit | 367 | static void __devinit |
368 | ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) | 368 | ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) |
369 | { | 369 | { |
370 | void __iomem *virt_dma_base; | ||
370 | int num_ports = sizeof (ioc4_dma_regs_t); | 371 | int num_ports = sizeof (ioc4_dma_regs_t); |
371 | 372 | ||
372 | printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, | 373 | printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, |
373 | dma_base, dma_base + num_ports - 1); | 374 | dma_base, dma_base + num_ports - 1); |
374 | 375 | ||
375 | if (!request_region(dma_base, num_ports, hwif->name)) { | 376 | if (!request_mem_region(dma_base, num_ports, hwif->name)) { |
376 | printk(KERN_ERR | 377 | printk(KERN_ERR |
377 | "%s(%s) -- ERROR, Addresses 0x%p to 0x%p " | 378 | "%s(%s) -- ERROR, Addresses 0x%p to 0x%p " |
378 | "ALREADY in use\n", | 379 | "ALREADY in use\n", |
@@ -381,13 +382,21 @@ ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) | |||
381 | goto dma_alloc_failure; | 382 | goto dma_alloc_failure; |
382 | } | 383 | } |
383 | 384 | ||
384 | hwif->dma_base = dma_base; | 385 | virt_dma_base = ioremap(dma_base, num_ports); |
386 | if (virt_dma_base == NULL) { | ||
387 | printk(KERN_ERR | ||
388 | "%s(%s) -- ERROR, Unable to map addresses 0x%lx to 0x%lx\n", | ||
389 | __FUNCTION__, hwif->name, dma_base, dma_base + num_ports - 1); | ||
390 | goto dma_remap_failure; | ||
391 | } | ||
392 | hwif->dma_base = (unsigned long) virt_dma_base; | ||
393 | |||
385 | hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev, | 394 | hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev, |
386 | IOC4_PRD_ENTRIES * IOC4_PRD_BYTES, | 395 | IOC4_PRD_ENTRIES * IOC4_PRD_BYTES, |
387 | &hwif->dmatable_dma); | 396 | &hwif->dmatable_dma); |
388 | 397 | ||
389 | if (!hwif->dmatable_cpu) | 398 | if (!hwif->dmatable_cpu) |
390 | goto dma_alloc_failure; | 399 | goto dma_pci_alloc_failure; |
391 | 400 | ||
392 | hwif->sg_max_nents = IOC4_PRD_ENTRIES; | 401 | hwif->sg_max_nents = IOC4_PRD_ENTRIES; |
393 | 402 | ||
@@ -411,6 +420,12 @@ dma_base2alloc_failure: | |||
411 | printk(KERN_INFO | 420 | printk(KERN_INFO |
412 | "Changing from DMA to PIO mode for Drive %s\n", hwif->name); | 421 | "Changing from DMA to PIO mode for Drive %s\n", hwif->name); |
413 | 422 | ||
423 | dma_pci_alloc_failure: | ||
424 | iounmap(virt_dma_base); | ||
425 | |||
426 | dma_remap_failure: | ||
427 | release_mem_region(dma_base, num_ports); | ||
428 | |||
414 | dma_alloc_failure: | 429 | dma_alloc_failure: |
415 | /* Disable DMA because we couldnot allocate any DMA maps */ | 430 | /* Disable DMA because we couldnot allocate any DMA maps */ |
416 | hwif->autodma = 0; | 431 | hwif->autodma = 0; |
@@ -607,18 +622,15 @@ ide_init_sgiioc4(ide_hwif_t * hwif) | |||
607 | hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq; | 622 | hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq; |
608 | hwif->ide_dma_timeout = &__ide_dma_timeout; | 623 | hwif->ide_dma_timeout = &__ide_dma_timeout; |
609 | 624 | ||
610 | /* | ||
611 | * The IOC4 uses MMIO rather than Port IO. | ||
612 | * It also needs special workarounds for INB. | ||
613 | */ | ||
614 | default_hwif_mmiops(hwif); | ||
615 | hwif->INB = &sgiioc4_INB; | 625 | hwif->INB = &sgiioc4_INB; |
616 | } | 626 | } |
617 | 627 | ||
618 | static int __devinit | 628 | static int __devinit |
619 | sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d) | 629 | sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d) |
620 | { | 630 | { |
621 | unsigned long base, ctl, dma_base, irqport; | 631 | unsigned long cmd_base, dma_base, irqport; |
632 | unsigned long bar0, cmd_phys_base, ctl; | ||
633 | void __iomem *virt_base; | ||
622 | ide_hwif_t *hwif; | 634 | ide_hwif_t *hwif; |
623 | int h; | 635 | int h; |
624 | 636 | ||
@@ -636,23 +648,32 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d) | |||
636 | } | 648 | } |
637 | 649 | ||
638 | /* Get the CmdBlk and CtrlBlk Base Registers */ | 650 | /* Get the CmdBlk and CtrlBlk Base Registers */ |
639 | base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET; | 651 | bar0 = pci_resource_start(dev, 0); |
640 | ctl = pci_resource_start(dev, 0) + IOC4_CTRL_OFFSET; | 652 | virt_base = ioremap(bar0, pci_resource_len(dev, 0)); |
641 | irqport = pci_resource_start(dev, 0) + IOC4_INTR_OFFSET; | 653 | if (virt_base == NULL) { |
654 | printk(KERN_ERR "%s: Unable to remap BAR 0 address: 0x%lx\n", | ||
655 | d->name, bar0); | ||
656 | return -ENOMEM; | ||
657 | } | ||
658 | cmd_base = (unsigned long) virt_base + IOC4_CMD_OFFSET; | ||
659 | ctl = (unsigned long) virt_base + IOC4_CTRL_OFFSET; | ||
660 | irqport = (unsigned long) virt_base + IOC4_INTR_OFFSET; | ||
642 | dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; | 661 | dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; |
643 | 662 | ||
644 | if (!request_region(base, IOC4_CMD_CTL_BLK_SIZE, hwif->name)) { | 663 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; |
664 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | ||
665 | hwif->name)) { | ||
645 | printk(KERN_ERR | 666 | printk(KERN_ERR |
646 | "%s : %s -- ERROR, Port Addresses " | 667 | "%s : %s -- ERROR, Addresses " |
647 | "0x%p to 0x%p ALREADY in use\n", | 668 | "0x%p to 0x%p ALREADY in use\n", |
648 | __FUNCTION__, hwif->name, (void *) base, | 669 | __FUNCTION__, hwif->name, (void *) cmd_phys_base, |
649 | (void *) base + IOC4_CMD_CTL_BLK_SIZE); | 670 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); |
650 | return -ENOMEM; | 671 | return -ENOMEM; |
651 | } | 672 | } |
652 | 673 | ||
653 | if (hwif->io_ports[IDE_DATA_OFFSET] != base) { | 674 | if (hwif->io_ports[IDE_DATA_OFFSET] != cmd_base) { |
654 | /* Initialize the IO registers */ | 675 | /* Initialize the IO registers */ |
655 | sgiioc4_init_hwif_ports(&hwif->hw, base, ctl, irqport); | 676 | sgiioc4_init_hwif_ports(&hwif->hw, cmd_base, ctl, irqport); |
656 | memcpy(hwif->io_ports, hwif->hw.io_ports, | 677 | memcpy(hwif->io_ports, hwif->hw.io_ports, |
657 | sizeof (hwif->io_ports)); | 678 | sizeof (hwif->io_ports)); |
658 | hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET]; | 679 | hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET]; |
@@ -665,6 +686,9 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d) | |||
665 | hwif->cds = (struct ide_pci_device_s *) d; | 686 | hwif->cds = (struct ide_pci_device_s *) d; |
666 | hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */ | 687 | hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */ |
667 | 688 | ||
689 | /* The IOC4 uses MMIO rather than Port IO. */ | ||
690 | default_hwif_mmiops(hwif); | ||
691 | |||
668 | /* Initializing chipset IRQ Registers */ | 692 | /* Initializing chipset IRQ Registers */ |
669 | hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4); | 693 | hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4); |
670 | 694 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c index 25157f57a6d0..f930e55b58fc 100644 --- a/drivers/infiniband/hw/mthca/mthca_allocator.c +++ b/drivers/infiniband/hw/mthca/mthca_allocator.c | |||
@@ -41,9 +41,11 @@ | |||
41 | /* Trivial bitmap-based allocator */ | 41 | /* Trivial bitmap-based allocator */ |
42 | u32 mthca_alloc(struct mthca_alloc *alloc) | 42 | u32 mthca_alloc(struct mthca_alloc *alloc) |
43 | { | 43 | { |
44 | unsigned long flags; | ||
44 | u32 obj; | 45 | u32 obj; |
45 | 46 | ||
46 | spin_lock(&alloc->lock); | 47 | spin_lock_irqsave(&alloc->lock, flags); |
48 | |||
47 | obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last); | 49 | obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last); |
48 | if (obj >= alloc->max) { | 50 | if (obj >= alloc->max) { |
49 | alloc->top = (alloc->top + alloc->max) & alloc->mask; | 51 | alloc->top = (alloc->top + alloc->max) & alloc->mask; |
@@ -56,19 +58,24 @@ u32 mthca_alloc(struct mthca_alloc *alloc) | |||
56 | } else | 58 | } else |
57 | obj = -1; | 59 | obj = -1; |
58 | 60 | ||
59 | spin_unlock(&alloc->lock); | 61 | spin_unlock_irqrestore(&alloc->lock, flags); |
60 | 62 | ||
61 | return obj; | 63 | return obj; |
62 | } | 64 | } |
63 | 65 | ||
64 | void mthca_free(struct mthca_alloc *alloc, u32 obj) | 66 | void mthca_free(struct mthca_alloc *alloc, u32 obj) |
65 | { | 67 | { |
68 | unsigned long flags; | ||
69 | |||
66 | obj &= alloc->max - 1; | 70 | obj &= alloc->max - 1; |
67 | spin_lock(&alloc->lock); | 71 | |
72 | spin_lock_irqsave(&alloc->lock, flags); | ||
73 | |||
68 | clear_bit(obj, alloc->table); | 74 | clear_bit(obj, alloc->table); |
69 | alloc->last = min(alloc->last, obj); | 75 | alloc->last = min(alloc->last, obj); |
70 | alloc->top = (alloc->top + alloc->max) & alloc->mask; | 76 | alloc->top = (alloc->top + alloc->max) & alloc->mask; |
71 | spin_unlock(&alloc->lock); | 77 | |
78 | spin_unlock_irqrestore(&alloc->lock, flags); | ||
72 | } | 79 | } |
73 | 80 | ||
74 | int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask, | 81 | int mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask, |
diff --git a/drivers/macintosh/via-pmu-backlight.c b/drivers/macintosh/via-pmu-backlight.c index d3f8d75bcbb4..a82f313d9dc9 100644 --- a/drivers/macintosh/via-pmu-backlight.c +++ b/drivers/macintosh/via-pmu-backlight.c | |||
@@ -18,17 +18,48 @@ | |||
18 | static struct backlight_properties pmu_backlight_data; | 18 | static struct backlight_properties pmu_backlight_data; |
19 | static spinlock_t pmu_backlight_lock; | 19 | static spinlock_t pmu_backlight_lock; |
20 | static int sleeping; | 20 | static int sleeping; |
21 | static u8 bl_curve[FB_BACKLIGHT_LEVELS]; | ||
21 | 22 | ||
22 | static int pmu_backlight_get_level_brightness(struct fb_info *info, | 23 | static void pmu_backlight_init_curve(u8 off, u8 min, u8 max) |
23 | int level) | 24 | { |
25 | unsigned int i, flat, count, range = (max - min); | ||
26 | |||
27 | bl_curve[0] = off; | ||
28 | |||
29 | for (flat = 1; flat < (FB_BACKLIGHT_LEVELS / 16); ++flat) | ||
30 | bl_curve[flat] = min; | ||
31 | |||
32 | count = FB_BACKLIGHT_LEVELS * 15 / 16; | ||
33 | for (i = 0; i < count; ++i) | ||
34 | bl_curve[flat + i] = min + (range * (i + 1) / count); | ||
35 | } | ||
36 | |||
37 | static int pmu_backlight_curve_lookup(int value) | ||
38 | { | ||
39 | int level = (FB_BACKLIGHT_LEVELS - 1); | ||
40 | int i, max = 0; | ||
41 | |||
42 | /* Look for biggest value */ | ||
43 | for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) | ||
44 | max = max((int)bl_curve[i], max); | ||
45 | |||
46 | /* Look for nearest value */ | ||
47 | for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) { | ||
48 | int diff = abs(bl_curve[i] - value); | ||
49 | if (diff < max) { | ||
50 | max = diff; | ||
51 | level = i; | ||
52 | } | ||
53 | } | ||
54 | return level; | ||
55 | } | ||
56 | |||
57 | static int pmu_backlight_get_level_brightness(int level) | ||
24 | { | 58 | { |
25 | int pmulevel; | 59 | int pmulevel; |
26 | 60 | ||
27 | /* Get and convert the value */ | 61 | /* Get and convert the value */ |
28 | mutex_lock(&info->bl_mutex); | 62 | pmulevel = bl_curve[level] * FB_BACKLIGHT_MAX / MAX_PMU_LEVEL; |
29 | pmulevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_PMU_LEVEL; | ||
30 | mutex_unlock(&info->bl_mutex); | ||
31 | |||
32 | if (pmulevel < 0) | 63 | if (pmulevel < 0) |
33 | pmulevel = 0; | 64 | pmulevel = 0; |
34 | else if (pmulevel > MAX_PMU_LEVEL) | 65 | else if (pmulevel > MAX_PMU_LEVEL) |
@@ -39,7 +70,6 @@ static int pmu_backlight_get_level_brightness(struct fb_info *info, | |||
39 | 70 | ||
40 | static int pmu_backlight_update_status(struct backlight_device *bd) | 71 | static int pmu_backlight_update_status(struct backlight_device *bd) |
41 | { | 72 | { |
42 | struct fb_info *info = class_get_devdata(&bd->class_dev); | ||
43 | struct adb_request req; | 73 | struct adb_request req; |
44 | unsigned long flags; | 74 | unsigned long flags; |
45 | int level = bd->props->brightness; | 75 | int level = bd->props->brightness; |
@@ -55,7 +85,7 @@ static int pmu_backlight_update_status(struct backlight_device *bd) | |||
55 | level = 0; | 85 | level = 0; |
56 | 86 | ||
57 | if (level > 0) { | 87 | if (level > 0) { |
58 | int pmulevel = pmu_backlight_get_level_brightness(info, level); | 88 | int pmulevel = pmu_backlight_get_level_brightness(level); |
59 | 89 | ||
60 | pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel); | 90 | pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel); |
61 | pmu_wait_complete(&req); | 91 | pmu_wait_complete(&req); |
@@ -88,35 +118,19 @@ static struct backlight_properties pmu_backlight_data = { | |||
88 | }; | 118 | }; |
89 | 119 | ||
90 | #ifdef CONFIG_PM | 120 | #ifdef CONFIG_PM |
91 | static int pmu_backlight_sleep_call(struct pmu_sleep_notifier *self, int when) | 121 | void pmu_backlight_set_sleep(int sleep) |
92 | { | 122 | { |
93 | unsigned long flags; | 123 | unsigned long flags; |
94 | 124 | ||
95 | spin_lock_irqsave(&pmu_backlight_lock, flags); | 125 | spin_lock_irqsave(&pmu_backlight_lock, flags); |
96 | 126 | sleeping = sleep; | |
97 | switch (when) { | ||
98 | case PBOOK_SLEEP_REQUEST: | ||
99 | sleeping = 1; | ||
100 | break; | ||
101 | case PBOOK_WAKE: | ||
102 | sleeping = 0; | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | spin_unlock_irqrestore(&pmu_backlight_lock, flags); | 127 | spin_unlock_irqrestore(&pmu_backlight_lock, flags); |
107 | |||
108 | return PBOOK_SLEEP_OK; | ||
109 | } | 128 | } |
110 | 129 | #endif /* CONFIG_PM */ | |
111 | static struct pmu_sleep_notifier pmu_backlight_sleep_notif = { | ||
112 | .notifier_call = pmu_backlight_sleep_call, | ||
113 | }; | ||
114 | #endif | ||
115 | 130 | ||
116 | void __init pmu_backlight_init() | 131 | void __init pmu_backlight_init() |
117 | { | 132 | { |
118 | struct backlight_device *bd; | 133 | struct backlight_device *bd; |
119 | struct fb_info *info; | ||
120 | char name[10]; | 134 | char name[10]; |
121 | int level, autosave; | 135 | int level, autosave; |
122 | 136 | ||
@@ -131,27 +145,14 @@ void __init pmu_backlight_init() | |||
131 | !machine_is_compatible("PowerBook1,1")) | 145 | !machine_is_compatible("PowerBook1,1")) |
132 | return; | 146 | return; |
133 | 147 | ||
134 | /* Actually, this is a hack, but I don't know of a better way | 148 | snprintf(name, sizeof(name), "pmubl"); |
135 | * to get the first framebuffer device. | ||
136 | */ | ||
137 | info = registered_fb[0]; | ||
138 | if (!info) { | ||
139 | printk("pmubl: No framebuffer found\n"); | ||
140 | goto error; | ||
141 | } | ||
142 | |||
143 | snprintf(name, sizeof(name), "pmubl%d", info->node); | ||
144 | 149 | ||
145 | bd = backlight_device_register(name, info, &pmu_backlight_data); | 150 | bd = backlight_device_register(name, NULL, &pmu_backlight_data); |
146 | if (IS_ERR(bd)) { | 151 | if (IS_ERR(bd)) { |
147 | printk("pmubl: Backlight registration failed\n"); | 152 | printk("pmubl: Backlight registration failed\n"); |
148 | goto error; | 153 | goto error; |
149 | } | 154 | } |
150 | 155 | pmu_backlight_init_curve(0x7F, 0x46, 0x0E); | |
151 | mutex_lock(&info->bl_mutex); | ||
152 | info->bl_dev = bd; | ||
153 | fb_bl_default_curve(info, 0x7F, 0x46, 0x0E); | ||
154 | mutex_unlock(&info->bl_mutex); | ||
155 | 156 | ||
156 | level = pmu_backlight_data.max_brightness; | 157 | level = pmu_backlight_data.max_brightness; |
157 | 158 | ||
@@ -161,28 +162,22 @@ void __init pmu_backlight_init() | |||
161 | pmu_request(&req, NULL, 2, 0xd9, 0); | 162 | pmu_request(&req, NULL, 2, 0xd9, 0); |
162 | pmu_wait_complete(&req); | 163 | pmu_wait_complete(&req); |
163 | 164 | ||
164 | mutex_lock(&info->bl_mutex); | 165 | level = pmu_backlight_curve_lookup( |
165 | level = pmac_backlight_curve_lookup(info, | ||
166 | (req.reply[0] >> 4) * | 166 | (req.reply[0] >> 4) * |
167 | pmu_backlight_data.max_brightness / 15); | 167 | pmu_backlight_data.max_brightness / 15); |
168 | mutex_unlock(&info->bl_mutex); | ||
169 | } | 168 | } |
170 | 169 | ||
171 | up(&bd->sem); | 170 | down(&bd->sem); |
172 | bd->props->brightness = level; | 171 | bd->props->brightness = level; |
173 | bd->props->power = FB_BLANK_UNBLANK; | 172 | bd->props->power = FB_BLANK_UNBLANK; |
174 | bd->props->update_status(bd); | 173 | bd->props->update_status(bd); |
175 | down(&bd->sem); | 174 | up(&bd->sem); |
176 | 175 | ||
177 | mutex_lock(&pmac_backlight_mutex); | 176 | mutex_lock(&pmac_backlight_mutex); |
178 | if (!pmac_backlight) | 177 | if (!pmac_backlight) |
179 | pmac_backlight = bd; | 178 | pmac_backlight = bd; |
180 | mutex_unlock(&pmac_backlight_mutex); | 179 | mutex_unlock(&pmac_backlight_mutex); |
181 | 180 | ||
182 | #ifdef CONFIG_PM | ||
183 | pmu_register_sleep_notifier(&pmu_backlight_sleep_notif); | ||
184 | #endif | ||
185 | |||
186 | printk("pmubl: Backlight initialized (%s)\n", name); | 181 | printk("pmubl: Backlight initialized (%s)\n", name); |
187 | 182 | ||
188 | return; | 183 | return; |
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index ea386801e215..14610a63f580 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
@@ -1995,6 +1995,8 @@ restore_via_state(void) | |||
1995 | out_8(&via[IER], IER_SET | SR_INT | CB1_INT); | 1995 | out_8(&via[IER], IER_SET | SR_INT | CB1_INT); |
1996 | } | 1996 | } |
1997 | 1997 | ||
1998 | extern void pmu_backlight_set_sleep(int sleep); | ||
1999 | |||
1998 | static int | 2000 | static int |
1999 | pmac_suspend_devices(void) | 2001 | pmac_suspend_devices(void) |
2000 | { | 2002 | { |
@@ -2032,6 +2034,11 @@ pmac_suspend_devices(void) | |||
2032 | return -EBUSY; | 2034 | return -EBUSY; |
2033 | } | 2035 | } |
2034 | 2036 | ||
2037 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
2038 | /* Tell backlight code not to muck around with the chip anymore */ | ||
2039 | pmu_backlight_set_sleep(1); | ||
2040 | #endif | ||
2041 | |||
2035 | /* Call platform functions marked "on sleep" */ | 2042 | /* Call platform functions marked "on sleep" */ |
2036 | pmac_pfunc_i2c_suspend(); | 2043 | pmac_pfunc_i2c_suspend(); |
2037 | pmac_pfunc_base_suspend(); | 2044 | pmac_pfunc_base_suspend(); |
@@ -2090,6 +2097,11 @@ pmac_wakeup_devices(void) | |||
2090 | { | 2097 | { |
2091 | mdelay(100); | 2098 | mdelay(100); |
2092 | 2099 | ||
2100 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
2101 | /* Tell backlight code it can use the chip again */ | ||
2102 | pmu_backlight_set_sleep(0); | ||
2103 | #endif | ||
2104 | |||
2093 | /* Power back up system devices (including the PIC) */ | 2105 | /* Power back up system devices (including the PIC) */ |
2094 | device_power_up(); | 2106 | device_power_up(); |
2095 | 2107 | ||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 87bfe9e7d8ca..3b4d69c05623 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -930,10 +930,13 @@ static void status(struct seq_file *seq, mddev_t *mddev) | |||
930 | 930 | ||
931 | seq_printf(seq, " [%d/%d] [", conf->raid_disks, | 931 | seq_printf(seq, " [%d/%d] [", conf->raid_disks, |
932 | conf->working_disks); | 932 | conf->working_disks); |
933 | for (i = 0; i < conf->raid_disks; i++) | 933 | rcu_read_lock(); |
934 | for (i = 0; i < conf->raid_disks; i++) { | ||
935 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); | ||
934 | seq_printf(seq, "%s", | 936 | seq_printf(seq, "%s", |
935 | conf->mirrors[i].rdev && | 937 | rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_"); |
936 | test_bit(In_sync, &conf->mirrors[i].rdev->flags) ? "U" : "_"); | 938 | } |
939 | rcu_read_unlock(); | ||
937 | seq_printf(seq, "]"); | 940 | seq_printf(seq, "]"); |
938 | } | 941 | } |
939 | 942 | ||
@@ -975,7 +978,6 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
975 | static void print_conf(conf_t *conf) | 978 | static void print_conf(conf_t *conf) |
976 | { | 979 | { |
977 | int i; | 980 | int i; |
978 | mirror_info_t *tmp; | ||
979 | 981 | ||
980 | printk("RAID1 conf printout:\n"); | 982 | printk("RAID1 conf printout:\n"); |
981 | if (!conf) { | 983 | if (!conf) { |
@@ -985,14 +987,17 @@ static void print_conf(conf_t *conf) | |||
985 | printk(" --- wd:%d rd:%d\n", conf->working_disks, | 987 | printk(" --- wd:%d rd:%d\n", conf->working_disks, |
986 | conf->raid_disks); | 988 | conf->raid_disks); |
987 | 989 | ||
990 | rcu_read_lock(); | ||
988 | for (i = 0; i < conf->raid_disks; i++) { | 991 | for (i = 0; i < conf->raid_disks; i++) { |
989 | char b[BDEVNAME_SIZE]; | 992 | char b[BDEVNAME_SIZE]; |
990 | tmp = conf->mirrors + i; | 993 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
991 | if (tmp->rdev) | 994 | if (rdev) |
992 | printk(" disk %d, wo:%d, o:%d, dev:%s\n", | 995 | printk(" disk %d, wo:%d, o:%d, dev:%s\n", |
993 | i, !test_bit(In_sync, &tmp->rdev->flags), !test_bit(Faulty, &tmp->rdev->flags), | 996 | i, !test_bit(In_sync, &rdev->flags), |
994 | bdevname(tmp->rdev->bdev,b)); | 997 | !test_bit(Faulty, &rdev->flags), |
998 | bdevname(rdev->bdev,b)); | ||
995 | } | 999 | } |
1000 | rcu_read_unlock(); | ||
996 | } | 1001 | } |
997 | 1002 | ||
998 | static void close_sync(conf_t *conf) | 1003 | static void close_sync(conf_t *conf) |
@@ -1008,20 +1013,20 @@ static int raid1_spare_active(mddev_t *mddev) | |||
1008 | { | 1013 | { |
1009 | int i; | 1014 | int i; |
1010 | conf_t *conf = mddev->private; | 1015 | conf_t *conf = mddev->private; |
1011 | mirror_info_t *tmp; | ||
1012 | 1016 | ||
1013 | /* | 1017 | /* |
1014 | * Find all failed disks within the RAID1 configuration | 1018 | * Find all failed disks within the RAID1 configuration |
1015 | * and mark them readable | 1019 | * and mark them readable. |
1020 | * Called under mddev lock, so rcu protection not needed. | ||
1016 | */ | 1021 | */ |
1017 | for (i = 0; i < conf->raid_disks; i++) { | 1022 | for (i = 0; i < conf->raid_disks; i++) { |
1018 | tmp = conf->mirrors + i; | 1023 | mdk_rdev_t *rdev = conf->mirrors[i].rdev; |
1019 | if (tmp->rdev | 1024 | if (rdev |
1020 | && !test_bit(Faulty, &tmp->rdev->flags) | 1025 | && !test_bit(Faulty, &rdev->flags) |
1021 | && !test_bit(In_sync, &tmp->rdev->flags)) { | 1026 | && !test_bit(In_sync, &rdev->flags)) { |
1022 | conf->working_disks++; | 1027 | conf->working_disks++; |
1023 | mddev->degraded--; | 1028 | mddev->degraded--; |
1024 | set_bit(In_sync, &tmp->rdev->flags); | 1029 | set_bit(In_sync, &rdev->flags); |
1025 | } | 1030 | } |
1026 | } | 1031 | } |
1027 | 1032 | ||
@@ -1237,7 +1242,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) | |||
1237 | /* ouch - failed to read all of that. | 1242 | /* ouch - failed to read all of that. |
1238 | * Try some synchronous reads of other devices to get | 1243 | * Try some synchronous reads of other devices to get |
1239 | * good data, much like with normal read errors. Only | 1244 | * good data, much like with normal read errors. Only |
1240 | * read into the pages we already have so they we don't | 1245 | * read into the pages we already have so we don't |
1241 | * need to re-issue the read request. | 1246 | * need to re-issue the read request. |
1242 | * We don't need to freeze the array, because being in an | 1247 | * We don't need to freeze the array, because being in an |
1243 | * active sync request, there is no normal IO, and | 1248 | * active sync request, there is no normal IO, and |
@@ -1257,6 +1262,10 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) | |||
1257 | s = PAGE_SIZE >> 9; | 1262 | s = PAGE_SIZE >> 9; |
1258 | do { | 1263 | do { |
1259 | if (r1_bio->bios[d]->bi_end_io == end_sync_read) { | 1264 | if (r1_bio->bios[d]->bi_end_io == end_sync_read) { |
1265 | /* No rcu protection needed here devices | ||
1266 | * can only be removed when no resync is | ||
1267 | * active, and resync is currently active | ||
1268 | */ | ||
1260 | rdev = conf->mirrors[d].rdev; | 1269 | rdev = conf->mirrors[d].rdev; |
1261 | if (sync_page_io(rdev->bdev, | 1270 | if (sync_page_io(rdev->bdev, |
1262 | sect + rdev->data_offset, | 1271 | sect + rdev->data_offset, |
@@ -1463,6 +1472,11 @@ static void raid1d(mddev_t *mddev) | |||
1463 | s = PAGE_SIZE >> 9; | 1472 | s = PAGE_SIZE >> 9; |
1464 | 1473 | ||
1465 | do { | 1474 | do { |
1475 | /* Note: no rcu protection needed here | ||
1476 | * as this is synchronous in the raid1d thread | ||
1477 | * which is the thread that might remove | ||
1478 | * a device. If raid1d ever becomes multi-threaded.... | ||
1479 | */ | ||
1466 | rdev = conf->mirrors[d].rdev; | 1480 | rdev = conf->mirrors[d].rdev; |
1467 | if (rdev && | 1481 | if (rdev && |
1468 | test_bit(In_sync, &rdev->flags) && | 1482 | test_bit(In_sync, &rdev->flags) && |
@@ -1486,7 +1500,6 @@ static void raid1d(mddev_t *mddev) | |||
1486 | d = conf->raid_disks; | 1500 | d = conf->raid_disks; |
1487 | d--; | 1501 | d--; |
1488 | rdev = conf->mirrors[d].rdev; | 1502 | rdev = conf->mirrors[d].rdev; |
1489 | atomic_add(s, &rdev->corrected_errors); | ||
1490 | if (rdev && | 1503 | if (rdev && |
1491 | test_bit(In_sync, &rdev->flags)) { | 1504 | test_bit(In_sync, &rdev->flags)) { |
1492 | if (sync_page_io(rdev->bdev, | 1505 | if (sync_page_io(rdev->bdev, |
@@ -1509,9 +1522,11 @@ static void raid1d(mddev_t *mddev) | |||
1509 | s<<9, conf->tmppage, READ) == 0) | 1522 | s<<9, conf->tmppage, READ) == 0) |
1510 | /* Well, this device is dead */ | 1523 | /* Well, this device is dead */ |
1511 | md_error(mddev, rdev); | 1524 | md_error(mddev, rdev); |
1512 | else | 1525 | else { |
1526 | atomic_add(s, &rdev->corrected_errors); | ||
1513 | printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", | 1527 | printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", |
1514 | mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); | 1528 | mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); |
1529 | } | ||
1515 | } | 1530 | } |
1516 | } | 1531 | } |
1517 | } else { | 1532 | } else { |
@@ -1787,19 +1802,17 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
1787 | for (i=0; i<conf->raid_disks; i++) { | 1802 | for (i=0; i<conf->raid_disks; i++) { |
1788 | bio = r1_bio->bios[i]; | 1803 | bio = r1_bio->bios[i]; |
1789 | if (bio->bi_end_io == end_sync_read) { | 1804 | if (bio->bi_end_io == end_sync_read) { |
1790 | md_sync_acct(conf->mirrors[i].rdev->bdev, nr_sectors); | 1805 | md_sync_acct(bio->bi_bdev, nr_sectors); |
1791 | generic_make_request(bio); | 1806 | generic_make_request(bio); |
1792 | } | 1807 | } |
1793 | } | 1808 | } |
1794 | } else { | 1809 | } else { |
1795 | atomic_set(&r1_bio->remaining, 1); | 1810 | atomic_set(&r1_bio->remaining, 1); |
1796 | bio = r1_bio->bios[r1_bio->read_disk]; | 1811 | bio = r1_bio->bios[r1_bio->read_disk]; |
1797 | md_sync_acct(conf->mirrors[r1_bio->read_disk].rdev->bdev, | 1812 | md_sync_acct(bio->bi_bdev, nr_sectors); |
1798 | nr_sectors); | ||
1799 | generic_make_request(bio); | 1813 | generic_make_request(bio); |
1800 | 1814 | ||
1801 | } | 1815 | } |
1802 | |||
1803 | return nr_sectors; | 1816 | return nr_sectors; |
1804 | } | 1817 | } |
1805 | 1818 | ||
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index 106d428b72c9..276a21530b95 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c | |||
@@ -1800,14 +1800,15 @@ static struct backlight_properties aty128_bl_data = { | |||
1800 | 1800 | ||
1801 | static void aty128_bl_set_power(struct fb_info *info, int power) | 1801 | static void aty128_bl_set_power(struct fb_info *info, int power) |
1802 | { | 1802 | { |
1803 | if (info->bl_dev == NULL) | ||
1804 | return; | ||
1805 | |||
1806 | mutex_lock(&info->bl_mutex); | 1803 | mutex_lock(&info->bl_mutex); |
1807 | up(&info->bl_dev->sem); | 1804 | |
1808 | info->bl_dev->props->power = power; | 1805 | if (info->bl_dev) { |
1809 | __aty128_bl_update_status(info->bl_dev); | 1806 | down(&info->bl_dev->sem); |
1810 | down(&info->bl_dev->sem); | 1807 | info->bl_dev->props->power = power; |
1808 | __aty128_bl_update_status(info->bl_dev); | ||
1809 | up(&info->bl_dev->sem); | ||
1810 | } | ||
1811 | |||
1811 | mutex_unlock(&info->bl_mutex); | 1812 | mutex_unlock(&info->bl_mutex); |
1812 | } | 1813 | } |
1813 | 1814 | ||
@@ -1842,11 +1843,11 @@ static void aty128_bl_init(struct aty128fb_par *par) | |||
1842 | 219 * FB_BACKLIGHT_MAX / MAX_LEVEL); | 1843 | 219 * FB_BACKLIGHT_MAX / MAX_LEVEL); |
1843 | mutex_unlock(&info->bl_mutex); | 1844 | mutex_unlock(&info->bl_mutex); |
1844 | 1845 | ||
1845 | up(&bd->sem); | 1846 | down(&bd->sem); |
1846 | bd->props->brightness = aty128_bl_data.max_brightness; | 1847 | bd->props->brightness = aty128_bl_data.max_brightness; |
1847 | bd->props->power = FB_BLANK_UNBLANK; | 1848 | bd->props->power = FB_BLANK_UNBLANK; |
1848 | bd->props->update_status(bd); | 1849 | bd->props->update_status(bd); |
1849 | down(&bd->sem); | 1850 | up(&bd->sem); |
1850 | 1851 | ||
1851 | #ifdef CONFIG_PMAC_BACKLIGHT | 1852 | #ifdef CONFIG_PMAC_BACKLIGHT |
1852 | mutex_lock(&pmac_backlight_mutex); | 1853 | mutex_lock(&pmac_backlight_mutex); |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index 510e4ea296ed..19a71f045784 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
@@ -2199,14 +2199,15 @@ static struct backlight_properties aty_bl_data = { | |||
2199 | 2199 | ||
2200 | static void aty_bl_set_power(struct fb_info *info, int power) | 2200 | static void aty_bl_set_power(struct fb_info *info, int power) |
2201 | { | 2201 | { |
2202 | if (info->bl_dev == NULL) | ||
2203 | return; | ||
2204 | |||
2205 | mutex_lock(&info->bl_mutex); | 2202 | mutex_lock(&info->bl_mutex); |
2206 | up(&info->bl_dev->sem); | 2203 | |
2207 | info->bl_dev->props->power = power; | 2204 | if (info->bl_dev) { |
2208 | __aty_bl_update_status(info->bl_dev); | 2205 | down(&info->bl_dev->sem); |
2209 | down(&info->bl_dev->sem); | 2206 | info->bl_dev->props->power = power; |
2207 | __aty_bl_update_status(info->bl_dev); | ||
2208 | up(&info->bl_dev->sem); | ||
2209 | } | ||
2210 | |||
2210 | mutex_unlock(&info->bl_mutex); | 2211 | mutex_unlock(&info->bl_mutex); |
2211 | } | 2212 | } |
2212 | 2213 | ||
@@ -2237,11 +2238,11 @@ static void aty_bl_init(struct atyfb_par *par) | |||
2237 | 0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL); | 2238 | 0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL); |
2238 | mutex_unlock(&info->bl_mutex); | 2239 | mutex_unlock(&info->bl_mutex); |
2239 | 2240 | ||
2240 | up(&bd->sem); | 2241 | down(&bd->sem); |
2241 | bd->props->brightness = aty_bl_data.max_brightness; | 2242 | bd->props->brightness = aty_bl_data.max_brightness; |
2242 | bd->props->power = FB_BLANK_UNBLANK; | 2243 | bd->props->power = FB_BLANK_UNBLANK; |
2243 | bd->props->update_status(bd); | 2244 | bd->props->update_status(bd); |
2244 | down(&bd->sem); | 2245 | up(&bd->sem); |
2245 | 2246 | ||
2246 | #ifdef CONFIG_PMAC_BACKLIGHT | 2247 | #ifdef CONFIG_PMAC_BACKLIGHT |
2247 | mutex_lock(&pmac_backlight_mutex); | 2248 | mutex_lock(&pmac_backlight_mutex); |
diff --git a/drivers/video/aty/radeon_backlight.c b/drivers/video/aty/radeon_backlight.c index 1755dddf1899..585eb7b9e636 100644 --- a/drivers/video/aty/radeon_backlight.c +++ b/drivers/video/aty/radeon_backlight.c | |||
@@ -195,11 +195,11 @@ void radeonfb_bl_init(struct radeonfb_info *rinfo) | |||
195 | 217 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL); | 195 | 217 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL); |
196 | mutex_unlock(&rinfo->info->bl_mutex); | 196 | mutex_unlock(&rinfo->info->bl_mutex); |
197 | 197 | ||
198 | up(&bd->sem); | 198 | down(&bd->sem); |
199 | bd->props->brightness = radeon_bl_data.max_brightness; | 199 | bd->props->brightness = radeon_bl_data.max_brightness; |
200 | bd->props->power = FB_BLANK_UNBLANK; | 200 | bd->props->power = FB_BLANK_UNBLANK; |
201 | bd->props->update_status(bd); | 201 | bd->props->update_status(bd); |
202 | down(&bd->sem); | 202 | up(&bd->sem); |
203 | 203 | ||
204 | #ifdef CONFIG_PMAC_BACKLIGHT | 204 | #ifdef CONFIG_PMAC_BACKLIGHT |
205 | mutex_lock(&pmac_backlight_mutex); | 205 | mutex_lock(&pmac_backlight_mutex); |
diff --git a/drivers/video/nvidia/nv_backlight.c b/drivers/video/nvidia/nv_backlight.c index 14c37c42191c..5b75ae4e9457 100644 --- a/drivers/video/nvidia/nv_backlight.c +++ b/drivers/video/nvidia/nv_backlight.c | |||
@@ -112,13 +112,15 @@ static struct backlight_properties nvidia_bl_data = { | |||
112 | 112 | ||
113 | void nvidia_bl_set_power(struct fb_info *info, int power) | 113 | void nvidia_bl_set_power(struct fb_info *info, int power) |
114 | { | 114 | { |
115 | if (info->bl_dev == NULL) | ||
116 | return; | ||
117 | mutex_lock(&info->bl_mutex); | 115 | mutex_lock(&info->bl_mutex); |
118 | up(&info->bl_dev->sem); | 116 | |
119 | info->bl_dev->props->power = power; | 117 | if (info->bl_dev) { |
120 | __nvidia_bl_update_status(info->bl_dev); | 118 | down(&info->bl_dev->sem); |
121 | down(&info->bl_dev->sem); | 119 | info->bl_dev->props->power = power; |
120 | __nvidia_bl_update_status(info->bl_dev); | ||
121 | up(&info->bl_dev->sem); | ||
122 | } | ||
123 | |||
122 | mutex_unlock(&info->bl_mutex); | 124 | mutex_unlock(&info->bl_mutex); |
123 | } | 125 | } |
124 | 126 | ||
@@ -153,11 +155,11 @@ void nvidia_bl_init(struct nvidia_par *par) | |||
153 | 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); | 155 | 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); |
154 | mutex_unlock(&info->bl_mutex); | 156 | mutex_unlock(&info->bl_mutex); |
155 | 157 | ||
156 | up(&bd->sem); | 158 | down(&bd->sem); |
157 | bd->props->brightness = nvidia_bl_data.max_brightness; | 159 | bd->props->brightness = nvidia_bl_data.max_brightness; |
158 | bd->props->power = FB_BLANK_UNBLANK; | 160 | bd->props->power = FB_BLANK_UNBLANK; |
159 | bd->props->update_status(bd); | 161 | bd->props->update_status(bd); |
160 | down(&bd->sem); | 162 | up(&bd->sem); |
161 | 163 | ||
162 | #ifdef CONFIG_PMAC_BACKLIGHT | 164 | #ifdef CONFIG_PMAC_BACKLIGHT |
163 | mutex_lock(&pmac_backlight_mutex); | 165 | mutex_lock(&pmac_backlight_mutex); |
diff --git a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c index 90363943bd57..8ddb47a56b07 100644 --- a/drivers/video/riva/fbdev.c +++ b/drivers/video/riva/fbdev.c | |||
@@ -354,14 +354,15 @@ static struct backlight_properties riva_bl_data = { | |||
354 | 354 | ||
355 | static void riva_bl_set_power(struct fb_info *info, int power) | 355 | static void riva_bl_set_power(struct fb_info *info, int power) |
356 | { | 356 | { |
357 | if (info->bl_dev == NULL) | ||
358 | return; | ||
359 | |||
360 | mutex_lock(&info->bl_mutex); | 357 | mutex_lock(&info->bl_mutex); |
361 | up(&info->bl_dev->sem); | 358 | |
362 | info->bl_dev->props->power = power; | 359 | if (info->bl_dev) { |
363 | __riva_bl_update_status(info->bl_dev); | 360 | down(&info->bl_dev->sem); |
364 | down(&info->bl_dev->sem); | 361 | info->bl_dev->props->power = power; |
362 | __riva_bl_update_status(info->bl_dev); | ||
363 | up(&info->bl_dev->sem); | ||
364 | } | ||
365 | |||
365 | mutex_unlock(&info->bl_mutex); | 366 | mutex_unlock(&info->bl_mutex); |
366 | } | 367 | } |
367 | 368 | ||
@@ -396,11 +397,11 @@ static void riva_bl_init(struct riva_par *par) | |||
396 | 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); | 397 | 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); |
397 | mutex_unlock(&info->bl_mutex); | 398 | mutex_unlock(&info->bl_mutex); |
398 | 399 | ||
399 | up(&bd->sem); | 400 | down(&bd->sem); |
400 | bd->props->brightness = riva_bl_data.max_brightness; | 401 | bd->props->brightness = riva_bl_data.max_brightness; |
401 | bd->props->power = FB_BLANK_UNBLANK; | 402 | bd->props->power = FB_BLANK_UNBLANK; |
402 | bd->props->update_status(bd); | 403 | bd->props->update_status(bd); |
403 | down(&bd->sem); | 404 | up(&bd->sem); |
404 | 405 | ||
405 | #ifdef CONFIG_PMAC_BACKLIGHT | 406 | #ifdef CONFIG_PMAC_BACKLIGHT |
406 | mutex_lock(&pmac_backlight_mutex); | 407 | mutex_lock(&pmac_backlight_mutex); |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index de2e4cbbf79a..f5169a96260e 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -727,7 +727,7 @@ done: | |||
727 | 727 | ||
728 | out: | 728 | out: |
729 | if (unlikely(frozen_buffer)) /* It's usually NULL */ | 729 | if (unlikely(frozen_buffer)) /* It's usually NULL */ |
730 | kfree(frozen_buffer); | 730 | jbd_slab_free(frozen_buffer, bh->b_size); |
731 | 731 | ||
732 | JBUFFER_TRACE(jh, "exit"); | 732 | JBUFFER_TRACE(jh, "exit"); |
733 | return error; | 733 | return error; |
diff --git a/include/asm-i386/mach-default/mach_mpspec.h b/include/asm-i386/mach-default/mach_mpspec.h index 6b5dadcf1d0e..51c9a9775932 100644 --- a/include/asm-i386/mach-default/mach_mpspec.h +++ b/include/asm-i386/mach-default/mach_mpspec.h | |||
@@ -3,6 +3,10 @@ | |||
3 | 3 | ||
4 | #define MAX_IRQ_SOURCES 256 | 4 | #define MAX_IRQ_SOURCES 256 |
5 | 5 | ||
6 | #if CONFIG_BASE_SMALL == 0 | ||
7 | #define MAX_MP_BUSSES 256 | ||
8 | #else | ||
6 | #define MAX_MP_BUSSES 32 | 9 | #define MAX_MP_BUSSES 32 |
10 | #endif | ||
7 | 11 | ||
8 | #endif /* __ASM_MACH_MPSPEC_H */ | 12 | #endif /* __ASM_MACH_MPSPEC_H */ |
diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h index 11487b6e7127..561e2a77805c 100644 --- a/include/linux/delayacct.h +++ b/include/linux/delayacct.h | |||
@@ -59,10 +59,14 @@ static inline void delayacct_tsk_init(struct task_struct *tsk) | |||
59 | __delayacct_tsk_init(tsk); | 59 | __delayacct_tsk_init(tsk); |
60 | } | 60 | } |
61 | 61 | ||
62 | static inline void delayacct_tsk_exit(struct task_struct *tsk) | 62 | /* Free tsk->delays. Called from bad fork and __put_task_struct |
63 | * where there's no risk of tsk->delays being accessed elsewhere | ||
64 | */ | ||
65 | static inline void delayacct_tsk_free(struct task_struct *tsk) | ||
63 | { | 66 | { |
64 | if (tsk->delays) | 67 | if (tsk->delays) |
65 | __delayacct_tsk_exit(tsk); | 68 | kmem_cache_free(delayacct_cache, tsk->delays); |
69 | tsk->delays = NULL; | ||
66 | } | 70 | } |
67 | 71 | ||
68 | static inline void delayacct_blkio_start(void) | 72 | static inline void delayacct_blkio_start(void) |
@@ -101,7 +105,7 @@ static inline void delayacct_init(void) | |||
101 | {} | 105 | {} |
102 | static inline void delayacct_tsk_init(struct task_struct *tsk) | 106 | static inline void delayacct_tsk_init(struct task_struct *tsk) |
103 | {} | 107 | {} |
104 | static inline void delayacct_tsk_exit(struct task_struct *tsk) | 108 | static inline void delayacct_tsk_free(struct task_struct *tsk) |
105 | {} | 109 | {} |
106 | static inline void delayacct_blkio_start(void) | 110 | static inline void delayacct_blkio_start(void) |
107 | {} | 111 | {} |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 656b588a9f96..f45163c528e8 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -77,6 +77,7 @@ struct per_cpu_pages { | |||
77 | struct per_cpu_pageset { | 77 | struct per_cpu_pageset { |
78 | struct per_cpu_pages pcp[2]; /* 0: hot. 1: cold */ | 78 | struct per_cpu_pages pcp[2]; /* 0: hot. 1: cold */ |
79 | #ifdef CONFIG_SMP | 79 | #ifdef CONFIG_SMP |
80 | s8 stat_threshold; | ||
80 | s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS]; | 81 | s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS]; |
81 | #endif | 82 | #endif |
82 | } ____cacheline_aligned_in_smp; | 83 | } ____cacheline_aligned_in_smp; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 6674fc1e51bf..34ed0d99b1bd 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -994,7 +994,6 @@ struct task_struct { | |||
994 | */ | 994 | */ |
995 | struct pipe_inode_info *splice_pipe; | 995 | struct pipe_inode_info *splice_pipe; |
996 | #ifdef CONFIG_TASK_DELAY_ACCT | 996 | #ifdef CONFIG_TASK_DELAY_ACCT |
997 | spinlock_t delays_lock; | ||
998 | struct task_delay_info *delays; | 997 | struct task_delay_info *delays; |
999 | #endif | 998 | #endif |
1000 | }; | 999 | }; |
diff --git a/kernel/delayacct.c b/kernel/delayacct.c index 57ca3730205d..36752f124c6a 100644 --- a/kernel/delayacct.c +++ b/kernel/delayacct.c | |||
@@ -41,24 +41,11 @@ void delayacct_init(void) | |||
41 | 41 | ||
42 | void __delayacct_tsk_init(struct task_struct *tsk) | 42 | void __delayacct_tsk_init(struct task_struct *tsk) |
43 | { | 43 | { |
44 | spin_lock_init(&tsk->delays_lock); | ||
45 | /* No need to acquire tsk->delays_lock for allocation here unless | ||
46 | __delayacct_tsk_init called after tsk is attached to tasklist | ||
47 | */ | ||
48 | tsk->delays = kmem_cache_zalloc(delayacct_cache, SLAB_KERNEL); | 44 | tsk->delays = kmem_cache_zalloc(delayacct_cache, SLAB_KERNEL); |
49 | if (tsk->delays) | 45 | if (tsk->delays) |
50 | spin_lock_init(&tsk->delays->lock); | 46 | spin_lock_init(&tsk->delays->lock); |
51 | } | 47 | } |
52 | 48 | ||
53 | void __delayacct_tsk_exit(struct task_struct *tsk) | ||
54 | { | ||
55 | struct task_delay_info *delays = tsk->delays; | ||
56 | spin_lock(&tsk->delays_lock); | ||
57 | tsk->delays = NULL; | ||
58 | spin_unlock(&tsk->delays_lock); | ||
59 | kmem_cache_free(delayacct_cache, delays); | ||
60 | } | ||
61 | |||
62 | /* | 49 | /* |
63 | * Start accounting for a delay statistic using | 50 | * Start accounting for a delay statistic using |
64 | * its starting timestamp (@start) | 51 | * its starting timestamp (@start) |
@@ -118,8 +105,6 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) | |||
118 | struct timespec ts; | 105 | struct timespec ts; |
119 | unsigned long t1,t2,t3; | 106 | unsigned long t1,t2,t3; |
120 | 107 | ||
121 | spin_lock(&tsk->delays_lock); | ||
122 | |||
123 | /* Though tsk->delays accessed later, early exit avoids | 108 | /* Though tsk->delays accessed later, early exit avoids |
124 | * unnecessary returning of other data | 109 | * unnecessary returning of other data |
125 | */ | 110 | */ |
@@ -161,7 +146,6 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) | |||
161 | spin_unlock(&tsk->delays->lock); | 146 | spin_unlock(&tsk->delays->lock); |
162 | 147 | ||
163 | done: | 148 | done: |
164 | spin_unlock(&tsk->delays_lock); | ||
165 | return 0; | 149 | return 0; |
166 | } | 150 | } |
167 | 151 | ||
diff --git a/kernel/exit.c b/kernel/exit.c index dba194a8d416..a4c19a52ce46 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -908,7 +908,6 @@ fastcall NORET_TYPE void do_exit(long code) | |||
908 | audit_free(tsk); | 908 | audit_free(tsk); |
909 | taskstats_exit_send(tsk, tidstats, group_dead, mycpu); | 909 | taskstats_exit_send(tsk, tidstats, group_dead, mycpu); |
910 | taskstats_exit_free(tidstats); | 910 | taskstats_exit_free(tidstats); |
911 | delayacct_tsk_exit(tsk); | ||
912 | 911 | ||
913 | exit_mm(tsk); | 912 | exit_mm(tsk); |
914 | 913 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index aa36c43783cc..f9b014e3e700 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -117,6 +117,7 @@ void __put_task_struct(struct task_struct *tsk) | |||
117 | security_task_free(tsk); | 117 | security_task_free(tsk); |
118 | free_uid(tsk->user); | 118 | free_uid(tsk->user); |
119 | put_group_info(tsk->group_info); | 119 | put_group_info(tsk->group_info); |
120 | delayacct_tsk_free(tsk); | ||
120 | 121 | ||
121 | if (!profile_handoff_task(tsk)) | 122 | if (!profile_handoff_task(tsk)) |
122 | free_task(tsk); | 123 | free_task(tsk); |
@@ -1011,7 +1012,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1011 | retval = -EFAULT; | 1012 | retval = -EFAULT; |
1012 | if (clone_flags & CLONE_PARENT_SETTID) | 1013 | if (clone_flags & CLONE_PARENT_SETTID) |
1013 | if (put_user(p->pid, parent_tidptr)) | 1014 | if (put_user(p->pid, parent_tidptr)) |
1014 | goto bad_fork_cleanup; | 1015 | goto bad_fork_cleanup_delays_binfmt; |
1015 | 1016 | ||
1016 | INIT_LIST_HEAD(&p->children); | 1017 | INIT_LIST_HEAD(&p->children); |
1017 | INIT_LIST_HEAD(&p->sibling); | 1018 | INIT_LIST_HEAD(&p->sibling); |
@@ -1277,7 +1278,8 @@ bad_fork_cleanup_policy: | |||
1277 | bad_fork_cleanup_cpuset: | 1278 | bad_fork_cleanup_cpuset: |
1278 | #endif | 1279 | #endif |
1279 | cpuset_exit(p); | 1280 | cpuset_exit(p); |
1280 | bad_fork_cleanup: | 1281 | bad_fork_cleanup_delays_binfmt: |
1282 | delayacct_tsk_free(p); | ||
1281 | if (p->binfmt) | 1283 | if (p->binfmt) |
1282 | module_put(p->binfmt->module); | 1284 | module_put(p->binfmt->module); |
1283 | bad_fork_cleanup_put_domain: | 1285 | bad_fork_cleanup_put_domain: |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index fc4e906aedbd..48a53f68af96 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -20,6 +20,11 @@ | |||
20 | 20 | ||
21 | /** | 21 | /** |
22 | * handle_bad_irq - handle spurious and unhandled irqs | 22 | * handle_bad_irq - handle spurious and unhandled irqs |
23 | * @irq: the interrupt number | ||
24 | * @desc: description of the interrupt | ||
25 | * @regs: pointer to a register structure | ||
26 | * | ||
27 | * Handles spurious and unhandled IRQ's. It also prints a debugmessage. | ||
23 | */ | 28 | */ |
24 | void fastcall | 29 | void fastcall |
25 | handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) | 30 | handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index e07e27e846a2..a9963ceddd65 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -1176,7 +1176,15 @@ static inline unsigned interleave_nid(struct mempolicy *pol, | |||
1176 | if (vma) { | 1176 | if (vma) { |
1177 | unsigned long off; | 1177 | unsigned long off; |
1178 | 1178 | ||
1179 | off = vma->vm_pgoff; | 1179 | /* |
1180 | * for small pages, there is no difference between | ||
1181 | * shift and PAGE_SHIFT, so the bit-shift is safe. | ||
1182 | * for huge pages, since vm_pgoff is in units of small | ||
1183 | * pages, we need to shift off the always 0 bits to get | ||
1184 | * a useful offset. | ||
1185 | */ | ||
1186 | BUG_ON(shift < PAGE_SHIFT); | ||
1187 | off = vma->vm_pgoff >> (shift - PAGE_SHIFT); | ||
1180 | off += (addr - vma->vm_start) >> shift; | 1188 | off += (addr - vma->vm_start) >> shift; |
1181 | return offset_il_node(pol, vma, off); | 1189 | return offset_il_node(pol, vma, off); |
1182 | } else | 1190 | } else |
diff --git a/mm/mempool.c b/mm/mempool.c index fe6e05289cc5..ccd8cb8cd41f 100644 --- a/mm/mempool.c +++ b/mm/mempool.c | |||
@@ -238,8 +238,13 @@ repeat_alloc: | |||
238 | init_wait(&wait); | 238 | init_wait(&wait); |
239 | prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE); | 239 | prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE); |
240 | smp_mb(); | 240 | smp_mb(); |
241 | if (!pool->curr_nr) | 241 | if (!pool->curr_nr) { |
242 | io_schedule(); | 242 | /* |
243 | * FIXME: this should be io_schedule(). The timeout is there | ||
244 | * as a workaround for some DM problems in 2.6.18. | ||
245 | */ | ||
246 | io_schedule_timeout(5*HZ); | ||
247 | } | ||
243 | finish_wait(&pool->wait, &wait); | 248 | finish_wait(&pool->wait, &wait); |
244 | 249 | ||
245 | goto repeat_alloc; | 250 | goto repeat_alloc; |
diff --git a/mm/vmstat.c b/mm/vmstat.c index dfdf24133901..c1b5f4106b38 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/config.h> | 12 | #include <linux/config.h> |
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/cpu.h> | ||
15 | 16 | ||
16 | void __get_zone_counts(unsigned long *active, unsigned long *inactive, | 17 | void __get_zone_counts(unsigned long *active, unsigned long *inactive, |
17 | unsigned long *free, struct pglist_data *pgdat) | 18 | unsigned long *free, struct pglist_data *pgdat) |
@@ -114,17 +115,72 @@ EXPORT_SYMBOL(vm_stat); | |||
114 | 115 | ||
115 | #ifdef CONFIG_SMP | 116 | #ifdef CONFIG_SMP |
116 | 117 | ||
117 | #define STAT_THRESHOLD 32 | 118 | static int calculate_threshold(struct zone *zone) |
119 | { | ||
120 | int threshold; | ||
121 | int mem; /* memory in 128 MB units */ | ||
122 | |||
123 | /* | ||
124 | * The threshold scales with the number of processors and the amount | ||
125 | * of memory per zone. More memory means that we can defer updates for | ||
126 | * longer, more processors could lead to more contention. | ||
127 | * fls() is used to have a cheap way of logarithmic scaling. | ||
128 | * | ||
129 | * Some sample thresholds: | ||
130 | * | ||
131 | * Threshold Processors (fls) Zonesize fls(mem+1) | ||
132 | * ------------------------------------------------------------------ | ||
133 | * 8 1 1 0.9-1 GB 4 | ||
134 | * 16 2 2 0.9-1 GB 4 | ||
135 | * 20 2 2 1-2 GB 5 | ||
136 | * 24 2 2 2-4 GB 6 | ||
137 | * 28 2 2 4-8 GB 7 | ||
138 | * 32 2 2 8-16 GB 8 | ||
139 | * 4 2 2 <128M 1 | ||
140 | * 30 4 3 2-4 GB 5 | ||
141 | * 48 4 3 8-16 GB 8 | ||
142 | * 32 8 4 1-2 GB 4 | ||
143 | * 32 8 4 0.9-1GB 4 | ||
144 | * 10 16 5 <128M 1 | ||
145 | * 40 16 5 900M 4 | ||
146 | * 70 64 7 2-4 GB 5 | ||
147 | * 84 64 7 4-8 GB 6 | ||
148 | * 108 512 9 4-8 GB 6 | ||
149 | * 125 1024 10 8-16 GB 8 | ||
150 | * 125 1024 10 16-32 GB 9 | ||
151 | */ | ||
152 | |||
153 | mem = zone->present_pages >> (27 - PAGE_SHIFT); | ||
154 | |||
155 | threshold = 2 * fls(num_online_cpus()) * (1 + fls(mem)); | ||
156 | |||
157 | /* | ||
158 | * Maximum threshold is 125 | ||
159 | */ | ||
160 | threshold = min(125, threshold); | ||
161 | |||
162 | return threshold; | ||
163 | } | ||
118 | 164 | ||
119 | /* | 165 | /* |
120 | * Determine pointer to currently valid differential byte given a zone and | 166 | * Refresh the thresholds for each zone. |
121 | * the item number. | ||
122 | * | ||
123 | * Preemption must be off | ||
124 | */ | 167 | */ |
125 | static inline s8 *diff_pointer(struct zone *zone, enum zone_stat_item item) | 168 | static void refresh_zone_stat_thresholds(void) |
126 | { | 169 | { |
127 | return &zone_pcp(zone, smp_processor_id())->vm_stat_diff[item]; | 170 | struct zone *zone; |
171 | int cpu; | ||
172 | int threshold; | ||
173 | |||
174 | for_each_zone(zone) { | ||
175 | |||
176 | if (!zone->present_pages) | ||
177 | continue; | ||
178 | |||
179 | threshold = calculate_threshold(zone); | ||
180 | |||
181 | for_each_online_cpu(cpu) | ||
182 | zone_pcp(zone, cpu)->stat_threshold = threshold; | ||
183 | } | ||
128 | } | 184 | } |
129 | 185 | ||
130 | /* | 186 | /* |
@@ -133,17 +189,16 @@ static inline s8 *diff_pointer(struct zone *zone, enum zone_stat_item item) | |||
133 | void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, | 189 | void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, |
134 | int delta) | 190 | int delta) |
135 | { | 191 | { |
136 | s8 *p; | 192 | struct per_cpu_pageset *pcp = zone_pcp(zone, smp_processor_id()); |
193 | s8 *p = pcp->vm_stat_diff + item; | ||
137 | long x; | 194 | long x; |
138 | 195 | ||
139 | p = diff_pointer(zone, item); | ||
140 | x = delta + *p; | 196 | x = delta + *p; |
141 | 197 | ||
142 | if (unlikely(x > STAT_THRESHOLD || x < -STAT_THRESHOLD)) { | 198 | if (unlikely(x > pcp->stat_threshold || x < -pcp->stat_threshold)) { |
143 | zone_page_state_add(x, zone, item); | 199 | zone_page_state_add(x, zone, item); |
144 | x = 0; | 200 | x = 0; |
145 | } | 201 | } |
146 | |||
147 | *p = x; | 202 | *p = x; |
148 | } | 203 | } |
149 | EXPORT_SYMBOL(__mod_zone_page_state); | 204 | EXPORT_SYMBOL(__mod_zone_page_state); |
@@ -172,10 +227,12 @@ EXPORT_SYMBOL(mod_zone_page_state); | |||
172 | * No overflow check is necessary and therefore the differential can be | 227 | * No overflow check is necessary and therefore the differential can be |
173 | * incremented or decremented in place which may allow the compilers to | 228 | * incremented or decremented in place which may allow the compilers to |
174 | * generate better code. | 229 | * generate better code. |
175 | * | ||
176 | * The increment or decrement is known and therefore one boundary check can | 230 | * The increment or decrement is known and therefore one boundary check can |
177 | * be omitted. | 231 | * be omitted. |
178 | * | 232 | * |
233 | * NOTE: These functions are very performance sensitive. Change only | ||
234 | * with care. | ||
235 | * | ||
179 | * Some processors have inc/dec instructions that are atomic vs an interrupt. | 236 | * Some processors have inc/dec instructions that are atomic vs an interrupt. |
180 | * However, the code must first determine the differential location in a zone | 237 | * However, the code must first determine the differential location in a zone |
181 | * based on the processor number and then inc/dec the counter. There is no | 238 | * based on the processor number and then inc/dec the counter. There is no |
@@ -185,13 +242,16 @@ EXPORT_SYMBOL(mod_zone_page_state); | |||
185 | */ | 242 | */ |
186 | static void __inc_zone_state(struct zone *zone, enum zone_stat_item item) | 243 | static void __inc_zone_state(struct zone *zone, enum zone_stat_item item) |
187 | { | 244 | { |
188 | s8 *p = diff_pointer(zone, item); | 245 | struct per_cpu_pageset *pcp = zone_pcp(zone, smp_processor_id()); |
246 | s8 *p = pcp->vm_stat_diff + item; | ||
189 | 247 | ||
190 | (*p)++; | 248 | (*p)++; |
191 | 249 | ||
192 | if (unlikely(*p > STAT_THRESHOLD)) { | 250 | if (unlikely(*p > pcp->stat_threshold)) { |
193 | zone_page_state_add(*p, zone, item); | 251 | int overstep = pcp->stat_threshold / 2; |
194 | *p = 0; | 252 | |
253 | zone_page_state_add(*p + overstep, zone, item); | ||
254 | *p = -overstep; | ||
195 | } | 255 | } |
196 | } | 256 | } |
197 | 257 | ||
@@ -204,13 +264,16 @@ EXPORT_SYMBOL(__inc_zone_page_state); | |||
204 | void __dec_zone_page_state(struct page *page, enum zone_stat_item item) | 264 | void __dec_zone_page_state(struct page *page, enum zone_stat_item item) |
205 | { | 265 | { |
206 | struct zone *zone = page_zone(page); | 266 | struct zone *zone = page_zone(page); |
207 | s8 *p = diff_pointer(zone, item); | 267 | struct per_cpu_pageset *pcp = zone_pcp(zone, smp_processor_id()); |
268 | s8 *p = pcp->vm_stat_diff + item; | ||
208 | 269 | ||
209 | (*p)--; | 270 | (*p)--; |
210 | 271 | ||
211 | if (unlikely(*p < -STAT_THRESHOLD)) { | 272 | if (unlikely(*p < - pcp->stat_threshold)) { |
212 | zone_page_state_add(*p, zone, item); | 273 | int overstep = pcp->stat_threshold / 2; |
213 | *p = 0; | 274 | |
275 | zone_page_state_add(*p - overstep, zone, item); | ||
276 | *p = overstep; | ||
214 | } | 277 | } |
215 | } | 278 | } |
216 | EXPORT_SYMBOL(__dec_zone_page_state); | 279 | EXPORT_SYMBOL(__dec_zone_page_state); |
@@ -239,19 +302,9 @@ EXPORT_SYMBOL(inc_zone_page_state); | |||
239 | void dec_zone_page_state(struct page *page, enum zone_stat_item item) | 302 | void dec_zone_page_state(struct page *page, enum zone_stat_item item) |
240 | { | 303 | { |
241 | unsigned long flags; | 304 | unsigned long flags; |
242 | struct zone *zone; | ||
243 | s8 *p; | ||
244 | 305 | ||
245 | zone = page_zone(page); | ||
246 | local_irq_save(flags); | 306 | local_irq_save(flags); |
247 | p = diff_pointer(zone, item); | 307 | __dec_zone_page_state(page, item); |
248 | |||
249 | (*p)--; | ||
250 | |||
251 | if (unlikely(*p < -STAT_THRESHOLD)) { | ||
252 | zone_page_state_add(*p, zone, item); | ||
253 | *p = 0; | ||
254 | } | ||
255 | local_irq_restore(flags); | 308 | local_irq_restore(flags); |
256 | } | 309 | } |
257 | EXPORT_SYMBOL(dec_zone_page_state); | 310 | EXPORT_SYMBOL(dec_zone_page_state); |
@@ -525,6 +578,10 @@ static int zoneinfo_show(struct seq_file *m, void *arg) | |||
525 | pageset->pcp[j].high, | 578 | pageset->pcp[j].high, |
526 | pageset->pcp[j].batch); | 579 | pageset->pcp[j].batch); |
527 | } | 580 | } |
581 | #ifdef CONFIG_SMP | ||
582 | seq_printf(m, "\n vm stats threshold: %d", | ||
583 | pageset->stat_threshold); | ||
584 | #endif | ||
528 | } | 585 | } |
529 | seq_printf(m, | 586 | seq_printf(m, |
530 | "\n all_unreclaimable: %u" | 587 | "\n all_unreclaimable: %u" |
@@ -613,3 +670,35 @@ struct seq_operations vmstat_op = { | |||
613 | 670 | ||
614 | #endif /* CONFIG_PROC_FS */ | 671 | #endif /* CONFIG_PROC_FS */ |
615 | 672 | ||
673 | #ifdef CONFIG_SMP | ||
674 | /* | ||
675 | * Use the cpu notifier to insure that the thresholds are recalculated | ||
676 | * when necessary. | ||
677 | */ | ||
678 | static int __cpuinit vmstat_cpuup_callback(struct notifier_block *nfb, | ||
679 | unsigned long action, | ||
680 | void *hcpu) | ||
681 | { | ||
682 | switch (action) { | ||
683 | case CPU_UP_PREPARE: | ||
684 | case CPU_UP_CANCELED: | ||
685 | case CPU_DEAD: | ||
686 | refresh_zone_stat_thresholds(); | ||
687 | break; | ||
688 | default: | ||
689 | break; | ||
690 | } | ||
691 | return NOTIFY_OK; | ||
692 | } | ||
693 | |||
694 | static struct notifier_block __cpuinitdata vmstat_notifier = | ||
695 | { &vmstat_cpuup_callback, NULL, 0 }; | ||
696 | |||
697 | int __init setup_vmstat(void) | ||
698 | { | ||
699 | refresh_zone_stat_thresholds(); | ||
700 | register_cpu_notifier(&vmstat_notifier); | ||
701 | return 0; | ||
702 | } | ||
703 | module_init(setup_vmstat) | ||
704 | #endif | ||
diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig index 1b7c3dfc2b41..97e38b665587 100644 --- a/sound/oss/Kconfig +++ b/sound/oss/Kconfig | |||
@@ -5,6 +5,20 @@ | |||
5 | # | 5 | # |
6 | # Prompt user for primary drivers. | 6 | # Prompt user for primary drivers. |
7 | 7 | ||
8 | config OSS_OBSOLETE_DRIVER | ||
9 | bool "Obsolete OSS drivers" | ||
10 | depends on SOUND_PRIME | ||
11 | help | ||
12 | This option enables support for obsolete OSS drivers that | ||
13 | are scheduled for removal in the near future since there | ||
14 | are ALSA drivers for the same hardware. | ||
15 | |||
16 | Please contact Adrian Bunk <bunk@stusta.de> if you had to | ||
17 | say Y here because your soundcard is not properly supported | ||
18 | by ALSA. | ||
19 | |||
20 | If unsure, say N. | ||
21 | |||
8 | config SOUND_BT878 | 22 | config SOUND_BT878 |
9 | tristate "BT878 audio dma" | 23 | tristate "BT878 audio dma" |
10 | depends on SOUND_PRIME && PCI | 24 | depends on SOUND_PRIME && PCI |
@@ -23,7 +37,7 @@ config SOUND_BT878 | |||
23 | 37 | ||
24 | config SOUND_EMU10K1 | 38 | config SOUND_EMU10K1 |
25 | tristate "Creative SBLive! (EMU10K1)" | 39 | tristate "Creative SBLive! (EMU10K1)" |
26 | depends on SOUND_PRIME && PCI | 40 | depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER |
27 | ---help--- | 41 | ---help--- |
28 | Say Y or M if you have a PCI sound card using the EMU10K1 chipset, | 42 | Say Y or M if you have a PCI sound card using the EMU10K1 chipset, |
29 | such as the Creative SBLive!, SB PCI512 or Emu-APS. | 43 | such as the Creative SBLive!, SB PCI512 or Emu-APS. |
@@ -49,7 +63,7 @@ config MIDI_EMU10K1 | |||
49 | 63 | ||
50 | config SOUND_FUSION | 64 | config SOUND_FUSION |
51 | tristate "Crystal SoundFusion (CS4280/461x)" | 65 | tristate "Crystal SoundFusion (CS4280/461x)" |
52 | depends on SOUND_PRIME && PCI | 66 | depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER |
53 | help | 67 | help |
54 | This module drives the Crystal SoundFusion devices (CS4280/46xx | 68 | This module drives the Crystal SoundFusion devices (CS4280/46xx |
55 | series) when wired as native sound drivers with AC97 codecs. If | 69 | series) when wired as native sound drivers with AC97 codecs. If |
@@ -440,7 +454,7 @@ config SOUND_DMAP | |||
440 | 454 | ||
441 | config SOUND_AD1816 | 455 | config SOUND_AD1816 |
442 | tristate "AD1816(A) based cards (EXPERIMENTAL)" | 456 | tristate "AD1816(A) based cards (EXPERIMENTAL)" |
443 | depends on EXPERIMENTAL && SOUND_OSS | 457 | depends on EXPERIMENTAL && SOUND_OSS && OSS_OBSOLETE_DRIVER |
444 | help | 458 | help |
445 | Say M here if you have a sound card based on the Analog Devices | 459 | Say M here if you have a sound card based on the Analog Devices |
446 | AD1816(A) chip. | 460 | AD1816(A) chip. |
@@ -450,21 +464,21 @@ config SOUND_AD1816 | |||
450 | 464 | ||
451 | config SOUND_AD1889 | 465 | config SOUND_AD1889 |
452 | tristate "AD1889 based cards (AD1819 codec) (EXPERIMENTAL)" | 466 | tristate "AD1889 based cards (AD1819 codec) (EXPERIMENTAL)" |
453 | depends on EXPERIMENTAL && SOUND_OSS && PCI | 467 | depends on EXPERIMENTAL && SOUND_OSS && PCI && OSS_OBSOLETE_DRIVER |
454 | help | 468 | help |
455 | Say M here if you have a sound card based on the Analog Devices | 469 | Say M here if you have a sound card based on the Analog Devices |
456 | AD1889 chip. | 470 | AD1889 chip. |
457 | 471 | ||
458 | config SOUND_ADLIB | 472 | config SOUND_ADLIB |
459 | tristate "Adlib Cards" | 473 | tristate "Adlib Cards" |
460 | depends on SOUND_OSS | 474 | depends on SOUND_OSS && OSS_OBSOLETE_DRIVER |
461 | help | 475 | help |
462 | Includes ASB 64 4D. Information on programming AdLib cards is | 476 | Includes ASB 64 4D. Information on programming AdLib cards is |
463 | available at <http://www.itsnet.com/home/ldragon/Specs/adlib.html>. | 477 | available at <http://www.itsnet.com/home/ldragon/Specs/adlib.html>. |
464 | 478 | ||
465 | config SOUND_ACI_MIXER | 479 | config SOUND_ACI_MIXER |
466 | tristate "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20)" | 480 | tristate "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20)" |
467 | depends on SOUND_OSS | 481 | depends on SOUND_OSS && OSS_OBSOLETE_DRIVER |
468 | ---help--- | 482 | ---help--- |
469 | ACI (Audio Command Interface) is a protocol used to communicate with | 483 | ACI (Audio Command Interface) is a protocol used to communicate with |
470 | the microcontroller on some sound cards produced by miro and | 484 | the microcontroller on some sound cards produced by miro and |
@@ -586,7 +600,7 @@ config SOUND_MPU401 | |||
586 | 600 | ||
587 | config SOUND_NM256 | 601 | config SOUND_NM256 |
588 | tristate "NM256AV/NM256ZX audio support" | 602 | tristate "NM256AV/NM256ZX audio support" |
589 | depends on SOUND_OSS | 603 | depends on SOUND_OSS && OSS_OBSOLETE_DRIVER |
590 | help | 604 | help |
591 | Say M here to include audio support for the NeoMagic 256AV/256ZX | 605 | Say M here to include audio support for the NeoMagic 256AV/256ZX |
592 | chipsets. These are the audio chipsets found in the Sony | 606 | chipsets. These are the audio chipsets found in the Sony |
@@ -706,7 +720,7 @@ config SOUND_YM3812 | |||
706 | 720 | ||
707 | config SOUND_OPL3SA2 | 721 | config SOUND_OPL3SA2 |
708 | tristate "Yamaha OPL3-SA2 and SA3 based PnP cards" | 722 | tristate "Yamaha OPL3-SA2 and SA3 based PnP cards" |
709 | depends on SOUND_OSS | 723 | depends on SOUND_OSS && OSS_OBSOLETE_DRIVER |
710 | help | 724 | help |
711 | Say Y or M if you have a card based on one of these Yamaha sound | 725 | Say Y or M if you have a card based on one of these Yamaha sound |
712 | chipsets or the "SAx", which is actually a SA3. Read | 726 | chipsets or the "SAx", which is actually a SA3. Read |
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 0abf2808d59f..51e83d7a839a 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -573,7 +573,7 @@ AC97_SINGLE("PC Speaker Playback Volume", AC97_PC_BEEP, 1, 15, 1) | |||
573 | }; | 573 | }; |
574 | 574 | ||
575 | static const struct snd_kcontrol_new snd_ac97_controls_mic_boost = | 575 | static const struct snd_kcontrol_new snd_ac97_controls_mic_boost = |
576 | AC97_SINGLE("Mic Boost (+20dB) Switch", AC97_MIC, 6, 1, 0); | 576 | AC97_SINGLE("Mic Boost (+20dB)", AC97_MIC, 6, 1, 0); |
577 | 577 | ||
578 | 578 | ||
579 | static const char* std_rec_sel[] = {"Mic", "CD", "Video", "Aux", "Line", "Mix", "Mix Mono", "Phone"}; | 579 | static const char* std_rec_sel[] = {"Mic", "CD", "Video", "Aux", "Line", "Mix", "Mix Mono", "Phone"}; |
@@ -615,7 +615,7 @@ AC97_SINGLE("Simulated Stereo Enhancement", AC97_GENERAL_PURPOSE, 14, 1, 0), | |||
615 | AC97_SINGLE("3D Control - Switch", AC97_GENERAL_PURPOSE, 13, 1, 0), | 615 | AC97_SINGLE("3D Control - Switch", AC97_GENERAL_PURPOSE, 13, 1, 0), |
616 | AC97_SINGLE("Loudness (bass boost)", AC97_GENERAL_PURPOSE, 12, 1, 0), | 616 | AC97_SINGLE("Loudness (bass boost)", AC97_GENERAL_PURPOSE, 12, 1, 0), |
617 | AC97_ENUM("Mono Output Select", std_enum[2]), | 617 | AC97_ENUM("Mono Output Select", std_enum[2]), |
618 | AC97_ENUM("Mic Select Capture Switch", std_enum[3]), | 618 | AC97_ENUM("Mic Select", std_enum[3]), |
619 | AC97_SINGLE("ADC/DAC Loopback", AC97_GENERAL_PURPOSE, 7, 1, 0) | 619 | AC97_SINGLE("ADC/DAC Loopback", AC97_GENERAL_PURPOSE, 7, 1, 0) |
620 | }; | 620 | }; |
621 | 621 | ||