Merge remote-tracking branch 'lsk/v3.10/topic/arm64-misc' into linux-linaro-lsk
authorMark Brown <broonie@linaro.org>
Sun, 18 May 2014 14:03:39 +0000 (15:03 +0100)
committerMark Brown <broonie@linaro.org>
Sun, 18 May 2014 14:03:39 +0000 (15:03 +0100)
Conflicts:
arch/arm64/Kconfig

1  2 
arch/arm64/Kconfig
arch/arm64/kernel/process.c

diff --combined arch/arm64/Kconfig
index 73366a635c3b8cc5e8337294a238f88438d75435,61ef3f0de6ee60ad0312ddaa577d879f0860d301..bd3a4e1f4ff682193bb5ef5dddbfe6b637b9b8a3
@@@ -2,7 -2,6 +2,7 @@@ config ARM6
        def_bool y
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select ARCH_USE_CMPXCHG_LOCKREF
 +      select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
        select ARCH_WANT_FRAME_POINTERS
        select BUILDTIME_EXTABLE_SORT
        select CLONE_BACKWARDS
        select COMMON_CLK
 +      select CPU_PM if (SUSPEND || CPU_IDLE)
+       select DCACHE_WORD_ACCESS
        select GENERIC_CLOCKEVENTS
 +      select GENERIC_CLOCKEVENTS_BROADCAST if SMP
        select GENERIC_IOMAP
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
        select GENERIC_SMP_IDLE_THREAD
+       select GENERIC_STRNCPY_FROM_USER
+       select GENERIC_STRNLEN_USER
        select GENERIC_TIME_VSYSCALL
        select HARDIRQS_SW_RESEND
        select HAVE_ARCH_TRACEHOOK
@@@ -26,7 -26,7 +29,8 @@@
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_API_DEBUG
        select HAVE_DMA_ATTRS
 +      select HAVE_DMA_CONTIGUOUS
+       select HAVE_EFFICIENT_UNALIGNED_ACCESS
        select HAVE_GENERIC_DMA_COHERENT
        select HAVE_GENERIC_HARDIRQS
        select HAVE_HW_BREAKPOINT if PERF_EVENTS
@@@ -79,7 -79,7 +83,7 @@@ config GENERIC_CSU
  config GENERIC_CALIBRATE_DELAY
        def_bool y
  
 -config ZONE_DMA32
 +config ZONE_DMA
        def_bool y
  
  config ARCH_DMA_ADDR_T_64BIT
@@@ -137,11 -137,6 +141,11 @@@ config ARM64_64K_PAGE
          look-up. AArch32 emulation is not available when this feature
          is enabled.
  
 +config CPU_BIG_ENDIAN
 +       bool "Build big-endian kernel"
 +       help
 +         Say Y if you plan on running a kernel in big-endian mode.
 +
  config SMP
        bool "Symmetric Multi-Processing"
        select USE_GENERIC_SMP_HELPERS
  
          If you don't know what to do here, say N.
  
 +config SCHED_MC
 +      bool "Multi-core scheduler support"
 +      depends on SMP
 +      help
 +        Multi-core scheduler support improves the CPU scheduler's decision
 +        making when dealing with multi-core CPU chips at a cost of slightly
 +        increased overhead in some places. If unsure say N here.
 +
 +config SCHED_SMT
 +      bool "SMT scheduler support"
 +      depends on SMP
 +      help
 +        Improves the CPU scheduler's decision making when dealing with
 +        MultiThreading at a cost of slightly increased overhead in some
 +        places. If unsure say N here.
 +
 +config DISABLE_CPU_SCHED_DOMAIN_BALANCE
 +      bool "(EXPERIMENTAL) Disable CPU level scheduler load-balancing"
 +      help
 +        Disables scheduler load-balancing at CPU sched domain level.
 +
 +config SCHED_HMP
 +      bool "(EXPERIMENTAL) Heterogenous multiprocessor scheduling"
 +      depends on DISABLE_CPU_SCHED_DOMAIN_BALANCE && SCHED_MC && FAIR_GROUP_SCHED && !SCHED_AUTOGROUP
 +      help
 +        Experimental scheduler optimizations for heterogeneous platforms.
 +        Attempts to introspectively select task affinity to optimize power
 +        and performance. Basic support for multiple (>2) cpu types is in place,
 +        but it has only been tested with two types of cpus.
 +        There is currently no support for migration of task groups, hence
 +        !SCHED_AUTOGROUP. Furthermore, normal load-balancing must be disabled
 +        between cpus of different type (DISABLE_CPU_SCHED_DOMAIN_BALANCE).
 +
 +config SCHED_HMP_PRIO_FILTER
 +      bool "(EXPERIMENTAL) Filter HMP migrations by task priority"
 +      depends on SCHED_HMP
 +      help
 +        Enables task priority based HMP migration filter. Any task with
 +        a NICE value above the threshold will always be on low-power cpus
 +        with less compute capacity.
 +
 +config SCHED_HMP_PRIO_FILTER_VAL
 +      int "NICE priority threshold"
 +      default 5
 +      depends on SCHED_HMP_PRIO_FILTER
 +
 +config HMP_FAST_CPU_MASK
 +      string "HMP scheduler fast CPU mask"
 +      depends on SCHED_HMP
 +      help
 +          Leave empty to use device tree information.
 +        Specify the cpuids of the fast CPUs in the system as a list string,
 +        e.g. cpuid 0+1 should be specified as 0-1.
 +
 +config HMP_SLOW_CPU_MASK
 +      string "HMP scheduler slow CPU mask"
 +      depends on SCHED_HMP
 +      help
 +        Leave empty to use device tree information.
 +        Specify the cpuids of the slow CPUs in the system as a list string,
 +        e.g. cpuid 0+1 should be specified as 0-1.
 +
 +config HMP_VARIABLE_SCALE
 +      bool "Allows changing the load tracking scale through sysfs"
 +      depends on SCHED_HMP
 +      help
 +        When turned on, this option exports the thresholds and load average
 +        period value for the load tracking patches through sysfs.
 +        The values can be modified to change the rate of load accumulation
 +        and the thresholds used for HMP migration.
 +        The load_avg_period_ms is the time in ms to reach a load average of
 +        0.5 for an idle task of 0 load average ratio that start a busy loop.
 +        The up_threshold and down_threshold is the value to go to a faster
 +        CPU or to go back to a slower cpu.
 +        The {up,down}_threshold are devided by 1024 before being compared
 +        to the load average.
 +        For examples, with load_avg_period_ms = 128 and up_threshold = 512,
 +        a running task with a load of 0 will be migrated to a bigger CPU after
 +        128ms, because after 128ms its load_avg_ratio is 0.5 and the real
 +        up_threshold is 0.5.
 +        This patch has the same behavior as changing the Y of the load
 +        average computation to
 +              (1002/1024)^(LOAD_AVG_PERIOD/load_avg_period_ms)
 +        but it remove intermadiate overflows in computation.
 +
 +config HMP_FREQUENCY_INVARIANT_SCALE
 +      bool "(EXPERIMENTAL) Frequency-Invariant Tracked Load for HMP"
 +      depends on HMP_VARIABLE_SCALE && CPU_FREQ
 +      help
 +        Scales the current load contribution in line with the frequency
 +        of the CPU that the task was executed on.
 +        In this version, we use a simple linear scale derived from the
 +        maximum frequency reported by CPUFreq.
 +        Restricting tracked load to be scaled by the CPU's frequency
 +        represents the consumption of possible compute capacity
 +        (rather than consumption of actual instantaneous capacity as
 +        normal) and allows the HMP migration's simple threshold
 +        migration strategy to interact more predictably with CPUFreq's
 +        asynchronous compute capacity changes.
 +
 +config SCHED_HMP_LITTLE_PACKING
 +      bool "Small task packing for HMP"
 +      depends on SCHED_HMP
 +      default n
 +      help
 +        Allows the HMP Scheduler to pack small tasks into CPUs in the
 +        smallest HMP domain.
 +        Controlled by two sysfs files in sys/kernel/hmp.
 +        packing_enable: 1 to enable, 0 to disable packing. Default 1.
 +        packing_limit: runqueue load ratio where a RQ is considered
 +          to be full. Default is NICE_0_LOAD * 9/8.
 +
  config NR_CPUS
        int "Maximum number of CPUs (2-32)"
        range 2 32
@@@ -378,25 -261,6 +382,25 @@@ config SYSVIPC_COMPA
  
  endmenu
  
 +menu "Power management options"
 +
 +source "kernel/power/Kconfig"
 +
 +source "drivers/cpufreq/Kconfig"
 +config ARCH_SUSPEND_POSSIBLE
 +      def_bool y
 +
 +config ARM64_CPU_SUSPEND
 +      def_bool PM_SLEEP
 +
 +endmenu
 +
 +menu "CPU Power Management"
 +
 +source "drivers/cpuidle/Kconfig"
 +
 +endmenu
 +
  source "net/Kconfig"
  
  source "drivers/Kconfig"
index 5837ca22896702313cd66bd7fc29f32e84792180,02a41bba165d8c673a1e8738952f02f956103114..d312399f07a9f422f23e4a27a9fb88fb1a770ce3
@@@ -33,7 -33,6 +33,7 @@@
  #include <linux/kallsyms.h>
  #include <linux/init.h>
  #include <linux/cpu.h>
 +#include <linux/cpuidle.h>
  #include <linux/elfcore.h>
  #include <linux/pm.h>
  #include <linux/tick.h>
@@@ -99,10 -98,8 +99,10 @@@ void arch_cpu_idle(void
         * This should do all the clock switching and wait for interrupt
         * tricks
         */
 -      cpu_do_idle();
 -      local_irq_enable();
 +      if (cpuidle_idle_call()) {
 +              cpu_do_idle();
 +              local_irq_enable();
 +      }
  }
  
  #ifdef CONFIG_HOTPLUG_CPU
@@@ -311,6 -308,7 +311,7 @@@ struct task_struct *__switch_to(struct 
  unsigned long get_wchan(struct task_struct *p)
  {
        struct stackframe frame;
+       unsigned long stack_page;
        int count = 0;
        if (!p || p == current || p->state == TASK_RUNNING)
                return 0;
        frame.fp = thread_saved_fp(p);
        frame.sp = thread_saved_sp(p);
        frame.pc = thread_saved_pc(p);
+       stack_page = (unsigned long)task_stack_page(p);
        do {
-               int ret = unwind_frame(&frame);
-               if (ret < 0)
+               if (frame.sp < stack_page ||
+                   frame.sp >= stack_page + THREAD_SIZE ||
+                   unwind_frame(&frame))
                        return 0;
                if (!in_sched_functions(frame.pc))
                        return frame.pc;