steal_tags only happens when free tags is more than half of the total tags. This is too restrict and can cause live lock. I found one cpu has free tags, but other cpu can't steal (thread is bound to specific cpus), threads which wants to allocate tags are always sleeping. I found this when I run next patch, but this could happen without it I think.
I did performance test too with null_blk. Two cases (each cpu has enough percpu tags, or total tags are limited) haven't performance changes. Signed-off-by: Shaohua Li <s...@fusionio.com> --- lib/percpu_ida.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) Index: linux/lib/percpu_ida.c =================================================================== --- linux.orig/lib/percpu_ida.c 2013-11-25 09:36:52.196626486 +0800 +++ linux/lib/percpu_ida.c 2013-12-31 11:20:03.205400612 +0800 @@ -54,9 +54,7 @@ static inline void move_tags(unsigned *d /* * Try to steal tags from a remote cpu's percpu freelist. * - * We first check how many percpu freelists have tags - we don't steal tags - * unless enough percpu freelists have tags on them that it's possible more than - * half the total tags could be stuck on remote percpu freelists. + * We first check how many percpu freelists have tags * * Then we iterate through the cpus until we find some tags - we don't attempt * to find the "best" cpu to steal from, to keep cacheline bouncing to a @@ -69,8 +67,7 @@ static inline void steal_tags(struct per struct percpu_ida_cpu *remote; for (cpus_have_tags = cpumask_weight(&pool->cpus_have_tags); - cpus_have_tags * pool->percpu_max_size > pool->nr_tags / 2; - cpus_have_tags--) { + cpus_have_tags; cpus_have_tags--) { cpu = cpumask_next(cpu, &pool->cpus_have_tags); if (cpu >= nr_cpu_ids) { -- 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/