@@ -2387,7 +2387,7 @@ static inline int io_cqring_wait_schedule(struct io_ring_ctx *ctx,
2387
2387
* Wait until events become available, if we don't already have some. The
2388
2388
* application must reap them itself, as they reside on the shared cq ring.
2389
2389
*/
2390
- static int io_cqring_wait (struct io_ring_ctx * ctx , int min_events ,
2390
+ static int io_cqring_wait (struct io_ring_ctx * ctx , int min_events , u32 flags ,
2391
2391
const sigset_t __user * sig , size_t sigsz ,
2392
2392
struct __kernel_timespec __user * uts )
2393
2393
{
@@ -2416,13 +2416,13 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
2416
2416
2417
2417
if (uts ) {
2418
2418
struct timespec64 ts ;
2419
- ktime_t dt ;
2420
2419
2421
2420
if (get_timespec64 (& ts , uts ))
2422
2421
return - EFAULT ;
2423
2422
2424
- dt = timespec64_to_ktime (ts );
2425
- iowq .timeout = ktime_add (dt , ktime_get ());
2423
+ iowq .timeout = timespec64_to_ktime (ts );
2424
+ if (!(flags & IORING_ENTER_ABS_TIMER ))
2425
+ iowq .timeout = ktime_add (iowq .timeout , ktime_get ());
2426
2426
}
2427
2427
2428
2428
if (sig ) {
@@ -3153,7 +3153,8 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
3153
3153
3154
3154
if (unlikely (flags & ~(IORING_ENTER_GETEVENTS | IORING_ENTER_SQ_WAKEUP |
3155
3155
IORING_ENTER_SQ_WAIT | IORING_ENTER_EXT_ARG |
3156
- IORING_ENTER_REGISTERED_RING )))
3156
+ IORING_ENTER_REGISTERED_RING |
3157
+ IORING_ENTER_ABS_TIMER )))
3157
3158
return - EINVAL ;
3158
3159
3159
3160
/*
@@ -3251,8 +3252,8 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
3251
3252
if (likely (!ret2 )) {
3252
3253
min_complete = min (min_complete ,
3253
3254
ctx -> cq_entries );
3254
- ret2 = io_cqring_wait (ctx , min_complete , sig ,
3255
- argsz , ts );
3255
+ ret2 = io_cqring_wait (ctx , min_complete , flags ,
3256
+ sig , argsz , ts );
3256
3257
}
3257
3258
}
3258
3259
0 commit comments