Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: "There are a couple of new things for s390 with this merge request: - a new scheduling domain "drawer" is added to reflect the unusual topology found on z13 machines. Performance tests showed up to 8 percent gain with the additional domain. - the new crc-32 checksum crypto module uses the vector-galois-field multiply and sum SIMD instruction to speed up crc-32 and crc-32c. - proper __ro_after_init support, this requires RO_AFTER_INIT_DATA in the generic vmlinux.lds linker script definitions. - kcov instrumentation support. A prerequisite for that is the inline assembly basic block cleanup, which is the reason for the net/iucv/iucv.c change. - support for 2GB pages is added to the hugetlbfs backend. Then there are two removals: - the oprofile hardware sampling support is dead code and is removed. The oprofile user space uses the perf interface nowadays. - the ETR clock synchronization is removed, this has been superseeded be the STP clock synchronization. And it always has been "interesting" code.. And the usual bug fixes and cleanups" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (82 commits) s390/pci: Delete an unnecessary check before the function call "pci_dev_put" s390/smp: clean up a condition s390/cio/chp : Remove deprecated create_singlethread_workqueue s390/chsc: improve channel path descriptor determination s390/chsc: sanitize fmt check for chp_desc determination s390/cio: make fmt1 channel path descriptor optional s390/chsc: fix ioctl CHSC_INFO_CU command s390/cio/device_ops: fix kernel doc s390/cio: allow to reset channel measurement block s390/console: Make preferred console handling more consistent s390/mm: fix gmap tlb flush issues s390/mm: add support for 2GB hugepages s390: have unique symbol for __switch_to address s390/cpuinfo: show maximum thread id s390/ptrace: clarify bits in the per_struct s390: stack address vs thread_info s390: remove pointless load within __switch_to s390: enable kcov support s390/cpumf: use basic block for ecctr inline assembly s390/hypfs: use basic block for diag inline assembly ...
This commit is contained in:
@@ -1,6 +1,41 @@
|
||||
/*
|
||||
* In-kernel FPU support functions
|
||||
*
|
||||
*
|
||||
* Consider these guidelines before using in-kernel FPU functions:
|
||||
*
|
||||
* 1. Use kernel_fpu_begin() and kernel_fpu_end() to enclose all in-kernel
|
||||
* use of floating-point or vector registers and instructions.
|
||||
*
|
||||
* 2. For kernel_fpu_begin(), specify the vector register range you want to
|
||||
* use with the KERNEL_VXR_* constants. Consider these usage guidelines:
|
||||
*
|
||||
* a) If your function typically runs in process-context, use the lower
|
||||
* half of the vector registers, for example, specify KERNEL_VXR_LOW.
|
||||
* b) If your function typically runs in soft-irq or hard-irq context,
|
||||
* prefer using the upper half of the vector registers, for example,
|
||||
* specify KERNEL_VXR_HIGH.
|
||||
*
|
||||
* If you adhere to these guidelines, an interrupted process context
|
||||
* does not require to save and restore vector registers because of
|
||||
* disjoint register ranges.
|
||||
*
|
||||
* Also note that the __kernel_fpu_begin()/__kernel_fpu_end() functions
|
||||
* includes logic to save and restore up to 16 vector registers at once.
|
||||
*
|
||||
* 3. You can nest kernel_fpu_begin()/kernel_fpu_end() by using different
|
||||
* struct kernel_fpu states. Vector registers that are in use by outer
|
||||
* levels are saved and restored. You can minimize the save and restore
|
||||
* effort by choosing disjoint vector register ranges.
|
||||
*
|
||||
* 5. To use vector floating-point instructions, specify the KERNEL_FPC
|
||||
* flag to save and restore floating-point controls in addition to any
|
||||
* vector register range.
|
||||
*
|
||||
* 6. To use floating-point registers and instructions only, specify the
|
||||
* KERNEL_FPR flag. This flag triggers a save and restore of vector
|
||||
* registers V0 to V15 and floating-point controls.
|
||||
*
|
||||
* Copyright IBM Corp. 2015
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
*/
|
||||
@@ -8,6 +43,8 @@
|
||||
#ifndef _ASM_S390_FPU_API_H
|
||||
#define _ASM_S390_FPU_API_H
|
||||
|
||||
#include <linux/preempt.h>
|
||||
|
||||
void save_fpu_regs(void);
|
||||
|
||||
static inline int test_fp_ctl(u32 fpc)
|
||||
@@ -27,4 +64,42 @@ static inline int test_fp_ctl(u32 fpc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
#define KERNEL_VXR_V0V7 1
|
||||
#define KERNEL_VXR_V8V15 2
|
||||
#define KERNEL_VXR_V16V23 4
|
||||
#define KERNEL_VXR_V24V31 8
|
||||
#define KERNEL_FPR 16
|
||||
#define KERNEL_FPC 256
|
||||
|
||||
#define KERNEL_VXR_LOW (KERNEL_VXR_V0V7|KERNEL_VXR_V8V15)
|
||||
#define KERNEL_VXR_MID (KERNEL_VXR_V8V15|KERNEL_VXR_V16V23)
|
||||
#define KERNEL_VXR_HIGH (KERNEL_VXR_V16V23|KERNEL_VXR_V24V31)
|
||||
|
||||
#define KERNEL_FPU_MASK (KERNEL_VXR_LOW|KERNEL_VXR_HIGH|KERNEL_FPR)
|
||||
|
||||
struct kernel_fpu;
|
||||
|
||||
/*
|
||||
* Note the functions below must be called with preemption disabled.
|
||||
* Do not enable preemption before calling __kernel_fpu_end() to prevent
|
||||
* an corruption of an existing kernel FPU state.
|
||||
*
|
||||
* Prefer using the kernel_fpu_begin()/kernel_fpu_end() pair of functions.
|
||||
*/
|
||||
void __kernel_fpu_begin(struct kernel_fpu *state, u32 flags);
|
||||
void __kernel_fpu_end(struct kernel_fpu *state);
|
||||
|
||||
|
||||
static inline void kernel_fpu_begin(struct kernel_fpu *state, u32 flags)
|
||||
{
|
||||
preempt_disable();
|
||||
__kernel_fpu_begin(state, flags);
|
||||
}
|
||||
|
||||
static inline void kernel_fpu_end(struct kernel_fpu *state)
|
||||
{
|
||||
__kernel_fpu_end(state);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_FPU_API_H */
|
||||
|
Reference in New Issue
Block a user