Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Martin Schwidefsky: "A few more changes for v4.18: - wire up the two new system calls io_pgetevents and rseq - fix a register corruption in the expolines code for machines without EXRL - drastically reduce the memory utilization of the dasd driver - fix reference counting for KVM page table pages" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390: wire up rseq system call s390: wire up io_pgetevents system call s390/mm: fix refcount usage for 4K pgste s390/dasd: reduce the default queue depth and nr of hardware queues s390: Correct register corruption in critical section cleanup
This commit is contained in:
commit
b4d0562137
|
@ -160,6 +160,7 @@ config S390
|
|||
select HAVE_OPROFILE
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_RSEQ
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_VIRT_CPU_ACCOUNTING
|
||||
select MODULES_USE_ELF_RELA
|
||||
|
|
|
@ -183,3 +183,4 @@ COMPAT_SYSCALL_WRAP2(s390_guarded_storage, int, command, struct gs_cb *, gs_cb);
|
|||
COMPAT_SYSCALL_WRAP5(statx, int, dfd, const char __user *, path, unsigned, flags, unsigned, mask, struct statx __user *, buffer);
|
||||
COMPAT_SYSCALL_WRAP4(s390_sthyi, unsigned long, code, void __user *, info, u64 __user *, rc, unsigned long, flags);
|
||||
COMPAT_SYSCALL_WRAP5(kexec_file_load, int, kernel_fd, int, initrd_fd, unsigned long, cmdline_len, const char __user *, cmdline_ptr, unsigned long, flags)
|
||||
COMPAT_SYSCALL_WRAP4(rseq, struct rseq __user *, rseq, u32, rseq_len, int, flags, u32, sig)
|
||||
|
|
|
@ -357,6 +357,10 @@ ENTRY(system_call)
|
|||
stg %r2,__PT_R2(%r11) # store return value
|
||||
|
||||
.Lsysc_return:
|
||||
#ifdef CONFIG_DEBUG_RSEQ
|
||||
lgr %r2,%r11
|
||||
brasl %r14,rseq_syscall
|
||||
#endif
|
||||
LOCKDEP_SYS_EXIT
|
||||
.Lsysc_tif:
|
||||
TSTMSK __PT_FLAGS(%r11),_PIF_WORK
|
||||
|
@ -1265,7 +1269,7 @@ cleanup_critical:
|
|||
jl 0f
|
||||
clg %r9,BASED(.Lcleanup_table+104) # .Lload_fpu_regs_end
|
||||
jl .Lcleanup_load_fpu_regs
|
||||
0: BR_EX %r14
|
||||
0: BR_EX %r14,%r11
|
||||
|
||||
.align 8
|
||||
.Lcleanup_table:
|
||||
|
@ -1301,7 +1305,7 @@ cleanup_critical:
|
|||
ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE
|
||||
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
||||
larl %r9,sie_exit # skip forward to sie_exit
|
||||
BR_EX %r14
|
||||
BR_EX %r14,%r11
|
||||
#endif
|
||||
|
||||
.Lcleanup_system_call:
|
||||
|
|
|
@ -498,7 +498,7 @@ void do_signal(struct pt_regs *regs)
|
|||
}
|
||||
/* No longer in a system call */
|
||||
clear_pt_regs_flag(regs, PIF_SYSCALL);
|
||||
|
||||
rseq_signal_deliver(&ksig, regs);
|
||||
if (is_compat_task())
|
||||
handle_signal32(&ksig, oldset, regs);
|
||||
else
|
||||
|
@ -537,4 +537,5 @@ void do_notify_resume(struct pt_regs *regs)
|
|||
{
|
||||
clear_thread_flag(TIF_NOTIFY_RESUME);
|
||||
tracehook_notify_resume(regs);
|
||||
rseq_handle_notify_resume(NULL, regs);
|
||||
}
|
||||
|
|
|
@ -389,3 +389,5 @@
|
|||
379 common statx sys_statx compat_sys_statx
|
||||
380 common s390_sthyi sys_s390_sthyi compat_sys_s390_sthyi
|
||||
381 common kexec_file_load sys_kexec_file_load compat_sys_kexec_file_load
|
||||
382 common io_pgetevents sys_io_pgetevents compat_sys_io_pgetevents
|
||||
383 common rseq sys_rseq compat_sys_rseq
|
||||
|
|
|
@ -252,6 +252,8 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
|
|||
spin_unlock_bh(&mm->context.lock);
|
||||
if (mask != 0)
|
||||
return;
|
||||
} else {
|
||||
atomic_xor_bits(&page->_refcount, 3U << 24);
|
||||
}
|
||||
|
||||
pgtable_page_dtor(page);
|
||||
|
@ -304,6 +306,8 @@ static void __tlb_remove_table(void *_table)
|
|||
break;
|
||||
/* fallthrough */
|
||||
case 3: /* 4K page table with pgstes */
|
||||
if (mask & 3)
|
||||
atomic_xor_bits(&page->_refcount, 3 << 24);
|
||||
pgtable_page_dtor(page);
|
||||
__free_page(page);
|
||||
break;
|
||||
|
|
|
@ -41,6 +41,15 @@
|
|||
|
||||
#define DASD_DIAG_MOD "dasd_diag_mod"
|
||||
|
||||
static unsigned int queue_depth = 32;
|
||||
static unsigned int nr_hw_queues = 4;
|
||||
|
||||
module_param(queue_depth, uint, 0444);
|
||||
MODULE_PARM_DESC(queue_depth, "Default queue depth for new DASD devices");
|
||||
|
||||
module_param(nr_hw_queues, uint, 0444);
|
||||
MODULE_PARM_DESC(nr_hw_queues, "Default number of hardware queues for new DASD devices");
|
||||
|
||||
/*
|
||||
* SECTION: exported variables of dasd.c
|
||||
*/
|
||||
|
@ -3115,8 +3124,8 @@ static int dasd_alloc_queue(struct dasd_block *block)
|
|||
|
||||
block->tag_set.ops = &dasd_mq_ops;
|
||||
block->tag_set.cmd_size = sizeof(struct dasd_ccw_req);
|
||||
block->tag_set.nr_hw_queues = DASD_NR_HW_QUEUES;
|
||||
block->tag_set.queue_depth = DASD_MAX_LCU_DEV * DASD_REQ_PER_DEV;
|
||||
block->tag_set.nr_hw_queues = nr_hw_queues;
|
||||
block->tag_set.queue_depth = queue_depth;
|
||||
block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
|
||||
|
||||
rc = blk_mq_alloc_tag_set(&block->tag_set);
|
||||
|
|
|
@ -228,14 +228,6 @@ struct dasd_ccw_req {
|
|||
#define DASD_CQR_SUPPRESS_IL 6 /* Suppress 'Incorrect Length' error */
|
||||
#define DASD_CQR_SUPPRESS_CR 7 /* Suppress 'Command Reject' error */
|
||||
|
||||
/*
|
||||
* There is no reliable way to determine the number of available CPUs on
|
||||
* LPAR but there is no big performance difference between 1 and the
|
||||
* maximum CPU number.
|
||||
* 64 is a good trade off performance wise.
|
||||
*/
|
||||
#define DASD_NR_HW_QUEUES 64
|
||||
#define DASD_MAX_LCU_DEV 256
|
||||
#define DASD_REQ_PER_DEV 4
|
||||
|
||||
/* Signature for error recovery functions. */
|
||||
|
|
Loading…
Reference in New Issue