s390 patches for 3.2-rc3
Subsystems (5)
Hi Linus,
please pull from 'for-linus' branch of
git://git390.marist.edu/pub/scm/linux-2.6.git for-linus
to receive the following updates:
Heiko Carstens (3):
[S390] wire up process_vm syscalls
[S390] pfault: ignore leftover completion interrupts [S390] topology: fix topology on z10 machines
Holger Dengler (1):
[S390] ap: Setup processing for messages in request queue.
Jan Glauber (2):
[S390] avoid STCKF if running in ESA mode
[S390] crypto: avoid MSA3 and MSA4 instructions in ESA mode
Martin Schwidefsky (2):
[S390] fix pgste update logic
[S390] incorrect note program header
Michael Holzheu (2):
[S390] Kconfig: Select CONFIG_KEXEC for CONFIG_CRASH_DUMP [S390] zfcpdump: Do not initialize zfcpdump in kdump mode
arch/s390/Kconfig | 1 + arch/s390/crypto/crypt_s390.h | 7 ++++- arch/s390/include/asm/pgtable.h | 12 +++++++-- arch/s390/include/asm/setup.h | 3 ++ arch/s390/include/asm/timex.h | 2 +- arch/s390/include/asm/unistd.h | 4 ++- arch/s390/kernel/compat_wrapper.S | 20 ++++++++++++++++ arch/s390/kernel/early.c | 2 + arch/s390/kernel/setup.c | 4 ++- arch/s390/kernel/syscalls.S | 2 + arch/s390/kernel/topology.c | 45 +++++++++++++++++++++++++++++++----- arch/s390/kernel/vmlinux.lds.S | 2 + arch/s390/mm/fault.c | 9 +++++- drivers/s390/char/zcore.c | 2 + drivers/s390/crypto/ap_bus.c | 23 ++++++++++++++----- 15 files changed, 115 insertions(+), 23 deletions(-)
arch/s390/Kconfig +1 -0
@@ -572,6 +572,7 @@ config KEXEC config CRASH_DUMP bool "kernel crash dumps" depends on 64BIT + select KEXEC help Generate crash dump after being started by kexec. Crash dump kernels are loaded in the main kernel with kexec-tools
arch/s390/crypto/crypt_s390.h +5 -2
@@ -368,9 +368,12 @@ static inline int crypt_s390_func_available(int func,if (facility_mask &CRYPT_S390_MSA && !test_facility (17 ))return 0 ; -if (facility_mask &CRYPT_S390_MSA3 && !test_facility (76 )) + +if (facility_mask &CRYPT_S390_MSA3 && + (!test_facility (2 ) || !test_facility (76 )))return 0 ; -if (facility_mask &CRYPT_S390_MSA4 && !test_facility (77 )) +if (facility_mask &CRYPT_S390_MSA4 && + (!test_facility (2 ) || !test_facility (77 )))return 0 ;switch (func &CRYPT_S390_OP_MASK ) {
arch/s390/include/asm/pgtable.h +9 -3
@@ -593,6 +593,8 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)unsigned long address, bits;unsigned char skey; +if (!pte_present (*ptep)) +return pgste; address =pte_val (*ptep) &PAGE_MASK ; skey =page_get_storage_key (address); bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
@@ -625,6 +627,8 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste)#ifdef CONFIG_PGSTE int young; +if (!pte_present (*ptep)) +return pgste; young =page_reset_referenced (pte_val (*ptep) &PAGE_MASK );/* Transfer page referenced bit to pte software bit (host view) */ if (young || (pgste_val (pgste) &RCP_HR_BIT ))
@@ -638,13 +642,15 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) } -static inline void pgste_set_pte (pte_t *ptep,pgste_t pgste) +static inline void pgste_set_pte (pte_t *ptep,pgste_t pgste,pte_t entry) {#ifdef CONFIG_PGSTE unsigned long address;unsigned long okey, nkey; - address =pte_val (*ptep) &PAGE_MASK ; +if (!pte_present (entry)) +return ; + address =pte_val (entry) &PAGE_MASK ; okey = nkey =page_get_storage_key (address); nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT);/* Set page access key and fetch protection bit from pgste */
@@ -712,7 +718,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,if (mm_has_pgste (mm)) { pgste =pgste_get_lock (ptep); -pgste_set_pte (ptep, pgste); +pgste_set_pte (ptep, pgste, entry); *ptep = entry;pgste_set_unlock (ptep, pgste); }else
arch/s390/include/asm/setup.h +3 -0
@@ -82,6 +82,7 @@ extern unsigned int user_mode;#define MACHINE_FLAG_LPAR (1UL << 12)#define MACHINE_FLAG_SPP (1UL << 13)#define MACHINE_FLAG_TOPOLOGY (1UL << 14) +#define MACHINE_FLAG_STCKF (1UL << 15)#define MACHINE_IS_VM (S390_lowcore.machine_flags & MACHINE_FLAG_VM)#define MACHINE_IS_KVM (S390_lowcore.machine_flags & MACHINE_FLAG_KVM)
@@ -100,6 +101,7 @@ extern unsigned int user_mode;#define MACHINE_HAS_PFMF (0)#define MACHINE_HAS_SPP (0)#define MACHINE_HAS_TOPOLOGY (0) +#define MACHINE_HAS_STCKF (0)#else /* __s390x__ */ #define MACHINE_HAS_IEEE (1)#define MACHINE_HAS_CSP (1)
@@ -111,6 +113,7 @@ extern unsigned int user_mode;#define MACHINE_HAS_PFMF (S390_lowcore.machine_flags & MACHINE_FLAG_PFMF)#define MACHINE_HAS_SPP (S390_lowcore.machine_flags & MACHINE_FLAG_SPP)#define MACHINE_HAS_TOPOLOGY (S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY) +#define MACHINE_HAS_STCKF (S390_lowcore.machine_flags & MACHINE_FLAG_STCKF)#endif /* __s390x__ */ #define ZFCPDUMP_HSA_SIZE (32UL<<20)
arch/s390/include/asm/timex.h +1 -1
@@ -90,7 +90,7 @@ static inline unsigned long long get_clock_fast(void) {unsigned long long clk; -if (test_facility (25 )) +if (MACHINE_HAS_STCKF ) asmvolatile (".insn s,0xb27c0000,%0" :"=Q" (clk) : :"cc" );else clk =get_clock ();
arch/s390/include/asm/unistd.h +3 -1
@@ -277,7 +277,9 @@#define __NR_clock_adjtime 337#define __NR_syncfs 338#define __NR_setns 339 -#define NR_syscalls 340 +#define __NR_process_vm_readv 340 +#define __NR_process_vm_writev 341 +#define NR_syscalls 342/* * There are some system calls that are not present on 64 bit, some
arch/s390/kernel/compat_wrapper.S +20 -0
@@ -1627,3 +1627,23 @@ ENTRY(sys_setns_wrapper) lgfr %r2,%r2 # int lgfr %r3,%r3 # int jg sys_setns + +ENTRY(compat_sys_process_vm_readv_wrapper) + lgfr %r2,%r2 # compat_pid_t + llgtr %r3,%r3 # struct compat_iovec __user * + llgfr %r4,%r4 # unsigned long + llgtr %r5,%r5 # struct compat_iovec __user * + llgfr %r6,%r6 # unsigned long + llgf %r0,164(%r15) # unsigned long + stg %r0,160(%r15) + jg sys_process_vm_readv + +ENTRY(compat_sys_process_vm_writev_wrapper) + lgfr %r2,%r2 # compat_pid_t + llgtr %r3,%r3 # struct compat_iovec __user * + llgfr %r4,%r4 # unsigned long + llgtr %r5,%r5 # struct compat_iovec __user * + llgfr %r6,%r6 # unsigned long + llgf %r0,164(%r15) # unsigned long + stg %r0,160(%r15) + jg sys_process_vm_writev
arch/s390/kernel/early.c +2 -0
@@ -390,6 +390,8 @@ static __init void detect_machine_facilities(void) S390_lowcore.machine_flags |=MACHINE_FLAG_MVCOS ;if (test_facility (40 )) S390_lowcore.machine_flags |=MACHINE_FLAG_SPP ; +if (test_facility (25 )) + S390_lowcore.machine_flags |=MACHINE_FLAG_STCKF ;#endif }
arch/s390/kernel/setup.c +3 -1
@@ -211,6 +211,8 @@ static void __init setup_zfcpdump(unsigned int console_devno)if (ipl_info.type !=IPL_TYPE_FCP_DUMP )return ; +if (OLDMEM_BASE ) +return ;if (console_devno !=-1 )sprintf (str," cio_ignore=all,!0.0.%04x,!0.0.%04x" , ipl_info.data.fcp.dev_id.devno, console_devno);
@@ -482,7 +484,7 @@ static void __init setup_memory_end(void)#ifdef CONFIG_ZFCPDUMP -if (ipl_info.type ==IPL_TYPE_FCP_DUMP ) { +if (ipl_info.type ==IPL_TYPE_FCP_DUMP && !OLDMEM_BASE ) { memory_end =ZFCPDUMP_HSA_SIZE ; memory_end_set =1 ; }
arch/s390/kernel/syscalls.S +2 -0
@@ -348,3 +348,5 @@ SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) +SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wrapper) /* 340 */ +SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)
arch/s390/kernel/topology.c +38 -7
89 lines not on this page · raw message
arch/s390/kernel/vmlinux.lds.S +2 -0
@@ -43,6 +43,8 @@ SECTIONS NOTES :text :note + .dummy : { *(.dummy) } :data + RODATA #ifdef CONFIG_SHARED_KERNEL
arch/s390/mm/fault.c +7 -2
@@ -587,8 +587,13 @@ static void pfault_interrupt(unsigned int ext_int_code, }else {/* Completion interrupt was faster than initial * interrupt. Set pfault_wait to -1 so the initial -* interrupt doesn't put the task to sleep. */ - tsk->thread.pfault_wait =-1 ; +* interrupt doesn't put the task to sleep. +* If the task is not running, ignore the completion +* interrupt since it must be a leftover of a PFAULT +* CANCEL operation which didn't remove all pending +* completion interrupts. */ +if (tsk->state ==TASK_RUNNING ) + tsk->thread.pfault_wait =-1 ; }put_task_struct (tsk); }else {
drivers/s390/char/zcore.c +2 -0
@@ -641,6 +641,8 @@ static int __init zcore_init(void)if (ipl_info.type !=IPL_TYPE_FCP_DUMP )return -ENODATA ; +if (OLDMEM_BASE ) +return -ENODATA ; zcore_dbf =debug_register ("zcore" ,4 ,1 ,4 *sizeof (long ));debug_register_view (zcore_dbf, &debug_sprintf_view);
drivers/s390/crypto/ap_bus.c +17 -6
@@ -1271,18 +1271,16 @@ ap_config_timeout(unsigned long ptr) }/** -* ap_schedule_poll_timer(): Schedule poll timer. +* __ap_schedule_poll_timer(): Schedule poll timer. * * Set up the timer to run the poll tasklet */ -static inline void ap_schedule_poll_timer (void ) +static inline void __ap_schedule_poll_timer (void ) {ktime_t hr_time;spin_lock_bh (&ap_poll_timer_lock); -if (ap_using_interrupts () || ap_suspend_flag) - goto out; -if (hrtimer_is_queued (&ap_poll_timer)) +if (hrtimer_is_queued (&ap_poll_timer) || ap_suspend_flag) goto out;if (ktime_to_ns (hrtimer_expires_remaining (&ap_poll_timer)) <=0 ) { hr_time =ktime_set (0 , poll_timeout);
@@ -1294,6 +1292,18 @@ out: }/** +* ap_schedule_poll_timer(): Schedule poll timer. +* +* Set up the timer to run the poll tasklet +*/ +static inline void ap_schedule_poll_timer (void ) +{ +if (ap_using_interrupts ()) +return ; +__ap_schedule_poll_timer (); +} + +/** * ap_poll_read(): Receive pending reply messages from an AP device. * @ap_dev: pointer to the AP device * @flags: pointer to control flags, bit 2^0 is set if another poll is
@@ -1374,8 +1384,9 @@ static int ap_poll_write(struct ap_device *ap_dev, unsigned long *flags) *flags |=1 ; *flags |=2 ;break ; -case AP_RESPONSE_Q_FULL :case AP_RESPONSE_RESET_IN_PROGRESS : +__ap_schedule_poll_timer (); +case AP_RESPONSE_Q_FULL : *flags |=2 ;break ;case AP_RESPONSE_MESSAGE_TOO_BIG :