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!