Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Feb 2015 13:19:26 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Mark Johnston <markj@FreeBSD.org>
Cc:        threads@freebsd.org, fs@freebsd.org
Subject:   Re: ZFS port and thread_exit()
Message-ID:  <20150228111926.GR2379@kib.kiev.ua>
In-Reply-To: <20150228073625.GA2627@raichu>
References:  <20150228043144.GQ2379@kib.kiev.ua> <20150228073625.GA2627@raichu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Feb 27, 2015 at 11:36:26PM -0800, Mark Johnston wrote:
> On Sat, Feb 28, 2015 at 06:31:44AM +0200, Konstantin Belousov wrote:
> > While looking for some change to thread_exit(), I noted that ZFS
> > on FreeBSD directly calls thread_exit(). It simply cannot work,
> > thread_exit() is the internal function which requires the thread and
> > process state prepared for it call. Among most obvious things, process
> > spin lock must be held, but also several cleanups and accounting have to
> > be done before the call.
> > 
> > I believe the function just happens to have the same name as the Solaris
> > counterpart, and for some reasons it is never called. If this is true,
> > kthread_exit() should be used instead.
> 
> I'm not very familiar with the ZFS code, but:
> 
> The opensolaris compat proc.h #defines thread_exit to kthread_exit after
> FreeBSD's proc.h is included, so calls to thread_exit() in ZFS code should
> be replaced. Also, zfs.ko contains no references to thread_exit, but does
> reference kthread_exit.
> 
> > 
> > Also, I noted that the userspace port defines thread_exit() as
> > thr_exit(NULL). Again, the direct invocation of the syscall does not
> > look right. The libthr library must do some cleanups on the thread exit,
> > which are not done if syscall is invoked by an application code. Also,
> > the thread itself gets no destructor calls.
> 
> This is done in zfs_context.h, which includes
> cddl/contrib/opensolaris/head/thread.h, which #defines thr_exit(r) to
> pthread_exit(r). There is no other thread.h in the src tree, and
> libzpool.so references only pthread_exit. So it seems to me that the
> compat layer is doing the right thing.

Thank you for the explanation.

I realized why kthread_exit() did not popped up in my reading.
Still, it is very confusing, probably at the same scale as our/Linux
PAGE_MASK.



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