From: Nathan Chancellor <nathan@kernel.org>
To: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Xi Ruoyao <xry111@xry111.site>,
Peter Zijlstra <peterz@infradead.org>,
Alex Deucher <alexdeucher@gmail.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Huacai Chen <chenhuacai@kernel.org>,
loongarch@lists.linux.dev, amd-gfx@lists.freedesktop.org,
linux-kernel@vger.kernel.org,
Nick Desaulniers <ndesaulniers@google.com>,
llvm@lists.linux.dev
Subject: Re: [PATCH v6 9/9] drm/amd/display: Mark dc_fixpt_from_fraction() noinline
Date: Mon, 23 Dec 2024 14:46:45 -0700 [thread overview]
Message-ID: <20241223214645.GB1188382@ax162> (raw)
In-Reply-To: <bc35fddc-498a-cc58-b6a1-f5234a4f6d0d@loongson.cn>
On Sun, Dec 22, 2024 at 12:27:47PM +0800, Tiezhu Yang wrote:
> On 12/21/2024 03:40 PM, Xi Ruoyao wrote:
> > On Fri, 2024-12-20 at 15:34 -0700, Nathan Chancellor wrote:
> > > > Now, the thing is, these ASSERT()s are checking for divide-by-zero, I
> > > > suspect clang figured that out and invokes UB on us and just stops
> > > > code-gen.
> > >
> > > Yeah, I think your analysis is spot on, as this was introduced by a
> > > change in clang from a few months ago according to my bisect:
> > >
> > > https://github.com/llvm/llvm-project/commit/37932643abab699e8bb1def08b7eb4eae7ff1448
> > >
> > > Since the ASSERT does not do anything to prevent the divide by zero (it
> > > just flags it with WARN_ON) and the rest of the code doesn't either, I
> > > assume that the codegen stops as soon as it encounters the unreachable
> > > that change created from the path where divide by zero would occur via
> > >
> > > dc_fixpt_recip() ->
> > > dc_fixpt_from_fraction() ->
> > > complete_integer_division_u64() ->
> > > div64_u64_rem()
> > >
> > > Shouldn't callers of division functions harden them against dividing by
> > > zero?
> >
> > Yes I think it'd be the correct solution.
>
> Thank you all. Do you mean like this?
>
> --- >8 ---
>
> diff --git a/drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c
> b/drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c
> index 88d3f9d7dd55..848d8e67304a 100644
> --- a/drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c
> +++ b/drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c
> @@ -79,11 +79,13 @@ struct fixed31_32 dc_fixpt_from_fraction(long long
> numerator, long long denomina
> unsigned long long arg2_value = arg2_negative ? -denominator :
> denominator;
>
> unsigned long long remainder;
> + unsigned long long res_value;
>
> /* determine integer part */
>
> - unsigned long long res_value = complete_integer_division_u64(
> - arg1_value, arg2_value, &remainder);
> + ASSERT(arg2_value);
> +
> + res_value = complete_integer_division_u64(arg1_value, arg2_value,
> &remainder);
>
> ASSERT(res_value <= LONG_MAX);
>
> @@ -214,8 +216,6 @@ struct fixed31_32 dc_fixpt_recip(struct fixed31_32 arg)
> * Good idea to use Newton's method
> */
>
> - ASSERT(arg.value);
> -
> return dc_fixpt_from_fraction(
> dc_fixpt_one.value,
> arg.value);
>
> With the above changes, there is no "falls through" objtool warning
> compiled with both clang 19 and the latest mainline clang 20.
I am somewhat surprised that changes anything because the ASSERT is not
stopping control flow so I would expect the same problem as before. I
guess it does not happen perhaps due to inlining differences? I looked
at this code briefly when I sent my initial message and I was not sure
where such a check should exist. It does not look like these functions
really do any sort of error handling.
> If you are OK with it, I will send a separate formal patch to handle
> this issue after doing some more testing.
It may still be worth doing this to get some initial thoughts from the
AMD DRM folks.
Cheers,
Nathan
next prev parent reply other threads:[~2024-12-23 21:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20241217010905.13054-1-yangtiezhu@loongson.cn>
[not found] ` <20241217015006.30305-1-yangtiezhu@loongson.cn>
[not found] ` <CAAhV-H4WpcWjrQdkm3Sx4DVbp=2oW9nNGAbNqR4BEmiryrptNQ@mail.gmail.com>
[not found] ` <20241218190558.g2hykmjgbny4n5i3@jpoimboe>
[not found] ` <CADnq5_PFcHzob4poLa86_K4yP5gUT7Ei4Rz5vSUofvZTmB48-g@mail.gmail.com>
[not found] ` <4bace457-cc26-13a3-bc90-ad6ad12bc2ed@loongson.cn>
2024-12-20 10:31 ` [PATCH v6 9/9] drm/amd/display: Mark dc_fixpt_from_fraction() noinline Peter Zijlstra
2024-12-20 22:34 ` Nathan Chancellor
2024-12-21 7:40 ` Xi Ruoyao
2024-12-22 4:27 ` Tiezhu Yang
2024-12-23 21:46 ` Nathan Chancellor [this message]
2024-12-25 9:43 ` Tiezhu Yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241223214645.GB1188382@ax162 \
--to=nathan@kernel.org \
--cc=alexdeucher@gmail.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=chenhuacai@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=loongarch@lists.linux.dev \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
--cc=xry111@xry111.site \
--cc=yangtiezhu@loongson.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox