All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Williams <pwil3058@bigpond.net.au>
To: Matt Helsley <matthltc@us.ibm.com>
Cc: Andrew Morton <akpm@osdl.org>,
	Linux-Kernel <linux-kernel@vger.kernel.org>,
	Jes Sorensen <jes@sgi.com>,
	LSE-Tech <lse-tech@lists.sourceforge.net>,
	Chandra S Seetharaman <sekharan@us.ibm.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	John T Kohl <jtk@us.ibm.com>, Balbir Singh <balbir@in.ibm.com>,
	Shailabh Nagar <nagar@watson.ibm.com>
Subject: Re: [PATCH 00/11] Task watchers:  Introduction
Date: Thu, 22 Jun 2006 11:11:05 +1000	[thread overview]
Message-ID: <4499EE29.9020703@bigpond.net.au> (raw)
In-Reply-To: <1150936337.21787.1114.camel@stark>

Matt Helsley wrote:
> On Thu, 2006-06-22 at 09:04 +1000, Peter Williams wrote:
>> Matt Helsley wrote:
>>> On Wed, 2006-06-21 at 21:41 +1000, Peter Williams wrote:
>>>> Peter Williams wrote:
>>>>> Matt Helsley wrote:
>>>>>> On Wed, 2006-06-21 at 15:41 +1000, Peter Williams wrote:
>>>>>>> On a related note, I can't see where the new task's notify field gets 
>>>>>>> initialized during fork.
>>>>>> It's initialized in kernel/sys.c:notify_per_task_watchers(), which calls
>>>>>> RAW_INIT_NOTIFIER_HEAD(&task->notify) in response to WATCH_TASK_INIT.
>>>>> I think that's too late.  It needs to be done at the start of 
>>>>> notify_watchers() before any other watchers are called for the new task.
>>> 	I don't see why you think it's too late. It needs to be initialized
>>> before it's used. Waiting until notify_per_task_watchers() is called
>>> with WATCH_TASK_INIT does this.
>> I probably didn't understand the code well enough.  I'm still learning 
>> how it all hangs together :-).
>>
>>>> On second thoughts, it would simpler just before the WATCH_TASK_INIT 
>>>> call in copy_process() in fork.c.  It can be done unconditionally there.
>>>>
>>>> Peter
>>> 	That would work. It would not simplify the control flow of the code.
>>> The branch for WATCH_TASK_INIT in notify_per_task_watchers() is
>>> unavoidable; we need to call the parent task's chain in that case since
>>> we know the child task's is empty.
>>>
>>> 	It is also counter to one goal of the patches -- reducing the "clutter"
>>> in these paths. Arguably task watchers is the same kind of clutter that
>>> existed before. However, it is a means of factoring such clutter into
>>> fewer instances (ideally one) of the pattern.
>> Maybe a few comments in the code to help reviewers such as me learn how 
>> it works more quickly would be worthwhile.
> 
> Good point. I'll keep this in mind as I consider the multi-chain
> approach suggested by Andrew -- I suspect improvments in my commenting
> will be even more critical there.
> 
>> BTW as a former user of PAGG, I think there are ideas in the PAGG 
>> implementation that you should look at.  In particular:
>>
>> 1. The use of an array of function pointers (one for each hook) can cut 
>> down on the overhead.  The notifier_block only needs to contain a 
>> pointer to the array so there's no increase in the size of that 
>> structure.  Within the array a null pointer would mean "don't bother 
>> calling".  Only one real array needs to exist even for per task as 
>> they're all using the same functions (just separate data).  It removes 
>> the need for a switch statement in the client's function as well as 
>> saving on unnecessary function calls.
> 
> 	I don't think having an explicit array of function pointers is likely
> to be as fast as a switch statement (or a simple branch) generated by
> the compiler.

With the array there's no need for any switch or branching.  You know 
exactly which function in the array to use in each hook.

> 
> 	It doesn't save unecessary function calls unless I modify the core
> notifier block structure. Otherwise I still need to stuff a generic
> function into .notifier_call and from there get the pointer to the array
> to make the next call. So it adds more pointer indirection but does not
> reduce the number of intermediate function calls.

There comes a point when trying to reuse existing code is less cost 
effective than starting over.

> 
> 	As far as the multi-chain approach is concerned, I'm still leaning
> towards registering a single function with a mask describing what it
> wants to be notified of.

I think that will be less efficient than the function array.

> 
>> 2. A helper mechanism to allow a client that's being loaded as a module 
>> to visit all existing tasks and do whatever initialization it needs to 
>> do.  Without this every client would have to implement such a mechanism 
>> themselves (and it's not pretty).
> 
> 	Interesting idea. It should resemble existing macros. Something like:
> 	register_task_watcher(&my_nb, &unnoticed);
> 	for_each_unnoticed_task(unnoticed)
> 		...

Something like that.  It involved some tricky locking issues and was 
reasonably complex (which made providing it a good option when compared 
to each client implementing its own version).  Rather than trying to do 
this from scratch I'd advise getting a copy of the most recent PAGG 
patches and using that as a model as a fair bit of effort was spent 
ironing out all the problems involved.  It's not as easy as it sounds.

Peter
-- 
Peter Williams                                   pwil3058@bigpond.net.au

"Learning, n. The kind of ignorance distinguishing the studious."
  -- Ambrose Bierce

  reply	other threads:[~2006-06-22  1:11 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-13 23:52 [PATCH 00/11] Task watchers: Introduction Matt Helsley
2006-06-19 10:24 ` Andrew Morton
2006-06-21  8:35   ` Matt Helsley
2006-06-21  9:07     ` Andrew Morton
2006-06-21  9:13       ` [Lse-tech] " Matt Helsley
2006-06-21 10:40         ` Peter Williams
2006-06-21 21:32           ` Matt Helsley
2006-06-21  5:41 ` Peter Williams
2006-06-21  7:51   ` Matt Helsley
2006-06-21 11:34     ` Peter Williams
2006-06-21 11:41       ` Peter Williams
2006-06-21 21:29         ` Matt Helsley
2006-06-21 23:04           ` Peter Williams
2006-06-22  0:32             ` Matt Helsley
2006-06-22  1:11               ` Peter Williams [this message]
2006-06-22  3:46                 ` Matt Helsley
2006-06-22  4:26                   ` Peter Williams
2006-06-22  5:37                     ` [Lse-tech] " Matt Helsley
2006-06-22  6:29                       ` Peter Williams
2006-06-22 19:53                         ` Chandra Seetharaman
2006-06-22 22:46                           ` Peter Williams

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=4499EE29.9020703@bigpond.net.au \
    --to=pwil3058@bigpond.net.au \
    --cc=akpm@osdl.org \
    --cc=balbir@in.ibm.com \
    --cc=jes@sgi.com \
    --cc=jtk@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lse-tech@lists.sourceforge.net \
    --cc=matthltc@us.ibm.com \
    --cc=nagar@watson.ibm.com \
    --cc=sekharan@us.ibm.com \
    --cc=stern@rowland.harvard.edu \
    /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.