diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
-rw-r--r-- | kernel/trace/ring_buffer.c | 26 |
1 files changed, 5 insertions, 21 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index ff7027199a9a..925f629658d6 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -1689,22 +1689,14 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, | |||
1689 | if (!cpu_buffer->nr_pages_to_update) | 1689 | if (!cpu_buffer->nr_pages_to_update) |
1690 | continue; | 1690 | continue; |
1691 | 1691 | ||
1692 | /* The update must run on the CPU that is being updated. */ | 1692 | /* Can't run something on an offline CPU. */ |
1693 | preempt_disable(); | 1693 | if (!cpu_online(cpu)) { |
1694 | if (cpu == smp_processor_id() || !cpu_online(cpu)) { | ||
1695 | rb_update_pages(cpu_buffer); | 1694 | rb_update_pages(cpu_buffer); |
1696 | cpu_buffer->nr_pages_to_update = 0; | 1695 | cpu_buffer->nr_pages_to_update = 0; |
1697 | } else { | 1696 | } else { |
1698 | /* | ||
1699 | * Can not disable preemption for schedule_work_on() | ||
1700 | * on PREEMPT_RT. | ||
1701 | */ | ||
1702 | preempt_enable(); | ||
1703 | schedule_work_on(cpu, | 1697 | schedule_work_on(cpu, |
1704 | &cpu_buffer->update_pages_work); | 1698 | &cpu_buffer->update_pages_work); |
1705 | preempt_disable(); | ||
1706 | } | 1699 | } |
1707 | preempt_enable(); | ||
1708 | } | 1700 | } |
1709 | 1701 | ||
1710 | /* wait for all the updates to complete */ | 1702 | /* wait for all the updates to complete */ |
@@ -1742,22 +1734,14 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, | |||
1742 | 1734 | ||
1743 | get_online_cpus(); | 1735 | get_online_cpus(); |
1744 | 1736 | ||
1745 | preempt_disable(); | 1737 | /* Can't run something on an offline CPU. */ |
1746 | /* The update must run on the CPU that is being updated. */ | 1738 | if (!cpu_online(cpu_id)) |
1747 | if (cpu_id == smp_processor_id() || !cpu_online(cpu_id)) | ||
1748 | rb_update_pages(cpu_buffer); | 1739 | rb_update_pages(cpu_buffer); |
1749 | else { | 1740 | else { |
1750 | /* | ||
1751 | * Can not disable preemption for schedule_work_on() | ||
1752 | * on PREEMPT_RT. | ||
1753 | */ | ||
1754 | preempt_enable(); | ||
1755 | schedule_work_on(cpu_id, | 1741 | schedule_work_on(cpu_id, |
1756 | &cpu_buffer->update_pages_work); | 1742 | &cpu_buffer->update_pages_work); |
1757 | wait_for_completion(&cpu_buffer->update_done); | 1743 | wait_for_completion(&cpu_buffer->update_done); |
1758 | preempt_disable(); | ||
1759 | } | 1744 | } |
1760 | preempt_enable(); | ||
1761 | 1745 | ||
1762 | cpu_buffer->nr_pages_to_update = 0; | 1746 | cpu_buffer->nr_pages_to_update = 0; |
1763 | put_online_cpus(); | 1747 | put_online_cpus(); |
@@ -3775,7 +3759,7 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts) | |||
3775 | if (rb_per_cpu_empty(cpu_buffer)) | 3759 | if (rb_per_cpu_empty(cpu_buffer)) |
3776 | return NULL; | 3760 | return NULL; |
3777 | 3761 | ||
3778 | if (iter->head >= local_read(&iter->head_page->page->commit)) { | 3762 | if (iter->head >= rb_page_size(iter->head_page)) { |
3779 | rb_inc_iter(iter); | 3763 | rb_inc_iter(iter); |
3780 | goto again; | 3764 | goto again; |
3781 | } | 3765 | } |