Thread (18 messages) 18 messages, 4 authors, 2019-10-29

Re: [PATCH v2 4/8] powerpc/vdso32: inline __get_datapage()

From: Santosh Sivaraj <hidden>
Date: 2019-09-13 14:03:33
Also in: lkml

Christophe Leroy [off-list ref] writes:
Le 13/09/2019 à 15:31, Santosh Sivaraj a écrit :
quoted
Christophe Leroy [off-list ref] writes:
quoted
Hi Santosh,

Le 26/08/2019 à 07:44, Santosh Sivaraj a écrit :
quoted
Hi Christophe,

Christophe Leroy [off-list ref] writes:
quoted
__get_datapage() is only a few instructions to retrieve the
address of the page where the kernel stores data to the VDSO.

By inlining this function into its users, a bl/blr pair and
a mflr/mtlr pair is avoided, plus a few reg moves.

The improvement is noticeable (about 55 nsec/call on an 8xx)

vdsotest before the patch:
gettimeofday:    vdso: 731 nsec/call
clock-gettime-realtime-coarse:    vdso: 668 nsec/call
clock-gettime-monotonic-coarse:    vdso: 745 nsec/call

vdsotest after the patch:
gettimeofday:    vdso: 677 nsec/call
clock-gettime-realtime-coarse:    vdso: 613 nsec/call
clock-gettime-monotonic-coarse:    vdso: 690 nsec/call

Signed-off-by: Christophe Leroy <redacted>
---
   arch/powerpc/kernel/vdso32/cacheflush.S   | 10 +++++-----
   arch/powerpc/kernel/vdso32/datapage.S     | 29 ++++-------------------------
   arch/powerpc/kernel/vdso32/datapage.h     | 11 +++++++++++
   arch/powerpc/kernel/vdso32/gettimeofday.S | 13 ++++++-------
   4 files changed, 26 insertions(+), 37 deletions(-)
   create mode 100644 arch/powerpc/kernel/vdso32/datapage.h
The datapage.h file should ideally be moved under include/asm, then we can use
the same for powerpc64 too.
I have a more ambitious project indeed.

Most of the VDSO code is duplicated between vdso32 and vdso64. I'm
aiming at merging everything into a single source code.

This means we would have to generate vdso32.so and vdso64.so out of the
same source files. Any idea on how to do that ? I'm not too good at
creating Makefiles. I guess we would have everything in
arch/powerpc/kernel/vdso/ and would have to build the objects twice,
once in arch/powerpc/kernel/vdso32/ and once in arch/powerpc/kernel/vdso64/
Should we need to build the objects twice? For 64 bit config it is going to be
a 64 bit build else a 32 bit build. It should suffice to get the single source
code compile for both, maybe with macros or (!)CONFIG_PPC64 conditional
compilation. Am I missing something when you say build twice?
IIUC, on PPC64 we build vdso64 for 64bits user apps and vdso32 for 
32bits user apps.

In arch/powerpc/kernel/Makefile, you have:

obj-$(CONFIG_VDSO32)		+= vdso32/
obj-$(CONFIG_PPC64)		+= vdso64/

And in arch/powerpc/platforms/Kconfig.cputype, you have:

config VDSO32
	def_bool y
	depends on PPC32 || CPU_BIG_ENDIAN
	help
	  This symbol controls whether we build the 32-bit VDSO. We obviously
	  want to do that if we're building a 32-bit kernel. If we're building
	  a 64-bit kernel then we only want a 32-bit VDSO if we're building for
	  big endian. That is because the only little endian configuration we
	  support is ppc64le which is 64-bit only.
I didn't know we build 32 bit vdso for 64 bit big endians. But I don't think
its difficult to do it, might be a bit tricky. We can have two targets from
the same source.

SRC = vdso/*.c
OBJS_32 = $(SRC:.c=vdso32/.o)
OBJS_64 = $(SRC:.c=vdso64/.o)

Something like this would work. Of course, this is out of memory, might have to
do something slightly different for the Makefiles in kernel.

Thanks,
Santosh


Christophe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help