From 0d3821c2aeab8a3c095696137e74dfd3e4d92ea8 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Sat, 5 Jul 2008 00:05:30 +0200 Subject: [PATCH] --- yaml --- r: 98734 b: refs/heads/master c: 64e83b5a919a65eb35b63dd7e07c188379ff8ce6 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/head_64.S | 2 +- trunk/drivers/ata/ahci.c | 16 +++------------- trunk/drivers/ide/ide-probe.c | 2 ++ trunk/drivers/ide/ide.c | 24 ++++++++++++++++-------- trunk/fs/proc/task_mmu.c | 8 ++++---- trunk/mm/mempolicy.c | 6 +----- 7 files changed, 28 insertions(+), 32 deletions(-) diff --git a/[refs] b/[refs] index 7b15b9b59849..3d3715b312a8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 20cbc972617069c1ed434f62151e4de57d26ea46 +refs/heads/master: 64e83b5a919a65eb35b63dd7e07c188379ff8ce6 diff --git a/trunk/arch/x86/kernel/head_64.S b/trunk/arch/x86/kernel/head_64.S index 10a1955bb1d1..b817974ef942 100644 --- a/trunk/arch/x86/kernel/head_64.S +++ b/trunk/arch/x86/kernel/head_64.S @@ -128,7 +128,7 @@ ident_complete: /* Fixup phys_base */ addq %rbp, phys_base(%rip) -#ifdef CONFIG_SMP +#ifdef CONFIG_X86_TRAMPOLINE addq %rbp, trampoline_level4_pgt + 0(%rip) addq %rbp, trampoline_level4_pgt + (511*8)(%rip) #endif diff --git a/trunk/drivers/ata/ahci.c b/trunk/drivers/ata/ahci.c index 5e6468a7ca4b..061817a3a0e5 100644 --- a/trunk/drivers/ata/ahci.c +++ b/trunk/drivers/ata/ahci.c @@ -1777,7 +1777,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) struct ahci_host_priv *hpriv; unsigned int i, handled = 0; void __iomem *mmio; - u32 irq_stat, irq_masked; + u32 irq_stat; VPRINTK("ENTER\n"); @@ -1786,17 +1786,16 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) /* sigh. 0xffffffff is a valid return from h/w */ irq_stat = readl(mmio + HOST_IRQ_STAT); + irq_stat &= hpriv->port_map; if (!irq_stat) return IRQ_NONE; - irq_masked = irq_stat & hpriv->port_map; - spin_lock(&host->lock); for (i = 0; i < host->n_ports; i++) { struct ata_port *ap; - if (!(irq_masked & (1 << i))) + if (!(irq_stat & (1 << i))) continue; ap = host->ports[i]; @@ -1813,15 +1812,6 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) handled = 1; } - /* HOST_IRQ_STAT behaves as level triggered latch meaning that - * it should be cleared after all the port events are cleared; - * otherwise, it will raise a spurious interrupt after each - * valid one. Please read section 10.6.2 of ahci 1.1 for more - * information. - * - * Also, use the unmasked value to clear interrupt as spurious - * pending event on a dummy port might cause screaming IRQ. - */ writel(irq_stat, mmio + HOST_IRQ_STAT); spin_unlock(&host->lock); diff --git a/trunk/drivers/ide/ide-probe.c b/trunk/drivers/ide/ide-probe.c index d27061b39324..380fa0c8cc84 100644 --- a/trunk/drivers/ide/ide-probe.c +++ b/trunk/drivers/ide/ide-probe.c @@ -646,6 +646,8 @@ static int ide_register_port(ide_hwif_t *hwif) goto out; } + get_device(&hwif->gendev); + hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev, MKDEV(0, 0), hwif, hwif->name); if (IS_ERR(hwif->portdev)) { diff --git a/trunk/drivers/ide/ide.c b/trunk/drivers/ide/ide.c index 300431d080a9..c758dcb13b14 100644 --- a/trunk/drivers/ide/ide.c +++ b/trunk/drivers/ide/ide.c @@ -315,14 +315,13 @@ void ide_unregister(ide_hwif_t *hwif) BUG_ON(in_interrupt()); BUG_ON(irqs_disabled()); - mutex_lock(&ide_cfg_mtx); - spin_lock_irq(&ide_lock); - if (hwif->present) { - __ide_port_unregister_devices(hwif); - hwif->present = 0; - } + if (!hwif->present) + goto abort; + __ide_port_unregister_devices(hwif); + hwif->present = 0; + spin_unlock_irq(&ide_lock); ide_proc_unregister_port(hwif); @@ -352,15 +351,16 @@ void ide_unregister(ide_hwif_t *hwif) blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<sg_table); unregister_blkdev(hwif->major, hwif->name); + spin_lock_irq(&ide_lock); if (hwif->dma_base) ide_release_dma_engine(hwif); - spin_lock_irq(&ide_lock); /* restore hwif data to pristine status */ ide_init_port_data(hwif, hwif->index); - spin_unlock_irq(&ide_lock); +abort: + spin_unlock_irq(&ide_lock); mutex_unlock(&ide_cfg_mtx); } @@ -1094,6 +1094,13 @@ struct bus_type ide_bus_type = { EXPORT_SYMBOL_GPL(ide_bus_type); +static void ide_port_class_release(struct device *portdev) +{ + ide_hwif_t *hwif = dev_get_drvdata(portdev); + + put_device(&hwif->gendev); +} + int ide_vlb_clk; EXPORT_SYMBOL_GPL(ide_vlb_clk); @@ -1298,6 +1305,7 @@ static int __init ide_init(void) ret = PTR_ERR(ide_port_class); goto out_port_class; } + ide_port_class->dev_release = ide_port_class_release; init_ide_data(); diff --git a/trunk/fs/proc/task_mmu.c b/trunk/fs/proc/task_mmu.c index 05053d701ac5..ab8ccc9d14ff 100644 --- a/trunk/fs/proc/task_mmu.c +++ b/trunk/fs/proc/task_mmu.c @@ -476,10 +476,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, return -ESRCH; mm = get_task_mm(task); if (mm) { - struct mm_walk clear_refs_walk = { - .pmd_entry = clear_refs_pte_range, - .mm = mm, - }; + static struct mm_walk clear_refs_walk; + memset(&clear_refs_walk, 0, sizeof(clear_refs_walk)); + clear_refs_walk.pmd_entry = clear_refs_pte_range; + clear_refs_walk.mm = mm; down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { clear_refs_walk.private = vma; diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index c94e58b192c3..a37a5034f63d 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -729,11 +729,7 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, } else { *policy = pol == &default_policy ? MPOL_DEFAULT : pol->mode; - /* - * Internal mempolicy flags must be masked off before exposing - * the policy to userspace. - */ - *policy |= (pol->flags & MPOL_MODE_FLAGS); + *policy |= pol->flags; } if (vma) {