All of lore.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 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.