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-main mailing list