Accessing struct pthread from kernel
davide at freebsd.org
Sun Jul 7 17:03:50 UTC 2013
On Sun, Jul 7, 2013 at 9:47 AM, Julian Elischer <julian at freebsd.org> wrote:
> On 7/6/13 7:22 AM, Davide Italiano wrote:
>> 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)
Yes, I previously tried implementing something like what you propose,
exploiting the fact that thr_create() pass the pointer to struct
pthread to the kernel as argument. The problem I see here is that the
main thread is not created by thr_create() but by fork(). So, another
way to pass the struct to the kernel is needed. One might think about
adding another system call for the purpose, but I guess this is
overkill so if you have other suggestions I'll be happpy to hear.
> 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 for your answer,
"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare
More information about the freebsd-amd64