[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    ULE locking mechanism
From:       Jens Krieg <jkrieg () mailbox ! tu-berlin ! de>
Date:       2014-01-28 13:07:08
Message-ID: FD4193F4-FA47-4D77-BC1F-23749D9B7E5F () mailbox ! tu-berlin ! de
[Download RAW message or body]

Hello,

we are currently working on project for our university. Our goal is to implement a \
simple round robin scheduler for FreeBSD 9.2 on a single core machine. So far we \
removed most of the functionality of the ULE scheduler except the functions that are \
called from outside. The system successfully boots to user land with our RR scheduler \
managing thread in a list based run queue. Further, it is possible to interact with \
the system using the shell.

The next step is to replace the locking mechanism of the ULE scheduler. Therefore, we \
replaced the scheduling dependent thread_lock/thread_unlock functions by simply \
disabling/enabling the interrupts. With this modification the kernel works fine until \
we hit the user land then the system crashes. The error occurs in the init user \
process (init_main.c:start_init:685). We found out that the page fault is triggered \
while executing the subyte function for the first time. See the error description \
below (unfortunately not shown in backtrace). We compared the ULE scheduler with our \
RR implementation and it appears, that the parameters passed to subyte as well as the \
register values are identical. We assume, that whatever caused the error is related \
to the thread locking replacement.

Every time the kernel want to modify thread data the corresponding thread is locked \
to prevent any interference by other threads. Since we are using a single core \
machine why isn’t it sufficient to simply disable interrupt while modifying thread \
data. Could you provide us with detailed information about the locking mechanism in \
FreeBSD and also answer the following questions, please.

What is the purpose of thread_lock/thread_unlock besides protecting thread data?
How does the TDQ LOCK works and how is it related to a thread LOCK?
	- all thread LOCKs of the thread located in the run queue pointing to the TDQ LOCK, \
                and
	- the TDQ LOCK points to the currently running thread
	- on context switching the current thread passes the TDQ LOCK to the new chosen \
                thread
	- Could you explain the idea behind that locking concept, please? 
Any suggestions we shall care about in our own lock implementation?


Kind regards,
Jens Krieg



start_init: trying /sbin/init

Fatal trap 12: page fault while in kernel mode
fault virtual address	= 0x7fffffffefff
fault code			= supervisor write data, page not present
instruction pointer	= 0x20:0xffffffff808ab119
stack pointer	        = 0x28:0xffffff800020db30
frame pointer	        = 0x28:0xffffff800020dbe0
code segment		= base 0x0, limit 0xfffff, type 0x1b
				= DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags	= interrupt enabled, resume, IOPL = 0
current process	= 1 (kernel)
trap number		= 12
panic: page fault
KDB: stack backtrace:
#0 0xffffffff806e19cf at kdb_backtrace+0x5f
#1 0xffffffff806b2ddb at panic+0x15b
#2 0xffffffff808ac797 at trap_fatal+0x267
#3 0xffffffff808accfc at trap_pfault+0x40c
#4 0xffffffff808ad0ca at trap+0x37a
#5 0xffffffff8089839f at calltrap+0x8
#6 0xffffffff80687c4d at fork_exit+0x9d
#7 0xffffffff808988ce at fork_trampoline+0xe

_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic