aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/xen/enlighten.c
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-06-16 07:30:02 -0400
committerIngo Molnar <mingo@elte.hu>2008-06-25 09:17:23 -0400
commite57778a1e30470c9f5b79e370511b9af29b59c48 (patch)
tree01239f16b016d57206ba8bdfcbd443d8a26cd5e4 /arch/x86/xen/enlighten.c
parent08b882c627aeeeb3cfd3c4354f0d360d7949549d (diff)
xen: implement ptep_modify_prot_start/commit
Xen has a pte update function which will update a pte while preserving its accessed and dirty bits. This means that ptep_modify_prot_start() can be implemented as a simple read of the pte value. The hardware may update the pte in the meantime, but ptep_modify_prot_commit() updates it while preserving any changes that may have happened in the meantime. The updates in ptep_modify_prot_commit() are batched if we're currently in lazy mmu mode. The mmu_update hypercall can take a batch of updates to perform, but this code doesn't make particular use of that feature, in favour of using generic multicall batching to get them all into the hypervisor. The net effect of this is that each mprotect pte update turns from two expensive trap-and-emulate faults into they hypervisor into a single hypercall whose cost is amortized in a batched multicall. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Acked-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/xen/enlighten.c')
-rw-r--r--arch/x86/xen/enlighten.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 0b7553cbc529..bd74229081c3 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -168,7 +168,9 @@ static void __init xen_banner(void)
168{ 168{
169 printk(KERN_INFO "Booting paravirtualized kernel on %s\n", 169 printk(KERN_INFO "Booting paravirtualized kernel on %s\n",
170 pv_info.name); 170 pv_info.name);
171 printk(KERN_INFO "Hypervisor signature: %s\n", xen_start_info->magic); 171 printk(KERN_INFO "Hypervisor signature: %s%s\n",
172 xen_start_info->magic,
173 xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : "");
172} 174}
173 175
174static void xen_cpuid(unsigned int *ax, unsigned int *bx, 176static void xen_cpuid(unsigned int *ax, unsigned int *bx,
@@ -1243,6 +1245,8 @@ asmlinkage void __init xen_start_kernel(void)
1243 1245
1244 BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0); 1246 BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0);
1245 1247
1248 xen_setup_features();
1249
1246 /* Install Xen paravirt ops */ 1250 /* Install Xen paravirt ops */
1247 pv_info = xen_info; 1251 pv_info = xen_info;
1248 pv_init_ops = xen_init_ops; 1252 pv_init_ops = xen_init_ops;
@@ -1252,14 +1256,17 @@ asmlinkage void __init xen_start_kernel(void)
1252 pv_apic_ops = xen_apic_ops; 1256 pv_apic_ops = xen_apic_ops;
1253 pv_mmu_ops = xen_mmu_ops; 1257 pv_mmu_ops = xen_mmu_ops;
1254 1258
1259 if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
1260 pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
1261 pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
1262 }
1263
1255 machine_ops = xen_machine_ops; 1264 machine_ops = xen_machine_ops;
1256 1265
1257#ifdef CONFIG_SMP 1266#ifdef CONFIG_SMP
1258 smp_ops = xen_smp_ops; 1267 smp_ops = xen_smp_ops;
1259#endif 1268#endif
1260 1269
1261 xen_setup_features();
1262
1263 /* Get mfn list */ 1270 /* Get mfn list */
1264 if (!xen_feature(XENFEAT_auto_translated_physmap)) 1271 if (!xen_feature(XENFEAT_auto_translated_physmap))
1265 xen_build_dynamic_phys_to_machine(); 1272 xen_build_dynamic_phys_to_machine();