Skip to content

Commit

Permalink
Merge tag 'for-linus-20191012' of git://git.kernel.dk/linux-block
Browse files Browse the repository at this point in the history
Pull io_uring fix from Jens Axboe:
 "Single small fix for a regression in the sequence logic for linked
  commands"

* tag 'for-linus-20191012' of git://git.kernel.dk/linux-block:
  io_uring: fix sequence logic for timeout requests
  • Loading branch information
torvalds committed Oct 13, 2019
2 parents da94001 + 7adf4ea commit b27528b
Showing 1 changed file with 20 additions and 17 deletions.
37 changes: 20 additions & 17 deletions fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,42 +415,45 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)
return ctx;
}

static inline bool __io_sequence_defer(struct io_ring_ctx *ctx,
struct io_kiocb *req)
{
return req->sequence != ctx->cached_cq_tail + ctx->rings->sq_dropped;
}

static inline bool io_sequence_defer(struct io_ring_ctx *ctx,
struct io_kiocb *req)
{
/* timeout requests always honor sequence */
if (!(req->flags & REQ_F_TIMEOUT) &&
(req->flags & (REQ_F_IO_DRAIN|REQ_F_IO_DRAINED)) != REQ_F_IO_DRAIN)
if ((req->flags & (REQ_F_IO_DRAIN|REQ_F_IO_DRAINED)) != REQ_F_IO_DRAIN)
return false;

return req->sequence != ctx->cached_cq_tail + ctx->rings->sq_dropped;
return __io_sequence_defer(ctx, req);
}

static struct io_kiocb *__io_get_deferred_req(struct io_ring_ctx *ctx,
struct list_head *list)
static struct io_kiocb *io_get_deferred_req(struct io_ring_ctx *ctx)
{
struct io_kiocb *req;

if (list_empty(list))
return NULL;

req = list_first_entry(list, struct io_kiocb, list);
if (!io_sequence_defer(ctx, req)) {
req = list_first_entry_or_null(&ctx->defer_list, struct io_kiocb, list);
if (req && !io_sequence_defer(ctx, req)) {
list_del_init(&req->list);
return req;
}

return NULL;
}

static struct io_kiocb *io_get_deferred_req(struct io_ring_ctx *ctx)
{
return __io_get_deferred_req(ctx, &ctx->defer_list);
}

static struct io_kiocb *io_get_timeout_req(struct io_ring_ctx *ctx)
{
return __io_get_deferred_req(ctx, &ctx->timeout_list);
struct io_kiocb *req;

req = list_first_entry_or_null(&ctx->timeout_list, struct io_kiocb, list);
if (req && !__io_sequence_defer(ctx, req)) {
list_del_init(&req->list);
return req;
}

return NULL;
}

static void __io_commit_cqring(struct io_ring_ctx *ctx)
Expand Down

0 comments on commit b27528b

Please sign in to comment.