All of lore.kernel.org
 help / color / mirror / Atom feed
From: Grant Likely <grant.likely@secretlab.ca>
To: Haojian Zhuang <haojian.zhuang@linaro.org>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	viro@zeniv.linux.org.uk, rusty@rustcorp.com.au,
	hpa@linux.intel.com, jim.cromie@gmail.com,
	linux-kernel@vger.kernel.org,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Linus Walleij <linus.walleij@linaro.org>,
	arnd@arndb.de, broonie@opensource.wolfsonmicro.com,
	Patch Tracking <patches@linaro.org>
Subject: Re: [PATCH] driver core: add wait event for deferred probe
Date: Wed, 13 Feb 2013 21:36:23 +0000	[thread overview]
Message-ID: <20130213213624.079BA3E3557@localhost> (raw)
In-Reply-To: <CAD6h2NRGiD=hDOjF8CBDrKuBZm-ALOdcj8mT=h6Cde4PuU=AHw@mail.gmail.com>

On Tue, 12 Feb 2013 10:52:10 +0800, Haojian Zhuang <haojian.zhuang@linaro.org> wrote:
> On 12 February 2013 07:10, Andrew Morton <akpm@linux-foundation.org> wrote:
> > On Sun, 10 Feb 2013 00:57:57 +0800
> > Haojian Zhuang <haojian.zhuang@linaro.org> wrote:
> >
> >> do_initcalls() could call all driver initialization code in kernel_init
> >> thread. It means that probe() function will be also called from that
> >> time. After this, kernel could access console & release __init section
> >> in the same thread.
> >>
> >> But if device probe fails and moves into deferred probe list, a new
> >> thread is created to reinvoke probe. If the device is serial console,
> >> kernel has to open console failure & release __init section before
> >> reinvoking failure. Because there's no synchronization mechanism.
> >> Now add wait event to synchronize after do_initcalls().
> >
> > It sounds like this:
> >
> > static int __ref kernel_init(void *unused)
> > {
> >         kernel_init_freeable();
> >         /* need to finish all async __init code before freeing the memory */
> >         async_synchronize_full();
> >
> > is designed to prevent the problem you describe?
> >
> It can't prevent the problem that I described. Because deferred_probe()
> is introduced recently.
> 
> All synchronization should be finished just after do_initcalls(). Since
> load_default_modules() is also called in the end of kernel_init_freeable(),
> I'm not sure that whether I could remove async_synchronize_full()
> here. So I didn't touch it.
> 
> >> --- a/init/main.c
> >> +++ b/init/main.c
> >> @@ -786,6 +786,7 @@ static void __init do_basic_setup(void)
> >>       do_ctors();
> >>       usermodehelper_enable();
> >>       do_initcalls();
> >> +     wait_for_device_probe();
> >>  }
> >
> > Needs a nice comment here explaining what's going on.
> 
> No problem. I'll add comment here.

Actually, this approach will create new problems. There is no guarantee
that a given device will be able to initialize before exiting
do_basic_setup(). If, for instance, a device depends on a resource
provided by a module, then it will just keep deferring. In that case
you've got a hung kernel.

I think what you really want is the following:

 static int deferred_probe_initcall(void)
 {
	deferred_wq = create_singlethread_workqueue("deferwq");
	if (WARN_ON(!deferred_wq))
		return -ENOMEM;

	driver_deferred_probe_enable = true;
+	deferred_probe_work_func(NULL);
-	driver_deferred_probe_trigger();
	return 0;
 }
 late_initcall(deferred_probe_initcall);

Or something similar. That would guarantee that as many passes as are needed
(which in practical terms only means a couple) for device probing to
settle down before exiting the initcall processing. That should achieve
the effect you desire.

It still masks the __init section issue by making it a lot less likely,
but it does ensure that all of the built-in driver dependency order
issues are processed before continuing on to userspace.

g.

-- 
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.

  reply	other threads:[~2013-02-13 21:36 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-09 16:57 [PATCH] driver core: add wait event for deferred probe Haojian Zhuang
2013-02-11 23:10 ` Andrew Morton
2013-02-12  2:52   ` Haojian Zhuang
2013-02-13 21:36     ` Grant Likely [this message]
2013-02-14  3:27       ` anish singh
2013-02-14  9:56         ` Arnd Bergmann
2013-02-14 10:04           ` Russell King - ARM Linux
2013-02-14 11:08             ` Arnd Bergmann
2013-02-14 16:33         ` Grant Likely
2013-02-14 17:42           ` anish kumar
2013-02-14 15:52       ` Haojian Zhuang
2013-02-14 15:57         ` Arnd Bergmann
2013-02-14 16:04           ` Haojian Zhuang
2013-02-14 16:50             ` Arnd Bergmann
2013-02-14 16:58               ` Haojian Zhuang
2013-02-14 17:54                 ` Grant Likely
2013-02-14 17:42           ` Grant Likely
2013-02-14 17:38         ` Grant Likely

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130213213624.079BA3E3557@localhost \
    --to=grant.likely@secretlab.ca \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=haojian.zhuang@linaro.org \
    --cc=hpa@linux.intel.com \
    --cc=jim.cromie@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=patches@linaro.org \
    --cc=rusty@rustcorp.com.au \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.