Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Oct 2016 14:59:37 +0000 (07:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Oct 2016 14:59:37 +0000 (07:59 -0700)
Pull ARM updates from Russell King:

 - Correct ARMs dma-mapping to use the correct printk format strings.

 - Avoid defining OBJCOPYFLAGS globally which upsets lkdtm rodata
   testing.

 - Cleanups to ARMs asm/memory.h include.

 - L2 cache cleanups.

 - Allow flat nommu binaries to be executed on ARM MMU systems.

 - Kernel hardening - add more read-only after init annotations,
   including making some kernel vdso variables const.

 - Ensure AMBA primecell clocks are appropriately defaulted.

 - ARM breakpoint cleanup.

 - Various StrongARM 11x0 and companion chip (SA1111) updates to bring
   this legacy platform to use more modern APIs for (eg) GPIOs and
   interrupts, which will allow us in the future to reduce some of the
   board-level driver clutter and elimate function callbacks into board
   code via platform data. There still appears to be interest in these
   platforms!

 - Remove the now redundant secure_flush_area() API.

 - Module PLT relocation optimisations. Ard says: This series of 4
   patches optimizes the ARM PLT generation code that is invoked at
   module load time, to get rid of the O(n^2) algorithm that results in
   pathological load times of 10 seconds or more for large modules on
   certain STB platforms.

 - ARMv7M cache maintanence support.

 - L2 cache PMU support

* 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: (35 commits)
  ARM: sa1111: provide to_sa1111_device() macro
  ARM: sa1111: add sa1111_get_irq()
  ARM: sa1111: clean up duplication in IRQ chip implementation
  ARM: sa1111: implement a gpio_chip for SA1111 GPIOs
  ARM: sa1111: move irq cleanup to separate function
  ARM: sa1111: use devm_clk_get()
  ARM: sa1111: use devm_kzalloc()
  ARM: sa1111: ensure we only touch RAB bus type devices when removing
  ARM: 8611/1: l2x0: add PMU support
  ARM: 8610/1: V7M: Add dsb before jumping in handler mode
  ARM: 8609/1: V7M: Add support for the Cortex-M7 processor
  ARM: 8608/1: V7M: Indirect proc_info construction for V7M CPUs
  ARM: 8607/1: V7M: Wire up caches for V7M processors with cache support.
  ARM: 8606/1: V7M: introduce cache operations
  ARM: 8605/1: V7M: fix notrace variant of save_and_disable_irqs
  ARM: 8604/1: V7M: Add support for reading the CTR with read_cpuid_cachetype()
  ARM: 8603/1: V7M: Add addresses for mem-mapped V7M cache operations
  ARM: 8602/1: factor out CSSELR/CCSIDR operations that use cp15 directly
  ARM: kernel: avoid brute force search on PLT generation
  ARM: kernel: sort relocation sections before allocating PLTs
  ...

1  2 
arch/arm/kernel/vdso.c
include/linux/cpuhotplug.h

diff --combined arch/arm/kernel/vdso.c
index a0affd14086aabb7beea88e29606bd4bf5c9d41b,bbbffe9461221248d051e11bd618be9f8d83d3b5..53cf86cf2d1af943831a7f7b1980c7a30c4889b8
@@@ -17,6 -17,7 +17,7 @@@
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  
+ #include <linux/cache.h>
  #include <linux/elf.h>
  #include <linux/err.h>
  #include <linux/kernel.h>
@@@ -39,7 -40,7 +40,7 @@@
  static struct page **vdso_text_pagelist;
  
  /* Total number of pages needed for the data and text portions of the VDSO. */
- unsigned int vdso_total_pages __read_mostly;
+ unsigned int vdso_total_pages __ro_after_init;
  
  /*
   * The VDSO data page.
  static union vdso_data_store vdso_data_store __page_aligned_data;
  static struct vdso_data *vdso_data = &vdso_data_store.data;
  
- static struct page *vdso_data_page;
- static struct vm_special_mapping vdso_data_mapping = {
+ static struct page *vdso_data_page __ro_after_init;
+ static const struct vm_special_mapping vdso_data_mapping = {
        .name = "[vvar]",
        .pages = &vdso_data_page,
  };
  
- static struct vm_special_mapping vdso_text_mapping = {
+ static struct vm_special_mapping vdso_text_mapping __ro_after_init = {
        .name = "[vdso]",
  };
  
@@@ -67,7 -68,7 +68,7 @@@ struct elfinfo 
  /* Cached result of boot-time check for whether the arch timer exists,
   * and if so, whether the virtual counter is useable.
   */
- static bool cntvct_ok __read_mostly;
+ static bool cntvct_ok __ro_after_init;
  
  static bool __init cntvct_functional(void)
  {
@@@ -270,7 -271,7 +271,7 @@@ static bool tk_is_cntvct(const struct t
        if (!IS_ENABLED(CONFIG_ARM_ARCH_TIMER))
                return false;
  
 -      if (strcmp(tk->tkr_mono.clock->name, "arch_sys_counter") != 0)
 +      if (!tk->tkr_mono.clock->archdata.vdso_direct)
                return false;
  
        return true;
index 7b6c446ee17f643c1fa78dd8d27ef4e140e6f04f,52a81f597e72cf8f149205734ccd8c53903e4cb6..a8ffc405f9151609186ddabef95f9d4366ab0133
@@@ -16,40 -16,15 +16,40 @@@ enum cpuhp_state 
        CPUHP_PERF_SUPERH,
        CPUHP_X86_HPET_DEAD,
        CPUHP_X86_APB_DEAD,
 +      CPUHP_VIRT_NET_DEAD,
 +      CPUHP_SLUB_DEAD,
 +      CPUHP_MM_WRITEBACK_DEAD,
 +      CPUHP_SOFTIRQ_DEAD,
 +      CPUHP_NET_MVNETA_DEAD,
 +      CPUHP_CPUIDLE_DEAD,
 +      CPUHP_ARM64_FPSIMD_DEAD,
 +      CPUHP_ARM_OMAP_WAKE_DEAD,
 +      CPUHP_IRQ_POLL_DEAD,
 +      CPUHP_BLOCK_SOFTIRQ_DEAD,
 +      CPUHP_VIRT_SCSI_DEAD,
 +      CPUHP_ACPI_CPUDRV_DEAD,
 +      CPUHP_S390_PFAULT_DEAD,
 +      CPUHP_BLK_MQ_DEAD,
        CPUHP_WORKQUEUE_PREP,
        CPUHP_POWER_NUMA_PREPARE,
        CPUHP_HRTIMERS_PREPARE,
        CPUHP_PROFILE_PREPARE,
        CPUHP_X2APIC_PREPARE,
        CPUHP_SMPCFD_PREPARE,
 +      CPUHP_RELAY_PREPARE,
 +      CPUHP_SLAB_PREPARE,
 +      CPUHP_MD_RAID5_PREPARE,
        CPUHP_RCUTREE_PREP,
 +      CPUHP_CPUIDLE_COUPLED_PREPARE,
 +      CPUHP_POWERPC_PMAC_PREPARE,
 +      CPUHP_POWERPC_MMU_CTX_PREPARE,
        CPUHP_NOTIFY_PREPARE,
 +      CPUHP_ARM_SHMOBILE_SCU_PREPARE,
 +      CPUHP_SH_SH3X_PREPARE,
 +      CPUHP_BLK_MQ_PREPARE,
        CPUHP_TIMERS_DEAD,
 +      CPUHP_NOTF_ERR_INJ_PREPARE,
 +      CPUHP_MIPS_SOC_PREPARE,
        CPUHP_BRINGUP_CPU,
        CPUHP_AP_IDLE_DEAD,
        CPUHP_AP_OFFLINE,
@@@ -72,8 -47,6 +72,8 @@@
        CPUHP_AP_PERF_METAG_STARTING,
        CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
        CPUHP_AP_ARM_VFP_STARTING,
 +      CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING,
 +      CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
        CPUHP_AP_PERF_ARM_STARTING,
        CPUHP_AP_ARM_L2X0_STARTING,
        CPUHP_AP_ARM_ARCH_TIMER_STARTING,
@@@ -97,6 -70,7 +97,6 @@@
        CPUHP_AP_ARM64_ISNDEP_STARTING,
        CPUHP_AP_SMPCFD_DYING,
        CPUHP_AP_X86_TBOOT_DYING,
 -      CPUHP_AP_NOTIFY_STARTING,
        CPUHP_AP_ONLINE,
        CPUHP_TEARDOWN_CPU,
        CPUHP_AP_ONLINE_IDLE,
        CPUHP_AP_PERF_S390_SF_ONLINE,
        CPUHP_AP_PERF_ARM_CCI_ONLINE,
        CPUHP_AP_PERF_ARM_CCN_ONLINE,
+       CPUHP_AP_PERF_ARM_L2X0_ONLINE,
        CPUHP_AP_WORKQUEUE_ONLINE,
        CPUHP_AP_RCUTREE_ONLINE,
        CPUHP_AP_NOTIFY_ONLINE,
  
  int __cpuhp_setup_state(enum cpuhp_state state,       const char *name, bool invoke,
                        int (*startup)(unsigned int cpu),
 -                      int (*teardown)(unsigned int cpu));
 +                      int (*teardown)(unsigned int cpu), bool multi_instance);
  
  /**
   * cpuhp_setup_state - Setup hotplug state callbacks with calling the callbacks
@@@ -144,7 -119,7 +145,7 @@@ static inline int cpuhp_setup_state(enu
                                    int (*startup)(unsigned int cpu),
                                    int (*teardown)(unsigned int cpu))
  {
 -      return __cpuhp_setup_state(state, name, true, startup, teardown);
 +      return __cpuhp_setup_state(state, name, true, startup, teardown, false);
  }
  
  /**
@@@ -163,66 -138,7 +164,66 @@@ static inline int cpuhp_setup_state_noc
                                            int (*startup)(unsigned int cpu),
                                            int (*teardown)(unsigned int cpu))
  {
 -      return __cpuhp_setup_state(state, name, false, startup, teardown);
 +      return __cpuhp_setup_state(state, name, false, startup, teardown,
 +                                 false);
 +}
 +
 +/**
 + * cpuhp_setup_state_multi - Add callbacks for multi state
 + * @state:    The state for which the calls are installed
 + * @name:     Name of the callback.
 + * @startup:  startup callback function
 + * @teardown: teardown callback function
 + *
 + * Sets the internal multi_instance flag and prepares a state to work as a multi
 + * instance callback. No callbacks are invoked at this point. The callbacks are
 + * invoked once an instance for this state are registered via
 + * @cpuhp_state_add_instance or @cpuhp_state_add_instance_nocalls.
 + */
 +static inline int cpuhp_setup_state_multi(enum cpuhp_state state,
 +                                        const char *name,
 +                                        int (*startup)(unsigned int cpu,
 +                                                       struct hlist_node *node),
 +                                        int (*teardown)(unsigned int cpu,
 +                                                        struct hlist_node *node))
 +{
 +      return __cpuhp_setup_state(state, name, false,
 +                                 (void *) startup,
 +                                 (void *) teardown, true);
 +}
 +
 +int __cpuhp_state_add_instance(enum cpuhp_state state, struct hlist_node *node,
 +                             bool invoke);
 +
 +/**
 + * cpuhp_state_add_instance - Add an instance for a state and invoke startup
 + *                            callback.
 + * @state:    The state for which the instance is installed
 + * @node:     The node for this individual state.
 + *
 + * Installs the instance for the @state and invokes the startup callback on
 + * the present cpus which have already reached the @state. The @state must have
 + * been earlier marked as multi-instance by @cpuhp_setup_state_multi.
 + */
 +static inline int cpuhp_state_add_instance(enum cpuhp_state state,
 +                                         struct hlist_node *node)
 +{
 +      return __cpuhp_state_add_instance(state, node, true);
 +}
 +
 +/**
 + * cpuhp_state_add_instance_nocalls - Add an instance for a state without
 + *                                    invoking the startup callback.
 + * @state:    The state for which the instance is installed
 + * @node:     The node for this individual state.
 + *
 + * Installs the instance for the @state The @state must have been earlier
 + * marked as multi-instance by @cpuhp_setup_state_multi.
 + */
 +static inline int cpuhp_state_add_instance_nocalls(enum cpuhp_state state,
 +                                                 struct hlist_node *node)
 +{
 +      return __cpuhp_state_add_instance(state, node, false);
  }
  
  void __cpuhp_remove_state(enum cpuhp_state state, bool invoke);
@@@ -249,51 -165,6 +250,51 @@@ static inline void cpuhp_remove_state_n
        __cpuhp_remove_state(state, false);
  }
  
 +/**
 + * cpuhp_remove_multi_state - Remove hotplug multi state callback
 + * @state:    The state for which the calls are removed
 + *
 + * Removes the callback functions from a multi state. This is the reverse of
 + * cpuhp_setup_state_multi(). All instances should have been removed before
 + * invoking this function.
 + */
 +static inline void cpuhp_remove_multi_state(enum cpuhp_state state)
 +{
 +      __cpuhp_remove_state(state, false);
 +}
 +
 +int __cpuhp_state_remove_instance(enum cpuhp_state state,
 +                                struct hlist_node *node, bool invoke);
 +
 +/**
 + * cpuhp_state_remove_instance - Remove hotplug instance from state and invoke
 + *                               the teardown callback
 + * @state:    The state from which the instance is removed
 + * @node:     The node for this individual state.
 + *
 + * Removes the instance and invokes the teardown callback on the present cpus
 + * which have already reached the @state.
 + */
 +static inline int cpuhp_state_remove_instance(enum cpuhp_state state,
 +                                            struct hlist_node *node)
 +{
 +      return __cpuhp_state_remove_instance(state, node, true);
 +}
 +
 +/**
 + * cpuhp_state_remove_instance_nocalls - Remove hotplug instance from state
 + *                                     without invoking the reatdown callback
 + * @state:    The state from which the instance is removed
 + * @node:     The node for this individual state.
 + *
 + * Removes the instance without invoking the teardown callback.
 + */
 +static inline int cpuhp_state_remove_instance_nocalls(enum cpuhp_state state,
 +                                                    struct hlist_node *node)
 +{
 +      return __cpuhp_state_remove_instance(state, node, false);
 +}
 +
  #ifdef CONFIG_SMP
  void cpuhp_online_idle(enum cpuhp_state state);
  #else