Merge tag 'v4.6-rc4' into sched/core, to refresh the tree
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -137,11 +137,13 @@ static void bpf_map_show_fdinfo(struct seq_file *m, struct file *filp)
|
||||
"map_type:\t%u\n"
|
||||
"key_size:\t%u\n"
|
||||
"value_size:\t%u\n"
|
||||
"max_entries:\t%u\n",
|
||||
"max_entries:\t%u\n"
|
||||
"map_flags:\t%#x\n",
|
||||
map->map_type,
|
||||
map->key_size,
|
||||
map->value_size,
|
||||
map->max_entries);
|
||||
map->max_entries,
|
||||
map->map_flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+13
-2
@@ -2417,14 +2417,24 @@ static void ctx_sched_out(struct perf_event_context *ctx,
|
||||
cpuctx->task_ctx = NULL;
|
||||
}
|
||||
|
||||
is_active ^= ctx->is_active; /* changed bits */
|
||||
|
||||
/*
|
||||
* Always update time if it was set; not only when it changes.
|
||||
* Otherwise we can 'forget' to update time for any but the last
|
||||
* context we sched out. For example:
|
||||
*
|
||||
* ctx_sched_out(.event_type = EVENT_FLEXIBLE)
|
||||
* ctx_sched_out(.event_type = EVENT_PINNED)
|
||||
*
|
||||
* would only update time for the pinned events.
|
||||
*/
|
||||
if (is_active & EVENT_TIME) {
|
||||
/* update (and stop) ctx time */
|
||||
update_context_time(ctx);
|
||||
update_cgrp_time_from_cpuctx(cpuctx);
|
||||
}
|
||||
|
||||
is_active ^= ctx->is_active; /* changed bits */
|
||||
|
||||
if (!ctx->nr_active || !(is_active & EVENT_ALL))
|
||||
return;
|
||||
|
||||
@@ -8532,6 +8542,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
f_flags);
|
||||
if (IS_ERR(event_file)) {
|
||||
err = PTR_ERR(event_file);
|
||||
event_file = NULL;
|
||||
goto err_context;
|
||||
}
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@ retry:
|
||||
copy_to_page(new_page, vaddr, &opcode, UPROBE_SWBP_INSN_SIZE);
|
||||
|
||||
ret = __replace_page(vma, vaddr, old_page, new_page);
|
||||
page_cache_release(new_page);
|
||||
put_page(new_page);
|
||||
put_old:
|
||||
put_page(old_page);
|
||||
|
||||
@@ -539,14 +539,14 @@ static int __copy_insn(struct address_space *mapping, struct file *filp,
|
||||
* see uprobe_register().
|
||||
*/
|
||||
if (mapping->a_ops->readpage)
|
||||
page = read_mapping_page(mapping, offset >> PAGE_CACHE_SHIFT, filp);
|
||||
page = read_mapping_page(mapping, offset >> PAGE_SHIFT, filp);
|
||||
else
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_CACHE_SHIFT);
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
|
||||
if (IS_ERR(page))
|
||||
return PTR_ERR(page);
|
||||
|
||||
copy_from_page(page, offset, insn, nbytes);
|
||||
page_cache_release(page);
|
||||
put_page(page);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1999,6 +1999,79 @@ static inline int get_first_held_lock(struct task_struct *curr,
|
||||
return ++i;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCKDEP
|
||||
/*
|
||||
* Returns the next chain_key iteration
|
||||
*/
|
||||
static u64 print_chain_key_iteration(int class_idx, u64 chain_key)
|
||||
{
|
||||
u64 new_chain_key = iterate_chain_key(chain_key, class_idx);
|
||||
|
||||
printk(" class_idx:%d -> chain_key:%016Lx",
|
||||
class_idx,
|
||||
(unsigned long long)new_chain_key);
|
||||
return new_chain_key;
|
||||
}
|
||||
|
||||
static void
|
||||
print_chain_keys_held_locks(struct task_struct *curr, struct held_lock *hlock_next)
|
||||
{
|
||||
struct held_lock *hlock;
|
||||
u64 chain_key = 0;
|
||||
int depth = curr->lockdep_depth;
|
||||
int i;
|
||||
|
||||
printk("depth: %u\n", depth + 1);
|
||||
for (i = get_first_held_lock(curr, hlock_next); i < depth; i++) {
|
||||
hlock = curr->held_locks + i;
|
||||
chain_key = print_chain_key_iteration(hlock->class_idx, chain_key);
|
||||
|
||||
print_lock(hlock);
|
||||
}
|
||||
|
||||
print_chain_key_iteration(hlock_next->class_idx, chain_key);
|
||||
print_lock(hlock_next);
|
||||
}
|
||||
|
||||
static void print_chain_keys_chain(struct lock_chain *chain)
|
||||
{
|
||||
int i;
|
||||
u64 chain_key = 0;
|
||||
int class_id;
|
||||
|
||||
printk("depth: %u\n", chain->depth);
|
||||
for (i = 0; i < chain->depth; i++) {
|
||||
class_id = chain_hlocks[chain->base + i];
|
||||
chain_key = print_chain_key_iteration(class_id + 1, chain_key);
|
||||
|
||||
print_lock_name(lock_classes + class_id);
|
||||
printk("\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void print_collision(struct task_struct *curr,
|
||||
struct held_lock *hlock_next,
|
||||
struct lock_chain *chain)
|
||||
{
|
||||
printk("\n");
|
||||
printk("======================\n");
|
||||
printk("[chain_key collision ]\n");
|
||||
print_kernel_ident();
|
||||
printk("----------------------\n");
|
||||
printk("%s/%d: ", current->comm, task_pid_nr(current));
|
||||
printk("Hash chain already cached but the contents don't match!\n");
|
||||
|
||||
printk("Held locks:");
|
||||
print_chain_keys_held_locks(curr, hlock_next);
|
||||
|
||||
printk("Locks in cached chain:");
|
||||
print_chain_keys_chain(chain);
|
||||
|
||||
printk("\nstack backtrace:\n");
|
||||
dump_stack();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Checks whether the chain and the current held locks are consistent
|
||||
* in depth and also in content. If they are not it most likely means
|
||||
@@ -2014,14 +2087,18 @@ static int check_no_collision(struct task_struct *curr,
|
||||
|
||||
i = get_first_held_lock(curr, hlock);
|
||||
|
||||
if (DEBUG_LOCKS_WARN_ON(chain->depth != curr->lockdep_depth - (i - 1)))
|
||||
if (DEBUG_LOCKS_WARN_ON(chain->depth != curr->lockdep_depth - (i - 1))) {
|
||||
print_collision(curr, hlock, chain);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (j = 0; j < chain->depth - 1; j++, i++) {
|
||||
id = curr->held_locks[i].class_idx - 1;
|
||||
|
||||
if (DEBUG_LOCKS_WARN_ON(chain_hlocks[chain->base + j] != id))
|
||||
if (DEBUG_LOCKS_WARN_ON(chain_hlocks[chain->base + j] != id)) {
|
||||
print_collision(curr, hlock, chain);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
|
||||
+11
-2
@@ -105,16 +105,25 @@ static int r_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct resource *root = m->private;
|
||||
struct resource *r = v, *p;
|
||||
unsigned long long start, end;
|
||||
int width = root->end < 0x10000 ? 4 : 8;
|
||||
int depth;
|
||||
|
||||
for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent)
|
||||
if (p->parent == root)
|
||||
break;
|
||||
|
||||
if (file_ns_capable(m->file, &init_user_ns, CAP_SYS_ADMIN)) {
|
||||
start = r->start;
|
||||
end = r->end;
|
||||
} else {
|
||||
start = end = 0;
|
||||
}
|
||||
|
||||
seq_printf(m, "%*s%0*llx-%0*llx : %s\n",
|
||||
depth * 2, "",
|
||||
width, (unsigned long long) r->start,
|
||||
width, (unsigned long long) r->end,
|
||||
width, start,
|
||||
width, end,
|
||||
r->name ? r->name : "<BAD>");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user