All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Williams <dan.j.williams@intel.com>
To: Lukas Wunner <lukas@wunner.de>, Dan Williams <dan.j.williams@intel.com>
Cc: David Howells <dhowells@redhat.com>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	"David S. Miller" <davem@davemloft.net>,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>,
	<keyrings@vger.kernel.org>, <linux-crypto@vger.kernel.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ard Biesheuvel <ardb@kernel.org>,
	Jarkko Sakkinen <jarkko@kernel.org>,
	"Nick Desaulniers" <ndesaulniers@google.com>,
	Nathan Chancellor <nathan@kernel.org>
Subject: Re: [PATCH v2] X.509: Introduce scope-based x509_certificate allocation
Date: Mon, 12 Feb 2024 12:57:02 -0800	[thread overview]
Message-ID: <65ca861e14779_5a7f2949e@dwillia2-xfh.jf.intel.com.notmuch> (raw)
In-Reply-To: <20240212192009.GA13884@wunner.de>

Lukas Wunner wrote:
> On Mon, Feb 12, 2024 at 11:07:06AM -0800, Dan Williams wrote:
> > Lukas Wunner wrote:
> > > In x509_cert_parse(), add a hint for the compiler that kzalloc() never
> > > returns an ERR_PTR().  Otherwise the compiler adds a gratuitous IS_ERR()
> > > check on return.  Introduce a handy assume() macro for this which can be
> > > re-used elsewhere in the kernel to provide hints for the compiler.
> [...]
> > >  	cert = kzalloc(sizeof(struct x509_certificate), GFP_KERNEL);
> > > +	assume(!IS_ERR(cert)); /* Avoid gratuitous IS_ERR() check on return */
> > 
> > I like the idea of assume() I just wonder if it should move inside of
> > the kmalloc() inline definition itself? I.e. solve the "cleanup.h" vs
> > ERR_PTR() rough edge more generally.
> 
> I've tried that but total vmlinux size increased by 448 bytes.
> It seems to cause additional code or padding somewhere.  To avoid
> pushback because of that, I confined it to just x509_cert_parse().
> 
> I should mention that there's a coccinelle rule which warns if
> someone performs an IS_ERR() check on a kmalloc'ed pointer
> (scripts/coccinelle/null/eno.cocci).  Which is why there likely
> aren't any offenders in the tree.  That rule is triggered by
> this assume() clause, but it's obviously a false-positive.
> I'll look into suppressing that warning if/when this patch
> gets accepted.
> 
> I should also mention that assume() currently only has an effect
> with gcc.  clang-15 just ignored it during my testing.

Ah, ok, and I now I see you already addressed that in the changelog for
v1, but dropped that comment for v2. Might I suggest the following:

> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> index bb1339c..384803e 100644
> --- a/include/linux/compiler.h
> +++ b/include/linux/compiler.h
> @@ -139,6 +139,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
>  } while (0)
>  #endif
>  
> +#define assume(cond) do if(!(cond)) __builtin_unreachable(); while(0)

s/__builtin_unreachable()/unreachable()/?

Move this to cleanup.h and add extend the DEFINE_FREE() comment about
its usage:

diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h
index c2d09bc4f976..b4380a69ac72 100644
--- a/include/linux/cleanup.h
+++ b/include/linux/cleanup.h
@@ -56,6 +56,32 @@
  *	return p;
  *
  * Without the NULL test it turns into a mess and the compiler can't help us.
+ *
+ * NOTE2: For scoped based resource management in paths that want to
+ * cleanup an allocation *and* return an ERR_PTR() on failure, the
+ * compiler needs more help. Use an IS_ERR() check in the DEFINE_FREE()
+ * definition and then use assume() to tell the compiler that the
+ * allocation never returns an ERR_PTR().
+ *
+ * Ex.
+ *
+ * DEFINE_FREE(free_obj, struct obj *, if (!IS_ERR(_T)) free_obj(_T))
+ *
+ * struct obj *create_obj(...)
+ * {
+ *	struct obj *p __free(free_obj) = kzalloc(...);
+ *	int rc;
+ *
+ *	assume(!IS_ERR(p));
+ *	if (!p)
+ *		return ERR_PTR(-ENOMEM);
+ *
+ *	rc = init_obj(p);
+ *	if (rc)
+ *		return PTR_ERR(rc);
+ *
+ *	return_ptr(p);
+ * }
  */
 
 #define DEFINE_FREE(_name, _type, _free) \

  reply	other threads:[~2024-02-12 20:57 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-12 11:24 [PATCH v2] X.509: Introduce scope-based x509_certificate allocation Lukas Wunner
2024-02-12 12:19 ` Andy Shevchenko
2024-02-12 16:36   ` Lukas Wunner
2024-02-12 18:10 ` Jarkko Sakkinen
2024-02-12 19:07 ` Dan Williams
2024-02-12 19:20   ` Lukas Wunner
2024-02-12 20:57     ` Dan Williams [this message]
2024-02-13  5:04       ` Lukas Wunner

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=65ca861e14779_5a7f2949e@dwillia2-xfh.jf.intel.com.notmuch \
    --to=dan.j.williams@intel.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=ardb@kernel.org \
    --cc=davem@davemloft.net \
    --cc=dhowells@redhat.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jarkko@kernel.org \
    --cc=keyrings@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=peterz@infradead.org \
    /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.