Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62735e52 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull s390 patches from Martin Schwidefsky:
 "Some more bug fixes and a config change.

  The signal bug is nasty, if the clock_gettime vdso function is
  interrupted by a signal while in access-register-mode we end up with
  an endless signal loop until the signal stack is full.  The config
  change is for aligned struct pages, gives us 8% improvement with
  hackbench."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/3215: fix tty close handling
  s390/mm: have 16 byte aligned struct pages
  s390/gup: fix access_ok() usage in __get_user_pages_fast()
  s390/gup: add missing TASK_SIZE check to get_user_pages_fast()
  s390/topology: fix core id vs physical package id mix-up
  s390/signal: set correct address space control
parents 7279d7cb ae289dc1
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,7 @@ config S390
	select HAVE_MEMBLOCK_NODE_MAP
	select HAVE_MEMBLOCK_NODE_MAP
	select HAVE_CMPXCHG_LOCAL
	select HAVE_CMPXCHG_LOCAL
	select HAVE_CMPXCHG_DOUBLE
	select HAVE_CMPXCHG_DOUBLE
	select HAVE_ALIGNED_STRUCT_PAGE if SLUB
	select HAVE_VIRT_CPU_ACCOUNTING
	select HAVE_VIRT_CPU_ACCOUNTING
	select VIRT_CPU_ACCOUNTING
	select VIRT_CPU_ACCOUNTING
	select ARCH_DISCARD_MEMBLOCK
	select ARCH_DISCARD_MEMBLOCK
+1 −1
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@
#define PSW32_MASK_CC		0x00003000UL
#define PSW32_MASK_CC		0x00003000UL
#define PSW32_MASK_PM		0x00000f00UL
#define PSW32_MASK_PM		0x00000f00UL


#define PSW32_MASK_USER		0x00003F00UL
#define PSW32_MASK_USER		0x0000FF00UL


#define PSW32_ADDR_AMODE	0x80000000UL
#define PSW32_ADDR_AMODE	0x80000000UL
#define PSW32_ADDR_INSN		0x7FFFFFFFUL
#define PSW32_ADDR_INSN		0x7FFFFFFFUL
+3 −0
Original line number Original line Diff line number Diff line
@@ -8,6 +8,9 @@ struct cpu;


#ifdef CONFIG_SCHED_BOOK
#ifdef CONFIG_SCHED_BOOK


extern unsigned char cpu_socket_id[NR_CPUS];
#define topology_physical_package_id(cpu) (cpu_socket_id[cpu])

extern unsigned char cpu_core_id[NR_CPUS];
extern unsigned char cpu_core_id[NR_CPUS];
extern cpumask_t cpu_core_map[NR_CPUS];
extern cpumask_t cpu_core_map[NR_CPUS];


+2 −2
Original line number Original line Diff line number Diff line
@@ -239,7 +239,7 @@ typedef struct
#define PSW_MASK_EA		0x00000000UL
#define PSW_MASK_EA		0x00000000UL
#define PSW_MASK_BA		0x00000000UL
#define PSW_MASK_BA		0x00000000UL


#define PSW_MASK_USER		0x00003F00UL
#define PSW_MASK_USER		0x0000FF00UL


#define PSW_ADDR_AMODE		0x80000000UL
#define PSW_ADDR_AMODE		0x80000000UL
#define PSW_ADDR_INSN		0x7FFFFFFFUL
#define PSW_ADDR_INSN		0x7FFFFFFFUL
@@ -269,7 +269,7 @@ typedef struct
#define PSW_MASK_EA		0x0000000100000000UL
#define PSW_MASK_EA		0x0000000100000000UL
#define PSW_MASK_BA		0x0000000080000000UL
#define PSW_MASK_BA		0x0000000080000000UL


#define PSW_MASK_USER		0x00003F8180000000UL
#define PSW_MASK_USER		0x0000FF8180000000UL


#define PSW_ADDR_AMODE		0x0000000000000000UL
#define PSW_ADDR_AMODE		0x0000000000000000UL
#define PSW_ADDR_INSN		0xFFFFFFFFFFFFFFFFUL
#define PSW_ADDR_INSN		0xFFFFFFFFFFFFFFFFUL
+12 −2
Original line number Original line Diff line number Diff line
@@ -309,6 +309,10 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
	regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
	regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
		(__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 |
		(__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 |
		(__u64)(regs32.psw.addr & PSW32_ADDR_AMODE);
		(__u64)(regs32.psw.addr & PSW32_ADDR_AMODE);
	/* Check for invalid user address space control. */
	if ((regs->psw.mask & PSW_MASK_ASC) >= (psw_kernel_bits & PSW_MASK_ASC))
		regs->psw.mask = (psw_user_bits & PSW_MASK_ASC) |
			(regs->psw.mask & ~PSW_MASK_ASC);
	regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
	regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
	for (i = 0; i < NUM_GPRS; i++)
	for (i = 0; i < NUM_GPRS; i++)
		regs->gprs[i] = (__u64) regs32.gprs[i];
		regs->gprs[i] = (__u64) regs32.gprs[i];
@@ -481,7 +485,10 @@ static int setup_frame32(int sig, struct k_sigaction *ka,


	/* Set up registers for signal handler */
	/* Set up registers for signal handler */
	regs->gprs[15] = (__force __u64) frame;
	regs->gprs[15] = (__force __u64) frame;
	regs->psw.mask |= PSW_MASK_BA;		/* force amode 31 */
	/* Force 31 bit amode and default user address space control. */
	regs->psw.mask = PSW_MASK_BA |
		(psw_user_bits & PSW_MASK_ASC) |
		(regs->psw.mask & ~PSW_MASK_ASC);
	regs->psw.addr = (__force __u64) ka->sa.sa_handler;
	regs->psw.addr = (__force __u64) ka->sa.sa_handler;


	regs->gprs[2] = map_signal(sig);
	regs->gprs[2] = map_signal(sig);
@@ -549,7 +556,10 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,


	/* Set up registers for signal handler */
	/* Set up registers for signal handler */
	regs->gprs[15] = (__force __u64) frame;
	regs->gprs[15] = (__force __u64) frame;
	regs->psw.mask |= PSW_MASK_BA;		/* force amode 31 */
	/* Force 31 bit amode and default user address space control. */
	regs->psw.mask = PSW_MASK_BA |
		(psw_user_bits & PSW_MASK_ASC) |
		(regs->psw.mask & ~PSW_MASK_ASC);
	regs->psw.addr = (__u64) ka->sa.sa_handler;
	regs->psw.addr = (__u64) ka->sa.sa_handler;


	regs->gprs[2] = map_signal(sig);
	regs->gprs[2] = map_signal(sig);
Loading