On Wed, Jan 8, 2014 at 11:29 AM, Ming Lei <tom.leim...@gmail.com> wrote: > Hi Andrew, > > On Wed, Jan 8, 2014 at 9:36 AM, Andrew Morton <a...@linux-foundation.org> > wrote: >>> I am wondering if the above patch is more efficient, because: >>> >>> - raw_local_irq_save()/raw_local_irq_restore() should be cheaper >>> than preempt_enable() in theory >> >> Don't think so - local_irq_disable() requires quite some internal >> synchronization in the CPU and is expensive. preempt_disable() is just > > Yes, it might be a little expensive on some CPUs, but should be > arch-dependent(CPU inside things are involved) > >> an add+barrier, minus the add if the kernel is non-preemptable. > > IMO, generally, from software view, local_irq_save() only save the > CPU's interrupt mask to the local variable 'flag', and sets irq mask > to register, considered local variable can be thought to be in cache, > so I think it might be cheaper than preempt_enable() because > preempt counter may not be in cache. > > Also this_cpu_add() won't work in batch path(slow path), we still > need to avoid interrupt coming between reading the percpu counter > and resetting it, otherwise counts might be lost too, :-)
Sorry, I miss the __this_cpu_sub() in slow path, so it is correct, and even preempt_enable() and preempt_disable() can be removed. Thanks, -- Ming Lei -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/