You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: - The remaining patches for the z13 machine support: kernel build option for z13, the cache synonym avoidance, SMT support, compare-and-delay for spinloops and the CES5S crypto adapater. - The ftrace support for function tracing with the gcc hotpatch option. This touches common code Makefiles, Steven is ok with the changes. - The hypfs file system gets an extension to access diagnose 0x0c data in user space for performance analysis for Linux running under z/VM. - The iucv hvc console gets wildcard spport for the user id filtering. - The cacheinfo code is converted to use the generic infrastructure. - Cleanup and bug fixes. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (42 commits) s390/process: free vx save area when releasing tasks s390/hypfs: Eliminate hypfs interval s390/hypfs: Add diagnose 0c support s390/cacheinfo: don't use smp_processor_id() in preemptible context s390/zcrypt: fixed domain scanning problem (again) s390/smp: increase maximum value of NR_CPUS to 512 s390/jump label: use different nop instruction s390/jump label: add sanity checks s390/mm: correct missing space when reporting user process faults s390/dasd: cleanup profiling s390/dasd: add locking for global_profile access s390/ftrace: hotpatch support for function tracing ftrace: let notrace function attribute disable hotpatching if necessary ftrace: allow architectures to specify ftrace compile options s390: reintroduce diag 44 calls for cpu_relax() s390/zcrypt: Add support for new crypto express (CEX5S) adapter. s390/zcrypt: Number of supported ap domains is not retrievable. s390/spinlock: add compare-and-delay to lock wait loops s390/tape: remove redundant if statement s390/hvc_iucv: add simple wildcard matches to the iucv allow filter ...
This commit is contained in:
+233
-252
File diff suppressed because it is too large
Load Diff
@@ -726,10 +726,14 @@ KBUILD_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
ifndef CC_FLAGS_FTRACE
|
||||
CC_FLAGS_FTRACE := -pg
|
||||
endif
|
||||
export CC_FLAGS_FTRACE
|
||||
ifdef CONFIG_HAVE_FENTRY
|
||||
CC_USING_FENTRY := $(call cc-option, -mfentry -DCC_USING_FENTRY)
|
||||
endif
|
||||
KBUILD_CFLAGS += -pg $(CC_USING_FENTRY)
|
||||
KBUILD_CFLAGS += $(CC_FLAGS_FTRACE) $(CC_USING_FENTRY)
|
||||
KBUILD_AFLAGS += $(CC_USING_FENTRY)
|
||||
ifdef CONFIG_DYNAMIC_FTRACE
|
||||
ifdef CONFIG_HAVE_C_RECORDMCOUNT
|
||||
|
||||
+34
-8
@@ -66,6 +66,7 @@ config S390
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_SG_CHAIN
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select ARCH_INLINE_READ_LOCK
|
||||
select ARCH_INLINE_READ_LOCK_BH
|
||||
@@ -116,7 +117,6 @@ config S390
|
||||
select HAVE_BPF_JIT if 64BIT && PACK_STACK
|
||||
select HAVE_CMPXCHG_DOUBLE
|
||||
select HAVE_CMPXCHG_LOCAL
|
||||
select HAVE_C_RECORDMCOUNT
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DYNAMIC_FTRACE if 64BIT
|
||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS if 64BIT
|
||||
@@ -151,7 +151,6 @@ config S390
|
||||
select TTY
|
||||
select VIRT_CPU_ACCOUNTING
|
||||
select VIRT_TO_BUS
|
||||
select ARCH_HAS_SG_CHAIN
|
||||
|
||||
config SCHED_OMIT_FRAME_POINTER
|
||||
def_bool y
|
||||
@@ -185,6 +184,10 @@ config HAVE_MARCH_ZEC12_FEATURES
|
||||
def_bool n
|
||||
select HAVE_MARCH_Z196_FEATURES
|
||||
|
||||
config HAVE_MARCH_Z13_FEATURES
|
||||
def_bool n
|
||||
select HAVE_MARCH_ZEC12_FEATURES
|
||||
|
||||
choice
|
||||
prompt "Processor type"
|
||||
default MARCH_G5
|
||||
@@ -244,6 +247,14 @@ config MARCH_ZEC12
|
||||
2827 series). The kernel will be slightly faster but will not work on
|
||||
older machines.
|
||||
|
||||
config MARCH_Z13
|
||||
bool "IBM z13"
|
||||
select HAVE_MARCH_Z13_FEATURES if 64BIT
|
||||
help
|
||||
Select this to enable optimizations for IBM z13 (2964 series).
|
||||
The kernel will be slightly faster but will not work on older
|
||||
machines.
|
||||
|
||||
endchoice
|
||||
|
||||
config MARCH_G5_TUNE
|
||||
@@ -267,6 +278,9 @@ config MARCH_Z196_TUNE
|
||||
config MARCH_ZEC12_TUNE
|
||||
def_bool TUNE_ZEC12 || MARCH_ZEC12 && TUNE_DEFAULT
|
||||
|
||||
config MARCH_Z13_TUNE
|
||||
def_bool TUNE_Z13 || MARCH_Z13 && TUNE_DEFAULT
|
||||
|
||||
choice
|
||||
prompt "Tune code generation"
|
||||
default TUNE_DEFAULT
|
||||
@@ -305,6 +319,9 @@ config TUNE_Z196
|
||||
config TUNE_ZEC12
|
||||
bool "IBM zBC12 and zEC12"
|
||||
|
||||
config TUNE_Z13
|
||||
bool "IBM z13"
|
||||
|
||||
endchoice
|
||||
|
||||
config 64BIT
|
||||
@@ -356,14 +373,14 @@ config SMP
|
||||
Even if you don't know what to do here, say Y.
|
||||
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-256)"
|
||||
range 2 256
|
||||
int "Maximum number of CPUs (2-512)"
|
||||
range 2 512
|
||||
depends on SMP
|
||||
default "32" if !64BIT
|
||||
default "64" if 64BIT
|
||||
help
|
||||
This allows you to specify the maximum number of CPUs which this
|
||||
kernel will support. The maximum supported value is 256 and the
|
||||
kernel will support. The maximum supported value is 512 and the
|
||||
minimum value which makes sense is 2.
|
||||
|
||||
This is purely to save memory - each supported CPU adds
|
||||
@@ -378,17 +395,26 @@ config HOTPLUG_CPU
|
||||
can be controlled through /sys/devices/system/cpu/cpu#.
|
||||
Say N if you want to disable CPU hotplug.
|
||||
|
||||
config SCHED_SMT
|
||||
def_bool n
|
||||
|
||||
config SCHED_MC
|
||||
def_bool n
|
||||
|
||||
config SCHED_BOOK
|
||||
def_bool n
|
||||
|
||||
config SCHED_TOPOLOGY
|
||||
def_bool y
|
||||
prompt "Book scheduler support"
|
||||
prompt "Topology scheduler support"
|
||||
depends on SMP
|
||||
select SCHED_SMT
|
||||
select SCHED_MC
|
||||
select SCHED_BOOK
|
||||
help
|
||||
Book scheduler support improves the CPU scheduler's decision making
|
||||
when dealing with machines that have several books.
|
||||
Topology scheduler support improves the CPU scheduler's decision
|
||||
making when dealing with machines that have multi-threading,
|
||||
multiple cores or multiple books.
|
||||
|
||||
source kernel/Kconfig.preempt
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ mflags-$(CONFIG_MARCH_Z9_109) := -march=z9-109
|
||||
mflags-$(CONFIG_MARCH_Z10) := -march=z10
|
||||
mflags-$(CONFIG_MARCH_Z196) := -march=z196
|
||||
mflags-$(CONFIG_MARCH_ZEC12) := -march=zEC12
|
||||
mflags-$(CONFIG_MARCH_Z13) := -march=z13
|
||||
|
||||
aflags-y += $(mflags-y)
|
||||
cflags-y += $(mflags-y)
|
||||
@@ -53,6 +54,7 @@ cflags-$(CONFIG_MARCH_Z9_109_TUNE) += -mtune=z9-109
|
||||
cflags-$(CONFIG_MARCH_Z10_TUNE) += -mtune=z10
|
||||
cflags-$(CONFIG_MARCH_Z196_TUNE) += -mtune=z196
|
||||
cflags-$(CONFIG_MARCH_ZEC12_TUNE) += -mtune=zEC12
|
||||
cflags-$(CONFIG_MARCH_Z13_TUNE) += -mtune=z13
|
||||
|
||||
#KBUILD_IMAGE is necessary for make rpm
|
||||
KBUILD_IMAGE :=arch/s390/boot/image
|
||||
@@ -85,6 +87,16 @@ ifeq ($(call cc-option-yn,-mwarn-dynamicstack),y)
|
||||
cflags-$(CONFIG_WARN_DYNAMIC_STACK) += -mwarn-dynamicstack
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
# make use of hotpatch feature if the compiler supports it
|
||||
cc_hotpatch := -mhotpatch=0,3
|
||||
ifeq ($(call cc-option-yn,$(cc_hotpatch)),y)
|
||||
CC_FLAGS_FTRACE := $(cc_hotpatch)
|
||||
KBUILD_AFLAGS += -DCC_USING_HOTPATCH
|
||||
KBUILD_CFLAGS += -DCC_USING_HOTPATCH
|
||||
endif
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += -mbackchain -msoft-float $(cflags-y)
|
||||
KBUILD_CFLAGS += -pipe -fno-strength-reduce -Wno-sign-compare
|
||||
KBUILD_AFLAGS += $(aflags-y)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/sclp.h>
|
||||
#include <asm/ipl.h>
|
||||
#include "sizes.h"
|
||||
|
||||
@@ -63,8 +64,6 @@ static unsigned long free_mem_end_ptr;
|
||||
#include "../../../../lib/decompress_unxz.c"
|
||||
#endif
|
||||
|
||||
extern _sclp_print_early(const char *);
|
||||
|
||||
static int puts(const char *s)
|
||||
{
|
||||
_sclp_print_early(s);
|
||||
|
||||
@@ -555,7 +555,6 @@ CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
|
||||
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
|
||||
CONFIG_SLUB_DEBUG_ON=y
|
||||
CONFIG_SLUB_STATS=y
|
||||
CONFIG_DEBUG_KMEMLEAK=y
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
CONFIG_DEBUG_VM=y
|
||||
CONFIG_DEBUG_VM_RB=y
|
||||
@@ -563,6 +562,7 @@ CONFIG_MEMORY_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_DEBUG_PER_CPU_MAPS=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
|
||||
|
||||
@@ -540,6 +540,7 @@ CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MEMORY_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_RCU_TORTURE_TEST=m
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
|
||||
@@ -537,6 +537,7 @@ CONFIG_FRAME_WARN=1024
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_RCU_TORTURE_TEST=m
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
|
||||
@@ -71,6 +71,7 @@ CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
# CONFIG_FTRACE is not set
|
||||
|
||||
@@ -134,7 +134,7 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
|
||||
|
||||
static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
||||
{
|
||||
const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
|
||||
struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
if (unlikely(need_fallback(sctx->key_len))) {
|
||||
crypto_cipher_encrypt_one(sctx->fallback.cip, out, in);
|
||||
@@ -159,7 +159,7 @@ static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
||||
|
||||
static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
||||
{
|
||||
const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
|
||||
struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
if (unlikely(need_fallback(sctx->key_len))) {
|
||||
crypto_cipher_decrypt_one(sctx->fallback.cip, out, in);
|
||||
|
||||
+1
-6
@@ -14,7 +14,6 @@ CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_RESOURCE_COUNTERS=y
|
||||
CONFIG_MEMCG=y
|
||||
CONFIG_MEMCG_SWAP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
@@ -22,12 +21,8 @@ CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_RD_BZIP2=y
|
||||
CONFIG_RD_LZMA=y
|
||||
CONFIG_RD_XZ=y
|
||||
CONFIG_RD_LZO=y
|
||||
CONFIG_RD_LZ4=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
|
||||
@@ -5,3 +5,4 @@
|
||||
obj-$(CONFIG_S390_HYPFS_FS) += s390_hypfs.o
|
||||
|
||||
s390_hypfs-objs := inode.o hypfs_diag.o hypfs_vm.o hypfs_dbfs.o hypfs_sprp.o
|
||||
s390_hypfs-objs += hypfs_diag0c.o
|
||||
|
||||
@@ -37,6 +37,10 @@ extern int hypfs_vm_init(void);
|
||||
extern void hypfs_vm_exit(void);
|
||||
extern int hypfs_vm_create_files(struct dentry *root);
|
||||
|
||||
/* VM diagnose 0c */
|
||||
int hypfs_diag0c_init(void);
|
||||
void hypfs_diag0c_exit(void);
|
||||
|
||||
/* Set Partition-Resource Parameter */
|
||||
int hypfs_sprp_init(void);
|
||||
void hypfs_sprp_exit(void);
|
||||
@@ -49,7 +53,6 @@ struct hypfs_dbfs_data {
|
||||
void *buf_free_ptr;
|
||||
size_t size;
|
||||
struct hypfs_dbfs_file *dbfs_file;
|
||||
struct kref kref;
|
||||
};
|
||||
|
||||
struct hypfs_dbfs_file {
|
||||
@@ -61,8 +64,6 @@ struct hypfs_dbfs_file {
|
||||
unsigned long);
|
||||
|
||||
/* Private data for hypfs_dbfs.c */
|
||||
struct hypfs_dbfs_data *data;
|
||||
struct delayed_work data_free_work;
|
||||
struct mutex lock;
|
||||
struct dentry *dentry;
|
||||
};
|
||||
|
||||
@@ -17,33 +17,16 @@ static struct hypfs_dbfs_data *hypfs_dbfs_data_alloc(struct hypfs_dbfs_file *f)
|
||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return NULL;
|
||||
kref_init(&data->kref);
|
||||
data->dbfs_file = f;
|
||||
return data;
|
||||
}
|
||||
|
||||
static void hypfs_dbfs_data_free(struct kref *kref)
|
||||
static void hypfs_dbfs_data_free(struct hypfs_dbfs_data *data)
|
||||
{
|
||||
struct hypfs_dbfs_data *data;
|
||||
|
||||
data = container_of(kref, struct hypfs_dbfs_data, kref);
|
||||
data->dbfs_file->data_free(data->buf_free_ptr);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static void data_free_delayed(struct work_struct *work)
|
||||
{
|
||||
struct hypfs_dbfs_data *data;
|
||||
struct hypfs_dbfs_file *df;
|
||||
|
||||
df = container_of(work, struct hypfs_dbfs_file, data_free_work.work);
|
||||
mutex_lock(&df->lock);
|
||||
data = df->data;
|
||||
df->data = NULL;
|
||||
mutex_unlock(&df->lock);
|
||||
kref_put(&data->kref, hypfs_dbfs_data_free);
|
||||
}
|
||||
|
||||
static ssize_t dbfs_read(struct file *file, char __user *buf,
|
||||
size_t size, loff_t *ppos)
|
||||
{
|
||||
@@ -56,28 +39,21 @@ static ssize_t dbfs_read(struct file *file, char __user *buf,
|
||||
|
||||
df = file_inode(file)->i_private;
|
||||
mutex_lock(&df->lock);
|
||||
if (!df->data) {
|
||||
data = hypfs_dbfs_data_alloc(df);
|
||||
if (!data) {
|
||||
mutex_unlock(&df->lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
rc = df->data_create(&data->buf, &data->buf_free_ptr,
|
||||
&data->size);
|
||||
if (rc) {
|
||||
mutex_unlock(&df->lock);
|
||||
kfree(data);
|
||||
return rc;
|
||||
}
|
||||
df->data = data;
|
||||
schedule_delayed_work(&df->data_free_work, HZ);
|
||||
data = hypfs_dbfs_data_alloc(df);
|
||||
if (!data) {
|
||||
mutex_unlock(&df->lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
rc = df->data_create(&data->buf, &data->buf_free_ptr, &data->size);
|
||||
if (rc) {
|
||||
mutex_unlock(&df->lock);
|
||||
kfree(data);
|
||||
return rc;
|
||||
}
|
||||
data = df->data;
|
||||
kref_get(&data->kref);
|
||||
mutex_unlock(&df->lock);
|
||||
|
||||
rc = simple_read_from_buffer(buf, size, ppos, data->buf, data->size);
|
||||
kref_put(&data->kref, hypfs_dbfs_data_free);
|
||||
hypfs_dbfs_data_free(data);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -108,7 +84,6 @@ int hypfs_dbfs_create_file(struct hypfs_dbfs_file *df)
|
||||
if (IS_ERR(df->dentry))
|
||||
return PTR_ERR(df->dentry);
|
||||
mutex_init(&df->lock);
|
||||
INIT_DELAYED_WORK(&df->data_free_work, data_free_delayed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Hypervisor filesystem for Linux on s390
|
||||
*
|
||||
* Diag 0C implementation
|
||||
*
|
||||
* Copyright IBM Corp. 2014
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/hypfs.h>
|
||||
#include "hypfs.h"
|
||||
|
||||
#define DBFS_D0C_HDR_VERSION 0
|
||||
|
||||
/*
|
||||
* Execute diagnose 0c in 31 bit mode
|
||||
*/
|
||||
static void diag0c(struct hypfs_diag0c_entry *entry)
|
||||
{
|
||||
asm volatile (
|
||||
#ifdef CONFIG_64BIT
|
||||
" sam31\n"
|
||||
" diag %0,%0,0x0c\n"
|
||||
" sam64\n"
|
||||
#else
|
||||
" diag %0,%0,0x0c\n"
|
||||
#endif
|
||||
: /* no output register */
|
||||
: "a" (entry)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
/*
|
||||
* Get hypfs_diag0c_entry from CPU vector and store diag0c data
|
||||
*/
|
||||
static void diag0c_fn(void *data)
|
||||
{
|
||||
diag0c(((void **) data)[smp_processor_id()]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate buffer and store diag 0c data
|
||||
*/
|
||||
static void *diag0c_store(unsigned int *count)
|
||||
{
|
||||
struct hypfs_diag0c_data *diag0c_data;
|
||||
unsigned int cpu_count, cpu, i;
|
||||
void **cpu_vec;
|
||||
|
||||
get_online_cpus();
|
||||
cpu_count = num_online_cpus();
|
||||
cpu_vec = kmalloc(sizeof(*cpu_vec) * num_possible_cpus(), GFP_KERNEL);
|
||||
if (!cpu_vec)
|
||||
goto fail_put_online_cpus;
|
||||
/* Note: Diag 0c needs 8 byte alignment and real storage */
|
||||
diag0c_data = kzalloc(sizeof(struct hypfs_diag0c_hdr) +
|
||||
cpu_count * sizeof(struct hypfs_diag0c_entry),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!diag0c_data)
|
||||
goto fail_kfree_cpu_vec;
|
||||
i = 0;
|
||||
/* Fill CPU vector for each online CPU */
|
||||
for_each_online_cpu(cpu) {
|
||||
diag0c_data->entry[i].cpu = cpu;
|
||||
cpu_vec[cpu] = &diag0c_data->entry[i++];
|
||||
}
|
||||
/* Collect data all CPUs */
|
||||
on_each_cpu(diag0c_fn, cpu_vec, 1);
|
||||
*count = cpu_count;
|
||||
kfree(cpu_vec);
|
||||
put_online_cpus();
|
||||
return diag0c_data;
|
||||
|
||||
fail_kfree_cpu_vec:
|
||||
kfree(cpu_vec);
|
||||
fail_put_online_cpus:
|
||||
put_online_cpus();
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hypfs DBFS callback: Free diag 0c data
|
||||
*/
|
||||
static void dbfs_diag0c_free(const void *data)
|
||||
{
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hypfs DBFS callback: Create diag 0c data
|
||||
*/
|
||||
static int dbfs_diag0c_create(void **data, void **data_free_ptr, size_t *size)
|
||||
{
|
||||
struct hypfs_diag0c_data *diag0c_data;
|
||||
unsigned int count;
|
||||
|
||||
diag0c_data = diag0c_store(&count);
|
||||
if (IS_ERR(diag0c_data))
|
||||
return PTR_ERR(diag0c_data);
|
||||
memset(&diag0c_data->hdr, 0, sizeof(diag0c_data->hdr));
|
||||
get_tod_clock_ext(diag0c_data->hdr.tod_ext);
|
||||
diag0c_data->hdr.len = count * sizeof(struct hypfs_diag0c_entry);
|
||||
diag0c_data->hdr.version = DBFS_D0C_HDR_VERSION;
|
||||
diag0c_data->hdr.count = count;
|
||||
*data = diag0c_data;
|
||||
*data_free_ptr = diag0c_data;
|
||||
*size = diag0c_data->hdr.len + sizeof(struct hypfs_diag0c_hdr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Hypfs DBFS file structure
|
||||
*/
|
||||
static struct hypfs_dbfs_file dbfs_file_0c = {
|
||||
.name = "diag_0c",
|
||||
.data_create = dbfs_diag0c_create,
|
||||
.data_free = dbfs_diag0c_free,
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize diag 0c interface for z/VM
|
||||
*/
|
||||
int __init hypfs_diag0c_init(void)
|
||||
{
|
||||
if (!MACHINE_IS_VM)
|
||||
return 0;
|
||||
return hypfs_dbfs_create_file(&dbfs_file_0c);
|
||||
}
|
||||
|
||||
/*
|
||||
* Shutdown diag 0c interface for z/VM
|
||||
*/
|
||||
void hypfs_diag0c_exit(void)
|
||||
{
|
||||
if (!MACHINE_IS_VM)
|
||||
return;
|
||||
hypfs_dbfs_remove_file(&dbfs_file_0c);
|
||||
}
|
||||
@@ -482,10 +482,14 @@ static int __init hypfs_init(void)
|
||||
rc = -ENODATA;
|
||||
goto fail_hypfs_vm_exit;
|
||||
}
|
||||
if (hypfs_diag0c_init()) {
|
||||
rc = -ENODATA;
|
||||
goto fail_hypfs_sprp_exit;
|
||||
}
|
||||
s390_kobj = kobject_create_and_add("s390", hypervisor_kobj);
|
||||
if (!s390_kobj) {
|
||||
rc = -ENOMEM;
|
||||
goto fail_hypfs_sprp_exit;
|
||||
goto fail_hypfs_diag0c_exit;
|
||||
}
|
||||
rc = register_filesystem(&hypfs_type);
|
||||
if (rc)
|
||||
@@ -494,6 +498,8 @@ static int __init hypfs_init(void)
|
||||
|
||||
fail_filesystem:
|
||||
kobject_put(s390_kobj);
|
||||
fail_hypfs_diag0c_exit:
|
||||
hypfs_diag0c_exit();
|
||||
fail_hypfs_sprp_exit:
|
||||
hypfs_sprp_exit();
|
||||
fail_hypfs_vm_exit:
|
||||
@@ -510,6 +516,7 @@ static void __exit hypfs_exit(void)
|
||||
{
|
||||
unregister_filesystem(&hypfs_type);
|
||||
kobject_put(s390_kobj);
|
||||
hypfs_diag0c_exit();
|
||||
hypfs_sprp_exit();
|
||||
hypfs_vm_exit();
|
||||
hypfs_diag_exit();
|
||||
|
||||
@@ -189,6 +189,20 @@ static inline int ecctr(u64 ctr, u64 *val)
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* Store CPU counter multiple for the MT utilization counter set */
|
||||
static inline int stcctm5(u64 num, u64 *val)
|
||||
{
|
||||
typedef struct { u64 _[num]; } addrtype;
|
||||
int cc;
|
||||
|
||||
asm volatile (
|
||||
" .insn rsy,0xeb0000000017,%2,5,%1\n"
|
||||
" ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
: "=d" (cc), "=Q" (*(addrtype *) val) : "d" (num) : "cc");
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* Query sampling information */
|
||||
static inline int qsi(struct hws_qsi_info_block *info)
|
||||
{
|
||||
|
||||
@@ -163,8 +163,8 @@ extern unsigned int vdso_enabled;
|
||||
the loader. We need to make sure that it is out of the way of the program
|
||||
that it will "exec", and that there is sufficient room for the brk. */
|
||||
|
||||
extern unsigned long randomize_et_dyn(unsigned long base);
|
||||
#define ELF_ET_DYN_BASE (randomize_et_dyn(STACK_TOP / 3 * 2))
|
||||
extern unsigned long randomize_et_dyn(void);
|
||||
#define ELF_ET_DYN_BASE randomize_et_dyn()
|
||||
|
||||
/* This yields a mask that user programs can use to figure out what
|
||||
instruction set this CPU supports. */
|
||||
@@ -209,7 +209,9 @@ do { \
|
||||
} while (0)
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
#define STACK_RND_MASK 0x7ffUL
|
||||
extern unsigned long mmap_rnd_mask;
|
||||
|
||||
#define STACK_RND_MASK (mmap_rnd_mask)
|
||||
|
||||
#define ARCH_DLINFO \
|
||||
do { \
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
|
||||
#define ARCH_SUPPORTS_FTRACE_OPS 1
|
||||
|
||||
#ifdef CC_USING_HOTPATCH
|
||||
#define MCOUNT_INSN_SIZE 6
|
||||
#else
|
||||
#define MCOUNT_INSN_SIZE 24
|
||||
#define MCOUNT_RETURN_FIXUP 18
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@@ -37,17 +41,28 @@ struct ftrace_insn {
|
||||
static inline void ftrace_generate_nop_insn(struct ftrace_insn *insn)
|
||||
{
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CC_USING_HOTPATCH
|
||||
/* brcl 0,0 */
|
||||
insn->opc = 0xc004;
|
||||
insn->disp = 0;
|
||||
#else
|
||||
/* jg .+24 */
|
||||
insn->opc = 0xc0f4;
|
||||
insn->disp = MCOUNT_INSN_SIZE / 2;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int is_ftrace_nop(struct ftrace_insn *insn)
|
||||
{
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CC_USING_HOTPATCH
|
||||
if (insn->disp == 0)
|
||||
return 1;
|
||||
#else
|
||||
if (insn->disp == MCOUNT_INSN_SIZE / 2)
|
||||
return 1;
|
||||
#endif
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
#define JUMP_LABEL_NOP_SIZE 6
|
||||
#define JUMP_LABEL_NOP_OFFSET 2
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define ASM_PTR ".quad"
|
||||
@@ -13,9 +14,13 @@
|
||||
#define ASM_ALIGN ".balign 4"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We use a brcl 0,2 instruction for jump labels at compile time so it
|
||||
* can be easily distinguished from a hotpatch generated instruction.
|
||||
*/
|
||||
static __always_inline bool arch_static_branch(struct static_key *key)
|
||||
{
|
||||
asm_volatile_goto("0: brcl 0,0\n"
|
||||
asm_volatile_goto("0: brcl 0,"__stringify(JUMP_LABEL_NOP_OFFSET)"\n"
|
||||
".pushsection __jump_table, \"aw\"\n"
|
||||
ASM_ALIGN "\n"
|
||||
ASM_PTR " 0b, %l[label], %0\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user