All of lore.kernel.org
 help / color / mirror / Atom feed
From: Miroslav Benes <mbenes@suse.cz>
To: jpoimboe@redhat.com
Cc: jikos@kernel.org, jeyu@redhat.com, linux-kernel@vger.kernel.org,
	live-patching@vger.kernel.org, vojtech@suse.com, jslaby@suse.cz,
	pmladek@suse.cz, Miroslav Benes <mbenes@suse.cz>
Subject: [RFC PATCH 2/2] s390/klp: update task universe when exiting kernel
Date: Mon, 18 Apr 2016 17:01:10 +0200	[thread overview]
Message-ID: <1460991670-32187-3-git-send-email-mbenes@suse.cz> (raw)
In-Reply-To: <1460991670-32187-1-git-send-email-mbenes@suse.cz>

Update a tasks's universe when returning from a system call or user
space interrupt, or after handling a signal.

This greatly increases the chances of a patch operation succeeding.  If
a task is I/O bound, it can switch universes when returning from a
system call.  If a task is CPU bound, it can switch universes when
returning from an interrupt.  If a task is sleeping on a to-be-patched
function, the user can send SIGSTOP and SIGCONT to force it to switch.

Since there are two ways how the syscall can be restarted on return from
a signal handling process, it is important to clear the flag before
do_signal() is called. Otherwise we could miss the migration if we used
SIGSTOP/SIGCONT procedure or fake signal to migrate patching blocking
tasks. If we place our hook to sysc_work label in entry before
TIF_SIGPENDING is evaluated we kill two birds with one stone. The task
is correctly migrated in all return paths from a syscall.

Signed-off-by: Miroslav Benes <mbenes@suse.cz>
---
 arch/s390/include/asm/thread_info.h |  2 ++
 arch/s390/kernel/entry.S            | 31 ++++++++++++++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h
index 8642c1dab382..451dd2ddc3be 100644
--- a/arch/s390/include/asm/thread_info.h
+++ b/arch/s390/include/asm/thread_info.h
@@ -75,6 +75,7 @@ void arch_release_task_struct(struct task_struct *tsk);
 #define TIF_SIGPENDING		1	/* signal pending */
 #define TIF_NEED_RESCHED	2	/* rescheduling necessary */
 #define TIF_UPROBE		3	/* breakpointed or single-stepping */
+#define TIF_KLP_NEED_UPDATE	4	/* pending live patching update */
 
 #define TIF_31BIT		16	/* 32bit process */
 #define TIF_MEMDIE		17	/* is terminating due to OOM killer */
@@ -93,6 +94,7 @@ void arch_release_task_struct(struct task_struct *tsk);
 #define _TIF_SIGPENDING		_BITUL(TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED	_BITUL(TIF_NEED_RESCHED)
 #define _TIF_UPROBE		_BITUL(TIF_UPROBE)
+#define _TIF_KLP_NEED_UPDATE	_BITUL(TIF_KLP_NEED_UPDATE)
 
 #define _TIF_31BIT		_BITUL(TIF_31BIT)
 #define _TIF_SINGLE_STEP	_BITUL(TIF_SINGLE_STEP)
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 2d47f9cfcb36..cbc3a3b4aa6e 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -46,7 +46,7 @@ STACK_SIZE  = 1 << STACK_SHIFT
 STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE
 
 _TIF_WORK	= (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
-		   _TIF_UPROBE)
+		   _TIF_UPROBE | _TIF_KLP_NEED_UPDATE )
 _TIF_TRACE	= (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
 		   _TIF_SYSCALL_TRACEPOINT)
 _CIF_WORK	= (_CIF_MCCK_PENDING | _CIF_ASCE | _CIF_FPU)
@@ -329,6 +329,11 @@ ENTRY(system_call)
 #endif
 	TSTMSK	__PT_FLAGS(%r11),_PIF_PER_TRAP
 	jo	.Lsysc_singlestep
+#ifdef CONFIG_LIVEPATCH
+	TSTMSK	__TI_flags(%r12),_TIF_KLP_NEED_UPDATE
+	jo	.Lsysc_update_klp	# handle KLP just before signals and
+					# possible syscall restart
+#endif
 	TSTMSK	__TI_flags(%r12),_TIF_SIGPENDING
 	jo	.Lsysc_sigpending
 	TSTMSK	__TI_flags(%r12),_TIF_NOTIFY_RESUME
@@ -404,6 +409,16 @@ ENTRY(system_call)
 #endif
 
 #
+# _TIF_KLP_NEED_UPDATE is set, call klp_update_task_universe
+#
+#ifdef CONFIG_LIVEPATCH
+.Lsysc_update_klp:
+	lg	%r2,__TI_task(%r12)
+	larl	%r14,.Lsysc_return
+	jg	klp_update_task_universe
+#endif
+
+#
 # _PIF_PER_TRAP is set, call do_per_trap
 #
 .Lsysc_singlestep:
@@ -652,6 +667,10 @@ ENTRY(io_int_handler)
 	jo	.Lio_mcck_pending
 	TSTMSK	__TI_flags(%r12),_TIF_NEED_RESCHED
 	jo	.Lio_reschedule
+#ifdef CONFIG_LIVEPATCH
+	TSTMSK	__TI_flags(%r12),_TIF_KLP_NEED_UPDATE
+	jo	.Lio_update_klp
+#endif
 	TSTMSK	__TI_flags(%r12),_TIF_SIGPENDING
 	jo	.Lio_sigpending
 	TSTMSK	__TI_flags(%r12),_TIF_NOTIFY_RESUME
@@ -698,6 +717,16 @@ ENTRY(io_int_handler)
 	j	.Lio_return
 
 #
+# _TIF_KLP_NEED_UPDATE is set, call klp_update_task_universe
+#
+#ifdef CONFIG_LIVEPATCH
+.Lio_update_klp:
+	lg	%r2,__TI_task(%r12)
+	larl	%r14,.Lio_return
+	jg	klp_update_task_universe
+#endif
+
+#
 # _TIF_SIGPENDING or is set, call do_signal
 #
 .Lio_sigpending:
-- 
2.8.1

  parent reply	other threads:[~2016-04-18 15:01 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-25 19:34 [RFC PATCH v1.9 00/14] livepatch: hybrid consistency model Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 01/14] x86/asm/head: cleanup initial stack variable Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 02/14] x86/asm/head: use a common function for starting CPUs Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 03/14] x86/asm/head: standardize the bottom of the stack for idle tasks Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 04/14] x86: move _stext marker before head code Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 05/14] sched: horrible way to detect whether a task has been preempted Josh Poimboeuf
2016-04-06 13:06   ` Petr Mladek
2016-04-06 16:33     ` Josh Poimboeuf
2016-04-07  9:47       ` Petr Mladek
2016-04-07 14:34         ` Josh Poimboeuf
2016-04-08  8:07           ` Petr Mladek
2016-04-08 14:34             ` Josh Poimboeuf
2016-04-07 21:15   ` Jessica Yu
2016-04-07 21:37     ` Jiri Kosina
2016-04-07 22:35       ` Josh Poimboeuf
2016-04-07 22:53         ` Jiri Kosina
2016-04-07 23:15       ` Jessica Yu
2016-04-08  7:05         ` Jiri Kosina
2016-04-08  8:03           ` Petr Mladek
2016-04-08 14:31             ` Josh Poimboeuf
2016-04-11  8:38               ` Petr Mladek
2016-03-25 19:34 ` [RFC PATCH v1.9 06/14] x86: add error handling to dump_trace() Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 07/14] x86/stacktrace: add function for detecting reliable stack traces Josh Poimboeuf
2016-03-31 13:03   ` Miroslav Benes
2016-04-04 17:54     ` Josh Poimboeuf
2016-04-11 14:16       ` Jiri Slaby
2016-04-12 15:56         ` Josh Poimboeuf
2016-06-09  8:31           ` Jiri Slaby
2016-06-13 21:58             ` Josh Poimboeuf
2016-12-01 20:28               ` Jiri Slaby
2016-12-01 20:59                 ` Josh Poimboeuf
2017-01-17 13:08                   ` Jiri Slaby
2016-04-04 15:55   ` Petr Mladek
2016-04-04 17:58     ` Josh Poimboeuf
2016-04-07 11:55   ` Petr Mladek
2016-04-07 14:46     ` Josh Poimboeuf
2016-04-08  8:24       ` Petr Mladek
2016-04-11  3:29   ` Jessica Yu
2016-03-25 19:34 ` [RFC PATCH v1.9 08/14] livepatch: separate enabled and patched states Josh Poimboeuf
2016-04-11  3:31   ` Jessica Yu
2016-04-12 14:44   ` [RFC PATCH v1.9 08/14] " Chris J Arges
2016-04-12 17:16     ` Josh Poimboeuf
2016-04-12 17:35       ` Chris J Arges
2016-04-12 18:25         ` Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 09/14] livepatch: remove unnecessary object loaded check Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 10/14] livepatch: move patching functions into patch.c Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 11/14] livepatch: store function sizes Josh Poimboeuf
2016-03-25 19:34 ` [RFC PATCH v1.9 12/14] livepatch: create per-task consistency model Josh Poimboeuf
2016-03-31 13:12   ` Miroslav Benes
2016-04-04 18:21     ` Josh Poimboeuf
2016-04-04 18:27       ` Vojtech Pavlik
2016-04-04 18:33         ` Josh Poimboeuf
2016-04-05 11:36           ` Vojtech Pavlik
2016-04-05 13:53             ` Josh Poimboeuf
2016-04-05 17:32   ` Minfei Huang
2016-04-05 21:17     ` Josh Poimboeuf
2016-04-14  9:25   ` Miroslav Benes
2016-04-14 16:39     ` Josh Poimboeuf
2016-04-15  9:17       ` Miroslav Benes
2016-03-25 19:35 ` [RFC PATCH v1.9 13/14] livepatch: add /proc/<pid>/patch_status Josh Poimboeuf
2016-03-31  9:33   ` Jiri Slaby
2016-03-31  9:40     ` Jiri Slaby
2016-04-04 16:56     ` Josh Poimboeuf
2016-03-25 19:35 ` [RFC PATCH v1.9 14/14] livepatch: update task universe when exiting kernel Josh Poimboeuf
2016-04-14  8:47   ` Miroslav Benes
2016-04-14  8:50     ` Miroslav Benes
2016-04-14 13:39       ` Josh Poimboeuf
2016-04-18 15:01         ` [RFC PATCH 0/2] s390/klp: s390 support Miroslav Benes
2016-04-18 15:01           ` [RFC PATCH 1/2] s390: livepatch, reorganize TIF bits Miroslav Benes
2016-04-18 15:01           ` Miroslav Benes [this message]
2016-04-18 15:17           ` [RFC PATCH 0/2] s390/klp: s390 support Josh Poimboeuf
2016-04-14 13:23     ` [RFC PATCH v1.9 14/14] livepatch: update task universe when exiting kernel Josh Poimboeuf
2016-03-31 12:54 ` [RFC PATCH v1.9 00/14] livepatch: hybrid consistency model Miroslav Benes
2016-04-04 17:03   ` Josh Poimboeuf
2016-04-05 14:24     ` Miroslav Benes
2016-04-05 14:34       ` Josh Poimboeuf
2016-04-05 14:53         ` Miroslav Benes
2016-04-01 13:34 ` Miroslav Benes
2016-04-01 13:39 ` Petr Mladek
2016-04-01 15:38   ` Petr Mladek
2016-04-05 13:44   ` Josh Poimboeuf
2016-04-06  8:15     ` Petr Mladek
2016-04-28 18:53     ` Josh Poimboeuf
2016-06-09 14:20       ` Petr Mladek
2016-04-07 12:10 ` Petr Mladek
2016-04-07 15:08   ` Josh Poimboeuf
2016-04-07 15:47     ` Jiri Kosina
2016-04-07 18:03       ` Josh Poimboeuf
2016-04-07 18:33         ` Jiri Kosina

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=1460991670-32187-3-git-send-email-mbenes@suse.cz \
    --to=mbenes@suse.cz \
    --cc=jeyu@redhat.com \
    --cc=jikos@kernel.org \
    --cc=jpoimboe@redhat.com \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=pmladek@suse.cz \
    --cc=vojtech@suse.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.