Re: [PATCH v2] mac80211: LLVMLinux: Remove VLAIS usage from mac80211

From: Behan Webster
Date: Sat Mar 08 2014 - 16:36:53 EST


On 03/08/14 06:53, Stanislaw Gruszka wrote:
On Fri, Mar 07, 2014 at 06:15:43PM -0800, Behan Webster wrote:
On 03/07/14 17:56, Joe Perches wrote:
On Fri, 2014-03-07 at 17:26 -0800, behanw@xxxxxxxxxxxxxxxxxx wrote:
From: Jan-Simon Möller <dl9pf@xxxxxx>

Replaced the use of a Variable Length Array In Struct (VLAIS) with a C99
compliant equivalent. This is the original VLAIS struct.
[]
diff --git a/net/mac80211/aes_ccm.c b/net/mac80211/aes_ccm.c
[]
@@ -23,12 +23,14 @@ void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
u8 *data, size_t data_len, u8 *mic)
{
struct scatterlist assoc, pt, ct[2];
- struct {
- struct aead_request req;
- u8 priv[crypto_aead_reqsize(tfm)];
- } aead_req;
- memset(&aead_req, 0, sizeof(aead_req));
+ char aead_req_data[sizeof(struct aead_request) +
+ crypto_aead_reqsize(tfm) +
+ CRYPTO_MINALIGN] CRYPTO_MINALIGN_ATTR;
Can this be a too large amount of stack?

Is crypto_aead_reqsize() limited to < ~1k?

Perhaps it'd be better to use kzalloc for this
or another reserved pool
No more stack being used than with the the original code. The stack
memory use is identical.
Could you explain that? It looks like aead_req_data can be bigger than
original struct aead_req up to CRYPTO_MINALIGN bytes. IOW adding
CRYPTO_MINALIGN to size seems unneeded as aead_request->__ctx alignment
requirement should by assured by proper sizeof(struct aead_request).
True, possibly a few more bytes. Nothing significant. However, I will fix this too.

Besides, why not add VLAIS feature to llvm instead of fixing all
programs that use it?
You aren't the first to ask this (I certainly get asked this regularly). :)

VLAIS is specifically disallowed by the C89, C99, and later C standards. VLAIS is also not an officially documented feature of gcc (It is a side effect from the support of other languages supported by the gcc toolchain). The LLVM project won't add VLAIS support for these reasons, and because it would unnecessarily complicate their compiler architecture with almost no appreciable gain.

VLAIS is only used in a handful of places in the kernel (almost exclusively in crypto related code), so changing it in the kernel not only is easier, but also makes the kernel code C99 (and beyond) compliant. Being standards compliant is important not only for clang, but also for newer versions of gcc (though not yet in the case of VLAIS).

VLAIS should not be confused with Variable Length Arrays (VLA) and flexible members (undefined or zero length arrays at the end of a non embedded struct) which are both explicitly in the C standards and supported by both gcc and clang.

Behan

--
Behan Webster
behanw@xxxxxxxxxxxxxxxxxx

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/