LKML Archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] x86/paravirt: Use relative reference for original instruction
@ 2023-06-09  9:45 Hou Wenlong
  2023-06-09  9:45 ` [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed Hou Wenlong
  0 siblings, 1 reply; 4+ messages in thread
From: Hou Wenlong @ 2023-06-09  9:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: Lai Jiangshan, Hou Wenlong, Juergen Gross, Ajay Kaher,
	Alexey Makhalov, VMware PV-Drivers Reviewers, Thomas Gleixner,
	Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
	Peter Zijlstra, Kees Cook, Nadav Amit, Luis Chamberlain, Song Liu,
	Christophe Leroy, Arnd Bergmann, virtualization

Similar to the alternative patching, use relative reference for original
instruction rather than absolute one, which saves 8 bytes for one entry
on x86_64.  And it could generate R_X86_64_PC32 relocation instead of
R_X86_64_64 relocation, which also reduces relocation metadata on
relocatable builds. And the alignment could be hard coded to be 4 now.

Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
---
 arch/x86/include/asm/paravirt.h       | 10 +++++-----
 arch/x86/include/asm/paravirt_types.h |  8 ++++----
 arch/x86/kernel/alternative.c         |  8 +++++---
 arch/x86/kernel/callthunks.c          |  2 +-
 4 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index b49778664d2b..2350ceb43db0 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -742,16 +742,16 @@ extern void default_banner(void);
 
 #else  /* __ASSEMBLY__ */
 
-#define _PVSITE(ptype, ops, word, algn)		\
+#define _PVSITE(ptype, ops)			\
 771:;						\
 	ops;					\
 772:;						\
 	.pushsection .parainstructions,"a";	\
-	 .align	algn;				\
-	 word 771b;				\
+	 .align	4;				\
+	 .long 771b-.;				\
 	 .byte ptype;				\
 	 .byte 772b-771b;			\
-	 _ASM_ALIGN;				\
+	 .align 4;				\
 	.popsection
 
 
@@ -759,7 +759,7 @@ extern void default_banner(void);
 #ifdef CONFIG_PARAVIRT_XXL
 
 #define PARA_PATCH(off)		((off) / 8)
-#define PARA_SITE(ptype, ops)	_PVSITE(ptype, ops, .quad, 8)
+#define PARA_SITE(ptype, ops)	_PVSITE(ptype, ops)
 #define PARA_INDIRECT(addr)	*addr(%rip)
 
 #ifdef CONFIG_DEBUG_ENTRY
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 4acbcddddc29..982a234f5a06 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -5,7 +5,7 @@
 #ifndef __ASSEMBLY__
 /* These all sit in the .parainstructions section to tell us what to patch. */
 struct paravirt_patch_site {
-	u8 *instr;		/* original instructions */
+	s32 instr_offset;	/* original instructions */
 	u8 type;		/* type of this instruction */
 	u8 len;			/* length of original instruction */
 };
@@ -270,11 +270,11 @@ extern struct paravirt_patch_template pv_ops;
 #define _paravirt_alt(insn_string, type)		\
 	"771:\n\t" insn_string "\n" "772:\n"		\
 	".pushsection .parainstructions,\"a\"\n"	\
-	_ASM_ALIGN "\n"					\
-	_ASM_PTR " 771b\n"				\
+	"  .align 4\n"					\
+	"  .long 771b-.\n"				\
 	"  .byte " type "\n"				\
 	"  .byte 772b-771b\n"				\
-	_ASM_ALIGN "\n"					\
+	"  .align 4\n"					\
 	".popsection\n"
 
 /* Generate patchable code, with the default asm parameters. */
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index d9a0e28ff62b..191fda1b17f1 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -1364,20 +1364,22 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start,
 {
 	struct paravirt_patch_site *p;
 	char insn_buff[MAX_PATCH_LEN];
+	u8 *instr;
 
 	for (p = start; p < end; p++) {
 		unsigned int used;
 
+		instr = (u8 *)&p->instr_offset + p->instr_offset;
 		BUG_ON(p->len > MAX_PATCH_LEN);
 		/* prep the buffer with the original instructions */
-		memcpy(insn_buff, p->instr, p->len);
-		used = paravirt_patch(p->type, insn_buff, (unsigned long)p->instr, p->len);
+		memcpy(insn_buff, instr, p->len);
+		used = paravirt_patch(p->type, insn_buff, (unsigned long)instr, p->len);
 
 		BUG_ON(used > p->len);
 
 		/* Pad the rest with nops */
 		add_nops(insn_buff + used, p->len - used);
-		text_poke_early(p->instr, insn_buff, p->len);
+		text_poke_early(instr, insn_buff, p->len);
 	}
 }
 extern struct paravirt_patch_site __start_parainstructions[],
diff --git a/arch/x86/kernel/callthunks.c b/arch/x86/kernel/callthunks.c
index 8bb937331acb..6f5e2447d5a6 100644
--- a/arch/x86/kernel/callthunks.c
+++ b/arch/x86/kernel/callthunks.c
@@ -245,7 +245,7 @@ patch_paravirt_call_sites(struct paravirt_patch_site *start,
 	struct paravirt_patch_site *p;
 
 	for (p = start; p < end; p++)
-		patch_call(p->instr, ct);
+		patch_call((void *)&p->instr_offset + p->instr_offset, ct);
 }
 
 static __init_or_module void
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed
  2023-06-09  9:45 [PATCH 1/2] x86/paravirt: Use relative reference for original instruction Hou Wenlong
@ 2023-06-09  9:45 ` Hou Wenlong
  2023-06-09 15:11   ` Juergen Gross
  2023-06-09 18:25   ` Nadav Amit
  0 siblings, 2 replies; 4+ messages in thread
From: Hou Wenlong @ 2023-06-09  9:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: Lai Jiangshan, Hou Wenlong, Nadav Amit, Juergen Gross, Ajay Kaher,
	Alexey Makhalov, VMware PV-Drivers Reviewers, Thomas Gleixner,
	Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
	virtualization

Similar to struct alt_instr, make the struct paravirt_patch_site packed
and get rid of all the .align directives. This could save 2 bytes for
one entry on X86_64.

Suggested-by: Nadav Amit <namit@vmware.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
---
 arch/x86/include/asm/paravirt.h       | 2 --
 arch/x86/include/asm/paravirt_types.h | 4 +---
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 2350ceb43db0..3e5ccacb3893 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -747,11 +747,9 @@ extern void default_banner(void);
 	ops;					\
 772:;						\
 	.pushsection .parainstructions,"a";	\
-	 .align	4;				\
 	 .long 771b-.;				\
 	 .byte ptype;				\
 	 .byte 772b-771b;			\
-	 .align 4;				\
 	.popsection
 
 
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 982a234f5a06..da0547bcd068 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -8,7 +8,7 @@ struct paravirt_patch_site {
 	s32 instr_offset;	/* original instructions */
 	u8 type;		/* type of this instruction */
 	u8 len;			/* length of original instruction */
-};
+} __packed;
 
 /* Lazy mode for batching updates / context switch */
 enum paravirt_lazy_mode {
@@ -270,11 +270,9 @@ extern struct paravirt_patch_template pv_ops;
 #define _paravirt_alt(insn_string, type)		\
 	"771:\n\t" insn_string "\n" "772:\n"		\
 	".pushsection .parainstructions,\"a\"\n"	\
-	"  .align 4\n"					\
 	"  .long 771b-.\n"				\
 	"  .byte " type "\n"				\
 	"  .byte 772b-771b\n"				\
-	"  .align 4\n"					\
 	".popsection\n"
 
 /* Generate patchable code, with the default asm parameters. */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed
  2023-06-09  9:45 ` [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed Hou Wenlong
@ 2023-06-09 15:11   ` Juergen Gross
  2023-06-09 18:25   ` Nadav Amit
  1 sibling, 0 replies; 4+ messages in thread
From: Juergen Gross @ 2023-06-09 15:11 UTC (permalink / raw)
  To: Hou Wenlong, linux-kernel
  Cc: Lai Jiangshan, Nadav Amit, Ajay Kaher, Alexey Makhalov,
	VMware PV-Drivers Reviewers, Thomas Gleixner, Ingo Molnar,
	Borislav Petkov, Dave Hansen, x86, H. Peter Anvin, virtualization


[-- Attachment #1.1.1: Type: text/plain, Size: 383 bytes --]

On 09.06.23 11:45, Hou Wenlong wrote:
> Similar to struct alt_instr, make the struct paravirt_patch_site packed
> and get rid of all the .align directives. This could save 2 bytes for
> one entry on X86_64.
> 
> Suggested-by: Nadav Amit <namit@vmware.com>
> Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>

Reviewed-by: Juergen Gross <jgross@suse.com>


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed
  2023-06-09  9:45 ` [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed Hou Wenlong
  2023-06-09 15:11   ` Juergen Gross
@ 2023-06-09 18:25   ` Nadav Amit
  1 sibling, 0 replies; 4+ messages in thread
From: Nadav Amit @ 2023-06-09 18:25 UTC (permalink / raw)
  To: Hou Wenlong
  Cc: kernel list, Lai Jiangshan, Juergen Gross, Ajay Kaher,
	Alexey Makhalov, Pv-drivers, Thomas Gleixner, Ingo Molnar,
	Borislav Petkov, Dave Hansen, X86 ML, H. Peter Anvin,
	virtualization@lists.linux-foundation.org


> On Jun 9, 2023, at 2:45 AM, Hou Wenlong <houwenlong.hwl@antgroup.com> wrote:
> 
> Similar to struct alt_instr, make the struct paravirt_patch_site packed
> and get rid of all the .align directives. This could save 2 bytes for
> one entry on X86_64.

Thanks for taking care of it.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-06-09 18:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-09  9:45 [PATCH 1/2] x86/paravirt: Use relative reference for original instruction Hou Wenlong
2023-06-09  9:45 ` [PATCH 2/2] x86/paravirt: Make the struct paravirt_patch_site packed Hou Wenlong
2023-06-09 15:11   ` Juergen Gross
2023-06-09 18:25   ` Nadav Amit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).