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 ---