Re: [PATCH 6/9] MIPS: Remove "weak" from get_c0_compare_int() declaration

From: James Hogan
Date: Mon Jul 13 2015 - 05:36:25 EST


On 13/07/15 00:11, Bjorn Helgaas wrote:
> Weak header file declarations are error-prone because they make every
> definition weak, and the linker chooses one based on link order (see
> 10629d711ed7 ("PCI: Remove __weak annotation from pcibios_get_phb_of_node
> decl")).
>
> get_c0_compare_int() is defined in several files. Each definition is weak,
> so I assume Kconfig prevents two or more from being included. The caller
> contains default code used when get_c0_compare_int() isn't defined at all.
>
> Add a weak get_c0_compare_int() definition with the default code and remove
> the weak annotation from the declaration.
>
> Then the platform implementations will be strong and will override the weak
> default. If multiple platforms are ever configured in, we'll get a link
> error instead of calling a random platform's implementation.
>
> Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>

Reviewed-by: James Hogan <james.hogan@xxxxxxxxxx>

Cheers
James

> ---
> arch/mips/include/asm/time.h | 2 +-
> arch/mips/kernel/cevt-r4k.c | 11 +++++++----
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h
> index ce6a7d5..44a9c3a 100644
> --- a/arch/mips/include/asm/time.h
> +++ b/arch/mips/include/asm/time.h
> @@ -51,7 +51,7 @@ extern int get_c0_perfcount_int(void);
> /*
> * Initialize the calling CPU's compare interrupt as clockevent device
> */
> -extern unsigned int __weak get_c0_compare_int(void);
> +extern unsigned int get_c0_compare_int(void);
> extern int r4k_clockevent_init(void);
>
> static inline int mips_clockevent_init(void)
> diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c
> index d70c4d8..cc7cc46 100644
> --- a/arch/mips/kernel/cevt-r4k.c
> +++ b/arch/mips/kernel/cevt-r4k.c
> @@ -174,6 +174,11 @@ int c0_compare_int_usable(void)
> return 1;
> }
>
> +unsigned int __weak get_c0_compare_int(void)
> +{
> + return MIPS_CPU_IRQ_BASE + cp0_compare_irq;
> +}
> +
> int r4k_clockevent_init(void)
> {
> unsigned int cpu = smp_processor_id();
> @@ -189,11 +194,9 @@ int r4k_clockevent_init(void)
> /*
> * With vectored interrupts things are getting platform specific.
> * get_c0_compare_int is a hook to allow a platform to return the
> - * interrupt number of it's liking.
> + * interrupt number of its liking.
> */
> - irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
> - if (get_c0_compare_int)
> - irq = get_c0_compare_int();
> + irq = get_c0_compare_int();
>
> cd = &per_cpu(mips_clockevent_device, cpu);
>
>

Attachment: signature.asc
Description: OpenPGP digital signature