Skip to content
Snippets Groups Projects
Select Git revision
  • android-msm-flo-3.4-kitkat-mr1
  • master default protected
  • android-msm-bullhead-3.10-nougat_kgdb_less_changes
  • android-msm-bullhead-3.10-nougat_kgdb
  • android-msm-bullhead-3.10-nougat_klist
  • android-4.4
  • android-msm-vega-4.4-oreo-daydream
  • android-msm-wahoo-4.4-p-preview-5
  • android-msm-wahoo-4.4-pie
  • android-msm-marlin-3.18-p-preview-5
  • android-msm-marlin-3.18-pie
  • android-msm-wahoo-2018.07-oreo-m2
  • android-msm-wahoo-2018.07-oreo-m4
  • android-msm-wahoo-4.4-p-preview-4
  • android-msm-bullhead-3.10-oreo-m6
  • android-msm-angler-3.10-oreo-m6
  • android-msm-marlin-3.18-p-preview-4
  • android-msm-stargazer-3.18-oreo-wear-dr
  • android-msm-catshark-3.18-oreo-wear-dr
  • android-msm-wahoo-4.4-oreo-m2
  • android-msm-wahoo-4.4-oreo-m4
  • android-daydreamos-8.0.0_r0.5
  • android-8.1.0_r0.92
  • android-8.1.0_r0.91
  • android-daydreamos-8.0.0_r0.4
  • android-p-preview-5_r0.2
  • android-p-preview-5_r0.1
  • android-9.0.0_r0.5
  • android-9.0.0_r0.4
  • android-9.0.0_r0.2
  • android-9.0.0_r0.1
  • android-8.1.0_r0.81
  • android-8.1.0_r0.80
  • android-8.1.0_r0.78
  • android-8.1.0_r0.76
  • android-8.1.0_r0.75
  • android-8.1.0_r0.72
  • android-8.1.0_r0.70
  • android-p-preview-4_r0.2
  • android-p-preview-4_r0.1
  • android-wear-8.0.0_r0.30
41 results

rwsem.c

Blame
  • rwsem.c 2.34 KiB
    /* kernel/rwsem.c: R/W semaphores, public implementation
     *
     * Written by David Howells (dhowells@redhat.com).
     * Derived from asm-i386/semaphore.h
     */
    
    #include <linux/types.h>
    #include <linux/kernel.h>
    #include <linux/sched.h>
    #include <linux/export.h>
    #include <linux/rwsem.h>
    
    #include <linux/atomic.h>
    
    /*
     * lock for reading
     */
    void __sched down_read(struct rw_semaphore *sem)
    {
    	might_sleep();
    	rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_);
    
    	LOCK_CONTENDED(sem, __down_read_trylock, __down_read);
    }
    
    EXPORT_SYMBOL(down_read);
    
    /*
     * trylock for reading -- returns 1 if successful, 0 if contention
     */
    int down_read_trylock(struct rw_semaphore *sem)
    {
    	int ret = __down_read_trylock(sem);
    
    	if (ret == 1)
    		rwsem_acquire_read(&sem->dep_map, 0, 1, _RET_IP_);
    	return ret;
    }
    
    EXPORT_SYMBOL(down_read_trylock);
    
    /*
     * lock for writing
     */
    void __sched down_write(struct rw_semaphore *sem)
    {
    	might_sleep();
    	rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);
    
    	LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
    }
    
    EXPORT_SYMBOL(down_write);
    
    /*
     * trylock for writing -- returns 1 if successful, 0 if contention
     */
    int down_write_trylock(struct rw_semaphore *sem)
    {
    	int ret = __down_write_trylock(sem);
    
    	if (ret == 1)
    		rwsem_acquire(&sem->dep_map, 0, 1, _RET_IP_);
    	return ret;
    }
    
    EXPORT_SYMBOL(down_write_trylock);
    
    /*
     * release a read lock
     */
    void up_read(struct rw_semaphore *sem)
    {
    	rwsem_release(&sem->dep_map, 1, _RET_IP_);
    
    	__up_read(sem);
    }
    
    EXPORT_SYMBOL(up_read);
    
    /*
     * release a write lock
     */
    void up_write(struct rw_semaphore *sem)
    {
    	rwsem_release(&sem->dep_map, 1, _RET_IP_);
    
    	__up_write(sem);
    }
    
    EXPORT_SYMBOL(up_write);
    
    /*
     * downgrade write lock to read lock
     */
    void downgrade_write(struct rw_semaphore *sem)
    {
    	/*
    	 * lockdep: a downgraded write will live on as a write
    	 * dependency.
    	 */
    	__downgrade_write(sem);
    }
    
    EXPORT_SYMBOL(downgrade_write);
    
    #ifdef CONFIG_DEBUG_LOCK_ALLOC
    
    void down_read_nested(struct rw_semaphore *sem, int subclass)
    {
    	might_sleep();
    	rwsem_acquire_read(&sem->dep_map, subclass, 0, _RET_IP_);
    
    	LOCK_CONTENDED(sem, __down_read_trylock, __down_read);
    }
    
    EXPORT_SYMBOL(down_read_nested);
    
    void down_write_nested(struct rw_semaphore *sem, int subclass)
    {
    	might_sleep();
    	rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_);
    
    	LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
    }
    
    EXPORT_SYMBOL(down_write_nested);
    
    #endif