Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
87dbaaab
Commit
87dbaaab
authored
Aug 29, 2005
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull lameter-rwsem-limit into release branch
parents
7ee175f7
16592d26
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
18 additions
and
17 deletions
+18
-17
include/asm-ia64/rwsem.h
include/asm-ia64/rwsem.h
+18
-17
No files found.
include/asm-ia64/rwsem.h
View file @
87dbaaab
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
*
*
* Copyright (C) 2003 Ken Chen <kenneth.w.chen@intel.com>
* Copyright (C) 2003 Ken Chen <kenneth.w.chen@intel.com>
* Copyright (C) 2003 Asit Mallick <asit.k.mallick@intel.com>
* Copyright (C) 2003 Asit Mallick <asit.k.mallick@intel.com>
* Copyright (C) 2005 Christoph Lameter <clameter@sgi.com>
*
*
* Based on asm-i386/rwsem.h and other architecture implementation.
* Based on asm-i386/rwsem.h and other architecture implementation.
*
*
...
@@ -11,9 +12,9 @@
...
@@ -11,9 +12,9 @@
*
*
* The lock count is initialized to 0 (no active and no waiting lockers).
* The lock count is initialized to 0 (no active and no waiting lockers).
*
*
* When a writer subtracts WRITE_BIAS, it'll get 0xffff
0001 for the case
* When a writer subtracts WRITE_BIAS, it'll get 0xffff
ffff00000001 for
*
of an uncontended lock. Readers increment by 1 and see a positive valu
e
*
the case of an uncontended lock. Readers increment by 1 and see a positiv
e
* when uncontended, negative if there are writers (and maybe) readers
*
value
when uncontended, negative if there are writers (and maybe) readers
* waiting (in which case it goes to sleep).
* waiting (in which case it goes to sleep).
*/
*/
...
@@ -29,7 +30,7 @@
...
@@ -29,7 +30,7 @@
* the semaphore definition
* the semaphore definition
*/
*/
struct
rw_semaphore
{
struct
rw_semaphore
{
signed
int
count
;
signed
long
count
;
spinlock_t
wait_lock
;
spinlock_t
wait_lock
;
struct
list_head
wait_list
;
struct
list_head
wait_list
;
#if RWSEM_DEBUG
#if RWSEM_DEBUG
...
@@ -37,10 +38,10 @@ struct rw_semaphore {
...
@@ -37,10 +38,10 @@ struct rw_semaphore {
#endif
#endif
};
};
#define RWSEM_UNLOCKED_VALUE
0x00000000
#define RWSEM_UNLOCKED_VALUE
__IA64_UL_CONST(0x0000000000000000)
#define RWSEM_ACTIVE_BIAS
0x00000001
#define RWSEM_ACTIVE_BIAS
__IA64_UL_CONST(0x0000000000000001)
#define RWSEM_ACTIVE_MASK
0x0000ffff
#define RWSEM_ACTIVE_MASK
__IA64_UL_CONST(0x00000000ffffffff)
#define RWSEM_WAITING_BIAS
(-0x0001
0000)
#define RWSEM_WAITING_BIAS
-__IA64_UL_CONST(0x000000010000
0000)
#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
...
@@ -83,7 +84,7 @@ init_rwsem (struct rw_semaphore *sem)
...
@@ -83,7 +84,7 @@ init_rwsem (struct rw_semaphore *sem)
static
inline
void
static
inline
void
__down_read
(
struct
rw_semaphore
*
sem
)
__down_read
(
struct
rw_semaphore
*
sem
)
{
{
int
result
=
ia64_fetchadd4_acq
((
unsigned
int
*
)
&
sem
->
count
,
1
);
long
result
=
ia64_fetchadd8_acq
((
unsigned
long
*
)
&
sem
->
count
,
1
);
if
(
result
<
0
)
if
(
result
<
0
)
rwsem_down_read_failed
(
sem
);
rwsem_down_read_failed
(
sem
);
...
@@ -95,7 +96,7 @@ __down_read (struct rw_semaphore *sem)
...
@@ -95,7 +96,7 @@ __down_read (struct rw_semaphore *sem)
static
inline
void
static
inline
void
__down_write
(
struct
rw_semaphore
*
sem
)
__down_write
(
struct
rw_semaphore
*
sem
)
{
{
int
old
,
new
;
long
old
,
new
;
do
{
do
{
old
=
sem
->
count
;
old
=
sem
->
count
;
...
@@ -112,7 +113,7 @@ __down_write (struct rw_semaphore *sem)
...
@@ -112,7 +113,7 @@ __down_write (struct rw_semaphore *sem)
static
inline
void
static
inline
void
__up_read
(
struct
rw_semaphore
*
sem
)
__up_read
(
struct
rw_semaphore
*
sem
)
{
{
int
result
=
ia64_fetchadd4_rel
((
unsigned
int
*
)
&
sem
->
count
,
-
1
);
long
result
=
ia64_fetchadd8_rel
((
unsigned
long
*
)
&
sem
->
count
,
-
1
);
if
(
result
<
0
&&
(
--
result
&
RWSEM_ACTIVE_MASK
)
==
0
)
if
(
result
<
0
&&
(
--
result
&
RWSEM_ACTIVE_MASK
)
==
0
)
rwsem_wake
(
sem
);
rwsem_wake
(
sem
);
...
@@ -124,7 +125,7 @@ __up_read (struct rw_semaphore *sem)
...
@@ -124,7 +125,7 @@ __up_read (struct rw_semaphore *sem)
static
inline
void
static
inline
void
__up_write
(
struct
rw_semaphore
*
sem
)
__up_write
(
struct
rw_semaphore
*
sem
)
{
{
int
old
,
new
;
long
old
,
new
;
do
{
do
{
old
=
sem
->
count
;
old
=
sem
->
count
;
...
@@ -141,7 +142,7 @@ __up_write (struct rw_semaphore *sem)
...
@@ -141,7 +142,7 @@ __up_write (struct rw_semaphore *sem)
static
inline
int
static
inline
int
__down_read_trylock
(
struct
rw_semaphore
*
sem
)
__down_read_trylock
(
struct
rw_semaphore
*
sem
)
{
{
int
tmp
;
long
tmp
;
while
((
tmp
=
sem
->
count
)
>=
0
)
{
while
((
tmp
=
sem
->
count
)
>=
0
)
{
if
(
tmp
==
cmpxchg_acq
(
&
sem
->
count
,
tmp
,
tmp
+
1
))
{
if
(
tmp
==
cmpxchg_acq
(
&
sem
->
count
,
tmp
,
tmp
+
1
))
{
return
1
;
return
1
;
...
@@ -156,7 +157,7 @@ __down_read_trylock (struct rw_semaphore *sem)
...
@@ -156,7 +157,7 @@ __down_read_trylock (struct rw_semaphore *sem)
static
inline
int
static
inline
int
__down_write_trylock
(
struct
rw_semaphore
*
sem
)
__down_write_trylock
(
struct
rw_semaphore
*
sem
)
{
{
int
tmp
=
cmpxchg_acq
(
&
sem
->
count
,
RWSEM_UNLOCKED_VALUE
,
long
tmp
=
cmpxchg_acq
(
&
sem
->
count
,
RWSEM_UNLOCKED_VALUE
,
RWSEM_ACTIVE_WRITE_BIAS
);
RWSEM_ACTIVE_WRITE_BIAS
);
return
tmp
==
RWSEM_UNLOCKED_VALUE
;
return
tmp
==
RWSEM_UNLOCKED_VALUE
;
}
}
...
@@ -167,7 +168,7 @@ __down_write_trylock (struct rw_semaphore *sem)
...
@@ -167,7 +168,7 @@ __down_write_trylock (struct rw_semaphore *sem)
static
inline
void
static
inline
void
__downgrade_write
(
struct
rw_semaphore
*
sem
)
__downgrade_write
(
struct
rw_semaphore
*
sem
)
{
{
int
old
,
new
;
long
old
,
new
;
do
{
do
{
old
=
sem
->
count
;
old
=
sem
->
count
;
...
@@ -182,7 +183,7 @@ __downgrade_write (struct rw_semaphore *sem)
...
@@ -182,7 +183,7 @@ __downgrade_write (struct rw_semaphore *sem)
* Implement atomic add functionality. These used to be "inline" functions, but GCC v3.1
* Implement atomic add functionality. These used to be "inline" functions, but GCC v3.1
* doesn't quite optimize this stuff right and ends up with bad calls to fetchandadd.
* doesn't quite optimize this stuff right and ends up with bad calls to fetchandadd.
*/
*/
#define rwsem_atomic_add(delta, sem) atomic
_add(delta, (atomic
_t *)(&(sem)->count))
#define rwsem_atomic_add(delta, sem) atomic
64_add(delta, (atomic64
_t *)(&(sem)->count))
#define rwsem_atomic_update(delta, sem) atomic
_add_return(delta, (atomic
_t *)(&(sem)->count))
#define rwsem_atomic_update(delta, sem) atomic
64_add_return(delta, (atomic64
_t *)(&(sem)->count))
#endif
/* _ASM_IA64_RWSEM_H */
#endif
/* _ASM_IA64_RWSEM_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment