mbox series

[RFC,00/15] entry: Provide generic implementation for host and guest entry/exit work

Message ID 20190919150314.054351477@linutronix.de (mailing list archive)
Headers show
Series entry: Provide generic implementation for host and guest entry/exit work | expand

Message

Thomas Gleixner Sept. 19, 2019, 3:03 p.m. UTC
When working on a way to move out the posix cpu timer expiry out of the
timer interrupt context, I noticed that KVM is not handling pending task
work before entering a guest. A quick hack was to add that to the x86 KVM
handling loop. The discussion ended with a request to make this a generic
infrastructure possible with also moving the per arch implementations of
the enter from and return to user space handling generic.

  https://lore.kernel.org/r/89E42BCC-47A8-458B-B06A-D6A20D20512C@amacapital.net

You asked for it, so don't complain that you have to review it :)

The series implements the syscall enter/exit and the general exit to
userspace work handling along with the pre guest enter functionality.

The series converts x86 and ARM64. x86 is fully tested including selftests
etc. ARM64 is only compile tested for now as my only ARM64 testbox is not
available right now.

Thanks,

	tglx

---
 /Makefile                               |    3 
 arch/Kconfig                            |    3 
 arch/arm64/Kconfig                      |    1 
 arch/arm64/include/asm/kvm_host.h       |    1 
 arch/arm64/kernel/entry.S               |   18 -
 arch/arm64/kernel/ptrace.c              |   65 ------
 arch/arm64/kernel/signal.c              |   45 ----
 arch/arm64/kernel/syscall.c             |   49 ----
 arch/x86/Kconfig                        |    1 
 arch/x86/entry/common.c                 |  265 +-------------------------
 arch/x86/entry/entry_32.S               |   13 -
 arch/x86/entry/entry_64.S               |   12 -
 arch/x86/entry/entry_64_compat.S        |   21 --
 arch/x86/include/asm/signal.h           |    1 
 arch/x86/include/asm/thread_info.h      |    9 
 arch/x86/kernel/signal.c                |    2 
 arch/x86/kvm/x86.c                      |   17 -
 b/arch/arm64/include/asm/entry-common.h |   76 +++++++
 b/arch/x86/include/asm/entry-common.h   |  104 ++++++++++
 b/include/linux/entry-common.h          |  324 ++++++++++++++++++++++++++++++++
 b/kernel/entry/common.c                 |  220 +++++++++++++++++++++
 kernel/Makefile                         |    1 
 22 files changed, 776 insertions(+), 475 deletions(-)

Comments

Mark Rutland Sept. 20, 2019, 3:12 p.m. UTC | #1
Hi Thomas,

As a heads-up, I'm going to be away next week, and I likely won't have
the chance to look at this in detail before October.

On Thu, Sep 19, 2019 at 05:03:14PM +0200, Thomas Gleixner wrote:
> When working on a way to move out the posix cpu timer expiry out of the
> timer interrupt context, I noticed that KVM is not handling pending task
> work before entering a guest. A quick hack was to add that to the x86 KVM
> handling loop. The discussion ended with a request to make this a generic
> infrastructure possible with also moving the per arch implementations of
> the enter from and return to user space handling generic.
> 
>   https://lore.kernel.org/r/89E42BCC-47A8-458B-B06A-D6A20D20512C@amacapital.net
> 
> You asked for it, so don't complain that you have to review it :)

I never asked for this! ;)

> The series implements the syscall enter/exit and the general exit to
> userspace work handling along with the pre guest enter functionality.
> 
> The series converts x86 and ARM64. x86 is fully tested including selftests
> etc. ARM64 is only compile tested for now as my only ARM64 testbox is not
> available right now.

I've been working on converting the arm64 entry code to C for a while
now [1], gradually upstreaming the bits I can.

James has picked up some of that [2] as a prerequisite for some RAS
error handling, and I think building the arm64 bits atop of that would
be preferable. IIUC that should get posted as a series come -rc1.

Since there's immense scope for subtle breakage, I'd prefer that we do
the arm64-specific asm->C conversion before migrating arm64 to generic
code. That way us arm64 folk can ensure the asm->C conversion retains
the existing behaviour, and it'll be easier for everyone to compare the
arm64 and generic C implementations.

Thanks,
Mark.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git
[2] git://linux-arm.org/linux-jm.git -b deasm_sync_only/v1

> 
> Thanks,
> 
> 	tglx
> 
> ---
>  /Makefile                               |    3 
>  arch/Kconfig                            |    3 
>  arch/arm64/Kconfig                      |    1 
>  arch/arm64/include/asm/kvm_host.h       |    1 
>  arch/arm64/kernel/entry.S               |   18 -
>  arch/arm64/kernel/ptrace.c              |   65 ------
>  arch/arm64/kernel/signal.c              |   45 ----
>  arch/arm64/kernel/syscall.c             |   49 ----
>  arch/x86/Kconfig                        |    1 
>  arch/x86/entry/common.c                 |  265 +-------------------------
>  arch/x86/entry/entry_32.S               |   13 -
>  arch/x86/entry/entry_64.S               |   12 -
>  arch/x86/entry/entry_64_compat.S        |   21 --
>  arch/x86/include/asm/signal.h           |    1 
>  arch/x86/include/asm/thread_info.h      |    9 
>  arch/x86/kernel/signal.c                |    2 
>  arch/x86/kvm/x86.c                      |   17 -
>  b/arch/arm64/include/asm/entry-common.h |   76 +++++++
>  b/arch/x86/include/asm/entry-common.h   |  104 ++++++++++
>  b/include/linux/entry-common.h          |  324 ++++++++++++++++++++++++++++++++
>  b/kernel/entry/common.c                 |  220 +++++++++++++++++++++
>  kernel/Makefile                         |    1 
>  22 files changed, 776 insertions(+), 475 deletions(-)
> 
>
Andy Lutomirski Sept. 23, 2019, 6:18 p.m. UTC | #2
On Thu, Sep 19, 2019 at 8:09 AM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> When working on a way to move out the posix cpu timer expiry out of the
> timer interrupt context, I noticed that KVM is not handling pending task
> work before entering a guest. A quick hack was to add that to the x86 KVM
> handling loop. The discussion ended with a request to make this a generic
> infrastructure possible with also moving the per arch implementations of
> the enter from and return to user space handling generic.
>
>   https://lore.kernel.org/r/89E42BCC-47A8-458B-B06A-D6A20D20512C@amacapital.net
>
> You asked for it, so don't complain that you have to review it :)
>
> The series implements the syscall enter/exit and the general exit to
> userspace work handling along with the pre guest enter functionality.
>
> The series converts x86 and ARM64. x86 is fully tested including selftests
> etc. ARM64 is only compile tested for now as my only ARM64 testbox is not
> available right now.

Other than the comments I sent so far, I like this series.
Thomas Gleixner Sept. 23, 2019, 8:50 p.m. UTC | #3
On Fri, 20 Sep 2019, Mark Rutland wrote:
> I've been working on converting the arm64 entry code to C for a while
> now [1], gradually upstreaming the bits I can.
> 
> James has picked up some of that [2] as a prerequisite for some RAS
> error handling, and I think building the arm64 bits atop of that would
> be preferable. IIUC that should get posted as a series come -rc1.
> 
> Since there's immense scope for subtle breakage, I'd prefer that we do
> the arm64-specific asm->C conversion before migrating arm64 to generic
> code. That way us arm64 folk can ensure the asm->C conversion retains
> the existing behaviour, and it'll be easier for everyone to compare the
> arm64 and generic C implementations.

Right. It still would be nice to have some feedback on the general
approach.

That sais I'm happy to let you screw your entry code up yourself :)

Thanks

	tglx
Christian Borntraeger Sept. 24, 2019, 6:50 a.m. UTC | #4
On 19.09.19 17:03, Thomas Gleixner wrote:
> When working on a way to move out the posix cpu timer expiry out of the
> timer interrupt context, I noticed that KVM is not handling pending task
> work before entering a guest. A quick hack was to add that to the x86 KVM
> handling loop. The discussion ended with a request to make this a generic
> infrastructure possible with also moving the per arch implementations of
> the enter from and return to user space handling generic.
> 
>   https://lore.kernel.org/r/89E42BCC-47A8-458B-B06A-D6A20D20512C@amacapital.net
> 
> You asked for it, so don't complain that you have to review it :)
> 
> The series implements the syscall enter/exit and the general exit to
> userspace work handling along with the pre guest enter functionality.
> 
> The series converts x86 and ARM64. x86 is fully tested including selftests
> etc. ARM64 is only compile tested for now as my only ARM64 testbox is not
> available right now.

It seems that s390x would also need to look into TIF_NOTIFY_PENDING before
entering a KVM guest. Given that the s390x entry path is still in assembler
this might not be something to do quickly.

Would it make sense to actually start with a minimal solution (e.g. one that
provides notify_resume_pending like your original patch) as a fix. That would
also be simple to backport. And then we can do the proper rework on top.

Or do we consider anything that depends on TIF_NOTIFY_PENDING before entering
a guest as not important enough for stable?
After all the vcpu_run ioctl almost never returns to userspace and nothing 
was obviously broken.

Another question: Are there callbacks due to TIF_NOTIFY_PENDING that should
NOT happen as long as we stay in the vpcu loop?