1. 16 4月, 2016 5 次提交
  2. 15 4月, 2016 7 次提交
    • J
      arm64: mm: Add trace_irqflags annotations to do_debug_exception() · 6afedcd2
      James Morse 提交于
      With CONFIG_PROVE_LOCKING, CONFIG_DEBUG_LOCKDEP and CONFIG_TRACE_IRQFLAGS
      enabled, lockdep will compare current->hardirqs_enabled with the flags from
      local_irq_save().
      
      When a debug exception occurs, interrupts are disabled in entry.S, but
      lockdep isn't told, resulting in:
      DEBUG_LOCKS_WARN_ON(current->hardirqs_enabled)
      ------------[ cut here ]------------
      WARNING: at ../kernel/locking/lockdep.c:3523
      Modules linked in:
      CPU: 3 PID: 1752 Comm: perf Not tainted 4.5.0-rc4+ #2204
      Hardware name: ARM Juno development board (r1) (DT)
      task: ffffffc974868000 ti: ffffffc975f40000 task.ti: ffffffc975f40000
      PC is at check_flags.part.35+0x17c/0x184
      LR is at check_flags.part.35+0x17c/0x184
      pc : [<ffffff80080fc93c>] lr : [<ffffff80080fc93c>] pstate: 600003c5
      [...]
      ---[ end trace 74631f9305ef5020 ]---
      Call trace:
      [<ffffff80080fc93c>] check_flags.part.35+0x17c/0x184
      [<ffffff80080ffe30>] lock_acquire+0xa8/0xc4
      [<ffffff8008093038>] breakpoint_handler+0x118/0x288
      [<ffffff8008082434>] do_debug_exception+0x3c/0xa8
      [<ffffff80080854b4>] el1_dbg+0x18/0x6c
      [<ffffff80081e82f4>] do_filp_open+0x64/0xdc
      [<ffffff80081d6e60>] do_sys_open+0x140/0x204
      [<ffffff80081d6f58>] SyS_openat+0x10/0x18
      [<ffffff8008085d30>] el0_svc_naked+0x24/0x28
      possible reason: unannotated irqs-off.
      irq event stamp: 65857
      hardirqs last  enabled at (65857): [<ffffff80081fb1c0>] lookup_mnt+0xf4/0x1b4
      hardirqs last disabled at (65856): [<ffffff80081fb188>] lookup_mnt+0xbc/0x1b4
      softirqs last  enabled at (65790): [<ffffff80080bdca4>] __do_softirq+0x1f8/0x290
      softirqs last disabled at (65757): [<ffffff80080be038>] irq_exit+0x9c/0xd0
      
      This patch adds the annotations to do_debug_exception(), while trying not
      to call trace_hardirqs_off() if el1_dbg() interrupted a task that already
      had irqs disabled.
      Signed-off-by: NJames Morse <james.morse@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      6afedcd2
    • A
      arm64: hw-breakpoint: Remove superfluous SMP function call · 4bc49274
      Anna-Maria Gleixner 提交于
      Since commit 1cf4f629 ("cpu/hotplug: Move online calls to
      hotplugged cpu") it is ensured that callbacks of CPU_ONLINE and
      CPU_DOWN_PREPARE are processed on the hotplugged CPU. Due to this SMP
      function calls are no longer required.
      
      Replace smp_call_function_single() with a direct call of
      hw_breakpoint_reset(). To keep the calling convention, interrupts are
      explicitly disabled around the call.
      
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Signed-off-by: NAnna-Maria Gleixner <anna-maria@linutronix.de>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      4bc49274
    • A
      arm64/debug: Remove superfluous SMP function call · 499c8150
      Anna-Maria Gleixner 提交于
      Since commit 1cf4f629 ("cpu/hotplug: Move online calls to
      hotplugged cpu") it is ensured that callbacks of CPU_ONLINE and
      CPU_DOWN_PREPARE are processed on the hotplugged CPU. Due to this SMP
      function calls are no longer required.
      
      Replace smp_call_function_single() with a direct call to
      clear_os_lock(). The function writes the OSLAR register to clear OS
      locking. This does not require to be called with interrupts disabled,
      therefore the smp_call_function_single() calling convention is not
      preserved.
      
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Signed-off-by: NAnna-Maria Gleixner <anna-maria@linutronix.de>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      499c8150
    • A
      arm64: simplify kernel segment mapping granularity · 97740051
      Ard Biesheuvel 提交于
      The mapping of the kernel consist of four segments, each of which is mapped
      with different permission attributes and/or lifetimes. To optimize the TLB
      and translation table footprint, we define various opaque constants in the
      linker script that resolve to different aligment values depending on the
      page size and whether CONFIG_DEBUG_ALIGN_RODATA is set.
      
      Considering that
      - a 4 KB granule kernel benefits from a 64 KB segment alignment (due to
        the fact that it allows the use of the contiguous bit),
      - the minimum alignment of the .data segment is THREAD_SIZE already, not
        PAGE_SIZE (i.e., we already have padding between _data and the start of
        the .data payload in many cases),
      - 2 MB is a suitable alignment value on all granule sizes, either for
        mapping directly (level 2 on 4 KB), or via the contiguous bit (level 3 on
        16 KB and 64 KB),
      - anything beyond 2 MB exceeds the minimum alignment mandated by the boot
        protocol, and can only be mapped efficiently if the physical alignment
        happens to be the same,
      
      we can simplify this by standardizing on 64 KB (or 2 MB) explicitly, i.e.,
      regardless of granule size, all segments are aligned either to 64 KB, or to
      2 MB if CONFIG_DEBUG_ALIGN_RODATA=y. This also means we can drop the Kconfig
      dependency of CONFIG_DEBUG_ALIGN_RODATA on CONFIG_ARM64_4K_PAGES.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      97740051
    • A
      arm64: cover the .head.text section in the .text segment mapping · 7eb90f2f
      Ard Biesheuvel 提交于
      Keeping .head.text out of the .text mapping buys us very little: its actual
      payload is only 4 KB, most of which is padding, but the page alignment may
      add up to 2 MB (in case of CONFIG_DEBUG_ALIGN_RODATA=y) of additional
      padding to the uncompressed kernel Image.
      
      Also, on 4 KB granule kernels, the 4 KB misalignment of .text forces us to
      map the adjacent 56 KB of code without the PTE_CONT attribute, and since
      this region contains things like the vector table and the GIC interrupt
      handling entry point, this region is likely to benefit from the reduced TLB
      pressure that results from PTE_CONT mappings.
      
      So remove the alignment between the .head.text and .text sections, and use
      the [_text, _etext) rather than the [_stext, _etext) interval for mapping
      the .text segment.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      7eb90f2f
    • A
      arm64: move early boot code to the .init segment · 546c8c44
      Ard Biesheuvel 提交于
      Apart from the arm64/linux and EFI header data structures, there is nothing
      in the .head.text section that must reside at the beginning of the Image.
      So let's move it to the .init section where it belongs.
      
      Note that this involves some minor tweaking of the EFI header, primarily
      because the address of 'stext' no longer coincides with the start of the
      .text section. It also requires a couple of relocated symbol references
      to be slightly rewritten or their definition moved to the linker script.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      546c8c44
    • A
      arm64: use 'segment' rather than 'chunk' to describe mapped kernel regions · 2c09ec06
      Ard Biesheuvel 提交于
      Replace the poorly defined term chunk with segment, which is a term that is
      already used by the ELF spec to describe contiguous mappings with the same
      permission attributes of statically allocated ranges of an executable.
      Acked-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      2c09ec06
  3. 14 4月, 2016 11 次提交
  4. 13 4月, 2016 2 次提交
    • J
      arm64: cpuidle: make arm_cpuidle_suspend() a bit more efficient · b5fda7ed
      Jisheng Zhang 提交于
      Currently, we check two pointers: cpu_ops and cpu_suspend on every idle
      state entry. These pointers check can be avoided:
      
      If cpu_ops has not been registered, arm_cpuidle_init() will return
      -EOPNOTSUPP, so arm_cpuidle_suspend() will never have chance to
      run. In other word, the cpu_ops check can be avoid.
      
      Similarly, the cpu_suspend check could be avoided in this hot path by
      moving it into arm_cpuidle_init().
      
      I measured the 4096 * time from arm_cpuidle_suspend entry point to the
      cpu_psci_cpu_suspend entry point. HW platform is Marvell BG4CT STB
      board.
      
      1. only one shell, no other process, hot-unplug secondary cpus, execute
      the following cmd
      
      while true
      do
      	sleep 0.2
      done
      
      before the patch: 1581220ns
      
      after the patch: 1579630ns
      
      reduced by 0.1%
      
      2. only one shell, no other process, hot-unplug secondary cpus, execute
      the following cmd
      
      while true
      do
      	md5sum /tmp/testfile
      	sleep 0.2
      done
      
      NOTE: the testfile size should be larger than L1+L2 cache size
      
      before the patch: 1961960ns
      after the patch: 1912500ns
      
      reduced by 2.5%
      
      So the more complex the system load, the bigger the improvement.
      Signed-off-by: NJisheng Zhang <jszhang@marvell.com>
      Acked-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      b5fda7ed
    • K
      arm64: cpufeature: append additional id_aa64mmfr2 fields to cpufeature · 7d7b4ae4
      Kefeng Wang 提交于
      There are some new cpu features which can be identified by id_aa64mmfr2,
      this patch appends all fields of it.
      Signed-off-by: NKefeng Wang <wangkefeng.wang@huawei.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      7d7b4ae4
  5. 31 3月, 2016 1 次提交
  6. 29 3月, 2016 3 次提交
    • W
      arm64: defconfig: updates for 4.6 · 431597bb
      Will Deacon 提交于
      A few defconfig updates got dropped on the floor during the merge window,
      so I've rounded up the remainder here:
      
        * Fix duplicate definition of MMC_BLOCK_MINORS and bump to 32 for
          msm8916
      
        * CPUFreq support for the Juno platform, using the MHU/SCPI interface
      
        * Removal of the default command line, which assumed a console called
          ttyAMA0
      
        * Bits and pieces for the Hi6220 (96Boards HiKey)
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      431597bb
    • S
      arm64: perf: Move PMU register related defines to asm/perf_event.h · b8cfadfc
      Shannon Zhao 提交于
      To use the ARMv8 PMU related register defines from the KVM code, we move
      the relevant definitions to asm/perf_event.h header file and rename them
      with prefix ARMV8_PMU_. This allows us to get rid of kvm_perf_event.h.
      Signed-off-by: NAnup Patel <anup.patel@linaro.org>
      Signed-off-by: NShannon Zhao <shannon.zhao@linaro.org>
      Acked-by: NMarc Zyngier <marc.zyngier@arm.com>
      Reviewed-by: NAndrew Jones <drjones@redhat.com>
      Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      b8cfadfc
    • J
      arm64: opcodes.h: Add arm big-endian config options before including arm header · a6002ec5
      James Morse 提交于
      arm and arm64 use different config options to specify big endian. This
      needs taking into account when including code/headers between the two
      architectures.
      
      A case in point is PAN, which uses the __instr_arm() macro to output
      instructions. The macro comes from opcodes.h, which lives under arch/arm.
      On a big-endian build the mismatched config options mean the instruction
      isn't byte swapped correctly, resulting in undefined instruction exceptions
      during boot:
      
      | alternatives: patching kernel code
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc0004505b4
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | kdevtmpfs[87]: undefined instruction: pc=ffffffc00076231c
      | Internal error: Oops - undefined instruction: 0 [#1] SMP
      | Modules linked in:
      | CPU: 0 PID: 87 Comm: kdevtmpfs Not tainted 4.1.16+ #5
      | Hardware name: Hisilicon PhosphorHi1382 EVB (DT)
      | task: ffffffc336591700 ti: ffffffc3365a4000 task.ti: ffffffc3365a4000
      | PC is at dump_instr+0x68/0x100
      | LR is at do_undefinstr+0x1d4/0x2a4
      | pc : [<ffffffc00076231c>] lr : [<ffffffc0000811d4>] pstate: 604001c5
      | sp : ffffffc3365a6450
      
      Cc: <stable@vger.kernel.org> #4.3.x-
      Reported-by: NHanjun Guo <guohanjun@huawei.com>
      Tested-by: NXuefeng Wang <wxf.wang@hisilicon.com>
      Signed-off-by: NJames Morse <james.morse@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      a6002ec5
  7. 26 3月, 2016 1 次提交
  8. 25 3月, 2016 3 次提交
    • M
      arm64: mm: allow preemption in copy_to_user_page · 691b1e2e
      Mark Rutland 提交于
      Currently we disable preemption in copy_to_user_page; a behaviour that
      we inherited from the 32-bit arm code. This was necessary for older
      cores without broadcast data cache maintenance, and ensured that cache
      lines were dirtied and cleaned by the same CPU. On these systems dirty
      cache line migration was not possible, so this was sufficient to
      guarantee coherency.
      
      On contemporary systems, cache coherence protocols permit (dirty) cache
      lines to migrate between CPUs as a result of speculation, prefetching,
      and other behaviours. To account for this, in ARMv8 data cache
      maintenance operations are broadcast and affect all data caches in the
      domain associated with the VA (i.e. ISH for kernel and user mappings).
      
      In __switch_to we ensure that tasks can be safely migrated in the middle
      of a maintenance sequence, using a dsb(ish) to ensure prior explicit
      memory accesses are observed and cache maintenance operations are
      completed before a task can be run on another CPU.
      
      Given the above, it is not necessary to disable preemption in
      copy_to_user_page. This patch removes the preempt_{disable,enable}
      calls, permitting preemption.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      691b1e2e
    • M
      arm64: consistently use p?d_set_huge · c661cb1c
      Mark Rutland 提交于
      Commit 324420bf ("arm64: add support for ioremap() block
      mappings") added new p?d_set_huge functions which do the hard work to
      generate and set a correct block entry.
      
      These differ from open-coded huge page creation in the early page table
      code by explicitly setting the P?D_TYPE_SECT bits (which are implicitly
      retained by mk_sect_prot() for any valid prot), but are otherwise
      identical (and cannot fail on arm64).
      
      For simplicity and consistency, make use of these in the initial page
      table creation code.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      c661cb1c
    • A
      arm64: kaslr: use callee saved register to preserve SCTLR across C call · d5e57437
      Ard Biesheuvel 提交于
      The KASLR code incorrectly expects the contents of x18 to be preserved
      across a call into C code, and uses it to stash the contents of SCTLR_EL1
      before enabling the MMU. If the MMU needs to be disabled again to create
      the randomized kernel mapping, x18 is written back to SCTLR_EL1, which is
      likely to crash the system if x18 has been clobbered by kasan_early_init()
      or kaslr_early_init(). So use x22 instead, which is not in use so far in
      head.S
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      d5e57437
  9. 23 3月, 2016 1 次提交
  10. 21 3月, 2016 6 次提交