Merge tag 'powerpc-4.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc updates from Michael Ellerman:
 "Highlights include:

   - Larger virtual address space on 64-bit server CPUs. By default we
     use a 128TB virtual address space, but a process can request access
     to the full 512TB by passing a hint to mmap().

   - Support for the new Power9 "XIVE" interrupt controller.

   - TLB flushing optimisations for the radix MMU on Power9.

   - Support for CAPI cards on Power9, using the "Coherent Accelerator
     Interface Architecture 2.0".

   - The ability to configure the mmap randomisation limits at build and
     runtime.

   - Several small fixes and cleanups to the kprobes code, as well as
     support for KPROBES_ON_FTRACE.

   - Major improvements to handling of system reset interrupts,
     correctly treating them as NMIs, giving them a dedicated stack and
     using a new hypervisor call to trigger them, all of which should
     aid debugging and robustness.

   - Many fixes and other minor enhancements.

  Thanks to: Alastair D'Silva, Alexey Kardashevskiy, Alistair Popple,
  Andrew Donnellan, Aneesh Kumar K.V, Anshuman Khandual, Anton
  Blanchard, Balbir Singh, Ben Hutchings, Benjamin Herrenschmidt,
  Bhupesh Sharma, Chris Packham, Christian Zigotzky, Christophe Leroy,
  Christophe Lombard, Daniel Axtens, David Gibson, Gautham R. Shenoy,
  Gavin Shan, Geert Uytterhoeven, Guilherme G. Piccoli, Hamish Martin,
  Hari Bathini, Kees Cook, Laurent Dufour, Madhavan Srinivasan, Mahesh J
  Salgaonkar, Mahesh Salgaonkar, Masami Hiramatsu, Matt Brown, Matthew
  R. Ochs, Michael Neuling, Naveen N. Rao, Nicholas Piggin, Oliver
  O'Halloran, Pan Xinhui, Paul Mackerras, Rashmica Gupta, Russell
  Currey, Sukadev Bhattiprolu, Thadeu Lima de Souza Cascardo, Tobin C.
  Harding, Tyrel Datwyler, Uma Krishnan, Vaibhav Jain, Vipin K Parashar,
  Yang Shi"

* tag 'powerpc-4.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (214 commits)
  powerpc/64s: Power9 has no LPCR[VRMASD] field so don't set it
  powerpc/powernv: Fix TCE kill on NVLink2
  powerpc/mm/radix: Drop support for CPUs without lockless tlbie
  powerpc/book3s/mce: Move add_taint() later in virtual mode
  powerpc/sysfs: Move #ifdef CONFIG_HOTPLUG_CPU out of the function body
  powerpc/smp: Document irq enable/disable after migrating IRQs
  powerpc/mpc52xx: Don't select user-visible RTAS_PROC
  powerpc/powernv: Document cxl dependency on special case in pnv_eeh_reset()
  powerpc/eeh: Clean up and document event handling functions
  powerpc/eeh: Avoid use after free in eeh_handle_special_event()
  cxl: Mask slice error interrupts after first occurrence
  cxl: Route eeh events to all drivers in cxl_pci_error_detected()
  cxl: Force context lock during EEH flow
  powerpc/64: Allow CONFIG_RELOCATABLE if COMPILE_TEST
  powerpc/xmon: Teach xmon oops about radix vectors
  powerpc/mm/hash: Fix off-by-one in comment about kernel contexts ids
  powerpc/pseries: Enable VFIO
  powerpc/powernv: Fix iommu table size calculation hook for small tables
  powerpc/powernv: Check kzalloc() return value in pnv_pci_table_alloc
  powerpc: Add arch/powerpc/tools directory
  ...
This commit is contained in:
Linus Torvalds
2017-05-05 11:36:44 -07:00
commit 7246f60068
212 muutettua tiedostoa jossa 8702 lisäystä ja 2794 poistoa

Näytä tiedosto

@@ -14,6 +14,7 @@ export CFLAGS
SUB_DIRS = alignment \
benchmarks \
cache_shape \
copyloops \
context_switch \
dscr \

Näytä tiedosto

@@ -0,0 +1 @@
cache_shape

Näytä tiedosto

@@ -0,0 +1,10 @@
TEST_PROGS := cache_shape
all: $(TEST_PROGS)
$(TEST_PROGS): ../harness.c ../utils.c
include ../../lib.mk
clean:
rm -f $(TEST_PROGS) *.o

Näytä tiedosto

@@ -0,0 +1,125 @@
/*
* Copyright 2017, Michael Ellerman, IBM Corp.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <elf.h>
#include <errno.h>
#include <fcntl.h>
#include <link.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "utils.h"
#ifndef AT_L1I_CACHESIZE
#define AT_L1I_CACHESIZE 40
#define AT_L1I_CACHEGEOMETRY 41
#define AT_L1D_CACHESIZE 42
#define AT_L1D_CACHEGEOMETRY 43
#define AT_L2_CACHESIZE 44
#define AT_L2_CACHEGEOMETRY 45
#define AT_L3_CACHESIZE 46
#define AT_L3_CACHEGEOMETRY 47
#endif
static void print_size(const char *label, uint32_t val)
{
printf("%s cache size: %#10x %10dB %10dK\n", label, val, val, val / 1024);
}
static void print_geo(const char *label, uint32_t val)
{
uint16_t assoc;
printf("%s line size: %#10x ", label, val & 0xFFFF);
assoc = val >> 16;
if (assoc)
printf("%u-way", assoc);
else
printf("fully");
printf(" associative\n");
}
static int test_cache_shape()
{
static char buffer[4096];
ElfW(auxv_t) *p;
int found;
FAIL_IF(read_auxv(buffer, sizeof(buffer)));
found = 0;
p = find_auxv_entry(AT_L1I_CACHESIZE, buffer);
if (p) {
found++;
print_size("L1I ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L1I_CACHEGEOMETRY, buffer);
if (p) {
found++;
print_geo("L1I ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L1D_CACHESIZE, buffer);
if (p) {
found++;
print_size("L1D ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L1D_CACHEGEOMETRY, buffer);
if (p) {
found++;
print_geo("L1D ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L2_CACHESIZE, buffer);
if (p) {
found++;
print_size("L2 ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L2_CACHEGEOMETRY, buffer);
if (p) {
found++;
print_geo("L2 ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L3_CACHESIZE, buffer);
if (p) {
found++;
print_size("L3 ", (uint32_t)p->a_un.a_val);
}
p = find_auxv_entry(AT_L3_CACHEGEOMETRY, buffer);
if (p) {
found++;
print_geo("L3 ", (uint32_t)p->a_un.a_val);
}
/* If we found none we're probably on a system where they don't exist */
SKIP_IF(found == 0);
/* But if we found any, we expect to find them all */
FAIL_IF(found != 8);
return 0;
}
int main(void)
{
return test_harness(test_cache_shape, "cache_shape");
}

Näytä tiedosto

@@ -24,7 +24,11 @@ typedef uint8_t u8;
void test_harness_set_timeout(uint64_t time);
int test_harness(int (test_function)(void), char *name);
extern void *get_auxv_entry(int type);
int read_auxv(char *buf, ssize_t buf_size);
void *find_auxv_entry(int type, char *auxv);
void *get_auxv_entry(int type);
int pick_online_cpu(void);
static inline bool have_hwcap(unsigned long ftr)

Näytä tiedosto

@@ -19,45 +19,64 @@
static char auxv[4096];
void *get_auxv_entry(int type)
int read_auxv(char *buf, ssize_t buf_size)
{
ElfW(auxv_t) *p;
void *result;
ssize_t num;
int fd;
int rc, fd;
fd = open("/proc/self/auxv", O_RDONLY);
if (fd == -1) {
perror("open");
return NULL;
return -errno;
}
result = NULL;
num = read(fd, auxv, sizeof(auxv));
num = read(fd, buf, buf_size);
if (num < 0) {
perror("read");
rc = -EIO;
goto out;
}
if (num > sizeof(auxv)) {
printf("Overflowed auxv buffer\n");
if (num > buf_size) {
printf("overflowed auxv buffer\n");
rc = -EOVERFLOW;
goto out;
}
rc = 0;
out:
close(fd);
return rc;
}
void *find_auxv_entry(int type, char *auxv)
{
ElfW(auxv_t) *p;
p = (ElfW(auxv_t) *)auxv;
while (p->a_type != AT_NULL) {
if (p->a_type == type) {
result = (void *)p->a_un.a_val;
break;
}
if (p->a_type == type)
return p;
p++;
}
out:
close(fd);
return result;
return NULL;
}
void *get_auxv_entry(int type)
{
ElfW(auxv_t) *p;
if (read_auxv(auxv, sizeof(auxv)))
return NULL;
p = find_auxv_entry(type, auxv);
if (p)
return (void *)p->a_un.a_val;
return NULL;
}
int pick_online_cpu(void)