On Fri, Feb 11, 2005 at 09:05:21AM -0800, Daniel Walker wrote: > The other patch enabled interrupt before calling up on > kernel_sem ..This one could use some thinking over. I did this cause > up() is very expensive on ARM , and combined with the looping above > interrupts can stay off for a long time ..
Please substantiate your claim that up() is very expensive on ARM. I disagree: #define __up_op(ptr,wake) \ ({ \ __asm__ __volatile__( \ "@ up_op\n" \ " mrs ip, cpsr\n" \ " orr lr, ip, #128\n" \ " msr cpsr_c, lr\n" \ " ldr lr, [%0]\n" \ " adds lr, lr, %1\n" \ " str lr, [%0]\n" \ " msr cpsr_c, ip\n" \ " movle ip, %0\n" \ " blle " #wake \ : \ : "r" (ptr), "I" (1) \ : "ip", "lr", "cc", "memory"); \ }) static inline void up(struct semaphore * sem) { __up_op(sem, __up_wakeup); } Looks like 9 instructions for the uncontended case to me. If you're worried about 9 instructions being expensive, please work on GCC to improve its optimisation capabilities first. There's room there for improvement across the whole kernel than just the above 9 instructions. Plus, after you've read the above code, wouldn't you think that adding the "enable interrupts + disable interrupts" around an up() operation (which itself immediately disables interrupts again) is just adding extra instructions to the kernel, which corresponds directly to lower performance? -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/ 2.6 Serial core - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/