Commit 05fdd70d authored by Vaibhav Nagarnaik's avatar Vaibhav Nagarnaik Committed by Steven Rostedt

ring-buffer: Merge separate resize loops

There are 2 separate loops to resize cpu buffers that are online and
offline. Merge them to make the code look better.

Also change the name from update_completion to update_done to allow
shorter lines.

Link: http://lkml.kernel.org/r/1337372991-14783-1-git-send-email-vnagarnaik@google.com

Cc: Laurent Chavey <chavey@google.com>
Cc: Justin Teravest <teravest@google.com>
Cc: David Sharp <dhsharp@google.com>
Signed-off-by: default avatarVaibhav Nagarnaik <vnagarnaik@google.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent b732d439
...@@ -473,7 +473,7 @@ struct ring_buffer_per_cpu { ...@@ -473,7 +473,7 @@ struct ring_buffer_per_cpu {
int nr_pages_to_update; int nr_pages_to_update;
struct list_head new_pages; /* new pages to add */ struct list_head new_pages; /* new pages to add */
struct work_struct update_pages_work; struct work_struct update_pages_work;
struct completion update_completion; struct completion update_done;
}; };
struct ring_buffer { struct ring_buffer {
...@@ -1058,7 +1058,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int nr_pages, int cpu) ...@@ -1058,7 +1058,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int nr_pages, int cpu)
lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key); lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key);
cpu_buffer->lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; cpu_buffer->lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;
INIT_WORK(&cpu_buffer->update_pages_work, update_pages_handler); INIT_WORK(&cpu_buffer->update_pages_work, update_pages_handler);
init_completion(&cpu_buffer->update_completion); init_completion(&cpu_buffer->update_done);
bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()), bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
GFP_KERNEL, cpu_to_node(cpu)); GFP_KERNEL, cpu_to_node(cpu));
...@@ -1461,7 +1461,7 @@ static void update_pages_handler(struct work_struct *work) ...@@ -1461,7 +1461,7 @@ static void update_pages_handler(struct work_struct *work)
struct ring_buffer_per_cpu *cpu_buffer = container_of(work, struct ring_buffer_per_cpu *cpu_buffer = container_of(work,
struct ring_buffer_per_cpu, update_pages_work); struct ring_buffer_per_cpu, update_pages_work);
rb_update_pages(cpu_buffer); rb_update_pages(cpu_buffer);
complete(&cpu_buffer->update_completion); complete(&cpu_buffer->update_done);
} }
/** /**
...@@ -1534,39 +1534,29 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, ...@@ -1534,39 +1534,29 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size,
get_online_cpus(); get_online_cpus();
/* /*
* Fire off all the required work handlers * Fire off all the required work handlers
* Look out for offline CPUs * We can't schedule on offline CPUs, but it's not necessary
*/
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
if (!cpu_buffer->nr_pages_to_update ||
!cpu_online(cpu))
continue;
schedule_work_on(cpu, &cpu_buffer->update_pages_work);
}
/*
* This loop is for the CPUs that are not online.
* We can't schedule anything on them, but it's not necessary
* since we can change their buffer sizes without any race. * since we can change their buffer sizes without any race.
*/ */
for_each_buffer_cpu(buffer, cpu) { for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu]; cpu_buffer = buffer->buffers[cpu];
if (!cpu_buffer->nr_pages_to_update || if (!cpu_buffer->nr_pages_to_update)
cpu_online(cpu))
continue; continue;
rb_update_pages(cpu_buffer); if (cpu_online(cpu))
schedule_work_on(cpu,
&cpu_buffer->update_pages_work);
else
rb_update_pages(cpu_buffer);
} }
/* wait for all the updates to complete */ /* wait for all the updates to complete */
for_each_buffer_cpu(buffer, cpu) { for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu]; cpu_buffer = buffer->buffers[cpu];
if (!cpu_buffer->nr_pages_to_update || if (!cpu_buffer->nr_pages_to_update)
!cpu_online(cpu))
continue; continue;
wait_for_completion(&cpu_buffer->update_completion); if (cpu_online(cpu))
/* reset this value */ wait_for_completion(&cpu_buffer->update_done);
cpu_buffer->nr_pages_to_update = 0; cpu_buffer->nr_pages_to_update = 0;
} }
...@@ -1593,13 +1583,12 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, ...@@ -1593,13 +1583,12 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size,
if (cpu_online(cpu_id)) { if (cpu_online(cpu_id)) {
schedule_work_on(cpu_id, schedule_work_on(cpu_id,
&cpu_buffer->update_pages_work); &cpu_buffer->update_pages_work);
wait_for_completion(&cpu_buffer->update_completion); wait_for_completion(&cpu_buffer->update_done);
} else } else
rb_update_pages(cpu_buffer); rb_update_pages(cpu_buffer);
put_online_cpus();
/* reset this value */
cpu_buffer->nr_pages_to_update = 0; cpu_buffer->nr_pages_to_update = 0;
put_online_cpus();
} }
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment