From: Gavin Shan <gshan@redhat.com>
To: kvmarm@lists.cs.columbia.edu
Cc: linux-kernel@vger.kernel.org, pbonzini@redhat.com,
maz@kernel.org, james.morse@arm.com, Jonathan.Cameron@huawei.com,
mark.rutland@arm.com, will@kernel.org, shan.gavin@gmail.com
Subject: [PATCH v2 15/17] arm64: Reschedule process on aync PF
Date: Tue, 9 Feb 2021 13:04:01 +0800 [thread overview]
Message-ID: <20210209050403.103143-16-gshan@redhat.com> (raw)
In-Reply-To: <20210209050403.103143-1-gshan@redhat.com>
The page-not-present notification is delivered by SDEI event. The
guest reschedules current process to another one when the SDEI event
is received. It's not safe to do so in the SDEI event handler because
the SDEI event should be acknowledged as soon as possible.
So the rescheduling is postponed until the current process switches
from kernel to user mode. In order to trigger the switch, the SDEI
event handler sends (reschedule) IPI to current CPU and it's delivered
in time after the SDEI event is acknowledged.
A new thread flag (TIF_ASYNC_PF) is introduced in order to track the
state for the process, to be rescheduled. With the flag is set, there
is a head of wait-queue is associated with the process. The process
keeps rescheduling itself until the flag is cleared when page-ready
notification is received through (PPI) interrupt.
Signed-off-by: Gavin Shan <gshan@redhat.com>
---
arch/arm64/include/asm/processor.h | 1 +
arch/arm64/include/asm/thread_info.h | 4 +++-
arch/arm64/kernel/signal.c | 17 +++++++++++++++++
3 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index ca2cd75d3286..2176c88c77a7 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -154,6 +154,7 @@ struct thread_struct {
u64 sctlr_tcf0;
u64 gcr_user_excl;
#endif
+ void *data;
};
static inline void arch_thread_struct_whitelist(unsigned long *offset,
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index 9f4e3b266f21..939beb3c7723 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -65,6 +65,7 @@ void arch_release_task_struct(struct task_struct *tsk);
#define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */
#define TIF_MTE_ASYNC_FAULT 5 /* MTE Asynchronous Tag Check Fault */
#define TIF_NOTIFY_SIGNAL 6 /* signal notifications exist */
+#define TIF_ASYNC_PF 7 /* Asynchronous page fault */
#define TIF_SYSCALL_TRACE 8 /* syscall trace active */
#define TIF_SYSCALL_AUDIT 9 /* syscall auditing */
#define TIF_SYSCALL_TRACEPOINT 10 /* syscall tracepoint for ftrace */
@@ -95,11 +96,12 @@ void arch_release_task_struct(struct task_struct *tsk);
#define _TIF_SVE (1 << TIF_SVE)
#define _TIF_MTE_ASYNC_FAULT (1 << TIF_MTE_ASYNC_FAULT)
#define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)
+#define _TIF_ASYNC_PF (1 << TIF_ASYNC_PF)
#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
_TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \
_TIF_UPROBE | _TIF_MTE_ASYNC_FAULT | \
- _TIF_NOTIFY_SIGNAL)
+ _TIF_NOTIFY_SIGNAL | _TIF_ASYNC_PF)
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
_TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index 6237486ff6bb..2cd2d13aa905 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -915,6 +915,23 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
unsigned long thread_flags)
{
do {
+ if (thread_flags & _TIF_ASYNC_PF) {
+ struct swait_queue_head *wq =
+ READ_ONCE(current->thread.data);
+ DECLARE_SWAITQUEUE(wait);
+
+ local_daif_restore(DAIF_PROCCTX_NOIRQ);
+
+ do {
+ prepare_to_swait_exclusive(wq,
+ &wait, TASK_UNINTERRUPTIBLE);
+ if (!test_thread_flag(TIF_ASYNC_PF))
+ break;
+
+ schedule();
+ } while (test_thread_flag(TIF_ASYNC_PF));
+ }
+
if (thread_flags & _TIF_NEED_RESCHED) {
/* Unmask Debug and SError for the next task */
local_daif_restore(DAIF_PROCCTX_NOIRQ);
--
2.23.0
next prev parent reply other threads:[~2021-02-09 5:12 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-09 5:03 [PATCH v2 00/17] Support Asynchronous Page Fault Gavin Shan
2021-02-09 5:03 ` [PATCH v2 01/17] KVM: async_pf: Move struct kvm_async_pf around Gavin Shan
2021-02-09 5:03 ` [PATCH v2 02/17] KVM: async_pf: Add helper function to check completion queue Gavin Shan
2021-02-09 5:03 ` [PATCH v2 03/17] KVM: async_pf: Make GFN slot management generic Gavin Shan
2021-02-09 5:03 ` [PATCH v2 04/17] KVM: x86: Use generic async PF slot management Gavin Shan
2021-02-09 5:03 ` [PATCH v2 05/17] arm64: Probe for the presence of KVM hypervisor services during boot Gavin Shan
2021-02-09 5:03 ` [PATCH v2 06/17] KVM: arm64: Advertise KVM UID to guests via SMCCC Gavin Shan
2021-02-09 5:03 ` [PATCH v2 07/17] KVM: arm64: Export kvm_handle_user_mem_abort() Gavin Shan
2021-02-09 5:03 ` [PATCH v2 08/17] KVM: arm64: Add paravirtualization header files Gavin Shan
2021-02-09 5:03 ` [PATCH v2 09/17] KVM: arm64: Support page-not-present notification Gavin Shan
2021-02-09 5:03 ` [PATCH v2 10/17] KVM: arm64: Support page-ready notification Gavin Shan
2021-02-09 5:03 ` [PATCH v2 11/17] KVM: arm64: Support async PF hypercalls Gavin Shan
2021-02-09 5:03 ` [PATCH v2 12/17] KVM: arm64: Support async PF ioctl commands Gavin Shan
2021-02-09 5:03 ` [PATCH v2 13/17] KVM: arm64: Export async PF capability Gavin Shan
2021-02-09 5:04 ` [PATCH v2 14/17] arm64: Detect async PF para-virtualization feature Gavin Shan
2021-02-09 5:04 ` Gavin Shan [this message]
2021-02-09 5:04 ` [PATCH v2 16/17] arm64: Enable async PF Gavin Shan
2021-02-09 5:04 ` [PATCH v2 17/17] KVM: arm64: Add async PF document Gavin Shan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210209050403.103143-16-gshan@redhat.com \
--to=gshan@redhat.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=james.morse@arm.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=pbonzini@redhat.com \
--cc=shan.gavin@gmail.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®