qemu-lock.h revision 4af48bf7c72ef1e201c64bd475377b5af9d8e8a1
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Copyright (c) 2003 Fabrice Bellard
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This library is free software; you can redistribute it and/or
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * modify it under the terms of the GNU Lesser General Public
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * License as published by the Free Software Foundation; either
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * version 2 of the License, or (at your option) any later version.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * This library is distributed in the hope that it will be useful,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * but WITHOUT ANY WARRANTY; without even the implied warranty of
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Lesser General Public License for more details.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * You should have received a copy of the GNU Lesser General Public
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * License along with this library; if not, write to the Free Software
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/*
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * a choice of LGPL license versions is made available with the language indicating
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * that LGPLv2 or any later version may be used, or where a choice of which version
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync * of the LGPL is applied is otherwise unspecified.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* Locking primitives. Most of this code should be redundant -
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync system emulation doesn't need/use locking, NPTL userspace uses
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync pthread mutexes, and non-NPTL userspace isn't threadsafe anyway.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync In either case a spinlock is probably the wrong kind of lock.
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync Spinlocks are only good if you know annother CPU has the lock and is
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync likely to release it soon. In environments where you have more threads
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync than physical CPUs (the extreme case being a single CPU host) a spinlock
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync simply wastes CPU until the OS decides to preempt it. */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if defined(USE_NPTL)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <pthread.h>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define spin_lock pthread_mutex_lock
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define spin_unlock pthread_mutex_unlock
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define spinlock_t pthread_mutex_t
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define SPIN_LOCK_UNLOCKED PTHREAD_MUTEX_INITIALIZER
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if defined(__hppa__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsynctypedef int spinlock_t[4];
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define SPIN_LOCK_UNLOCKED { 1, 1, 1, 1 }
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void resetlock (spinlock_t *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync (*p)[0] = (*p)[1] = (*p)[2] = (*p)[3] = 1;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsynctypedef int spinlock_t;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define SPIN_LOCK_UNLOCKED 0
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void resetlock (spinlock_t *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync *p = SPIN_LOCK_UNLOCKED;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#ifdef VBOX
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncDECLINLINE(int) testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ASMAtomicCmpXchgU32((volatile uint32_t *)p, 1, 0) ? 0 : 1;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(_ARCH_PPC)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ (
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " lwarx %0,0,%1\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " xor. %0,%3,%0\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " bne $+12\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " stwcx. %2,0,%1\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " bne- $-16\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=&r" (ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (p), "r" (1), "r" (0)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "cr0", "memory");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__i386__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync long int readval = 0;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ ("lock; cmpxchgl %2, %0"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "+m" (*p), "+a" (readval)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (1)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "cc");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return readval;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__x86_64__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync long int readval = 0;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ ("lock; cmpxchgl %2, %0"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "+m" (*p), "+a" (readval)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (1)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "cc");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return readval;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__s390__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ ("0: cs %0,%1,0(%2)\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " jl 0b"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=&d" (ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (1), "a" (p), "0" (*p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "cc", "memory" );
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__alpha__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync unsigned long one;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ ("0: mov 1,%2\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " ldl_l %0,%1\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " stl_c %2,%1\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " beq %2,1f\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ".subsection 2\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync "1: br 0b\n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync ".previous"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r" (ret), "=m" (*p), "=r" (one)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "m" (*p));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__sparc__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__("ldstub [%1], %0"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r" (ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "memory");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (ret ? 1 : 0);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__arm__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *spinlock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync register unsigned int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__("swp %0, %1, [%2]"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r"(ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "0"(1), "r"(spinlock));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__mc68000)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync char ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__("tas %1; sne %0"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r" (ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "m" (p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "cc","memory");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__hppa__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync/* Because malloc only guarantees 8-byte alignment for malloc'd data,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync and GCC only guarantees 8-byte alignment for stack locals, we can't
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync be assured of 16-byte alignment for atomic lock data even if we
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync specify "__attribute ((aligned(16)))" in the type declaration. So,
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync we use a struct containing an array of four ints for the atomic lock
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync type and dynamically select the 16-byte aligned int from the array
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync for the semaphore. */
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#define __PA_LDCW_ALIGNMENT 16
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void *ldcw_align (void *p) {
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync unsigned long a = (unsigned long)p;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync a = (a + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return (void *)a;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (spinlock_t *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync unsigned int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync p = ldcw_align(p);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__("ldcw 0(%1),%0"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r" (ret)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "r" (p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "memory" );
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return !ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__ia64)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#include <ia64intrin.h>
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return __sync_lock_test_and_set (p, 1);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#elif defined(__mips__)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int testandset (int *p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync int ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync __asm__ __volatile__ (
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " .set push \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " .set noat \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " .set mips2 \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync "1: li $1, 1 \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " ll %0, %1 \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " sc $1, %1 \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " beqz $1, 1b \n"
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync " .set pop "
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "=r" (ret), "+R" (*p)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync :
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync : "memory");
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return ret;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#error unimplemented CPU support
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#if defined(CONFIG_USER_ONLY)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void spin_lock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync while (testandset(lock));
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void spin_unlock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync resetlock(lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int spin_trylock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return !testandset(lock);
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#else
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void spin_lock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline void spin_unlock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsyncstatic inline int spin_trylock(spinlock_t *lock)
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync{
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync return 1;
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync}
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync#endif
3331475701a5b12f98b3cfea07d5dca60072530fvboxsync