percpu_ida: Couple of tweaks
Subsystems (2)
cover percpu_ida: Couple of tweaks
Hello,
The patches are against 3.15-rc2
Cc Kent Overstreet <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Jens Axboe <[email protected]>
Cc "Nicholas A. Bellinger" <[email protected]>
Alexander Gordeev (2):
percpu_ida: Move waking up waiters out of atomic contexts
percpu_ida: Sanity check initialization parameters
lib/percpu_ida.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-)
Signature · 1 line
1.7.7.6
PATCH RESEND 1/2 percpu_ida: Move waking up waiters out of atomic contexts
Currently percpu_ida_free() waikes up waiters always with local interrupts disabled and sometimes with pool->lock held. Yet, it does not appear there is any reason why it could not be done out of these atomic contexts.
Signed-off-by Alexander Gordeev <[email protected]>
Cc Kent Overstreet <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Jens Axboe <[email protected]>
Cc "Nicholas A. Bellinger" <[email protected]>
Acked-by Kent Overstreet <[email protected]>
Signed-off-by Alexander Gordeev <[email protected]>
--- lib/percpu_ida.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-)
lib/percpu_ida.c +7 -5
@@ -221,6 +221,7 @@ void percpu_ida_free(struct percpu_ida *pool, unsigned tag)struct percpu_ida_cpu *tags;unsigned long flags;unsigned nr_free; +bool wake_up = false;BUG_ON (tag >= pool->nr_tags);
@@ -234,9 +235,8 @@ void percpu_ida_free(struct percpu_ida *pool, unsigned tag)spin_unlock (&tags->lock);if (nr_free ==1 ) { -cpumask_set_cpu (smp_processor_id (), - &pool->cpus_have_tags); -wake_up (&pool->wait); +cpumask_set_cpu (smp_processor_id (), &pool->cpus_have_tags); + wake_up = true; }if (nr_free == pool->percpu_max_size) {
@@ -250,13 +250,15 @@ void percpu_ida_free(struct percpu_ida *pool, unsigned tag)move_tags (pool->freelist, &pool->nr_free, tags->freelist, &tags->nr_free, pool->percpu_batch_size); - -wake_up (&pool->wait); + wake_up = true; }spin_unlock (&pool->lock); }local_irq_restore (flags); + +if (wake_up) +wake_up (&pool->wait); }EXPORT_SYMBOL_GPL (percpu_ida_free);
Signature · 1 line
1.7.7.6
PATCH RESEND 2/2 percpu_ida: Sanity check initialization parameters
In reply to Alexander GordeevSigned-off-by Alexander Gordeev <[email protected]>
Cc Kent Overstreet <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Jens Axboe <[email protected]>
Cc "Nicholas A. Bellinger" <[email protected]>
Acked-by Kent Overstreet <[email protected]>
--- lib/percpu_ida.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
lib/percpu_ida.c +5 -0
@@ -293,6 +293,11 @@ int __percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags, {unsigned i, cpu, order; +if (batch_size > max_size) +return -ERANGE ; +if (!batch_size) +return -EINVAL ; +memset (pool,0 ,sizeof (*pool));init_waitqueue_head (&pool->wait);
Signature · 1 line
1.7.7.6