cregit-Linux how code gets into the kernel

Release 4.15 kernel/locking/rwsem.h

Directory: kernel/locking
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * The owner field of the rw_semaphore structure will be set to
 * RWSEM_READ_OWNED when a reader grabs the lock. A writer will clear
 * the owner field when it unlocks. A reader, on the other hand, will
 * not touch the owner field when it unlocks.
 *
 * In essence, the owner field now has the following 3 states:
 *  1) 0
 *     - lock is free or the owner hasn't set the field yet
 *  2) RWSEM_READER_OWNED
 *     - lock is currently or previously owned by readers (lock is free
 *       or not set by owner yet)
 *  3) Other non-zero value
 *     - a writer owns the lock
 */

#define RWSEM_READER_OWNED	((struct task_struct *)1UL)

#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
/*
 * All writes to owner are protected by WRITE_ONCE() to make sure that
 * store tearing can't happen as optimistic spinners may read and use
 * the owner value concurrently without lock. Read from owner, however,
 * may not need READ_ONCE() as long as the pointer value is only used
 * for comparison and isn't being dereferenced.
 */

static inline void rwsem_set_owner(struct rw_semaphore *sem) { WRITE_ONCE(sem->owner, current); }

Contributors

PersonTokensPropCommitsCommitProp
Davidlohr Bueso A1780.95%150.00%
Waiman Long419.05%150.00%
Total21100.00%2100.00%


static inline void rwsem_clear_owner(struct rw_semaphore *sem) { WRITE_ONCE(sem->owner, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Davidlohr Bueso A1780.95%150.00%
Waiman Long419.05%150.00%
Total21100.00%2100.00%


static inline void rwsem_set_reader_owned(struct rw_semaphore *sem) { /* * We check the owner value first to make sure that we will only * do a write to the rwsem cacheline when it is really necessary * to minimize cacheline contention. */ if (sem->owner != RWSEM_READER_OWNED) WRITE_ONCE(sem->owner, RWSEM_READER_OWNED); }

Contributors

PersonTokensPropCommitsCommitProp
Waiman Long30100.00%2100.00%
Total30100.00%2100.00%


static inline bool rwsem_owner_is_writer(struct task_struct *owner) { return owner && owner != RWSEM_READER_OWNED; }

Contributors

PersonTokensPropCommitsCommitProp
Waiman Long19100.00%1100.00%
Total19100.00%1100.00%


static inline bool rwsem_owner_is_reader(struct task_struct *owner) { return owner == RWSEM_READER_OWNED; }

Contributors

PersonTokensPropCommitsCommitProp
Waiman Long17100.00%1100.00%
Total17100.00%1100.00%

#else
static inline void rwsem_set_owner(struct rw_semaphore *sem) { }

Contributors

PersonTokensPropCommitsCommitProp
Davidlohr Bueso A11100.00%1100.00%
Total11100.00%1100.00%


static inline void rwsem_clear_owner(struct rw_semaphore *sem) { }

Contributors

PersonTokensPropCommitsCommitProp
Davidlohr Bueso A11100.00%1100.00%
Total11100.00%1100.00%


static inline void rwsem_set_reader_owned(struct rw_semaphore *sem) { }

Contributors

PersonTokensPropCommitsCommitProp
Waiman Long11100.00%1100.00%
Total11100.00%1100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Waiman Long9158.71%250.00%
Davidlohr Bueso A6340.65%125.00%
Greg Kroah-Hartman10.65%125.00%
Total155100.00%4100.00%
Directory: kernel/locking
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.