History

io_uring: add support for absolute timeouts

This is a pretty trivial addition on top of the relative timeouts we have now, but it's handy for ensuring tighter timing for those that are building scheduling primitives on top of io_uring.

Jens Axboe committed 7 years ago

Commit a41525a1 parent ba5290c2 files · +17 −5Browse files

Unified · Split

2 files
  1. fs/io_uring.c +12 −5
  2. include/uapi/linux/io_uring.h +5 −0
fs/io_uring.c+12−5
@@ -1978,13 +1978,17 @@ static int io_timeout(struct io_kiocb *req, const struct io_uring_sqe *sqe) · 1977 unmodified lines
19781978 unsigned count;
19791979 struct io_ring_ctx *ctx = req->ctx;
19801980 struct list_head *entry;
1981+ enum hrtimer_mode mode;
19811982 struct timespec64 ts;
19821983 unsigned span = 0;
1984+ unsigned flags;
19831985
19841986 if (unlikely(ctx->flags & IORING_SETUP_IOPOLL))
19851987 return -EINVAL;
1986− if (sqe->flags || sqe->ioprio || sqe->buf_index || sqe->timeout_flags ||
1987− sqe->len != 1)
1988+ if (sqe->flags || sqe->ioprio || sqe->buf_index || sqe->len != 1)
1989+ return -EINVAL;
1990+ flags = READ_ONCE(sqe->timeout_flags);
1991+ if (flags & ~IORING_TIMEOUT_ABS)
19881992 return -EINVAL;
19891993
19901994 if (get_timespec64(&ts, u64_to_user_ptr(sqe->addr)))
@@ -2042,10 +2046,13 @@ static int io_timeout(struct io_kiocb *req, const struct io_uring_sqe *sqe) · 51 unmodified lines
20422046 list_add(&req->list, entry);
20432047 spin_unlock_irq(&ctx->completion_lock);
20442048
2045− hrtimer_init(&req->timeout.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
2049+ if (flags & IORING_TIMEOUT_ABS)
2050+ mode = HRTIMER_MODE_ABS;
2051+ else
2052+ mode = HRTIMER_MODE_REL;
2053+ hrtimer_init(&req->timeout.timer, CLOCK_MONOTONIC, mode);
20462054 req->timeout.timer.function = io_timeout_fn;
2047− hrtimer_start(&req->timeout.timer, timespec64_to_ktime(ts),
2048− HRTIMER_MODE_REL);
2055+ hrtimer_start(&req->timeout.timer, timespec64_to_ktime(ts), mode);
20492056 return 0;
20502057 }
20512058
include/uapi/linux/io_uring.h+5−0
@@ -70,6 +70,11 @@ struct io_uring_sqe { · 69 unmodified lines
7070 */
7171 #define IORING_FSYNC_DATASYNC (1U << 0)
7272
73+/*
74+ * sqe->timeout_flags
75+ */
76+#define IORING_TIMEOUT_ABS (1U << 0)
77+
7378 /*
7479 * IO completion data structure (Completion Queue Entry)
7580 */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t