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

1  2 
arch/x86/include/asm/microcode.h
arch/x86/include/asm/processor.h
arch/x86/kernel/alternative.c
arch/x86/kernel/paravirt.c
kernel/sched/fair.c
kernel/sched/sched.h

@@@ -12,73 -52,88 +12,67 @@@ struct ucode_cpu_info 
        struct cpu_signature    cpu_sig;
        void                    *mc;
  };
 -extern struct ucode_cpu_info ucode_cpu_info[];
 -struct cpio_data find_microcode_in_initrd(const char *path, bool use_pa);
 -
 -#ifdef CONFIG_MICROCODE_INTEL
 -extern struct microcode_ops * __init init_intel_microcode(void);
 -#else
 -static inline struct microcode_ops * __init init_intel_microcode(void)
 -{
 -      return NULL;
 -}
 -#endif /* CONFIG_MICROCODE_INTEL */
  
 -#ifdef CONFIG_MICROCODE_AMD
 -extern struct microcode_ops * __init init_amd_microcode(void);
 -extern void __exit exit_amd_microcode(void);
 +#ifdef CONFIG_MICROCODE
 +void load_ucode_bsp(void);
 +void load_ucode_ap(void);
 +void microcode_bsp_resume(void);
  #else
 -static inline struct microcode_ops * __init init_amd_microcode(void)
 -{
 -      return NULL;
 -}
 -static inline void __exit exit_amd_microcode(void) {}
 +static inline void load_ucode_bsp(void)       { }
 +static inline void load_ucode_ap(void) { }
 +static inline void microcode_bsp_resume(void) { }
  #endif
  
 -#define MAX_UCODE_COUNT 128
 +#ifdef CONFIG_CPU_SUP_INTEL
 +/* Intel specific microcode defines. Public for IFS */
 +struct microcode_header_intel {
 +      unsigned int    hdrver;
 +      unsigned int    rev;
 +      unsigned int    date;
 +      unsigned int    sig;
 +      unsigned int    cksum;
 +      unsigned int    ldrver;
 +      unsigned int    pf;
 +      unsigned int    datasize;
 +      unsigned int    totalsize;
 +      unsigned int    metasize;
 +      unsigned int    reserved[2];
 +};
  
 -#define QCHAR(a, b, c, d) ((a) + ((b) << 8) + ((c) << 16) + ((d) << 24))
 -#define CPUID_INTEL1 QCHAR('G', 'e', 'n', 'u')
 -#define CPUID_INTEL2 QCHAR('i', 'n', 'e', 'I')
 -#define CPUID_INTEL3 QCHAR('n', 't', 'e', 'l')
 -#define CPUID_AMD1 QCHAR('A', 'u', 't', 'h')
 -#define CPUID_AMD2 QCHAR('e', 'n', 't', 'i')
 -#define CPUID_AMD3 QCHAR('c', 'A', 'M', 'D')
 +struct microcode_intel {
 +      struct microcode_header_intel   hdr;
 +      unsigned int                    bits[];
 +};
  
 -#define CPUID_IS(a, b, c, ebx, ecx, edx)      \
 -              (!((ebx ^ (a))|(edx ^ (b))|(ecx ^ (c))))
 +#define DEFAULT_UCODE_DATASIZE                (2000)
 +#define MC_HEADER_SIZE                        (sizeof(struct microcode_header_intel))
 +#define MC_HEADER_TYPE_MICROCODE      1
 +#define MC_HEADER_TYPE_IFS            2
  
 -/*
 - * In early loading microcode phase on BSP, boot_cpu_data is not set up yet.
 - * x86_cpuid_vendor() gets vendor id for BSP.
 - *
 - * In 32 bit AP case, accessing boot_cpu_data needs linear address. To simplify
 - * coding, we still use x86_cpuid_vendor() to get vendor id for AP.
 - *
 - * x86_cpuid_vendor() gets vendor information directly from CPUID.
 - */
 -static inline int x86_cpuid_vendor(void)
 +static inline int intel_microcode_get_datasize(struct microcode_header_intel *hdr)
  {
 -      u32 eax = 0x00000000;
 -      u32 ebx, ecx = 0, edx;
 -
 -      native_cpuid(&eax, &ebx, &ecx, &edx);
 -
 -      if (CPUID_IS(CPUID_INTEL1, CPUID_INTEL2, CPUID_INTEL3, ebx, ecx, edx))
 -              return X86_VENDOR_INTEL;
 -
 -      if (CPUID_IS(CPUID_AMD1, CPUID_AMD2, CPUID_AMD3, ebx, ecx, edx))
 -              return X86_VENDOR_AMD;
 -
 -      return X86_VENDOR_UNKNOWN;
 +      return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
  }
  
 -static inline unsigned int x86_cpuid_family(void)
 +static inline u32 intel_get_microcode_revision(void)
  {
 -      u32 eax = 0x00000001;
 -      u32 ebx, ecx = 0, edx;
 +      u32 rev, dummy;
 +
 +      native_wrmsrl(MSR_IA32_UCODE_REV, 0);
  
 -      native_cpuid(&eax, &ebx, &ecx, &edx);
 +      /* As documented in the SDM: Do a CPUID 1 here */
 +      native_cpuid_eax(1);
  
 -      return x86_family(eax);
 +      /* get the current revision from MSR 0x8B */
 +      native_rdmsr(MSR_IA32_UCODE_REV, dummy, rev);
 +
 +      return rev;
  }
  
 -#ifdef CONFIG_MICROCODE
 -extern void __init load_ucode_bsp(void);
 -extern void load_ucode_ap(void);
 -void reload_early_microcode(unsigned int cpu);
 -extern bool initrd_gone;
 -void microcode_bsp_resume(void);
 -#else
 -static inline void __init load_ucode_bsp(void)                        { }
 -static inline void load_ucode_ap(void)                                { }
 -static inline void reload_early_microcode(unsigned int cpu)   { }
 -static inline void microcode_bsp_resume(void)                 { }
 -#endif
 +void show_ucode_info_early(void);
 +
 +#else /* CONFIG_CPU_SUP_INTEL */
 +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 */
@@@ -676,13 -682,11 +676,15 @@@ extern u16 get_llc_id(unsigned int cpu)
  #ifdef CONFIG_CPU_SUP_AMD
  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);
Simple merge
Simple merge
@@@ -956,37 -702,92 +956,38 @@@ int sched_update_scaling(void
        return 0;
  }
  #endif
+ #endif
  
 -/*
 - * delta /= w
 - */
 -static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
 -{
 -      if (unlikely(se->load.weight != NICE_0_LOAD))
 -              delta = __calc_delta(delta, NICE_0_LOAD, &se->load);
 -
 -      return delta;
 -}
 +static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se);
  
  /*
 - * The idea is to set a period in which each task runs once.
 - *
 - * When there are too many tasks (sched_nr_latency) we have to stretch
 - * this period because otherwise the slices get too small.
 - *
 - * p = (nr <= nl) ? l : l*nr/nl
 + * XXX: strictly: vd_i += N*r_i/w_i such that: vd_i > ve_i
 + * this is probably good enough.
   */
 -static u64 __sched_period(unsigned long nr_running)
 +static void update_deadline(struct cfs_rq *cfs_rq, struct sched_entity *se)
  {
 -      if (unlikely(nr_running > sched_nr_latency))
 -              return nr_running * sysctl_sched_min_granularity;
 -      else
 -              return sysctl_sched_latency;
 -}
 -
 -static bool sched_idle_cfs_rq(struct cfs_rq *cfs_rq);
 -
 -/*
 - * We calculate the wall-time slice from the period by taking a part
 - * proportional to the weight.
 - *
 - * s = p*P[w/rw]
 - */
 -static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se)
 -{
 -      unsigned int nr_running = cfs_rq->nr_running;
 -      struct sched_entity *init_se = se;
 -      unsigned int min_gran;
 -      u64 slice;
 -
 -      if (sched_feat(ALT_PERIOD))
 -              nr_running = rq_of(cfs_rq)->cfs.h_nr_running;
 -
 -      slice = __sched_period(nr_running + !se->on_rq);
 -
 -      for_each_sched_entity(se) {
 -              struct load_weight *load;
 -              struct load_weight lw;
 -              struct cfs_rq *qcfs_rq;
 -
 -              qcfs_rq = cfs_rq_of(se);
 -              load = &qcfs_rq->load;
 -
 -              if (unlikely(!se->on_rq)) {
 -                      lw = qcfs_rq->load;
 +      if ((s64)(se->vruntime - se->deadline) < 0)
 +              return;
  
 -                      update_load_add(&lw, se->load.weight);
 -                      load = &lw;
 -              }
 -              slice = __calc_delta(slice, se->load.weight, load);
 -      }
 +      /*
 +       * For EEVDF the virtual time slope is determined by w_i (iow.
 +       * nice) while the request time r_i is determined by
 +       * sysctl_sched_base_slice.
 +       */
 +      se->slice = sysctl_sched_base_slice;
  
 -      if (sched_feat(BASE_SLICE)) {
 -              if (se_is_idle(init_se) && !sched_idle_cfs_rq(cfs_rq))
 -                      min_gran = sysctl_sched_idle_min_granularity;
 -              else
 -                      min_gran = sysctl_sched_min_granularity;
 +      /*
 +       * EEVDF: vd_i = ve_i + r_i / w_i
 +       */
 +      se->deadline = se->vruntime + calc_delta_fair(se->slice, se);
  
 -              slice = max_t(u64, slice, min_gran);
 +      /*
 +       * The task has consumed its request, reschedule.
 +       */
 +      if (cfs_rq->nr_running > 1) {
 +              resched_curr(rq_of(cfs_rq));
 +              clear_buddies(cfs_rq, se);
        }
 -
 -      return slice;
 -}
 -
 -/*
 - * We calculate the vruntime slice of a to-be-inserted task.
 - *
 - * vs = s/w
 - */
 -static u64 sched_vslice(struct cfs_rq *cfs_rq, struct sched_entity *se)
 -{
 -      return calc_delta_fair(sched_slice(cfs_rq, se), se);
  }
  
  #include "pelt.h"
@@@ -6335,9 -6187,8 +6336,8 @@@ static inline int throttled_lb_pair(str
        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) {}
++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
  
Simple merge