On 2016年04月08日 13:29, Sergey Senozhatsky wrote: > 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()? > yep, you are right. I made a mistake.
> 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? > > good explanation. thanks > sysfs knob -> __init_printk_kthread() is protected by printk_sync_lock > mutex, obviously there can be parallel calls from user space. > > -ss >