• Dmitry Adamushko's avatar
    x86: microcode: use smp_call_function_single instead of set_cpus_allowed,... · 871b72dd
    Dmitry Adamushko authored
    x86: microcode: use smp_call_function_single instead of set_cpus_allowed, cleanup of synchronization logic
    * Solve issues described in 6f66cbc6
      in a way that doesn't resort to set_cpus_allowed();
    * in fact, only collect_cpu_info and apply_microcode callbacks
      must run on a target cpu, others will do just fine on any other.
      smp_call_function_single() (as suggested by Ingo) is used to run
      these callbacks on a target cpu.
    * cleanup of synchronization logic of the 'microcode_core' part
      The generic 'microcode_core' part guarantees that only a single cpu
      (be it a full-fledged cpu, one of the cores or HT)
      is being updated at any particular moment of time.
      In general, there is no need for any additional sync. mechanism in
      arch-specific parts (the patch removes existing spinlocks).
      See also the "Synchronization" section in microcode_core.c.
    * return -EINVAL instead of -1 (which is translated into -EPERM) in
      microcode_write(), reload_cpu() and mc_sysdev_add(). Other suggestions
      for an error code?
    * use 'enum ucode_state' as return value of request_microcode_{fw, user}
      to gain more flexibility by distinguishing between real error cases
      and situations when an appropriate ucode was not found (which is not an
      error per-se).
    * some minor cleanups
    Thanks a lot to Hugh Dickins for review/suggestions/testing!
       Reference: http://marc.info/?l=linux-kernel&m=124025889012541&w=2
    [ Impact: refactor and clean up microcode driver locking code ]
    Signed-off-by: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
    Acked-by: default avatarHugh Dickins <hugh@veritas.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Andreas Herrmann <andreas.herrmann3@amd.com>
    Cc: Peter Oruba <peter.oruba@amd.com>
    Cc: Arjan van de Ven <arjan@infradead.org>
    LKML-Reference: <1242078507.5560.9.camel@earth>
    [ did some more cleanups ]
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
     arch/x86/include/asm/microcode.h  |   25 ++
     arch/x86/kernel/microcode_amd.c   |   58 ++----
     arch/x86/kernel/microcode_core.c  |  326 +++++++++++++++++++++-----------------
     arch/x86/kernel/microcode_intel.c |   92 +++-------
     4 files changed, 261 insertions(+), 240 deletions(-)
    (~20 new comment lines)
microcode_amd.c 8.53 KB