# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 78b5e590be34ee3454d970321d7c2f3199a0de41
# Parent d1e1d6493d1d30711338201065f88c1674357da7
# Parent f887ddae2b03ab363278afc92225aa3bc320de5f
Merged.
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Thu Nov
24 19:57:01 2005
@@ -35,7 +35,6 @@
# CONFIG_CLEAN_COMPILE is not set
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y
-CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
#
@@ -125,8 +124,6 @@
# CONFIG_HPET_TIMER is not set
# CONFIG_HPET_EMULATE_RTC is not set
# CONFIG_SMP is not set
-CONFIG_PREEMPT=y
-CONFIG_PREEMPT_BKL=y
# CONFIG_X86_REBOOTFIXUPS is not set
CONFIG_MICROCODE=y
CONFIG_X86_CPUID=y
@@ -141,7 +138,6 @@
# CONFIG_HIGHMEM64G is not set
CONFIG_HIGHMEM=y
CONFIG_MTRR=y
-CONFIG_HAVE_DEC_LOCK=y
# CONFIG_REGPARM is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
@@ -1259,7 +1255,6 @@
CONFIG_LOG_BUF_SHIFT=14
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 Thu Nov
24 19:57:01 2005
@@ -90,7 +90,6 @@
CONFIG_X86_GOOD_APIC=y
# CONFIG_HPET_TIMER is not set
# CONFIG_SMP is not set
-# CONFIG_PREEMPT is not set
CONFIG_MICROCODE=y
# CONFIG_X86_CPUID is not set
CONFIG_SWIOTLB=y
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Thu Nov
24 19:57:01 2005
@@ -125,8 +125,6 @@
CONFIG_SMP_ALTERNATIVES=y
CONFIG_NR_CPUS=8
# CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT=y
-CONFIG_PREEMPT_BKL=y
# CONFIG_X86_REBOOTFIXUPS is not set
CONFIG_X86_CPUID=y
@@ -550,7 +548,6 @@
CONFIG_LOG_BUF_SHIFT=14
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Thu Nov
24 19:57:01 2005
@@ -92,7 +92,6 @@
CONFIG_SMP=y
CONFIG_NR_CPUS=8
# CONFIG_SCHED_SMT is not set
-# CONFIG_PREEMPT is not set
# CONFIG_MICROCODE is not set
CONFIG_X86_CPUID=y
# CONFIG_NUMA is not set
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32 Thu Nov
24 19:57:01 2005
@@ -132,8 +132,6 @@
CONFIG_SMP_ALTERNATIVES=y
CONFIG_NR_CPUS=8
# CONFIG_SCHED_SMT is not set
-CONFIG_PREEMPT=y
-CONFIG_PREEMPT_BKL=y
# CONFIG_X86_REBOOTFIXUPS is not set
CONFIG_MICROCODE=y
CONFIG_X86_CPUID=m
@@ -2951,7 +2949,6 @@
CONFIG_LOG_BUF_SHIFT=14
# CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set
-CONFIG_DEBUG_PREEMPT=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Thu Nov
24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Thu Nov
24 19:57:01 2005
@@ -95,7 +95,6 @@
CONFIG_SMP=y
CONFIG_NR_CPUS=8
# CONFIG_SCHED_SMT is not set
-# CONFIG_PREEMPT is not set
CONFIG_MICROCODE=y
# CONFIG_X86_CPUID is not set
# CONFIG_NUMA is not set
diff -r d1e1d6493d1d -r 78b5e590be34 linux-2.6-xen-sparse/arch/xen/i386/Kconfig
--- a/linux-2.6-xen-sparse/arch/xen/i386/Kconfig Thu Nov 24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/Kconfig Thu Nov 24 19:57:01 2005
@@ -415,17 +415,17 @@
cost of slightly increased overhead in some places. If unsure say
N here.
-config PREEMPT
- bool "Preemptible Kernel"
- help
- This option reduces the latency of the kernel when reacting to
- real-time or interactive events by allowing a low priority process to
- be preempted even if it is in kernel mode executing a system call.
- This allows applications to run more reliably even when the system is
- under load.
-
- Say Y here if you are building a kernel for a desktop, embedded
- or real-time system. Say N if you are unsure.
+#config PREEMPT
+# bool "Preemptible Kernel"
+# help
+# This option reduces the latency of the kernel when reacting to
+# real-time or interactive events by allowing a low priority process to
+# be preempted even if it is in kernel mode executing a system call.
+# This allows applications to run more reliably even when the system is
+# under load.
+#
+# Say Y here if you are building a kernel for a desktop, embedded
+# or real-time system. Say N if you are unsure.
config PREEMPT_BKL
bool "Preempt The Big Kernel Lock"
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Thu Nov 24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Thu Nov 24 19:57:01 2005
@@ -27,8 +27,9 @@
#include <asm-xen/foreign_page.h>
#include <asm/hypervisor.h>
-static void __pgd_pin(pgd_t *pgd);
-static void __pgd_unpin(pgd_t *pgd);
+static void pgd_test_and_unpin(pgd_t *pgd);
+#define suspend_disable preempt_disable
+#define suspend_enable preempt_enable
void show_mem(void)
{
@@ -284,26 +285,23 @@
BUG_ON(rc);
#endif
- if (!HAVE_SHARED_KERNEL_PMD)
- spin_lock_irqsave(&pgd_lock, flags);
-
- memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
- swapper_pg_dir + USER_PTRS_PER_PGD,
- (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-
- if (HAVE_SHARED_KERNEL_PMD)
- return;
-
+ if (HAVE_SHARED_KERNEL_PMD) {
+ memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
+ swapper_pg_dir + USER_PTRS_PER_PGD,
+ (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+ return;
+ }
+
+ memset(pgd, 0, PTRS_PER_PGD*sizeof(pgd_t));
+
+ spin_lock_irqsave(&pgd_lock, flags);
pgd_list_add(pgd);
spin_unlock_irqrestore(&pgd_lock, flags);
- memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
}
void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
{
unsigned long flags; /* can be called from interrupt context */
-
- BUG_ON(test_bit(PG_pinned, &virt_to_page(pgd)->flags));
if (HAVE_SHARED_KERNEL_PMD)
return;
@@ -311,6 +309,8 @@
spin_lock_irqsave(&pgd_lock, flags);
pgd_list_del(pgd);
spin_unlock_irqrestore(&pgd_lock, flags);
+
+ pgd_test_and_unpin(pgd);
}
pgd_t *pgd_alloc(struct mm_struct *mm)
@@ -318,7 +318,7 @@
int i = 0;
pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
- BUG_ON(test_bit(PG_pinned, &virt_to_page(pgd)->flags));
+ pgd_test_and_unpin(pgd);
if (PTRS_PER_PMD == 1 || !pgd)
return pgd;
@@ -345,7 +345,11 @@
pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
if (!pmd)
goto out_oom;
+ suspend_disable();
+ if (test_bit(PG_pinned, &virt_to_page(pgd)->flags))
+ make_lowmem_page_readonly(pmd);
set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
+ suspend_enable();
}
return pgd;
@@ -360,23 +364,28 @@
{
int i;
- if (test_bit(PG_pinned, &virt_to_page(pgd)->flags))
- __pgd_unpin(pgd);
+ suspend_disable();
+ pgd_test_and_unpin(pgd);
/* in the PAE case user pgd entries are overwritten before usage */
if (PTRS_PER_PMD > 1) {
for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
+ set_pgd(&pgd[i], __pgd(0));
make_lowmem_page_writable(pmd);
kmem_cache_free(pmd_cache, pmd);
}
if (!HAVE_SHARED_KERNEL_PMD) {
pmd_t *pmd = (void
*)__va(pgd_val(pgd[USER_PTRS_PER_PGD])-1);
+ set_pgd(&pgd[USER_PTRS_PER_PGD], __pgd(0));
make_lowmem_page_writable(pmd);
memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
kmem_cache_free(pmd_cache, pmd);
}
}
+
+ suspend_enable();
+
/* in the non-PAE case, free_pgtables() clears user pgd entries */
kmem_cache_free(pgd_cache, pgd);
}
@@ -501,6 +510,9 @@
static void __pgd_pin(pgd_t *pgd)
{
+ /* PAE PGDs with no kernel PMD cannot be pinned. Bail right now. */
+ if ((PTRS_PER_PMD > 1) && pgd_none(pgd[USER_PTRS_PER_PGD]))
+ return;
pgd_walk(pgd, PAGE_KERNEL_RO);
xen_pgd_pin(__pa(pgd));
set_bit(PG_pinned, &virt_to_page(pgd)->flags);
@@ -511,6 +523,14 @@
xen_pgd_unpin(__pa(pgd));
pgd_walk(pgd, PAGE_KERNEL);
clear_bit(PG_pinned, &virt_to_page(pgd)->flags);
+}
+
+static void pgd_test_and_unpin(pgd_t *pgd)
+{
+ suspend_disable();
+ if (test_bit(PG_pinned, &virt_to_page(pgd)->flags))
+ __pgd_unpin(pgd);
+ suspend_enable();
}
void mm_pin(struct mm_struct *mm)
diff -r d1e1d6493d1d -r 78b5e590be34
linux-2.6-xen-sparse/arch/xen/x86_64/Kconfig
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/Kconfig Thu Nov 24 19:56:38 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/Kconfig Thu Nov 24 19:57:01 2005
@@ -224,21 +224,21 @@
If you don't know what to do here, say N.
-config PREEMPT
- bool "Preemptible Kernel"
- ---help---
- This option reduces the latency of the kernel when reacting to
- real-time or interactive events by allowing a low priority process to
- be preempted even if it is in kernel mode executing a system call.
- This allows applications to run more reliably even when the system is
- under load. On contrary it may also break your drivers and add
- priority inheritance problems to your system. Don't select it if
- you rely on a stable system or have slightly obscure hardware.
- It's also not very well tested on x86-64 currently.
- You have been warned.
-
- Say Y here if you are feeling brave and building a kernel for a
- desktop, embedded or real-time system. Say N if you are unsure.
+#config PREEMPT
+# bool "Preemptible Kernel"
+# ---help---
+# This option reduces the latency of the kernel when reacting to
+# real-time or interactive events by allowing a low priority process to
+# be preempted even if it is in kernel mode executing a system call.
+# This allows applications to run more reliably even when the system is
+# under load. On contrary it may also break your drivers and add
+# priority inheritance problems to your system. Don't select it if
+# you rely on a stable system or have slightly obscure hardware.
+# It's also not very well tested on x86-64 currently.
+# You have been warned.
+#
+# Say Y here if you are feeling brave and building a kernel for a
+# desktop, embedded or real-time system. Say N if you are unsure.
config SCHED_SMT
bool "SMT (Hyperthreading) scheduler support"
diff -r d1e1d6493d1d -r 78b5e590be34 xen/common/grant_table.c
--- a/xen/common/grant_table.c Thu Nov 24 19:56:38 2005
+++ b/xen/common/grant_table.c Thu Nov 24 19:57:01 2005
@@ -726,10 +726,11 @@
unlikely(e->tot_pages >= e->max_pages) ||
unlikely(!gnttab_prepare_for_transfer(e, d, gop.ref)) )
{
- DPRINTK("gnttab_transfer: Transferee has no reservation headroom "
- "(%d,%d) or provided a bad grant ref (%08x) or "
- "is dying (%lx)\n",
- e->tot_pages, e->max_pages, gop.ref, e->domain_flags);
+ if ( !test_bit(_DOMF_dying, &e->domain_flags) )
+ DPRINTK("gnttab_transfer: Transferee has no reservation "
+ "headroom (%d,%d) or provided a bad grant ref (%08x) "
+ "or is dying (%lx)\n",
+ e->tot_pages, e->max_pages, gop.ref, e->domain_flags);
spin_unlock(&e->page_alloc_lock);
put_domain(e);
(void)__put_user(GNTST_general_error, &uop[i].status);
diff -r d1e1d6493d1d -r 78b5e590be34 xen/include/asm-x86/flushtlb.h
--- a/xen/include/asm-x86/flushtlb.h Thu Nov 24 19:56:38 2005
+++ b/xen/include/asm-x86/flushtlb.h Thu Nov 24 19:57:01 2005
@@ -97,7 +97,7 @@
extern void flush_tlb_all_pge(void);
extern void __flush_tlb_mask(cpumask_t mask, unsigned long va);
#define flush_tlb_mask(mask) __flush_tlb_mask(mask,FLUSHVA_ALL)
-#define flush_tlb_one_mask(mask,v) __flush_tlb_mask(mask,v)
+#define flush_tlb_one_mask(mask,v) __flush_tlb_mask(mask,(unsigned long)(v))
#endif
#endif /* __FLUSHTLB_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|