async_schedule
相关函数:
<linux/schedule.h>
typedef void (*async_func_t) (void *data, async_cookie_t cookie);
extern async_cookie_t async_schedule(async_func_t func *ptr, void *data);
extern void async_synchronize_cookie(async_cookie_t cookie);
extern void async_synchronize_full(void);
实例
#include <linux/async.h>
#include <asm/io.h>
#include <asm/cacheflush.h>
static async_cookie_t populate_initrootfs_cookie;
void __init wait_populate_initrootfs_done(void)
{
if(populate_initrootfs_cookie)
async_synchronize_cookie(populate_initrootfs_cookie);
}
u32 imx_get_cpu_arg(int cpu);
void imx_set_cpu_arg(int cpu, u32 arg);
void imx_enable_cpu(int cpu, bool enable);
static void __init async_populate_initrootfs(void *data, async_cookie_t cookie)
{
char* errmsg;
#ifdef CONFIG_UBOOT_SMP_BOOT
int ret;
unsigned long timeout = jiffies + msecs_to_jiffies(5000);
if (!cpu_possible(1) || cpu_online(1)) {
printk(KERN_WARNING "UBOOT_SMP_BOOT enabled but secondary CPU is in wrong state\n");
goto unpack;
}
while ((ret = imx_get_cpu_arg(1)) == 0)
if (time_after(jiffies, timeout))
break;
imx_enable_cpu(1, false);
imx_set_cpu_arg(1, 0);
if (ret <= 0) {
printk(KERN_ERR "SMP load cpio fail %d\n", ret);
goto out;
}
else
printk(KERN_ERR "SMP load cpio success %x\n", ret);
unpack:
#endif
printk(KERN_ERR "Unpacking initramfs...\n");
errmsg = unpack_to_rootfs((char *)initrd_start, initrd_end - initrd_start);
if (errmsg)
printk(KERN_ERR "Initramfs unpacking failed: %s\n", errmsg);
else
printk(KERN_ERR "Unpacking initramfs done\n");
out:
free_initrd();
}
static int __init populate_initrootfs(void)
{
int err;
printk(KERN_ERR "populate_initrootfs\n");
err = sys_mkdir((const char __user __force *) "/dev", 0755);
if (err < 0)
goto out;
err = sys_mknod((const char __user __force *) "/dev/console",
S_IFCHR | S_IRUSR | S_IWUSR,
new_encode_dev(MKDEV(5, 1)));
if (err < 0)
goto out;
err = sys_mkdir((const char __user __force *) "/root", 0700);
if (err < 0)
goto out;
populate_initrootfs_cookie =
async_schedule(async_populate_initrootfs, NULL);
return 0;
out:
printk(KERN_WARNING "Failed to create a rootfs for initroot\n");
return err;
}
rootfs_initcall(populate_initrootfs);