Merge tag 'mips_fixes_5.5_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 4 Jan 2020 22:16:57 +0000 (14:16 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 4 Jan 2020 22:16:57 +0000 (14:16 -0800)
Pull MIPS fixes from Paul Burton:
 "A collection of MIPS fixes:

   - Fill the struct cacheinfo shared_cpu_map field with sensible
     values, notably avoiding issues with perf which was unhappy in the
     absence of these values.

   - A boot fix for Loongson 2E & 2F machines which was fallout from
     some refactoring performed this cycle.

   - A Kconfig dependency fix for the Loongson CPU HWMon driver.

   - A couple of VDSO fixes, ensuring gettimeofday() behaves
     appropriately for kernel configurations that don't include support
     for a clocksource the VDSO can use & fixing the calling convention
     for the n32 & n64 VDSOs which would previously clobber the $gp/$28
     register.

   - A build fix for vmlinuz compressed images which were
     inappropriately building with -fsanitize-coverage despite not being
     part of the kernel proper, then failing to link due to the missing
     __sanitizer_cov_trace_pc() function.

   - A couple of eBPF JIT fixes, including disabling it for MIPS32 due
     to a large number of issues with the code generated there &
     reflecting ISA dependencies in Kconfig to enforce that systems
     which don't support the JIT must include the interpreter"

* tag 'mips_fixes_5.5_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux:
  MIPS: Avoid VDSO ABI breakage due to global register variable
  MIPS: BPF: eBPF JIT: check for MIPS ISA compliance in Kconfig
  MIPS: BPF: Disable MIPS32 eBPF JIT
  MIPS: Prevent link failure with kcov instrumentation
  MIPS: Kconfig: Use correct form for 'depends on'
  mips: Fix gettimeofday() in the vdso library
  MIPS: Fix boot on Fuloong2 systems
  mips: cacheinfo: report shared CPU map

arch/mips/Kconfig
arch/mips/boot/compressed/Makefile
arch/mips/include/asm/cpu-type.h
arch/mips/include/asm/thread_info.h
arch/mips/include/asm/vdso/gettimeofday.h
arch/mips/kernel/cacheinfo.c
arch/mips/net/ebpf_jit.c
arch/mips/vdso/vgettimeofday.c
drivers/platform/mips/Kconfig

index add3882..ed8e28b 100644 (file)
@@ -47,7 +47,7 @@ config MIPS
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
        select HAVE_ASM_MODVERSIONS
-       select HAVE_EBPF_JIT if (!CPU_MICROMIPS)
+       select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2
        select HAVE_CONTEXT_TRACKING
        select HAVE_COPY_THREAD_TLS
        select HAVE_C_RECORDMCOUNT
index 172801e..d859f07 100644 (file)
@@ -29,6 +29,9 @@ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
        -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
        -DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
 
+# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
+KCOV_INSTRUMENT                := n
+
 # decompressor objects (linked with vmlinuz)
 vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
 
index c46c59b..49f0061 100644 (file)
@@ -15,7 +15,8 @@
 static inline int __pure __get_cpu_type(const int cpu_type)
 {
        switch (cpu_type) {
-#if defined(CONFIG_SYS_HAS_CPU_LOONGSON2EF)
+#if defined(CONFIG_SYS_HAS_CPU_LOONGSON2E) || \
+    defined(CONFIG_SYS_HAS_CPU_LOONGSON2F)
        case CPU_LOONGSON2EF:
 #endif
 
index 4993db4..ee26f9a 100644 (file)
@@ -49,8 +49,26 @@ struct thread_info {
        .addr_limit     = KERNEL_DS,            \
 }
 
-/* How to get the thread information struct from C.  */
+/*
+ * A pointer to the struct thread_info for the currently executing thread is
+ * held in register $28/$gp.
+ *
+ * We declare __current_thread_info as a global register variable rather than a
+ * local register variable within current_thread_info() because clang doesn't
+ * support explicit local register variables.
+ *
+ * When building the VDSO we take care not to declare the global register
+ * variable because this causes GCC to not preserve the value of $28/$gp in
+ * functions that change its value (which is common in the PIC VDSO when
+ * accessing the GOT). Since the VDSO shouldn't be accessing
+ * __current_thread_info anyway we declare it extern in order to cause a link
+ * failure if it's referenced.
+ */
+#ifdef __VDSO__
+extern struct thread_info *__current_thread_info;
+#else
 register struct thread_info *__current_thread_info __asm__("$28");
+#endif
 
 static inline struct thread_info *current_thread_info(void)
 {
index b088255..0ae9b4c 100644 (file)
@@ -26,8 +26,6 @@
 
 #define __VDSO_USE_SYSCALL             ULLONG_MAX
 
-#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
-
 static __always_inline long gettimeofday_fallback(
                                struct __kernel_old_timeval *_tv,
                                struct timezone *_tz)
@@ -48,17 +46,6 @@ static __always_inline long gettimeofday_fallback(
        return error ? -ret : ret;
 }
 
-#else
-
-static __always_inline long gettimeofday_fallback(
-                               struct __kernel_old_timeval *_tv,
-                               struct timezone *_tz)
-{
-       return -1;
-}
-
-#endif
-
 static __always_inline long clock_gettime_fallback(
                                        clockid_t _clkid,
                                        struct __kernel_timespec *_ts)
index f777e44..47312c5 100644 (file)
@@ -50,6 +50,25 @@ static int __init_cache_level(unsigned int cpu)
        return 0;
 }
 
+static void fill_cpumask_siblings(int cpu, cpumask_t *cpu_map)
+{
+       int cpu1;
+
+       for_each_possible_cpu(cpu1)
+               if (cpus_are_siblings(cpu, cpu1))
+                       cpumask_set_cpu(cpu1, cpu_map);
+}
+
+static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)
+{
+       int cpu1;
+       int cluster = cpu_cluster(&cpu_data[cpu]);
+
+       for_each_possible_cpu(cpu1)
+               if (cpu_cluster(&cpu_data[cpu1]) == cluster)
+                       cpumask_set_cpu(cpu1, cpu_map);
+}
+
 static int __populate_cache_leaves(unsigned int cpu)
 {
        struct cpuinfo_mips *c = &current_cpu_data;
@@ -57,14 +76,20 @@ static int __populate_cache_leaves(unsigned int cpu)
        struct cacheinfo *this_leaf = this_cpu_ci->info_list;
 
        if (c->icache.waysize) {
+               /* L1 caches are per core */
+               fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
                populate_cache(dcache, this_leaf, 1, CACHE_TYPE_DATA);
+               fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
                populate_cache(icache, this_leaf, 1, CACHE_TYPE_INST);
        } else {
                populate_cache(dcache, this_leaf, 1, CACHE_TYPE_UNIFIED);
        }
 
-       if (c->scache.waysize)
+       if (c->scache.waysize) {
+               /* L2 cache is per cluster */
+               fill_cpumask_cluster(cpu, &this_leaf->shared_cpu_map);
                populate_cache(scache, this_leaf, 2, CACHE_TYPE_UNIFIED);
+       }
 
        if (c->tcache.waysize)
                populate_cache(tcache, this_leaf, 3, CACHE_TYPE_UNIFIED);
index 3ec69d9..561154c 100644 (file)
@@ -1804,7 +1804,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
        unsigned int image_size;
        u8 *image_ptr;
 
-       if (!prog->jit_requested || MIPS_ISA_REV < 2)
+       if (!prog->jit_requested)
                return prog;
 
        tmp = bpf_jit_blind_constants(prog);
index 6ebdc37..6b83b63 100644 (file)
@@ -17,12 +17,22 @@ int __vdso_clock_gettime(clockid_t clock,
        return __cvdso_clock_gettime32(clock, ts);
 }
 
+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
+
+/*
+ * This is behind the ifdef so that we don't provide the symbol when there's no
+ * possibility of there being a usable clocksource, because there's nothing we
+ * can do without it. When libc fails the symbol lookup it should fall back on
+ * the standard syscall path.
+ */
 int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
                        struct timezone *tz)
 {
        return __cvdso_gettimeofday(tv, tz);
 }
 
+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
+
 int __vdso_clock_getres(clockid_t clock_id,
                        struct old_timespec32 *res)
 {
@@ -43,12 +53,22 @@ int __vdso_clock_gettime(clockid_t clock,
        return __cvdso_clock_gettime(clock, ts);
 }
 
+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
+
+/*
+ * This is behind the ifdef so that we don't provide the symbol when there's no
+ * possibility of there being a usable clocksource, because there's nothing we
+ * can do without it. When libc fails the symbol lookup it should fall back on
+ * the standard syscall path.
+ */
 int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
                        struct timezone *tz)
 {
        return __cvdso_gettimeofday(tv, tz);
 }
 
+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
+
 int __vdso_clock_getres(clockid_t clock_id,
                        struct __kernel_timespec *res)
 {
index f4d0a86..5e77b0d 100644 (file)
@@ -18,7 +18,7 @@ if MIPS_PLATFORM_DEVICES
 
 config CPU_HWMON
        tristate "Loongson-3 CPU HWMon Driver"
-       depends on CONFIG_MACH_LOONGSON64
+       depends on MACH_LOONGSON64
        select HWMON
        default y
        help