Date: Wed, 21 Jun 2006 06:58:24 +0800 From: David Xu <davidxu@freebsd.org> To: freebsd-threads@freebsd.org Cc: threads@freebsd.org, Divacky Roman <xdivac02@stud.fit.vutbr.cz>, hackers@freebsd.org Subject: Re: TLS - implementing linux one in fbsd Message-ID: <200606210658.24741.davidxu@freebsd.org> In-Reply-To: <20060620120948.GA8288@stud.fit.vutbr.cz> References: <20060620120948.GA8288@stud.fit.vutbr.cz>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 20 June 2006 20:09, Divacky Roman wrote: > Hi > > I am student working on SoC project - extending linuxolator, now I am > working on implementing linux TLS in FreeBSD. Here is what I think/know and > I like you to comment on this, thnx. Roman > > ------------------------------------------------- > > Linux and FreeBSD TLS implementation - comparison > > Both systems use per-thread setting of where is the tls area stored. This > setting is loaded into active threads GDT and can be accessed via %gs > register. This GDT setup is done on every context switch. > Yes. > Linux uses strict 1:1 threading so every thread is in fact process, so > thread creation is done using plain clone()/fork(). FreeBSD uses M:N > (including 1:1) threading. Threads are created via pthread_create() call to > threading library. In kernel there's thr_new() syscall or thread_create() > syscall. I didnt find the connection between threading library and kernel > but I assume its using one of the syscalls > The M:N and 1:1 threading in FreeBSD use different mechanisms to implement TLS, M:N implements it in userland, while 1:1 implements it in kernel. the thr_new or thr_create are used for 1:1 threading, right now libthr uses thr_new to atomically setup a thread, this includes, storing TID, setting TLS, and maybe signal mask( not implemented ) , cpu affinity mask etcs(not implemented), scheduling scope, in one word, it is intended to map most part of pthread_attr into kernel world. > For setting up the GDT for the thread Linux uses syscall set_thread_area() > (TODO - how exactly? its unclear what it does). I dont know how FreeBSD > does it but I think it might be done via params to the syscalls (TODO - how > is it done?) > If you use thr_new, it is not necessary to use set_thread_area, I am not sure you need to change TLS pointer again after the thread is created, I think only main thread may need this feature, in FreeBSD, setting thread's TLS pointer is via libc function: _set_tp(void *tp). > Remaining questions: > > clone() - 2.6.x glibc fork() implementation uses clone() syscall. is it > supposed to create a thread or just a process? I think its process but why > is the binary (ls, date and probably some other) linked to pthread library? > is it just Linux "strangeness"? I dont see a reason for ls to be > threaded... does anyone see? > Dunno. > set/get tid - does it relate to TLS at all? I dont think so but you never > know. The tid thing is unclear to me. The clone() syscall is passed > CLONE_CHILD_SETTID & CLONE_CHILD_CLEARTID which should be mutually > exclusive. I dont believe much its a mistake.. but the code is clear: > p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : > NULL; p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? > child_tidptr: NULL; > > kostik belousov pointed out that this is used for futexes, so not > interesting for this > > I think it is used for futex, and the childtid is use to implement pthread_join and garbage collection in thread library, the parent tid pointer (if I recall correctly) is used by parent thread to retrieve child tid. > Possible mapping from Linux to FreeBSD: > > To me it seems that the the set_thread_area() syscall is used in the > process of thread creation to set where the tls is stored. In FreeBSD we > use cpu_set_user_tls() for this. So it might be enough to just wrap call to > cpu_set_user_tls() into the syscall. cpu_set_user_tls is used by thr_new syscall internally to setup TLS pointer before executing user code, the thr_new syscall's only user is libthr.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606210658.24741.davidxu>