Re: [RFC WIP PATCH] powerpc/32: system call implement entry/exit logic in C

From: Christophe Leroy
Date: Sun Apr 05 2020 - 14:53:43 EST




Le 03/04/2020 Ã 09:33, Nicholas Piggin a ÃcritÂ:
Christophe Leroy's on April 1, 2020 9:48 pm:


Le 31/03/2020 Ã 17:22, Christophe Leroy a ÃcritÂ:
That's first try to port PPC64 syscall entry/exit logic in C to PPC32.
I've do the minimum to get it work. I have not reworked calls
to sys_fork() and friends for instance.

For the time being, it seems to work more or less but:
- ping reports EINVAL on recvfrom
- strace shows NULL instead of strings in call like open() for instance.

For the two above problems, that's because system_call_exception()
doesn't set orig_gpr3 whereas DoSycall() does in entry_32.S . Is that
only done on PPC32 ?

With the following line at the begining of system_call_exception(), it
works perfectly:

regs->orig_gpr3 = r3;

Oh great, nice work. We should be able to make some simple helpers or
move some things a bit to reduce the amount of ifdefs in the C code.
It doesn't look too bad though.

I will now focus on performance to see if we can do something about it.

What's the performance difference between current asm code just with
always saving NVGPRS vs C?

Done new measurement and sent a series. lower values now because the time accounting was done twice as it was still in the ASM part.

Before the series, 311 cycles for a null_syscall
If adding SAVE_NVGPRS to the entry macro, 335 cycles

First patch: 353 cycles ie +13,5%

After a few changes, including conditional saving of non volatile registers, I get 325 cycles that is only +4,5%. I thing that's acceptable.

Do you see a problem with still saving non volatile registers only when required ?

Christophe