Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757319AbcDHF2C (ORCPT ); Fri, 8 Apr 2016 01:28:02 -0400 Received: from mail-pf0-f173.google.com ([209.85.192.173]:33151 "EHLO mail-pf0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753735AbcDHF2A (ORCPT ); Fri, 8 Apr 2016 01:28:00 -0400 Date: Fri, 8 Apr 2016 14:29:27 +0900 From: Sergey Senozhatsky To: Pan Xinhui Cc: Sergey Senozhatsky , Andrew Morton , Jan Kara , Petr Mladek , Tejun Heo , Tetsuo Handa , linux-kernel@vger.kernel.org, Byungchul Park , Sergey Senozhatsky Subject: Re: [PATCH v11 3/3] printk: make printk.synchronous param rw Message-ID: <20160408052927.GA614@swordfish> References: <1460050307-3718-1-git-send-email-sergey.senozhatsky@gmail.com> <1460050307-3718-4-git-send-email-sergey.senozhatsky@gmail.com> <57072DE7.50806@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <57072DE7.50806@linux.vnet.ibm.com> User-Agent: Mutt/1.6.0 (2016-04-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1551 Lines: 54 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