[RFC v2 00/18] kthread: Use kthread worker API more widely

From: Petr Mladek
Date: Mon Sep 21 2015 - 09:05:03 EST


My intention is to make it easier to manipulate kthreads. This RFC tries
to use the kthread worker API. It is based on comments from the
first attempt. See https://lkml.org/lkml/2015/7/28/648 and
the list of changes below.

1st..8th patches: improve the existing kthread worker API

9th, 12th, 17th patches: convert three kthreads into the new API,
namely: khugepaged, ring buffer benchmark, RCU gp kthreads[*]

10th, 11th patches: fix potential problems in the ring buffer
benchmark; also sent separately

13th patch: small fix for RCU kthread; also sent separately;
being tested by Paul

14th..16th patches: preparation steps for the RCU threads
conversion; they are needed _only_ if we split GP start
and QS handling into separate works[*]

18th patch: does a possible improvement of the kthread worker API;
it adds an extra parameter to the create*() functions, so I
rather put it into this draft


[*] IMPORTANT: I tried to split RCU GP start and GS state handling
into separate works this time. But there is a problem with
a race in rcu_gp_kthread_worker_poke(). It might queue
the wrong work. It can be detected and fixed by the work
itself but it is a bit ugly. Alternative solution is to
do both operations in one work. But then we sleep too much
in the work which is ugly as well. Any idea is appreciated.


Changes against v1:

+ remove wrappers to manipulate the scheduling policy and priority

+ remove questionable wakeup_and_destroy_kthread_worker() variant

+ do not check for chained work when draining the queue

+ allocate struct kthread worker in create_kthread_work() and
use more simple checks for running worker

+ add support for delayed kthread works and use them instead
of waiting inside the works

+ rework the "unrelated" fixes for the ring buffer benchmark
as discussed in the 1st RFC; also sent separately

+ convert also the consumer in the ring buffer benchmark


I have tested this patch set against the stable Linus tree
for 4.3-rc2.

Petr Mladek (18):
kthread: Allow to call __kthread_create_on_node() with va_list args
kthread: Add create_kthread_worker*()
kthread: Add drain_kthread_worker()
kthread: Add destroy_kthread_worker()
kthread: Add pending flag to kthread work
kthread: Initial support for delayed kthread work
kthread: Allow to cancel kthread work
kthread: Allow to modify delayed kthread work
mm/huge_page: Convert khugepaged() into kthread worker API
ring_buffer: Do no not complete benchmark reader too early
ring_buffer: Fix more races when terminating the producer in the
benchmark
ring_buffer: Convert benchmark kthreads into kthread worker API
rcu: Finish folding ->fqs_state into ->gp_state
rcu: Store first_gp_fqs into struct rcu_state
rcu: Clean up timeouts for forcing the quiescent state
rcu: Check actual RCU_GP_FLAG_FQS when handling quiescent state
rcu: Convert RCU gp kthreads into kthread worker API
kthread: Better support freezable kthread workers

include/linux/kthread.h | 67 +++++
kernel/kthread.c | 544 ++++++++++++++++++++++++++++++++---
kernel/rcu/tree.c | 407 ++++++++++++++++----------
kernel/rcu/tree.h | 24 +-
kernel/rcu/tree_plugin.h | 16 +-
kernel/rcu/tree_trace.c | 2 +-
kernel/trace/ring_buffer_benchmark.c | 194 ++++++-------
mm/huge_memory.c | 116 ++++----
8 files changed, 1017 insertions(+), 353 deletions(-)

--
1.8.5.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/