Ack: [PATCH Trusty SRU] net: avoid dependency of net_get_random_once on nop patching
Brad Figg
brad.figg at canonical.com
Mon Jun 16 21:44:26 UTC 2014
On 06/16/2014 02:37 PM, Tim Gardner wrote:
> From: Hannes Frederic Sowa <hannes at stressinduktion.org>
>
> BugLink: http://bugs.launchpad.net/bugs/1330671
>
> net_get_random_once depends on the static keys infrastructure to patch up
> the branch to the slow path during boot. This was realized by abusing the
> static keys api and defining a new initializer to not enable the call
> site while still indicating that the branch point should get patched
> up. This was needed to have the fast path considered likely by gcc.
>
> The static key initialization during boot up normally walks through all
> the registered keys and either patches in ideal nops or enables the jump
> site but omitted that step on x86 if ideal nops where already placed at
> static_key branch points. Thus net_get_random_once branches not always
> became active.
>
> This patch switches net_get_random_once to the ordinary static_key
> api and thus places the kernel fast path in the - by gcc considered -
> unlikely path. Microbenchmarks on Intel and AMD x86-64 showed that
> the unlikely path actually beats the likely path in terms of cycle cost
> and that different nop patterns did not make much difference, thus this
> switch should not be noticeable.
>
> Fixes: a48e42920ff38b ("net: introduce new macro net_get_random_once")
> Reported-by: Tuomas Räsänen <tuomasjjrasanen at tjjr.fi>
> Cc: Linus Torvalds <torvalds at linux-foundation.org>
> Signed-off-by: Hannes Frederic Sowa <hannes at stressinduktion.org>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 3d4405226d27b3a215e4d03cfa51f536244e5de7)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
> include/linux/net.h | 15 ++++-----------
> net/core/utils.c | 8 ++++----
> 2 files changed, 8 insertions(+), 15 deletions(-)
>
> diff --git a/include/linux/net.h b/include/linux/net.h
> index 69be3e6..4b425b3 100644
> --- a/include/linux/net.h
> +++ b/include/linux/net.h
> @@ -251,24 +251,17 @@ do { \
> bool __net_get_random_once(void *buf, int nbytes, bool *done,
> struct static_key *done_key);
>
> -#ifdef HAVE_JUMP_LABEL
> -#define ___NET_RANDOM_STATIC_KEY_INIT ((struct static_key) \
> - { .enabled = ATOMIC_INIT(0), .entries = (void *)1 })
> -#else /* !HAVE_JUMP_LABEL */
> -#define ___NET_RANDOM_STATIC_KEY_INIT STATIC_KEY_INIT_FALSE
> -#endif /* HAVE_JUMP_LABEL */
> -
> #define net_get_random_once(buf, nbytes) \
> ({ \
> bool ___ret = false; \
> static bool ___done = false; \
> - static struct static_key ___done_key = \
> - ___NET_RANDOM_STATIC_KEY_INIT; \
> - if (!static_key_true(&___done_key)) \
> + static struct static_key ___once_key = \
> + STATIC_KEY_INIT_TRUE; \
> + if (static_key_true(&___once_key)) \
> ___ret = __net_get_random_once(buf, \
> nbytes, \
> &___done, \
> - &___done_key); \
> + &___once_key); \
> ___ret; \
> })
>
> diff --git a/net/core/utils.c b/net/core/utils.c
> index 2f737bf..eed3433 100644
> --- a/net/core/utils.c
> +++ b/net/core/utils.c
> @@ -348,8 +348,8 @@ static void __net_random_once_deferred(struct work_struct *w)
> {
> struct __net_random_once_work *work =
> container_of(w, struct __net_random_once_work, work);
> - if (!static_key_enabled(work->key))
> - static_key_slow_inc(work->key);
> + BUG_ON(!static_key_enabled(work->key));
> + static_key_slow_dec(work->key);
> kfree(work);
> }
>
> @@ -367,7 +367,7 @@ static void __net_random_once_disable_jump(struct static_key *key)
> }
>
> bool __net_get_random_once(void *buf, int nbytes, bool *done,
> - struct static_key *done_key)
> + struct static_key *once_key)
> {
> static DEFINE_SPINLOCK(lock);
> unsigned long flags;
> @@ -382,7 +382,7 @@ bool __net_get_random_once(void *buf, int nbytes, bool *done,
> *done = true;
> spin_unlock_irqrestore(&lock, flags);
>
> - __net_random_once_disable_jump(done_key);
> + __net_random_once_disable_jump(once_key);
>
> return true;
> }
>
--
Brad Figg brad.figg at canonical.com http://www.canonical.com
More information about the kernel-team
mailing list