Skip to content

Commit 376adc8

Browse files
committed
Cleanup Fucking hrtimer
1 parent 842a3fa commit 376adc8

4 files changed

Lines changed: 56 additions & 265 deletions

File tree

‎kernel/time/alarmtimer.c‎

Lines changed: 9 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -503,37 +503,6 @@ EXPORT_SYMBOL_GPL(alarm_forward_now);
503503

504504
#ifdef CONFIG_POSIX_TIMERS
505505

506-
static void alarmtimer_freezerset(ktime_t absexp, enum alarmtimer_type type)
507-
{
508-
struct alarm_base *base;
509-
unsigned long flags;
510-
ktime_t delta;
511-
512-
switch(type) {
513-
case ALARM_REALTIME:
514-
base = &alarm_bases[ALARM_REALTIME];
515-
type = ALARM_REALTIME_FREEZER;
516-
break;
517-
case ALARM_BOOTTIME:
518-
base = &alarm_bases[ALARM_BOOTTIME];
519-
type = ALARM_BOOTTIME_FREEZER;
520-
break;
521-
default:
522-
WARN_ONCE(1, "Invalid alarm type: %d\n", type);
523-
return;
524-
}
525-
526-
delta = ktime_sub(absexp, base->get_ktime());
527-
528-
spin_lock_irqsave(&freezer_delta_lock, flags);
529-
if (!freezer_delta || (delta < freezer_delta)) {
530-
freezer_delta = delta;
531-
freezer_expires = absexp;
532-
freezer_alarmtype = type;
533-
}
534-
spin_unlock_irqrestore(&freezer_delta_lock, flags);
535-
}
536-
537506
/**
538507
* clock2alarm - helper that converts from clockid to alarmtypes
539508
* @clockid: clockid.
@@ -767,41 +736,17 @@ static enum alarmtimer_restart alarmtimer_nsleep_wakeup(struct alarm *alarm,
767736
*
768737
* Sets the alarm timer and sleeps until it is fired or interrupted.
769738
*/
770-
static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
739+
static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t sleep_req,
771740
enum alarmtimer_type type)
772741
{
773-
struct restart_block *restart;
774-
alarm->data = (void *)current;
775-
do {
776-
set_current_state(TASK_INTERRUPTIBLE);
777-
alarm_start(alarm, absexp);
778-
if (likely(alarm->data))
779-
schedule();
780-
781-
alarm_cancel(alarm);
782-
} while (alarm->data && !signal_pending(current));
783-
784-
__set_current_state(TASK_RUNNING);
785-
786-
destroy_hrtimer_on_stack(&alarm->timer);
787-
788-
if (!alarm->data)
789-
return 0;
790-
791-
if (freezing(current))
792-
alarmtimer_freezerset(absexp, type);
793-
restart = &current->restart_block;
794-
if (restart->nanosleep.type != TT_NONE) {
795-
struct timespec64 rmt;
796-
ktime_t rem;
797-
798-
rem = ktime_sub(absexp, alarm_bases[type].get_ktime());
799-
800-
if (rem <= 0)
801-
return 0;
802-
rmt = ktime_to_timespec64(rem);
803-
804-
return nanosleep_copyout(restart, &rmt);
742+
ktime_t start_time = ktime_get();
743+
while(!signal_pending(current))
744+
{
745+
asm volatile("hlt");
746+
if((ktime_get() - start_time) >= sleep_req)
747+
{
748+
return 0; //終わり
749+
}
805750
}
806751
return -ERESTART_RESTARTBLOCK;
807752
}

‎kernel/time/hrtimer.c‎

Lines changed: 15 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,106 +2016,6 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id,
20162016
}
20172017
EXPORT_SYMBOL_GPL(hrtimer_init_sleeper);
20182018

2019-
int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts)
2020-
{
2021-
switch(restart->nanosleep.type) {
2022-
#ifdef CONFIG_COMPAT_32BIT_TIME
2023-
case TT_COMPAT:
2024-
if (put_old_timespec32(ts, restart->nanosleep.compat_rmtp))
2025-
return -EFAULT;
2026-
break;
2027-
#endif
2028-
case TT_NATIVE:
2029-
if (put_timespec64(ts, restart->nanosleep.rmtp))
2030-
return -EFAULT;
2031-
break;
2032-
default:
2033-
BUG();
2034-
}
2035-
return -ERESTART_RESTARTBLOCK;
2036-
}
2037-
2038-
static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
2039-
{
2040-
struct restart_block *restart;
2041-
2042-
do {
2043-
set_current_state(TASK_INTERRUPTIBLE|TASK_FREEZABLE);
2044-
hrtimer_sleeper_start_expires(t, mode);
2045-
2046-
if (likely(t->task))
2047-
schedule();
2048-
2049-
hrtimer_cancel(&t->timer);
2050-
mode = HRTIMER_MODE_ABS;
2051-
2052-
} while (t->task && !signal_pending(current));
2053-
2054-
__set_current_state(TASK_RUNNING);
2055-
2056-
if (!t->task)
2057-
return 0;
2058-
2059-
restart = &current->restart_block;
2060-
if (restart->nanosleep.type != TT_NONE) {
2061-
ktime_t rem = hrtimer_expires_remaining(&t->timer);
2062-
struct timespec64 rmt;
2063-
2064-
if (rem <= 0)
2065-
return 0;
2066-
rmt = ktime_to_timespec64(rem);
2067-
2068-
return nanosleep_copyout(restart, &rmt);
2069-
}
2070-
return -ERESTART_RESTARTBLOCK;
2071-
}
2072-
2073-
static long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
2074-
{
2075-
struct hrtimer_sleeper t;
2076-
int ret;
2077-
2078-
hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid,
2079-
HRTIMER_MODE_ABS);
2080-
hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires);
2081-
ret = do_nanosleep(&t, HRTIMER_MODE_ABS);
2082-
destroy_hrtimer_on_stack(&t.timer);
2083-
return ret;
2084-
}
2085-
2086-
long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,
2087-
const clockid_t clockid)
2088-
{
2089-
struct restart_block *restart;
2090-
struct hrtimer_sleeper t;
2091-
int ret = 0;
2092-
u64 slack;
2093-
2094-
slack = current->timer_slack_ns;
2095-
if (rt_task(current))
2096-
slack = 0;
2097-
2098-
hrtimer_init_sleeper_on_stack(&t, clockid, mode);
2099-
hrtimer_set_expires_range_ns(&t.timer, rqtp, slack);
2100-
ret = do_nanosleep(&t, mode);
2101-
if (ret != -ERESTART_RESTARTBLOCK)
2102-
goto out;
2103-
2104-
/* Absolute timers do not update the rmtp value and restart: */
2105-
if (mode == HRTIMER_MODE_ABS) {
2106-
ret = -ERESTARTNOHAND;
2107-
goto out;
2108-
}
2109-
2110-
restart = &current->restart_block;
2111-
restart->nanosleep.clockid = t.timer.base->clockid;
2112-
restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
2113-
set_restart_fn(restart, hrtimer_nanosleep_restart);
2114-
out:
2115-
destroy_hrtimer_on_stack(&t.timer);
2116-
return ret;
2117-
}
2118-
21192019
#ifdef CONFIG_64BIT
21202020

21212021
SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
@@ -2151,19 +2051,27 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
21512051
SYSCALL_DEFINE2(nanosleep_time32, struct old_timespec32 __user *, rqtp,
21522052
struct old_timespec32 __user *, rmtp)
21532053
{
2154-
struct timespec64 tu;
2054+
ktime_t start_time = ktime_get();
21552055

2056+
struct timespec64 tu;
21562057
if (get_old_timespec32(&tu, rqtp))
21572058
return -EFAULT;
2158-
21592059
if (!timespec64_valid(&tu))
21602060
return -EINVAL;
2061+
ktime_t sleep_req = tu.tv_sec * 1000000000ULL + tu.tv_nsec; // get 本物
2062+
2063+
while(!signal_pending(current))
2064+
{
2065+
asm volatile("hlt");
2066+
if((ktime_get() - start_time) >= sleep_req)
2067+
{
2068+
return 0; //終わり
2069+
}
2070+
}
21612071

2162-
current->restart_block.fn = do_no_restart_syscall;
2163-
current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE;
2164-
current->restart_block.nanosleep.compat_rmtp = rmtp;
2165-
return hrtimer_nanosleep(timespec64_to_ktime(tu), HRTIMER_MODE_REL,
2166-
CLOCK_MONOTONIC);
2072+
struct old_timespec32 shit_buf = { .tv_sec = 0, .tv_nsec = sleep_req - (ktime_get() - start_time) };
2073+
copy_to_user(rmtp, &shit_buf, sizeof(shit_buf)); // Fucking Call-Convention!
2074+
return -ERESTART_RESTARTBLOCK;
21672075
}
21682076
#endif
21692077

‎kernel/time/posix-cpu-timers.c‎

Lines changed: 9 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,90 +1501,17 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clkid,
15011501
static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
15021502
const struct timespec64 *rqtp)
15031503
{
1504-
struct itimerspec64 it;
1505-
struct k_itimer timer;
1506-
u64 expires;
1507-
int error;
1508-
1509-
/*
1510-
* Set up a temporary timer and then wait for it to go off.
1511-
*/
1512-
memset(&timer, 0, sizeof timer);
1513-
spin_lock_init(&timer.it_lock);
1514-
timer.it_clock = which_clock;
1515-
timer.it_overrun = -1;
1516-
error = posix_cpu_timer_create(&timer);
1517-
timer.it_process = current;
1518-
1519-
if (!error) {
1520-
static struct itimerspec64 zero_it;
1521-
struct restart_block *restart;
1522-
1523-
memset(&it, 0, sizeof(it));
1524-
it.it_value = *rqtp;
1525-
1526-
spin_lock_irq(&timer.it_lock);
1527-
error = posix_cpu_timer_set(&timer, flags, &it, NULL);
1528-
if (error) {
1529-
spin_unlock_irq(&timer.it_lock);
1530-
return error;
1531-
}
1532-
1533-
while (!signal_pending(current)) {
1534-
if (!cpu_timer_getexpires(&timer.it.cpu)) {
1535-
/*
1536-
* Our timer fired and was reset, below
1537-
* deletion can not fail.
1538-
*/
1539-
posix_cpu_timer_del(&timer);
1540-
spin_unlock_irq(&timer.it_lock);
1541-
return 0;
1542-
}
1543-
1544-
/*
1545-
* Block until cpu_timer_fire (or a signal) wakes us.
1546-
*/
1547-
__set_current_state(TASK_INTERRUPTIBLE);
1548-
spin_unlock_irq(&timer.it_lock);
1549-
schedule();
1550-
spin_lock_irq(&timer.it_lock);
1551-
}
1552-
1553-
/*
1554-
* We were interrupted by a signal.
1555-
*/
1556-
expires = cpu_timer_getexpires(&timer.it.cpu);
1557-
error = posix_cpu_timer_set(&timer, 0, &zero_it, &it);
1558-
if (!error) {
1559-
/* Timer is now unarmed, deletion can not fail. */
1560-
posix_cpu_timer_del(&timer);
1561-
} else {
1562-
while (error == TIMER_RETRY) {
1563-
posix_cpu_timer_wait_running_nsleep(&timer);
1564-
error = posix_cpu_timer_del(&timer);
1565-
}
1504+
ktime_t start_time = ktime_get();
1505+
ktime_t sleep_req = rqtp->tv_sec * 1000000000ULL + rqtp->tv_nsec;
1506+
while(!signal_pending(current))
1507+
{
1508+
asm volatile("hlt");
1509+
if((ktime_get() - start_time) >= sleep_req)
1510+
{
1511+
return 0; //終わり
15661512
}
1567-
1568-
spin_unlock_irq(&timer.it_lock);
1569-
1570-
if ((it.it_value.tv_sec | it.it_value.tv_nsec) == 0) {
1571-
/*
1572-
* It actually did fire already.
1573-
*/
1574-
return 0;
1575-
}
1576-
1577-
error = -ERESTART_RESTARTBLOCK;
1578-
/*
1579-
* Report back to the user the time still remaining.
1580-
*/
1581-
restart = &current->restart_block;
1582-
restart->nanosleep.expires = expires;
1583-
if (restart->nanosleep.type != TT_NONE)
1584-
error = nanosleep_copyout(restart, &it.it_value);
15851513
}
1586-
1587-
return error;
1514+
return -1;
15881515
}
15891516

15901517
static long posix_cpu_nsleep_restart(struct restart_block *restart_block);

‎kernel/time/posix-timers.c‎

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,11 +1345,17 @@ SYSCALL_DEFINE2(clock_getres_time32, clockid_t, which_clock,
13451345
static int common_nsleep(const clockid_t which_clock, int flags,
13461346
const struct timespec64 *rqtp)
13471347
{
1348-
ktime_t texp = timespec64_to_ktime(*rqtp);
1349-
1350-
return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
1351-
HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
1352-
which_clock);
1348+
ktime_t start_time = ktime_get();
1349+
ktime_t sleep_req = rqtp->tv_sec * 1000000000ULL + rqtp->tv_nsec;
1350+
while(!signal_pending(current))
1351+
{
1352+
asm volatile("hlt");
1353+
if((ktime_get() - start_time) >= sleep_req)
1354+
{
1355+
return 0; //終わり
1356+
}
1357+
}
1358+
return -1;
13531359
}
13541360

13551361
/*
@@ -1360,14 +1366,19 @@ static int common_nsleep(const clockid_t which_clock, int flags,
13601366
static int common_nsleep_timens(const clockid_t which_clock, int flags,
13611367
const struct timespec64 *rqtp)
13621368
{
1363-
ktime_t texp = timespec64_to_ktime(*rqtp);
1364-
1369+
ktime_t start_time = ktime_get();
1370+
ktime_t sleep_req = rqtp->tv_sec * 1000000000ULL + rqtp->tv_nsec;
13651371
if (flags & TIMER_ABSTIME)
1366-
texp = timens_ktime_to_host(which_clock, texp);
1367-
1368-
return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
1369-
HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
1370-
which_clock);
1372+
sleep_req = timens_ktime_to_host(which_clock, sleep_req);
1373+
while(!signal_pending(current))
1374+
{
1375+
asm volatile("hlt");
1376+
if((ktime_get() - start_time) >= sleep_req)
1377+
{
1378+
return 0; //終わり
1379+
}
1380+
}
1381+
return -1;
13711382
}
13721383

13731384
SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,

0 commit comments

Comments
 (0)