On Wed, 14 Dec 2016, Guenter Roeck wrote:

> avr32:allnoconfig:
> 
> kernel/built-in.o: In function `do_adjtimex':
> (.text+0x1d748): undefined reference to `posix_timer_event'
> make[1]: *** [vmlinux] Error 1
> 
> metag:allnoconfig:
> 
> kernel/built-in.o: In function `alarm_handle_timer':
> alarmtimer.c:(.text.alarm_handle_timer+0x38): undefined reference to
> `posix_timer_event'
> 
> openrisc:allnoconfig:
> 
> kernel/built-in.o: In function `alarm_handle_timer':
> alarmtimer.c:(.text+0x3fca4): undefined reference to `posix_timer_event'
> 
> unicore32:allnoconfig:
> 
> kernel/built-in.o: In function `alarm_handle_timer':
> memremap.c:(.text+0x31c1c): undefined reference to `posix_timer_event'
> 
> Since I don't run allnoconfig builds for all architectures, I strongly suspect
> that more are affected.

This is a known problem. Oddly enough only those "less popular" 
architectures are affected.

> Looking into alarmtimer.c, with seems to call posix_timer_event() 
> unconditionally, I don't entirely understand how this can work in the 
> first place. Maybe I am missing something, though.

The magic is in alarmtimer_init():

        if (IS_ENABLED(CONFIG_POSIX_TIMERS)) {
                posix_timers_register_clock(CLOCK_REALTIME_ALARM, &alarm_clock);
                posix_timers_register_clock(CLOCK_BOOTTIME_ALARM, &alarm_clock);
        }

If CONFIG_POSIX_TIMERS is not enabled, the condition becomes a constant 
zero. The posix_timers_register_clock calls are then optimized away by 
the compiler. In turn the alarm_clock structure has no longer any 
reference to it and therefore is also optimized away, including its 
method functions such as alarm_timer_create() and finally 
alarm_handle_timer().

But for some reasons, some gcc versions (mainly for "secondary" 
architectures) fail to optimize away all that code, and a dead reference 
to posix_timer_event() remains in the compiled code.

There is a fix already queued in the mm tree. It goes like this:

    posix-timers: give lazy compilers some help optimizing code away
    
    The OpenRISC compiler (so far) fails to optimize away a large portion
    of code containing a reference to posix_timer_event in alarmtimer.c when
    CONFIG_POSIX_TIMERS is unset. Let's give it a direct clue to let the build
    succeed.
    
    This fixes
    [linux-next:master 6682/7183] alarmtimer.c:undefined reference to 
`posix_timer_event'
    reported by kbuild test robot.
    
    Signed-off-by: Nicolas Pitre <[email protected]>
    Cc: Thomas Gleixner <[email protected]>
    Cc: Josh Triplett <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>

diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 9b08ca391a..3921cf7fea 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -516,7 +516,8 @@ static enum alarmtimer_restart alarm_handle_timer(struct 
alarm *alarm,
 
        spin_lock_irqsave(&ptr->it_lock, flags);
        if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) {
-               if (posix_timer_event(ptr, 0) != 0)
+               if (IS_ENABLED(CONFIG_POSIX_TIMERS) &&
+                   posix_timer_event(ptr, 0) != 0)
                        ptr->it_overrun++;
        }
 

Reply via email to