git: d96f55bc7159 - main - linuxkpi: remove global atomic counter of the task allocations
Konstantin Belousov
kib at FreeBSD.org
Tue Jul 27 17:02:11 UTC 2021
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=d96f55bc7159e8d018847abe5b1782d74c8aa415
commit d96f55bc7159e8d018847abe5b1782d74c8aa415
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-05-20 15:28:20 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-07-27 17:01:19 +0000
linuxkpi: remove global atomic counter of the task allocations
Use thread_reap_barrier() to ensure that no threads are kept in the
zombies list which could have the linuxkpi task allocated.
Also fix order of initialization and teardown for current task
allocation hooks and resources. Register current task allocator after
zones are initialized. Deregister allocator before cycling over threads
and zeroing task pointer.
Reviewed by: hselasky, markj
Sponsored by: Mellanox Technologies/NVidia Networking
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D30468
---
sys/compat/linuxkpi/common/src/linux_current.c | 22 +++-------------------
1 file changed, 3 insertions(+), 19 deletions(-)
diff --git a/sys/compat/linuxkpi/common/src/linux_current.c b/sys/compat/linuxkpi/common/src/linux_current.c
index 51e396081c04..925d96770cc2 100644
--- a/sys/compat/linuxkpi/common/src/linux_current.c
+++ b/sys/compat/linuxkpi/common/src/linux_current.c
@@ -45,7 +45,6 @@ extern u_int first_msi_irq, num_msi_irqs;
static eventhandler_tag linuxkpi_thread_dtor_tag;
-static atomic_t linux_current_allocs;
static uma_zone_t linux_current_zone;
static uma_zone_t linux_mm_zone;
@@ -147,10 +146,6 @@ linux_alloc_current(struct thread *td, int flags)
/* free mm_struct pointer, if any */
uma_zfree(linux_mm_zone, mm);
- /* keep track of number of allocations */
- if (atomic_add_return(1, &linux_current_allocs) == INT_MAX)
- panic("linux_alloc_current: Refcount too high!");
-
return (0);
}
@@ -178,10 +173,6 @@ linux_free_current(struct task_struct *ts)
{
mmput(ts->mm);
uma_zfree(linux_current_zone, ts);
-
- /* keep track of number of allocations */
- if (atomic_sub_return(1, &linux_current_allocs) < 0)
- panic("linux_free_current: Negative refcount!");
}
static void
@@ -306,9 +297,9 @@ linux_current_init(void *arg __unused)
atomic_thread_fence_seq_cst();
- lkpi_alloc_current = linux_alloc_current;
linuxkpi_thread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor,
linuxkpi_thread_dtor, NULL, EVENTHANDLER_PRI_ANY);
+ lkpi_alloc_current = linux_alloc_current;
}
SYSINIT(linux_current, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND,
linux_current_init, NULL);
@@ -337,17 +328,10 @@ linux_current_uninit(void *arg __unused)
}
sx_sunlock(&allproc_lock);
- /*
- * There is a window where threads are removed from the
- * process list and where the thread destructor is invoked.
- * Catch that window by waiting for all task_struct
- * allocations to be returned before freeing the UMA zone.
- */
- while (atomic_read(&linux_current_allocs) != 0)
- pause("W", 1);
+ thread_reap_barrier();
EVENTHANDLER_DEREGISTER(thread_dtor, linuxkpi_thread_dtor_tag);
-
+
uma_zdestroy(linux_current_zone);
uma_zdestroy(linux_mm_zone);
}
More information about the dev-commits-src-all
mailing list