It makes a scheduling decision, i.e. it assigns the CPU time to a
suitable runnable task. If called with the current task's state set to
TASK_(UN)INTERRUPTIBLE, it puts the task to sleep.
Kernel threads are preemptible if the kernel is configured with
CONFIG_PREEMPT.
What exactly are you trying to do?
If you're new to Linux kernel programming, I suggest you read Robert
Love's book "Linux Kernel Development".
"Linux Device Drivers" by J.Corbet, A.Rubini and G.Kroah-Hartman will be
very helpful too and it is available online: http://lwn.net/Kernel/LDD3/
Michal
-