extern struct vdso_data *vdso_data;
 
-void vdso_getcpu_init(void);
+int vdso_getcpu_init(void);
 
 #endif /* __ASSEMBLY__ */
 #endif /* __S390_VDSO_H__ */
 
 } vdso_data_store __page_aligned_data;
 struct vdso_data *vdso_data = vdso_data_store.data;
 
-void vdso_getcpu_init(void)
+int vdso_getcpu_init(void)
 {
        set_tod_programmable_field(smp_processor_id());
+       return 0;
 }
+early_initcall(vdso_getcpu_init); /* Must be called before SMP init */
 
 /*
  * This is called from binfmt_elf, we create the special vma for the
 {
        int i;
 
-       vdso_getcpu_init();
        /* Calculate the size of the 64 bit vDSO */
        vdso64_pages = ((&vdso64_end - &vdso64_start
                         + PAGE_SIZE - 1) >> PAGE_SHIFT) + 1;
 
        return 0;
 }
-early_initcall(vdso_init);
+arch_initcall(vdso_init);