Messages in this thread | | | Date | Fri, 8 Apr 2016 14:29:27 +0900 | From | Sergey Senozhatsky <> | Subject | Re: [PATCH v11 3/3] printk: make printk.synchronous param rw |
| |
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
| |