Some time back there was a discussion on lkml about mutex vs semaphores. Check out Goodbye Semaphores?. You might have to wait until 12 Jan 2006 to read it, if you do not have a LWN subscription.
The main reason Linus accepted Ingo's new patch is because semaphores did not perform as well as the new mutex code and of-course various other reasons. Linus and others quickly found the main cause of the performance hit to be the double wakeup problem.
If you are interested in this kind of stuff, I posted my analysis of the double wakeup issue on lkml. Here is the complete analysis