mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Remove 2.6.11 patches directory.
This commit is contained in:
1 parent
874c73ec71
commit
99fefb7b97
9 files changed
-4516
No files matched your search
@@ -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
|
||||
@@ -1,656 +0,0 @@
|
||||
|
||||
From: Zwane Mwaikambo <zwane@linuxpower.ca>
|
||||
|
||||
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@linuxpower.ca>
|
||||
DESC
|
||||
ppc64: fix hotplug cpu
|
||||
EDESC
|
||||
From: Zwane Mwaikambo <zwane@fsmlabs.com>
|
||||
|
||||
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@fsmlabs.com>
|
||||
Signed-off-by: Andrew Morton <akpm@osdl.org>
|
||||
---
|
||||
|
||||
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 */
|
||||
_
|
||||
@@ -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);
|
||||
File diff suppressed because it is too large.
Load diff
@@ -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))) {
|
||||
@@ -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);
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
@@ -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@informatik.tu-chemnitz.de>
|
||||
*/
|
||||
|
||||
+#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
|
||||