[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Remove 2.6.11 patches directory.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 60fc40a82fa9ca43b654b00ac4effbceb577b10f # Parent ece694762d7a6229e4e2fcb44cc60511891fe6fb Remove 2.6.11 patches directory. diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/agpgart.patch --- a/patches/linux-2.6.11/agpgart.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,437 +0,0 @@ ---- linux-2.6.11/drivers/char/agp/agp.h 2005-03-02 07:38:07 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/agp.h 2005-03-22 11:14:02 +00:00 -@@ -272,6 +272,8 @@ - #define AGP_GENERIC_SIZES_ENTRIES 11 - extern struct aper_size_info_16 agp3_generic_sizes[]; - -+#define virt_to_gart(x) (phys_to_gart(virt_to_phys(x))) -+#define gart_to_virt(x) (phys_to_virt(gart_to_phys(x))) - - extern int agp_off; - extern int agp_try_unsupported_boot; ---- linux-2.6.11/drivers/char/agp/ali-agp.c 2005-03-02 07:38:13 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/ali-agp.c 2005-03-22 11:14:56 +00:00 -@@ -150,7 +150,7 @@ - pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); - pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, - (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | -- virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN )); -+ virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN )); - return addr; - } - -@@ -174,7 +174,7 @@ - pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); - pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, - (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | -- virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN)); -+ virt_to_gart(addr)) | ALI_CACHE_FLUSH_EN)); - agp_generic_destroy_page(addr); - } - ---- linux-2.6.11/drivers/char/agp/amd-k7-agp.c 2005-03-02 07:38:33 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/amd-k7-agp.c 2005-03-22 11:14:56 +00:00 -@@ -43,7 +43,7 @@ - - SetPageReserved(virt_to_page(page_map->real)); - global_cache_flush(); -- page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), -+ page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real), - PAGE_SIZE); - if (page_map->remapped == NULL) { - ClearPageReserved(virt_to_page(page_map->real)); -@@ -154,7 +154,7 @@ - - agp_bridge->gatt_table_real = (u32 *)page_dir.real; - agp_bridge->gatt_table = (u32 __iomem *)page_dir.remapped; -- agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real); -+ agp_bridge->gatt_bus_addr = virt_to_gart(page_dir.real); - - /* Get the address for the gart region. - * This is a bus address even on the alpha, b/c its -@@ -167,7 +167,7 @@ - - /* Calculate the agp offset */ - for (i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) { -- writel(virt_to_phys(amd_irongate_private.gatt_pages[i]->real) | 1, -+ writel(virt_to_gart(amd_irongate_private.gatt_pages[i]->real) | 1, - page_dir.remapped+GET_PAGE_DIR_OFF(addr)); - readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr)); /* PCI Posting. */ - } ---- linux-2.6.11/drivers/char/agp/amd64-agp.c 2005-03-02 07:38:13 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/amd64-agp.c 2005-03-22 11:14:56 +00:00 -@@ -218,7 +218,7 @@ - - static int amd_8151_configure(void) - { -- unsigned long gatt_bus = virt_to_phys(agp_bridge->gatt_table_real); -+ unsigned long gatt_bus = virt_to_gart(agp_bridge->gatt_table_real); - - /* Configure AGP regs in each x86-64 host bridge. */ - for_each_nb() { -@@ -590,7 +590,7 @@ - { - struct agp_bridge_data *bridge = pci_get_drvdata(pdev); - -- release_mem_region(virt_to_phys(bridge->gatt_table_real), -+ release_mem_region(virt_to_gart(bridge->gatt_table_real), - amd64_aperture_sizes[bridge->aperture_size_idx].size); - agp_remove_bridge(bridge); - agp_put_bridge(bridge); ---- linux-2.6.11/drivers/char/agp/ati-agp.c 2005-03-02 07:38:13 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/ati-agp.c 2005-03-22 11:14:56 +00:00 -@@ -61,7 +61,7 @@ - - SetPageReserved(virt_to_page(page_map->real)); - err = map_page_into_agp(virt_to_page(page_map->real)); -- page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), -+ page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real), - PAGE_SIZE); - if (page_map->remapped == NULL || err) { - ClearPageReserved(virt_to_page(page_map->real)); ---- linux-2.6.11/drivers/char/agp/backend.c 2005-03-02 07:38:13 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/backend.c 2005-03-22 11:14:56 +00:00 -@@ -142,7 +142,7 @@ - return -ENOMEM; - } - -- bridge->scratch_page_real = virt_to_phys(addr); -+ bridge->scratch_page_real = virt_to_gart(addr); - bridge->scratch_page = - bridge->driver->mask_memory(bridge->scratch_page_real, 0); - } -@@ -186,7 +186,7 @@ - err_out: - if (bridge->driver->needs_scratch_page) - bridge->driver->agp_destroy_page( -- phys_to_virt(bridge->scratch_page_real)); -+ gart_to_virt(bridge->scratch_page_real)); - if (got_gatt) - bridge->driver->free_gatt_table(); - if (got_keylist) { -@@ -211,7 +211,7 @@ - if (bridge->driver->agp_destroy_page && - bridge->driver->needs_scratch_page) - bridge->driver->agp_destroy_page( -- phys_to_virt(bridge->scratch_page_real)); -+ gart_to_virt(bridge->scratch_page_real)); - } - - /* XXX Kludge alert: agpgart isn't ready for multiple bridges yet */ ---- linux-2.6.11/drivers/char/agp/efficeon-agp.c 2005-03-02 07:37:30 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/efficeon-agp.c 2005-03-22 11:15:17 +00:00 -@@ -219,7 +219,7 @@ - - efficeon_private.l1_table[index] = page; - -- value = __pa(page) | pati | present | index; -+ value = virt_to_gart(page) | pati | present | index; - - pci_write_config_dword(agp_bridge->dev, - EFFICEON_ATTPAGE, value); ---- linux-2.6.11/drivers/char/agp/generic.c 2005-03-02 07:37:55 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/generic.c 2005-03-22 11:17:37 +00:00 -@@ -151,7 +151,7 @@ - } - if (curr->page_count != 0) { - for (i = 0; i < curr->page_count; i++) { -- agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[i])); -+ agp_bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[i])); - } - } - agp_free_key(curr->key); -@@ -204,7 +204,7 @@ - agp_free_memory(new); - return NULL; - } -- new->memory[i] = virt_to_phys(addr); -+ new->memory[i] = virt_to_gart(addr); - new->page_count++; - } - -@@ -697,8 +697,7 @@ - break; - } - -- table = (char *) __get_free_pages(GFP_KERNEL, -- page_order); -+ table = alloc_gatt_pages(page_order); - - if (table == NULL) { - i++; -@@ -729,7 +728,7 @@ - size = ((struct aper_size_info_fixed *) temp)->size; - page_order = ((struct aper_size_info_fixed *) temp)->page_order; - num_entries = ((struct aper_size_info_fixed *) temp)->num_entries; -- table = (char *) __get_free_pages(GFP_KERNEL, page_order); -+ table = alloc_gatt_pages(page_order); - } - - if (table == NULL) -@@ -744,7 +743,7 @@ - agp_gatt_table = (void *)table; - - agp_bridge->driver->cache_flush(); -- agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table), -+ agp_bridge->gatt_table = ioremap_nocache(virt_to_gart(table), - (PAGE_SIZE * (1 << page_order))); - agp_bridge->driver->cache_flush(); - -@@ -752,11 +751,11 @@ - for (page = virt_to_page(table); page <= virt_to_page(table_end); page++) - ClearPageReserved(page); - -- free_pages((unsigned long) table, page_order); -+ free_gatt_pages(table, page_order); - - return -ENOMEM; - } -- agp_bridge->gatt_bus_addr = virt_to_phys(agp_bridge->gatt_table_real); -+ agp_bridge->gatt_bus_addr = virt_to_gart(agp_bridge->gatt_table_real); - - /* AK: bogus, should encode addresses > 4GB */ - for (i = 0; i < num_entries; i++) { -@@ -810,7 +809,7 @@ - for (page = virt_to_page(table); page <= virt_to_page(table_end); page++) - ClearPageReserved(page); - -- free_pages((unsigned long) agp_bridge->gatt_table_real, page_order); -+ free_gatt_pages(agp_bridge->gatt_table_real, page_order); - - agp_gatt_table = NULL; - agp_bridge->gatt_table = NULL; ---- linux-2.6.11/drivers/char/agp/hp-agp.c 2005-03-02 07:38:19 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/hp-agp.c 2005-03-22 11:14:56 +00:00 -@@ -110,7 +110,7 @@ - hp->gart_size = HP_ZX1_GART_SIZE; - hp->gatt_entries = hp->gart_size / hp->io_page_size; - -- hp->io_pdir = phys_to_virt(readq(hp->ioc_regs+HP_ZX1_PDIR_BASE)); -+ hp->io_pdir = gart_to_virt(readq(hp->ioc_regs+HP_ZX1_PDIR_BASE)); - hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; - - if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) { -@@ -248,7 +248,7 @@ - agp_bridge->mode = readl(hp->lba_regs+hp->lba_cap_offset+PCI_AGP_STATUS); - - if (hp->io_pdir_owner) { -- writel(virt_to_phys(hp->io_pdir), hp->ioc_regs+HP_ZX1_PDIR_BASE); -+ writel(virt_to_gart(hp->io_pdir), hp->ioc_regs+HP_ZX1_PDIR_BASE); - readl(hp->ioc_regs+HP_ZX1_PDIR_BASE); - writel(hp->io_tlb_ps, hp->ioc_regs+HP_ZX1_TCNFG); - readl(hp->ioc_regs+HP_ZX1_TCNFG); ---- linux-2.6.11/drivers/char/agp/i460-agp.c 2005-03-02 07:38:10 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/i460-agp.c 2005-03-22 11:14:56 +00:00 -@@ -371,7 +371,7 @@ - } - memset(lp->alloced_map, 0, map_size); - -- lp->paddr = virt_to_phys(lpage); -+ lp->paddr = virt_to_gart(lpage); - lp->refcount = 0; - atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); - return 0; -@@ -382,7 +382,7 @@ - kfree(lp->alloced_map); - lp->alloced_map = NULL; - -- free_pages((unsigned long) phys_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT); -+ free_pages((unsigned long) gart_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT); - atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); - } - ---- linux-2.6.11/drivers/char/agp/intel-agp.c 2005-03-02 07:38:09 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/intel-agp.c 2005-03-22 11:14:56 +00:00 -@@ -285,7 +285,7 @@ - if (new == NULL) - return NULL; - -- new->memory[0] = virt_to_phys(addr); -+ new->memory[0] = virt_to_gart(addr); - if (pg_count == 4) { - /* kludge to get 4 physical pages for ARGB cursor */ - new->memory[1] = new->memory[0] + PAGE_SIZE; -@@ -328,10 +328,10 @@ - agp_free_key(curr->key); - if(curr->type == AGP_PHYS_MEMORY) { - if (curr->page_count == 4) -- i8xx_destroy_pages(phys_to_virt(curr->memory[0])); -+ i8xx_destroy_pages(gart_to_virt(curr->memory[0])); - else - agp_bridge->driver->agp_destroy_page( -- phys_to_virt(curr->memory[0])); -+ gart_to_virt(curr->memory[0])); - vfree(curr->memory); - } - kfree(curr); ---- linux-2.6.11/drivers/char/agp/intel-mch-agp.c 2005-03-02 07:37:48 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/intel-mch-agp.c 2005-03-22 11:14:56 +00:00 -@@ -51,7 +51,7 @@ - if (new == NULL) - return NULL; - -- new->memory[0] = virt_to_phys(addr); -+ new->memory[0] = virt_to_gart(addr); - new->page_count = 1; - new->num_scratch_pages = 1; - new->type = AGP_PHYS_MEMORY; -@@ -63,7 +63,7 @@ - { - agp_free_key(curr->key); - if(curr->type == AGP_PHYS_MEMORY) { -- agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[0])); -+ agp_bridge->driver->agp_destroy_page(gart_to_virt(curr->memory[0])); - vfree(curr->memory); - } - kfree(curr); ---- linux-2.6.11/drivers/char/agp/sworks-agp.c 2005-03-02 07:38:37 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/sworks-agp.c 2005-03-22 11:14:56 +00:00 -@@ -51,7 +51,7 @@ - } - SetPageReserved(virt_to_page(page_map->real)); - global_cache_flush(); -- page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), -+ page_map->remapped = ioremap_nocache(virt_to_gart(page_map->real), - PAGE_SIZE); - if (page_map->remapped == NULL) { - ClearPageReserved(virt_to_page(page_map->real)); -@@ -162,7 +162,7 @@ - /* Create a fake scratch directory */ - for(i = 0; i < 1024; i++) { - writel(agp_bridge->scratch_page, serverworks_private.scratch_dir.remapped+i); -- writel(virt_to_phys(serverworks_private.scratch_dir.real) | 1, page_dir.remapped+i); -+ writel(virt_to_gart(serverworks_private.scratch_dir.real) | 1, page_dir.remapped+i); - } - - retval = serverworks_create_gatt_pages(value->num_entries / 1024); -@@ -174,7 +174,7 @@ - - agp_bridge->gatt_table_real = (u32 *)page_dir.real; - agp_bridge->gatt_table = (u32 __iomem *)page_dir.remapped; -- agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real); -+ agp_bridge->gatt_bus_addr = virt_to_gart(page_dir.real); - - /* Get the address for the gart region. - * This is a bus address even on the alpha, b/c its -@@ -187,7 +187,7 @@ - /* Calculate the agp offset */ - - for(i = 0; i < value->num_entries / 1024; i++) -- writel(virt_to_phys(serverworks_private.gatt_pages[i]->real)|1, page_dir.remapped+i); -+ writel(virt_to_gart(serverworks_private.gatt_pages[i]->real)|1, page_dir.remapped+i); - - return 0; - } ---- linux-2.6.11/drivers/char/agp/uninorth-agp.c 2005-03-02 07:38:09 +00:00 -+++ linux-2.6.11-agp/drivers/char/agp/uninorth-agp.c 2005-03-22 11:14:56 +00:00 -@@ -200,7 +200,7 @@ - - agp_bridge->gatt_table_real = (u32 *) table; - agp_bridge->gatt_table = (u32 *)table; -- agp_bridge->gatt_bus_addr = virt_to_phys(table); -+ agp_bridge->gatt_bus_addr = virt_to_gart(table); - - for (i = 0; i < num_entries; i++) { - agp_bridge->gatt_table[i] = ---- linux-2.6.11/include/asm-alpha/agp.h 2005-03-02 07:37:39 +00:00 -+++ linux-2.6.11-agp/include/asm-alpha/agp.h 2005-03-22 11:18:34 +00:00 -@@ -10,4 +10,14 @@ - #define flush_agp_mappings() - #define flush_agp_cache() mb() - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif ---- linux-2.6.11/include/asm-i386/agp.h 2005-03-02 07:37:31 +00:00 -+++ linux-2.6.11-agp/include/asm-i386/agp.h 2005-03-22 11:18:39 +00:00 -@@ -21,4 +21,14 @@ - worth it. Would need a page for it. */ - #define flush_agp_cache() asm volatile("wbinvd":::"memory") - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif ---- linux-2.6.11/include/asm-ia64/agp.h 2005-03-02 07:38:09 +00:00 -+++ linux-2.6.11-agp/include/asm-ia64/agp.h 2005-03-22 11:18:45 +00:00 -@@ -18,4 +18,14 @@ - #define flush_agp_mappings() /* nothing */ - #define flush_agp_cache() mb() - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif /* _ASM_IA64_AGP_H */ ---- linux-2.6.11/include/asm-ppc/agp.h 2005-03-02 07:38:08 +00:00 -+++ linux-2.6.11-agp/include/asm-ppc/agp.h 2005-03-22 11:18:52 +00:00 -@@ -10,4 +10,14 @@ - #define flush_agp_mappings() - #define flush_agp_cache() mb() - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif ---- linux-2.6.11/include/asm-sparc64/agp.h 2005-03-02 07:37:48 +00:00 -+++ linux-2.6.11-agp/include/asm-sparc64/agp.h 2005-03-22 11:18:59 +00:00 -@@ -8,4 +8,14 @@ - #define flush_agp_mappings() - #define flush_agp_cache() mb() - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif ---- linux-2.6.11/include/asm-x86_64/agp.h 2005-03-02 07:37:30 +00:00 -+++ linux-2.6.11-agp/include/asm-x86_64/agp.h 2005-03-22 11:18:22 +00:00 -@@ -19,4 +19,14 @@ - worth it. Would need a page for it. */ - #define flush_agp_cache() asm volatile("wbinvd":::"memory") - -+/* Convert a physical address to an address suitable for the GART. */ -+#define phys_to_gart(x) (x) -+#define gart_to_phys(x) (x) -+ -+/* GATT allocation. Returns/accepts GATT kernel virtual address. */ -+#define alloc_gatt_pages(order) \ -+ ((char *)__get_free_pages(GFP_KERNEL, (order))) -+#define free_gatt_pages(table, order) \ -+ free_pages((unsigned long)(table), (order)) -+ - #endif diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/i386-cpu-hotplug-updated-for-mm.patch --- a/patches/linux-2.6.11/i386-cpu-hotplug-updated-for-mm.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,656 +0,0 @@ - -From: Zwane Mwaikambo <zwane@xxxxxxxxxxxxx> - -Find attached the i386 cpu hotplug patch updated for Ingo's latest round of -goodies. In order to avoid dumping cpu hotplug code into kernel/irq/* i -dropped the cpu_online check in do_IRQ() by modifying fixup_irqs(). The -difference being that on cpu offline, fixup_irqs() is called before we -clear the cpu from cpu_online_map and a long delay in order to ensure that -we never have any queued external interrupts on the APICs. Due to my usual -test victims being in boxes a continent away this hasn't been tested, but -i'll cover bug reports (nudge, Nathan! ;) - -1) Add CONFIG_HOTPLUG_CPU -2) disable local APIC timer on dead cpus. -3) Disable preempt around irq balancing to prevent CPUs going down. -4) Print irq stats for all possible cpus. -5) Debugging check for interrupts on offline cpus. -6) Hacky fixup_irqs() to redirect irqs when cpus go off/online. -7) play_dead() for offline cpus to spin inside. -8) Handle offline cpus set in flush_tlb_others(). -9) Grab lock earlier in smp_call_function() to prevent CPUs going down. -10) Implement __cpu_disable() and __cpu_die(). -11) Enable local interrupts in cpu_enable() after fixup_irqs() -12) Don't fiddle with NMI on dead cpu, but leave intact on other cpus. -13) Program IRQ affinity whilst cpu is still in cpu_online_map on offline. - -Signed-off-by: Zwane Mwaikambo <zwane@xxxxxxxxxxxxx> -DESC -ppc64: fix hotplug cpu -EDESC -From: Zwane Mwaikambo <zwane@xxxxxxxxxxx> - -I seem to have broken this when I moved the clearing of the dying cpu to -arch specific code. - -Signed-off-by: Zwane Mwaikambo <zwane@xxxxxxxxxxx> -Signed-off-by: Andrew Morton <akpm@xxxxxxxx> ---- - - 25-akpm/arch/i386/Kconfig | 9 ++ - 25-akpm/arch/i386/kernel/apic.c | 3 - 25-akpm/arch/i386/kernel/io_apic.c | 2 - 25-akpm/arch/i386/kernel/irq.c | 66 +++++++++++++++++---- - 25-akpm/arch/i386/kernel/msr.c | 2 - 25-akpm/arch/i386/kernel/process.c | 35 +++++++++++ - 25-akpm/arch/i386/kernel/smp.c | 25 +++++--- - 25-akpm/arch/i386/kernel/smpboot.c | 98 ++++++++++++++++++++++++++++++-- - 25-akpm/arch/i386/kernel/traps.c | 8 ++ - 25-akpm/arch/ia64/kernel/smpboot.c | 3 - 25-akpm/arch/ppc64/kernel/pSeries_smp.c | 5 + - 25-akpm/arch/s390/kernel/smp.c | 4 - - 25-akpm/include/asm-i386/cpu.h | 2 - 25-akpm/include/asm-i386/irq.h | 4 + - 25-akpm/include/asm-i386/smp.h | 3 - 25-akpm/kernel/cpu.c | 14 +--- - arch/ppc64/kernel/smp.c | 0 - 17 files changed, 242 insertions(+), 41 deletions(-) - -diff -puN arch/i386/Kconfig~i386-cpu-hotplug-updated-for-mm arch/i386/Kconfig ---- 25/arch/i386/Kconfig~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/Kconfig 2005-02-23 02:20:06.000000000 -0800 -@@ -1205,6 +1205,15 @@ config SCx200 - This support is also available as a module. If compiled as a - module, it will be called scx200. - -+config HOTPLUG_CPU -+ bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" -+ depends on SMP && HOTPLUG && EXPERIMENTAL -+ ---help--- -+ Say Y here to experiment with turning CPUs off and on. CPUs -+ can be controlled through /sys/devices/system/cpu. -+ -+ Say N. -+ - source "drivers/pcmcia/Kconfig" - - source "drivers/pci/hotplug/Kconfig" -diff -puN arch/i386/kernel/apic.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/apic.c ---- 25/arch/i386/kernel/apic.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/apic.c 2005-02-23 02:20:06.000000000 -0800 -@@ -26,6 +26,7 @@ - #include <linux/mc146818rtc.h> - #include <linux/kernel_stat.h> - #include <linux/sysdev.h> -+#include <linux/cpu.h> - - #include <asm/atomic.h> - #include <asm/smp.h> -@@ -1048,7 +1049,7 @@ void __init setup_secondary_APIC_clock(v - setup_APIC_timer(calibration_result); - } - --void __init disable_APIC_timer(void) -+void __devinit disable_APIC_timer(void) - { - if (using_apic_timer) { - unsigned long v; -diff -puN arch/i386/kernel/io_apic.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/io_apic.c ---- 25/arch/i386/kernel/io_apic.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/io_apic.c 2005-02-23 02:20:06.000000000 -0800 -@@ -576,9 +576,11 @@ static int balanced_irq(void *unused) - try_to_freeze(PF_FREEZE); - if (time_after(jiffies, - prev_balance_time+balanced_irq_interval)) { -+ preempt_disable(); - do_irq_balance(); - prev_balance_time = jiffies; - time_remaining = balanced_irq_interval; -+ preempt_enable(); - } - } - return 0; -diff -puN arch/i386/kernel/irq.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/irq.c ---- 25/arch/i386/kernel/irq.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/irq.c 2005-02-23 02:20:06.000000000 -0800 -@@ -15,6 +15,9 @@ - #include <linux/seq_file.h> - #include <linux/interrupt.h> - #include <linux/kernel_stat.h> -+#include <linux/notifier.h> -+#include <linux/cpu.h> -+#include <linux/delay.h> - - #ifndef CONFIG_X86_LOCAL_APIC - /* -@@ -209,9 +212,8 @@ int show_interrupts(struct seq_file *p, - - if (i == 0) { - seq_printf(p, " "); -- for (j=0; j<NR_CPUS; j++) -- if (cpu_online(j)) -- seq_printf(p, "CPU%d ",j); -+ for_each_cpu(j) -+ seq_printf(p, "CPU%d ",j); - seq_putc(p, '\n'); - } - -@@ -224,9 +226,8 @@ int show_interrupts(struct seq_file *p, - #ifndef CONFIG_SMP - seq_printf(p, "%10u ", kstat_irqs(i)); - #else -- for (j = 0; j < NR_CPUS; j++) -- if (cpu_online(j)) -- seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); -+ for_each_cpu(j) -+ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); - #endif - seq_printf(p, " %14s", irq_desc[i].handler->typename); - seq_printf(p, " %s", action->name); -@@ -239,16 +240,13 @@ skip: - spin_unlock_irqrestore(&irq_desc[i].lock, flags); - } else if (i == NR_IRQS) { - seq_printf(p, "NMI: "); -- for (j = 0; j < NR_CPUS; j++) -- if (cpu_online(j)) -- seq_printf(p, "%10u ", nmi_count(j)); -+ for_each_cpu(j) -+ seq_printf(p, "%10u ", nmi_count(j)); - seq_putc(p, '\n'); - #ifdef CONFIG_X86_LOCAL_APIC - seq_printf(p, "LOC: "); -- for (j = 0; j < NR_CPUS; j++) -- if (cpu_online(j)) -- seq_printf(p, "%10u ", -- irq_stat[j].apic_timer_irqs); -+ for_each_cpu(j) -+ seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs); - seq_putc(p, '\n'); - #endif - seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); -@@ -258,3 +256,45 @@ skip: - } - return 0; - } -+ -+#ifdef CONFIG_HOTPLUG_CPU -+#include <mach_apic.h> -+ -+void fixup_irqs(cpumask_t map) -+{ -+ unsigned int irq; -+ static int warned; -+ -+ for (irq = 0; irq < NR_IRQS; irq++) { -+ cpumask_t mask; -+ if (irq == 2) -+ continue; -+ -+ cpus_and(mask, irq_affinity[irq], map); -+ if (any_online_cpu(mask) == NR_CPUS) { -+ printk("Breaking affinity for irq %i\n", irq); -+ mask = map; -+ } -+ if (irq_desc[irq].handler->set_affinity) -+ irq_desc[irq].handler->set_affinity(irq, mask); -+ else if (irq_desc[irq].action && !(warned++)) -+ printk("Cannot set affinity for irq %i\n", irq); -+ } -+ -+#if 0 -+ barrier(); -+ /* Ingo Molnar says: "after the IO-APIC masks have been redirected -+ [note the nop - the interrupt-enable boundary on x86 is two -+ instructions from sti] - to flush out pending hardirqs and -+ IPIs. After this point nothing is supposed to reach this CPU." */ -+ __asm__ __volatile__("sti; nop; cli"); -+ barrier(); -+#else -+ /* That doesn't seem sufficient. Give it 1ms. */ -+ local_irq_enable(); -+ mdelay(1); -+ local_irq_disable(); -+#endif -+} -+#endif -+ -diff -puN arch/i386/kernel/msr.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/msr.c ---- 25/arch/i386/kernel/msr.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/msr.c 2005-02-23 02:20:06.000000000 -0800 -@@ -260,7 +260,7 @@ static struct file_operations msr_fops = - .open = msr_open, - }; - --static int msr_class_simple_device_add(int i) -+static int __devinit msr_class_simple_device_add(int i) - { - int err = 0; - struct class_device *class_err; -diff -puN arch/i386/kernel/process.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/process.c ---- 25/arch/i386/kernel/process.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/process.c 2005-02-23 02:20:06.000000000 -0800 -@@ -13,6 +13,7 @@ - - #include <stdarg.h> - -+#include <linux/cpu.h> - #include <linux/errno.h> - #include <linux/sched.h> - #include <linux/fs.h> -@@ -55,6 +56,9 @@ - #include <linux/irq.h> - #include <linux/err.h> - -+#include <asm/tlbflush.h> -+#include <asm/cpu.h> -+ - asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); - - int hlt_counter; -@@ -139,6 +143,34 @@ static void poll_idle (void) - } - } - -+#ifdef CONFIG_HOTPLUG_CPU -+#include <asm/nmi.h> -+/* We don't actually take CPU down, just spin without interrupts. */ -+static inline void play_dead(void) -+{ -+ /* Ack it */ -+ __get_cpu_var(cpu_state) = CPU_DEAD; -+ -+ /* We shouldn't have to disable interrupts while dead, but -+ * some interrupts just don't seem to go away, and this makes -+ * it "work" for testing purposes. */ -+ /* Death loop */ -+ while (__get_cpu_var(cpu_state) != CPU_UP_PREPARE) -+ cpu_relax(); -+ -+ local_irq_disable(); -+ __flush_tlb_all(); -+ cpu_set(smp_processor_id(), cpu_online_map); -+ enable_APIC_timer(); -+ local_irq_enable(); -+} -+#else -+static inline void play_dead(void) -+{ -+ BUG(); -+} -+#endif /* CONFIG_HOTPLUG_CPU */ -+ - /* - * The idle thread. There's no useful work to be - * done, so just try to conserve power and have a -@@ -162,6 +194,9 @@ void cpu_idle (void) - if (!idle) - idle = default_idle; - -+ if (cpu_is_offline(cpu)) -+ play_dead(); -+ - irq_stat[cpu].idle_timestamp = jiffies; - idle(); - } -diff -puN arch/i386/kernel/smpboot.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/smpboot.c ---- 25/arch/i386/kernel/smpboot.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/smpboot.c 2005-02-23 02:20:06.000000000 -0800 -@@ -44,6 +44,9 @@ - #include <linux/smp_lock.h> - #include <linux/irq.h> - #include <linux/bootmem.h> -+#include <linux/notifier.h> -+#include <linux/cpu.h> -+#include <linux/percpu.h> - - #include <linux/delay.h> - #include <linux/mc146818rtc.h> -@@ -89,6 +92,9 @@ extern unsigned char trampoline_end []; - static unsigned char *trampoline_base; - static int trampoline_exec; - -+/* State of each CPU. */ -+DEFINE_PER_CPU(int, cpu_state) = { 0 }; -+ - /* - * Currently trivial. Write the real->protected mode - * bootstrap into the page concerned. The caller -@@ -1095,6 +1101,9 @@ static void __init smp_boot_cpus(unsigne - who understands all this stuff should rewrite it properly. --RR 15/Jul/02 */ - void __init smp_prepare_cpus(unsigned int max_cpus) - { -+ smp_commenced_mask = cpumask_of_cpu(0); -+ cpu_callin_map = cpumask_of_cpu(0); -+ mb(); - smp_boot_cpus(max_cpus); - } - -@@ -1104,20 +1113,99 @@ void __devinit smp_prepare_boot_cpu(void - cpu_set(smp_processor_id(), cpu_callout_map); - } - --int __devinit __cpu_up(unsigned int cpu) -+#ifdef CONFIG_HOTPLUG_CPU -+ -+/* must be called with the cpucontrol mutex held */ -+static int __devinit cpu_enable(unsigned int cpu) - { -- /* This only works at boot for x86. See "rewrite" above. */ -- if (cpu_isset(cpu, smp_commenced_mask)) { -- local_irq_enable(); -- return -ENOSYS; -+ /* get the target out of its holding state */ -+ per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; -+ wmb(); -+ -+ /* wait for the processor to ack it. timeout? */ -+ while (!cpu_online(cpu)) -+ cpu_relax(); -+ -+ fixup_irqs(cpu_online_map); -+ /* counter the disable in fixup_irqs() */ -+ local_irq_enable(); -+ return 0; -+} -+ -+int __cpu_disable(void) -+{ -+ cpumask_t map = cpu_online_map; -+ int cpu = smp_processor_id(); -+ -+ /* -+ * Perhaps use cpufreq to drop frequency, but that could go -+ * into generic code. -+ * -+ * We won't take down the boot processor on i386 due to some -+ * interrupts only being able to be serviced by the BSP. -+ * Especially so if we're not using an IOAPIC -zwane -+ */ -+ if (cpu == 0) -+ return -EBUSY; -+ -+ /* We enable the timer again on the exit path of the death loop */ -+ disable_APIC_timer(); -+ /* Allow any queued timer interrupts to get serviced */ -+ local_irq_enable(); -+ mdelay(1); -+ local_irq_disable(); -+ -+ cpu_clear(cpu, map); -+ fixup_irqs(map); -+ /* It's now safe to remove this processor from the online map */ -+ cpu_clear(cpu, cpu_online_map); -+ return 0; -+} -+ -+void __cpu_die(unsigned int cpu) -+{ -+ /* We don't do anything here: idle task is faking death itself. */ -+ unsigned int i; -+ -+ for (i = 0; i < 10; i++) { -+ /* They ack this in play_dead by setting CPU_DEAD */ -+ if (per_cpu(cpu_state, cpu) == CPU_DEAD) -+ return; -+ current->state = TASK_UNINTERRUPTIBLE; -+ schedule_timeout(HZ/10); - } -+ printk(KERN_ERR "CPU %u didn't die...\n", cpu); -+} -+#else /* ... !CONFIG_HOTPLUG_CPU */ -+int __cpu_disable(void) -+{ -+ return -ENOSYS; -+} - -+void __cpu_die(unsigned int cpu) -+{ -+ /* We said "no" in __cpu_disable */ -+ BUG(); -+} -+#endif /* CONFIG_HOTPLUG_CPU */ -+ -+int __devinit __cpu_up(unsigned int cpu) -+{ - /* In case one didn't come up */ - if (!cpu_isset(cpu, cpu_callin_map)) { -+ printk(KERN_DEBUG "skipping cpu%d, didn't come online\n", cpu); - local_irq_enable(); - return -EIO; - } - -+#ifdef CONFIG_HOTPLUG_CPU -+ /* Already up, and in cpu_quiescent now? */ -+ if (cpu_isset(cpu, smp_commenced_mask)) { -+ cpu_enable(cpu); -+ return 0; -+ } -+#endif -+ - local_irq_enable(); - /* Unleash the CPU! */ - cpu_set(cpu, smp_commenced_mask); -diff -puN arch/i386/kernel/smp.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/smp.c ---- 25/arch/i386/kernel/smp.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/smp.c 2005-02-23 02:20:06.000000000 -0800 -@@ -19,6 +19,7 @@ - #include <linux/mc146818rtc.h> - #include <linux/cache.h> - #include <linux/interrupt.h> -+#include <linux/cpu.h> - - #include <asm/mtrr.h> - #include <asm/tlbflush.h> -@@ -163,7 +164,7 @@ void send_IPI_mask_bitmask(cpumask_t cpu - unsigned long flags; - - local_irq_save(flags); -- -+ WARN_ON(mask & ~cpus_addr(cpu_online_map)[0]); - /* - * Wait for idle. - */ -@@ -345,21 +346,21 @@ out: - static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, - unsigned long va) - { -- cpumask_t tmp; - /* - * A couple of (to be removed) sanity checks: - * -- * - we do not send IPIs to not-yet booted CPUs. - * - current CPU must not be in mask - * - mask must exist :) - */ - BUG_ON(cpus_empty(cpumask)); -- -- cpus_and(tmp, cpumask, cpu_online_map); -- BUG_ON(!cpus_equal(cpumask, tmp)); - BUG_ON(cpu_isset(smp_processor_id(), cpumask)); - BUG_ON(!mm); - -+ /* If a CPU which we ran on has gone down, OK. */ -+ cpus_and(cpumask, cpumask, cpu_online_map); -+ if (cpus_empty(cpumask)) -+ return; -+ - /* - * i'm not happy about this global shared spinlock in the - * MM hot path, but we'll see how contended it is. -@@ -484,6 +485,7 @@ void smp_send_nmi_allbutself(void) - */ - void smp_send_reschedule(int cpu) - { -+ WARN_ON(cpu_is_offline(cpu)); - send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR); - } - -@@ -524,10 +526,16 @@ int smp_call_function (void (*func) (voi - */ - { - struct call_data_struct data; -- int cpus = num_online_cpus()-1; -+ int cpus; - -- if (!cpus) -+ /* Holding any lock stops cpus from going down. */ -+ spin_lock(&call_lock); -+ cpus = num_online_cpus()-1; -+ -+ if (!cpus) { -+ spin_unlock(&call_lock); - return 0; -+ } - - /* Can deadlock when called with interrupts disabled */ - WARN_ON(irqs_disabled()); -@@ -539,7 +547,6 @@ int smp_call_function (void (*func) (voi - if (wait) - atomic_set(&data.finished, 0); - -- spin_lock(&call_lock); - call_data = &data; - mb(); - -diff -puN arch/i386/kernel/traps.c~i386-cpu-hotplug-updated-for-mm arch/i386/kernel/traps.c ---- 25/arch/i386/kernel/traps.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/i386/kernel/traps.c 2005-02-23 02:20:06.000000000 -0800 -@@ -669,6 +669,14 @@ fastcall void do_nmi(struct pt_regs * re - nmi_enter(); - - cpu = smp_processor_id(); -+ -+#ifdef CONFIG_HOTPLUG_CPU -+ if (!cpu_online(cpu)) { -+ nmi_exit(); -+ return; -+ } -+#endif -+ - ++nmi_count(cpu); - - if (!nmi_callback(regs, cpu)) -diff -puN arch/ia64/kernel/smpboot.c~i386-cpu-hotplug-updated-for-mm arch/ia64/kernel/smpboot.c ---- 25/arch/ia64/kernel/smpboot.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/ia64/kernel/smpboot.c 2005-02-23 02:20:06.000000000 -0800 -@@ -590,9 +590,10 @@ int __cpu_disable(void) - if (cpu == 0) - return -EBUSY; - -+ cpu_clear(cpu, cpu_online_map); - fixup_irqs(); - local_flush_tlb_all(); -- printk ("Disabled cpu %u\n", smp_processor_id()); -+ printk("Disabled cpu %u\n", cpu); - return 0; - } - -diff -puN arch/ppc64/kernel/smp.c~i386-cpu-hotplug-updated-for-mm arch/ppc64/kernel/smp.c -diff -puN arch/s390/kernel/smp.c~i386-cpu-hotplug-updated-for-mm arch/s390/kernel/smp.c ---- 25/arch/s390/kernel/smp.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/arch/s390/kernel/smp.c 2005-02-23 02:20:06.000000000 -0800 -@@ -679,12 +679,14 @@ __cpu_disable(void) - { - unsigned long flags; - ec_creg_mask_parms cr_parms; -+ int cpu = smp_processor_id(); - - spin_lock_irqsave(&smp_reserve_lock, flags); -- if (smp_cpu_reserved[smp_processor_id()] != 0) { -+ if (smp_cpu_reserved[cpu] != 0) { - spin_unlock_irqrestore(&smp_reserve_lock, flags); - return -EBUSY; - } -+ cpu_clear(cpu, cpu_online_map); - - #ifdef CONFIG_PFAULT - /* Disable pfault pseudo page faults on this cpu. */ -diff -puN include/asm-i386/cpu.h~i386-cpu-hotplug-updated-for-mm include/asm-i386/cpu.h ---- 25/include/asm-i386/cpu.h~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/include/asm-i386/cpu.h 2005-02-23 02:20:06.000000000 -0800 -@@ -5,6 +5,7 @@ - #include <linux/cpu.h> - #include <linux/topology.h> - #include <linux/nodemask.h> -+#include <linux/percpu.h> - - #include <asm/node.h> - -@@ -17,4 +18,5 @@ extern int arch_register_cpu(int num); - extern void arch_unregister_cpu(int); - #endif - -+DECLARE_PER_CPU(int, cpu_state); - #endif /* _ASM_I386_CPU_H_ */ -diff -puN include/asm-i386/irq.h~i386-cpu-hotplug-updated-for-mm include/asm-i386/irq.h ---- 25/include/asm-i386/irq.h~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/include/asm-i386/irq.h 2005-02-23 02:20:06.000000000 -0800 -@@ -38,4 +38,8 @@ extern void release_vm86_irqs(struct tas - extern int irqbalance_disable(char *str); - #endif - -+#ifdef CONFIG_HOTPLUG_CPU -+extern void fixup_irqs(cpumask_t map); -+#endif -+ - #endif /* _ASM_IRQ_H */ -diff -puN include/asm-i386/smp.h~i386-cpu-hotplug-updated-for-mm include/asm-i386/smp.h ---- 25/include/asm-i386/smp.h~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/include/asm-i386/smp.h 2005-02-23 02:20:06.000000000 -0800 -@@ -85,6 +85,9 @@ static __inline int logical_smp_processo - } - - #endif -+ -+extern int __cpu_disable(void); -+extern void __cpu_die(unsigned int cpu); - #endif /* !__ASSEMBLY__ */ - - #define NO_PROC_ID 0xFF /* No processor magic marker */ -diff -puN kernel/cpu.c~i386-cpu-hotplug-updated-for-mm kernel/cpu.c ---- 25/kernel/cpu.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:06.000000000 -0800 -+++ 25-akpm/kernel/cpu.c 2005-02-23 02:20:06.000000000 -0800 -@@ -63,19 +63,15 @@ static int take_cpu_down(void *unused) - { - int err; - -- /* Take offline: makes arch_cpu_down somewhat easier. */ -- cpu_clear(smp_processor_id(), cpu_online_map); -- - /* Ensure this CPU doesn't handle any more interrupts. */ - err = __cpu_disable(); - if (err < 0) -- cpu_set(smp_processor_id(), cpu_online_map); -- else -- /* Force idle task to run as soon as we yield: it should -- immediately notice cpu is offline and die quickly. */ -- sched_idle_next(); -+ return err; - -- return err; -+ /* Force idle task to run as soon as we yield: it should -+ immediately notice cpu is offline and die quickly. */ -+ sched_idle_next(); -+ return 0; - } - - int cpu_down(unsigned int cpu) -diff -puN arch/ppc64/kernel/pSeries_smp.c~i386-cpu-hotplug-updated-for-mm arch/ppc64/kernel/pSeries_smp.c ---- 25/arch/ppc64/kernel/pSeries_smp.c~i386-cpu-hotplug-updated-for-mm 2005-02-23 02:20:08.000000000 -0800 -+++ 25-akpm/arch/ppc64/kernel/pSeries_smp.c 2005-02-23 02:20:08.000000000 -0800 -@@ -86,10 +86,13 @@ static int query_cpu_stopped(unsigned in - - int pSeries_cpu_disable(void) - { -+ int cpu = smp_processor_id(); -+ -+ cpu_clear(cpu, cpu_online_map); - systemcfg->processorCount--; - - /*fix boot_cpuid here*/ -- if (smp_processor_id() == boot_cpuid) -+ if (cpu == boot_cpuid) - boot_cpuid = any_online_cpu(cpu_online_map); - - /* FIXME: abstract this to not be platform specific later on */ -_ diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/iomap.patch --- a/patches/linux-2.6.11/iomap.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,120 +0,0 @@ -diff -ur linux-2.6.11/drivers/char/agp/frontend.c linux-2.6.11-io/drivers/char/agp/frontend.c ---- linux-2.6.11/drivers/char/agp/frontend.c 2005-03-02 07:37:49.000000000 +0000 -+++ linux-2.6.11-io/drivers/char/agp/frontend.c 2005-03-15 17:38:30.000000000 +0000 -@@ -627,7 +627,7 @@ - DBG("client vm_ops=%p", kerninfo.vm_ops); - if (kerninfo.vm_ops) { - vma->vm_ops = kerninfo.vm_ops; -- } else if (remap_pfn_range(vma, vma->vm_start, -+ } else if (io_remap_pfn_range(vma, vma->vm_start, - (kerninfo.aper_base + offset) >> PAGE_SHIFT, - size, vma->vm_page_prot)) { - goto out_again; -@@ -643,7 +643,7 @@ - DBG("controller vm_ops=%p", kerninfo.vm_ops); - if (kerninfo.vm_ops) { - vma->vm_ops = kerninfo.vm_ops; -- } else if (remap_pfn_range(vma, vma->vm_start, -+ } else if (io_remap_pfn_range(vma, vma->vm_start, - kerninfo.aper_base >> PAGE_SHIFT, - size, vma->vm_page_prot)) { - goto out_again; -diff -ur linux-2.6.11/drivers/char/drm/drm_vm.c linux-2.6.11-io/drivers/char/drm/drm_vm.c ---- linux-2.6.11/drivers/char/drm/drm_vm.c 2005-03-02 07:38:33.000000000 +0000 -+++ linux-2.6.11-io/drivers/char/drm/drm_vm.c 2005-03-15 17:43:26.000000000 +0000 -@@ -630,7 +630,7 @@ - vma->vm_end - vma->vm_start, - vma->vm_page_prot, 0)) - #else -- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, -+ if (io_remap_pfn_range(vma, vma->vm_start, - (VM_OFFSET(vma) + offset) >> PAGE_SHIFT, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -diff -ur linux-2.6.11/drivers/char/drm/i810_dma.c linux-2.6.11-io/drivers/char/drm/i810_dma.c ---- linux-2.6.11/drivers/char/drm/i810_dma.c 2005-03-02 07:37:55.000000000 +0000 -+++ linux-2.6.11-io/drivers/char/drm/i810_dma.c 2005-03-15 17:53:36.000000000 +0000 -@@ -139,7 +139,7 @@ - buf_priv->currently_mapped = I810_BUF_MAPPED; - unlock_kernel(); - -- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, -+ if (io_remap_pfn_range(vma, vma->vm_start, - VM_OFFSET(vma) >> PAGE_SHIFT, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) return -EAGAIN; -diff -ur linux-2.6.11/drivers/char/drm/i830_dma.c linux-2.6.11-io/drivers/char/drm/i830_dma.c ---- linux-2.6.11/drivers/char/drm/i830_dma.c 2005-03-02 07:37:48.000000000 +0000 -+++ linux-2.6.11-io/drivers/char/drm/i830_dma.c 2005-03-15 17:53:46.000000000 +0000 -@@ -157,7 +157,7 @@ - buf_priv->currently_mapped = I830_BUF_MAPPED; - unlock_kernel(); - -- if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, -+ if (io_remap_pfn_range(vma, vma->vm_start, - VM_OFFSET(vma) >> PAGE_SHIFT, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) return -EAGAIN; -diff -ur linux-2.6.11/drivers/char/hpet.c linux-2.6.11-io/drivers/char/hpet.c ---- linux-2.6.11/drivers/char/hpet.c 2005-03-02 07:38:10.000000000 +0000 -+++ linux-2.6.11-io/drivers/char/hpet.c 2005-03-15 17:37:22.000000000 +0000 -@@ -76,6 +76,7 @@ - struct hpets { - struct hpets *hp_next; - struct hpet __iomem *hp_hpet; -+ unsigned long hp_hpet_phys; - struct time_interpolator *hp_interpolator; - unsigned long hp_period; - unsigned long hp_delta; -@@ -265,7 +266,7 @@ - return -EINVAL; - - devp = file->private_data; -- addr = (unsigned long)devp->hd_hpet; -+ addr = devp->hd_hpets->hp_hpet_phys; - - if (addr & (PAGE_SIZE - 1)) - return -ENOSYS; -@@ -274,7 +275,7 @@ - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - addr = __pa(addr); - -- if (remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, -+ if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, - PAGE_SIZE, vma->vm_page_prot)) { - printk(KERN_ERR "remap_pfn_range failed in hpet.c\n"); - return -EAGAIN; -@@ -795,6 +796,7 @@ - - hpetp->hp_which = hpet_nhpet++; - hpetp->hp_hpet = hdp->hd_address; -+ hpetp->hp_hpet_phys = hdp->hd_phys_address; - - hpetp->hp_ntimer = hdp->hd_nirqs; - -diff -ur linux-2.6.11/drivers/sbus/char/flash.c linux-2.6.11-io/drivers/sbus/char/flash.c ---- linux-2.6.11/drivers/sbus/char/flash.c 2005-03-02 07:38:10.000000000 +0000 -+++ linux-2.6.11-io/drivers/sbus/char/flash.c 2005-03-15 17:20:22.000000000 +0000 -@@ -75,7 +75,7 @@ - pgprot_val(vma->vm_page_prot) |= _PAGE_E; - vma->vm_flags |= (VM_SHM | VM_LOCKED); - -- if (remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) -+ if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) - return -EAGAIN; - - return 0; -diff -ur linux-2.6.11/include/linux/mm.h linux-2.6.11-io/include/linux/mm.h ---- linux-2.6.11/include/linux/mm.h 2005-03-02 07:37:47.000000000 +0000 -+++ linux-2.6.11-io/include/linux/mm.h 2005-03-15 17:03:46.000000000 +0000 -@@ -815,6 +815,10 @@ - extern int check_user_page_readable(struct mm_struct *mm, unsigned long address); - int remap_pfn_range(struct vm_area_struct *, unsigned long, - unsigned long, unsigned long, pgprot_t); -+/* Allow arch override for mapping of device and I/O (non-RAM) pages. */ -+#ifndef io_remap_pfn_range -+#define io_remap_pfn_range remap_pfn_range -+#endif - - #ifdef CONFIG_PROC_FS - void __vm_stat_account(struct mm_struct *, unsigned long, struct file *, long); diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/linux-2.6.11.12.patch --- a/patches/linux-2.6.11/linux-2.6.11.12.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,2579 +0,0 @@ -diff --git a/Documentation/SecurityBugs b/Documentation/SecurityBugs -new file mode 100644 ---- /dev/null -+++ b/Documentation/SecurityBugs -@@ -0,0 +1,38 @@ -+Linux kernel developers take security very seriously. As such, we'd -+like to know when a security bug is found so that it can be fixed and -+disclosed as quickly as possible. Please report security bugs to the -+Linux kernel security team. -+ -+1) Contact -+ -+The Linux kernel security team can be contacted by email at -+<security@xxxxxxxxxx>. This is a private list of security officers -+who will help verify the bug report and develop and release a fix. -+It is possible that the security team will bring in extra help from -+area maintainers to understand and fix the security vulnerability. -+ -+As it is with any bug, the more information provided the easier it -+will be to diagnose and fix. Please review the procedure outlined in -+REPORTING-BUGS if you are unclear about what information is helpful. -+Any exploit code is very helpful and will not be released without -+consent from the reporter unless it has already been made public. -+ -+2) Disclosure -+ -+The goal of the Linux kernel security team is to work with the -+bug submitter to bug resolution as well as disclosure. We prefer -+to fully disclose the bug as soon as possible. It is reasonable to -+delay disclosure when the bug or the fix is not yet fully understood, -+the solution is not well-tested or for vendor coordination. However, we -+expect these delays to be short, measurable in days, not weeks or months. -+A disclosure date is negotiated by the security team working with the -+bug submitter as well as vendors. However, the kernel security team -+holds the final say when setting a disclosure date. The timeframe for -+disclosure is from immediate (esp. if it's already publically known) -+to a few weeks. As a basic default policy, we expect report date to -+disclosure date to be on the order of 7 days. -+ -+3) Non-disclosure agreements -+ -+The Linux kernel security team is not a formal body and therefore unable -+to enter any non-disclosure agreements. -diff --git a/MAINTAINERS b/MAINTAINERS ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1966,6 +1966,11 @@ M: christer@xxxxxxxxxxx - W: http://www.weinigel.se - S: Supported - -+SECURITY CONTACT -+P: Security Officers -+M: security@xxxxxxxxxx -+S: Supported -+ - SELINUX SECURITY MODULE - P: Stephen Smalley - M: sds@xxxxxxxxxxxxxx -diff --git a/Makefile b/Makefile ---- a/Makefile -+++ b/Makefile -@@ -1,8 +1,8 @@ - VERSION = 2 - PATCHLEVEL = 6 - SUBLEVEL = 11 --EXTRAVERSION = --NAME=Woozy Numbat -+EXTRAVERSION = .12 -+NAME=Woozy Beaver - - # *DOCUMENTATION* - # To see a list of typical targets execute "make help" -diff --git a/REPORTING-BUGS b/REPORTING-BUGS ---- a/REPORTING-BUGS -+++ b/REPORTING-BUGS -@@ -16,6 +16,10 @@ code relevant to what you were doing. If - describe how to recreate it. That is worth even more than the oops itself. - The list of maintainers is in the MAINTAINERS file in this directory. - -+ If it is a security bug, please copy the Security Contact listed -+in the MAINTAINERS file. They can help coordinate bugfix and disclosure. -+See Documentation/SecurityBugs for more infomation. -+ - If you are totally stumped as to whom to send the report, send it to - linux-kernel@xxxxxxxxxxxxxxxx (For more information on the linux-kernel - mailing list see http://www.tux.org/lkml/). -diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S ---- a/arch/ia64/kernel/fsys.S -+++ b/arch/ia64/kernel/fsys.S -@@ -611,8 +611,10 @@ GLOBAL_ENTRY(fsys_bubble_down) - movl r2=ia64_ret_from_syscall - ;; - mov rp=r2 // set the real return addr -- tbit.z p8,p0=r3,TIF_SYSCALL_TRACE -+ and r3=_TIF_SYSCALL_TRACEAUDIT,r3 - ;; -+ cmp.eq p8,p0=r3,r0 -+ - (p10) br.cond.spnt.many ia64_ret_from_syscall // p10==true means out registers are more than 8 - (p8) br.call.sptk.many b6=b6 // ignore this return addr - br.cond.sptk ia64_trace_syscall -diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c ---- a/arch/ia64/kernel/signal.c -+++ b/arch/ia64/kernel/signal.c -@@ -224,7 +224,8 @@ ia64_rt_sigreturn (struct sigscratch *sc - * could be corrupted. - */ - retval = (long) &ia64_leave_kernel; -- if (test_thread_flag(TIF_SYSCALL_TRACE)) -+ if (test_thread_flag(TIF_SYSCALL_TRACE) -+ || test_thread_flag(TIF_SYSCALL_AUDIT)) - /* - * strace expects to be notified after sigreturn returns even though the - * context to which we return may not be in the middle of a syscall. -diff --git a/arch/ppc/oprofile/op_model_fsl_booke.c b/arch/ppc/oprofile/op_model_fsl_booke.c ---- a/arch/ppc/oprofile/op_model_fsl_booke.c -+++ b/arch/ppc/oprofile/op_model_fsl_booke.c -@@ -150,7 +150,6 @@ static void fsl_booke_handle_interrupt(s - int is_kernel; - int val; - int i; -- unsigned int cpu = smp_processor_id(); - - /* set the PMM bit (see comment below) */ - mtmsr(mfmsr() | MSR_PMM); -@@ -162,7 +161,7 @@ static void fsl_booke_handle_interrupt(s - val = ctr_read(i); - if (val < 0) { - if (oprofile_running && ctr[i].enabled) { -- oprofile_add_sample(pc, is_kernel, i, cpu); -+ oprofile_add_pc(pc, is_kernel, i); - ctr_write(i, reset_value[i]); - } else { - ctr_write(i, 0); -diff --git a/arch/ppc/platforms/4xx/ebony.h b/arch/ppc/platforms/4xx/ebony.h ---- a/arch/ppc/platforms/4xx/ebony.h -+++ b/arch/ppc/platforms/4xx/ebony.h -@@ -61,8 +61,8 @@ - */ - - /* OpenBIOS defined UART mappings, used before early_serial_setup */ --#define UART0_IO_BASE (u8 *) 0xE0000200 --#define UART1_IO_BASE (u8 *) 0xE0000300 -+#define UART0_IO_BASE 0xE0000200 -+#define UART1_IO_BASE 0xE0000300 - - /* external Epson SG-615P */ - #define BASE_BAUD 691200 -diff --git a/arch/ppc/platforms/4xx/luan.h b/arch/ppc/platforms/4xx/luan.h ---- a/arch/ppc/platforms/4xx/luan.h -+++ b/arch/ppc/platforms/4xx/luan.h -@@ -47,9 +47,9 @@ - #define RS_TABLE_SIZE 3 - - /* PIBS defined UART mappings, used before early_serial_setup */ --#define UART0_IO_BASE (u8 *) 0xa0000200 --#define UART1_IO_BASE (u8 *) 0xa0000300 --#define UART2_IO_BASE (u8 *) 0xa0000600 -+#define UART0_IO_BASE 0xa0000200 -+#define UART1_IO_BASE 0xa0000300 -+#define UART2_IO_BASE 0xa0000600 - - #define BASE_BAUD 11059200 - #define STD_UART_OP(num) \ -diff --git a/arch/ppc/platforms/4xx/ocotea.h b/arch/ppc/platforms/4xx/ocotea.h ---- a/arch/ppc/platforms/4xx/ocotea.h -+++ b/arch/ppc/platforms/4xx/ocotea.h -@@ -56,8 +56,8 @@ - #define RS_TABLE_SIZE 2 - - /* OpenBIOS defined UART mappings, used before early_serial_setup */ --#define UART0_IO_BASE (u8 *) 0xE0000200 --#define UART1_IO_BASE (u8 *) 0xE0000300 -+#define UART0_IO_BASE 0xE0000200 -+#define UART1_IO_BASE 0xE0000300 - - #define BASE_BAUD 11059200/16 - #define STD_UART_OP(num) \ -diff --git a/arch/ppc64/kernel/pSeries_iommu.c b/arch/ppc64/kernel/pSeries_iommu.c ---- a/arch/ppc64/kernel/pSeries_iommu.c -+++ b/arch/ppc64/kernel/pSeries_iommu.c -@@ -401,6 +401,8 @@ static void iommu_bus_setup_pSeriesLP(st - struct device_node *dn, *pdn; - unsigned int *dma_window = NULL; - -+ DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); -+ - dn = pci_bus_to_OF_node(bus); - - /* Find nearest ibm,dma-window, walking up the device tree */ -@@ -455,6 +457,56 @@ static void iommu_dev_setup_pSeries(stru - } - } - -+static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) -+{ -+ struct device_node *pdn, *dn; -+ struct iommu_table *tbl; -+ int *dma_window = NULL; -+ -+ DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name); -+ -+ /* dev setup for LPAR is a little tricky, since the device tree might -+ * contain the dma-window properties per-device and not neccesarily -+ * for the bus. So we need to search upwards in the tree until we -+ * either hit a dma-window property, OR find a parent with a table -+ * already allocated. -+ */ -+ dn = pci_device_to_OF_node(dev); -+ -+ for (pdn = dn; pdn && !pdn->iommu_table; pdn = pdn->parent) { -+ dma_window = (unsigned int *)get_property(pdn, "ibm,dma-window", NULL); -+ if (dma_window) -+ break; -+ } -+ -+ /* Check for parent == NULL so we don't try to setup the empty EADS -+ * slots on POWER4 machines. -+ */ -+ if (dma_window == NULL || pdn->parent == NULL) { -+ /* Fall back to regular (non-LPAR) dev setup */ -+ DBG("No dma window for device, falling back to regular setup\n"); -+ iommu_dev_setup_pSeries(dev); -+ return; -+ } else { -+ DBG("Found DMA window, allocating table\n"); -+ } -+ -+ if (!pdn->iommu_table) { -+ /* iommu_table_setparms_lpar needs bussubno. */ -+ pdn->bussubno = pdn->phb->bus->number; -+ -+ tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), -+ GFP_KERNEL); -+ -+ iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window); -+ -+ pdn->iommu_table = iommu_init_table(tbl); -+ } -+ -+ if (pdn != dn) -+ dn->iommu_table = pdn->iommu_table; -+} -+ - static void iommu_bus_setup_null(struct pci_bus *b) { } - static void iommu_dev_setup_null(struct pci_dev *d) { } - -@@ -479,13 +531,14 @@ void iommu_init_early_pSeries(void) - ppc_md.tce_free = tce_free_pSeriesLP; - } - ppc_md.iommu_bus_setup = iommu_bus_setup_pSeriesLP; -+ ppc_md.iommu_dev_setup = iommu_dev_setup_pSeriesLP; - } else { - ppc_md.tce_build = tce_build_pSeries; - ppc_md.tce_free = tce_free_pSeries; - ppc_md.iommu_bus_setup = iommu_bus_setup_pSeries; -+ ppc_md.iommu_dev_setup = iommu_dev_setup_pSeries; - } - -- ppc_md.iommu_dev_setup = iommu_dev_setup_pSeries; - - pci_iommu_init(); - } -diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c ---- a/arch/sparc/kernel/ptrace.c -+++ b/arch/sparc/kernel/ptrace.c -@@ -531,18 +531,6 @@ asmlinkage void do_ptrace(struct pt_regs - pt_error_return(regs, EIO); - goto out_tsk; - } -- if (addr != 1) { -- if (addr & 3) { -- pt_error_return(regs, EINVAL); -- goto out_tsk; -- } --#ifdef DEBUG_PTRACE -- printk ("Original: %08lx %08lx\n", child->thread.kregs->pc, child->thread.kregs->npc); -- printk ("Continuing with %08lx %08lx\n", addr, addr+4); --#endif -- child->thread.kregs->pc = addr; -- child->thread.kregs->npc = addr + 4; -- } - - if (request == PTRACE_SYSCALL) - set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); -diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c ---- a/arch/sparc64/kernel/ptrace.c -+++ b/arch/sparc64/kernel/ptrace.c -@@ -514,25 +514,6 @@ asmlinkage void do_ptrace(struct pt_regs - pt_error_return(regs, EIO); - goto out_tsk; - } -- if (addr != 1) { -- unsigned long pc_mask = ~0UL; -- -- if ((child->thread_info->flags & _TIF_32BIT) != 0) -- pc_mask = 0xffffffff; -- -- if (addr & 3) { -- pt_error_return(regs, EINVAL); -- goto out_tsk; -- } --#ifdef DEBUG_PTRACE -- printk ("Original: %016lx %016lx\n", -- child->thread_info->kregs->tpc, -- child->thread_info->kregs->tnpc); -- printk ("Continuing with %016lx %016lx\n", addr, addr+4); --#endif -- child->thread_info->kregs->tpc = (addr & pc_mask); -- child->thread_info->kregs->tnpc = ((addr + 4) & pc_mask); -- } - - if (request == PTRACE_SYSCALL) { - set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); -diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c ---- a/arch/sparc64/kernel/signal32.c -+++ b/arch/sparc64/kernel/signal32.c -@@ -192,10 +192,13 @@ int copy_siginfo_to_user32(compat_siginf - err |= __put_user(from->si_uid, &to->si_uid); - break; - case __SI_FAULT >> 16: -- case __SI_POLL >> 16: - err |= __put_user(from->si_trapno, &to->si_trapno); - err |= __put_user((unsigned long)from->si_addr, &to->si_addr); - break; -+ case __SI_POLL >> 16: -+ err |= __put_user(from->si_band, &to->si_band); -+ err |= __put_user(from->si_fd, &to->si_fd); -+ break; - case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ - case __SI_MESGQ >> 16: - err |= __put_user(from->si_pid, &to->si_pid); -diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S ---- a/arch/sparc64/kernel/systbls.S -+++ b/arch/sparc64/kernel/systbls.S -@@ -75,7 +75,7 @@ sys_call_table32: - /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy - /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink -- .word sys_mq_timedsend, sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid -+ .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid - /*280*/ .word sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl - - #endif /* CONFIG_COMPAT */ -diff --git a/arch/um/include/sysdep-i386/syscalls.h b/arch/um/include/sysdep-i386/syscalls.h ---- a/arch/um/include/sysdep-i386/syscalls.h -+++ b/arch/um/include/sysdep-i386/syscalls.h -@@ -23,6 +23,9 @@ extern long sys_mmap2(unsigned long addr - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff); - -+/* On i386 they choose a meaningless naming.*/ -+#define __NR_kexec_load __NR_sys_kexec_load -+ - #define ARCH_SYSCALLS \ - [ __NR_waitpid ] = (syscall_handler_t *) sys_waitpid, \ - [ __NR_break ] = (syscall_handler_t *) sys_ni_syscall, \ -@@ -101,15 +104,12 @@ extern long sys_mmap2(unsigned long addr - [ 223 ] = (syscall_handler_t *) sys_ni_syscall, \ - [ __NR_set_thread_area ] = (syscall_handler_t *) sys_ni_syscall, \ - [ __NR_get_thread_area ] = (syscall_handler_t *) sys_ni_syscall, \ -- [ __NR_fadvise64 ] = (syscall_handler_t *) sys_fadvise64, \ - [ 251 ] = (syscall_handler_t *) sys_ni_syscall, \ -- [ __NR_remap_file_pages ] = (syscall_handler_t *) sys_remap_file_pages, \ -- [ __NR_utimes ] = (syscall_handler_t *) sys_utimes, \ -- [ __NR_vserver ] = (syscall_handler_t *) sys_ni_syscall, -- -+ [ 285 ] = (syscall_handler_t *) sys_ni_syscall, -+ - /* 222 doesn't yet have a name in include/asm-i386/unistd.h */ - --#define LAST_ARCH_SYSCALL __NR_vserver -+#define LAST_ARCH_SYSCALL 285 - - /* - * Overrides for Emacs so that we follow Linus's tabbing style. -diff --git a/arch/um/include/sysdep-x86_64/syscalls.h b/arch/um/include/sysdep-x86_64/syscalls.h ---- a/arch/um/include/sysdep-x86_64/syscalls.h -+++ b/arch/um/include/sysdep-x86_64/syscalls.h -@@ -71,12 +71,7 @@ extern syscall_handler_t sys_arch_prctl; - [ __NR_iopl ] = (syscall_handler_t *) sys_ni_syscall, \ - [ __NR_set_thread_area ] = (syscall_handler_t *) sys_ni_syscall, \ - [ __NR_get_thread_area ] = (syscall_handler_t *) sys_ni_syscall, \ -- [ __NR_remap_file_pages ] = (syscall_handler_t *) sys_remap_file_pages, \ - [ __NR_semtimedop ] = (syscall_handler_t *) sys_semtimedop, \ -- [ __NR_fadvise64 ] = (syscall_handler_t *) sys_fadvise64, \ -- [ 223 ] = (syscall_handler_t *) sys_ni_syscall, \ -- [ __NR_utimes ] = (syscall_handler_t *) sys_utimes, \ -- [ __NR_vserver ] = (syscall_handler_t *) sys_ni_syscall, \ - [ 251 ] = (syscall_handler_t *) sys_ni_syscall, - - #define LAST_ARCH_SYSCALL 251 -diff --git a/arch/um/kernel/skas/uaccess.c b/arch/um/kernel/skas/uaccess.c ---- a/arch/um/kernel/skas/uaccess.c -+++ b/arch/um/kernel/skas/uaccess.c -@@ -61,7 +61,8 @@ static void do_buffer_op(void *jmpbuf, v - void *arg; - int *res; - -- va_copy(args, *(va_list *)arg_ptr); -+ /* Some old gccs recognize __va_copy, but not va_copy */ -+ __va_copy(args, *(va_list *)arg_ptr); - addr = va_arg(args, unsigned long); - len = va_arg(args, int); - is_write = va_arg(args, int); -diff --git a/arch/um/kernel/sys_call_table.c b/arch/um/kernel/sys_call_table.c ---- a/arch/um/kernel/sys_call_table.c -+++ b/arch/um/kernel/sys_call_table.c -@@ -48,7 +48,6 @@ extern syscall_handler_t sys_vfork; - extern syscall_handler_t old_select; - extern syscall_handler_t sys_modify_ldt; - extern syscall_handler_t sys_rt_sigsuspend; --extern syscall_handler_t sys_vserver; - extern syscall_handler_t sys_mbind; - extern syscall_handler_t sys_get_mempolicy; - extern syscall_handler_t sys_set_mempolicy; -@@ -242,6 +241,7 @@ syscall_handler_t *sys_call_table[] = { - [ __NR_epoll_create ] = (syscall_handler_t *) sys_epoll_create, - [ __NR_epoll_ctl ] = (syscall_handler_t *) sys_epoll_ctl, - [ __NR_epoll_wait ] = (syscall_handler_t *) sys_epoll_wait, -+ [ __NR_remap_file_pages ] = (syscall_handler_t *) sys_remap_file_pages, - [ __NR_set_tid_address ] = (syscall_handler_t *) sys_set_tid_address, - [ __NR_timer_create ] = (syscall_handler_t *) sys_timer_create, - [ __NR_timer_settime ] = (syscall_handler_t *) sys_timer_settime, -@@ -252,12 +252,10 @@ syscall_handler_t *sys_call_table[] = { - [ __NR_clock_gettime ] = (syscall_handler_t *) sys_clock_gettime, - [ __NR_clock_getres ] = (syscall_handler_t *) sys_clock_getres, - [ __NR_clock_nanosleep ] = (syscall_handler_t *) sys_clock_nanosleep, -- [ __NR_statfs64 ] = (syscall_handler_t *) sys_statfs64, -- [ __NR_fstatfs64 ] = (syscall_handler_t *) sys_fstatfs64, - [ __NR_tgkill ] = (syscall_handler_t *) sys_tgkill, - [ __NR_utimes ] = (syscall_handler_t *) sys_utimes, -- [ __NR_fadvise64_64 ] = (syscall_handler_t *) sys_fadvise64_64, -- [ __NR_vserver ] = (syscall_handler_t *) sys_vserver, -+ [ __NR_fadvise64 ] = (syscall_handler_t *) sys_fadvise64, -+ [ __NR_vserver ] = (syscall_handler_t *) sys_ni_syscall, - [ __NR_mbind ] = (syscall_handler_t *) sys_mbind, - [ __NR_get_mempolicy ] = (syscall_handler_t *) sys_get_mempolicy, - [ __NR_set_mempolicy ] = (syscall_handler_t *) sys_set_mempolicy, -@@ -267,9 +265,8 @@ syscall_handler_t *sys_call_table[] = { - [ __NR_mq_timedreceive ] = (syscall_handler_t *) sys_mq_timedreceive, - [ __NR_mq_notify ] = (syscall_handler_t *) sys_mq_notify, - [ __NR_mq_getsetattr ] = (syscall_handler_t *) sys_mq_getsetattr, -- [ __NR_sys_kexec_load ] = (syscall_handler_t *) sys_ni_syscall, -+ [ __NR_kexec_load ] = (syscall_handler_t *) sys_ni_syscall, - [ __NR_waitid ] = (syscall_handler_t *) sys_waitid, -- [ 285 ] = (syscall_handler_t *) sys_ni_syscall, - [ __NR_add_key ] = (syscall_handler_t *) sys_add_key, - [ __NR_request_key ] = (syscall_handler_t *) sys_request_key, - [ __NR_keyctl ] = (syscall_handler_t *) sys_keyctl, -diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c ---- a/arch/x86_64/kernel/apic.c -+++ b/arch/x86_64/kernel/apic.c -@@ -775,9 +775,7 @@ void __init setup_boot_APIC_clock (void) - - void __init setup_secondary_APIC_clock(void) - { -- local_irq_disable(); /* FIXME: Do we need this? --RR */ - setup_APIC_timer(calibration_result); -- local_irq_enable(); - } - - void __init disable_APIC_timer(void) -diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c ---- a/arch/x86_64/kernel/ptrace.c -+++ b/arch/x86_64/kernel/ptrace.c -@@ -129,13 +129,13 @@ static int putreg(struct task_struct *ch - value &= 0xffff; - return 0; - case offsetof(struct user_regs_struct,fs_base): -- if (!((value >> 48) == 0 || (value >> 48) == 0xffff)) -- return -EIO; -+ if (value >= TASK_SIZE) -+ return -EIO; - child->thread.fs = value; - return 0; - case offsetof(struct user_regs_struct,gs_base): -- if (!((value >> 48) == 0 || (value >> 48) == 0xffff)) -- return -EIO; -+ if (value >= TASK_SIZE) -+ return -EIO; - child->thread.gs = value; - return 0; - case offsetof(struct user_regs_struct, eflags): -@@ -149,6 +149,11 @@ static int putreg(struct task_struct *ch - return -EIO; - value &= 0xffff; - break; -+ case offsetof(struct user_regs_struct, rip): -+ /* Check if the new RIP address is canonical */ -+ if (value >= TASK_SIZE) -+ return -EIO; -+ break; - } - put_stack_long(child, regno - sizeof(struct pt_regs), value); - return 0; -@@ -247,7 +252,7 @@ asmlinkage long sys_ptrace(long request, - break; - - switch (addr) { -- case 0 ... sizeof(struct user_regs_struct): -+ case 0 ... sizeof(struct user_regs_struct) - sizeof(long): - tmp = getreg(child, addr); - break; - case offsetof(struct user, u_debugreg[0]): -@@ -292,7 +297,7 @@ asmlinkage long sys_ptrace(long request, - break; - - switch (addr) { -- case 0 ... sizeof(struct user_regs_struct): -+ case 0 ... sizeof(struct user_regs_struct) - sizeof(long): - ret = putreg(child, addr, data); - break; - /* Disallows to set a breakpoint into the vsyscall */ -diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c ---- a/arch/x86_64/kernel/smpboot.c -+++ b/arch/x86_64/kernel/smpboot.c -@@ -309,8 +309,6 @@ void __init smp_callin(void) - Dprintk("CALLIN, before setup_local_APIC().\n"); - setup_local_APIC(); - -- local_irq_enable(); -- - /* - * Get our bogomips. - */ -@@ -324,8 +322,6 @@ void __init smp_callin(void) - */ - smp_store_cpu_info(cpuid); - -- local_irq_disable(); -- - /* - * Allow the master to continue. - */ -diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c ---- a/arch/x86_64/mm/fault.c -+++ b/arch/x86_64/mm/fault.c -@@ -236,6 +236,8 @@ static noinline void pgtable_bad(unsigne - - /* - * Handle a fault on the vmalloc or module mapping area -+ * -+ * This assumes no large pages in there. - */ - static int vmalloc_fault(unsigned long address) - { -@@ -274,7 +276,10 @@ static int vmalloc_fault(unsigned long a - if (!pte_present(*pte_ref)) - return -1; - pte = pte_offset_kernel(pmd, address); -- if (!pte_present(*pte) || pte_page(*pte) != pte_page(*pte_ref)) -+ /* Don't use pte_page here, because the mappings can point -+ outside mem_map, and the NUMA hash lookup cannot handle -+ that. */ -+ if (!pte_present(*pte) || pte_pfn(*pte) != pte_pfn(*pte_ref)) - BUG(); - __flush_tlb_all(); - return 0; -@@ -348,7 +353,9 @@ asmlinkage void do_page_fault(struct pt_ - * protection error (error_code & 1) == 0. - */ - if (unlikely(address >= TASK_SIZE)) { -- if (!(error_code & 5)) { -+ if (!(error_code & 5) && -+ ((address >= VMALLOC_START && address < VMALLOC_END) || -+ (address >= MODULES_VADDR && address < MODULES_END))) { - if (vmalloc_fault(address) < 0) - goto bad_area_nosemaphore; - return; -diff --git a/arch/x86_64/mm/ioremap.c b/arch/x86_64/mm/ioremap.c ---- a/arch/x86_64/mm/ioremap.c -+++ b/arch/x86_64/mm/ioremap.c -@@ -266,7 +266,7 @@ void iounmap(volatile void __iomem *addr - if ((p->flags >> 20) && - p->phys_addr + p->size - 1 < virt_to_phys(high_memory)) { - /* p->size includes the guard page, but cpa doesn't like that */ -- change_page_attr(virt_to_page(__va(p->phys_addr)), -+ change_page_attr_addr((unsigned long)(__va(p->phys_addr)), - (p->size - PAGE_SIZE) >> PAGE_SHIFT, - PAGE_KERNEL); - global_flush_tlb(); -diff --git a/drivers/block/ioctl.c b/drivers/block/ioctl.c ---- a/drivers/block/ioctl.c -+++ b/drivers/block/ioctl.c -@@ -237,3 +237,5 @@ long compat_blkdev_ioctl(struct file *fi - } - return ret; - } -+ -+EXPORT_SYMBOL_GPL(blkdev_ioctl); -diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c ---- a/drivers/block/pktcdvd.c -+++ b/drivers/block/pktcdvd.c -@@ -2400,7 +2400,7 @@ static int pkt_ioctl(struct inode *inode - case CDROM_LAST_WRITTEN: - case CDROM_SEND_PACKET: - case SCSI_IOCTL_SEND_COMMAND: -- return ioctl_by_bdev(pd->bdev, cmd, arg); -+ return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); - - case CDROMEJECT: - /* -@@ -2408,7 +2408,7 @@ static int pkt_ioctl(struct inode *inode - * have to unlock it or else the eject command fails. - */ - pkt_lock_door(pd, 0); -- return ioctl_by_bdev(pd->bdev, cmd, arg); -+ return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); - - default: - printk("pktcdvd: Unknown ioctl for %s (%x)\n", pd->name, cmd); -diff --git a/drivers/char/drm/drm_ioctl.c b/drivers/char/drm/drm_ioctl.c ---- a/drivers/char/drm/drm_ioctl.c -+++ b/drivers/char/drm/drm_ioctl.c -@@ -326,6 +326,8 @@ int drm_setversion(DRM_IOCTL_ARGS) - - DRM_COPY_FROM_USER_IOCTL(sv, argp, sizeof(sv)); - -+ memset(&version, 0, sizeof(version)); -+ - dev->driver->version(&version); - retv.drm_di_major = DRM_IF_MAJOR; - retv.drm_di_minor = DRM_IF_MINOR; -diff --git a/drivers/char/raw.c b/drivers/char/raw.c ---- a/drivers/char/raw.c -+++ b/drivers/char/raw.c -@@ -122,7 +122,7 @@ raw_ioctl(struct inode *inode, struct fi - { - struct block_device *bdev = filp->private_data; - -- return ioctl_by_bdev(bdev, command, arg); -+ return blkdev_ioctl(bdev->bd_inode, filp, command, arg); - } - - static void bind_device(struct raw_config_request *rq) -diff --git a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c ---- a/drivers/i2c/chips/eeprom.c -+++ b/drivers/i2c/chips/eeprom.c -@@ -130,7 +130,8 @@ static ssize_t eeprom_read(struct kobjec - - /* Hide Vaio security settings to regular users (16 first bytes) */ - if (data->nature == VAIO && off < 16 && !capable(CAP_SYS_ADMIN)) { -- int in_row1 = 16 - off; -+ size_t in_row1 = 16 - off; -+ in_row1 = min(in_row1, count); - memset(buf, 0, in_row1); - if (count - in_row1 > 0) - memcpy(buf + in_row1, &data->data[16], count - in_row1); -diff --git a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c ---- a/drivers/i2c/chips/it87.c -+++ b/drivers/i2c/chips/it87.c -@@ -631,7 +631,7 @@ static ssize_t show_alarms(struct device - struct it87_data *data = it87_update_device(dev); - return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms)); - } --static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL); -+static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - - static ssize_t - show_vrm_reg(struct device *dev, char *buf) -diff --git a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c ---- a/drivers/i2c/chips/via686a.c -+++ b/drivers/i2c/chips/via686a.c -@@ -554,7 +554,7 @@ static ssize_t show_alarms(struct device - struct via686a_data *data = via686a_update_device(dev); - return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms)); - } --static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL); -+static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - - /* The driver. I choose to use type i2c_driver, as at is identical to both - smbus_driver and isa_driver, and clients could be of either kind */ -diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c ---- a/drivers/ide/ide-disk.c -+++ b/drivers/ide/ide-disk.c -@@ -133,6 +133,8 @@ static ide_startstop_t __ide_do_rw_disk( - if (hwif->no_lba48_dma && lba48 && dma) { - if (block + rq->nr_sectors > 1ULL << 28) - dma = 0; -+ else -+ lba48 = 0; - } - - if (!dma) { -@@ -146,7 +148,7 @@ static ide_startstop_t __ide_do_rw_disk( - /* FIXME: SELECT_MASK(drive, 0) ? */ - - if (drive->select.b.lba) { -- if (drive->addressing == 1) { -+ if (lba48) { - task_ioreg_t tasklets[10]; - - pr_debug("%s: LBA=0x%012llx\n", drive->name, block); -diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h ---- a/drivers/input/serio/i8042-x86ia64io.h -+++ b/drivers/input/serio/i8042-x86ia64io.h -@@ -88,7 +88,7 @@ static struct dmi_system_id __initdata i - }; - #endif - --#ifdef CONFIG_ACPI -+#if defined(__ia64__) && defined(CONFIG_ACPI) - #include <linux/acpi.h> - #include <acpi/acpi_bus.h> - -@@ -281,7 +281,7 @@ static inline int i8042_platform_init(vo - i8042_kbd_irq = I8042_MAP_IRQ(1); - i8042_aux_irq = I8042_MAP_IRQ(12); - --#ifdef CONFIG_ACPI -+#if defined(__ia64__) && defined(CONFIG_ACPI) - if (i8042_acpi_init()) - return -1; - #endif -@@ -300,7 +300,7 @@ static inline int i8042_platform_init(vo - - static inline void i8042_platform_exit(void) - { --#ifdef CONFIG_ACPI -+#if defined(__ia64__) && defined(CONFIG_ACPI) - i8042_acpi_exit(); - #endif - } -diff --git a/drivers/md/raid6altivec.uc b/drivers/md/raid6altivec.uc ---- a/drivers/md/raid6altivec.uc -+++ b/drivers/md/raid6altivec.uc -@@ -108,7 +108,11 @@ int raid6_have_altivec(void); - int raid6_have_altivec(void) - { - /* This assumes either all CPUs have Altivec or none does */ -+#ifdef CONFIG_PPC64 - return cur_cpu_spec->cpu_features & CPU_FTR_ALTIVEC; -+#else -+ return cur_cpu_spec[0]->cpu_features & CPU_FTR_ALTIVEC; -+#endif - } - #endif - -diff --git a/drivers/media/video/adv7170.c b/drivers/media/video/adv7170.c ---- a/drivers/media/video/adv7170.c -+++ b/drivers/media/video/adv7170.c -@@ -130,7 +130,7 @@ adv7170_write_block (struct i2c_client * - u8 block_data[32]; - - msg.addr = client->addr; -- msg.flags = client->flags; -+ msg.flags = 0; - while (len >= 2) { - msg.buf = (char *) block_data; - msg.len = 0; -diff --git a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c ---- a/drivers/media/video/adv7175.c -+++ b/drivers/media/video/adv7175.c -@@ -126,7 +126,7 @@ adv7175_write_block (struct i2c_client * - u8 block_data[32]; - - msg.addr = client->addr; -- msg.flags = client->flags; -+ msg.flags = 0; - while (len >= 2) { - msg.buf = (char *) block_data; - msg.len = 0; -diff --git a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c ---- a/drivers/media/video/bt819.c -+++ b/drivers/media/video/bt819.c -@@ -146,7 +146,7 @@ bt819_write_block (struct i2c_client *cl - u8 block_data[32]; - - msg.addr = client->addr; -- msg.flags = client->flags; -+ msg.flags = 0; - while (len >= 2) { - msg.buf = (char *) block_data; - msg.len = 0; -diff --git a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c ---- a/drivers/media/video/bttv-cards.c -+++ b/drivers/media/video/bttv-cards.c -@@ -1939,7 +1939,6 @@ struct tvcard bttv_tvcards[] = { - .no_tda9875 = 1, - .no_tda7432 = 1, - .tuner_type = TUNER_ABSENT, -- .no_video = 1, - .pll = PLL_28, - },{ - .name = "Teppro TEV-560/InterVision IV-560", -@@ -2718,8 +2717,6 @@ void __devinit bttv_init_card2(struct bt - } - btv->pll.pll_current = -1; - -- bttv_reset_audio(btv); -- - /* tuner configuration (from card list / autodetect / insmod option) */ - if (UNSET != bttv_tvcards[btv->c.type].tuner_type) - if(UNSET == btv->tuner_type) -diff --git a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c ---- a/drivers/media/video/saa7110.c -+++ b/drivers/media/video/saa7110.c -@@ -60,8 +60,10 @@ MODULE_PARM_DESC(debug, "Debug level (0- - - #define I2C_SAA7110 0x9C /* or 0x9E */ - -+#define SAA7110_NR_REG 0x35 -+ - struct saa7110 { -- unsigned char reg[54]; -+ u8 reg[SAA7110_NR_REG]; - - int norm; - int input; -@@ -95,31 +97,28 @@ saa7110_write_block (struct i2c_client * - unsigned int len) - { - int ret = -1; -- u8 reg = *data++; -+ u8 reg = *data; /* first register to write to */ - -- len--; -+ /* Sanity check */ -+ if (reg + (len - 1) > SAA7110_NR_REG) -+ return ret; - - /* the saa7110 has an autoincrement function, use it if - * the adapter understands raw I2C */ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - struct saa7110 *decoder = i2c_get_clientdata(client); - struct i2c_msg msg; -- u8 block_data[54]; - -- msg.len = 0; -- msg.buf = (char *) block_data; -+ msg.len = len; -+ msg.buf = (char *) data; - msg.addr = client->addr; -- msg.flags = client->flags; -- while (len >= 1) { -- msg.len = 0; -- block_data[msg.len++] = reg; -- while (len-- >= 1 && msg.len < 54) -- block_data[msg.len++] = -- decoder->reg[reg++] = *data++; -- ret = i2c_transfer(client->adapter, &msg, 1); -- } -+ msg.flags = 0; -+ ret = i2c_transfer(client->adapter, &msg, 1); -+ -+ /* Cache the written data */ -+ memcpy(decoder->reg + reg, data + 1, len - 1); - } else { -- while (len-- >= 1) { -+ for (++data, --len; len; len--) { - if ((ret = saa7110_write(client, reg++, - *data++)) < 0) - break; -@@ -192,7 +191,7 @@ saa7110_selmux (struct i2c_client *clien - return 0; - } - --static const unsigned char initseq[] = { -+static const unsigned char initseq[1 + SAA7110_NR_REG] = { - 0, 0x4C, 0x3C, 0x0D, 0xEF, 0xBD, 0xF2, 0x03, 0x00, - /* 0x08 */ 0xF8, 0xF8, 0x60, 0x60, 0x00, 0x86, 0x18, 0x90, - /* 0x10 */ 0x00, 0x59, 0x40, 0x46, 0x42, 0x1A, 0xFF, 0xDA, -diff --git a/drivers/media/video/saa7114.c b/drivers/media/video/saa7114.c ---- a/drivers/media/video/saa7114.c -+++ b/drivers/media/video/saa7114.c -@@ -163,7 +163,7 @@ saa7114_write_block (struct i2c_client * - u8 block_data[32]; - - msg.addr = client->addr; -- msg.flags = client->flags; -+ msg.flags = 0; - while (len >= 2) { - msg.buf = (char *) block_data; - msg.len = 0; -diff --git a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c ---- a/drivers/media/video/saa7185.c -+++ b/drivers/media/video/saa7185.c -@@ -118,7 +118,7 @@ saa7185_write_block (struct i2c_client * - u8 block_data[32]; - - msg.addr = client->addr; -- msg.flags = client->flags; -+ msg.flags = 0; - while (len >= 2) { - msg.buf = (char *) block_data; - msg.len = 0; -diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c ---- a/drivers/net/3c59x.c -+++ b/drivers/net/3c59x.c -@@ -1581,7 +1581,8 @@ vortex_up(struct net_device *dev) - - if (VORTEX_PCI(vp)) { - pci_set_power_state(VORTEX_PCI(vp), PCI_D0); /* Go active */ -- pci_restore_state(VORTEX_PCI(vp)); -+ if (vp->pm_state_valid) -+ pci_restore_state(VORTEX_PCI(vp)); - pci_enable_device(VORTEX_PCI(vp)); - } - -@@ -2741,6 +2742,7 @@ vortex_down(struct net_device *dev, int - outl(0, ioaddr + DownListPtr); - - if (final_down && VORTEX_PCI(vp)) { -+ vp->pm_state_valid = 1; - pci_save_state(VORTEX_PCI(vp)); - acpi_set_WOL(dev); - } -@@ -3243,9 +3245,10 @@ static void acpi_set_WOL(struct net_devi - outw(RxEnable, ioaddr + EL3_CMD); - - pci_enable_wake(VORTEX_PCI(vp), 0, 1); -+ -+ /* Change the power state to D3; RxEnable doesn't take effect. */ -+ pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); - } -- /* Change the power state to D3; RxEnable doesn't take effect. */ -- pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); - } - - -diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c ---- a/drivers/net/amd8111e.c -+++ b/drivers/net/amd8111e.c -@@ -1381,6 +1381,8 @@ static int amd8111e_open(struct net_devi - - if(amd8111e_restart(dev)){ - spin_unlock_irq(&lp->lock); -+ if (dev->irq) -+ free_irq(dev->irq, dev); - return -ENOMEM; - } - /* Start ipg timer */ -diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c ---- a/drivers/net/ppp_async.c -+++ b/drivers/net/ppp_async.c -@@ -1000,7 +1000,7 @@ static void async_lcp_peek(struct asyncp - data += 4; - dlen -= 4; - /* data[0] is code, data[1] is length */ -- while (dlen >= 2 && dlen >= data[1]) { -+ while (dlen >= 2 && dlen >= data[1] && data[1] >= 2) { - switch (data[0]) { - case LCP_MRU: - val = (data[2] << 8) + data[3]; -diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c ---- a/drivers/net/r8169.c -+++ b/drivers/net/r8169.c -@@ -1683,16 +1683,19 @@ static void rtl8169_free_rx_skb(struct r - rtl8169_make_unusable_by_asic(desc); - } - --static inline void rtl8169_return_to_asic(struct RxDesc *desc, int rx_buf_sz) -+static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz) - { -- desc->opts1 |= cpu_to_le32(DescOwn + rx_buf_sz); -+ u32 eor = le32_to_cpu(desc->opts1) & RingEnd; -+ -+ desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz); - } - --static inline void rtl8169_give_to_asic(struct RxDesc *desc, dma_addr_t mapping, -- int rx_buf_sz) -+static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping, -+ u32 rx_buf_sz) - { - desc->addr = cpu_to_le64(mapping); -- desc->opts1 |= cpu_to_le32(DescOwn + rx_buf_sz); -+ wmb(); -+ rtl8169_mark_to_asic(desc, rx_buf_sz); - } - - static int rtl8169_alloc_rx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff, -@@ -1712,7 +1715,7 @@ static int rtl8169_alloc_rx_skb(struct p - mapping = pci_map_single(pdev, skb->tail, rx_buf_sz, - PCI_DMA_FROMDEVICE); - -- rtl8169_give_to_asic(desc, mapping, rx_buf_sz); -+ rtl8169_map_to_asic(desc, mapping, rx_buf_sz); - - out: - return ret; -@@ -2150,7 +2153,7 @@ static inline int rtl8169_try_rx_copy(st - skb_reserve(skb, NET_IP_ALIGN); - eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0); - *sk_buff = skb; -- rtl8169_return_to_asic(desc, rx_buf_sz); -+ rtl8169_mark_to_asic(desc, rx_buf_sz); - ret = 0; - } - } -diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c ---- a/drivers/net/sis900.c -+++ b/drivers/net/sis900.c -@@ -236,7 +236,7 @@ static int __devinit sis900_get_mac_addr - signature = (u16) read_eeprom(ioaddr, EEPROMSignature); - if (signature == 0xffff || signature == 0x0000) { - printk (KERN_INFO "%s: Error EERPOM read %x\n", -- net_dev->name, signature); -+ pci_name(pci_dev), signature); - return 0; - } - -@@ -268,7 +268,7 @@ static int __devinit sis630e_get_mac_add - if (!isa_bridge) - isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0018, isa_bridge); - if (!isa_bridge) { -- printk("%s: Can not find ISA bridge\n", net_dev->name); -+ printk("%s: Can not find ISA bridge\n", pci_name(pci_dev)); - return 0; - } - pci_read_config_byte(isa_bridge, 0x48, ®); -@@ -456,10 +456,6 @@ static int __devinit sis900_probe(struct - net_dev->tx_timeout = sis900_tx_timeout; - net_dev->watchdog_timeo = TX_TIMEOUT; - net_dev->ethtool_ops = &sis900_ethtool_ops; -- -- ret = register_netdev(net_dev); -- if (ret) -- goto err_unmap_rx; - - /* Get Mac address according to the chip revision */ - pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision); -@@ -476,7 +472,7 @@ static int __devinit sis900_probe(struct - - if (ret == 0) { - ret = -ENODEV; -- goto err_out_unregister; -+ goto err_unmap_rx; - } - - /* 630ET : set the mii access mode as software-mode */ -@@ -486,7 +482,7 @@ static int __devinit sis900_probe(struct - /* probe for mii transceiver */ - if (sis900_mii_probe(net_dev) == 0) { - ret = -ENODEV; -- goto err_out_unregister; -+ goto err_unmap_rx; - } - - /* save our host bridge revision */ -@@ -496,6 +492,10 @@ static int __devinit sis900_probe(struct - pci_dev_put(dev); - } - -+ ret = register_netdev(net_dev); -+ if (ret) -+ goto err_unmap_rx; -+ - /* print some information about our NIC */ - printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name, - card_name, ioaddr, net_dev->irq); -@@ -505,8 +505,6 @@ static int __devinit sis900_probe(struct - - return 0; - -- err_out_unregister: -- unregister_netdev(net_dev); - err_unmap_rx: - pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring, - sis_priv->rx_ring_dma); -@@ -533,6 +531,7 @@ static int __devinit sis900_probe(struct - static int __init sis900_mii_probe(struct net_device * net_dev) - { - struct sis900_private * sis_priv = net_dev->priv; -+ const char *dev_name = pci_name(sis_priv->pci_dev); - u16 poll_bit = MII_STAT_LINK, status = 0; - unsigned long timeout = jiffies + 5 * HZ; - int phy_addr; -@@ -582,21 +581,20 @@ static int __init sis900_mii_probe(struc - mii_phy->phy_types = - (mii_status & (MII_STAT_CAN_TX_FDX | MII_STAT_CAN_TX)) ? LAN : HOME; - printk(KERN_INFO "%s: %s transceiver found at address %d.\n", -- net_dev->name, mii_chip_table[i].name, -+ dev_name, mii_chip_table[i].name, - phy_addr); - break; - } - - if( !mii_chip_table[i].phy_id1 ) { - printk(KERN_INFO "%s: Unknown PHY transceiver found at address %d.\n", -- net_dev->name, phy_addr); -+ dev_name, phy_addr); - mii_phy->phy_types = UNKNOWN; - } - } - - if (sis_priv->mii == NULL) { -- printk(KERN_INFO "%s: No MII transceivers found!\n", -- net_dev->name); -+ printk(KERN_INFO "%s: No MII transceivers found!\n", dev_name); - return 0; - } - -@@ -621,7 +619,7 @@ static int __init sis900_mii_probe(struc - poll_bit ^= (mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS) & poll_bit); - if (time_after_eq(jiffies, timeout)) { - printk(KERN_WARNING "%s: reset phy and link down now\n", -- net_dev->name); -+ dev_name); - return -ETIME; - } - } -@@ -691,7 +689,7 @@ static u16 sis900_default_phy(struct net - sis_priv->mii = default_phy; - sis_priv->cur_phy = default_phy->phy_addr; - printk(KERN_INFO "%s: Using transceiver found at address %d as default\n", -- net_dev->name,sis_priv->cur_phy); -+ pci_name(sis_priv->pci_dev), sis_priv->cur_phy); - } - - status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); -diff --git a/drivers/net/tun.c b/drivers/net/tun.c ---- a/drivers/net/tun.c -+++ b/drivers/net/tun.c -@@ -229,7 +229,7 @@ static __inline__ ssize_t tun_get_user(s - size_t len = count; - - if (!(tun->flags & TUN_NO_PI)) { -- if ((len -= sizeof(pi)) > len) -+ if ((len -= sizeof(pi)) > count) - return -EINVAL; - - if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi))) -diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c ---- a/drivers/net/via-rhine.c -+++ b/drivers/net/via-rhine.c -@@ -1197,8 +1197,10 @@ static int rhine_open(struct net_device - dev->name, rp->pdev->irq); - - rc = alloc_ring(dev); -- if (rc) -+ if (rc) { -+ free_irq(rp->pdev->irq, dev); - return rc; -+ } - alloc_rbufs(dev); - alloc_tbufs(dev); - rhine_chip_reset(dev); -@@ -1899,6 +1901,9 @@ static void rhine_shutdown (struct devic - struct rhine_private *rp = netdev_priv(dev); - void __iomem *ioaddr = rp->base; - -+ if (!(rp->quirks & rqWOL)) -+ return; /* Nothing to do for non-WOL adapters */ -+ - rhine_power_init(dev); - - /* Make sure we use pattern 0, 1 and not 4, 5 */ -diff --git a/drivers/net/wan/hd6457x.c b/drivers/net/wan/hd6457x.c ---- a/drivers/net/wan/hd6457x.c -+++ b/drivers/net/wan/hd6457x.c -@@ -315,7 +315,7 @@ static inline void sca_rx(card_t *card, - #endif - stats->rx_packets++; - stats->rx_bytes += skb->len; -- skb->dev->last_rx = jiffies; -+ dev->last_rx = jiffies; - skb->protocol = hdlc_type_trans(skb, dev); - netif_rx(skb); - } -diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c ---- a/drivers/pci/hotplug/pciehp_ctrl.c -+++ b/drivers/pci/hotplug/pciehp_ctrl.c -@@ -1354,10 +1354,11 @@ static u32 remove_board(struct pci_func - dbg("PCI Bridge Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n", - ctrl->seg, func->bus, func->device, func->function); - bridge_slot_remove(func); -- } else -+ } else { - dbg("PCI Function Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n", - ctrl->seg, func->bus, func->device, func->function); - slot_remove(func); -+ } - - func = pciehp_slot_find(ctrl->slot_bus, device, 0); - } -diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c ---- a/drivers/usb/serial/visor.c -+++ b/drivers/usb/serial/visor.c -@@ -386,6 +386,7 @@ struct visor_private { - int bytes_in; - int bytes_out; - int outstanding_urbs; -+ int throttled; - }; - - /* number of outstanding urbs to prevent userspace DoS from happening */ -@@ -415,6 +416,7 @@ static int visor_open (struct usb_serial - priv->bytes_in = 0; - priv->bytes_out = 0; - priv->outstanding_urbs = 0; -+ priv->throttled = 0; - spin_unlock_irqrestore(&priv->lock, flags); - - /* -@@ -602,6 +604,7 @@ static void visor_read_bulk_callback (st - struct tty_struct *tty; - unsigned long flags; - int i; -+ int throttled; - int result; - - dbg("%s - port %d", __FUNCTION__, port->number); -@@ -627,18 +630,21 @@ static void visor_read_bulk_callback (st - } - spin_lock_irqsave(&priv->lock, flags); - priv->bytes_in += urb->actual_length; -+ throttled = priv->throttled; - spin_unlock_irqrestore(&priv->lock, flags); - -- /* Continue trying to always read */ -- usb_fill_bulk_urb (port->read_urb, port->serial->dev, -- usb_rcvbulkpipe(port->serial->dev, -- port->bulk_in_endpointAddress), -- port->read_urb->transfer_buffer, -- port->read_urb->transfer_buffer_length, -- visor_read_bulk_callback, port); -- result = usb_submit_urb(port->read_urb, GFP_ATOMIC); -- if (result) -- dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); -+ /* Continue trying to always read if we should */ -+ if (!throttled) { -+ usb_fill_bulk_urb (port->read_urb, port->serial->dev, -+ usb_rcvbulkpipe(port->serial->dev, -+ port->bulk_in_endpointAddress), -+ port->read_urb->transfer_buffer, -+ port->read_urb->transfer_buffer_length, -+ visor_read_bulk_callback, port); -+ result = usb_submit_urb(port->read_urb, GFP_ATOMIC); -+ if (result) -+ dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); -+ } - return; - } - -@@ -683,16 +689,26 @@ exit: - - static void visor_throttle (struct usb_serial_port *port) - { -+ struct visor_private *priv = usb_get_serial_port_data(port); -+ unsigned long flags; -+ - dbg("%s - port %d", __FUNCTION__, port->number); -- usb_kill_urb(port->read_urb); -+ spin_lock_irqsave(&priv->lock, flags); -+ priv->throttled = 1; -+ spin_unlock_irqrestore(&priv->lock, flags); - } - - - static void visor_unthrottle (struct usb_serial_port *port) - { -+ struct visor_private *priv = usb_get_serial_port_data(port); -+ unsigned long flags; - int result; - - dbg("%s - port %d", __FUNCTION__, port->number); -+ spin_lock_irqsave(&priv->lock, flags); -+ priv->throttled = 0; -+ spin_unlock_irqrestore(&priv->lock, flags); - - port->read_urb->dev = port->serial->dev; - result = usb_submit_urb(port->read_urb, GFP_ATOMIC); -diff --git a/drivers/video/matrox/matroxfb_accel.c b/drivers/video/matrox/matroxfb_accel.c ---- a/drivers/video/matrox/matroxfb_accel.c -+++ b/drivers/video/matrox/matroxfb_accel.c -@@ -438,13 +438,21 @@ static void matroxfb_1bpp_imageblit(WPMI - } else if (step == 1) { - /* Special case for 1..8bit widths */ - while (height--) { -- mga_writel(mmio, 0, *chardata); -+#if defined(__BIG_ENDIAN) -+ fb_writel((*chardata) << 24, mmio.vaddr); -+#else -+ fb_writel(*chardata, mmio.vaddr); -+#endif - chardata++; - } - } else if (step == 2) { - /* Special case for 9..15bit widths */ - while (height--) { -- mga_writel(mmio, 0, *(u_int16_t*)chardata); -+#if defined(__BIG_ENDIAN) -+ fb_writel((*(u_int16_t*)chardata) << 16, mmio.vaddr); -+#else -+ fb_writel(*(u_int16_t*)chardata, mmio.vaddr); -+#endif - chardata += 2; - } - } else { -@@ -454,7 +462,7 @@ static void matroxfb_1bpp_imageblit(WPMI - - for (i = 0; i < step; i += 4) { - /* Hope that there are at least three readable bytes beyond the end of bitmap */ -- mga_writel(mmio, 0, get_unaligned((u_int32_t*)(chardata + i))); -+ fb_writel(get_unaligned((u_int32_t*)(chardata + i)),mmio.vaddr); - } - chardata += step; - } -diff --git a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h ---- a/drivers/video/matrox/matroxfb_base.h -+++ b/drivers/video/matrox/matroxfb_base.h -@@ -170,14 +170,14 @@ static inline void mga_memcpy_toio(vaddr - - if ((unsigned long)src & 3) { - while (len >= 4) { -- writel(get_unaligned((u32 *)src), addr); -+ fb_writel(get_unaligned((u32 *)src), addr); - addr++; - len -= 4; - src += 4; - } - } else { - while (len >= 4) { -- writel(*(u32 *)src, addr); -+ fb_writel(*(u32 *)src, addr); - addr++; - len -= 4; - src += 4; -diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c ---- a/fs/binfmt_elf.c -+++ b/fs/binfmt_elf.c -@@ -257,7 +257,7 @@ create_elf_tables(struct linux_binprm *b - } - - /* Populate argv and envp */ -- p = current->mm->arg_start; -+ p = current->mm->arg_end = current->mm->arg_start; - while (argc-- > 0) { - size_t len; - __put_user((elf_addr_t)p, argv++); -@@ -1008,6 +1008,7 @@ out_free_ph: - static int load_elf_library(struct file *file) - { - struct elf_phdr *elf_phdata; -+ struct elf_phdr *eppnt; - unsigned long elf_bss, bss, len; - int retval, error, i, j; - struct elfhdr elf_ex; -@@ -1031,44 +1032,47 @@ static int load_elf_library(struct file - /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */ - - error = -ENOMEM; -- elf_phdata = (struct elf_phdr *) kmalloc(j, GFP_KERNEL); -+ elf_phdata = kmalloc(j, GFP_KERNEL); - if (!elf_phdata) - goto out; - -+ eppnt = elf_phdata; - error = -ENOEXEC; -- retval = kernel_read(file, elf_ex.e_phoff, (char *) elf_phdata, j); -+ retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j); - if (retval != j) - goto out_free_ph; - - for (j = 0, i = 0; i<elf_ex.e_phnum; i++) -- if ((elf_phdata + i)->p_type == PT_LOAD) j++; -+ if ((eppnt + i)->p_type == PT_LOAD) -+ j++; - if (j != 1) - goto out_free_ph; - -- while (elf_phdata->p_type != PT_LOAD) elf_phdata++; -+ while (eppnt->p_type != PT_LOAD) -+ eppnt++; - - /* Now use mmap to map the library into memory. */ - down_write(¤t->mm->mmap_sem); - error = do_mmap(file, -- ELF_PAGESTART(elf_phdata->p_vaddr), -- (elf_phdata->p_filesz + -- ELF_PAGEOFFSET(elf_phdata->p_vaddr)), -+ ELF_PAGESTART(eppnt->p_vaddr), -+ (eppnt->p_filesz + -+ ELF_PAGEOFFSET(eppnt->p_vaddr)), - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, -- (elf_phdata->p_offset - -- ELF_PAGEOFFSET(elf_phdata->p_vaddr))); -+ (eppnt->p_offset - -+ ELF_PAGEOFFSET(eppnt->p_vaddr))); - up_write(¤t->mm->mmap_sem); -- if (error != ELF_PAGESTART(elf_phdata->p_vaddr)) -+ if (error != ELF_PAGESTART(eppnt->p_vaddr)) - goto out_free_ph; - -- elf_bss = elf_phdata->p_vaddr + elf_phdata->p_filesz; -+ elf_bss = eppnt->p_vaddr + eppnt->p_filesz; - if (padzero(elf_bss)) { - error = -EFAULT; - goto out_free_ph; - } - -- len = ELF_PAGESTART(elf_phdata->p_filesz + elf_phdata->p_vaddr + ELF_MIN_ALIGN - 1); -- bss = elf_phdata->p_memsz + elf_phdata->p_vaddr; -+ len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + ELF_MIN_ALIGN - 1); -+ bss = eppnt->p_memsz + eppnt->p_vaddr; - if (bss > len) { - down_write(¤t->mm->mmap_sem); - do_brk(len, bss - len); -@@ -1275,7 +1279,7 @@ static void fill_prstatus(struct elf_prs - static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, - struct mm_struct *mm) - { -- int i, len; -+ unsigned int i, len; - - /* first copy the parameters from user space */ - memset(psinfo, 0, sizeof(struct elf_prpsinfo)); -diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c ---- a/fs/cramfs/inode.c -+++ b/fs/cramfs/inode.c -@@ -70,6 +70,7 @@ static struct inode *get_cramfs_inode(st - inode->i_data.a_ops = &cramfs_aops; - } else { - inode->i_size = 0; -+ inode->i_blocks = 0; - init_special_inode(inode, inode->i_mode, - old_decode_dev(cramfs_inode->size)); - } -diff --git a/fs/eventpoll.c b/fs/eventpoll.c ---- a/fs/eventpoll.c -+++ b/fs/eventpoll.c -@@ -619,6 +619,7 @@ eexit_1: - return error; - } - -+#define MAX_EVENTS (INT_MAX / sizeof(struct epoll_event)) - - /* - * Implement the event wait interface for the eventpoll file. It is the kernel -@@ -635,7 +636,7 @@ asmlinkage long sys_epoll_wait(int epfd, - current, epfd, events, maxevents, timeout)); - - /* The maximum number of event must be greater than zero */ -- if (maxevents <= 0) -+ if (maxevents <= 0 || maxevents > MAX_EVENTS) - return -EINVAL; - - /* Verify that the area passed by the user is writeable */ -diff --git a/fs/exec.c b/fs/exec.c ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -814,7 +814,7 @@ void get_task_comm(char *buf, struct tas - { - /* buf must be at least sizeof(tsk->comm) in size */ - task_lock(tsk); -- memcpy(buf, tsk->comm, sizeof(tsk->comm)); -+ strncpy(buf, tsk->comm, sizeof(tsk->comm)); - task_unlock(tsk); - } - -diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c ---- a/fs/ext2/dir.c -+++ b/fs/ext2/dir.c -@@ -592,6 +592,7 @@ int ext2_make_empty(struct inode *inode, - goto fail; - } - kaddr = kmap_atomic(page, KM_USER0); -+ memset(kaddr, 0, chunk_size); - de = (struct ext2_dir_entry_2 *)kaddr; - de->name_len = 1; - de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(1)); -diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c ---- a/fs/ext3/balloc.c -+++ b/fs/ext3/balloc.c -@@ -268,7 +268,8 @@ void ext3_discard_reservation(struct ino - - if (!rsv_is_empty(&rsv->rsv_window)) { - spin_lock(rsv_lock); -- rsv_window_remove(inode->i_sb, rsv); -+ if (!rsv_is_empty(&rsv->rsv_window)) -+ rsv_window_remove(inode->i_sb, rsv); - spin_unlock(rsv_lock); - } - } -diff --git a/fs/hfs/mdb.c b/fs/hfs/mdb.c ---- a/fs/hfs/mdb.c -+++ b/fs/hfs/mdb.c -@@ -333,6 +333,8 @@ void hfs_mdb_close(struct super_block *s - * Release the resources associated with the in-core MDB. */ - void hfs_mdb_put(struct super_block *sb) - { -+ if (!HFS_SB(sb)) -+ return; - /* free the B-trees */ - hfs_btree_close(HFS_SB(sb)->ext_tree); - hfs_btree_close(HFS_SB(sb)->cat_tree); -@@ -340,4 +342,7 @@ void hfs_mdb_put(struct super_block *sb) - /* free the buffers holding the primary and alternate MDBs */ - brelse(HFS_SB(sb)->mdb_bh); - brelse(HFS_SB(sb)->alt_mdb_bh); -+ -+ kfree(HFS_SB(sb)); -+ sb->s_fs_info = NULL; - } -diff --git a/fs/hfs/super.c b/fs/hfs/super.c ---- a/fs/hfs/super.c -+++ b/fs/hfs/super.c -@@ -263,7 +263,7 @@ static int hfs_fill_super(struct super_b - res = -EINVAL; - if (!parse_options((char *)data, sbi)) { - hfs_warn("hfs_fs: unable to parse mount options.\n"); -- goto bail3; -+ goto bail; - } - - sb->s_op = &hfs_super_operations; -@@ -276,7 +276,7 @@ static int hfs_fill_super(struct super_b - hfs_warn("VFS: Can't find a HFS filesystem on dev %s.\n", - hfs_mdb_name(sb)); - res = -EINVAL; -- goto bail2; -+ goto bail; - } - - /* try to get the root inode */ -@@ -306,10 +306,8 @@ bail_iput: - iput(root_inode); - bail_no_root: - hfs_warn("hfs_fs: get root inode failed.\n"); -+bail: - hfs_mdb_put(sb); --bail2: --bail3: -- kfree(sbi); - return res; - } - -diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c ---- a/fs/hfsplus/super.c -+++ b/fs/hfsplus/super.c -@@ -207,7 +207,9 @@ static void hfsplus_write_super(struct s - static void hfsplus_put_super(struct super_block *sb) - { - dprint(DBG_SUPER, "hfsplus_put_super\n"); -- if (!(sb->s_flags & MS_RDONLY)) { -+ if (!sb->s_fs_info) -+ return; -+ if (!(sb->s_flags & MS_RDONLY) && HFSPLUS_SB(sb).s_vhdr) { - struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr; - - vhdr->modify_date = hfsp_now2mt(); -@@ -223,6 +225,8 @@ static void hfsplus_put_super(struct sup - iput(HFSPLUS_SB(sb).alloc_file); - iput(HFSPLUS_SB(sb).hidden_dir); - brelse(HFSPLUS_SB(sb).s_vhbh); -+ kfree(sb->s_fs_info); -+ sb->s_fs_info = NULL; - } - - static int hfsplus_statfs(struct super_block *sb, struct kstatfs *buf) -diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c ---- a/fs/isofs/inode.c -+++ b/fs/isofs/inode.c -@@ -685,6 +685,8 @@ root_found: - sbi->s_log_zone_size = isonum_723 (h_pri->logical_block_size); - sbi->s_max_size = isonum_733(h_pri->volume_space_size); - } else { -+ if (!pri) -+ goto out_freebh; - rootp = (struct iso_directory_record *) pri->root_directory_record; - sbi->s_nzones = isonum_733 (pri->volume_space_size); - sbi->s_log_zone_size = isonum_723 (pri->logical_block_size); -@@ -1395,6 +1397,9 @@ struct inode *isofs_iget(struct super_bl - struct inode *inode; - struct isofs_iget5_callback_data data; - -+ if (offset >= 1ul << sb->s_blocksize_bits) -+ return NULL; -+ - data.block = block; - data.offset = offset; - -diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c ---- a/fs/isofs/rock.c -+++ b/fs/isofs/rock.c -@@ -53,6 +53,7 @@ - if(LEN & 1) LEN++; \ - CHR = ((unsigned char *) DE) + LEN; \ - LEN = *((unsigned char *) DE) - LEN; \ -+ if (LEN<0) LEN=0; \ - if (ISOFS_SB(inode->i_sb)->s_rock_offset!=-1) \ - { \ - LEN-=ISOFS_SB(inode->i_sb)->s_rock_offset; \ -@@ -73,6 +74,10 @@ - offset1 = 0; \ - pbh = sb_bread(DEV->i_sb, block); \ - if(pbh){ \ -+ if (offset > pbh->b_size || offset + cont_size > pbh->b_size){ \ -+ brelse(pbh); \ -+ goto out; \ -+ } \ - memcpy(buffer + offset1, pbh->b_data + offset, cont_size - offset1); \ - brelse(pbh); \ - chr = (unsigned char *) buffer; \ -@@ -103,12 +108,13 @@ int get_rock_ridge_filename(struct iso_d - struct rock_ridge * rr; - int sig; - -- while (len > 1){ /* There may be one byte for padding somewhere */ -+ while (len > 2){ /* There may be one byte for padding somewhere */ - rr = (struct rock_ridge *) chr; -- if (rr->len == 0) goto out; /* Something got screwed up here */ -+ if (rr->len < 3) goto out; /* Something got screwed up here */ - sig = isonum_721(chr); - chr += rr->len; - len -= rr->len; -+ if (len < 0) goto out; /* corrupted isofs */ - - switch(sig){ - case SIG('R','R'): -@@ -122,6 +128,7 @@ int get_rock_ridge_filename(struct iso_d - break; - case SIG('N','M'): - if (truncate) break; -+ if (rr->len < 5) break; - /* - * If the flags are 2 or 4, this indicates '.' or '..'. - * We don't want to do anything with this, because it -@@ -186,12 +193,13 @@ parse_rock_ridge_inode_internal(struct i - struct rock_ridge * rr; - int rootflag; - -- while (len > 1){ /* There may be one byte for padding somewhere */ -+ while (len > 2){ /* There may be one byte for padding somewhere */ - rr = (struct rock_ridge *) chr; -- if (rr->len == 0) goto out; /* Something got screwed up here */ -+ if (rr->len < 3) goto out; /* Something got screwed up here */ - sig = isonum_721(chr); - chr += rr->len; - len -= rr->len; -+ if (len < 0) goto out; /* corrupted isofs */ - - switch(sig){ - #ifndef CONFIG_ZISOFS /* No flag for SF or ZF */ -@@ -462,7 +470,7 @@ static int rock_ridge_symlink_readpage(s - struct rock_ridge *rr; - - if (!ISOFS_SB(inode->i_sb)->s_rock) -- panic ("Cannot have symlink with high sierra variant of iso filesystem\n"); -+ goto error; - - block = ei->i_iget5_block; - lock_kernel(); -@@ -487,13 +495,15 @@ static int rock_ridge_symlink_readpage(s - SETUP_ROCK_RIDGE(raw_inode, chr, len); - - repeat: -- while (len > 1) { /* There may be one byte for padding somewhere */ -+ while (len > 2) { /* There may be one byte for padding somewhere */ - rr = (struct rock_ridge *) chr; -- if (rr->len == 0) -+ if (rr->len < 3) - goto out; /* Something got screwed up here */ - sig = isonum_721(chr); - chr += rr->len; - len -= rr->len; -+ if (len < 0) -+ goto out; /* corrupted isofs */ - - switch (sig) { - case SIG('R', 'R'): -@@ -543,6 +553,7 @@ static int rock_ridge_symlink_readpage(s - fail: - brelse(bh); - unlock_kernel(); -+ error: - SetPageError(page); - kunmap(page); - unlock_page(page); -diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c ---- a/fs/jbd/checkpoint.c -+++ b/fs/jbd/checkpoint.c -@@ -339,8 +339,10 @@ int log_do_checkpoint(journal_t *journal - } - } while (jh != last_jh && !retry); - -- if (batch_count) -+ if (batch_count) { - __flush_batch(journal, bhs, &batch_count); -+ retry = 1; -+ } - - /* - * If someone cleaned up this transaction while we slept, we're -diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c ---- a/fs/jbd/transaction.c -+++ b/fs/jbd/transaction.c -@@ -1775,10 +1775,10 @@ static int journal_unmap_buffer(journal_ - JBUFFER_TRACE(jh, "checkpointed: add to BJ_Forget"); - ret = __dispose_buffer(jh, - journal->j_running_transaction); -+ journal_put_journal_head(jh); - spin_unlock(&journal->j_list_lock); - jbd_unlock_bh_state(bh); - spin_unlock(&journal->j_state_lock); -- journal_put_journal_head(jh); - return ret; - } else { - /* There is no currently-running transaction. So the -@@ -1789,10 +1789,10 @@ static int journal_unmap_buffer(journal_ - JBUFFER_TRACE(jh, "give to committing trans"); - ret = __dispose_buffer(jh, - journal->j_committing_transaction); -+ journal_put_journal_head(jh); - spin_unlock(&journal->j_list_lock); - jbd_unlock_bh_state(bh); - spin_unlock(&journal->j_state_lock); -- journal_put_journal_head(jh); - return ret; - } else { - /* The orphan record's transaction has -@@ -1813,10 +1813,10 @@ static int journal_unmap_buffer(journal_ - journal->j_running_transaction); - jh->b_next_transaction = NULL; - } -+ journal_put_journal_head(jh); - spin_unlock(&journal->j_list_lock); - jbd_unlock_bh_state(bh); - spin_unlock(&journal->j_state_lock); -- journal_put_journal_head(jh); - return 0; - } else { - /* Good, the buffer belongs to the running transaction. -diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h ---- a/include/asm-x86_64/processor.h -+++ b/include/asm-x86_64/processor.h -@@ -160,9 +160,9 @@ static inline void clear_in_cr4 (unsigne - - - /* -- * User space process size. 47bits. -+ * User space process size. 47bits minus one guard page. - */ --#define TASK_SIZE (0x800000000000UL) -+#define TASK_SIZE (0x800000000000UL - 4096) - - /* This decides where the kernel will search for a free chunk of vm - * space during mmap's. -diff --git a/include/linux/err.h b/include/linux/err.h ---- a/include/linux/err.h -+++ b/include/linux/err.h -@@ -13,6 +13,8 @@ - * This should be a per-architecture thing, to allow different - * error and pointer decisions. - */ -+#define IS_ERR_VALUE(x) unlikely((x) > (unsigned long)-1000L) -+ - static inline void *ERR_PTR(long error) - { - return (void *) error; -@@ -25,7 +27,7 @@ static inline long PTR_ERR(const void *p - - static inline long IS_ERR(const void *ptr) - { -- return unlikely((unsigned long)ptr > (unsigned long)-1000L); -+ return IS_ERR_VALUE((unsigned long)ptr); - } - - #endif /* _LINUX_ERR_H */ -diff --git a/kernel/exit.c b/kernel/exit.c ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -516,8 +516,6 @@ static inline void choose_new_parent(tas - */ - BUG_ON(p == reaper || reaper->exit_state >= EXIT_ZOMBIE); - p->real_parent = reaper; -- if (p->parent == p->real_parent) -- BUG(); - } - - static inline void reparent_thread(task_t *p, task_t *father, int traced) -diff --git a/kernel/signal.c b/kernel/signal.c ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1728,6 +1728,7 @@ do_signal_stop(int signr) - * with another processor delivering a stop signal, - * then the SIGCONT that wakes us up should clear it. - */ -+ read_unlock(&tasklist_lock); - return 0; - } - -diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c ---- a/lib/rwsem-spinlock.c -+++ b/lib/rwsem-spinlock.c -@@ -140,12 +140,12 @@ void fastcall __sched __down_read(struct - - rwsemtrace(sem, "Entering __down_read"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irq(&sem->wait_lock); - - if (sem->activity >= 0 && list_empty(&sem->wait_list)) { - /* granted */ - sem->activity++; -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irq(&sem->wait_lock); - goto out; - } - -@@ -160,7 +160,7 @@ void fastcall __sched __down_read(struct - list_add_tail(&waiter.list, &sem->wait_list); - - /* we don't need to touch the semaphore struct anymore */ -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irq(&sem->wait_lock); - - /* wait to be given the lock */ - for (;;) { -@@ -181,10 +181,12 @@ void fastcall __sched __down_read(struct - */ - int fastcall __down_read_trylock(struct rw_semaphore *sem) - { -+ unsigned long flags; - int ret = 0; -+ - rwsemtrace(sem, "Entering __down_read_trylock"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - if (sem->activity >= 0 && list_empty(&sem->wait_list)) { - /* granted */ -@@ -192,7 +194,7 @@ int fastcall __down_read_trylock(struct - ret = 1; - } - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __down_read_trylock"); - return ret; -@@ -209,12 +211,12 @@ void fastcall __sched __down_write(struc - - rwsemtrace(sem, "Entering __down_write"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irq(&sem->wait_lock); - - if (sem->activity == 0 && list_empty(&sem->wait_list)) { - /* granted */ - sem->activity = -1; -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irq(&sem->wait_lock); - goto out; - } - -@@ -229,7 +231,7 @@ void fastcall __sched __down_write(struc - list_add_tail(&waiter.list, &sem->wait_list); - - /* we don't need to touch the semaphore struct anymore */ -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irq(&sem->wait_lock); - - /* wait to be given the lock */ - for (;;) { -@@ -250,10 +252,12 @@ void fastcall __sched __down_write(struc - */ - int fastcall __down_write_trylock(struct rw_semaphore *sem) - { -+ unsigned long flags; - int ret = 0; -+ - rwsemtrace(sem, "Entering __down_write_trylock"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - if (sem->activity == 0 && list_empty(&sem->wait_list)) { - /* granted */ -@@ -261,7 +265,7 @@ int fastcall __down_write_trylock(struct - ret = 1; - } - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __down_write_trylock"); - return ret; -@@ -272,14 +276,16 @@ int fastcall __down_write_trylock(struct - */ - void fastcall __up_read(struct rw_semaphore *sem) - { -+ unsigned long flags; -+ - rwsemtrace(sem, "Entering __up_read"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - if (--sem->activity == 0 && !list_empty(&sem->wait_list)) - sem = __rwsem_wake_one_writer(sem); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __up_read"); - } -@@ -289,15 +295,17 @@ void fastcall __up_read(struct rw_semaph - */ - void fastcall __up_write(struct rw_semaphore *sem) - { -+ unsigned long flags; -+ - rwsemtrace(sem, "Entering __up_write"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - sem->activity = 0; - if (!list_empty(&sem->wait_list)) - sem = __rwsem_do_wake(sem, 1); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __up_write"); - } -@@ -308,15 +316,17 @@ void fastcall __up_write(struct rw_semap - */ - void fastcall __downgrade_write(struct rw_semaphore *sem) - { -+ unsigned long flags; -+ - rwsemtrace(sem, "Entering __downgrade_write"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - sem->activity = 1; - if (!list_empty(&sem->wait_list)) - sem = __rwsem_do_wake(sem, 0); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __downgrade_write"); - } -diff --git a/lib/rwsem.c b/lib/rwsem.c ---- a/lib/rwsem.c -+++ b/lib/rwsem.c -@@ -150,7 +150,7 @@ rwsem_down_failed_common(struct rw_semap - set_task_state(tsk, TASK_UNINTERRUPTIBLE); - - /* set up my own style of waitqueue */ -- spin_lock(&sem->wait_lock); -+ spin_lock_irq(&sem->wait_lock); - waiter->task = tsk; - get_task_struct(tsk); - -@@ -163,7 +163,7 @@ rwsem_down_failed_common(struct rw_semap - if (!(count & RWSEM_ACTIVE_MASK)) - sem = __rwsem_do_wake(sem, 0); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irq(&sem->wait_lock); - - /* wait to be given the lock */ - for (;;) { -@@ -219,15 +219,17 @@ rwsem_down_write_failed(struct rw_semaph - */ - struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) - { -+ unsigned long flags; -+ - rwsemtrace(sem, "Entering rwsem_wake"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - /* do nothing if list empty */ - if (!list_empty(&sem->wait_list)) - sem = __rwsem_do_wake(sem, 0); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving rwsem_wake"); - -@@ -241,15 +243,17 @@ struct rw_semaphore fastcall *rwsem_wake - */ - struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) - { -+ unsigned long flags; -+ - rwsemtrace(sem, "Entering rwsem_downgrade_wake"); - -- spin_lock(&sem->wait_lock); -+ spin_lock_irqsave(&sem->wait_lock, flags); - - /* do nothing if list empty */ - if (!list_empty(&sem->wait_list)) - sem = __rwsem_do_wake(sem, 1); - -- spin_unlock(&sem->wait_lock); -+ spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving rwsem_downgrade_wake"); - return sem; -diff --git a/mm/mmap.c b/mm/mmap.c ---- a/mm/mmap.c -+++ b/mm/mmap.c -@@ -1315,37 +1315,40 @@ unsigned long - get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, - unsigned long pgoff, unsigned long flags) - { -- if (flags & MAP_FIXED) { -- unsigned long ret; -+ unsigned long ret; - -- if (addr > TASK_SIZE - len) -- return -ENOMEM; -- if (addr & ~PAGE_MASK) -- return -EINVAL; -- if (file && is_file_hugepages(file)) { -- /* -- * Check if the given range is hugepage aligned, and -- * can be made suitable for hugepages. -- */ -- ret = prepare_hugepage_range(addr, len); -- } else { -- /* -- * Ensure that a normal request is not falling in a -- * reserved hugepage range. For some archs like IA-64, -- * there is a separate region for hugepages. -- */ -- ret = is_hugepage_only_range(addr, len); -- } -- if (ret) -- return -EINVAL; -- return addr; -- } -+ if (!(flags & MAP_FIXED)) { -+ unsigned long (*get_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); - -- if (file && file->f_op && file->f_op->get_unmapped_area) -- return file->f_op->get_unmapped_area(file, addr, len, -- pgoff, flags); -+ get_area = current->mm->get_unmapped_area; -+ if (file && file->f_op && file->f_op->get_unmapped_area) -+ get_area = file->f_op->get_unmapped_area; -+ addr = get_area(file, addr, len, pgoff, flags); -+ if (IS_ERR_VALUE(addr)) -+ return addr; -+ } - -- return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); -+ if (addr > TASK_SIZE - len) -+ return -ENOMEM; -+ if (addr & ~PAGE_MASK) -+ return -EINVAL; -+ if (file && is_file_hugepages(file)) { -+ /* -+ * Check if the given range is hugepage aligned, and -+ * can be made suitable for hugepages. -+ */ -+ ret = prepare_hugepage_range(addr, len); -+ } else { -+ /* -+ * Ensure that a normal request is not falling in a -+ * reserved hugepage range. For some archs like IA-64, -+ * there is a separate region for hugepages. -+ */ -+ ret = is_hugepage_only_range(addr, len); -+ } -+ if (ret) -+ return -EINVAL; -+ return addr; - } - - EXPORT_SYMBOL(get_unmapped_area); -diff --git a/mm/rmap.c b/mm/rmap.c ---- a/mm/rmap.c -+++ b/mm/rmap.c -@@ -641,7 +641,7 @@ static void try_to_unmap_cluster(unsigne - pgd_t *pgd; - pud_t *pud; - pmd_t *pmd; -- pte_t *pte; -+ pte_t *pte, *original_pte; - pte_t pteval; - struct page *page; - unsigned long address; -@@ -673,7 +673,7 @@ static void try_to_unmap_cluster(unsigne - if (!pmd_present(*pmd)) - goto out_unlock; - -- for (pte = pte_offset_map(pmd, address); -+ for (original_pte = pte = pte_offset_map(pmd, address); - address < end; pte++, address += PAGE_SIZE) { - - if (!pte_present(*pte)) -@@ -710,7 +710,7 @@ static void try_to_unmap_cluster(unsigne - (*mapcount)--; - } - -- pte_unmap(pte); -+ pte_unmap(original_pte); - - out_unlock: - spin_unlock(&mm->page_table_lock); -diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c ---- a/net/bluetooth/af_bluetooth.c -+++ b/net/bluetooth/af_bluetooth.c -@@ -64,7 +64,7 @@ static kmem_cache_t *bt_sock_cache; - - int bt_sock_register(int proto, struct net_proto_family *ops) - { -- if (proto >= BT_MAX_PROTO) -+ if (proto < 0 || proto >= BT_MAX_PROTO) - return -EINVAL; - - if (bt_proto[proto]) -@@ -77,7 +77,7 @@ EXPORT_SYMBOL(bt_sock_register); - - int bt_sock_unregister(int proto) - { -- if (proto >= BT_MAX_PROTO) -+ if (proto < 0 || proto >= BT_MAX_PROTO) - return -EINVAL; - - if (!bt_proto[proto]) -@@ -92,7 +92,7 @@ static int bt_sock_create(struct socket - { - int err = 0; - -- if (proto >= BT_MAX_PROTO) -+ if (proto < 0 || proto >= BT_MAX_PROTO) - return -EINVAL; - - #if defined(CONFIG_KMOD) -diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -54,6 +54,9 @@ int br_handle_frame_finish(struct sk_buf - struct net_bridge_fdb_entry *dst; - int passedup = 0; - -+ /* insert into forwarding database after filtering to avoid spoofing */ -+ br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); -+ - if (br->dev->flags & IFF_PROMISC) { - struct sk_buff *skb2; - -@@ -108,8 +111,7 @@ int br_handle_frame(struct net_bridge_po - if (eth_hdr(skb)->h_source[0] & 1) - goto err; - -- if (p->state == BR_STATE_LEARNING || -- p->state == BR_STATE_FORWARDING) -+ if (p->state == BR_STATE_LEARNING) - br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); - - if (p->br->stp_enabled && -diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c ---- a/net/bridge/br_stp_bpdu.c -+++ b/net/bridge/br_stp_bpdu.c -@@ -140,6 +140,9 @@ int br_stp_handle_bpdu(struct sk_buff *s - struct net_bridge *br = p->br; - unsigned char *buf; - -+ /* insert into forwarding database after filtering to avoid spoofing */ -+ br_fdb_insert(p->br, p, eth_hdr(skb)->h_source, 0); -+ - /* need at least the 802 and STP headers */ - if (!pskb_may_pull(skb, sizeof(header)+1) || - memcmp(skb->data, header, sizeof(header))) -diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c ---- a/net/bridge/netfilter/ebtables.c -+++ b/net/bridge/netfilter/ebtables.c -@@ -179,9 +179,10 @@ unsigned int ebt_do_table (unsigned int - struct ebt_chainstack *cs; - struct ebt_entries *chaininfo; - char *base; -- struct ebt_table_info *private = table->private; -+ struct ebt_table_info *private; - - read_lock_bh(&table->lock); -+ private = table->private; - cb_base = COUNTER_BASE(private->counters, private->nentries, - smp_processor_id()); - if (private->chainstack) -diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c ---- a/net/ipv4/fib_hash.c -+++ b/net/ipv4/fib_hash.c -@@ -919,13 +919,23 @@ out: - return fa; - } - -+static struct fib_alias *fib_get_idx(struct seq_file *seq, loff_t pos) -+{ -+ struct fib_alias *fa = fib_get_first(seq); -+ -+ if (fa) -+ while (pos && (fa = fib_get_next(seq))) -+ --pos; -+ return pos ? NULL : fa; -+} -+ - static void *fib_seq_start(struct seq_file *seq, loff_t *pos) - { - void *v = NULL; - - read_lock(&fib_hash_lock); - if (ip_fib_main_table) -- v = *pos ? fib_get_next(seq) : SEQ_START_TOKEN; -+ v = *pos ? fib_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; - return v; - } - -diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c ---- a/net/ipv4/netfilter/ip_queue.c -+++ b/net/ipv4/netfilter/ip_queue.c -@@ -3,6 +3,7 @@ - * communicating with userspace via netlink. - * - * (C) 2000-2002 James Morris <jmorris@xxxxxxxxxxxxxxxx> -+ * (C) 2003-2005 Netfilter Core Team <coreteam@xxxxxxxxxxxxx> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as -@@ -14,6 +15,7 @@ - * Zander). - * 2000-08-01: Added Nick Williams' MAC support. - * 2002-06-25: Code cleanup. -+ * 2005-05-26: local_bh_{disable,enable} around nf_reinject (Harald Welte) - * - */ - #include <linux/module.h> -@@ -66,7 +68,15 @@ static DECLARE_MUTEX(ipqnl_sem); - static void - ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict) - { -+ /* TCP input path (and probably other bits) assume to be called -+ * from softirq context, not from syscall, like ipq_issue_verdict is -+ * called. TCP input path deadlocks with locks taken from timer -+ * softirq, e.g. We therefore emulate this by local_bh_disable() */ -+ -+ local_bh_disable(); - nf_reinject(entry->skb, entry->info, verdict); -+ local_bh_enable(); -+ - kfree(entry); - } - -diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c ---- a/net/ipv4/tcp_input.c -+++ b/net/ipv4/tcp_input.c -@@ -1653,7 +1653,10 @@ static void DBGUNDO(struct sock *sk, str - static void tcp_undo_cwr(struct tcp_sock *tp, int undo) - { - if (tp->prior_ssthresh) { -- tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh<<1); -+ if (tcp_is_bic(tp)) -+ tp->snd_cwnd = max(tp->snd_cwnd, tp->bictcp.last_max_cwnd); -+ else -+ tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh<<1); - - if (undo && tp->prior_ssthresh > tp->snd_ssthresh) { - tp->snd_ssthresh = tp->prior_ssthresh; -diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c ---- a/net/ipv4/tcp_timer.c -+++ b/net/ipv4/tcp_timer.c -@@ -38,6 +38,7 @@ static void tcp_keepalive_timer (unsigne - - #ifdef TCP_DEBUG - const char tcp_timer_bug_msg[] = KERN_DEBUG "tcpbug: unknown timer value\n"; -+EXPORT_SYMBOL(tcp_timer_bug_msg); - #endif - - /* -diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c ---- a/net/ipv4/xfrm4_output.c -+++ b/net/ipv4/xfrm4_output.c -@@ -103,17 +103,17 @@ int xfrm4_output(struct sk_buff *skb) - goto error_nolock; - } - -- spin_lock_bh(&x->lock); -- err = xfrm_state_check(x, skb); -- if (err) -- goto error; -- - if (x->props.mode) { - err = xfrm4_tunnel_check_size(skb); - if (err) -- goto error; -+ goto error_nolock; - } - -+ spin_lock_bh(&x->lock); -+ err = xfrm_state_check(x, skb); -+ if (err) -+ goto error; -+ - xfrm4_encap(skb); - - err = x->type->output(skb); -diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c ---- a/net/ipv6/xfrm6_output.c -+++ b/net/ipv6/xfrm6_output.c -@@ -103,17 +103,17 @@ int xfrm6_output(struct sk_buff *skb) - goto error_nolock; - } - -- spin_lock_bh(&x->lock); -- err = xfrm_state_check(x, skb); -- if (err) -- goto error; -- - if (x->props.mode) { - err = xfrm6_tunnel_check_size(skb); - if (err) -- goto error; -+ goto error_nolock; - } - -+ spin_lock_bh(&x->lock); -+ err = xfrm_state_check(x, skb); -+ if (err) -+ goto error; -+ - xfrm6_encap(skb); - - err = x->type->output(skb); -diff --git a/net/netrom/nr_in.c b/net/netrom/nr_in.c ---- a/net/netrom/nr_in.c -+++ b/net/netrom/nr_in.c -@@ -74,7 +74,6 @@ static int nr_queue_rx_frame(struct sock - static int nr_state1_machine(struct sock *sk, struct sk_buff *skb, - int frametype) - { -- bh_lock_sock(sk); - switch (frametype) { - case NR_CONNACK: { - nr_cb *nr = nr_sk(sk); -@@ -103,8 +102,6 @@ static int nr_state1_machine(struct sock - default: - break; - } -- bh_unlock_sock(sk); -- - return 0; - } - -@@ -116,7 +113,6 @@ static int nr_state1_machine(struct sock - static int nr_state2_machine(struct sock *sk, struct sk_buff *skb, - int frametype) - { -- bh_lock_sock(sk); - switch (frametype) { - case NR_CONNACK | NR_CHOKE_FLAG: - nr_disconnect(sk, ECONNRESET); -@@ -132,8 +128,6 @@ static int nr_state2_machine(struct sock - default: - break; - } -- bh_unlock_sock(sk); -- - return 0; - } - -@@ -154,7 +148,6 @@ static int nr_state3_machine(struct sock - nr = skb->data[18]; - ns = skb->data[17]; - -- bh_lock_sock(sk); - switch (frametype) { - case NR_CONNREQ: - nr_write_internal(sk, NR_CONNACK); -@@ -265,8 +258,6 @@ static int nr_state3_machine(struct sock - default: - break; - } -- bh_unlock_sock(sk); -- - return queued; - } - -diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c ---- a/net/rose/rose_route.c -+++ b/net/rose/rose_route.c -@@ -727,7 +727,8 @@ int rose_rt_ioctl(unsigned int cmd, void - } - if (rose_route.mask > 10) /* Mask can't be more than 10 digits */ - return -EINVAL; -- -+ if (rose_route.ndigis > 8) /* No more than 8 digipeats */ -+ return -EINVAL; - err = rose_add_node(&rose_route, dev); - dev_put(dev); - return err; -diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c ---- a/net/sched/sch_netem.c -+++ b/net/sched/sch_netem.c -@@ -184,10 +184,15 @@ static int netem_enqueue(struct sk_buff - /* Random duplication */ - if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) { - struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); -- -- pr_debug("netem_enqueue: dup %p\n", skb2); -- if (skb2) -- delay_skb(sch, skb2); -+ if (skb2) { -+ struct Qdisc *rootq = sch->dev->qdisc; -+ u32 dupsave = q->duplicate; -+ -+ /* prevent duplicating a dup... */ -+ q->duplicate = 0; -+ rootq->enqueue(skb2, rootq); -+ q->duplicate = dupsave; -+ } - } - - /* If doing simple delay then gap == 0 so all packets -diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c ---- a/net/xfrm/xfrm_state.c -+++ b/net/xfrm/xfrm_state.c -@@ -609,7 +609,7 @@ static struct xfrm_state *__xfrm_find_ac - - for (i = 0; i < XFRM_DST_HSIZE; i++) { - list_for_each_entry(x, xfrm_state_bydst+i, bydst) { -- if (x->km.seq == seq) { -+ if (x->km.seq == seq && x->km.state == XFRM_STATE_ACQ) { - xfrm_state_hold(x); - return x; - } -diff --git a/security/keys/key.c b/security/keys/key.c ---- a/security/keys/key.c -+++ b/security/keys/key.c -@@ -57,9 +57,10 @@ struct key_user *key_user_lookup(uid_t u - { - struct key_user *candidate = NULL, *user; - struct rb_node *parent = NULL; -- struct rb_node **p = &key_user_tree.rb_node; -+ struct rb_node **p; - - try_again: -+ p = &key_user_tree.rb_node; - spin_lock(&key_user_lock); - - /* search the tree for a user record with a matching UID */ -diff --git a/sound/core/timer.c b/sound/core/timer.c ---- a/sound/core/timer.c -+++ b/sound/core/timer.c -@@ -1117,7 +1117,8 @@ static void snd_timer_user_append_to_tqu - if (tu->qused >= tu->queue_size) { - tu->overrun++; - } else { -- memcpy(&tu->queue[tu->qtail++], tread, sizeof(*tread)); -+ memcpy(&tu->tqueue[tu->qtail++], tread, sizeof(*tread)); -+ tu->qtail %= tu->queue_size; - tu->qused++; - } - } -@@ -1140,6 +1141,8 @@ static void snd_timer_user_ccallback(snd - spin_lock(&tu->qlock); - snd_timer_user_append_to_tqueue(tu, &r1); - spin_unlock(&tu->qlock); -+ kill_fasync(&tu->fasync, SIGIO, POLL_IN); -+ wake_up(&tu->qchange_sleep); - } - - static void snd_timer_user_tinterrupt(snd_timer_instance_t *timeri, -diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c ---- a/sound/pci/ac97/ac97_codec.c -+++ b/sound/pci/ac97/ac97_codec.c -@@ -1185,7 +1185,7 @@ snd_kcontrol_t *snd_ac97_cnew(const snd_ - /* - * create mute switch(es) for normal stereo controls - */ --static int snd_ac97_cmute_new(snd_card_t *card, char *name, int reg, ac97_t *ac97) -+static int snd_ac97_cmute_new_stereo(snd_card_t *card, char *name, int reg, int check_stereo, ac97_t *ac97) - { - snd_kcontrol_t *kctl; - int err; -@@ -1196,7 +1196,7 @@ static int snd_ac97_cmute_new(snd_card_t - - mute_mask = 0x8000; - val = snd_ac97_read(ac97, reg); -- if (ac97->flags & AC97_STEREO_MUTES) { -+ if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) { - /* check whether both mute bits work */ - val1 = val | 0x8080; - snd_ac97_write(ac97, reg, val1); -@@ -1254,7 +1254,7 @@ static int snd_ac97_cvol_new(snd_card_t - /* - * create a mute-switch and a volume for normal stereo/mono controls - */ --static int snd_ac97_cmix_new(snd_card_t *card, const char *pfx, int reg, ac97_t *ac97) -+static int snd_ac97_cmix_new_stereo(snd_card_t *card, const char *pfx, int reg, int check_stereo, ac97_t *ac97) - { - int err; - char name[44]; -@@ -1265,7 +1265,7 @@ static int snd_ac97_cmix_new(snd_card_t - - if (snd_ac97_try_bit(ac97, reg, 15)) { - sprintf(name, "%s Switch", pfx); -- if ((err = snd_ac97_cmute_new(card, name, reg, ac97)) < 0) -+ if ((err = snd_ac97_cmute_new_stereo(card, name, reg, check_stereo, ac97)) < 0) - return err; - } - check_volume_resolution(ac97, reg, &lo_max, &hi_max); -@@ -1277,6 +1277,8 @@ static int snd_ac97_cmix_new(snd_card_t - return 0; - } - -+#define snd_ac97_cmix_new(card, pfx, reg, ac97) snd_ac97_cmix_new_stereo(card, pfx, reg, 0, ac97) -+#define snd_ac97_cmute_new(card, name, reg, ac97) snd_ac97_cmute_new_stereo(card, name, reg, 0, ac97) - - static unsigned int snd_ac97_determine_spdif_rates(ac97_t *ac97); - -@@ -1327,7 +1329,8 @@ static int snd_ac97_mixer_build(ac97_t * - - /* build surround controls */ - if (snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) { -- if ((err = snd_ac97_cmix_new(card, "Surround Playback", AC97_SURROUND_MASTER, ac97)) < 0) -+ /* Surround Master (0x38) is with stereo mutes */ -+ if ((err = snd_ac97_cmix_new_stereo(card, "Surround Playback", AC97_SURROUND_MASTER, 1, ac97)) < 0) - return err; - } - -diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c ---- a/sound/usb/usbaudio.c -+++ b/sound/usb/usbaudio.c -@@ -3276,7 +3276,7 @@ static void snd_usb_audio_disconnect(str - } - usb_chip[chip->index] = NULL; - up(®ister_mutex); -- snd_card_free_in_thread(card); -+ snd_card_free(card); - } else { - up(®ister_mutex); - } -diff --git a/sound/usb/usx2y/usbusx2y.c b/sound/usb/usx2y/usbusx2y.c ---- a/sound/usb/usx2y/usbusx2y.c -+++ b/sound/usb/usx2y/usbusx2y.c -@@ -1,6 +1,11 @@ - /* - * usbusy2y.c - ALSA USB US-428 Driver - * -+2005-04-14 Karsten Wiese -+ Version 0.8.7.2: -+ Call snd_card_free() instead of snd_card_free_in_thread() to prevent oops with dead keyboard symptom. -+ Tested ok with kernel 2.6.12-rc2. -+ - 2004-12-14 Karsten Wiese - Version 0.8.7.1: - snd_pcm_open for rawusb pcm-devices now returns -EBUSY if called without rawusb's hwdep device being open. -@@ -143,7 +148,7 @@ - - - MODULE_AUTHOR("Karsten Wiese <annabellesgarden@xxxxxxxx>"); --MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.8.7.1"); -+MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.8.7.2"); - MODULE_LICENSE("GPL"); - MODULE_SUPPORTED_DEVICE("{{TASCAM(0x1604), "NAME_ALLCAPS"(0x8001)(0x8005)(0x8007) }}"); - -@@ -430,8 +435,6 @@ static void usX2Y_usb_disconnect(struct - if (ptr) { - usX2Ydev_t* usX2Y = usX2Y((snd_card_t*)ptr); - struct list_head* p; -- if (usX2Y->chip_status == USX2Y_STAT_CHIP_HUP) // on 2.6.1 kernel snd_usbmidi_disconnect() -- return; // calls us back. better leave :-) . - usX2Y->chip.shutdown = 1; - usX2Y->chip_status = USX2Y_STAT_CHIP_HUP; - usX2Y_unlinkSeq(&usX2Y->AS04); -@@ -443,7 +446,7 @@ static void usX2Y_usb_disconnect(struct - } - if (usX2Y->us428ctls_sharedmem) - wake_up(&usX2Y->us428ctls_wait_queue_head); -- snd_card_free_in_thread((snd_card_t*)ptr); -+ snd_card_free((snd_card_t*)ptr); - } - } - diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/net-csum.patch --- a/patches/linux-2.6.11/net-csum.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,22 +0,0 @@ -diff -ur linux-2.6.11/net/ipv4/netfilter/ip_conntrack_proto_tcp.c linux-2.6.11-csum/net/ipv4/netfilter/ip_conntrack_proto_tcp.c ---- linux-2.6.11/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2005-05-27 11:47:48 +01:00 -+++ linux-2.6.11-csum/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2005-05-27 11:48:07 +01:00 -@@ -803,6 +803,7 @@ - */ - /* FIXME: Source route IP option packets --RR */ - if (hooknum == NF_IP_PRE_ROUTING -+ && skb->ip_summed != CHECKSUM_UNNECESSARY - && csum_tcpudp_magic(iph->saddr, iph->daddr, tcplen, IPPROTO_TCP, - skb->ip_summed == CHECKSUM_HW ? skb->csum - : skb_checksum(skb, iph->ihl*4, tcplen, 0))) { -diff -ur linux-2.6.11/net/ipv4/netfilter/ip_conntrack_proto_udp.c linux-2.6.11-csum/net/ipv4/netfilter/ip_conntrack_proto_udp.c ---- linux-2.6.11/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2005-05-27 11:47:48 +01:00 -+++ linux-2.6.11-csum/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2005-05-27 11:48:07 +01:00 -@@ -120,6 +120,7 @@ - * and moreover root might send raw packets. - * FIXME: Source route IP option packets --RR */ - if (hooknum == NF_IP_PRE_ROUTING -+ && skb->ip_summed != CHECKSUM_UNNECESSARY - && csum_tcpudp_magic(iph->saddr, iph->daddr, udplen, IPPROTO_UDP, - skb->ip_summed == CHECKSUM_HW ? skb->csum - : skb_checksum(skb, iph->ihl*4, udplen, 0))) { diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/rcu-nohz.patch --- a/patches/linux-2.6.11/rcu-nohz.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,16 +0,0 @@ -diff -ur linux-2.6.11/kernel/rcupdate.c linux-2.6.11-rcu/kernel/rcupdate.c ---- linux-2.6.11/kernel/rcupdate.c 2005-05-30 10:51:41 +01:00 -+++ linux-2.6.11-rcu/kernel/rcupdate.c 2005-05-30 10:53:53 +01:00 -@@ -202,8 +202,11 @@ - */ - static void cpu_quiet(int cpu, struct rcu_ctrlblk *rcp, struct rcu_state *rsp) - { -+ cpumask_t mask; -+ - cpu_clear(cpu, rsp->cpumask); -- if (cpus_empty(rsp->cpumask)) { -+ cpus_andnot(mask, rsp->cpumask, nohz_cpu_mask); -+ if (cpus_empty(mask)) { - /* batch completed ! */ - rcp->completed = rcp->cur; - rcu_start_batch(rcp, rsp, 0); diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/smp-alts.patch --- a/patches/linux-2.6.11/smp-alts.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,563 +0,0 @@ -diff -Naur linux-2.6.11/arch/i386/Kconfig linux-2.6.11.post/arch/i386/Kconfig ---- linux-2.6.11/arch/i386/Kconfig 2005-03-02 07:37:49.000000000 +0000 -+++ linux-2.6.11.post/arch/i386/Kconfig 2005-06-10 13:42:35.000000000 +0100 -@@ -481,6 +481,19 @@ - - If you don't know what to do here, say N. - -+config SMP_ALTERNATIVES -+ bool "SMP alternatives support (EXPERIMENTAL)" -+ depends on SMP && EXPERIMENTAL -+ help -+ Try to reduce the overhead of running an SMP kernel on a uniprocessor -+ host slightly by replacing certain key instruction sequences -+ according to whether we currently have more than one CPU available. -+ This should provide a noticeable boost to performance when -+ running SMP kernels on UP machines, and have negligible impact -+ when running on an true SMP host. -+ -+ If unsure, say N. -+ - config NR_CPUS - int "Maximum number of CPUs (2-255)" - range 2 255 -diff -Naur linux-2.6.11/arch/i386/kernel/Makefile linux-2.6.11.post/arch/i386/kernel/Makefile ---- linux-2.6.11/arch/i386/kernel/Makefile 2005-03-02 07:37:49.000000000 +0000 -+++ linux-2.6.11.post/arch/i386/kernel/Makefile 2005-06-16 11:16:18.555332435 +0100 -@@ -32,6 +32,7 @@ - obj-$(CONFIG_HPET_TIMER) += time_hpet.o - obj-$(CONFIG_EFI) += efi.o efi_stub.o - obj-$(CONFIG_EARLY_PRINTK) += early_printk.o -+obj-$(CONFIG_SMP_ALTERNATIVES) += smpalts.o - - EXTRA_AFLAGS := -traditional - -diff -Naur linux-2.6.11/arch/i386/kernel/smpalts.c linux-2.6.11.post/arch/i386/kernel/smpalts.c ---- linux-2.6.11/arch/i386/kernel/smpalts.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.11.post/arch/i386/kernel/smpalts.c 2005-06-16 11:23:39.300902424 +0100 -@@ -0,0 +1,85 @@ -+#include <linux/kernel.h> -+#include <asm/system.h> -+#include <asm/smp_alt.h> -+#include <asm/processor.h> -+#include <asm/string.h> -+ -+struct smp_replacement_record { -+ unsigned char targ_size; -+ unsigned char smp1_size; -+ unsigned char smp2_size; -+ unsigned char up_size; -+ unsigned char feature; -+ unsigned char data[0]; -+}; -+ -+struct smp_alternative_record { -+ void *targ_start; -+ struct smp_replacement_record *repl; -+}; -+ -+extern struct smp_alternative_record __start_smp_alternatives_table, -+ __stop_smp_alternatives_table; -+extern unsigned long __init_begin, __init_end; -+ -+void prepare_for_smp(void) -+{ -+ struct smp_alternative_record *r; -+ printk(KERN_INFO "Enabling SMP...\n"); -+ for (r = &__start_smp_alternatives_table; -+ r != &__stop_smp_alternatives_table; -+ r++) { -+ BUG_ON(r->repl->targ_size < r->repl->smp1_size); -+ BUG_ON(r->repl->targ_size < r->repl->smp2_size); -+ BUG_ON(r->repl->targ_size < r->repl->up_size); -+ if (system_state == SYSTEM_RUNNING && -+ r->targ_start >= (void *)&__init_begin && -+ r->targ_start < (void *)&__init_end) -+ continue; -+ if (r->repl->feature != (unsigned char)-1 && -+ boot_cpu_has(r->repl->feature)) { -+ memcpy(r->targ_start, -+ r->repl->data + r->repl->smp1_size, -+ r->repl->smp2_size); -+ memset(r->targ_start + r->repl->smp2_size, -+ 0x90, -+ r->repl->targ_size - r->repl->smp2_size); -+ } else { -+ memcpy(r->targ_start, -+ r->repl->data, -+ r->repl->smp1_size); -+ memset(r->targ_start + r->repl->smp1_size, -+ 0x90, -+ r->repl->targ_size - r->repl->smp1_size); -+ } -+ } -+ /* Paranoia */ -+ asm volatile ("jmp 1f\n1:"); -+ mb(); -+} -+ -+void unprepare_for_smp(void) -+{ -+ struct smp_alternative_record *r; -+ printk(KERN_INFO "Disabling SMP...\n"); -+ for (r = &__start_smp_alternatives_table; -+ r != &__stop_smp_alternatives_table; -+ r++) { -+ BUG_ON(r->repl->targ_size < r->repl->smp1_size); -+ BUG_ON(r->repl->targ_size < r->repl->smp2_size); -+ BUG_ON(r->repl->targ_size < r->repl->up_size); -+ if (system_state == SYSTEM_RUNNING && -+ r->targ_start >= (void *)&__init_begin && -+ r->targ_start < (void *)&__init_end) -+ continue; -+ memcpy(r->targ_start, -+ r->repl->data + r->repl->smp1_size + r->repl->smp2_size, -+ r->repl->up_size); -+ memset(r->targ_start + r->repl->up_size, -+ 0x90, -+ r->repl->targ_size - r->repl->up_size); -+ } -+ /* Paranoia */ -+ asm volatile ("jmp 1f\n1:"); -+ mb(); -+} -diff -Naur linux-2.6.11/arch/i386/kernel/smpboot.c linux-2.6.11.post/arch/i386/kernel/smpboot.c ---- linux-2.6.11/arch/i386/kernel/smpboot.c 2005-03-02 07:38:09.000000000 +0000 -+++ linux-2.6.11.post/arch/i386/kernel/smpboot.c 2005-06-16 11:17:09.287064617 +0100 -@@ -1003,6 +1003,11 @@ - if (max_cpus <= cpucount+1) - continue; - -+#ifdef CONFIG_SMP_ALTERNATIVES -+ if (kicked == 1) -+ prepare_for_smp(); -+#endif -+ - if (do_boot_cpu(apicid)) - printk("CPU #%d not responding - cannot use it.\n", - apicid); -@@ -1118,6 +1123,11 @@ - return -EIO; - } - -+#ifdef CONFIG_SMP_ALTERNATIVES -+ if (num_online_cpus() == 1) -+ prepare_for_smp(); -+#endif -+ - local_irq_enable(); - /* Unleash the CPU! */ - cpu_set(cpu, smp_commenced_mask); -diff -Naur linux-2.6.11/arch/i386/kernel/vmlinux.lds.S linux-2.6.11.post/arch/i386/kernel/vmlinux.lds.S ---- linux-2.6.11/arch/i386/kernel/vmlinux.lds.S 2005-03-02 07:38:37.000000000 +0000 -+++ linux-2.6.11.post/arch/i386/kernel/vmlinux.lds.S 2005-06-10 11:14:14.000000000 +0100 -@@ -30,6 +30,13 @@ - __ex_table : { *(__ex_table) } - __stop___ex_table = .; - -+ . = ALIGN(16); -+ __start_smp_alternatives_table = .; -+ __smp_alternatives : { *(__smp_alternatives) } -+ __stop_smp_alternatives_table = .; -+ -+ __smp_replacements : { *(__smp_replacements) } -+ - RODATA - - /* writeable */ -diff -Naur linux-2.6.11/include/asm-i386/atomic.h linux-2.6.11.post/include/asm-i386/atomic.h ---- linux-2.6.11/include/asm-i386/atomic.h 2005-03-02 07:37:51.000000000 +0000 -+++ linux-2.6.11.post/include/asm-i386/atomic.h 2005-06-13 10:10:39.000000000 +0100 -@@ -4,18 +4,13 @@ - #include <linux/config.h> - #include <linux/compiler.h> - #include <asm/processor.h> -+#include <asm/smp_alt.h> - - /* - * Atomic operations that C can't guarantee us. Useful for - * resource counting etc.. - */ - --#ifdef CONFIG_SMP --#define LOCK "lock ; " --#else --#define LOCK "" --#endif -- - /* - * Make sure gcc doesn't try to be clever and move things around - * on us. We need to use _exactly_ the address the user gave us, -diff -Naur linux-2.6.11/include/asm-i386/bitops.h linux-2.6.11.post/include/asm-i386/bitops.h ---- linux-2.6.11/include/asm-i386/bitops.h 2005-03-02 07:38:12.000000000 +0000 -+++ linux-2.6.11.post/include/asm-i386/bitops.h 2005-06-13 10:11:54.000000000 +0100 -@@ -7,6 +7,7 @@ - - #include <linux/config.h> - #include <linux/compiler.h> -+#include <asm/smp_alt.h> - - /* - * These have to be done with inline assembly: that way the bit-setting -@@ -16,12 +17,6 @@ - * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). - */ - --#ifdef CONFIG_SMP --#define LOCK_PREFIX "lock ; " --#else --#define LOCK_PREFIX "" --#endif -- - #define ADDR (*(volatile long *) addr) - - /** -@@ -41,7 +36,7 @@ - */ - static inline void set_bit(int nr, volatile unsigned long * addr) - { -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btsl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -@@ -76,7 +71,7 @@ - */ - static inline void clear_bit(int nr, volatile unsigned long * addr) - { -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btrl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -@@ -121,7 +116,7 @@ - */ - static inline void change_bit(int nr, volatile unsigned long * addr) - { -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btcl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -@@ -140,7 +135,7 @@ - { - int oldbit; - -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btsl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); -@@ -180,7 +175,7 @@ - { - int oldbit; - -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btrl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); -@@ -231,7 +226,7 @@ - { - int oldbit; - -- __asm__ __volatile__( LOCK_PREFIX -+ __asm__ __volatile__( LOCK - "btcl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); -diff -Naur linux-2.6.11/include/asm-i386/rwsem.h linux-2.6.11.post/include/asm-i386/rwsem.h ---- linux-2.6.11/include/asm-i386/rwsem.h 2005-03-02 07:38:08.000000000 +0000 -+++ linux-2.6.11.post/include/asm-i386/rwsem.h 2005-06-13 10:13:06.000000000 +0100 -@@ -40,6 +40,7 @@ - - #include <linux/list.h> - #include <linux/spinlock.h> -+#include <asm/smp_alt.h> - - struct rwsem_waiter; - -@@ -99,7 +100,7 @@ - { - __asm__ __volatile__( - "# beginning down_read\n\t" --LOCK_PREFIX " incl (%%eax)\n\t" /* adds 0x00000001, returns the old value */ -+LOCK " incl (%%eax)\n\t" /* adds 0x00000001, returns the old value */ - " js 2f\n\t" /* jump if we weren't granted the lock */ - "1:\n\t" - LOCK_SECTION_START("") -@@ -130,7 +131,7 @@ - " movl %1,%2\n\t" - " addl %3,%2\n\t" - " jle 2f\n\t" --LOCK_PREFIX " cmpxchgl %2,%0\n\t" -+LOCK " cmpxchgl %2,%0\n\t" - " jnz 1b\n\t" - "2:\n\t" - "# ending __down_read_trylock\n\t" -@@ -150,7 +151,7 @@ - tmp = RWSEM_ACTIVE_WRITE_BIAS; - __asm__ __volatile__( - "# beginning down_write\n\t" --LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old value */ -+LOCK " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns the old value */ - " testl %%edx,%%edx\n\t" /* was the count 0 before? */ - " jnz 2f\n\t" /* jump if we weren't granted the lock */ - "1:\n\t" -@@ -188,7 +189,7 @@ - __s32 tmp = -RWSEM_ACTIVE_READ_BIAS; - __asm__ __volatile__( - "# beginning __up_read\n\t" --LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old value */ -+LOCK " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old value */ - " js 2f\n\t" /* jump if the lock is being waited upon */ - "1:\n\t" - LOCK_SECTION_START("") -@@ -214,7 +215,7 @@ - __asm__ __volatile__( - "# beginning __up_write\n\t" - " movl %2,%%edx\n\t" --LOCK_PREFIX " xaddl %%edx,(%%eax)\n\t" /* tries to transition 0xffff0001 -> 0x00000000 */ -+LOCK " xaddl %%edx,(%%eax)\n\t" /* tries to transition 0xffff0001 -> 0x00000000 */ - " jnz 2f\n\t" /* jump if the lock is being waited upon */ - "1:\n\t" - LOCK_SECTION_START("") -@@ -239,7 +240,7 @@ - { - __asm__ __volatile__( - "# beginning __downgrade_write\n\t" --LOCK_PREFIX " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 */ -+LOCK " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 */ - " js 2f\n\t" /* jump if the lock is being waited upon */ - "1:\n\t" - LOCK_SECTION_START("") -@@ -263,7 +264,7 @@ - static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem) - { - __asm__ __volatile__( --LOCK_PREFIX "addl %1,%0" -+LOCK "addl %1,%0" - : "=m"(sem->count) - : "ir"(delta), "m"(sem->count)); - } -@@ -276,7 +277,7 @@ - int tmp = delta; - - __asm__ __volatile__( --LOCK_PREFIX "xadd %0,(%2)" -+LOCK "xadd %0,(%2)" - : "+r"(tmp), "=m"(sem->count) - : "r"(sem), "m"(sem->count) - : "memory"); -diff -Naur linux-2.6.11/include/asm-i386/smp_alt.h linux-2.6.11.post/include/asm-i386/smp_alt.h ---- linux-2.6.11/include/asm-i386/smp_alt.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.11.post/include/asm-i386/smp_alt.h 2005-06-16 11:16:50.109433206 +0100 -@@ -0,0 +1,32 @@ -+#ifndef __ASM_SMP_ALT_H__ -+#define __ASM_SMP_ALT_H__ -+ -+#include <linux/config.h> -+ -+#ifdef CONFIG_SMP -+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE) -+#define LOCK \ -+ "6677: nop\n" \ -+ ".section __smp_alternatives,\"a\"\n" \ -+ ".long 6677b\n" \ -+ ".long 6678f\n" \ -+ ".previous\n" \ -+ ".section __smp_replacements,\"a\"\n" \ -+ "6678: .byte 1\n" \ -+ ".byte 1\n" \ -+ ".byte 0\n" \ -+ ".byte 1\n" \ -+ ".byte -1\n" \ -+ "lock\n" \ -+ "nop\n" \ -+ ".previous\n" -+void prepare_for_smp(void); -+void unprepare_for_smp(void); -+#else -+#define LOCK "lock ; " -+#endif -+#else -+#define LOCK "" -+#endif -+ -+#endif /* __ASM_SMP_ALT_H__ */ -diff -Naur linux-2.6.11/include/asm-i386/spinlock.h linux-2.6.11.post/include/asm-i386/spinlock.h ---- linux-2.6.11/include/asm-i386/spinlock.h 2005-03-02 07:37:50.000000000 +0000 -+++ linux-2.6.11.post/include/asm-i386/spinlock.h 2005-06-13 14:13:52.000000000 +0100 -@@ -6,6 +6,7 @@ - #include <asm/page.h> - #include <linux/config.h> - #include <linux/compiler.h> -+#include <asm/smp_alt.h> - - asmlinkage int printk(const char * fmt, ...) - __attribute__ ((format (printf, 1, 2))); -@@ -47,8 +48,9 @@ - #define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x)) - - #define spin_lock_string \ -- "\n1:\t" \ -- "lock ; decb %0\n\t" \ -+ "1:\n" \ -+ LOCK \ -+ "decb %0\n\t" \ - "jns 3f\n" \ - "2:\t" \ - "rep;nop\n\t" \ -@@ -58,8 +60,9 @@ - "3:\n\t" - - #define spin_lock_string_flags \ -- "\n1:\t" \ -- "lock ; decb %0\n\t" \ -+ "1:\n" \ -+ LOCK \ -+ "decb %0\n\t" \ - "jns 4f\n\t" \ - "2:\t" \ - "testl $0x200, %1\n\t" \ -@@ -121,10 +124,34 @@ - static inline int _raw_spin_trylock(spinlock_t *lock) - { - char oldval; -+#ifdef CONFIG_SMP_ALTERNATIVES - __asm__ __volatile__( -- "xchgb %b0,%1" -+ "1:movb %1,%b0\n" -+ "movb $0,%1\n" -+ "2:" -+ ".section __smp_alternatives,\"a\"\n" -+ ".long 1b\n" -+ ".long 3f\n" -+ ".previous\n" -+ ".section __smp_replacements,\"a\"\n" -+ "3: .byte 2b - 1b\n" -+ ".byte 5f-4f\n" -+ ".byte 0\n" -+ ".byte 6f-5f\n" -+ ".byte -1\n" -+ "4: xchgb %b0,%1\n" -+ "5: movb %1,%b0\n" -+ "movb $0,%1\n" -+ "6:\n" -+ ".previous\n" - :"=q" (oldval), "=m" (lock->slock) - :"0" (0) : "memory"); -+#else -+ __asm__ __volatile__( -+ "xchgb %b0,%1\n" -+ :"=q" (oldval), "=m" (lock->slock) -+ :"0" (0) : "memory"); -+#endif - return oldval > 0; - } - -@@ -225,8 +252,8 @@ - __build_write_lock(rw, "__write_lock_failed"); - } - --#define _raw_read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") --#define _raw_write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory") -+#define _raw_read_unlock(rw) asm volatile(LOCK "incl %0" :"=m" ((rw)->lock) : : "memory") -+#define _raw_write_unlock(rw) asm volatile(LOCK "addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory") - - static inline int _raw_read_trylock(rwlock_t *lock) - { -diff -Naur linux-2.6.11/include/asm-i386/system.h linux-2.6.11.post/include/asm-i386/system.h ---- linux-2.6.11/include/asm-i386/system.h 2005-03-02 07:37:30.000000000 +0000 -+++ linux-2.6.11.post/include/asm-i386/system.h 2005-06-15 13:21:40.000000000 +0100 -@@ -5,7 +5,7 @@ - #include <linux/kernel.h> - #include <asm/segment.h> - #include <asm/cpufeature.h> --#include <linux/bitops.h> /* for LOCK_PREFIX */ -+#include <asm/smp_alt.h> - - #ifdef __KERNEL__ - -@@ -249,19 +249,19 @@ - unsigned long prev; - switch (size) { - case 1: -- __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" -+ __asm__ __volatile__(LOCK "cmpxchgb %b1,%2" - : "=a"(prev) - : "q"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - case 2: -- __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" -+ __asm__ __volatile__(LOCK "cmpxchgw %w1,%2" - : "=a"(prev) - : "q"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); - return prev; - case 4: -- __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" -+ __asm__ __volatile__(LOCK "cmpxchgl %1,%2" - : "=a"(prev) - : "q"(new), "m"(*__xg(ptr)), "0"(old) - : "memory"); -@@ -425,11 +425,55 @@ - #endif - - #ifdef CONFIG_SMP --#define smp_mb() mb() --#define smp_rmb() rmb() - #define smp_wmb() wmb() --#define smp_read_barrier_depends() read_barrier_depends() -+#if defined(CONFIG_SMP_ALTERNATIVES) && !defined(MODULE) -+#define smp_alt_mb(instr) \ -+__asm__ __volatile__("6667:\nnop\nnop\nnop\nnop\nnop\nnop\n6668:\n" \ -+ ".section __smp_alternatives,\"a\"\n" \ -+ ".long 6667b\n" \ -+ ".long 6673f\n" \ -+ ".previous\n" \ -+ ".section __smp_replacements,\"a\"\n" \ -+ "6673:.byte 6668b-6667b\n" \ -+ ".byte 6670f-6669f\n" \ -+ ".byte 6671f-6670f\n" \ -+ ".byte 0\n" \ -+ ".byte %c0\n" \ -+ "6669:lock;addl $0,0(%%esp)\n" \ -+ "6670:" instr "\n" \ -+ "6671:\n" \ -+ ".previous\n" \ -+ : \ -+ : "i" (X86_FEATURE_XMM2) \ -+ : "memory") -+#define smp_rmb() smp_alt_mb("lfence") -+#define smp_mb() smp_alt_mb("mfence") -+#define set_mb(var, value) do { \ -+unsigned long __set_mb_temp; \ -+__asm__ __volatile__("6667:movl %1, %0\n6668:\n" \ -+ ".section __smp_alternatives,\"a\"\n" \ -+ ".long 6667b\n" \ -+ ".long 6673f\n" \ -+ ".previous\n" \ -+ ".section __smp_replacements,\"a\"\n" \ -+ "6673: .byte 6668b-6667b\n" \ -+ ".byte 6670f-6669f\n" \ -+ ".byte 0\n" \ -+ ".byte 6671f-6670f\n" \ -+ ".byte -1\n" \ -+ "6669: xchg %1, %0\n" \ -+ "6670:movl %1, %0\n" \ -+ "6671:\n" \ -+ ".previous\n" \ -+ : "=m" (var), "=r" (__set_mb_temp) \ -+ : "1" (value) \ -+ : "memory"); } while (0) -+#else -+#define smp_rmb() rmb() -+#define smp_mb() mb() - #define set_mb(var, value) do { xchg(&var, value); } while (0) -+#endif -+#define smp_read_barrier_depends() read_barrier_depends() - #else - #define smp_mb() barrier() - #define smp_rmb() barrier() diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/udp-frag.patch --- a/patches/linux-2.6.11/udp-frag.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,55 +0,0 @@ -diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c ---- a/net/ipv4/udp.c -+++ b/net/ipv4/udp.c -@@ -738,7 +738,7 @@ int udp_ioctl(struct sock *sk, int cmd, - unsigned long amount; - - amount = 0; -- spin_lock_irq(&sk->sk_receive_queue.lock); -+ spin_lock_bh(&sk->sk_receive_queue.lock); - skb = skb_peek(&sk->sk_receive_queue); - if (skb != NULL) { - /* -@@ -748,7 +748,7 @@ int udp_ioctl(struct sock *sk, int cmd, - */ - amount = skb->len - sizeof(struct udphdr); - } -- spin_unlock_irq(&sk->sk_receive_queue.lock); -+ spin_unlock_bh(&sk->sk_receive_queue.lock); - return put_user(amount, (int __user *)arg); - } - -@@ -848,12 +848,12 @@ csum_copy_err: - /* Clear queue. */ - if (flags&MSG_PEEK) { - int clear = 0; -- spin_lock_irq(&sk->sk_receive_queue.lock); -+ spin_lock_bh(&sk->sk_receive_queue.lock); - if (skb == skb_peek(&sk->sk_receive_queue)) { - __skb_unlink(skb, &sk->sk_receive_queue); - clear = 1; - } -- spin_unlock_irq(&sk->sk_receive_queue.lock); -+ spin_unlock_bh(&sk->sk_receive_queue.lock); - if (clear) - kfree_skb(skb); - } -@@ -1334,7 +1334,7 @@ unsigned int udp_poll(struct file *file, - struct sk_buff_head *rcvq = &sk->sk_receive_queue; - struct sk_buff *skb; - -- spin_lock_irq(&rcvq->lock); -+ spin_lock_bh(&rcvq->lock); - while ((skb = skb_peek(rcvq)) != NULL) { - if (udp_checksum_complete(skb)) { - UDP_INC_STATS_BH(UDP_MIB_INERRORS); -@@ -1345,7 +1345,7 @@ unsigned int udp_poll(struct file *file, - break; - } - } -- spin_unlock_irq(&rcvq->lock); -+ spin_unlock_bh(&rcvq->lock); - - /* nothing to see, move along */ - if (skb == NULL) - diff -r ece694762d7a -r 60fc40a82fa9 patches/linux-2.6.11/x86_64-linux.patch --- a/patches/linux-2.6.11/x86_64-linux.patch Mon Jul 11 15:12:37 2005 +++ /dev/null Mon Jul 11 15:35:33 2005 @@ -1,68 +0,0 @@ -diff -urN linux-2.6.10-orig/include/asm-x86_64/hw_irq.h linux-2.6.10/include/asm-x86_64/hw_irq.h ---- linux-2.6.10-orig/include/asm-x86_64/hw_irq.h 2005-01-06 00:34:38.000000000 -0500 -+++ linux-2.6.10/include/asm-x86_64/hw_irq.h 2005-02-25 17:45:37.181518088 -0500 -@@ -48,6 +48,7 @@ - * - * Vectors 0xf0-0xf9 are free (reserved for future Linux use). - */ -+#ifndef CONFIG_XEN - #define SPURIOUS_APIC_VECTOR 0xff - #define ERROR_APIC_VECTOR 0xfe - #define INVALIDATE_TLB_VECTOR 0xfd -@@ -57,7 +58,7 @@ - #define KDB_VECTOR 0xf9 - - #define THERMAL_APIC_VECTOR 0xf0 -- -+#endif - - /* - * Local APIC timer IRQ vector is on a different priority level, -diff -urN linux-2.6.10-orig/include/asm-x86_64/irq.h linux-2.6.10/include/asm-x86_64/irq.h ---- linux-2.6.10-orig/include/asm-x86_64/irq.h 2005-01-06 00:34:38.000000000 -0500 -+++ linux-2.6.10/include/asm-x86_64/irq.h 2005-02-25 17:45:37.181518088 -0500 -@@ -10,6 +10,9 @@ - * <tomsoft@xxxxxxxxxxxxxxxxxxxxxxxxx> - */ - -+#ifdef CONFIG_XEN -+#include "irq_vectors.h" -+#endif - #define TIMER_IRQ 0 - - /* -@@ -22,6 +25,7 @@ - * the usable vector space is 0x20-0xff (224 vectors) - */ - -+#ifndef CONFIG_XEN - /* - * The maximum number of vectors supported by x86_64 processors - * is limited to 256. For processors other than x86_64, NR_VECTORS -@@ -38,6 +42,7 @@ - #define NR_IRQS 224 - #define NR_IRQ_VECTORS 1024 - #endif -+#endif - - static __inline__ int irq_canonicalize(int irq) - { -diff -urN linux-2.6.10-orig/include/asm-x86_64/posix_types.h linux-2.6.10/include/asm-x86_64/posix_types.h ---- linux-2.6.10-orig/include/asm-x86_64/posix_types.h 2004-10-18 17:55:29.000000000 -0400 -+++ linux-2.6.10/include/asm-x86_64/posix_types.h 2005-02-25 17:45:37.183517784 -0500 -@@ -6,7 +6,7 @@ - * be a little careful about namespace pollution etc. Also, we cannot - * assume GCC is being used. - */ -- -+#ifndef __ASSEMBLY__ - typedef unsigned long __kernel_ino_t; - typedef unsigned int __kernel_mode_t; - typedef unsigned long __kernel_nlink_t; -@@ -115,5 +115,5 @@ - } - - #endif /* defined(__KERNEL__) */ -- -+#endif - #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |