Commit 2ccbdf43 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ARM and clkdev fixes from Russell King:

 - Fix clkdev - erroring out on long strings causes boot failures, so
   don't do this. Still warn about the over-sized strings (which will
   never match and thus their registration with clkdev is useless)

 - Fix for ftrace with frame pointer unwinder with recent GCC changing
   the way frames are stacked.

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rmk/linux:
  ARM: 9405/1: ftrace: Don't assume stack frames are contiguous in memory
  clkdev: don't fail clkdev_alloc() if over-sized
parents 0b4989eb 594ce0b8
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -232,11 +232,24 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
	unsigned long old;

	if (unlikely(atomic_read(&current->tracing_graph_pause)))
err_out:
		return;

	if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) {
		/* FP points one word below parent's top of stack */
		frame_pointer += 4;
		/*
		 * Usually, the stack frames are contiguous in memory but cases
		 * have been observed where the next stack frame does not live
		 * at 'frame_pointer + 4' as this code used to assume.
		 *
		 * Instead, dereference the field in the stack frame that
		 * stores the SP of the calling frame: to avoid unbounded
		 * recursion, this cannot involve any ftrace instrumented
		 * functions, so use the __get_kernel_nofault() primitive
		 * directly.
		 */
		__get_kernel_nofault(&frame_pointer,
				     (unsigned long *)(frame_pointer - 8),
				     unsigned long, err_out);
	} else {
		struct stackframe frame = {
			.fp = frame_pointer,
+9 −2
Original line number Diff line number Diff line
@@ -204,8 +204,15 @@ vclkdev_alloc(struct clk_hw *hw, const char *con_id, const char *dev_fmt,
	pr_err("%pV:%s: %s ID is greater than %zu\n",
	       &vaf, con_id, failure, max_size);
	va_end(ap_copy);
	kfree(cla);
	return NULL;

	/*
	 * Don't fail in this case, but as the entry won't ever match just
	 * fill it with something that also won't match.
	 */
	strscpy(cla->con_id, "bad", sizeof(cla->con_id));
	strscpy(cla->dev_id, "bad", sizeof(cla->dev_id));

	return &cla->cl;
}

static struct clk_lookup *