From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Kevin Hao <haokexin@gmail.com>
Cc: linuxppc <linuxppc-dev@lists.ozlabs.org>
Subject: Re: [PATCH v2 2/3] powerpc: use the jump label for cpu_has_feature
Date: Wed, 27 Nov 2013 13:45:41 +1100 [thread overview]
Message-ID: <1385520341.9218.89.camel@pasglop> (raw)
In-Reply-To: <1378100726-32545-3-git-send-email-haokexin@gmail.com>
On Mon, 2013-09-02 at 13:45 +0800, Kevin Hao wrote:
> The cpu features are fixed once the probe of cpu features are done.
> And the function cpu_has_feature() does be used in some hot path.
> The checking of the cpu features for each time of invoking of
> cpu_has_feature() seems suboptimal. This tries to reduce this
> overhead of this check by using jump label. But we can only use
> the jump label for this check only after the execution of
> jump_label_init(), so we introduce another jump label to
> still do the feature check by default before all the cpu
> feature jump labels are initialized.
So I was looking at these and ...
> +static inline int cpu_has_feature(unsigned long feature)
> +{
> + if (CPU_FTRS_ALWAYS & feature)
> + return 1;
> +
> + if (!(CPU_FTRS_POSSIBLE | feature))
> + return 0;
> +
> + if (static_key_false(&cpu_feat_keys_enabled)) {
> + int i = __builtin_ctzl(feature);
> +
> + return static_key_false(&cpu_feat_keys[i]);
> + } else
> + return !!(cur_cpu_spec->cpu_features & feature);
> +}
This is gross :-)
Have you checked the generated code ? I'm worried that we end up hitting
at least 2 branches every time, which might be enough to defeat the
purposes even if they are unconditional in term of performance and
code size...
Cheers,
Ben.
> +#else
> static inline int cpu_has_feature(unsigned long feature)
> {
> return (CPU_FTRS_ALWAYS & feature) ||
> @@ -10,5 +36,6 @@ static inline int cpu_has_feature(unsigned long feature)
> & cur_cpu_spec->cpu_features
> & feature);
> }
> +#endif
>
> #endif /* __ASM_POWERPC_CPUFEATURE_H */
> diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
> index 597d954..50bd216 100644
> --- a/arch/powerpc/kernel/cputable.c
> +++ b/arch/powerpc/kernel/cputable.c
> @@ -21,6 +21,7 @@
> #include <asm/prom.h> /* for PTRRELOC on ARCH=ppc */
> #include <asm/mmu.h>
> #include <asm/setup.h>
> +#include <asm/cpufeatures.h>
>
> struct cpu_spec* cur_cpu_spec = NULL;
> EXPORT_SYMBOL(cur_cpu_spec);
> @@ -2258,3 +2259,25 @@ struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
>
> return NULL;
> }
> +
> +#ifdef CONFIG_JUMP_LABEL
> +struct static_key cpu_feat_keys[MAX_CPU_FEATURES];
> +struct static_key cpu_feat_keys_enabled;
> +
> +static __init int cpu_feat_keys_init(void)
> +{
> + int i;
> +
> + for (i = 0; i < MAX_CPU_FEATURES; i++) {
> + unsigned long f = 1 << i;
> +
> + if (cur_cpu_spec->cpu_features & f)
> + static_key_slow_inc(&cpu_feat_keys[i]);
> + }
> +
> + static_key_slow_inc(&cpu_feat_keys_enabled);
> +
> + return 0;
> +}
> +early_initcall(cpu_feat_keys_init);
> +#endif
next prev parent reply other threads:[~2013-11-27 2:45 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-02 5:45 [PATCH v2 0/3] powerpc: use jump label for cpu/mmu_has_feature Kevin Hao
2013-09-02 5:45 ` [PATCH v2 1/3] powerpc: move the cpu_has_feature to a separate file Kevin Hao
2013-09-02 5:45 ` [PATCH v2 2/3] powerpc: use the jump label for cpu_has_feature Kevin Hao
2013-11-27 2:45 ` Benjamin Herrenschmidt [this message]
2013-12-25 5:58 ` Kevin Hao
2013-09-02 5:45 ` [PATCH v2 3/3] powerpc: use jump label for mmu_has_feature Kevin Hao
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=1385520341.9218.89.camel@pasglop \
--to=benh@kernel.crashing.org \
--cc=haokexin@gmail.com \
--cc=linuxppc-dev@lists.ozlabs.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.