diff mbox series

[19/20] treewide: Introduce kthread_run_worker[_on_cpu]()

Message ID 20240926224910.11106-20-frederic@kernel.org (mailing list archive)
State New
Headers show
Series [1/2] arm64: Keep first mismatched 32bits el0 capable CPU online through its callbacks | expand

Commit Message

Frederic Weisbecker Sept. 26, 2024, 10:49 p.m. UTC
kthread_create() creates a kthread without running it yet. kthread_run()
creates a kthread and runs it.

On the other hand, kthread_create_worker() creates a kthread worker and
runs it.

This difference in behaviours is confusing. Also there is no way to
create a kthread worker and affine it using kthread_bind_mask() or
kthread_affine_preferred() before starting it.

Consolidate the behaviours and introduce kthread_run_worker[_on_cpu]()
that behaves just like kthread_run(). kthread_create_worker[_on_cpu]()
will now only create a kthread worker without starting it.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
 arch/x86/kvm/i8254.c                          |  2 +-
 crypto/crypto_engine.c                        |  2 +-
 drivers/cpufreq/cppc_cpufreq.c                |  2 +-
 drivers/gpu/drm/drm_vblank_work.c             |  2 +-
 .../drm/i915/gem/selftests/i915_gem_context.c |  2 +-
 drivers/gpu/drm/i915/gt/selftest_execlists.c  |  2 +-
 drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |  2 +-
 drivers/gpu/drm/i915/gt/selftest_slpc.c       |  2 +-
 drivers/gpu/drm/i915/selftests/i915_request.c |  8 ++--
 drivers/gpu/drm/msm/disp/msm_disp_snapshot.c  |  2 +-
 drivers/gpu/drm/msm/msm_atomic.c              |  2 +-
 drivers/gpu/drm/msm/msm_gpu.c                 |  2 +-
 drivers/gpu/drm/msm/msm_kms.c                 |  2 +-
 .../platform/chips-media/wave5/wave5-vpu.c    |  2 +-
 drivers/net/dsa/mv88e6xxx/chip.c              |  2 +-
 drivers/net/ethernet/intel/ice/ice_dpll.c     |  2 +-
 drivers/net/ethernet/intel/ice/ice_gnss.c     |  2 +-
 drivers/net/ethernet/intel/ice/ice_ptp.c      |  2 +-
 drivers/platform/chrome/cros_ec_spi.c         |  2 +-
 drivers/ptp/ptp_clock.c                       |  2 +-
 drivers/spi/spi.c                             |  2 +-
 drivers/usb/typec/tcpm/tcpm.c                 |  2 +-
 drivers/vdpa/vdpa_sim/vdpa_sim.c              |  2 +-
 drivers/watchdog/watchdog_dev.c               |  2 +-
 fs/erofs/zdata.c                              |  2 +-
 include/linux/kthread.h                       | 48 ++++++++++++++++---
 kernel/kthread.c                              | 31 +++---------
 kernel/rcu/tree.c                             |  4 +-
 kernel/sched/ext.c                            |  2 +-
 kernel/workqueue.c                            |  2 +-
 net/dsa/tag_ksz.c                             |  2 +-
 net/dsa/tag_ocelot_8021q.c                    |  2 +-
 net/dsa/tag_sja1105.c                         |  2 +-
 33 files changed, 83 insertions(+), 66 deletions(-)

Comments

Paul E. McKenney Sept. 27, 2024, 5:39 a.m. UTC | #1
On Fri, Sep 27, 2024 at 12:49:07AM +0200, Frederic Weisbecker wrote:
> kthread_create() creates a kthread without running it yet. kthread_run()
> creates a kthread and runs it.
> 
> On the other hand, kthread_create_worker() creates a kthread worker and
> runs it.
> 
> This difference in behaviours is confusing. Also there is no way to
> create a kthread worker and affine it using kthread_bind_mask() or
> kthread_affine_preferred() before starting it.
> 
> Consolidate the behaviours and introduce kthread_run_worker[_on_cpu]()
> that behaves just like kthread_run(). kthread_create_worker[_on_cpu]()
> will now only create a kthread worker without starting it.
> 
> Signed-off-by: Frederic Weisbecker <frederic@kernel.org>

For the RCU pieces:

Acked-by: Paul E. McKenney <paulmck@kernel.org>

> ---
>  arch/x86/kvm/i8254.c                          |  2 +-
>  crypto/crypto_engine.c                        |  2 +-
>  drivers/cpufreq/cppc_cpufreq.c                |  2 +-
>  drivers/gpu/drm/drm_vblank_work.c             |  2 +-
>  .../drm/i915/gem/selftests/i915_gem_context.c |  2 +-
>  drivers/gpu/drm/i915/gt/selftest_execlists.c  |  2 +-
>  drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |  2 +-
>  drivers/gpu/drm/i915/gt/selftest_slpc.c       |  2 +-
>  drivers/gpu/drm/i915/selftests/i915_request.c |  8 ++--
>  drivers/gpu/drm/msm/disp/msm_disp_snapshot.c  |  2 +-
>  drivers/gpu/drm/msm/msm_atomic.c              |  2 +-
>  drivers/gpu/drm/msm/msm_gpu.c                 |  2 +-
>  drivers/gpu/drm/msm/msm_kms.c                 |  2 +-
>  .../platform/chips-media/wave5/wave5-vpu.c    |  2 +-
>  drivers/net/dsa/mv88e6xxx/chip.c              |  2 +-
>  drivers/net/ethernet/intel/ice/ice_dpll.c     |  2 +-
>  drivers/net/ethernet/intel/ice/ice_gnss.c     |  2 +-
>  drivers/net/ethernet/intel/ice/ice_ptp.c      |  2 +-
>  drivers/platform/chrome/cros_ec_spi.c         |  2 +-
>  drivers/ptp/ptp_clock.c                       |  2 +-
>  drivers/spi/spi.c                             |  2 +-
>  drivers/usb/typec/tcpm/tcpm.c                 |  2 +-
>  drivers/vdpa/vdpa_sim/vdpa_sim.c              |  2 +-
>  drivers/watchdog/watchdog_dev.c               |  2 +-
>  fs/erofs/zdata.c                              |  2 +-
>  include/linux/kthread.h                       | 48 ++++++++++++++++---
>  kernel/kthread.c                              | 31 +++---------
>  kernel/rcu/tree.c                             |  4 +-
>  kernel/sched/ext.c                            |  2 +-
>  kernel/workqueue.c                            |  2 +-
>  net/dsa/tag_ksz.c                             |  2 +-
>  net/dsa/tag_ocelot_8021q.c                    |  2 +-
>  net/dsa/tag_sja1105.c                         |  2 +-
>  33 files changed, 83 insertions(+), 66 deletions(-)
> 
> diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> index cd57a517d04a..d7ab8780ab9e 100644
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -681,7 +681,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
>  	pid_nr = pid_vnr(pid);
>  	put_pid(pid);
>  
> -	pit->worker = kthread_create_worker(0, "kvm-pit/%d", pid_nr);
> +	pit->worker = kthread_run_worker(0, "kvm-pit/%d", pid_nr);
>  	if (IS_ERR(pit->worker))
>  		goto fail_kthread;
>  
> diff --git a/crypto/crypto_engine.c b/crypto/crypto_engine.c
> index e60a0eb628e8..c7c16da5e649 100644
> --- a/crypto/crypto_engine.c
> +++ b/crypto/crypto_engine.c
> @@ -517,7 +517,7 @@ struct crypto_engine *crypto_engine_alloc_init_and_set(struct device *dev,
>  	crypto_init_queue(&engine->queue, qlen);
>  	spin_lock_init(&engine->queue_lock);
>  
> -	engine->kworker = kthread_create_worker(0, "%s", engine->name);
> +	engine->kworker = kthread_run_worker(0, "%s", engine->name);
>  	if (IS_ERR(engine->kworker)) {
>  		dev_err(dev, "failed to create crypto request pump task\n");
>  		return NULL;
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index 1a5ad184d28f..9b91cba133c9 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -241,7 +241,7 @@ static void __init cppc_freq_invariance_init(void)
>  	if (fie_disabled)
>  		return;
>  
> -	kworker_fie = kthread_create_worker(0, "cppc_fie");
> +	kworker_fie = kthread_run_worker(0, "cppc_fie");
>  	if (IS_ERR(kworker_fie)) {
>  		pr_warn("%s: failed to create kworker_fie: %ld\n", __func__,
>  			PTR_ERR(kworker_fie));
> diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank_work.c
> index 1752ffb44e1d..9cc71120246f 100644
> --- a/drivers/gpu/drm/drm_vblank_work.c
> +++ b/drivers/gpu/drm/drm_vblank_work.c
> @@ -277,7 +277,7 @@ int drm_vblank_worker_init(struct drm_vblank_crtc *vblank)
>  
>  	INIT_LIST_HEAD(&vblank->pending_work);
>  	init_waitqueue_head(&vblank->work_wait_queue);
> -	worker = kthread_create_worker(0, "card%d-crtc%d",
> +	worker = kthread_run_worker(0, "card%d-crtc%d",
>  				       vblank->dev->primary->index,
>  				       vblank->pipe);
>  	if (IS_ERR(worker))
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> index 89d4dc8b60c6..eb0158e43417 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> @@ -369,7 +369,7 @@ static int live_parallel_switch(void *arg)
>  		if (!data[n].ce[0])
>  			continue;
>  
> -		worker = kthread_create_worker(0, "igt/parallel:%s",
> +		worker = kthread_run_worker(0, "igt/parallel:%s",
>  					       data[n].ce[0]->engine->name);
>  		if (IS_ERR(worker)) {
>  			err = PTR_ERR(worker);
> diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c b/drivers/gpu/drm/i915/gt/selftest_execlists.c
> index 222ca7c44951..81c31396eceb 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_execlists.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c
> @@ -3574,7 +3574,7 @@ static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags)
>  			arg[id].batch = NULL;
>  		arg[id].count = 0;
>  
> -		worker[id] = kthread_create_worker(0, "igt/smoke:%d", id);
> +		worker[id] = kthread_run_worker(0, "igt/smoke:%d", id);
>  		if (IS_ERR(worker[id])) {
>  			err = PTR_ERR(worker[id]);
>  			break;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> index 9ce8ff1c04fe..9d3aeb237295 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> @@ -1025,7 +1025,7 @@ static int __igt_reset_engines(struct intel_gt *gt,
>  			threads[tmp].engine = other;
>  			threads[tmp].flags = flags;
>  
> -			worker = kthread_create_worker(0, "igt/%s",
> +			worker = kthread_run_worker(0, "igt/%s",
>  						       other->name);
>  			if (IS_ERR(worker)) {
>  				err = PTR_ERR(worker);
> diff --git a/drivers/gpu/drm/i915/gt/selftest_slpc.c b/drivers/gpu/drm/i915/gt/selftest_slpc.c
> index 4ecc4ae74a54..e218b229681f 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_slpc.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_slpc.c
> @@ -489,7 +489,7 @@ static int live_slpc_tile_interaction(void *arg)
>  		return -ENOMEM;
>  
>  	for_each_gt(gt, i915, i) {
> -		threads[i].worker = kthread_create_worker(0, "igt/slpc_parallel:%d", gt->info.id);
> +		threads[i].worker = kthread_run_worker(0, "igt/slpc_parallel:%d", gt->info.id);
>  
>  		if (IS_ERR(threads[i].worker)) {
>  			ret = PTR_ERR(threads[i].worker);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
> index acae30a04a94..88870844b5bd 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_request.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_request.c
> @@ -492,7 +492,7 @@ static int mock_breadcrumbs_smoketest(void *arg)
>  	for (n = 0; n < ncpus; n++) {
>  		struct kthread_worker *worker;
>  
> -		worker = kthread_create_worker(0, "igt/%d", n);
> +		worker = kthread_run_worker(0, "igt/%d", n);
>  		if (IS_ERR(worker)) {
>  			ret = PTR_ERR(worker);
>  			ncpus = n;
> @@ -1645,7 +1645,7 @@ static int live_parallel_engines(void *arg)
>  		for_each_uabi_engine(engine, i915) {
>  			struct kthread_worker *worker;
>  
> -			worker = kthread_create_worker(0, "igt/parallel:%s",
> +			worker = kthread_run_worker(0, "igt/parallel:%s",
>  						       engine->name);
>  			if (IS_ERR(worker)) {
>  				err = PTR_ERR(worker);
> @@ -1806,7 +1806,7 @@ static int live_breadcrumbs_smoketest(void *arg)
>  			unsigned int i = idx * ncpus + n;
>  			struct kthread_worker *worker;
>  
> -			worker = kthread_create_worker(0, "igt/%d.%d", idx, n);
> +			worker = kthread_run_worker(0, "igt/%d.%d", idx, n);
>  			if (IS_ERR(worker)) {
>  				ret = PTR_ERR(worker);
>  				goto out_flush;
> @@ -3219,7 +3219,7 @@ static int perf_parallel_engines(void *arg)
>  
>  			memset(&engines[idx].p, 0, sizeof(engines[idx].p));
>  
> -			worker = kthread_create_worker(0, "igt:%s",
> +			worker = kthread_run_worker(0, "igt:%s",
>  						       engine->name);
>  			if (IS_ERR(worker)) {
>  				err = PTR_ERR(worker);
> diff --git a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
> index e75b97127c0d..2be00b11e557 100644
> --- a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
> +++ b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
> @@ -109,7 +109,7 @@ int msm_disp_snapshot_init(struct drm_device *drm_dev)
>  
>  	mutex_init(&kms->dump_mutex);
>  
> -	kms->dump_worker = kthread_create_worker(0, "%s", "disp_snapshot");
> +	kms->dump_worker = kthread_run_worker(0, "%s", "disp_snapshot");
>  	if (IS_ERR(kms->dump_worker))
>  		DRM_ERROR("failed to create disp state task\n");
>  
> diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
> index 9c45d641b521..a7a2384044ff 100644
> --- a/drivers/gpu/drm/msm/msm_atomic.c
> +++ b/drivers/gpu/drm/msm/msm_atomic.c
> @@ -115,7 +115,7 @@ int msm_atomic_init_pending_timer(struct msm_pending_timer *timer,
>  	timer->kms = kms;
>  	timer->crtc_idx = crtc_idx;
>  
> -	timer->worker = kthread_create_worker(0, "atomic-worker-%d", crtc_idx);
> +	timer->worker = kthread_run_worker(0, "atomic-worker-%d", crtc_idx);
>  	if (IS_ERR(timer->worker)) {
>  		int ret = PTR_ERR(timer->worker);
>  		timer->worker = NULL;
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index a274b8466423..15f74e9dfc9e 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -859,7 +859,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
>  	gpu->funcs = funcs;
>  	gpu->name = name;
>  
> -	gpu->worker = kthread_create_worker(0, "gpu-worker");
> +	gpu->worker = kthread_run_worker(0, "gpu-worker");
>  	if (IS_ERR(gpu->worker)) {
>  		ret = PTR_ERR(gpu->worker);
>  		gpu->worker = NULL;
> diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c
> index af6a6fcb1173..8db9f3afb8ac 100644
> --- a/drivers/gpu/drm/msm/msm_kms.c
> +++ b/drivers/gpu/drm/msm/msm_kms.c
> @@ -269,7 +269,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
>  		/* initialize event thread */
>  		ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
>  		ev_thread->dev = ddev;
> -		ev_thread->worker = kthread_create_worker(0, "crtc_event:%d", crtc->base.id);
> +		ev_thread->worker = kthread_run_worker(0, "crtc_event:%d", crtc->base.id);
>  		if (IS_ERR(ev_thread->worker)) {
>  			ret = PTR_ERR(ev_thread->worker);
>  			DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
> diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> index 7273254ecb03..c49f5ed461cf 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> @@ -231,7 +231,7 @@ static int wave5_vpu_probe(struct platform_device *pdev)
>  		dev_err(&pdev->dev, "failed to get irq resource, falling back to polling\n");
>  		hrtimer_init(&dev->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
>  		dev->hrtimer.function = &wave5_vpu_timer_callback;
> -		dev->worker = kthread_create_worker(0, "vpu_irq_thread");
> +		dev->worker = kthread_run_worker(0, "vpu_irq_thread");
>  		if (IS_ERR(dev->worker)) {
>  			dev_err(&pdev->dev, "failed to create vpu irq worker\n");
>  			ret = PTR_ERR(dev->worker);
> diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
> index 5b4e2ce5470d..a5908e2ff2cf 100644
> --- a/drivers/net/dsa/mv88e6xxx/chip.c
> +++ b/drivers/net/dsa/mv88e6xxx/chip.c
> @@ -393,7 +393,7 @@ static int mv88e6xxx_irq_poll_setup(struct mv88e6xxx_chip *chip)
>  	kthread_init_delayed_work(&chip->irq_poll_work,
>  				  mv88e6xxx_irq_poll);
>  
> -	chip->kworker = kthread_create_worker(0, "%s", dev_name(chip->dev));
> +	chip->kworker = kthread_run_worker(0, "%s", dev_name(chip->dev));
>  	if (IS_ERR(chip->kworker))
>  		return PTR_ERR(chip->kworker);
>  
> diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c
> index cd95705d1e7f..1f11a24387f3 100644
> --- a/drivers/net/ethernet/intel/ice/ice_dpll.c
> +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
> @@ -2050,7 +2050,7 @@ static int ice_dpll_init_worker(struct ice_pf *pf)
>  	struct kthread_worker *kworker;
>  
>  	kthread_init_delayed_work(&d->work, ice_dpll_periodic_work);
> -	kworker = kthread_create_worker(0, "ice-dplls-%s",
> +	kworker = kthread_run_worker(0, "ice-dplls-%s",
>  					dev_name(ice_pf_to_dev(pf)));
>  	if (IS_ERR(kworker))
>  		return PTR_ERR(kworker);
> diff --git a/drivers/net/ethernet/intel/ice/ice_gnss.c b/drivers/net/ethernet/intel/ice/ice_gnss.c
> index c8ea1af51ad3..fcd1f808b696 100644
> --- a/drivers/net/ethernet/intel/ice/ice_gnss.c
> +++ b/drivers/net/ethernet/intel/ice/ice_gnss.c
> @@ -182,7 +182,7 @@ static struct gnss_serial *ice_gnss_struct_init(struct ice_pf *pf)
>  	pf->gnss_serial = gnss;
>  
>  	kthread_init_delayed_work(&gnss->read_work, ice_gnss_read);
> -	kworker = kthread_create_worker(0, "ice-gnss-%s", dev_name(dev));
> +	kworker = kthread_run_worker(0, "ice-gnss-%s", dev_name(dev));
>  	if (IS_ERR(kworker)) {
>  		kfree(gnss);
>  		return NULL;
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index ef2e858f49bb..cd7da48bdf91 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -3185,7 +3185,7 @@ static int ice_ptp_init_work(struct ice_pf *pf, struct ice_ptp *ptp)
>  	/* Allocate a kworker for handling work required for the ports
>  	 * connected to the PTP hardware clock.
>  	 */
> -	kworker = kthread_create_worker(0, "ice-ptp-%s",
> +	kworker = kthread_run_worker(0, "ice-ptp-%s",
>  					dev_name(ice_pf_to_dev(pf)));
>  	if (IS_ERR(kworker))
>  		return PTR_ERR(kworker);
> diff --git a/drivers/platform/chrome/cros_ec_spi.c b/drivers/platform/chrome/cros_ec_spi.c
> index 86a3d32a7763..08f566cc1480 100644
> --- a/drivers/platform/chrome/cros_ec_spi.c
> +++ b/drivers/platform/chrome/cros_ec_spi.c
> @@ -715,7 +715,7 @@ static int cros_ec_spi_devm_high_pri_alloc(struct device *dev,
>  	int err;
>  
>  	ec_spi->high_pri_worker =
> -		kthread_create_worker(0, "cros_ec_spi_high_pri");
> +		kthread_run_worker(0, "cros_ec_spi_high_pri");
>  
>  	if (IS_ERR(ec_spi->high_pri_worker)) {
>  		err = PTR_ERR(ec_spi->high_pri_worker);
> diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
> index c56cd0f63909..89a4420972e7 100644
> --- a/drivers/ptp/ptp_clock.c
> +++ b/drivers/ptp/ptp_clock.c
> @@ -295,7 +295,7 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
>  
>  	if (ptp->info->do_aux_work) {
>  		kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker);
> -		ptp->kworker = kthread_create_worker(0, "ptp%d", ptp->index);
> +		ptp->kworker = kthread_run_worker(0, "ptp%d", ptp->index);
>  		if (IS_ERR(ptp->kworker)) {
>  			err = PTR_ERR(ptp->kworker);
>  			pr_err("failed to create ptp aux_worker %d\n", err);
> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index c1dad30a4528..f2f4b6ee25d4 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -2053,7 +2053,7 @@ static int spi_init_queue(struct spi_controller *ctlr)
>  	ctlr->busy = false;
>  	ctlr->queue_empty = true;
>  
> -	ctlr->kworker = kthread_create_worker(0, dev_name(&ctlr->dev));
> +	ctlr->kworker = kthread_run_worker(0, dev_name(&ctlr->dev));
>  	if (IS_ERR(ctlr->kworker)) {
>  		dev_err(&ctlr->dev, "failed to create message pump kworker\n");
>  		return PTR_ERR(ctlr->kworker);
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index fc619478200f..66ae934ad196 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -7577,7 +7577,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
>  	mutex_init(&port->lock);
>  	mutex_init(&port->swap_lock);
>  
> -	port->wq = kthread_create_worker(0, dev_name(dev));
> +	port->wq = kthread_run_worker(0, dev_name(dev));
>  	if (IS_ERR(port->wq))
>  		return ERR_CAST(port->wq);
>  	sched_set_fifo(port->wq->task);
> diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c
> index 8ffea8430f95..c204fc8e471a 100644
> --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
> +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
> @@ -229,7 +229,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr,
>  	dev = &vdpasim->vdpa.dev;
>  
>  	kthread_init_work(&vdpasim->work, vdpasim_work_fn);
> -	vdpasim->worker = kthread_create_worker(0, "vDPA sim worker: %s",
> +	vdpasim->worker = kthread_run_worker(0, "vDPA sim worker: %s",
>  						dev_attr->name);
>  	if (IS_ERR(vdpasim->worker))
>  		goto err_iommu;
> diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
> index 4190cb800cc4..19698d87dc57 100644
> --- a/drivers/watchdog/watchdog_dev.c
> +++ b/drivers/watchdog/watchdog_dev.c
> @@ -1229,7 +1229,7 @@ int __init watchdog_dev_init(void)
>  {
>  	int err;
>  
> -	watchdog_kworker = kthread_create_worker(0, "watchdogd");
> +	watchdog_kworker = kthread_run_worker(0, "watchdogd");
>  	if (IS_ERR(watchdog_kworker)) {
>  		pr_err("Failed to create watchdog kworker\n");
>  		return PTR_ERR(watchdog_kworker);
> diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
> index 050aaa016ec8..bf6b4d8cb283 100644
> --- a/fs/erofs/zdata.c
> +++ b/fs/erofs/zdata.c
> @@ -318,7 +318,7 @@ static void erofs_destroy_percpu_workers(void)
>  static struct kthread_worker *erofs_init_percpu_worker(int cpu)
>  {
>  	struct kthread_worker *worker =
> -		kthread_create_worker_on_cpu(cpu, 0, "erofs_worker/%u");
> +		kthread_run_worker_on_cpu(cpu, 0, "erofs_worker/%u");
>  
>  	if (IS_ERR(worker))
>  		return worker;
> diff --git a/include/linux/kthread.h b/include/linux/kthread.h
> index 0c66e7c1092a..8d27403888ce 100644
> --- a/include/linux/kthread.h
> +++ b/include/linux/kthread.h
> @@ -193,19 +193,53 @@ struct kthread_worker *kthread_create_worker_on_node(unsigned int flags,
>  						     const char namefmt[], ...);
>  
>  #define kthread_create_worker(flags, namefmt, ...) \
> -({									   \
> -	struct kthread_worker *__kw					   \
> -		= kthread_create_worker_on_node(flags, NUMA_NO_NODE,	   \
> -						namefmt, ## __VA_ARGS__);  \
> -	if (!IS_ERR(__kw))						   \
> -		wake_up_process(__kw->task);				   \
> -	__kw;								   \
> +	kthread_create_worker_on_node(flags, NUMA_NO_NODE, namefmt, ## __VA_ARGS__);
> +
> +/**
> + * kthread_run_worker - create and wake a kthread worker.
> + * @flags: flags modifying the default behavior of the worker
> + * @namefmt: printf-style name for the thread.
> + *
> + * Description: Convenient wrapper for kthread_create_worker() followed by
> + * wake_up_process().  Returns the kthread_worker or ERR_PTR(-ENOMEM).
> + */
> +#define kthread_run_worker(flags, namefmt, ...)					\
> +({										\
> +	struct kthread_worker *__kw						\
> +		= kthread_create_worker(flags, namefmt, ## __VA_ARGS__);	\
> +	if (!IS_ERR(__kw))							\
> +		wake_up_process(__kw->task);					\
> +	__kw;									\
>  })
>  
>  struct kthread_worker *
>  kthread_create_worker_on_cpu(int cpu, unsigned int flags,
>  			     const char namefmt[]);
>  
> +/**
> + * kthread_run_worker_on_cpu - create and wake a cpu bound kthread worker.
> + * @cpu: CPU number
> + * @flags: flags modifying the default behavior of the worker
> + * @namefmt: printf-style name for the thread. Format is restricted
> + *	     to "name.*%u". Code fills in cpu number.
> + *
> + * Description: Convenient wrapper for kthread_create_worker_on_cpu()
> + * followed by wake_up_process().  Returns the kthread_worker or
> + * ERR_PTR(-ENOMEM).
> + */
> +static inline struct kthread_worker *
> +kthread_run_worker_on_cpu(int cpu, unsigned int flags,
> +			  const char namefmt[])
> +{
> +	struct kthread_worker *kw;
> +
> +	kw = kthread_create_worker_on_cpu(cpu, flags, namefmt);
> +	if (!IS_ERR(kw))
> +		wake_up_process(kw->task);
> +
> +	return kw;
> +}
> +
>  bool kthread_queue_work(struct kthread_worker *worker,
>  			struct kthread_work *work);
>  
> diff --git a/kernel/kthread.c b/kernel/kthread.c
> index 7eb93c248c59..d9fee08e9a66 100644
> --- a/kernel/kthread.c
> +++ b/kernel/kthread.c
> @@ -1075,33 +1075,10 @@ kthread_create_worker_on_node(unsigned int flags, int node, const char namefmt[]
>  	worker = __kthread_create_worker_on_node(flags, node, namefmt, args);
>  	va_end(args);
>  
> -	if (worker)
> -		wake_up_process(worker->task);
> -
>  	return worker;
>  }
>  EXPORT_SYMBOL(kthread_create_worker_on_node);
>  
> -static __printf(3, 4) struct kthread_worker *
> -__kthread_create_worker_on_cpu(int cpu, unsigned int flags,
> -			       const char namefmt[], ...)
> -{
> -	struct kthread_worker *worker;
> -	va_list args;
> -
> -	va_start(args, namefmt);
> -	worker = __kthread_create_worker_on_node(flags, cpu_to_node(cpu),
> -						 namefmt, args);
> -	va_end(args);
> -
> -	if (worker) {
> -		kthread_bind(worker->task, cpu);
> -		wake_up_process(worker->task);
> -	}
> -
> -	return worker;
> -}
> -
>  /**
>   * kthread_create_worker_on_cpu - create a kthread worker and bind it
>   *	to a given CPU and the associated NUMA node.
> @@ -1142,7 +1119,13 @@ struct kthread_worker *
>  kthread_create_worker_on_cpu(int cpu, unsigned int flags,
>  			     const char namefmt[])
>  {
> -	return __kthread_create_worker_on_cpu(cpu, flags, namefmt, cpu);
> +	struct kthread_worker *worker;
> +
> +	worker = kthread_create_worker_on_node(flags, cpu_to_node(cpu), namefmt, cpu);
> +	if (worker)
> +		kthread_bind(worker->task, cpu);
> +
> +	return worker;
>  }
>  EXPORT_SYMBOL(kthread_create_worker_on_cpu);
>  
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index c1e9f0818d51..a44228b0949a 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -4902,7 +4902,7 @@ static void rcu_spawn_exp_par_gp_kworker(struct rcu_node *rnp)
>  	if (rnp->exp_kworker)
>  		return;
>  
> -	kworker = kthread_create_worker(0, name, rnp_index);
> +	kworker = kthread_run_worker(0, name, rnp_index);
>  	if (IS_ERR_OR_NULL(kworker)) {
>  		pr_err("Failed to create par gp kworker on %d/%d\n",
>  		       rnp->grplo, rnp->grphi);
> @@ -4929,7 +4929,7 @@ static void __init rcu_start_exp_gp_kworker(void)
>  	const char *name = "rcu_exp_gp_kthread_worker";
>  	struct sched_param param = { .sched_priority = kthread_prio };
>  
> -	rcu_exp_gp_kworker = kthread_create_worker(0, name);
> +	rcu_exp_gp_kworker = kthread_run_worker(0, name);
>  	if (IS_ERR_OR_NULL(rcu_exp_gp_kworker)) {
>  		pr_err("Failed to create %s!\n", name);
>  		rcu_exp_gp_kworker = NULL;
> diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
> index c09e3dc38c34..4835fa4d9326 100644
> --- a/kernel/sched/ext.c
> +++ b/kernel/sched/ext.c
> @@ -4885,7 +4885,7 @@ static struct kthread_worker *scx_create_rt_helper(const char *name)
>  {
>  	struct kthread_worker *helper;
>  
> -	helper = kthread_create_worker(0, name);
> +	helper = kthread_run_worker(0, name);
>  	if (helper)
>  		sched_set_fifo(helper->task);
>  	return helper;
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index 9949ffad8df0..f5c7447ae1de 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -7814,7 +7814,7 @@ static void __init wq_cpu_intensive_thresh_init(void)
>  	unsigned long thresh;
>  	unsigned long bogo;
>  
> -	pwq_release_worker = kthread_create_worker(0, "pool_workqueue_release");
> +	pwq_release_worker = kthread_run_worker(0, "pool_workqueue_release");
>  	BUG_ON(IS_ERR(pwq_release_worker));
>  
>  	/* if the user set it to a specific value, keep it */
> diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c
> index 281bbac5539d..c33d4bf17929 100644
> --- a/net/dsa/tag_ksz.c
> +++ b/net/dsa/tag_ksz.c
> @@ -66,7 +66,7 @@ static int ksz_connect(struct dsa_switch *ds)
>  	if (!priv)
>  		return -ENOMEM;
>  
> -	xmit_worker = kthread_create_worker(0, "dsa%d:%d_xmit",
> +	xmit_worker = kthread_run_worker(0, "dsa%d:%d_xmit",
>  					    ds->dst->index, ds->index);
>  	if (IS_ERR(xmit_worker)) {
>  		ret = PTR_ERR(xmit_worker);
> diff --git a/net/dsa/tag_ocelot_8021q.c b/net/dsa/tag_ocelot_8021q.c
> index 8e8b1bef6af6..6ce0bc166792 100644
> --- a/net/dsa/tag_ocelot_8021q.c
> +++ b/net/dsa/tag_ocelot_8021q.c
> @@ -110,7 +110,7 @@ static int ocelot_connect(struct dsa_switch *ds)
>  	if (!priv)
>  		return -ENOMEM;
>  
> -	priv->xmit_worker = kthread_create_worker(0, "felix_xmit");
> +	priv->xmit_worker = kthread_run_worker(0, "felix_xmit");
>  	if (IS_ERR(priv->xmit_worker)) {
>  		err = PTR_ERR(priv->xmit_worker);
>  		kfree(priv);
> diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c
> index 3e902af7eea6..02adec693811 100644
> --- a/net/dsa/tag_sja1105.c
> +++ b/net/dsa/tag_sja1105.c
> @@ -707,7 +707,7 @@ static int sja1105_connect(struct dsa_switch *ds)
>  
>  	spin_lock_init(&priv->meta_lock);
>  
> -	xmit_worker = kthread_create_worker(0, "dsa%d:%d_xmit",
> +	xmit_worker = kthread_run_worker(0, "dsa%d:%d_xmit",
>  					    ds->dst->index, ds->index);
>  	if (IS_ERR(xmit_worker)) {
>  		err = PTR_ERR(xmit_worker);
> -- 
> 2.46.0
>
diff mbox series

Patch

diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index cd57a517d04a..d7ab8780ab9e 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -681,7 +681,7 @@  struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
 	pid_nr = pid_vnr(pid);
 	put_pid(pid);
 
-	pit->worker = kthread_create_worker(0, "kvm-pit/%d", pid_nr);
+	pit->worker = kthread_run_worker(0, "kvm-pit/%d", pid_nr);
 	if (IS_ERR(pit->worker))
 		goto fail_kthread;
 
diff --git a/crypto/crypto_engine.c b/crypto/crypto_engine.c
index e60a0eb628e8..c7c16da5e649 100644
--- a/crypto/crypto_engine.c
+++ b/crypto/crypto_engine.c
@@ -517,7 +517,7 @@  struct crypto_engine *crypto_engine_alloc_init_and_set(struct device *dev,
 	crypto_init_queue(&engine->queue, qlen);
 	spin_lock_init(&engine->queue_lock);
 
-	engine->kworker = kthread_create_worker(0, "%s", engine->name);
+	engine->kworker = kthread_run_worker(0, "%s", engine->name);
 	if (IS_ERR(engine->kworker)) {
 		dev_err(dev, "failed to create crypto request pump task\n");
 		return NULL;
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index 1a5ad184d28f..9b91cba133c9 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -241,7 +241,7 @@  static void __init cppc_freq_invariance_init(void)
 	if (fie_disabled)
 		return;
 
-	kworker_fie = kthread_create_worker(0, "cppc_fie");
+	kworker_fie = kthread_run_worker(0, "cppc_fie");
 	if (IS_ERR(kworker_fie)) {
 		pr_warn("%s: failed to create kworker_fie: %ld\n", __func__,
 			PTR_ERR(kworker_fie));
diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank_work.c
index 1752ffb44e1d..9cc71120246f 100644
--- a/drivers/gpu/drm/drm_vblank_work.c
+++ b/drivers/gpu/drm/drm_vblank_work.c
@@ -277,7 +277,7 @@  int drm_vblank_worker_init(struct drm_vblank_crtc *vblank)
 
 	INIT_LIST_HEAD(&vblank->pending_work);
 	init_waitqueue_head(&vblank->work_wait_queue);
-	worker = kthread_create_worker(0, "card%d-crtc%d",
+	worker = kthread_run_worker(0, "card%d-crtc%d",
 				       vblank->dev->primary->index,
 				       vblank->pipe);
 	if (IS_ERR(worker))
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 89d4dc8b60c6..eb0158e43417 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -369,7 +369,7 @@  static int live_parallel_switch(void *arg)
 		if (!data[n].ce[0])
 			continue;
 
-		worker = kthread_create_worker(0, "igt/parallel:%s",
+		worker = kthread_run_worker(0, "igt/parallel:%s",
 					       data[n].ce[0]->engine->name);
 		if (IS_ERR(worker)) {
 			err = PTR_ERR(worker);
diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c b/drivers/gpu/drm/i915/gt/selftest_execlists.c
index 222ca7c44951..81c31396eceb 100644
--- a/drivers/gpu/drm/i915/gt/selftest_execlists.c
+++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c
@@ -3574,7 +3574,7 @@  static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags)
 			arg[id].batch = NULL;
 		arg[id].count = 0;
 
-		worker[id] = kthread_create_worker(0, "igt/smoke:%d", id);
+		worker[id] = kthread_run_worker(0, "igt/smoke:%d", id);
 		if (IS_ERR(worker[id])) {
 			err = PTR_ERR(worker[id]);
 			break;
diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
index 9ce8ff1c04fe..9d3aeb237295 100644
--- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
+++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
@@ -1025,7 +1025,7 @@  static int __igt_reset_engines(struct intel_gt *gt,
 			threads[tmp].engine = other;
 			threads[tmp].flags = flags;
 
-			worker = kthread_create_worker(0, "igt/%s",
+			worker = kthread_run_worker(0, "igt/%s",
 						       other->name);
 			if (IS_ERR(worker)) {
 				err = PTR_ERR(worker);
diff --git a/drivers/gpu/drm/i915/gt/selftest_slpc.c b/drivers/gpu/drm/i915/gt/selftest_slpc.c
index 4ecc4ae74a54..e218b229681f 100644
--- a/drivers/gpu/drm/i915/gt/selftest_slpc.c
+++ b/drivers/gpu/drm/i915/gt/selftest_slpc.c
@@ -489,7 +489,7 @@  static int live_slpc_tile_interaction(void *arg)
 		return -ENOMEM;
 
 	for_each_gt(gt, i915, i) {
-		threads[i].worker = kthread_create_worker(0, "igt/slpc_parallel:%d", gt->info.id);
+		threads[i].worker = kthread_run_worker(0, "igt/slpc_parallel:%d", gt->info.id);
 
 		if (IS_ERR(threads[i].worker)) {
 			ret = PTR_ERR(threads[i].worker);
diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
index acae30a04a94..88870844b5bd 100644
--- a/drivers/gpu/drm/i915/selftests/i915_request.c
+++ b/drivers/gpu/drm/i915/selftests/i915_request.c
@@ -492,7 +492,7 @@  static int mock_breadcrumbs_smoketest(void *arg)
 	for (n = 0; n < ncpus; n++) {
 		struct kthread_worker *worker;
 
-		worker = kthread_create_worker(0, "igt/%d", n);
+		worker = kthread_run_worker(0, "igt/%d", n);
 		if (IS_ERR(worker)) {
 			ret = PTR_ERR(worker);
 			ncpus = n;
@@ -1645,7 +1645,7 @@  static int live_parallel_engines(void *arg)
 		for_each_uabi_engine(engine, i915) {
 			struct kthread_worker *worker;
 
-			worker = kthread_create_worker(0, "igt/parallel:%s",
+			worker = kthread_run_worker(0, "igt/parallel:%s",
 						       engine->name);
 			if (IS_ERR(worker)) {
 				err = PTR_ERR(worker);
@@ -1806,7 +1806,7 @@  static int live_breadcrumbs_smoketest(void *arg)
 			unsigned int i = idx * ncpus + n;
 			struct kthread_worker *worker;
 
-			worker = kthread_create_worker(0, "igt/%d.%d", idx, n);
+			worker = kthread_run_worker(0, "igt/%d.%d", idx, n);
 			if (IS_ERR(worker)) {
 				ret = PTR_ERR(worker);
 				goto out_flush;
@@ -3219,7 +3219,7 @@  static int perf_parallel_engines(void *arg)
 
 			memset(&engines[idx].p, 0, sizeof(engines[idx].p));
 
-			worker = kthread_create_worker(0, "igt:%s",
+			worker = kthread_run_worker(0, "igt:%s",
 						       engine->name);
 			if (IS_ERR(worker)) {
 				err = PTR_ERR(worker);
diff --git a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
index e75b97127c0d..2be00b11e557 100644
--- a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
+++ b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
@@ -109,7 +109,7 @@  int msm_disp_snapshot_init(struct drm_device *drm_dev)
 
 	mutex_init(&kms->dump_mutex);
 
-	kms->dump_worker = kthread_create_worker(0, "%s", "disp_snapshot");
+	kms->dump_worker = kthread_run_worker(0, "%s", "disp_snapshot");
 	if (IS_ERR(kms->dump_worker))
 		DRM_ERROR("failed to create disp state task\n");
 
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c
index 9c45d641b521..a7a2384044ff 100644
--- a/drivers/gpu/drm/msm/msm_atomic.c
+++ b/drivers/gpu/drm/msm/msm_atomic.c
@@ -115,7 +115,7 @@  int msm_atomic_init_pending_timer(struct msm_pending_timer *timer,
 	timer->kms = kms;
 	timer->crtc_idx = crtc_idx;
 
-	timer->worker = kthread_create_worker(0, "atomic-worker-%d", crtc_idx);
+	timer->worker = kthread_run_worker(0, "atomic-worker-%d", crtc_idx);
 	if (IS_ERR(timer->worker)) {
 		int ret = PTR_ERR(timer->worker);
 		timer->worker = NULL;
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index a274b8466423..15f74e9dfc9e 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -859,7 +859,7 @@  int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
 	gpu->funcs = funcs;
 	gpu->name = name;
 
-	gpu->worker = kthread_create_worker(0, "gpu-worker");
+	gpu->worker = kthread_run_worker(0, "gpu-worker");
 	if (IS_ERR(gpu->worker)) {
 		ret = PTR_ERR(gpu->worker);
 		gpu->worker = NULL;
diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c
index af6a6fcb1173..8db9f3afb8ac 100644
--- a/drivers/gpu/drm/msm/msm_kms.c
+++ b/drivers/gpu/drm/msm/msm_kms.c
@@ -269,7 +269,7 @@  int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
 		/* initialize event thread */
 		ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
 		ev_thread->dev = ddev;
-		ev_thread->worker = kthread_create_worker(0, "crtc_event:%d", crtc->base.id);
+		ev_thread->worker = kthread_run_worker(0, "crtc_event:%d", crtc->base.id);
 		if (IS_ERR(ev_thread->worker)) {
 			ret = PTR_ERR(ev_thread->worker);
 			DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
index 7273254ecb03..c49f5ed461cf 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
@@ -231,7 +231,7 @@  static int wave5_vpu_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "failed to get irq resource, falling back to polling\n");
 		hrtimer_init(&dev->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
 		dev->hrtimer.function = &wave5_vpu_timer_callback;
-		dev->worker = kthread_create_worker(0, "vpu_irq_thread");
+		dev->worker = kthread_run_worker(0, "vpu_irq_thread");
 		if (IS_ERR(dev->worker)) {
 			dev_err(&pdev->dev, "failed to create vpu irq worker\n");
 			ret = PTR_ERR(dev->worker);
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 5b4e2ce5470d..a5908e2ff2cf 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -393,7 +393,7 @@  static int mv88e6xxx_irq_poll_setup(struct mv88e6xxx_chip *chip)
 	kthread_init_delayed_work(&chip->irq_poll_work,
 				  mv88e6xxx_irq_poll);
 
-	chip->kworker = kthread_create_worker(0, "%s", dev_name(chip->dev));
+	chip->kworker = kthread_run_worker(0, "%s", dev_name(chip->dev));
 	if (IS_ERR(chip->kworker))
 		return PTR_ERR(chip->kworker);
 
diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c
index cd95705d1e7f..1f11a24387f3 100644
--- a/drivers/net/ethernet/intel/ice/ice_dpll.c
+++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
@@ -2050,7 +2050,7 @@  static int ice_dpll_init_worker(struct ice_pf *pf)
 	struct kthread_worker *kworker;
 
 	kthread_init_delayed_work(&d->work, ice_dpll_periodic_work);
-	kworker = kthread_create_worker(0, "ice-dplls-%s",
+	kworker = kthread_run_worker(0, "ice-dplls-%s",
 					dev_name(ice_pf_to_dev(pf)));
 	if (IS_ERR(kworker))
 		return PTR_ERR(kworker);
diff --git a/drivers/net/ethernet/intel/ice/ice_gnss.c b/drivers/net/ethernet/intel/ice/ice_gnss.c
index c8ea1af51ad3..fcd1f808b696 100644
--- a/drivers/net/ethernet/intel/ice/ice_gnss.c
+++ b/drivers/net/ethernet/intel/ice/ice_gnss.c
@@ -182,7 +182,7 @@  static struct gnss_serial *ice_gnss_struct_init(struct ice_pf *pf)
 	pf->gnss_serial = gnss;
 
 	kthread_init_delayed_work(&gnss->read_work, ice_gnss_read);
-	kworker = kthread_create_worker(0, "ice-gnss-%s", dev_name(dev));
+	kworker = kthread_run_worker(0, "ice-gnss-%s", dev_name(dev));
 	if (IS_ERR(kworker)) {
 		kfree(gnss);
 		return NULL;
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index ef2e858f49bb..cd7da48bdf91 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -3185,7 +3185,7 @@  static int ice_ptp_init_work(struct ice_pf *pf, struct ice_ptp *ptp)
 	/* Allocate a kworker for handling work required for the ports
 	 * connected to the PTP hardware clock.
 	 */
-	kworker = kthread_create_worker(0, "ice-ptp-%s",
+	kworker = kthread_run_worker(0, "ice-ptp-%s",
 					dev_name(ice_pf_to_dev(pf)));
 	if (IS_ERR(kworker))
 		return PTR_ERR(kworker);
diff --git a/drivers/platform/chrome/cros_ec_spi.c b/drivers/platform/chrome/cros_ec_spi.c
index 86a3d32a7763..08f566cc1480 100644
--- a/drivers/platform/chrome/cros_ec_spi.c
+++ b/drivers/platform/chrome/cros_ec_spi.c
@@ -715,7 +715,7 @@  static int cros_ec_spi_devm_high_pri_alloc(struct device *dev,
 	int err;
 
 	ec_spi->high_pri_worker =
-		kthread_create_worker(0, "cros_ec_spi_high_pri");
+		kthread_run_worker(0, "cros_ec_spi_high_pri");
 
 	if (IS_ERR(ec_spi->high_pri_worker)) {
 		err = PTR_ERR(ec_spi->high_pri_worker);
diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
index c56cd0f63909..89a4420972e7 100644
--- a/drivers/ptp/ptp_clock.c
+++ b/drivers/ptp/ptp_clock.c
@@ -295,7 +295,7 @@  struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
 
 	if (ptp->info->do_aux_work) {
 		kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker);
-		ptp->kworker = kthread_create_worker(0, "ptp%d", ptp->index);
+		ptp->kworker = kthread_run_worker(0, "ptp%d", ptp->index);
 		if (IS_ERR(ptp->kworker)) {
 			err = PTR_ERR(ptp->kworker);
 			pr_err("failed to create ptp aux_worker %d\n", err);
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index c1dad30a4528..f2f4b6ee25d4 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2053,7 +2053,7 @@  static int spi_init_queue(struct spi_controller *ctlr)
 	ctlr->busy = false;
 	ctlr->queue_empty = true;
 
-	ctlr->kworker = kthread_create_worker(0, dev_name(&ctlr->dev));
+	ctlr->kworker = kthread_run_worker(0, dev_name(&ctlr->dev));
 	if (IS_ERR(ctlr->kworker)) {
 		dev_err(&ctlr->dev, "failed to create message pump kworker\n");
 		return PTR_ERR(ctlr->kworker);
diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index fc619478200f..66ae934ad196 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -7577,7 +7577,7 @@  struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	mutex_init(&port->lock);
 	mutex_init(&port->swap_lock);
 
-	port->wq = kthread_create_worker(0, dev_name(dev));
+	port->wq = kthread_run_worker(0, dev_name(dev));
 	if (IS_ERR(port->wq))
 		return ERR_CAST(port->wq);
 	sched_set_fifo(port->wq->task);
diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c
index 8ffea8430f95..c204fc8e471a 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
@@ -229,7 +229,7 @@  struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr,
 	dev = &vdpasim->vdpa.dev;
 
 	kthread_init_work(&vdpasim->work, vdpasim_work_fn);
-	vdpasim->worker = kthread_create_worker(0, "vDPA sim worker: %s",
+	vdpasim->worker = kthread_run_worker(0, "vDPA sim worker: %s",
 						dev_attr->name);
 	if (IS_ERR(vdpasim->worker))
 		goto err_iommu;
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index 4190cb800cc4..19698d87dc57 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -1229,7 +1229,7 @@  int __init watchdog_dev_init(void)
 {
 	int err;
 
-	watchdog_kworker = kthread_create_worker(0, "watchdogd");
+	watchdog_kworker = kthread_run_worker(0, "watchdogd");
 	if (IS_ERR(watchdog_kworker)) {
 		pr_err("Failed to create watchdog kworker\n");
 		return PTR_ERR(watchdog_kworker);
diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 050aaa016ec8..bf6b4d8cb283 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -318,7 +318,7 @@  static void erofs_destroy_percpu_workers(void)
 static struct kthread_worker *erofs_init_percpu_worker(int cpu)
 {
 	struct kthread_worker *worker =
-		kthread_create_worker_on_cpu(cpu, 0, "erofs_worker/%u");
+		kthread_run_worker_on_cpu(cpu, 0, "erofs_worker/%u");
 
 	if (IS_ERR(worker))
 		return worker;
diff --git a/include/linux/kthread.h b/include/linux/kthread.h
index 0c66e7c1092a..8d27403888ce 100644
--- a/include/linux/kthread.h
+++ b/include/linux/kthread.h
@@ -193,19 +193,53 @@  struct kthread_worker *kthread_create_worker_on_node(unsigned int flags,
 						     const char namefmt[], ...);
 
 #define kthread_create_worker(flags, namefmt, ...) \
-({									   \
-	struct kthread_worker *__kw					   \
-		= kthread_create_worker_on_node(flags, NUMA_NO_NODE,	   \
-						namefmt, ## __VA_ARGS__);  \
-	if (!IS_ERR(__kw))						   \
-		wake_up_process(__kw->task);				   \
-	__kw;								   \
+	kthread_create_worker_on_node(flags, NUMA_NO_NODE, namefmt, ## __VA_ARGS__);
+
+/**
+ * kthread_run_worker - create and wake a kthread worker.
+ * @flags: flags modifying the default behavior of the worker
+ * @namefmt: printf-style name for the thread.
+ *
+ * Description: Convenient wrapper for kthread_create_worker() followed by
+ * wake_up_process().  Returns the kthread_worker or ERR_PTR(-ENOMEM).
+ */
+#define kthread_run_worker(flags, namefmt, ...)					\
+({										\
+	struct kthread_worker *__kw						\
+		= kthread_create_worker(flags, namefmt, ## __VA_ARGS__);	\
+	if (!IS_ERR(__kw))							\
+		wake_up_process(__kw->task);					\
+	__kw;									\
 })
 
 struct kthread_worker *
 kthread_create_worker_on_cpu(int cpu, unsigned int flags,
 			     const char namefmt[]);
 
+/**
+ * kthread_run_worker_on_cpu - create and wake a cpu bound kthread worker.
+ * @cpu: CPU number
+ * @flags: flags modifying the default behavior of the worker
+ * @namefmt: printf-style name for the thread. Format is restricted
+ *	     to "name.*%u". Code fills in cpu number.
+ *
+ * Description: Convenient wrapper for kthread_create_worker_on_cpu()
+ * followed by wake_up_process().  Returns the kthread_worker or
+ * ERR_PTR(-ENOMEM).
+ */
+static inline struct kthread_worker *
+kthread_run_worker_on_cpu(int cpu, unsigned int flags,
+			  const char namefmt[])
+{
+	struct kthread_worker *kw;
+
+	kw = kthread_create_worker_on_cpu(cpu, flags, namefmt);
+	if (!IS_ERR(kw))
+		wake_up_process(kw->task);
+
+	return kw;
+}
+
 bool kthread_queue_work(struct kthread_worker *worker,
 			struct kthread_work *work);
 
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 7eb93c248c59..d9fee08e9a66 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -1075,33 +1075,10 @@  kthread_create_worker_on_node(unsigned int flags, int node, const char namefmt[]
 	worker = __kthread_create_worker_on_node(flags, node, namefmt, args);
 	va_end(args);
 
-	if (worker)
-		wake_up_process(worker->task);
-
 	return worker;
 }
 EXPORT_SYMBOL(kthread_create_worker_on_node);
 
-static __printf(3, 4) struct kthread_worker *
-__kthread_create_worker_on_cpu(int cpu, unsigned int flags,
-			       const char namefmt[], ...)
-{
-	struct kthread_worker *worker;
-	va_list args;
-
-	va_start(args, namefmt);
-	worker = __kthread_create_worker_on_node(flags, cpu_to_node(cpu),
-						 namefmt, args);
-	va_end(args);
-
-	if (worker) {
-		kthread_bind(worker->task, cpu);
-		wake_up_process(worker->task);
-	}
-
-	return worker;
-}
-
 /**
  * kthread_create_worker_on_cpu - create a kthread worker and bind it
  *	to a given CPU and the associated NUMA node.
@@ -1142,7 +1119,13 @@  struct kthread_worker *
 kthread_create_worker_on_cpu(int cpu, unsigned int flags,
 			     const char namefmt[])
 {
-	return __kthread_create_worker_on_cpu(cpu, flags, namefmt, cpu);
+	struct kthread_worker *worker;
+
+	worker = kthread_create_worker_on_node(flags, cpu_to_node(cpu), namefmt, cpu);
+	if (worker)
+		kthread_bind(worker->task, cpu);
+
+	return worker;
 }
 EXPORT_SYMBOL(kthread_create_worker_on_cpu);
 
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index c1e9f0818d51..a44228b0949a 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -4902,7 +4902,7 @@  static void rcu_spawn_exp_par_gp_kworker(struct rcu_node *rnp)
 	if (rnp->exp_kworker)
 		return;
 
-	kworker = kthread_create_worker(0, name, rnp_index);
+	kworker = kthread_run_worker(0, name, rnp_index);
 	if (IS_ERR_OR_NULL(kworker)) {
 		pr_err("Failed to create par gp kworker on %d/%d\n",
 		       rnp->grplo, rnp->grphi);
@@ -4929,7 +4929,7 @@  static void __init rcu_start_exp_gp_kworker(void)
 	const char *name = "rcu_exp_gp_kthread_worker";
 	struct sched_param param = { .sched_priority = kthread_prio };
 
-	rcu_exp_gp_kworker = kthread_create_worker(0, name);
+	rcu_exp_gp_kworker = kthread_run_worker(0, name);
 	if (IS_ERR_OR_NULL(rcu_exp_gp_kworker)) {
 		pr_err("Failed to create %s!\n", name);
 		rcu_exp_gp_kworker = NULL;
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index c09e3dc38c34..4835fa4d9326 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -4885,7 +4885,7 @@  static struct kthread_worker *scx_create_rt_helper(const char *name)
 {
 	struct kthread_worker *helper;
 
-	helper = kthread_create_worker(0, name);
+	helper = kthread_run_worker(0, name);
 	if (helper)
 		sched_set_fifo(helper->task);
 	return helper;
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 9949ffad8df0..f5c7447ae1de 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -7814,7 +7814,7 @@  static void __init wq_cpu_intensive_thresh_init(void)
 	unsigned long thresh;
 	unsigned long bogo;
 
-	pwq_release_worker = kthread_create_worker(0, "pool_workqueue_release");
+	pwq_release_worker = kthread_run_worker(0, "pool_workqueue_release");
 	BUG_ON(IS_ERR(pwq_release_worker));
 
 	/* if the user set it to a specific value, keep it */
diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c
index 281bbac5539d..c33d4bf17929 100644
--- a/net/dsa/tag_ksz.c
+++ b/net/dsa/tag_ksz.c
@@ -66,7 +66,7 @@  static int ksz_connect(struct dsa_switch *ds)
 	if (!priv)
 		return -ENOMEM;
 
-	xmit_worker = kthread_create_worker(0, "dsa%d:%d_xmit",
+	xmit_worker = kthread_run_worker(0, "dsa%d:%d_xmit",
 					    ds->dst->index, ds->index);
 	if (IS_ERR(xmit_worker)) {
 		ret = PTR_ERR(xmit_worker);
diff --git a/net/dsa/tag_ocelot_8021q.c b/net/dsa/tag_ocelot_8021q.c
index 8e8b1bef6af6..6ce0bc166792 100644
--- a/net/dsa/tag_ocelot_8021q.c
+++ b/net/dsa/tag_ocelot_8021q.c
@@ -110,7 +110,7 @@  static int ocelot_connect(struct dsa_switch *ds)
 	if (!priv)
 		return -ENOMEM;
 
-	priv->xmit_worker = kthread_create_worker(0, "felix_xmit");
+	priv->xmit_worker = kthread_run_worker(0, "felix_xmit");
 	if (IS_ERR(priv->xmit_worker)) {
 		err = PTR_ERR(priv->xmit_worker);
 		kfree(priv);
diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c
index 3e902af7eea6..02adec693811 100644
--- a/net/dsa/tag_sja1105.c
+++ b/net/dsa/tag_sja1105.c
@@ -707,7 +707,7 @@  static int sja1105_connect(struct dsa_switch *ds)
 
 	spin_lock_init(&priv->meta_lock);
 
-	xmit_worker = kthread_create_worker(0, "dsa%d:%d_xmit",
+	xmit_worker = kthread_run_worker(0, "dsa%d:%d_xmit",
 					    ds->dst->index, ds->index);
 	if (IS_ERR(xmit_worker)) {
 		err = PTR_ERR(xmit_worker);