diff options
| author | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2025-09-13 15:00:48 +0100 | 
|---|---|---|
| committer | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2025-09-13 15:00:48 +0100 | 
| commit | 421d4487ef2ead206f57a8950ea9bdd1f7a7b39a (patch) | |
| tree | b679546eeaa70f88b5c8d6caeb79e214efb68121 /kernel/trace | |
| parent | 3422b4bc606eee2ba7758ea9347c83332eeec3e3 (diff) | |
| parent | 1b237f190eb3d36f52dffe07a40b5eb210280e00 (diff) | |
Merge tag 'v6.17-rc3' into togreg
Linux 6.17-rc3
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/fgraph.c | 1 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 19 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 22 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 10 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 22 | 
6 files changed, 50 insertions, 26 deletions
| diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c index f4d200f0c610..2a42c1036ea8 100644 --- a/kernel/trace/fgraph.c +++ b/kernel/trace/fgraph.c @@ -1397,6 +1397,7 @@ error:  		ftrace_graph_active--;  		gops->saved_func = NULL;  		fgraph_lru_release_index(i); +		unregister_pm_notifier(&ftrace_suspend_notifier);  	}  	return ret;  } diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 00b76d450a89..a69067367c29 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -4661,13 +4661,17 @@ ftrace_regex_open(struct ftrace_ops *ops, int flag,  	        } else {  			iter->hash = alloc_and_copy_ftrace_hash(size_bits, hash);  		} +	} else { +		if (hash) +			iter->hash = alloc_and_copy_ftrace_hash(hash->size_bits, hash); +		else +			iter->hash = EMPTY_HASH; +	} -		if (!iter->hash) { -			trace_parser_put(&iter->parser); -			goto out_unlock; -		} -	} else -		iter->hash = hash; +	if (!iter->hash) { +		trace_parser_put(&iter->parser); +		goto out_unlock; +	}  	ret = 0; @@ -6543,9 +6547,6 @@ int ftrace_regex_release(struct inode *inode, struct file *file)  		ftrace_hash_move_and_update_ops(iter->ops, orig_hash,  						      iter->hash, filter_hash);  		mutex_unlock(&ftrace_lock); -	} else { -		/* For read only, the hash is the ops hash */ -		iter->hash = NULL;  	}  	mutex_unlock(&iter->ops->func_hash->regex_lock); diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index bb71a0dc9d69..43460949ad3f 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -7666,7 +7666,7 @@ static __init int test_ringbuffer(void)  	rb_test_started = true;  	set_current_state(TASK_INTERRUPTIBLE); -	/* Just run for 10 seconds */; +	/* Just run for 10 seconds */  	schedule_timeout(10 * HZ);  	kthread_stop(rb_hammer); diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4283ed4e8f59..1b7db732c0b1 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1816,7 +1816,7 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,  	ret = get_user(ch, ubuf++);  	if (ret) -		return ret; +		goto fail;  	read++;  	cnt--; @@ -1830,7 +1830,7 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,  		while (cnt && isspace(ch)) {  			ret = get_user(ch, ubuf++);  			if (ret) -				return ret; +				goto fail;  			read++;  			cnt--;  		} @@ -1848,12 +1848,14 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,  	while (cnt && !isspace(ch) && ch) {  		if (parser->idx < parser->size - 1)  			parser->buffer[parser->idx++] = ch; -		else -			return -EINVAL; +		else { +			ret = -EINVAL; +			goto fail; +		}  		ret = get_user(ch, ubuf++);  		if (ret) -			return ret; +			goto fail;  		read++;  		cnt--;  	} @@ -1868,11 +1870,15 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,  		/* Make sure the parsed string always terminates with '\0'. */  		parser->buffer[parser->idx] = 0;  	} else { -		return -EINVAL; +		ret = -EINVAL; +		goto fail;  	}  	*ppos += read;  	return read; +fail: +	trace_parser_fail(parser); +	return ret;  }  /* TODO add a seq_buf_to_buffer() */ @@ -10632,10 +10638,10 @@ static void ftrace_dump_one(struct trace_array *tr, enum ftrace_dump_mode dump_m  			ret = print_trace_line(&iter);  			if (ret != TRACE_TYPE_NO_CONSUME)  				trace_consume(&iter); + +			trace_printk_seq(&iter.seq);  		}  		touch_nmi_watchdog(); - -		trace_printk_seq(&iter.seq);  	}  	if (!cnt) diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 1dbf1d3cf2f1..5f4bed5842f9 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1292,6 +1292,7 @@ bool ftrace_event_is_function(struct trace_event_call *call);   */  struct trace_parser {  	bool		cont; +	bool		fail;  	char		*buffer;  	unsigned	idx;  	unsigned	size; @@ -1299,7 +1300,7 @@ struct trace_parser {  static inline bool trace_parser_loaded(struct trace_parser *parser)  { -	return (parser->idx != 0); +	return !parser->fail && parser->idx != 0;  }  static inline bool trace_parser_cont(struct trace_parser *parser) @@ -1313,6 +1314,11 @@ static inline void trace_parser_clear(struct trace_parser *parser)  	parser->idx = 0;  } +static inline void trace_parser_fail(struct trace_parser *parser) +{ +	parser->fail = true; +} +  extern int trace_parser_get_init(struct trace_parser *parser, int size);  extern void trace_parser_put(struct trace_parser *parser);  extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf, @@ -2204,7 +2210,7 @@ static inline bool is_good_system_name(const char *name)  static inline void sanitize_event_name(char *name)  {  	while (*name++ != '\0') -		if (*name == ':' || *name == '.') +		if (*name == ':' || *name == '.' || *name == '*')  			*name = '_';  } diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 66e1a527cf1a..a7f4b9a47a71 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -27,14 +27,21 @@ struct fgraph_cpu_data {  	unsigned long	enter_funcs[FTRACE_RETFUNC_DEPTH];  }; +struct fgraph_ent_args { +	struct ftrace_graph_ent_entry	ent; +	/* Force the sizeof of args[] to have FTRACE_REGS_MAX_ARGS entries */ +	unsigned long			args[FTRACE_REGS_MAX_ARGS]; +}; +  struct fgraph_data {  	struct fgraph_cpu_data __percpu *cpu_data;  	/* Place to preserve last processed entry. */  	union { -		struct ftrace_graph_ent_entry	ent; +		struct fgraph_ent_args		ent; +		/* TODO allow retaddr to have args */  		struct fgraph_retaddr_ent_entry	rent; -	} ent; +	};  	struct ftrace_graph_ret_entry	ret;  	int				failed;  	int				cpu; @@ -627,10 +634,13 @@ get_return_for_leaf(struct trace_iterator *iter,  			 * Save current and next entries for later reference  			 * if the output fails.  			 */ -			if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) -				data->ent.rent = *(struct fgraph_retaddr_ent_entry *)curr; -			else -				data->ent.ent = *curr; +			if (unlikely(curr->ent.type == TRACE_GRAPH_RETADDR_ENT)) { +				data->rent = *(struct fgraph_retaddr_ent_entry *)curr; +			} else { +				int size = min((int)sizeof(data->ent), (int)iter->ent_size); + +				memcpy(&data->ent, curr, size); +			}  			/*  			 * If the next event is not a return type, then  			 * we only care about what type it is. Otherwise we can | 
