Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Aug 2021 10:52:59 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 130f41810ea7 - stable/13 - linuxkpi: remove global atomic counter of the task allocations
Message-ID:  <202108031052.173AqxgH063671@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=130f41810ea754d4ba2da636d7804458185b7ed0

commit 130f41810ea754d4ba2da636d7804458185b7ed0
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-05-20 15:28:20 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-08-03 09:56:02 +0000

    linuxkpi: remove global atomic counter of the task allocations
    
    (cherry picked from commit d96f55bc7159e8d018847abe5b1782d74c8aa415)
---
 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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202108031052.173AqxgH063671>