diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-28 18:15:33 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-28 18:15:33 -0800 | 
| commit | 6c334f4f6aeb0916bfc15ff731073e9f24de0189 (patch) | |
| tree | 6e3140bdca215b1b5a74a8856458e753186979fb /arch/x86 | |
| parent | 67d2433ee7aa631bc3ab14c2af6bbc1d44d13a00 (diff) | |
| parent | 69e8f430e243d657c2053f097efebc2e2cd559f0 (diff) | |
Merge branch 'stable/for-linus-fixes-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
* 'stable/for-linus-fixes-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen/granttable: Disable grant v2 for HVM domains.
  x86: xen: size struct xen_spinlock to always fit in arch_spinlock_t
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/xen/spinlock.c | 27 | 
1 files changed, 22 insertions, 5 deletions
| diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c index cc9b1e182fcf..d69cc6c3f808 100644 --- a/arch/x86/xen/spinlock.c +++ b/arch/x86/xen/spinlock.c @@ -116,9 +116,26 @@ static inline void spin_time_accum_blocked(u64 start)  }  #endif  /* CONFIG_XEN_DEBUG_FS */ +/* + * Size struct xen_spinlock so it's the same as arch_spinlock_t. + */ +#if NR_CPUS < 256 +typedef u8 xen_spinners_t; +# define inc_spinners(xl) \ +	asm(LOCK_PREFIX " incb %0" : "+m" ((xl)->spinners) : : "memory"); +# define dec_spinners(xl) \ +	asm(LOCK_PREFIX " decb %0" : "+m" ((xl)->spinners) : : "memory"); +#else +typedef u16 xen_spinners_t; +# define inc_spinners(xl) \ +	asm(LOCK_PREFIX " incw %0" : "+m" ((xl)->spinners) : : "memory"); +# define dec_spinners(xl) \ +	asm(LOCK_PREFIX " decw %0" : "+m" ((xl)->spinners) : : "memory"); +#endif +  struct xen_spinlock {  	unsigned char lock;		/* 0 -> free; 1 -> locked */ -	unsigned short spinners;	/* count of waiting cpus */ +	xen_spinners_t spinners;	/* count of waiting cpus */  };  static int xen_spin_is_locked(struct arch_spinlock *lock) @@ -164,8 +181,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)  	wmb();			/* set lock of interest before count */ -	asm(LOCK_PREFIX " incw %0" -	    : "+m" (xl->spinners) : : "memory"); +	inc_spinners(xl);  	return prev;  } @@ -176,8 +192,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)   */  static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev)  { -	asm(LOCK_PREFIX " decw %0" -	    : "+m" (xl->spinners) : : "memory"); +	dec_spinners(xl);  	wmb();			/* decrement count before restoring lock */  	__this_cpu_write(lock_spinners, prev);  } @@ -373,6 +388,8 @@ void xen_uninit_lock_cpu(int cpu)  void __init xen_init_spinlocks(void)  { +	BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t)); +  	pv_lock_ops.spin_is_locked = xen_spin_is_locked;  	pv_lock_ops.spin_is_contended = xen_spin_is_contended;  	pv_lock_ops.spin_lock = xen_spin_lock; | 
