All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Laight <david.laight.linux@gmail.com>
To: Nicolas Pitre <npitre@baylibre.com>
Cc: "Andrew Morton" <akpm@linux-foundation.org>,
	"Thomas Weißschuh" <linux@weissschuh.net>,
	"Oleg Nesterov" <oleg@redhat.com>,
	"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Biju Das" <biju.das.jz@bp.renesas.com>,
	linux-kernel@vger.kernel.org,
	"Linus Torvalds" <torvalds@linux-foundation.org>
Subject: Re: [PATCH v2] mul_u64_u64_div_u64: fix the division-by-zero behavior
Date: Mon, 16 Jun 2025 22:26:29 +0100	[thread overview]
Message-ID: <20250616222629.620830f6@pumpkin> (raw)
In-Reply-To: <q246p466-1453-qon9-29so-37105116009q@onlyvoer.pbz>

On Mon, 16 Jun 2025 15:22:44 -0400 (EDT)
Nicolas Pitre <npitre@baylibre.com> wrote:

> The current implementation forces a compile-time 1/0 division, which
> generates an undefined instruction (ud2 on x86) rather than a proper
> runtime division-by-zero exception.
> 
> Change to trigger an actual div-by-0 exception at runtime, consistent
> with other division operations. Use a non-1 dividend to prevent the
> compiler from optimizing the division into a comparison.

Given there is a definite 'plan' to avoid adding more BUG() to code
I'm not at all sure generating UB here is right at all.

I don't know the best solution though.
To my mind returning zero for divide by zero and ~0 for overflow is least
likely to cause real grief later on in the called code.

	David

> 
> Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
> ---
> 
> Change from v1 (http://lore.kernel.org/all/q2o7r916-5601-11pn-30pn-8n5ns6p079o7@onlyvoer.pbz):
> - use OPTIMIZER_HIDE_VAR() in place of the open coded incantation.
> 
> diff --git a/lib/math/div64.c b/lib/math/div64.c
> index 5faa29208bdb..bf77b9843175 100644
> --- a/lib/math/div64.c
> +++ b/lib/math/div64.c
> @@ -212,12 +212,13 @@ u64 mul_u64_u64_div_u64(u64 a, u64 b, u64 c)
>  
>  #endif
>  
> -	/* make sure c is not zero, trigger exception otherwise */
> -#pragma GCC diagnostic push
> -#pragma GCC diagnostic ignored "-Wdiv-by-zero"
> -	if (unlikely(c == 0))
> -		return 1/0;
> -#pragma GCC diagnostic pop
> +	/* make sure c is not zero, trigger runtime exception otherwise */
> +	if (unlikely(c == 0)) {
> +		unsigned long zero = 0;
> +
> +		OPTIMIZER_HIDE_VAR(zero);
> +		return ~0UL/zero;
> +	}
>  
>  	int shift = __builtin_ctzll(c);
>  


  reply	other threads:[~2025-06-16 21:26 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-16 19:22 [PATCH v2] mul_u64_u64_div_u64: fix the division-by-zero behavior Nicolas Pitre
2025-06-16 21:26 ` David Laight [this message]
2025-06-16 21:54   ` Nicolas Pitre

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=20250616222629.620830f6@pumpkin \
    --to=david.laight.linux@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=biju.das.jz@bp.renesas.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@weissschuh.net \
    --cc=npitre@baylibre.com \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=torvalds@linux-foundation.org \
    --cc=u.kleine-koenig@baylibre.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.