Commit 990f2273 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 's390-5.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull more s390 updates from Heiko Carstens:

 - Allow s390 debug feature to handle finally more than 256 CPU numbers,
   instead of truncating the most significant bits.

 - Improve THP splitting required by qemu processes by making use of
   walk_page_vma() instead of calling follow_page() for every single
   page within each vma.

 - Add missing ZCRYPT dependency to VFIO_AP to fix potential compile
   problems.

 - Remove not required select CLOCKSOURCE_VALIDATE_LAST_CYCLE again.

 - Set node distance to LOCAL_DISTANCE instead of 0, since e.g. libnuma
   translates a node distance of 0 to "no NUMA support available".

 - Couple of other minor fixes and improvements.

* tag 's390-5.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/numa: move code to arch/s390/kernel
  s390/time: remove select CLOCKSOURCE_VALIDATE_LAST_CYCLE again
  s390/debug: debug feature version 3
  s390/Kconfig: add missing ZCRYPT dependency to VFIO_AP
  s390/numa: set node distance to LOCAL_DISTANCE
  s390/pkey: remove redundant variable initialization
  s390/test_unwind: fix possible memleak in test_unwind()
  s390/gmap: improve THP splitting
  s390/atomic: circumvent gcc 10 build regression
parents 23c2c8c6 b450eeb0
...@@ -7,5 +7,4 @@ obj-$(CONFIG_S390_HYPFS_FS) += hypfs/ ...@@ -7,5 +7,4 @@ obj-$(CONFIG_S390_HYPFS_FS) += hypfs/
obj-$(CONFIG_APPLDATA_BASE) += appldata/ obj-$(CONFIG_APPLDATA_BASE) += appldata/
obj-y += net/ obj-y += net/
obj-$(CONFIG_PCI) += pci/ obj-$(CONFIG_PCI) += pci/
obj-$(CONFIG_NUMA) += numa/
obj-$(CONFIG_ARCH_HAS_KEXEC_PURGATORY) += purgatory/ obj-$(CONFIG_ARCH_HAS_KEXEC_PURGATORY) += purgatory/
...@@ -126,7 +126,6 @@ config S390 ...@@ -126,7 +126,6 @@ config S390
select HAVE_ARCH_JUMP_LABEL_RELATIVE select HAVE_ARCH_JUMP_LABEL_RELATIVE
select HAVE_ARCH_KASAN select HAVE_ARCH_KASAN
select HAVE_ARCH_KASAN_VMALLOC select HAVE_ARCH_KASAN_VMALLOC
select CLOCKSOURCE_VALIDATE_LAST_CYCLE
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_SOFT_DIRTY select HAVE_ARCH_SOFT_DIRTY
...@@ -766,6 +765,7 @@ config VFIO_AP ...@@ -766,6 +765,7 @@ config VFIO_AP
def_tristate n def_tristate n
prompt "VFIO support for AP devices" prompt "VFIO support for AP devices"
depends on S390_AP_IOMMU && VFIO_MDEV_DEVICE && KVM depends on S390_AP_IOMMU && VFIO_MDEV_DEVICE && KVM
depends on ZCRYPT
help help
This driver grants access to Adjunct Processor (AP) devices This driver grants access to Adjunct Processor (AP) devices
via the VFIO mediated device interface. via the VFIO mediated device interface.
......
...@@ -45,7 +45,11 @@ static inline int atomic_fetch_add(int i, atomic_t *v) ...@@ -45,7 +45,11 @@ static inline int atomic_fetch_add(int i, atomic_t *v)
static inline void atomic_add(int i, atomic_t *v) static inline void atomic_add(int i, atomic_t *v)
{ {
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
if (__builtin_constant_p(i) && (i > -129) && (i < 128)) { /*
* Order of conditions is important to circumvent gcc 10 bug:
* https://gcc.gnu.org/pipermail/gcc-patches/2020-July/549318.html
*/
if ((i > -129) && (i < 128) && __builtin_constant_p(i)) {
__atomic_add_const(i, &v->counter); __atomic_add_const(i, &v->counter);
return; return;
} }
...@@ -112,7 +116,11 @@ static inline s64 atomic64_fetch_add(s64 i, atomic64_t *v) ...@@ -112,7 +116,11 @@ static inline s64 atomic64_fetch_add(s64 i, atomic64_t *v)
static inline void atomic64_add(s64 i, atomic64_t *v) static inline void atomic64_add(s64 i, atomic64_t *v)
{ {
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
if (__builtin_constant_p(i) && (i > -129) && (i < 128)) { /*
* Order of conditions is important to circumvent gcc 10 bug:
* https://gcc.gnu.org/pipermail/gcc-patches/2020-July/549318.html
*/
if ((i > -129) && (i < 128) && __builtin_constant_p(i)) {
__atomic64_add_const(i, (long *)&v->counter); __atomic64_add_const(i, (long *)&v->counter);
return; return;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* /*
* S/390 debug facility * S/390 debug facility
* *
* Copyright IBM Corp. 1999, 2000 * Copyright IBM Corp. 1999, 2020
*/ */
#ifndef DEBUG_H #ifndef DEBUG_H
#define DEBUG_H #define DEBUG_H
...@@ -26,19 +26,14 @@ ...@@ -26,19 +26,14 @@
#define DEBUG_DATA(entry) (char *)(entry + 1) /* data is stored behind */ #define DEBUG_DATA(entry) (char *)(entry + 1) /* data is stored behind */
/* the entry information */ /* the entry information */
#define __DEBUG_FEATURE_VERSION 2 /* version of debug feature */ #define __DEBUG_FEATURE_VERSION 3 /* version of debug feature */
struct __debug_entry { struct __debug_entry {
union { unsigned long clock : 60;
struct {
unsigned long clock : 52;
unsigned long exception : 1; unsigned long exception : 1;
unsigned long level : 3; unsigned long level : 3;
unsigned long cpuid : 8;
} fields;
unsigned long stck;
} id;
void *caller; void *caller;
unsigned short cpu;
} __packed; } __packed;
typedef struct __debug_entry debug_entry_t; typedef struct __debug_entry debug_entry_t;
......
...@@ -86,12 +86,6 @@ static inline const struct cpumask *cpumask_of_node(int node) ...@@ -86,12 +86,6 @@ static inline const struct cpumask *cpumask_of_node(int node)
#define pcibus_to_node(bus) __pcibus_to_node(bus) #define pcibus_to_node(bus) __pcibus_to_node(bus)
#define node_distance(a, b) __node_distance(a, b)
static inline int __node_distance(int a, int b)
{
return 0;
}
#else /* !CONFIG_NUMA */ #else /* !CONFIG_NUMA */
#define numa_node_id numa_node_id #define numa_node_id numa_node_id
......
...@@ -49,6 +49,7 @@ CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE) ...@@ -49,6 +49,7 @@ CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_SCHED_TOPOLOGY) += topology.o obj-$(CONFIG_SCHED_TOPOLOGY) += topology.o
obj-$(CONFIG_NUMA) += numa.o
obj-$(CONFIG_AUDIT) += audit.o obj-$(CONFIG_AUDIT) += audit.o
compat-obj-$(CONFIG_AUDIT) += compat_audit.o compat-obj-$(CONFIG_AUDIT) += compat_audit.o
obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* /*
* S/390 debug facility * S/390 debug facility
* *
* Copyright IBM Corp. 1999, 2012 * Copyright IBM Corp. 1999, 2020
* *
* Author(s): Michael Holzheu (holzheu@de.ibm.com), * Author(s): Michael Holzheu (holzheu@de.ibm.com),
* Holger Smolinski (Holger.Smolinski@de.ibm.com) * Holger Smolinski (Holger.Smolinski@de.ibm.com)
...@@ -433,7 +433,7 @@ static int debug_format_entry(file_private_info_t *p_info) ...@@ -433,7 +433,7 @@ static int debug_format_entry(file_private_info_t *p_info)
act_entry = (debug_entry_t *) ((char *)id_snap->areas[p_info->act_area] act_entry = (debug_entry_t *) ((char *)id_snap->areas[p_info->act_area]
[p_info->act_page] + p_info->act_entry); [p_info->act_page] + p_info->act_entry);
if (act_entry->id.stck == 0LL) if (act_entry->clock == 0LL)
goto out; /* empty entry */ goto out; /* empty entry */
if (view->header_proc) if (view->header_proc)
len += view->header_proc(id_snap, view, p_info->act_area, len += view->header_proc(id_snap, view, p_info->act_area,
...@@ -829,12 +829,17 @@ static inline debug_entry_t *get_active_entry(debug_info_t *id) ...@@ -829,12 +829,17 @@ static inline debug_entry_t *get_active_entry(debug_info_t *id)
static inline void debug_finish_entry(debug_info_t *id, debug_entry_t *active, static inline void debug_finish_entry(debug_info_t *id, debug_entry_t *active,
int level, int exception) int level, int exception)
{ {
active->id.stck = get_tod_clock_fast() - unsigned char clk[STORE_CLOCK_EXT_SIZE];
*(unsigned long long *) &tod_clock_base[1]; unsigned long timestamp;
active->id.fields.cpuid = smp_processor_id();
get_tod_clock_ext(clk);
timestamp = *(unsigned long *) &clk[0] >> 4;
timestamp -= TOD_UNIX_EPOCH >> 12;
active->clock = timestamp;
active->cpu = smp_processor_id();
active->caller = __builtin_return_address(0); active->caller = __builtin_return_address(0);
active->id.fields.exception = exception; active->exception = exception;
active->id.fields.level = level; active->level = level;
proceed_active_entry(id); proceed_active_entry(id);
if (exception) if (exception)
proceed_active_area(id); proceed_active_area(id);
...@@ -1398,25 +1403,24 @@ static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view, ...@@ -1398,25 +1403,24 @@ static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view,
int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view, int debug_dflt_header_fn(debug_info_t *id, struct debug_view *view,
int area, debug_entry_t *entry, char *out_buf) int area, debug_entry_t *entry, char *out_buf)
{ {
unsigned long base, sec, usec; unsigned long sec, usec;
unsigned long caller; unsigned long caller;
unsigned int level; unsigned int level;
char *except_str; char *except_str;
int rc = 0; int rc = 0;
level = entry->id.fields.level; level = entry->level;
base = (*(unsigned long *) &tod_clock_base[0]) >> 4; sec = entry->clock;
sec = (entry->id.stck >> 12) + base - (TOD_UNIX_EPOCH >> 12);
usec = do_div(sec, USEC_PER_SEC); usec = do_div(sec, USEC_PER_SEC);
if (entry->id.fields.exception) if (entry->exception)
except_str = "*"; except_str = "*";
else else
except_str = "-"; except_str = "-";
caller = (unsigned long) entry->caller; caller = (unsigned long) entry->caller;
rc += sprintf(out_buf, "%02i %011ld:%06lu %1u %1s %02i %pK ", rc += sprintf(out_buf, "%02i %011ld:%06lu %1u %1s %04u %pK ",
area, sec, usec, level, except_str, area, sec, usec, level, except_str,
entry->id.fields.cpuid, (void *)caller); entry->cpu, (void *)caller);
return rc; return rc;
} }
EXPORT_SYMBOL(debug_dflt_header_fn); EXPORT_SYMBOL(debug_dflt_header_fn);
......
...@@ -64,6 +64,7 @@ static noinline int test_unwind(struct task_struct *task, struct pt_regs *regs, ...@@ -64,6 +64,7 @@ static noinline int test_unwind(struct task_struct *task, struct pt_regs *regs,
break; break;
if (state.reliable && !addr) { if (state.reliable && !addr) {
pr_err("unwind state reliable but addr is 0\n"); pr_err("unwind state reliable but addr is 0\n");
kfree(bt);
return -EINVAL; return -EINVAL;
} }
sprint_symbol(sym, addr); sprint_symbol(sym, addr);
......
...@@ -2485,23 +2485,36 @@ void gmap_sync_dirty_log_pmd(struct gmap *gmap, unsigned long bitmap[4], ...@@ -2485,23 +2485,36 @@ void gmap_sync_dirty_log_pmd(struct gmap *gmap, unsigned long bitmap[4],
} }
EXPORT_SYMBOL_GPL(gmap_sync_dirty_log_pmd); EXPORT_SYMBOL_GPL(gmap_sync_dirty_log_pmd);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static int thp_split_walk_pmd_entry(pmd_t *pmd, unsigned long addr,
unsigned long end, struct mm_walk *walk)
{
struct vm_area_struct *vma = walk->vma;
split_huge_pmd(vma, pmd, addr);
return 0;
}
static const struct mm_walk_ops thp_split_walk_ops = {
.pmd_entry = thp_split_walk_pmd_entry,
};
static inline void thp_split_mm(struct mm_struct *mm) static inline void thp_split_mm(struct mm_struct *mm)
{ {
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
struct vm_area_struct *vma; struct vm_area_struct *vma;
unsigned long addr;
for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) { for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) {
for (addr = vma->vm_start;
addr < vma->vm_end;
addr += PAGE_SIZE)
follow_page(vma, addr, FOLL_SPLIT);
vma->vm_flags &= ~VM_HUGEPAGE; vma->vm_flags &= ~VM_HUGEPAGE;
vma->vm_flags |= VM_NOHUGEPAGE; vma->vm_flags |= VM_NOHUGEPAGE;
walk_page_vma(vma, &thp_split_walk_ops, NULL);
} }
mm->def_flags |= VM_NOHUGEPAGE; mm->def_flags |= VM_NOHUGEPAGE;
#endif
} }
#else
static inline void thp_split_mm(struct mm_struct *mm)
{
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
/* /*
* Remove all empty zero pages from the mapping for lazy refaulting * Remove all empty zero pages from the mapping for lazy refaulting
......
# SPDX-License-Identifier: GPL-2.0
obj-y += numa.o
...@@ -818,7 +818,7 @@ static int pkey_keyblob2pkey2(const struct pkey_apqn *apqns, size_t nr_apqns, ...@@ -818,7 +818,7 @@ static int pkey_keyblob2pkey2(const struct pkey_apqn *apqns, size_t nr_apqns,
static int pkey_apqns4key(const u8 *key, size_t keylen, u32 flags, static int pkey_apqns4key(const u8 *key, size_t keylen, u32 flags,
struct pkey_apqn *apqns, size_t *nr_apqns) struct pkey_apqn *apqns, size_t *nr_apqns)
{ {
int rc = EINVAL; int rc;
u32 _nr_apqns, *_apqns = NULL; u32 _nr_apqns, *_apqns = NULL;
struct keytoken_header *hdr = (struct keytoken_header *)key; struct keytoken_header *hdr = (struct keytoken_header *)key;
...@@ -886,7 +886,7 @@ static int pkey_apqns4keytype(enum pkey_key_type ktype, ...@@ -886,7 +886,7 @@ static int pkey_apqns4keytype(enum pkey_key_type ktype,
u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags, u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags,
struct pkey_apqn *apqns, size_t *nr_apqns) struct pkey_apqn *apqns, size_t *nr_apqns)
{ {
int rc = -EINVAL; int rc;
u32 _nr_apqns, *_apqns = NULL; u32 _nr_apqns, *_apqns = NULL;
if (ktype == PKEY_TYPE_CCA_DATA || ktype == PKEY_TYPE_CCA_CIPHER) { if (ktype == PKEY_TYPE_CCA_DATA || ktype == PKEY_TYPE_CCA_CIPHER) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment