3a6bfbc91d
The arch_mutex_cpu_relax() function, introduced by 34b133f
, is
hacky and ugly. It was added a few years ago to address the fact
that common cpu_relax() calls include yielding on s390, and thus
impact the optimistic spinning functionality of mutexes. Nowadays
we use this function well beyond mutexes: rwsem, qrwlock, mcs and
lockref. Since the macro that defines the call is in the mutex header,
any users must include mutex.h and the naming is misleading as well.
This patch (i) renames the call to cpu_relax_lowlatency ("relax, but
only if you can do it with very low latency") and (ii) defines it in
each arch's asm/processor.h local header, just like for regular cpu_relax
functions. On all archs, except s390, cpu_relax_lowlatency is simply cpu_relax,
and thus we can take it out of mutex.h. While this can seem redundant,
I believe it is a good choice as it allows us to move out arch specific
logic from generic locking primitives and enables future(?) archs to
transparently define it, similarly to System Z.
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Aurelien Jacquiot <a-jacquiot@ti.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Bharat Bhushan <r65777@freescale.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Chen Liqin <liqin.linux@gmail.com>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: David Howells <dhowells@redhat.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Cc: Dominik Dingel <dingel@linux.vnet.ibm.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Helge Deller <deller@gmx.de>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: James E.J. Bottomley <jejb@parisc-linux.org>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Jesper Nilsson <jesper.nilsson@axis.com>
Cc: Joe Perches <joe@perches.com>
Cc: Jonas Bonn <jonas@southpole.se>
Cc: Joseph Myers <joseph@codesourcery.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com>
Cc: Lennox Wu <lennox.wu@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mark Salter <msalter@redhat.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Michael Neuling <mikey@neuling.org>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Mikael Starvik <starvik@axis.com>
Cc: Nicolas Pitre <nico@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Qais Yousef <qais.yousef@imgtec.com>
Cc: Qiaowei Ren <qiaowei.ren@intel.com>
Cc: Rafael Wysocki <rafael.j.wysocki@intel.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Richard Kuo <rkuo@codeaurora.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Steven Miao <realmz6@gmail.com>
Cc: Steven Rostedt <srostedt@redhat.com>
Cc: Stratos Karafotis <stratosk@semaphore.gr>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vasily Kulikov <segoon@openwall.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Vineet Gupta <Vineet.Gupta1@synopsys.com>
Cc: Waiman Long <Waiman.Long@hp.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Wolfram Sang <wsa@the-dreams.de>
Cc: adi-buildroot-devel@lists.sourceforge.net
Cc: linux390@de.ibm.com
Cc: linux-alpha@vger.kernel.org
Cc: linux-am33-list@redhat.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-c6x-dev@linux-c6x.org
Cc: linux-cris-kernel@axis.com
Cc: linux-hexagon@vger.kernel.org
Cc: linux-ia64@vger.kernel.org
Cc: linux@lists.openrisc.net
Cc: linux-m32r-ja@ml.linux-m32r.org
Cc: linux-m32r@ml.linux-m32r.org
Cc: linux-m68k@lists.linux-m68k.org
Cc: linux-metag@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: linux-parisc@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-s390@vger.kernel.org
Cc: linux-sh@vger.kernel.org
Cc: linux-xtensa@linux-xtensa.org
Cc: sparclinux@vger.kernel.org
Link: http://lkml.kernel.org/r/1404079773.2619.4.camel@buesod1.americas.hpqcorp.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
134 lines
4.1 KiB
C
134 lines
4.1 KiB
C
/*
|
|
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* vineetg: March 2009
|
|
* -Implemented task_pt_regs( )
|
|
*
|
|
* Amit Bhor, Sameer Dhavale, Ashwin Chaugule: Codito Technologies 2004
|
|
*/
|
|
|
|
#ifndef __ASM_ARC_PROCESSOR_H
|
|
#define __ASM_ARC_PROCESSOR_H
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <asm/ptrace.h>
|
|
|
|
/* Arch specific stuff which needs to be saved per task.
|
|
* However these items are not so important so as to earn a place in
|
|
* struct thread_info
|
|
*/
|
|
struct thread_struct {
|
|
unsigned long ksp; /* kernel mode stack pointer */
|
|
unsigned long callee_reg; /* pointer to callee regs */
|
|
unsigned long fault_address; /* dbls as brkpt holder as well */
|
|
#ifdef CONFIG_ARC_FPU_SAVE_RESTORE
|
|
struct arc_fpu fpu;
|
|
#endif
|
|
};
|
|
|
|
#define INIT_THREAD { \
|
|
.ksp = sizeof(init_stack) + (unsigned long) init_stack, \
|
|
}
|
|
|
|
/* Forward declaration, a strange C thing */
|
|
struct task_struct;
|
|
|
|
/* Return saved PC of a blocked thread */
|
|
unsigned long thread_saved_pc(struct task_struct *t);
|
|
|
|
#define task_pt_regs(p) \
|
|
((struct pt_regs *)(THREAD_SIZE + (void *)task_stack_page(p)) - 1)
|
|
|
|
/* Free all resources held by a thread */
|
|
#define release_thread(thread) do { } while (0)
|
|
|
|
/* Prepare to copy thread state - unlazy all lazy status */
|
|
#define prepare_to_copy(tsk) do { } while (0)
|
|
|
|
/*
|
|
* A lot of busy-wait loops in SMP are based off of non-volatile data otherwise
|
|
* get optimised away by gcc
|
|
*/
|
|
#ifdef CONFIG_SMP
|
|
#define cpu_relax() __asm__ __volatile__ ("" : : : "memory")
|
|
#else
|
|
#define cpu_relax() do { } while (0)
|
|
#endif
|
|
|
|
#define cpu_relax_lowlatency() cpu_relax()
|
|
|
|
#define copy_segments(tsk, mm) do { } while (0)
|
|
#define release_segments(mm) do { } while (0)
|
|
|
|
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret)
|
|
|
|
/*
|
|
* Where abouts of Task's sp, fp, blink when it was last seen in kernel mode.
|
|
* Look in process.c for details of kernel stack layout
|
|
*/
|
|
#define KSTK_ESP(tsk) (tsk->thread.ksp)
|
|
|
|
#define KSTK_REG(tsk, off) (*((unsigned int *)(KSTK_ESP(tsk) + \
|
|
sizeof(struct callee_regs) + off)))
|
|
|
|
#define KSTK_BLINK(tsk) KSTK_REG(tsk, 4)
|
|
#define KSTK_FP(tsk) KSTK_REG(tsk, 0)
|
|
|
|
extern void start_thread(struct pt_regs * regs, unsigned long pc,
|
|
unsigned long usp);
|
|
|
|
extern unsigned int get_wchan(struct task_struct *p);
|
|
|
|
/*
|
|
* Default implementation of macro that returns current
|
|
* instruction pointer ("program counter").
|
|
* Should the PC register be read instead ? This macro does not seem to
|
|
* be used in many places so this wont be all that bad.
|
|
*/
|
|
#define current_text_addr() ({ __label__ _l; _l: &&_l; })
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
/* Kernels Virtual memory area.
|
|
* Unlike other architectures(MIPS, sh, cris ) ARC 700 does not have a
|
|
* "kernel translated" region (like KSEG2 in MIPS). So we use a upper part
|
|
* of the translated bottom 2GB for kernel virtual memory and protect
|
|
* these pages from user accesses by disabling Ru, Eu and Wu.
|
|
*/
|
|
#define VMALLOC_SIZE (0x10000000) /* 256M */
|
|
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
|
|
#define VMALLOC_END (PAGE_OFFSET)
|
|
|
|
/* Most of the architectures seem to be keeping some kind of padding between
|
|
* userspace TASK_SIZE and PAGE_OFFSET. i.e TASK_SIZE != PAGE_OFFSET.
|
|
*/
|
|
#define USER_KERNEL_GUTTER 0x10000000
|
|
|
|
/* User address space:
|
|
* On ARC700, CPU allows the entire lower half of 32 bit address space to be
|
|
* translated. Thus potentially 2G (0:0x7FFF_FFFF) could be User vaddr space.
|
|
* However we steal 256M for kernel addr (0x7000_0000:0x7FFF_FFFF) and another
|
|
* 256M (0x6000_0000:0x6FFF_FFFF) is gutter between user/kernel spaces
|
|
* Thus total User vaddr space is (0:0x5FFF_FFFF)
|
|
*/
|
|
#define TASK_SIZE (PAGE_OFFSET - VMALLOC_SIZE - USER_KERNEL_GUTTER)
|
|
|
|
#define STACK_TOP TASK_SIZE
|
|
#define STACK_TOP_MAX STACK_TOP
|
|
|
|
/* This decides where the kernel will search for a free chunk of vm
|
|
* space during mmap's.
|
|
*/
|
|
#define TASK_UNMAPPED_BASE (TASK_SIZE / 3)
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* __ASM_ARC_PROCESSOR_H */
|