The preempt() function puts the current LWP back on the system run queue and performs an involuntary context switch. The yield() function is mostly same as preempt(), except that it performs a voluntary context switch.
These functions drop the kernel lock before switching and re-acquire it before returning.