Date: Mon, 08 Jul 2013 00:47:51 +0800 From: Julian Elischer <julian@freebsd.org> To: Davide Italiano <davide@freebsd.org> Cc: freebsd-amd64@freebsd.org, freebsd-threads@freebsd.org Subject: Re: Accessing struct pthread from kernel Message-ID: <51D99BB7.1020101@freebsd.org> In-Reply-To: <CACYV=-H_T98QPWOLS=0iHxgt1Om-sR3p8ogqFCsZHFiZDLtosg@mail.gmail.com> References: <CACYV=-H_T98QPWOLS=0iHxgt1Om-sR3p8ogqFCsZHFiZDLtosg@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 7/6/13 7:22 AM, Davide Italiano wrote: > Hi, > as a preliminary step in the implementation of adaptive spinning for > umtx, I'm switching the pthread/umtx code so that a thread that > acquires a pthread_mutex writes the address of struct pthread in the > owner field of the lock instead of the thread id (tid). This is > because having struct pthread pointer allows easily to access > informations of the thread, and makes easy to get the state of the > thread exported from the kernel (once this will be implemented). > > For what concerns the libthr side, the internal function > _get_curthread() goes into the TLS to obtain the struct field of > curthread, so I'm done. > OTOH, I'm quite unsure instead about how to get address of struct > pthread for curthread from the kernel side (for example, in > do_lock_umutex() sys/kern/kern_umtx.c). > > I guess I need to write some MD code because the TLS is different on > the various architecture supported in FreeBSD, and as a first step I > focused on amd64. > It looks like from the SDM that %%fs register points to the base of > the TLS, so I think that accessing using curthread->td_pcb->pcb_fsbase > (and then adding the proper offset to acces the right field) is a > viable solution to do this. Am I correct? > In particular what worries me is if the read of 'struct pthread' for > curthread from the TLS register is atomic with respect to preemptions. > > Alternatively, is there an (easier way) to accomplish this task? there is a struct pthread for each tid (and visa versa) you could notify the kernel of it when you make a new thread. (new arg/call) for what it's worth the M:N threading system used to do something like this, with a user callback straucture supplied to the kernel.. > > Thanks, >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51D99BB7.1020101>