Re: [PATCH v4] io_uring: annotate remote tasks for kcoverage

Andrey Konovalov <[email protected]>
Newsgroups org.kernel.vger.io-uring
Message-ID <CA+fCnZf6pj66Z0wmGPa+yRbzK7BQDx+ZoFO7nJ7rGnCfOW10Qw@mail.gmail.com>
On Wed, Jun 24, 2026 at 11:03 AM Robert Femmer <[email protected]> wrote:
>
> Fuzzers use coverage information to guide generation of test cases
> towards new or interesting code paths. Syzkaller, specifically, makes
> use kcoverage (CONFIG_KCOV). Coverage information is not collected for
> kernel tasks unless annotated by kcov_remote_start and kcov_remote_stop.
> This patch annotates io-uring's work queue and sqpoll tasks.
>
> Depends-On: 20260430-kcov-refactor-common-handle-v1-1-23a0c7a0ba38@google.com
> Signed-off-by: Robert Femmer <[email protected]>
> ---
>  include/linux/io_uring_types.h | 2 ++
>  io_uring/io-wq.c               | 5 +++++
>  io_uring/io_uring.c            | 2 ++
>  io_uring/sqpoll.c              | 3 +++
>  4 files changed, 12 insertions(+)
>
> diff --git a/include/linux/io_uring_types.h b/include/linux/io_uring_types.h
> index 244392026c6d..b6590b2b350c 100644
> --- a/include/linux/io_uring_types.h
> +++ b/include/linux/io_uring_types.h
> @@ -504,6 +504,8 @@ struct io_ring_ctx {
>         struct io_mapped_region         ring_region;
>         /* used for optimised request parameter and wait argument passing  */
>         struct io_mapped_region         param_region;
> +
> +       struct kcov_common_handle_id    kcov_handle;
>  };
>
>  /*
> diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c
> index 8cc7b47d3089..173299dfc9c2 100644
> --- a/io_uring/io-wq.c
> +++ b/io_uring/io-wq.c
> @@ -19,6 +19,7 @@
>  #include <linux/mmu_context.h>
>  #include <linux/sched/sysctl.h>
>  #include <uapi/linux/io_uring.h>
> +#include <linux/kcov.h>
>
>  #include "io-wq.h"
>  #include "slist.h"
> @@ -639,6 +640,7 @@ static void io_worker_handle_work(struct io_wq_acct *acct,
>                 /* handle a whole dependent link */
>                 do {
>                         struct io_wq_work *next_hashed, *linked;
> +                       struct io_kiocb *req;
>                         unsigned int work_flags = atomic_read(&work->flags);
>                         unsigned int hash = __io_wq_is_hashed(work_flags)
>                                 ? __io_get_work_hash(work_flags)
> @@ -649,7 +651,10 @@ static void io_worker_handle_work(struct io_wq_acct *acct,
>                         if (do_kill &&
>                             (work_flags & IO_WQ_WORK_UNBOUND))
>                                 atomic_or(IO_WQ_WORK_CANCEL, &work->flags);
> +                       req = container_of(work, struct io_kiocb, work);
> +                       kcov_remote_start_common(req->ctx->kcov_handle);
>                         io_wq_submit_work(work);
> +                       kcov_remote_stop();
>                         io_assign_current_work(worker, NULL);
>
>                         linked = io_wq_free_work(work);
> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
> index 103b6c88f252..ab7c3e45e238 100644
> --- a/io_uring/io_uring.c
> +++ b/io_uring/io_uring.c
> @@ -59,6 +59,7 @@
>  #include <linux/audit.h>
>  #include <linux/security.h>
>  #include <linux/jump_label.h>
> +#include <linux/kcov.h>
>
>  #define CREATE_TRACE_POINTS
>  #include <trace/events/io_uring.h>
> @@ -293,6 +294,7 @@ static __cold struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)
>         INIT_HLIST_HEAD(&ctx->cancelable_uring_cmd);
>         io_napi_init(ctx);
>         mutex_init(&ctx->mmap_lock);
> +       ctx->kcov_handle = kcov_common_handle();
>
>         return ctx;
>
> diff --git a/io_uring/sqpoll.c b/io_uring/sqpoll.c
> index 46c12afec73e..aafb640d3b2f 100644
> --- a/io_uring/sqpoll.c
> +++ b/io_uring/sqpoll.c
> @@ -13,6 +13,7 @@
>  #include <linux/cpuset.h>
>  #include <linux/sched/cputime.h>
>  #include <linux/io_uring.h>
> +#include <linux/kcov.h>
>
>  #include <uapi/linux/io_uring.h>
>
> @@ -342,10 +343,12 @@ static int io_sq_thread(void *data)
>
>                 cap_entries = !list_is_singular(&sqd->ctx_list);
>                 list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
> +                       kcov_remote_start_common(ctx->kcov_handle);
>                         int ret = __io_sq_thread(ctx, sqd, cap_entries, &ist);
>
>                         if (!sqt_spin && (ret > 0 || !list_empty(&ctx->iopoll_list)))
>                                 sqt_spin = true;
> +                       kcov_remote_stop();
>                 }
>                 if (io_sq_tw(&retry_list, IORING_TW_CAP_ENTRIES_VALUE))
>                         sqt_spin = true;
> --
> 2.54.0
>

From KCOV API side:

Acked-by: Andrey Konovalov <[email protected]>

Thanks!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.