blob: e47568363e5ef784c3030fe5a43ade82641a23c2 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/* rwsem-spinlock.h: fallback C implementation
3 *
4 * Copyright (c) 2001 David Howells (dhowells@redhat.com).
5 * - Derived partially from ideas by Andrea Arcangeli <andrea@suse.de>
6 * - Derived also from comments by Linus
7 */
8
9#ifndef _LINUX_RWSEM_SPINLOCK_H
10#define _LINUX_RWSEM_SPINLOCK_H
11
12#ifndef _LINUX_RWSEM_H
13#error "please don't include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead"
14#endif
15
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#ifdef __KERNEL__
Linus Torvalds1da177e2005-04-16 15:20:36 -070017/*
18 * the rw-semaphore definition
Peter Zijlstra13b9a962014-07-16 14:54:55 +020019 * - if count is 0 then there are no active readers or writers
20 * - if count is +ve then that is the number of active readers
21 * - if count is -1 then there is one active writer
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 * - if wait_list is not empty, then there are processes waiting for the semaphore
23 */
24struct rw_semaphore {
Peter Zijlstra13b9a962014-07-16 14:54:55 +020025 __s32 count;
Thomas Gleixnerddb6c9b2010-02-24 09:54:54 +010026 raw_spinlock_t wait_lock;
Linus Torvalds1da177e2005-04-16 15:20:36 -070027 struct list_head wait_list;
Ingo Molnar4ea21762006-07-03 00:24:53 -070028#ifdef CONFIG_DEBUG_LOCK_ALLOC
29 struct lockdep_map dep_map;
30#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070031};
32
Thomas Gleixner12249b32011-01-26 20:06:00 +000033#define RWSEM_UNLOCKED_VALUE 0x00000000
Ingo Molnar4ea21762006-07-03 00:24:53 -070034
Harvey Harrisonb3c97522008-02-13 15:03:15 -080035extern void __down_read(struct rw_semaphore *sem);
Kirill Tkhai0aa11252017-06-19 21:02:12 +030036extern int __must_check __down_read_killable(struct rw_semaphore *sem);
Harvey Harrisonb3c97522008-02-13 15:03:15 -080037extern int __down_read_trylock(struct rw_semaphore *sem);
38extern void __down_write(struct rw_semaphore *sem);
Michal Hockod4799602016-04-07 17:12:26 +020039extern int __must_check __down_write_killable(struct rw_semaphore *sem);
Harvey Harrisonb3c97522008-02-13 15:03:15 -080040extern int __down_write_trylock(struct rw_semaphore *sem);
41extern void __up_read(struct rw_semaphore *sem);
42extern void __up_write(struct rw_semaphore *sem);
43extern void __downgrade_write(struct rw_semaphore *sem);
Amerigo Wang29671f22009-12-14 18:00:21 -080044extern int rwsem_is_locked(struct rw_semaphore *sem);
Rik Van Rieleb92f4e2005-10-29 18:15:44 -070045
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#endif /* __KERNEL__ */
47#endif /* _LINUX_RWSEM_SPINLOCK_H */