Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 5178
b: refs/heads/master
c: 951f22d
h: refs/heads/master
v: v3
  • Loading branch information
Martin Schwidefsky authored and Linus Torvalds committed Jul 27, 2005
1 parent c85202f commit d535094
Show file tree
Hide file tree
Showing 10 changed files with 231 additions and 191 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8449d003f323ca7a00eec38905d984ba5ec83a29
refs/heads/master: 951f22d5b1f0eaae35dafc669e3774a0c2084d10
3 changes: 0 additions & 3 deletions trunk/arch/s390/kernel/head64.S
Original file line number Diff line number Diff line change
Expand Up @@ -658,10 +658,8 @@ startup:basr %r13,0 # get base
#
la %r1,0f-.LPG1(%r13) # set program check address
stg %r1,__LC_PGM_NEW_PSW+8
mvc __LC_DIAG44_OPCODE(8),.Lnop-.LPG1(%r13)
diag 0,0,0x44 # test diag 0x44
oi 7(%r12),32 # set diag44 flag
mvc __LC_DIAG44_OPCODE(8),.Ldiag44-.LPG1(%r13)
0:

#
Expand Down Expand Up @@ -702,7 +700,6 @@ startup:basr %r13,0 # get base
.L4malign:.quad 0xffffffffffc00000
.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8
.Lnop: .long 0x07000700
.Ldiag44:.long 0x83000044

.org PARMAREA-64
.Lduct: .long 0,0,0,0,0,0,0,0
Expand Down
6 changes: 0 additions & 6 deletions trunk/arch/s390/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,12 +431,6 @@ setup_lowcore(void)
ctl_set_bit(14, 29);
}
#endif
#ifdef CONFIG_ARCH_S390X
if (MACHINE_HAS_DIAG44)
lc->diag44_opcode = 0x83000044;
else
lc->diag44_opcode = 0x07000700;
#endif /* CONFIG_ARCH_S390X */
set_prefix((u32)(unsigned long) lc);
}

Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/s390/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
EXTRA_AFLAGS := -traditional

lib-y += delay.o string.o
lib-$(CONFIG_ARCH_S390_31) += uaccess.o
lib-$(CONFIG_ARCH_S390X) += uaccess64.o
lib-$(CONFIG_ARCH_S390_31) += uaccess.o spinlock.o
lib-$(CONFIG_ARCH_S390X) += uaccess64.o spinlock.o
133 changes: 133 additions & 0 deletions trunk/arch/s390/lib/spinlock.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/*
* arch/s390/lib/spinlock.c
* Out of line spinlock code.
*
* S390 version
* Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
*/

#include <linux/types.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/init.h>
#include <asm/io.h>

atomic_t spin_retry_counter;
int spin_retry = 1000;

/**
* spin_retry= parameter
*/
static int __init spin_retry_setup(char *str)
{
spin_retry = simple_strtoul(str, &str, 0);
return 1;
}
__setup("spin_retry=", spin_retry_setup);

static inline void
_diag44(void)
{
#ifdef __s390x__
if (MACHINE_HAS_DIAG44)
#endif
asm volatile("diag 0,0,0x44");
}

void
_raw_spin_lock_wait(spinlock_t *lp, unsigned int pc)
{
int count = spin_retry;

while (1) {
if (count-- <= 0) {
_diag44();
count = spin_retry;
}
atomic_inc(&spin_retry_counter);
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
return;
}
}
EXPORT_SYMBOL(_raw_spin_lock_wait);

int
_raw_spin_trylock_retry(spinlock_t *lp, unsigned int pc)
{
int count = spin_retry;

while (count-- > 0) {
atomic_inc(&spin_retry_counter);
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
return 1;
}
return 0;
}
EXPORT_SYMBOL(_raw_spin_trylock_retry);

void
_raw_read_lock_wait(rwlock_t *rw)
{
unsigned int old;
int count = spin_retry;

while (1) {
if (count-- <= 0) {
_diag44();
count = spin_retry;
}
atomic_inc(&spin_retry_counter);
old = rw->lock & 0x7fffffffU;
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
return;
}
}
EXPORT_SYMBOL(_raw_read_lock_wait);

int
_raw_read_trylock_retry(rwlock_t *rw)
{
unsigned int old;
int count = spin_retry;

while (count-- > 0) {
atomic_inc(&spin_retry_counter);
old = rw->lock & 0x7fffffffU;
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
return 1;
}
return 0;
}
EXPORT_SYMBOL(_raw_read_trylock_retry);

void
_raw_write_lock_wait(rwlock_t *rw)
{
int count = spin_retry;

while (1) {
if (count-- <= 0) {
_diag44();
count = spin_retry;
}
atomic_inc(&spin_retry_counter);
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
return;
}
}
EXPORT_SYMBOL(_raw_write_lock_wait);

int
_raw_write_trylock_retry(rwlock_t *rw)
{
int count = spin_retry;

while (count-- > 0) {
atomic_inc(&spin_retry_counter);
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
return 1;
}
return 0;
}
EXPORT_SYMBOL(_raw_write_trylock_retry);
4 changes: 1 addition & 3 deletions trunk/include/asm-s390/lowcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@
#define __LC_SYSTEM_TIMER 0x278
#define __LC_LAST_UPDATE_CLOCK 0x280
#define __LC_STEAL_CLOCK 0x288
#define __LC_DIAG44_OPCODE 0x290
#define __LC_KERNEL_STACK 0xD40
#define __LC_THREAD_INFO 0xD48
#define __LC_ASYNC_STACK 0xD50
Expand Down Expand Up @@ -286,8 +285,7 @@ struct _lowcore
__u64 system_timer; /* 0x278 */
__u64 last_update_clock; /* 0x280 */
__u64 steal_clock; /* 0x288 */
__u32 diag44_opcode; /* 0x290 */
__u8 pad8[0xc00-0x294]; /* 0x294 */
__u8 pad8[0xc00-0x290]; /* 0x290 */
/* System info area */
__u64 save_area[16]; /* 0xc00 */
__u8 pad9[0xd40-0xc80]; /* 0xc80 */
Expand Down
5 changes: 4 additions & 1 deletion trunk/include/asm-s390/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,10 @@ unsigned long get_wchan(struct task_struct *p);
# define cpu_relax() asm volatile ("diag 0,0,68" : : : "memory")
#else /* __s390x__ */
# define cpu_relax() \
asm volatile ("ex 0,%0" : : "i" (__LC_DIAG44_OPCODE) : "memory")
do { \
if (MACHINE_HAS_DIAG44) \
asm volatile ("diag 0,0,68" : : : "memory"); \
} while (0)
#endif /* __s390x__ */

/*
Expand Down
Loading

0 comments on commit d535094

Please sign in to comment.