Merge tag 'v3.10.102' into update
This is the 3.10.102 stable release
This commit is contained in:
@@ -5621,6 +5621,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
||||
|
||||
case CPU_UP_PREPARE:
|
||||
rq->calc_load_update = calc_load_update;
|
||||
account_reset_rq(rq);
|
||||
break;
|
||||
|
||||
case CPU_ONLINE:
|
||||
|
||||
@@ -1446,3 +1446,15 @@ static inline int rq_cpu(const struct rq *rq) { return rq->cpu; }
|
||||
static inline int rq_cpu(const struct rq *rq) { return 0; }
|
||||
#endif
|
||||
|
||||
static inline void account_reset_rq(struct rq *rq)
|
||||
{
|
||||
#ifdef CONFIG_IRQ_TIME_ACCOUNTING
|
||||
rq->prev_irq_time = 0;
|
||||
#endif
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
rq->prev_steal_time = 0;
|
||||
#endif
|
||||
#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
|
||||
rq->prev_steal_time_rq = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
+18
-17
@@ -472,7 +472,7 @@ struct ring_buffer_per_cpu {
|
||||
raw_spinlock_t reader_lock; /* serialize readers */
|
||||
arch_spinlock_t lock;
|
||||
struct lock_class_key lock_key;
|
||||
unsigned int nr_pages;
|
||||
unsigned long nr_pages;
|
||||
struct list_head *pages;
|
||||
struct buffer_page *head_page; /* read from head */
|
||||
struct buffer_page *tail_page; /* write to tail */
|
||||
@@ -492,7 +492,7 @@ struct ring_buffer_per_cpu {
|
||||
u64 write_stamp;
|
||||
u64 read_stamp;
|
||||
/* ring buffer pages to update, > 0 to add, < 0 to remove */
|
||||
int nr_pages_to_update;
|
||||
long nr_pages_to_update;
|
||||
struct list_head new_pages; /* new pages to add */
|
||||
struct work_struct update_pages_work;
|
||||
struct completion update_done;
|
||||
@@ -1129,10 +1129,10 @@ static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __rb_allocate_pages(int nr_pages, struct list_head *pages, int cpu)
|
||||
static int __rb_allocate_pages(long nr_pages, struct list_head *pages, int cpu)
|
||||
{
|
||||
int i;
|
||||
struct buffer_page *bpage, *tmp;
|
||||
long i;
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
#if !defined (CONFIG_MTK_EXTMEM)
|
||||
@@ -1179,7 +1179,7 @@ free_pages:
|
||||
}
|
||||
|
||||
static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
unsigned nr_pages)
|
||||
unsigned long nr_pages)
|
||||
{
|
||||
LIST_HEAD(pages);
|
||||
|
||||
@@ -1204,7 +1204,7 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
|
||||
}
|
||||
|
||||
static struct ring_buffer_per_cpu *
|
||||
rb_allocate_cpu_buffer(struct ring_buffer *buffer, int nr_pages, int cpu)
|
||||
rb_allocate_cpu_buffer(struct ring_buffer *buffer, long nr_pages, int cpu)
|
||||
{
|
||||
struct ring_buffer_per_cpu *cpu_buffer;
|
||||
struct buffer_page *bpage;
|
||||
@@ -1312,8 +1312,9 @@ struct ring_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags,
|
||||
struct lock_class_key *key)
|
||||
{
|
||||
struct ring_buffer *buffer;
|
||||
long nr_pages;
|
||||
int bsize;
|
||||
int cpu, nr_pages;
|
||||
int cpu;
|
||||
|
||||
/* keep it in its own cache line */
|
||||
buffer = kzalloc(ALIGN(sizeof(*buffer), cache_line_size()),
|
||||
@@ -1436,12 +1437,12 @@ static inline unsigned long rb_page_write(struct buffer_page *bpage)
|
||||
}
|
||||
|
||||
static int
|
||||
rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned int nr_pages)
|
||||
rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages)
|
||||
{
|
||||
struct list_head *tail_page, *to_remove, *next_page;
|
||||
struct buffer_page *to_remove_page, *tmp_iter_page;
|
||||
struct buffer_page *last_page, *first_page;
|
||||
unsigned int nr_removed;
|
||||
unsigned long nr_removed;
|
||||
unsigned long head_bit;
|
||||
int page_entries;
|
||||
|
||||
@@ -1657,7 +1658,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size,
|
||||
int cpu_id)
|
||||
{
|
||||
struct ring_buffer_per_cpu *cpu_buffer;
|
||||
unsigned nr_pages;
|
||||
unsigned long nr_pages;
|
||||
int cpu, err = 0;
|
||||
|
||||
/*
|
||||
@@ -1671,14 +1672,13 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size,
|
||||
!cpumask_test_cpu(cpu_id, buffer->cpumask))
|
||||
return size;
|
||||
|
||||
size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
|
||||
size *= BUF_PAGE_SIZE;
|
||||
nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
|
||||
|
||||
/* we need a minimum of two pages */
|
||||
if (size < BUF_PAGE_SIZE * 2)
|
||||
size = BUF_PAGE_SIZE * 2;
|
||||
if (nr_pages < 2)
|
||||
nr_pages = 2;
|
||||
|
||||
nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
|
||||
size = nr_pages * BUF_PAGE_SIZE;
|
||||
|
||||
/*
|
||||
* Don't succeed if resizing is disabled, as a reader might be
|
||||
@@ -4635,8 +4635,9 @@ static int rb_cpu_notify(struct notifier_block *self,
|
||||
struct ring_buffer *buffer =
|
||||
container_of(self, struct ring_buffer, cpu_notify);
|
||||
long cpu = (long)hcpu;
|
||||
int cpu_i, nr_pages_same;
|
||||
unsigned int nr_pages;
|
||||
long nr_pages_same;
|
||||
int cpu_i;
|
||||
unsigned long nr_pages;
|
||||
|
||||
switch (action) {
|
||||
case CPU_UP_PREPARE:
|
||||
|
||||
@@ -4543,7 +4543,10 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,
|
||||
|
||||
spd.nr_pages = i;
|
||||
|
||||
ret = splice_to_pipe(pipe, &spd);
|
||||
if (i)
|
||||
ret = splice_to_pipe(pipe, &spd);
|
||||
else
|
||||
ret = 0;
|
||||
out:
|
||||
splice_shrink_spd(&spd);
|
||||
return ret;
|
||||
|
||||
@@ -118,8 +118,12 @@ static int func_prolog_dec(struct trace_array *tr,
|
||||
return 0;
|
||||
|
||||
local_save_flags(*flags);
|
||||
/* slight chance to get a false positive on tracing_cpu */
|
||||
if (!irqs_disabled_flags(*flags))
|
||||
/*
|
||||
* Slight chance to get a false positive on tracing_cpu,
|
||||
* although I'm starting to think there isn't a chance.
|
||||
* Leave this for now just to be paranoid.
|
||||
*/
|
||||
if (!irqs_disabled_flags(*flags) && !preempt_count())
|
||||
return 0;
|
||||
|
||||
*data = per_cpu_ptr(tr->trace_buffer.data, cpu);
|
||||
|
||||
@@ -291,6 +291,9 @@ static int t_show(struct seq_file *m, void *v)
|
||||
const char *str = *fmt;
|
||||
int i;
|
||||
|
||||
if (!*fmt)
|
||||
return 0;
|
||||
|
||||
seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt);
|
||||
|
||||
/*
|
||||
|
||||
@@ -613,6 +613,35 @@ static void set_work_pool_and_clear_pending(struct work_struct *work,
|
||||
*/
|
||||
smp_wmb();
|
||||
set_work_data(work, (unsigned long)pool_id << WORK_OFFQ_POOL_SHIFT, 0);
|
||||
/*
|
||||
* The following mb guarantees that previous clear of a PENDING bit
|
||||
* will not be reordered with any speculative LOADS or STORES from
|
||||
* work->current_func, which is executed afterwards. This possible
|
||||
* reordering can lead to a missed execution on attempt to qeueue
|
||||
* the same @work. E.g. consider this case:
|
||||
*
|
||||
* CPU#0 CPU#1
|
||||
* ---------------------------- --------------------------------
|
||||
*
|
||||
* 1 STORE event_indicated
|
||||
* 2 queue_work_on() {
|
||||
* 3 test_and_set_bit(PENDING)
|
||||
* 4 } set_..._and_clear_pending() {
|
||||
* 5 set_work_data() # clear bit
|
||||
* 6 smp_mb()
|
||||
* 7 work->current_func() {
|
||||
* 8 LOAD event_indicated
|
||||
* }
|
||||
*
|
||||
* Without an explicit full barrier speculative LOAD on line 8 can
|
||||
* be executed before CPU#0 does STORE on line 1. If that happens,
|
||||
* CPU#0 observes the PENDING bit is still set and new execution of
|
||||
* a @work is not queued in a hope, that CPU#1 will eventually
|
||||
* finish the queued @work. Meanwhile CPU#1 does not see
|
||||
* event_indicated is set, because speculative LOAD was executed
|
||||
* before actual STORE.
|
||||
*/
|
||||
smp_mb();
|
||||
}
|
||||
|
||||
static void clear_work_data(struct work_struct *work)
|
||||
|
||||
Reference in New Issue
Block a user