Hi -
The short answer is that, with current versions of Linux (certainly 2.6.x) you can safely use either kernel spinlocks or kernel semaphores with a multi-CPU (or multi-core) SMP system. the same restrictions now apply for SMP as for uniprocessors: if you cannot block, then you need a spinlock. Otherwise, you can (and usually should) use kernel semaphores.
Much more detailed info can be found in this excellent article from Linux Magazine:
Concurrency in the Kernel, Linux Magazine, November 2005
http://www.linux-mag.com/content/view/2360/0/1/6/
'Hope that helps .. PSM