Re: [PATCH v19 02/13] x86/setup: Use parse_crashkernel_high_low() to simplify code
From: Leizhen (ThunderTown) <hidden>
Date: 2021-12-30 08:56:18
Also in:
kexec, linux-devicetree, linux-doc, lkml
On 2021/12/30 10:39, Leizhen (ThunderTown) wrote:
On 2021/12/30 0:51, Borislav Petkov wrote:quoted
On Wed, Dec 29, 2021 at 11:04:21PM +0800, Leizhen (ThunderTown) wrote:quoted
Chen Zhou and I tried to share the code because of a suggestion. After so many attempts, it doesn't seem to fit to make generic. Or maybe I haven't figured out a good solution yet.Well, you learned a very important lesson and the many attempts are not in vain: code sharing does not make sense in every case.quoted
I will put the patches that make arm64 support crashkernel...high,low to the front, then the parse_crashkernel() unification patches. Even if the second half of the patches is not ready for v5.18, the first half of the patches is ready.I think you should concentrate on the arm64 side which is, AFAICT, what you're trying to achieve.Right, a patchset should focus on just one thing.quoted
The "parse_crashkernel() unification" needs more thought because, as I said already, that doesn't make a whole lot of sense to me.Yes, because it's not a functional improvement, it's not a performance optimization, it's also not a fix for a known bug, it's just a programmer's artistic pursuit.quoted
If you want to enforce the fact that "low" makes sense only when "high" is supplied, parse_crashkernel_high_low() is not the right thing to do. You need to have a *single* function which does all the parsing where you can decide what to do: "if high, parse low", "if no high supplied, ignore low" and so on.
In fact, this is how my current function parse_crashkernel_high_low() is implemented. + /* crashkernel=X,high */ + ret = parse_crashkernel_high(cmdline, 0, high_size, &base); + if (ret) //crashkernel=X,high is not specified + return ret; + + if (*high_size <= 0) //crashkernel=X,high is specified but the value is invalid + return -EINVAL; //Sorry, the type of high_size is "unsigned long long *", so less than zero is impossible + + /* crashkernel=Y,low */ + ret = parse_crashkernel_low(cmdline, 0, low_size, &base); //If crashkernel=Y,low is specified, the parsed value is stored in *low_size + if (ret) + *low_size = -1; //crashkernel=Y,low is not specified
I understand your proposal, but parse_crashkernel_high_low() is a cost-effective and profitable change, it makes the current code a little clearer, and avoid passing unnecessary parameters "system_ram" and "crash_base" when other architectures use parse_crashkernel_{high|low}(). I actually followed your advice in the beginning to do "parse_crashkernel() and parse_crashkernel_{high|low}() unification". But I found it's difficult and the end result may not be as good as expected. So I introduced parse_crashkernel_high_low(). The parameter "system_ram" and "crash_base" of parse_crashkernel() is not need by "crashkernel=X,[high,low]". And parameter "low_size" of parse_crashkernel_high_low() is not need by "crashkernel=X[@offset]". The "parse_crashkernel() unification" complicates things. For example, the parameter "crash_size" means "low or high" memory size for "crashkernel=X[@offset]", but only means "high" memory size for "crashkernel=X,high". So we'd better give it two names with union.quoted
And if those are supported on certain architectures only, you can do ifdeffery...I don't think so. These __init functions are small and architecture-independent, and do not affect compilation of other architectures. There may be other architectures that use it in the future, such as the current arm64.quoted
But I think I already stated that I don't like such unifications which introduce unnecessary dependencies between architectures. Therefore, I won't accept them into x86 unless there's a strong compelling reason. Which I don't see ATM.OK.quoted
Thx.
-- Regards, Zhen Lei _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel