public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Nadia Derbey <Nadia.Derbey@bull.net>
To: Jarek Poplawski <jarkao2@o2.pl>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Alexey Dobriyan <adobriyan@sw.ru>,
	linux-kernel@vger.kernel.org
Subject: Re: 2.6.23-rc6-mm1: IPC: sleeping function called ...
Date: Mon, 24 Sep 2007 11:50:23 +0200	[thread overview]
Message-ID: <46F7885F.4080906@bull.net> (raw)
In-Reply-To: <20070921084453.GA1758@ff.dom.local>

Jarek Poplawski wrote:
> On Thu, Sep 20, 2007 at 03:08:42PM +0200, Nadia Derbey wrote:
> 
>>Nadia Derbey wrote:
>>
>>>Jarek Poplawski wrote:
>>>
>>>
>>>>On Thu, Sep 20, 2007 at 08:24:58AM +0200, Nadia Derbey wrote:
> 
> ...
> 
>>>Actually, ipc_lock() is called most of the time without the 
>>>ipc_ids.mutex held and without refcounting (maybe you didn't look for 
>>>the msg_lock() sem_lock() and shm_lock() too).
>>>So I think disabling preemption is needed, isn't it?
>>>
>>>
>>>>so, these rcu_read_locks() don't
>>>>work here at all. So, probably I miss something again, but IMHO,
>>>>these rcu_read_locks/unlocks could be removed here or in
>>>>ipc_lock_by_ptr() and it should be enough to use them directly, where
>>>>really needed, e.g., in msg.c do_msgrcv().
>>>>
>>>
>>>I have to check for the ipc_lock_by_ptr(): may be you're right!
>>>
>>
>>So, here is the ipc_lock_by_ptr() status:
>>1) do_msgsnd(), semctl_main(GETALL), semctl_main(SETALL) and find_undo() 
>>call it inside a refcounting.
>>  ==> no rcu read section needed.
>>
>>2) *_exit_ns(), ipc_findkey() and sysvipc_find_ipc() call it under the 
>>ipc_ids mutex lock.
>>  ==> no rcu read section needed.
>>
>>3) do_msgrcv() is the only path where ipc_lock_by_ptr() is not called 
>>under refcounting
>>  ==> rcu read section + some more checks needed once the spnlock is
>>      taken.
>>
>>So I completely agree with you: we might remove the rcu_read_lock() from 
>>the ipc_lock_by_ptr() and explicitley  call it when needed (actually, it 
>>is already explicitly called in do_msgrcv()).
> 
> 
> Yes, IMHO, it should be at least more readable when we can see where
> this RCU is really needed.
> 
> But, after 3-rd look, I have a few more doubts (btw., 3 looks are
> still not enough for me with this code, so I cerainly can miss many
> things here, and, alas, I manged to see util and msg code only):
> 

Jarek,

I'm realizing I did'nt give you an answer to issues # 1 and 3. Sorry for 
that!

> 1. ipc_lock() and ipc_lock_check() are used without ipc_ids.mutex,
> but it's probably wrong: they call idr_find() with ipc_ids pointer
> which needs this mutex, just like in similar code in: ipc_findkey(),
> ipc_get_maxid() or sysvipc_find_ipc().

I think you're completely right: the rcu_read_lock() is not enough in 
this case.
I have to solve this issue, but keeping the original way the ipc 
developers have done it: I think they didn't want to take the mutex lock 
for every single operation. E.g. sending a message to a given message 
queue shouldn't avoid creating new message queues.
I'll come up with a solution.

> 
> 2. I'm not sure this refcounting with ipc_rcu_getref/putref is SMP
> safe (memory barriers): it's not atomic, so locking is needed, but
> e.g. in do_msgsnd() kern_ipc_perm lock is used for this, while
> freeque() calls ipc_rcu_putref() with ipc_ids mutex only.
> 
> 3. Probably similar problem is possible with msr_d.r_msg which is
> read in do_msgrcv() under rcu_read_lock() only.
> 

In think here they have avoided refcoutning by using r_msg:
r_msg is initialzed to -EAGAIN before releasing the msq lock. if 
freequeue() is called it sets r_msg to EIDRM (see expunge_all(-EIDRM)).
Setting r_msg is always done under the msq lock (expunge_all() / 
pipelined_Sned()).
  Since rcu_read_lock is called right after schedule, they are sure the 
msq pointer is still valid when they re-lock it once a msg is present in 
the receive queue.

Please tell me if I'm not clear ;-)

Regards,
Nadia


  parent reply	other threads:[~2007-09-24  9:44 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-18  9:17 2.6.23-rc6-mm1: IPC: sleeping function called Alexey Dobriyan
2007-09-18  9:42 ` Andrew Morton
2007-09-18 10:17 ` Andrew Morton
2007-09-18 10:30   ` Nadia Derbey
2007-09-18 10:34     ` Andrew Morton
     [not found]       ` <20070918142451.418b3b51@twins>
2007-09-18 16:13         ` Paul E. McKenney
2007-09-18 16:57           ` Andrew Morton
2007-09-18 18:29             ` Paul E. McKenney
2007-09-18 19:41               ` Peter Zijlstra
2007-09-18 20:26               ` [PATCH 1/2] lockdep: annotate rcu_read_lock() Peter Zijlstra
2007-09-18 20:27               ` [RFC][PATCH 2/2] lockdep: rcu_dereference() vs rcu_read_lock() Peter Zijlstra
2007-09-18 21:21                 ` Paul E. McKenney
2007-09-18 10:27 ` 2.6.23-rc6-mm1: IPC: sleeping function called Andrew Morton
2007-09-18 10:32   ` Alexey Dobriyan
2007-09-18 14:55   ` Nadia Derbey
2007-09-18 17:01     ` Andrew Morton
2007-09-21  9:18       ` Nadia Derbey
2007-09-19 14:07     ` Jarek Poplawski
2007-09-20  6:24       ` Nadia Derbey
2007-09-20  7:28         ` Jarek Poplawski
2007-09-20  8:21           ` Jarek Poplawski
2007-09-20  8:52           ` Nadia Derbey
2007-09-20 13:08             ` Nadia Derbey
2007-09-20 13:26               ` Jarek Poplawski
2007-09-21  8:44               ` Jarek Poplawski
2007-09-21 10:11                 ` Nadia Derbey
2007-09-21 11:03                   ` Jarek Poplawski
2007-09-21 11:15                     ` Jarek Poplawski
2007-09-24  6:54                     ` Jarek Poplawski
2007-09-24  7:43                       ` Jarek Poplawski
2007-09-24  8:18                       ` Nadia Derbey
2007-09-24  9:50                 ` Nadia Derbey [this message]
2007-09-25 11:47                   ` Jarek Poplawski
2007-09-26  6:13                     ` Jarek Poplawski
2007-09-20 13:19             ` Jarek Poplawski

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=46F7885F.4080906@bull.net \
    --to=nadia.derbey@bull.net \
    --cc=adobriyan@sw.ru \
    --cc=akpm@linux-foundation.org \
    --cc=jarkao2@o2.pl \
    --cc=linux-kernel@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox