[RFC, PATCH 3/5] Paravirt_ops pure functions.patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Make paravirt-ops be a pure function pointer struct; we already have
assembly code which uses arithmetic by 4 bytes, which means arbitrary
structures are not possible here, and they are not needed.

Signed-off-by: Zachary Amsden <zach@xxxxxxxxxx>

diff -r a6889086a657 arch/i386/kernel/paravirt.c
--- a/arch/i386/kernel/paravirt.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/paravirt.c	Thu Apr 19 15:53:44 2007 -0700
@@ -35,6 +35,19 @@
 #include <asm/tlbflush.h>
 #include <asm/timer.h>
 
+/* Modules may need to know if paravirt is active */
+int paravirt_enabled;
+EXPORT_SYMBOL(paravirt_enabled);
+
+/* GPLd modules might want to determine and call into backend functions */
+char *paravirt_backend = "bare hardware";
+EXPORT_SYMBOL_GPL(paravirt_backend);
+
+/* Disable PMD sharing; externally set */
+#ifdef CONFIG_X86_PAE
+int use_shared_kernel_pmd = 1;
+#endif
+
 /* nop stub */
 void _paravirt_nop(void)
 {
@@ -43,7 +56,7 @@ static void __init default_banner(void)
 static void __init default_banner(void)
 {
 	printk(KERN_INFO "Booting paravirtualized kernel on %s\n",
-	       paravirt_ops.name);
+	       paravirt_backend);
 }
 
 char *memory_setup(void)
@@ -230,11 +243,6 @@ core_initcall(print_banner);
 core_initcall(print_banner);
 
 struct paravirt_ops paravirt_ops = {
-	.name = "bare hardware",
-	.paravirt_enabled = 0,
-	.kernel_rpl = 0,
-	.shared_kernel_pmd = 1,	/* Only used when CONFIG_X86_PAE is set */
-
  	.patch = native_patch,
 	.banner = default_banner,
 	.arch_setup = paravirt_nop,
diff -r a6889086a657 arch/i386/kernel/apm.c
--- a/arch/i386/kernel/apm.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/apm.c	Thu Apr 19 15:59:56 2007 -0700
@@ -2198,7 +2198,7 @@ static int __init apm_init(void)
 
 	dmi_check_system(apm_dmi_table);
 
-	if (apm_info.bios.version == 0 || paravirt_enabled()) {
+	if (apm_info.bios.version == 0 || paravirt_enabled) {
 		printk(KERN_INFO "apm: BIOS not found.\n");
 		return -ENODEV;
 	}
diff -r a6889086a657 arch/i386/kernel/asm-offsets.c
--- a/arch/i386/kernel/asm-offsets.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/asm-offsets.c	Thu Apr 19 15:58:06 2007 -0700
@@ -108,7 +108,6 @@ void foo(void)
 
 #ifdef CONFIG_PARAVIRT
 	BLANK();
-	OFFSET(PARAVIRT_enabled, paravirt_ops, paravirt_enabled);
 	OFFSET(PARAVIRT_irq_disable, paravirt_ops, irq_disable);
 	OFFSET(PARAVIRT_irq_enable, paravirt_ops, irq_enable);
 	OFFSET(PARAVIRT_irq_enable_sysexit, paravirt_ops, irq_enable_sysexit);
diff -r a6889086a657 arch/i386/kernel/cpu/bugs.c
--- a/arch/i386/kernel/cpu/bugs.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/cpu/bugs.c	Thu Apr 19 15:59:27 2007 -0700
@@ -86,7 +86,7 @@ static void __init check_fpu(void)
 
 static void __init check_hlt(void)
 {
-	if (paravirt_enabled())
+	if (paravirt_enabled)
 		return;
 
 	printk(KERN_INFO "Checking 'hlt' instruction... ");
diff -r a6889086a657 arch/i386/kernel/cpu/intel.c
--- a/arch/i386/kernel/cpu/intel.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/cpu/intel.c	Thu Apr 19 15:59:42 2007 -0700
@@ -107,7 +107,7 @@ static void __cpuinit init_intel(struct 
 	 * Note that the workaround only should be initialized once...
 	 */
 	c->f00f_bug = 0;
-	if (!paravirt_enabled() && c->x86 == 5) {
+	if (!paravirt_enabled && c->x86 == 5) {
 		static int f00f_workaround_enabled = 0;
 
 		c->f00f_bug = 1;
diff -r a6889086a657 arch/i386/kernel/entry.S
--- a/arch/i386/kernel/entry.S	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/entry.S	Thu Apr 19 15:58:47 2007 -0700
@@ -436,7 +436,7 @@ ldt_ss:
 	 * is still available to implement the setting of the high
 	 * 16-bits in the INTERRUPT_RETURN paravirt-op.
 	 */
-	cmpl $0, paravirt_ops+PARAVIRT_enabled
+	cmpl $0, paravirt_enabled
 	jne restore_nocheck
 #endif
 
diff -r a6889086a657 arch/i386/kernel/vmi.c
--- a/arch/i386/kernel/vmi.c	Thu Apr 19 15:44:49 2007 -0700
+++ b/arch/i386/kernel/vmi.c	Thu Apr 19 16:00:31 2007 -0700
@@ -714,7 +714,6 @@ do {								\
  */
 static inline int __init activate_vmi(void)
 {
-	short kernel_cs;
 	u64 reloc;
 	const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc;
 
@@ -722,13 +721,11 @@ static inline int __init activate_vmi(vo
 		printk(KERN_ERR "VMI ROM failed to initialize!");
 		return 0;
 	}
-	savesegment(cs, kernel_cs);
-
-	paravirt_ops.paravirt_enabled = 1;
-	paravirt_ops.kernel_rpl = kernel_cs & SEGMENT_RPL_MASK;
+
+	paravirt_enabled = 1;
+	paravirt_backend = "vmi";
 
 	paravirt_ops.patch = vmi_patch;
-	paravirt_ops.name = "vmi";
 
 	/*
 	 * Many of these operations are ABI compatible with VMI.
diff -r a6889086a657 include/asm-i386/paravirt.h
--- a/include/asm-i386/paravirt.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/paravirt.h	Thu Apr 19 16:03:53 2007 -0700
@@ -35,11 +35,6 @@ enum paravirt_lazy_mode {
 
 struct paravirt_ops
 {
-	unsigned int kernel_rpl;
-	int shared_kernel_pmd;
- 	int paravirt_enabled;
-	const char *name;
-
 	/*
 	 * Patch may replace one of the defined code sequences with arbitrary
 	 * code, subject to the same register constraints.  This generally
@@ -420,10 +415,8 @@ unsigned paravirt_patch_insns(void *site
 		    "2" ((u32)(arg3)), [_arg4] "mr" ((u32)(arg4)),	\
 		    [_arg5] "mr" ((u32)(arg5)))
 
-static inline int paravirt_enabled(void)
-{
-	return paravirt_ops.paravirt_enabled;
-}
+extern int paravirt_enabled;
+extern char *paravirt_backend;
 
 static inline void load_esp0(struct tss_struct *tss,
 			     struct thread_struct *thread)
@@ -531,7 +524,12 @@ static inline void wbinvd(void)
 	PVOP_VCALL0(wbinvd);
 }
 
-#define get_kernel_rpl()  (paravirt_ops.kernel_rpl)
+#define get_kernel_rpl() 			\
+({						\
+	short kernel_cs;			\
+	savesegment(cs, kernel_cs);		\
+	(kernel_cs & SEGMENT_RPL_MASK);		\
+})
 
 static inline u64 paravirt_read_msr(unsigned msr, int *err)
 {
@@ -799,6 +797,8 @@ static inline void pte_update_defer(stru
 }
 
 #ifdef CONFIG_X86_PAE
+extern int use_shared_kernel_pmd;
+
 static inline pte_t __pte(unsigned long long val)
 {
 	unsigned long long ret = PVOP_CALL2(unsigned long long, make_pte,
diff -r a6889086a657 include/asm-i386/pgtable-3level-defs.h
--- a/include/asm-i386/pgtable-3level-defs.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/pgtable-3level-defs.h	Thu Apr 19 15:47:10 2007 -0700
@@ -2,7 +2,7 @@
 #define _I386_PGTABLE_3LEVEL_DEFS_H
 
 #ifdef CONFIG_PARAVIRT
-#define SHARED_KERNEL_PMD	(paravirt_ops.shared_kernel_pmd)
+#define SHARED_KERNEL_PMD	use_shared_kernel_pmd
 #else
 #define SHARED_KERNEL_PMD	1
 #endif
diff -r a6889086a657 include/asm-i386/processor.h
--- a/include/asm-i386/processor.h	Thu Apr 19 15:44:49 2007 -0700
+++ b/include/asm-i386/processor.h	Thu Apr 19 16:01:09 2007 -0700
@@ -578,7 +578,7 @@ static inline void native_set_iopl_mask(
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
 #else
-#define paravirt_enabled() 0
+#define paravirt_enabled 0
 #define __cpuid native_cpuid
 
 static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/virtualization

[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux