mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
kthread: add kthread_stop_put
Add a kthread_stop_put() helper that stops a thread and puts its task struct. Use it to replace the various instances of kthread_stop() followed by put_task_struct(). Remove the kthread_stop_put() macro in usbip that is similar but doesn't return the result of kthread_stop(). [agruenba@redhat.com: fix kerneldoc comment] Link: https://lkml.kernel.org/r/20230911111730.2565537-1-agruenba@redhat.com [akpm@linux-foundation.org: document kthread_stop_put()'s argument] Link: https://lkml.kernel.org/r/20230907234048.2499820-1-agruenba@redhat.com Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
ed5378a387
commit
6309727ef2
@ -618,6 +618,5 @@ int ivpu_job_done_thread_init(struct ivpu_device *vdev)
|
|||||||
|
|
||||||
void ivpu_job_done_thread_fini(struct ivpu_device *vdev)
|
void ivpu_job_done_thread_fini(struct ivpu_device *vdev)
|
||||||
{
|
{
|
||||||
kthread_stop(vdev->job_done_thread);
|
kthread_stop_put(vdev->job_done_thread);
|
||||||
put_task_struct(vdev->job_done_thread);
|
|
||||||
}
|
}
|
||||||
|
@ -476,10 +476,9 @@ static int find_race(void *arg)
|
|||||||
for (i = 0; i < ncpus; i++) {
|
for (i = 0; i < ncpus; i++) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = kthread_stop(threads[i]);
|
ret = kthread_stop_put(threads[i]);
|
||||||
if (ret && !err)
|
if (ret && !err)
|
||||||
err = ret;
|
err = ret;
|
||||||
put_task_struct(threads[i]);
|
|
||||||
}
|
}
|
||||||
kfree(threads);
|
kfree(threads);
|
||||||
|
|
||||||
@ -591,8 +590,7 @@ static int wait_forward(void *arg)
|
|||||||
for (i = 0; i < fc.chain_length; i++)
|
for (i = 0; i < fc.chain_length; i++)
|
||||||
dma_fence_signal(fc.fences[i]);
|
dma_fence_signal(fc.fences[i]);
|
||||||
|
|
||||||
err = kthread_stop(tsk);
|
err = kthread_stop_put(tsk);
|
||||||
put_task_struct(tsk);
|
|
||||||
|
|
||||||
err:
|
err:
|
||||||
fence_chains_fini(&fc);
|
fence_chains_fini(&fc);
|
||||||
@ -621,8 +619,7 @@ static int wait_backward(void *arg)
|
|||||||
for (i = fc.chain_length; i--; )
|
for (i = fc.chain_length; i--; )
|
||||||
dma_fence_signal(fc.fences[i]);
|
dma_fence_signal(fc.fences[i]);
|
||||||
|
|
||||||
err = kthread_stop(tsk);
|
err = kthread_stop_put(tsk);
|
||||||
put_task_struct(tsk);
|
|
||||||
|
|
||||||
err:
|
err:
|
||||||
fence_chains_fini(&fc);
|
fence_chains_fini(&fc);
|
||||||
@ -669,8 +666,7 @@ static int wait_random(void *arg)
|
|||||||
for (i = 0; i < fc.chain_length; i++)
|
for (i = 0; i < fc.chain_length; i++)
|
||||||
dma_fence_signal(fc.fences[i]);
|
dma_fence_signal(fc.fences[i]);
|
||||||
|
|
||||||
err = kthread_stop(tsk);
|
err = kthread_stop_put(tsk);
|
||||||
put_task_struct(tsk);
|
|
||||||
|
|
||||||
err:
|
err:
|
||||||
fence_chains_fini(&fc);
|
fence_chains_fini(&fc);
|
||||||
|
@ -548,11 +548,9 @@ static int race_signal_callback(void *arg)
|
|||||||
for (i = 0; i < ARRAY_SIZE(t); i++) {
|
for (i = 0; i < ARRAY_SIZE(t); i++) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = kthread_stop(t[i].task);
|
err = kthread_stop_put(t[i].task);
|
||||||
if (err && !ret)
|
if (err && !ret)
|
||||||
ret = err;
|
ret = err;
|
||||||
|
|
||||||
put_task_struct(t[i].task);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -719,11 +719,9 @@ static int threaded_migrate(struct intel_migrate *migrate,
|
|||||||
if (IS_ERR_OR_NULL(tsk))
|
if (IS_ERR_OR_NULL(tsk))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
status = kthread_stop(tsk);
|
status = kthread_stop_put(tsk);
|
||||||
if (status && !err)
|
if (status && !err)
|
||||||
err = status;
|
err = status;
|
||||||
|
|
||||||
put_task_struct(tsk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(thread);
|
kfree(thread);
|
||||||
|
@ -672,8 +672,7 @@ err:
|
|||||||
static void xenvif_disconnect_queue(struct xenvif_queue *queue)
|
static void xenvif_disconnect_queue(struct xenvif_queue *queue)
|
||||||
{
|
{
|
||||||
if (queue->task) {
|
if (queue->task) {
|
||||||
kthread_stop(queue->task);
|
kthread_stop_put(queue->task);
|
||||||
put_task_struct(queue->task);
|
|
||||||
queue->task = NULL;
|
queue->task = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,12 +298,6 @@ struct usbip_device {
|
|||||||
__k; \
|
__k; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define kthread_stop_put(k) \
|
|
||||||
do { \
|
|
||||||
kthread_stop(k); \
|
|
||||||
put_task_struct(k); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* usbip_common.c */
|
/* usbip_common.c */
|
||||||
void usbip_dump_urb(struct urb *purb);
|
void usbip_dump_urb(struct urb *purb);
|
||||||
void usbip_dump_header(struct usbip_header *pdu);
|
void usbip_dump_header(struct usbip_header *pdu);
|
||||||
|
@ -1126,8 +1126,7 @@ static int init_threads(struct gfs2_sbd *sdp)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
kthread_stop(sdp->sd_logd_process);
|
kthread_stop_put(sdp->sd_logd_process);
|
||||||
put_task_struct(sdp->sd_logd_process);
|
|
||||||
sdp->sd_logd_process = NULL;
|
sdp->sd_logd_process = NULL;
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -1135,13 +1134,11 @@ fail:
|
|||||||
void gfs2_destroy_threads(struct gfs2_sbd *sdp)
|
void gfs2_destroy_threads(struct gfs2_sbd *sdp)
|
||||||
{
|
{
|
||||||
if (sdp->sd_logd_process) {
|
if (sdp->sd_logd_process) {
|
||||||
kthread_stop(sdp->sd_logd_process);
|
kthread_stop_put(sdp->sd_logd_process);
|
||||||
put_task_struct(sdp->sd_logd_process);
|
|
||||||
sdp->sd_logd_process = NULL;
|
sdp->sd_logd_process = NULL;
|
||||||
}
|
}
|
||||||
if (sdp->sd_quotad_process) {
|
if (sdp->sd_quotad_process) {
|
||||||
kthread_stop(sdp->sd_quotad_process);
|
kthread_stop_put(sdp->sd_quotad_process);
|
||||||
put_task_struct(sdp->sd_quotad_process);
|
|
||||||
sdp->sd_quotad_process = NULL;
|
sdp->sd_quotad_process = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,7 @@ void free_kthread_struct(struct task_struct *k);
|
|||||||
void kthread_bind(struct task_struct *k, unsigned int cpu);
|
void kthread_bind(struct task_struct *k, unsigned int cpu);
|
||||||
void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask);
|
void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask);
|
||||||
int kthread_stop(struct task_struct *k);
|
int kthread_stop(struct task_struct *k);
|
||||||
|
int kthread_stop_put(struct task_struct *k);
|
||||||
bool kthread_should_stop(void);
|
bool kthread_should_stop(void);
|
||||||
bool kthread_should_park(void);
|
bool kthread_should_park(void);
|
||||||
bool kthread_should_stop_or_park(void);
|
bool kthread_should_stop_or_park(void);
|
||||||
|
@ -1852,15 +1852,13 @@ out_thread:
|
|||||||
struct task_struct *t = new->thread;
|
struct task_struct *t = new->thread;
|
||||||
|
|
||||||
new->thread = NULL;
|
new->thread = NULL;
|
||||||
kthread_stop(t);
|
kthread_stop_put(t);
|
||||||
put_task_struct(t);
|
|
||||||
}
|
}
|
||||||
if (new->secondary && new->secondary->thread) {
|
if (new->secondary && new->secondary->thread) {
|
||||||
struct task_struct *t = new->secondary->thread;
|
struct task_struct *t = new->secondary->thread;
|
||||||
|
|
||||||
new->secondary->thread = NULL;
|
new->secondary->thread = NULL;
|
||||||
kthread_stop(t);
|
kthread_stop_put(t);
|
||||||
put_task_struct(t);
|
|
||||||
}
|
}
|
||||||
out_mput:
|
out_mput:
|
||||||
module_put(desc->owner);
|
module_put(desc->owner);
|
||||||
@ -1971,12 +1969,9 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id)
|
|||||||
* the same bit to a newly requested action.
|
* the same bit to a newly requested action.
|
||||||
*/
|
*/
|
||||||
if (action->thread) {
|
if (action->thread) {
|
||||||
kthread_stop(action->thread);
|
kthread_stop_put(action->thread);
|
||||||
put_task_struct(action->thread);
|
if (action->secondary && action->secondary->thread)
|
||||||
if (action->secondary && action->secondary->thread) {
|
kthread_stop_put(action->secondary->thread);
|
||||||
kthread_stop(action->secondary->thread);
|
|
||||||
put_task_struct(action->secondary->thread);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Last action releases resources */
|
/* Last action releases resources */
|
||||||
|
@ -715,6 +715,24 @@ int kthread_stop(struct task_struct *k)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kthread_stop);
|
EXPORT_SYMBOL(kthread_stop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kthread_stop_put - stop a thread and put its task struct
|
||||||
|
* @k: thread created by kthread_create().
|
||||||
|
*
|
||||||
|
* Stops a thread created by kthread_create() and put its task_struct.
|
||||||
|
* Only use when holding an extra task struct reference obtained by
|
||||||
|
* calling get_task_struct().
|
||||||
|
*/
|
||||||
|
int kthread_stop_put(struct task_struct *k)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = kthread_stop(k);
|
||||||
|
put_task_struct(k);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kthread_stop_put);
|
||||||
|
|
||||||
int kthreadd(void *unused)
|
int kthreadd(void *unused)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
|
@ -272,8 +272,7 @@ static void smpboot_destroy_threads(struct smp_hotplug_thread *ht)
|
|||||||
struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu);
|
struct task_struct *tsk = *per_cpu_ptr(ht->store, cpu);
|
||||||
|
|
||||||
if (tsk) {
|
if (tsk) {
|
||||||
kthread_stop(tsk);
|
kthread_stop_put(tsk);
|
||||||
put_task_struct(tsk);
|
|
||||||
*per_cpu_ptr(ht->store, cpu) = NULL;
|
*per_cpu_ptr(ht->store, cpu) = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -699,8 +699,7 @@ static int __damon_stop(struct damon_ctx *ctx)
|
|||||||
if (tsk) {
|
if (tsk) {
|
||||||
get_task_struct(tsk);
|
get_task_struct(tsk);
|
||||||
mutex_unlock(&ctx->kdamond_lock);
|
mutex_unlock(&ctx->kdamond_lock);
|
||||||
kthread_stop(tsk);
|
kthread_stop_put(tsk);
|
||||||
put_task_struct(tsk);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
mutex_unlock(&ctx->kdamond_lock);
|
mutex_unlock(&ctx->kdamond_lock);
|
||||||
|
@ -3982,8 +3982,7 @@ static void __net_exit pg_net_exit(struct net *net)
|
|||||||
list_for_each_safe(q, n, &list) {
|
list_for_each_safe(q, n, &list) {
|
||||||
t = list_entry(q, struct pktgen_thread, th_list);
|
t = list_entry(q, struct pktgen_thread, th_list);
|
||||||
list_del(&t->th_list);
|
list_del(&t->th_list);
|
||||||
kthread_stop(t->tsk);
|
kthread_stop_put(t->tsk);
|
||||||
put_task_struct(t->tsk);
|
|
||||||
kfree(t);
|
kfree(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user