hrtimer.c (b74494872555d1f7888dfd9225700a363f4a84fc) | hrtimer.c (dbc1625fc9deefb352f6ff26a575ae4b3ddef23a) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de> 4 * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar 5 * Copyright(C) 2006-2007 Timesys Corp., Thomas Gleixner 6 * 7 * High-resolution kernel timers 8 * --- 413 unchanged lines hidden (view full) --- 422void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t clock_id, 423 enum hrtimer_mode mode) 424{ 425 debug_object_init_on_stack(timer, &hrtimer_debug_descr); 426 __hrtimer_init(timer, clock_id, mode); 427} 428EXPORT_SYMBOL_GPL(hrtimer_init_on_stack); 429 | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de> 4 * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar 5 * Copyright(C) 2006-2007 Timesys Corp., Thomas Gleixner 6 * 7 * High-resolution kernel timers 8 * --- 413 unchanged lines hidden (view full) --- 422void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t clock_id, 423 enum hrtimer_mode mode) 424{ 425 debug_object_init_on_stack(timer, &hrtimer_debug_descr); 426 __hrtimer_init(timer, clock_id, mode); 427} 428EXPORT_SYMBOL_GPL(hrtimer_init_on_stack); 429 |
430static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, 431 clockid_t clock_id, enum hrtimer_mode mode); 432 433void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, 434 clockid_t clock_id, enum hrtimer_mode mode) 435{ 436 debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); 437 __hrtimer_init_sleeper(sl, clock_id, mode); 438} 439EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); 440 |
|
430void destroy_hrtimer_on_stack(struct hrtimer *timer) 431{ 432 debug_object_free(timer, &hrtimer_debug_descr); 433} 434EXPORT_SYMBOL_GPL(destroy_hrtimer_on_stack); 435 436#else 437 --- 1196 unchanged lines hidden (view full) --- 1634 1635 t->task = NULL; 1636 if (task) 1637 wake_up_process(task); 1638 1639 return HRTIMER_NORESTART; 1640} 1641 | 441void destroy_hrtimer_on_stack(struct hrtimer *timer) 442{ 443 debug_object_free(timer, &hrtimer_debug_descr); 444} 445EXPORT_SYMBOL_GPL(destroy_hrtimer_on_stack); 446 447#else 448 --- 1196 unchanged lines hidden (view full) --- 1645 1646 t->task = NULL; 1647 if (task) 1648 wake_up_process(task); 1649 1650 return HRTIMER_NORESTART; 1651} 1652 |
1642void hrtimer_init_sleeper(struct hrtimer_sleeper *sl) | 1653static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, 1654 clockid_t clock_id, enum hrtimer_mode mode) |
1643{ | 1655{ |
1656 __hrtimer_init(&sl->timer, clock_id, mode); |
|
1644 sl->timer.function = hrtimer_wakeup; 1645 sl->task = current; 1646} | 1657 sl->timer.function = hrtimer_wakeup; 1658 sl->task = current; 1659} |
1660 1661/** 1662 * hrtimer_init_sleeper - initialize sleeper to the given clock 1663 * @sl: sleeper to be initialized 1664 * @clock_id: the clock to be used 1665 * @mode: timer mode abs/rel 1666 */ 1667void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, 1668 enum hrtimer_mode mode) 1669{ 1670 debug_init(&sl->timer, clock_id, mode); 1671 __hrtimer_init_sleeper(sl, clock_id, mode); 1672 1673} |
|
1647EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); 1648 1649int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) 1650{ 1651 switch(restart->nanosleep.type) { 1652#ifdef CONFIG_COMPAT_32BIT_TIME 1653 case TT_COMPAT: 1654 if (put_old_timespec32(ts, restart->nanosleep.compat_rmtp)) --- 9 unchanged lines hidden (view full) --- 1664 } 1665 return -ERESTART_RESTARTBLOCK; 1666} 1667 1668static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) 1669{ 1670 struct restart_block *restart; 1671 | 1674EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); 1675 1676int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) 1677{ 1678 switch(restart->nanosleep.type) { 1679#ifdef CONFIG_COMPAT_32BIT_TIME 1680 case TT_COMPAT: 1681 if (put_old_timespec32(ts, restart->nanosleep.compat_rmtp)) --- 9 unchanged lines hidden (view full) --- 1691 } 1692 return -ERESTART_RESTARTBLOCK; 1693} 1694 1695static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) 1696{ 1697 struct restart_block *restart; 1698 |
1672 hrtimer_init_sleeper(t); 1673 | |
1674 do { 1675 set_current_state(TASK_INTERRUPTIBLE); 1676 hrtimer_start_expires(&t->timer, mode); 1677 1678 if (likely(t->task)) 1679 freezable_schedule(); 1680 1681 hrtimer_cancel(&t->timer); --- 20 unchanged lines hidden (view full) --- 1702 return -ERESTART_RESTARTBLOCK; 1703} 1704 1705static long __sched hrtimer_nanosleep_restart(struct restart_block *restart) 1706{ 1707 struct hrtimer_sleeper t; 1708 int ret; 1709 | 1699 do { 1700 set_current_state(TASK_INTERRUPTIBLE); 1701 hrtimer_start_expires(&t->timer, mode); 1702 1703 if (likely(t->task)) 1704 freezable_schedule(); 1705 1706 hrtimer_cancel(&t->timer); --- 20 unchanged lines hidden (view full) --- 1727 return -ERESTART_RESTARTBLOCK; 1728} 1729 1730static long __sched hrtimer_nanosleep_restart(struct restart_block *restart) 1731{ 1732 struct hrtimer_sleeper t; 1733 int ret; 1734 |
1710 hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid, 1711 HRTIMER_MODE_ABS); | 1735 hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, 1736 HRTIMER_MODE_ABS); |
1712 hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); | 1737 hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); |
1713 | |
1714 ret = do_nanosleep(&t, HRTIMER_MODE_ABS); 1715 destroy_hrtimer_on_stack(&t.timer); 1716 return ret; 1717} 1718 1719long hrtimer_nanosleep(const struct timespec64 *rqtp, 1720 const enum hrtimer_mode mode, const clockid_t clockid) 1721{ 1722 struct restart_block *restart; 1723 struct hrtimer_sleeper t; 1724 int ret = 0; 1725 u64 slack; 1726 1727 slack = current->timer_slack_ns; 1728 if (dl_task(current) || rt_task(current)) 1729 slack = 0; 1730 | 1738 ret = do_nanosleep(&t, HRTIMER_MODE_ABS); 1739 destroy_hrtimer_on_stack(&t.timer); 1740 return ret; 1741} 1742 1743long hrtimer_nanosleep(const struct timespec64 *rqtp, 1744 const enum hrtimer_mode mode, const clockid_t clockid) 1745{ 1746 struct restart_block *restart; 1747 struct hrtimer_sleeper t; 1748 int ret = 0; 1749 u64 slack; 1750 1751 slack = current->timer_slack_ns; 1752 if (dl_task(current) || rt_task(current)) 1753 slack = 0; 1754 |
1731 hrtimer_init_on_stack(&t.timer, clockid, mode); | 1755 hrtimer_init_sleeper_on_stack(&t, clockid, mode); |
1732 hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); 1733 ret = do_nanosleep(&t, mode); 1734 if (ret != -ERESTART_RESTARTBLOCK) 1735 goto out; 1736 1737 /* Absolute timers do not update the rmtp value and restart: */ 1738 if (mode == HRTIMER_MODE_ABS) { 1739 ret = -ERESTARTNOHAND; --- 182 unchanged lines hidden (view full) --- 1922 /* 1923 * A NULL parameter means "infinite" 1924 */ 1925 if (!expires) { 1926 schedule(); 1927 return -EINTR; 1928 } 1929 | 1756 hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); 1757 ret = do_nanosleep(&t, mode); 1758 if (ret != -ERESTART_RESTARTBLOCK) 1759 goto out; 1760 1761 /* Absolute timers do not update the rmtp value and restart: */ 1762 if (mode == HRTIMER_MODE_ABS) { 1763 ret = -ERESTARTNOHAND; --- 182 unchanged lines hidden (view full) --- 1946 /* 1947 * A NULL parameter means "infinite" 1948 */ 1949 if (!expires) { 1950 schedule(); 1951 return -EINTR; 1952 } 1953 |
1930 hrtimer_init_on_stack(&t.timer, clock_id, mode); | 1954 hrtimer_init_sleeper_on_stack(&t, clock_id, mode); |
1931 hrtimer_set_expires_range_ns(&t.timer, *expires, delta); | 1955 hrtimer_set_expires_range_ns(&t.timer, *expires, delta); |
1932 1933 hrtimer_init_sleeper(&t); 1934 | |
1935 hrtimer_start_expires(&t.timer, mode); 1936 1937 if (likely(t.task)) 1938 schedule(); 1939 1940 hrtimer_cancel(&t.timer); 1941 destroy_hrtimer_on_stack(&t.timer); 1942 --- 77 unchanged lines hidden --- | 1956 hrtimer_start_expires(&t.timer, mode); 1957 1958 if (likely(t.task)) 1959 schedule(); 1960 1961 hrtimer_cancel(&t.timer); 1962 destroy_hrtimer_on_stack(&t.timer); 1963 --- 77 unchanged lines hidden --- |