All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andy Lutomirski <luto@kernel.org>, Dave Hansen <dave@sr71.net>,
	Andrew Morton <akpm@linux-foundation.org>,
	Oleg Nesterov <oleg@redhat.com>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH] s390, sched: Fix thread_struct move fallout to __switch_to()
Date: Mon, 20 Jul 2015 10:20:04 +0200	[thread overview]
Message-ID: <20150720082004.GB12468@gmail.com> (raw)
In-Reply-To: <20150720072037.GA3607@osiris>


* Heiko Carstens <heiko.carstens@de.ibm.com> wrote:

> Unfortunately not true. It breaks the build on s390 since a couple of
> displacements used in asm code now get too large:
> 
> arch/s390/kernel/entry.S:181: Error: operand out of range (0x00000000000018a8 is not between 0x0000000000000000 and 0x0000000000000fff)
> arch/s390/kernel/entry.S:191: Error: operand out of range (0x00000000000018a8 is not between 0x0000000000000000 and 0x0000000000000fff)
> arch/s390/kernel/entry.S:423: Error: operand out of range (0x0000000000001924 is not between 0x0000000000000000 and 0x0000000000000fff)
> arch/s390/kernel/entry.S:437: Error: operand out of range (0x00000000000018e8 is not between 0x0000000000000000 and 0x0000000000000fff)
> arch/s390/kernel/entry.S:438: Error: operand out of range (0x00000000000018e0 is not between 0x0000000000000000 and 0x0000000000000fff)
> arch/s390/kernel/entry.S:439: Error: operand out of range (0x00000000000018f0 is not between 0x0000000000000000 and 0x0000000000000fff)
> make[1]: *** [arch/s390/kernel/entry.o] Error 1
> 
> Let's see how we can fix this.

Sorry about this!

So I looked at the __switch_to() assembly, and the main complication appears to be 
that we have two uses of 'prev':

        lg      %r4,__THREAD_info(%r2)          # get thread_info of prev


        stg     %r15,__THREAD_ksp(%r2)          # store kernel stack of prev

the __THREAD_info offset is best expressed relative to task_struct - the 
__THREAD_ksp offset is best expressed relative to thread_struct.

I.e. I think the best fix would be to extend the signature of s390's __switch_to() 
from (prev,next) to (prev,next,prev_thread,next_thread).

Is the C parameter mapping r2,r3,r4,r5? If yes then the patch below should do the 
trick. (Utterly untested.)

Note:

  - I renamed __THREAD_info to __TASK_thread_info, to better separate task_struct
    and thread_struct offsets syntactically and visually.

  - I removed __THREAD_mm_segment which is unused

I also looked at fixing pgm_check_handler(), but my s390-fu gave up completely on 
that one: task_struct is in 'r14', but this is a hardware entry function it 
appears. So to fix it we'd have to pick a temporary register, put thread_struct 
pointer into it, and fix up these offsets:

arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_per_address, offsetof(struct task_struct, thread.per_event.address));
arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_per_paid, offsetof(struct task_struct, thread.per_event.paid));
arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_trap_tdb, offsetof(struct task_struct, thread.trap_tdb));

to be thread_struct relative.

Thanks,

	Ingo

==============>

 arch/s390/include/asm/switch_to.h |  7 +++++--
 arch/s390/kernel/asm-offsets.c    |  5 ++---
 arch/s390/kernel/entry.S          | 14 +++++++++-----
 3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h
index d62e7a69605f..aa854b600938 100644
--- a/arch/s390/include/asm/switch_to.h
+++ b/arch/s390/include/asm/switch_to.h
@@ -10,7 +10,10 @@
 #include <linux/thread_info.h>
 #include <asm/ptrace.h>
 
-extern struct task_struct *__switch_to(void *, void *);
+extern struct task_struct *
+__switch_to(struct task_struct *prev, struct task_struct *next,
+	    struct thread_struct *prev_thread, struct thread_struct *next_thrad);
+
 extern void update_cr_regs(struct task_struct *task);
 
 static inline int test_fp_ctl(u32 fpc)
@@ -169,7 +172,7 @@ static inline void restore_access_regs(unsigned int *acrs)
 		restore_access_regs(&next->thread.acrs[0]);		\
 		restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb);	\
 	}								\
-	prev = __switch_to(prev,next);					\
+	prev = __switch_to(prev, next, &prev->thread, &next->thread);	\
 } while (0)
 
 #endif /* __ASM_SWITCH_TO_H */
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c
index c7d1b9d09011..2b422297660f 100644
--- a/arch/s390/kernel/asm-offsets.c
+++ b/arch/s390/kernel/asm-offsets.c
@@ -23,9 +23,8 @@
 
 int main(void)
 {
-	DEFINE(__THREAD_info, offsetof(struct task_struct, stack));
-	DEFINE(__THREAD_ksp, offsetof(struct task_struct, thread.ksp));
-	DEFINE(__THREAD_mm_segment, offsetof(struct task_struct, thread.mm_segment));
+	DEFINE(__TASK_thread_info, offsetof(struct task_struct, stack));
+	DEFINE(__THREAD_ksp, offsetof(struct thread_struct, ksp));
 	BLANK();
 	DEFINE(__TASK_pid, offsetof(struct task_struct, pid));
 	BLANK();
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 3238893c9d4f..c2fcb9e7ad25 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -170,17 +170,21 @@ _PIF_WORK	= (_PIF_PER_TRAP)
 	.section .kprobes.text, "ax"
 
 /*
- * Scheduler resume function, called by switch_to
+ * Low level scheduler resume function, called by switch_to():
+ *
  *  gpr2 = (task_struct *) prev
  *  gpr3 = (task_struct *) next
+ *  gpr4 = (thread_struct *) prev->thread
+ *  gpr5 = (thread_struct *) next->thread
+ *
  * Returns:
  *  gpr2 = prev
  */
 ENTRY(__switch_to)
 	stmg	%r6,%r15,__SF_GPRS(%r15)	# store gprs of prev task
-	stg	%r15,__THREAD_ksp(%r2)		# store kernel stack of prev
-	lg	%r4,__THREAD_info(%r2)		# get thread_info of prev
-	lg	%r5,__THREAD_info(%r3)		# get thread_info of next
+	stg	%r15,__THREAD_ksp(%r4)		# store kernel stack of prev
+	lg	%r4,__TASK_thread_info(%r2)	# get thread_info of prev
+	lg	%r5,__TASK_thread_info(%r3)	# get thread_info of next
 	lgr	%r15,%r5
 	aghi	%r15,STACK_INIT			# end of kernel stack of next
 	stg	%r3,__LC_CURRENT		# store task struct of next
@@ -188,7 +192,7 @@ ENTRY(__switch_to)
 	stg	%r15,__LC_KERNEL_STACK		# store end of kernel stack
 	lctl	%c4,%c4,__TASK_pid(%r3)		# load pid to control reg. 4
 	mvc	__LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next
-	lg	%r15,__THREAD_ksp(%r3)		# load kernel stack of next
+	lg	%r15,__THREAD_ksp(%r5)		# load kernel stack of next
 	lmg	%r6,%r15,__SF_GPRS(%r15)	# load gprs of next task
 	br	%r14
 

  parent reply	other threads:[~2015-07-20  8:20 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-18  3:18 [GIT PULL] x86 fixes Ingo Molnar
2015-07-20  7:20 ` Heiko Carstens
2015-07-20  8:00   ` [PATCH] sched, s390: Fix the fallout of increasing the offset of 'thread_struct' within 'task_struct' Ingo Molnar
2015-07-20  8:12     ` Martin Schwidefsky
2015-07-20  8:38       ` Ingo Molnar
2015-07-20  8:56         ` Martin Schwidefsky
2015-07-20  8:20   ` Ingo Molnar [this message]
2015-07-20  8:33     ` [PATCH] s390, sched: Fix thread_struct move fallout to __switch_to() Martin Schwidefsky
2015-07-20  8:34     ` Ingo Molnar

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=20150720082004.GB12468@gmail.com \
    --to=mingo@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=dave@sr71.net \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=oleg@redhat.com \
    --cc=schwidefsky@de.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 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.