Browse Source

[PATCH] i386: PARAVIRT: Allow boot-time disable of paravirt_ops patching

Add "noreplace-paravirt" to disable paravirt_ops patching.

Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Jeremy Fitzhardinge 18 years ago
parent
commit
959b4fdfe7
2 changed files with 16 additions and 0 deletions
  1. 3 0
      Documentation/kernel-parameters.txt
  2. 13 0
      arch/i386/kernel/alternative.c

+ 3 - 0
Documentation/kernel-parameters.txt

@@ -64,6 +64,7 @@ parameter is applicable:
 	GENERIC_TIME The generic timeofday code is enabled.
 	GENERIC_TIME The generic timeofday code is enabled.
 	NFS	Appropriate NFS support is enabled.
 	NFS	Appropriate NFS support is enabled.
 	OSS	OSS sound support is enabled.
 	OSS	OSS sound support is enabled.
+	PV_OPS	A paravirtualized kernel
 	PARIDE	The ParIDE subsystem is enabled.
 	PARIDE	The ParIDE subsystem is enabled.
 	PARISC	The PA-RISC architecture is enabled.
 	PARISC	The PA-RISC architecture is enabled.
 	PCI	PCI bus support is enabled.
 	PCI	PCI bus support is enabled.
@@ -1164,6 +1165,8 @@ and is between 256 and 4096 characters. It is defined in the file
 
 
 	nomce		[IA-32] Machine Check Exception
 	nomce		[IA-32] Machine Check Exception
 
 
+	noreplace-paravirt	[IA-32,PV_OPS] Don't patch paravirt_ops
+
 	noreplace-smp	[IA-32,SMP] Don't replace SMP instructions
 	noreplace-smp	[IA-32,SMP] Don't replace SMP instructions
 			with UP alternatives
 			with UP alternatives
 
 

+ 13 - 0
arch/i386/kernel/alternative.c

@@ -30,6 +30,16 @@ static int __init setup_noreplace_smp(char *str)
 }
 }
 __setup("noreplace-smp", setup_noreplace_smp);
 __setup("noreplace-smp", setup_noreplace_smp);
 
 
+#ifdef CONFIG_PARAVIRT
+static int noreplace_paravirt = 0;
+
+static int __init setup_noreplace_paravirt(char *str)
+{
+	noreplace_paravirt = 1;
+	return 1;
+}
+__setup("noreplace-paravirt", setup_noreplace_paravirt);
+#endif
 
 
 #define DPRINTK(fmt, args...) if (debug_alternative) \
 #define DPRINTK(fmt, args...) if (debug_alternative) \
 	printk(KERN_DEBUG fmt, args)
 	printk(KERN_DEBUG fmt, args)
@@ -330,6 +340,9 @@ void apply_paravirt(struct paravirt_patch_site *start,
 {
 {
 	struct paravirt_patch_site *p;
 	struct paravirt_patch_site *p;
 
 
+	if (noreplace_paravirt)
+		return;
+
 	for (p = start; p < end; p++) {
 	for (p = start; p < end; p++) {
 		unsigned int used;
 		unsigned int used;