rwsem.c (1913c7f3fc2514e09262baf2267a82dfdb215c39) rwsem.c (5facae4f3549b5cf7c0e10ec312a65ffd43b5726)
1// SPDX-License-Identifier: GPL-2.0
2/* kernel/rwsem.c: R/W semaphores, public implementation
3 *
4 * Written by David Howells (dhowells@redhat.com).
5 * Derived from asm-i386/semaphore.h
6 *
7 * Writer lock-stealing by Alex Shi <alex.shi@intel.com>
8 * and Michel Lespinasse <walken@google.com>

--- 1490 unchanged lines hidden (view full) ---

1499EXPORT_SYMBOL(down_read);
1500
1501int __sched down_read_killable(struct rw_semaphore *sem)
1502{
1503 might_sleep();
1504 rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_);
1505
1506 if (LOCK_CONTENDED_RETURN(sem, __down_read_trylock, __down_read_killable)) {
1// SPDX-License-Identifier: GPL-2.0
2/* kernel/rwsem.c: R/W semaphores, public implementation
3 *
4 * Written by David Howells (dhowells@redhat.com).
5 * Derived from asm-i386/semaphore.h
6 *
7 * Writer lock-stealing by Alex Shi <alex.shi@intel.com>
8 * and Michel Lespinasse <walken@google.com>

--- 1490 unchanged lines hidden (view full) ---

1499EXPORT_SYMBOL(down_read);
1500
1501int __sched down_read_killable(struct rw_semaphore *sem)
1502{
1503 might_sleep();
1504 rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_);
1505
1506 if (LOCK_CONTENDED_RETURN(sem, __down_read_trylock, __down_read_killable)) {
1507 rwsem_release(&sem->dep_map, 1, _RET_IP_);
1507 rwsem_release(&sem->dep_map, _RET_IP_);
1508 return -EINTR;
1509 }
1510
1511 return 0;
1512}
1513EXPORT_SYMBOL(down_read_killable);
1514
1515/*

--- 25 unchanged lines hidden (view full) ---

1541 */
1542int __sched down_write_killable(struct rw_semaphore *sem)
1543{
1544 might_sleep();
1545 rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);
1546
1547 if (LOCK_CONTENDED_RETURN(sem, __down_write_trylock,
1548 __down_write_killable)) {
1508 return -EINTR;
1509 }
1510
1511 return 0;
1512}
1513EXPORT_SYMBOL(down_read_killable);
1514
1515/*

--- 25 unchanged lines hidden (view full) ---

1541 */
1542int __sched down_write_killable(struct rw_semaphore *sem)
1543{
1544 might_sleep();
1545 rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);
1546
1547 if (LOCK_CONTENDED_RETURN(sem, __down_write_trylock,
1548 __down_write_killable)) {
1549 rwsem_release(&sem->dep_map, 1, _RET_IP_);
1549 rwsem_release(&sem->dep_map, _RET_IP_);
1550 return -EINTR;
1551 }
1552
1553 return 0;
1554}
1555EXPORT_SYMBOL(down_write_killable);
1556
1557/*

--- 10 unchanged lines hidden (view full) ---

1568}
1569EXPORT_SYMBOL(down_write_trylock);
1570
1571/*
1572 * release a read lock
1573 */
1574void up_read(struct rw_semaphore *sem)
1575{
1550 return -EINTR;
1551 }
1552
1553 return 0;
1554}
1555EXPORT_SYMBOL(down_write_killable);
1556
1557/*

--- 10 unchanged lines hidden (view full) ---

1568}
1569EXPORT_SYMBOL(down_write_trylock);
1570
1571/*
1572 * release a read lock
1573 */
1574void up_read(struct rw_semaphore *sem)
1575{
1576 rwsem_release(&sem->dep_map, 1, _RET_IP_);
1576 rwsem_release(&sem->dep_map, _RET_IP_);
1577 __up_read(sem);
1578}
1579EXPORT_SYMBOL(up_read);
1580
1581/*
1582 * release a write lock
1583 */
1584void up_write(struct rw_semaphore *sem)
1585{
1577 __up_read(sem);
1578}
1579EXPORT_SYMBOL(up_read);
1580
1581/*
1582 * release a write lock
1583 */
1584void up_write(struct rw_semaphore *sem)
1585{
1586 rwsem_release(&sem->dep_map, 1, _RET_IP_);
1586 rwsem_release(&sem->dep_map, _RET_IP_);
1587 __up_write(sem);
1588}
1589EXPORT_SYMBOL(up_write);
1590
1591/*
1592 * downgrade write lock to read lock
1593 */
1594void downgrade_write(struct rw_semaphore *sem)

--- 39 unchanged lines hidden (view full) ---

1634
1635int __sched down_write_killable_nested(struct rw_semaphore *sem, int subclass)
1636{
1637 might_sleep();
1638 rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_);
1639
1640 if (LOCK_CONTENDED_RETURN(sem, __down_write_trylock,
1641 __down_write_killable)) {
1587 __up_write(sem);
1588}
1589EXPORT_SYMBOL(up_write);
1590
1591/*
1592 * downgrade write lock to read lock
1593 */
1594void downgrade_write(struct rw_semaphore *sem)

--- 39 unchanged lines hidden (view full) ---

1634
1635int __sched down_write_killable_nested(struct rw_semaphore *sem, int subclass)
1636{
1637 might_sleep();
1638 rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_);
1639
1640 if (LOCK_CONTENDED_RETURN(sem, __down_write_trylock,
1641 __down_write_killable)) {
1642 rwsem_release(&sem->dep_map, 1, _RET_IP_);
1642 rwsem_release(&sem->dep_map, _RET_IP_);
1643 return -EINTR;
1644 }
1645
1646 return 0;
1647}
1648EXPORT_SYMBOL(down_write_killable_nested);
1649
1650void up_read_non_owner(struct rw_semaphore *sem)
1651{
1652 DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);
1653 __up_read(sem);
1654}
1655EXPORT_SYMBOL(up_read_non_owner);
1656
1657#endif
1643 return -EINTR;
1644 }
1645
1646 return 0;
1647}
1648EXPORT_SYMBOL(down_write_killable_nested);
1649
1650void up_read_non_owner(struct rw_semaphore *sem)
1651{
1652 DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);
1653 __up_read(sem);
1654}
1655EXPORT_SYMBOL(up_read_non_owner);
1656
1657#endif