On (04/08/16 12:04), Pan Xinhui wrote: [..] > > +/* > > + * Init async printk via late_initcall, after core/arch/device/etc. > > + * initialization. > > + */ > > +static __init int init_printk_kthread(void) > > +{ > > + printk_initcall_done = true; > > + return __init_printk_kthread(); > hello, > > One confusion, Why not use a lock to protect __init_printk_kthread from > parallel call? Otherwise I think there is a race. > But for simplicity, maybe you could write codes as below. > > + int ret = __init_printk_kthread(); > + printk_initcall_done = true; > + return ret; > > In my opinion, using a lock is better.
Hello, I though about this, but isn't late_initcall() happening before kernel starts /sbin/init? who can race with late_initcall() -> init_printk_kthread() -> __init_printk_kthread()? looking at static int __ref kernel_init(void *unused) { int ret; kernel_init_freeable(); /* need to finish all async __init code before freeing the memory */ async_synchronize_full(); free_initmem(); .. if (!try_to_run_init_process("/sbin/init") || !try_to_run_init_process("/etc/init") || !try_to_run_init_process("/bin/init") || !try_to_run_init_process("/bin/sh")) return 0; __init (and init_printk_kthread is __init) is finished and freed by the time kernel try_to_run_init_process. isn't it? sysfs knob -> __init_printk_kthread() is protected by printk_sync_lock mutex, obviously there can be parallel calls from user space. -ss