Merge tag 'x86-cleanups-2023-08-28' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Aug 2023 00:05:58 +0000 (17:05 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Aug 2023 00:05:58 +0000 (17:05 -0700)
Pull misc x86 cleanups from Ingo Molnar:
 "The following commit deserves special mention:

   22dc02f81cddd Revert "sched/fair: Move unused stub functions to header"

  This is in x86/cleanups, because the revert is a re-application of a
  number of cleanups that got removed inadvertedly"

[ This also effectively undoes the amd_check_microcode() microcode
  declaration change I had done in my microcode loader merge in commit
  42a7f6e3ffe0 ("Merge tag 'x86_microcode_for_v6.6_rc1' [...]").

  I picked the declaration change by Arnd from this branch instead,
  which put it in <asm/processor.h> instead of <asm/microcode.h> like I
  had done in my merge resolution   - Linus ]

* tag 'x86-cleanups-2023-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/platform/uv: Refactor code using deprecated strncpy() interface to use strscpy()
  x86/hpet: Refactor code using deprecated strncpy() interface to use strscpy()
  x86/platform/uv: Refactor code using deprecated strcpy()/strncpy() interfaces to use strscpy()
  x86/qspinlock-paravirt: Fix missing-prototype warning
  x86/paravirt: Silence unused native_pv_lock_init() function warning
  x86/alternative: Add a __alt_reloc_selftest() prototype
  x86/purgatory: Include header for warn() declaration
  x86/asm: Avoid unneeded __div64_32 function definition
  Revert "sched/fair: Move unused stub functions to header"
  x86/apic: Hide unused safe_smp_processor_id() on 32-bit UP
  x86/cpu: Fix amd_check_microcode() declaration

18 files changed:
arch/x86/boot/compressed/error.c
arch/x86/boot/compressed/error.h
arch/x86/include/asm/div64.h
arch/x86/include/asm/microcode.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/processor.h
arch/x86/include/asm/qspinlock.h
arch/x86/include/asm/qspinlock_paravirt.h
arch/x86/kernel/alternative.c
arch/x86/kernel/apic/ipi.c
arch/x86/kernel/apic/x2apic_uv_x.c
arch/x86/kernel/hpet.c
arch/x86/kernel/paravirt.c
arch/x86/platform/uv/uv_nmi.c
arch/x86/purgatory/purgatory.c
kernel/locking/qspinlock_paravirt.h
kernel/sched/fair.c
kernel/sched/sched.h

index 5313c5c..19a8251 100644 (file)
@@ -7,7 +7,7 @@
 #include "misc.h"
 #include "error.h"
 
-void warn(char *m)
+void warn(const char *m)
 {
        error_putstr("\n\n");
        error_putstr(m);
index 86fe33b..31f9e08 100644 (file)
@@ -4,7 +4,7 @@
 
 #include <linux/compiler.h>
 
-void warn(char *m);
+void warn(const char *m);
 void error(char *m) __noreturn;
 void panic(const char *fmt, ...) __noreturn __cold;
 
index b8f1dc0..9931e4c 100644 (file)
@@ -71,6 +71,12 @@ static inline u64 mul_u32_u32(u32 a, u32 b)
 }
 #define mul_u32_u32 mul_u32_u32
 
+/*
+ * __div64_32() is never called on x86, so prevent the
+ * generic definition from getting built.
+ */
+#define __div64_32
+
 #else
 # include <asm-generic/div64.h>
 
index 2f355b6..bbbe9d7 100644 (file)
@@ -75,10 +75,4 @@ void show_ucode_info_early(void);
 static inline void show_ucode_info_early(void) { }
 #endif /* !CONFIG_CPU_SUP_INTEL */
 
-#ifdef CONFIG_CPU_SUP_AMD
-void amd_check_microcode(void);
-#else /* CONFIG_CPU_SUP_AMD */
-static inline void amd_check_microcode(void) {}
-#endif
-
 #endif /* _ASM_X86_MICROCODE_H */
index b497786..6c8ff12 100644 (file)
@@ -739,6 +739,7 @@ static __always_inline unsigned long arch_local_irq_save(void)
             ".popsection")
 
 extern void default_banner(void);
+void native_pv_lock_init(void) __init;
 
 #else  /* __ASSEMBLY__ */
 
@@ -778,6 +779,12 @@ extern void default_banner(void);
 #endif /* __ASSEMBLY__ */
 #else  /* CONFIG_PARAVIRT */
 # define default_banner x86_init_noop
+
+#ifndef __ASSEMBLY__
+static inline void native_pv_lock_init(void)
+{
+}
+#endif
 #endif /* !CONFIG_PARAVIRT */
 
 #ifndef __ASSEMBLY__
index fd75024..861e53e 100644 (file)
@@ -678,11 +678,13 @@ extern u32 amd_get_nodes_per_socket(void);
 extern u32 amd_get_highest_perf(void);
 extern bool cpu_has_ibpb_brtype_microcode(void);
 extern void amd_clear_divider(void);
+extern void amd_check_microcode(void);
 #else
 static inline u32 amd_get_nodes_per_socket(void)       { return 0; }
 static inline u32 amd_get_highest_perf(void)           { return 0; }
 static inline bool cpu_has_ibpb_brtype_microcode(void) { return false; }
 static inline void amd_clear_divider(void)             { }
+static inline void amd_check_microcode(void)           { }
 #endif
 
 extern unsigned long arch_align_stack(unsigned long sp);
index d87451d..cde8357 100644 (file)
@@ -74,8 +74,6 @@ static inline bool vcpu_is_preempted(long cpu)
  */
 DECLARE_STATIC_KEY_TRUE(virt_spin_lock_key);
 
-void native_pv_lock_init(void) __init;
-
 /*
  * Shortcut for the queued_spin_lock_slowpath() function that allows
  * virt to hijack it.
@@ -103,10 +101,7 @@ static inline bool virt_spin_lock(struct qspinlock *lock)
 
        return true;
 }
-#else
-static inline void native_pv_lock_init(void)
-{
-}
+
 #endif /* CONFIG_PARAVIRT */
 
 #include <asm-generic/qspinlock.h>
index 42b17cf..85b6e36 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <asm/ibt.h>
 
+void __lockfunc __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked);
+
 /*
  * For x86-64, PV_CALLEE_SAVE_REGS_THUNK() saves and restores 8 64-bit
  * registers. For i386, however, only 1 32-bit register needs to be saved
index 099d58d..a5ead6a 100644 (file)
@@ -1527,6 +1527,7 @@ static noinline void __init int3_selftest(void)
 
 static __initdata int __alt_reloc_selftest_addr;
 
+extern void __init __alt_reloc_selftest(void *arg);
 __visible noinline void __init __alt_reloc_selftest(void *arg)
 {
        WARN_ON(arg != &__alt_reloc_selftest_addr);
index 2a6509e..9bfd6e3 100644 (file)
@@ -301,6 +301,7 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)
        local_irq_restore(flags);
 }
 
+#ifdef CONFIG_SMP
 /* must come after the send_IPI functions above for inlining */
 static int convert_apicid_to_cpu(int apic_id)
 {
@@ -329,3 +330,4 @@ int safe_smp_processor_id(void)
        return cpuid >= 0 ? cpuid : 0;
 }
 #endif
+#endif
index d9384d5..b524dee 100644 (file)
@@ -294,8 +294,7 @@ static void __init early_get_apic_socketid_shift(void)
 
 static void __init uv_stringify(int len, char *to, char *from)
 {
-       /* Relies on 'to' being NULL chars so result will be NULL terminated */
-       strncpy(to, from, len-1);
+       strscpy(to, from, len);
 
        /* Trim trailing spaces */
        (void)strim(to);
@@ -1013,7 +1012,7 @@ static void __init calc_mmioh_map(enum mmioh_arch index,
 
        /* One (UV2) mapping */
        if (index == UV2_MMIOH) {
-               strncpy(id, "MMIOH", sizeof(id));
+               strscpy(id, "MMIOH", sizeof(id));
                max_io = max_pnode;
                mapped = 0;
                goto map_exit;
index c8eb1ac..1648aa0 100644 (file)
@@ -421,7 +421,7 @@ static void __init hpet_legacy_clockevent_register(struct hpet_channel *hc)
         * the IO_APIC has been initialized.
         */
        hc->cpu = boot_cpu_data.cpu_index;
-       strncpy(hc->name, "hpet", sizeof(hc->name));
+       strscpy(hc->name, "hpet", sizeof(hc->name));
        hpet_init_clockevent(hc, 50);
 
        hc->evt.tick_resume     = hpet_clkevt_legacy_resume;
index 23d4d71..975f98d 100644 (file)
@@ -75,7 +75,8 @@ DEFINE_STATIC_KEY_TRUE(virt_spin_lock_key);
 
 void __init native_pv_lock_init(void)
 {
-       if (!boot_cpu_has(X86_FEATURE_HYPERVISOR))
+       if (IS_ENABLED(CONFIG_PARAVIRT_SPINLOCKS) &&
+           !boot_cpu_has(X86_FEATURE_HYPERVISOR))
                static_branch_disable(&virt_spin_lock_key);
 }
 
index a60af02..a6ab43f 100644 (file)
@@ -202,21 +202,17 @@ static int param_set_action(const char *val, const struct kernel_param *kp)
 {
        int i;
        int n = ARRAY_SIZE(valid_acts);
-       char arg[ACTION_LEN], *p;
+       char arg[ACTION_LEN];
 
        /* (remove possible '\n') */
-       strncpy(arg, val, ACTION_LEN - 1);
-       arg[ACTION_LEN - 1] = '\0';
-       p = strchr(arg, '\n');
-       if (p)
-               *p = '\0';
+       strscpy(arg, val, strnchrnul(val, sizeof(arg)-1, '\n') - val + 1);
 
        for (i = 0; i < n; i++)
                if (!strcmp(arg, valid_acts[i].action))
                        break;
 
        if (i < n) {
-               strcpy(uv_nmi_action, arg);
+               strscpy(uv_nmi_action, arg, sizeof(uv_nmi_action));
                pr_info("UV: New NMI action:%s\n", uv_nmi_action);
                return 0;
        }
@@ -959,7 +955,7 @@ static int uv_handle_nmi(unsigned int reason, struct pt_regs *regs)
 
                /* Unexpected return, revert action to "dump" */
                if (master)
-                       strncpy(uv_nmi_action, "dump", strlen(uv_nmi_action));
+                       strscpy(uv_nmi_action, "dump", sizeof(uv_nmi_action));
        }
 
        /* Pause as all CPU's enter the NMI handler */
index 7558139..aea47e7 100644 (file)
@@ -14,6 +14,7 @@
 #include <crypto/sha2.h>
 #include <asm/purgatory.h>
 
+#include "../boot/compressed/error.h"
 #include "../boot/string.h"
 
 u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(".kexec-purgatory");
index 6afc249..6a0184e 100644 (file)
@@ -486,6 +486,16 @@ gotlock:
 }
 
 /*
+ * Include the architecture specific callee-save thunk of the
+ * __pv_queued_spin_unlock(). This thunk is put together with
+ * __pv_queued_spin_unlock() to make the callee-save thunk and the real unlock
+ * function close to each other sharing consecutive instruction cachelines.
+ * Alternatively, architecture specific version of __pv_queued_spin_unlock()
+ * can be defined.
+ */
+#include <asm/qspinlock_paravirt.h>
+
+/*
  * PV versions of the unlock fastpath and slowpath functions to be used
  * instead of queued_spin_unlock().
  */
@@ -533,16 +543,6 @@ __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked)
        pv_kick(node->cpu);
 }
 
-/*
- * Include the architecture specific callee-save thunk of the
- * __pv_queued_spin_unlock(). This thunk is put together with
- * __pv_queued_spin_unlock() to make the callee-save thunk and the real unlock
- * function close to each other sharing consecutive instruction cachelines.
- * Alternatively, architecture specific version of __pv_queued_spin_unlock()
- * can be defined.
- */
-#include <asm/qspinlock_paravirt.h>
-
 #ifndef __pv_queued_spin_unlock
 __visible __lockfunc void __pv_queued_spin_unlock(struct qspinlock *lock)
 {
index a317cb0..911d006 100644 (file)
@@ -943,7 +943,7 @@ struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq)
 /**************************************************************
  * Scheduling class statistics methods:
  */
-
+#ifdef CONFIG_SMP
 int sched_update_scaling(void)
 {
        unsigned int factor = get_update_sysctl_factor();
@@ -956,6 +956,7 @@ int sched_update_scaling(void)
        return 0;
 }
 #endif
+#endif
 
 static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se);
 
@@ -6335,9 +6336,8 @@ static inline int throttled_lb_pair(struct task_group *tg,
        return 0;
 }
 
-void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b, struct cfs_bandwidth *parent) {}
-
 #ifdef CONFIG_FAIR_GROUP_SCHED
+void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b, struct cfs_bandwidth *parent) {}
 static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) {}
 #endif
 
index 11a8846..0484627 100644 (file)
@@ -1250,6 +1250,7 @@ static inline raw_spinlock_t *__rq_lockp(struct rq *rq)
 
 bool cfs_prio_less(const struct task_struct *a, const struct task_struct *b,
                        bool fi);
+void task_vruntime_update(struct rq *rq, struct task_struct *p, bool in_fi);
 
 /*
  * Helpers to check if the CPU's core cookie matches with the task's cookie
@@ -2421,6 +2422,7 @@ static inline struct cpuidle_state *idle_get_state(struct rq *rq)
 #endif
 
 extern void schedule_idle(void);
+asmlinkage void schedule_user(void);
 
 extern void sysrq_sched_debug_show(void);
 extern void sched_init_granularity(void);