>
> @@ -118,12 +120,16 @@ struct io_kiocb {
> struct list_head list;
> unsigned int flags;
> #define REQ_F_FORCE_NONBLOCK 1 /* inline submission attempt */
> +#define REQ_F_IOPOLL_COMPLETED 2 /* polled IO has completed */
> +#define REQ_F_IOPOLL_EAGAIN 4 /* submission got EAGAIN */
> u64 user_data;
> + u64 res;
Should this be ret or error instead? res is kinda off. A little
comment describing it won't hurt either. Last but not least with
the actual errno value stored here we probably don't need the
REQ_F_IOPOLL_EAGAIN flag, do we?
> + /*
> + * Only spin for completions if we don't have multiple devices hanging
> + * off our complete list, and we're under the requested amount.
> + */
> + spin = !ctx->poll_multi_file && (*nr_events < min);
no need for the braces here.
> +static int io_iopoll_getevents(struct io_ring_ctx *ctx, unsigned int
> *nr_events,
> + long min)
> +{
> + int ret;
> +
> + do {
> + if (list_empty(&ctx->poll_list))
> + return 0;
> +
> + ret = io_do_iopoll(ctx, nr_events, min);
> + if (ret < 0)
> + break;
> + } while (min && *nr_events < min);
> +
> + if (ret < 0)
> + return ret;
> +
> + return *nr_events < min;
The code looks a little clumsy to me. Why not:
while (!list_empty(&ctx->poll_list)) {
int ret = io_do_iopoll(ctx, nr_events, min);
if (ret)
return ret;
if (!min || *nr_events >= min)
return 0;
}
return 1;